{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/utils/unified-path-resolver.ts","../src/utils/template-manager.ts","../src/utils/config-manager.ts","../src/utils/colors.ts","../src/utils/formatter.ts","../src/utils/frontmatter-parser.ts","../src/utils/relationship-manager.ts","../src/commands/ai/context.ts","../src/commands/ai/generate-llms-txt.ts","../src/commands/ai/track-tokens.ts","../src/commands/ai.ts","../src/commands/backlog.ts","../src/utils/project-detector.ts","../src/utils/path-resolver.ts","../src/utils/project-context-manager.ts","../src/utils/trackdown-index-manager.ts","../src/commands/backlog-enhanced.ts","../src/commands/epic/complete.ts","../src/utils/simple-id-generator.ts","../src/commands/epic/create.ts","../src/commands/epic/delete.ts","../src/utils/state-migration.ts","../src/types/ai-trackdown.ts","../src/commands/epic/list.ts","../src/commands/epic/show.ts","../src/commands/epic/update.ts","../src/commands/epic.ts","../src/utils/config.ts","../src/utils/validation.ts","../src/commands/export.ts","../src/utils/universal-ticketing-interface.ts","../src/commands/health.ts","../src/commands/index-health.ts","../src/utils/id-generator.ts","../src/commands/init.ts","../src/commands/issue/assign.ts","../src/commands/issue/close.ts","../src/commands/issue/complete.ts","../src/commands/issue/create.ts","../src/commands/issue/delete.ts","../src/commands/issue/list.ts","../src/utils/formatters.ts","../src/commands/issue/reopen.ts","../src/commands/issue/show.ts","../src/commands/issue/update.ts","../src/commands/issue.ts","../src/commands/migrate.ts","../src/commands/migrate-structure.ts","../src/commands/resolve.ts","../src/commands/state.ts","../src/commands/migrate-state.ts","../src/commands/portfolio.ts","../src/commands/pr/approve.ts","../src/utils/pr-status-manager.ts","../src/utils/pr-file-manager.ts","../src/commands/pr/archive.ts","../src/commands/pr/close.ts","../src/commands/pr/merge.ts","../src/commands/pr/batch.ts","../src/commands/pr/create.ts","../src/commands/pr/dependencies.ts","../src/commands/pr/list.ts","../src/commands/pr/review.ts","../src/commands/pr/show.ts","../src/commands/pr/sync.ts","../src/commands/pr/update.ts","../src/commands/pr.ts","../src/utils/git.ts","../src/utils/git-metadata-extractor.ts","../src/commands/project/create.ts","../src/commands/project/list.ts","../src/commands/project/show.ts","../src/commands/project/switch.ts","../src/commands/project.ts","../src/commands/status.ts","../src/commands/status-enhanced.ts","../src/commands/sync/auto.ts","../node_modules/@octokit/request-error/dist-src/index.js","../src/utils/github-client.ts","../src/integrations/github-sync.ts","../src/commands/sync/bidirectional.ts","../src/commands/sync/pull.ts","../src/commands/sync/push.ts","../src/commands/sync/setup.ts","../src/commands/sync/status.ts","../src/commands/sync.ts","../src/commands/task/complete.ts","../src/commands/task/create.ts","../src/commands/task/delete.ts","../src/commands/task/list.ts","../src/commands/task/show.ts","../src/commands/task/update.ts","../src/commands/task.ts","../src/commands/track.ts","../src/utils/version.ts","../src/utils/changelog.ts","../src/commands/version/bump.ts","../src/commands/version/changelog.ts","../src/commands/version/release.ts","../src/commands/version/show.ts","../src/commands/version/sync.ts","../src/commands/version/tag.ts","../src/commands/version.ts","../src/index.ts","../src/cli.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n  typeof document === 'undefined'\n    ? new URL(`file:${__filename}`).href\n    : (document.currentScript && document.currentScript.src) ||\n      new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * Unified Path Resolver for AI-Trackdown\n * Implements single root directory structure: tasks/{type}/\n * ATT-004: Fix Task Directory Structure - Single Root Directory Implementation\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ProjectConfig } from '../types/ai-trackdown.js';\n\nexport interface UnifiedPaths {\n  projectRoot: string;\n  configDir: string;\n  tasksRoot: string; // The single configurable root (default: \"tasks\")\n  epicsDir: string; // {tasksRoot}/epics/\n  issuesDir: string; // {tasksRoot}/issues/\n  tasksDir: string; // {tasksRoot}/tasks/\n  prsDir: string; // {tasksRoot}/prs/\n  templatesDir: string; // {tasksRoot}/templates/\n}\n\n/**\n * Unified Path Resolver implementing the required directory structure\n * All task types are organized under a single configurable root directory\n */\nexport class UnifiedPathResolver {\n  private config: ProjectConfig;\n  private projectRoot: string;\n  private cliTasksDir?: string; // CLI override via --tasks-dir or --root-dir\n\n  constructor(config: ProjectConfig, projectRoot: string, cliTasksDir?: string) {\n    this.config = config;\n    this.projectRoot = projectRoot;\n    this.cliTasksDir = cliTasksDir;\n  }\n\n  /**\n   * Get the tasks root directory with proper priority resolution:\n   * 1. CLI option override (--root-dir, --tasks-dir)\n   * 2. Environment variable (AITRACKDOWN_TASKS_DIR)\n   * 3. Config file setting (tasks_directory)\n   * 4. Default to \"tasks\"\n   */\n  getTasksRootDirectory(): string {\n    // 1. CLI option takes highest priority\n    if (this.cliTasksDir) {\n      return this.cliTasksDir;\n    }\n\n    // 2. Environment variable override\n    const envTasksDir = process.env.AITRACKDOWN_TASKS_DIR || process.env.AITRACKDOWN_ROOT_DIR;\n    if (envTasksDir) {\n      return envTasksDir;\n    }\n\n    // 3. Config file setting\n    if (this.config.tasks_directory) {\n      return this.config.tasks_directory;\n    }\n\n    // 4. Default to \"tasks\"\n    return 'tasks';\n  }\n\n  /**\n   * Get all unified paths following the required structure\n   */\n  getUnifiedPaths(): UnifiedPaths {\n    const tasksRoot = this.getTasksRootDirectory();\n\n    return {\n      projectRoot: this.projectRoot,\n      configDir: join(this.projectRoot, '.ai-trackdown'),\n      tasksRoot: join(this.projectRoot, tasksRoot),\n      epicsDir: join(this.projectRoot, tasksRoot, this.config.structure.epics_dir),\n      issuesDir: join(this.projectRoot, tasksRoot, this.config.structure.issues_dir),\n      tasksDir: join(this.projectRoot, tasksRoot, this.config.structure.tasks_dir),\n      prsDir: join(this.projectRoot, tasksRoot, this.config.structure.prs_dir || 'prs'),\n      templatesDir: join(this.projectRoot, tasksRoot, this.config.structure.templates_dir),\n    };\n  }\n\n  /**\n   * Get path for specific item type\n   */\n  getItemTypeDirectory(type: 'project' | 'epic' | 'issue' | 'task' | 'pr'): string {\n    const paths = this.getUnifiedPaths();\n\n    switch (type) {\n      case 'project':\n        return join(paths.tasksRoot, 'projects');\n      case 'epic':\n        return paths.epicsDir;\n      case 'issue':\n        return paths.issuesDir;\n      case 'task':\n        return paths.tasksDir;\n      case 'pr':\n        return paths.prsDir;\n      default:\n        throw new Error(`Unknown item type: ${type}`);\n    }\n  }\n\n  /**\n   * Get all directories that should be created for the unified structure\n   */\n  getRequiredDirectories(): string[] {\n    const paths = this.getUnifiedPaths();\n\n    return [\n      paths.configDir,\n      paths.tasksRoot,\n      paths.epicsDir,\n      paths.issuesDir,\n      paths.tasksDir,\n      paths.prsDir,\n      paths.templatesDir,\n    ];\n  }\n\n  /**\n   * Check if legacy directory structure exists (separate root directories)\n   */\n  detectLegacyStructure(): {\n    hasLegacy: boolean;\n    legacyDirs: string[];\n    suggestions: string[];\n  } {\n    const legacyDirs: string[] = [];\n    const suggestions: string[] = [];\n\n    // Check for old separate root directories\n    const potentialLegacyDirs = [\n      join(this.projectRoot, 'epics'),\n      join(this.projectRoot, 'issues'),\n      join(this.projectRoot, 'tasks'),\n      join(this.projectRoot, 'prs'),\n      join(this.projectRoot, 'trackdown'), // Old trackdown structure\n    ];\n\n    for (const dir of potentialLegacyDirs) {\n      if (existsSync(dir)) {\n        legacyDirs.push(dir);\n      }\n    }\n\n    if (legacyDirs.length > 0) {\n      const tasksRoot = this.getTasksRootDirectory();\n\n      suggestions.push(\n        `# Detected legacy directory structure. Migration options:`,\n        ``,\n        `# Option 1: Use CLI override to maintain current structure`,\n        `export AITRACKDOWN_TASKS_DIR=\"\"  # Use project root`,\n        ``,\n        `# Option 2: Migrate to unified structure`,\n        `mkdir -p ${tasksRoot}`,\n        ...legacyDirs.map((dir) => {\n          const dirName = dir.split('/').pop();\n          return `mv ${dirName} ${tasksRoot}/${dirName} 2>/dev/null || true`;\n        }),\n        ``,\n        `# Option 3: Update configuration`,\n        `# Edit .ai-trackdown/config.yaml and set:`,\n        `# tasks_directory: \"\"  # Use project root`\n      );\n    }\n\n    return {\n      hasLegacy: legacyDirs.length > 0,\n      legacyDirs,\n      suggestions,\n    };\n  }\n\n  /**\n   * Get migration commands for moving to unified structure\n   */\n  getMigrationCommands(): string[] {\n    const legacy = this.detectLegacyStructure();\n\n    if (!legacy.hasLegacy) {\n      return [];\n    }\n\n    return legacy.suggestions;\n  }\n\n  /**\n   * Validate current directory structure\n   */\n  validateStructure(): {\n    valid: boolean;\n    issues: string[];\n    missingDirs: string[];\n  } {\n    const _paths = this.getUnifiedPaths();\n    const issues: string[] = [];\n    const missingDirs: string[] = [];\n\n    // Check if required directories exist\n    const requiredDirs = this.getRequiredDirectories();\n\n    for (const dir of requiredDirs) {\n      if (!existsSync(dir)) {\n        missingDirs.push(dir);\n      }\n    }\n\n    // Check for legacy structure conflicts\n    const legacy = this.detectLegacyStructure();\n    if (legacy.hasLegacy) {\n      issues.push(`Legacy directory structure detected: ${legacy.legacyDirs.join(', ')}`);\n    }\n\n    return {\n      valid: issues.length === 0 && missingDirs.length === 0,\n      issues,\n      missingDirs,\n    };\n  }\n\n  /**\n   * Update CLI tasks directory override\n   */\n  setCliTasksDir(tasksDir: string): void {\n    this.cliTasksDir = tasksDir;\n  }\n\n  /**\n   * Clear CLI tasks directory override\n   */\n  clearCliTasksDir(): void {\n    this.cliTasksDir = undefined;\n  }\n\n  /**\n   * Show structure information for debugging\n   */\n  showStructureInfo(): void {\n    const paths = this.getUnifiedPaths();\n    const validation = this.validateStructure();\n\n    console.log(`\\n🏗️  AI-Trackdown Directory Structure`);\n    console.log(`📁 Tasks Root: ${paths.tasksRoot}`);\n    console.log(`   ├── 📂 epics/     → ${paths.epicsDir}`);\n    console.log(`   ├── 📂 issues/    → ${paths.issuesDir}`);\n    console.log(`   ├── 📂 tasks/     → ${paths.tasksDir}`);\n    console.log(`   ├── 📂 prs/       → ${paths.prsDir}`);\n    console.log(`   └── 📂 templates/ → ${paths.templatesDir}`);\n\n    if (validation.missingDirs.length > 0) {\n      console.log(`\\n⚠️  Missing directories:`);\n      validation.missingDirs.forEach((dir) => console.log(`   • ${dir}`));\n    }\n\n    if (validation.issues.length > 0) {\n      console.log(`\\n🚨 Issues detected:`);\n      validation.issues.forEach((issue) => console.log(`   • ${issue}`));\n    }\n\n    const legacy = this.detectLegacyStructure();\n    if (legacy.hasLegacy) {\n      console.log(`\\n📋 Migration suggestions:`);\n      legacy.suggestions.forEach((suggestion) => console.log(`   ${suggestion}`));\n    }\n  }\n}\n","/**\n * Template Manager for AI-Trackdown\n * Handles bundled template deployment and management\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport * as YAML from 'yaml';\nimport type { ItemTemplate } from '../types/ai-trackdown.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Template Manager class for handling bundled templates\n */\nexport class TemplateManager {\n  private bundledTemplatesDir: string;\n\n  constructor() {\n    // Path to bundled templates in the package\n    // Try multiple possible locations for bundled templates\n    const possiblePaths = [\n      path.join(__dirname, '../../templates'), // Development: src/utils -> templates\n      path.join(__dirname, '../templates'), // Compiled: dist/utils -> dist/templates\n      path.join(__dirname, 'templates'), // Compiled: dist -> dist/templates\n      path.resolve(__dirname, '..', 'templates'), // Alternative dist structure\n    ];\n\n    // Find the first path that exists\n    this.bundledTemplatesDir =\n      possiblePaths.find((dir) => {\n        try {\n          return fs.existsSync(dir);\n        } catch {\n          return false;\n        }\n      }) || path.join(__dirname, '../../templates'); // fallback to original\n  }\n\n  /**\n   * Get the path to bundled templates\n   */\n  public getBundledTemplatesDir(): string {\n    return this.bundledTemplatesDir;\n  }\n\n  /**\n   * Check if bundled templates exist\n   */\n  public hasBundledTemplates(): boolean {\n    return fs.existsSync(this.bundledTemplatesDir);\n  }\n\n  /**\n   * List all bundled template files\n   */\n  public listBundledTemplates(): string[] {\n    if (!this.hasBundledTemplates()) {\n      return [];\n    }\n\n    try {\n      return fs\n        .readdirSync(this.bundledTemplatesDir)\n        .filter((file) => file.endsWith('.yaml'))\n        .sort();\n    } catch (error) {\n      console.warn(\n        `Failed to list bundled templates: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n      return [];\n    }\n  }\n\n  /**\n   * Deploy bundled templates to project's templates directory\n   */\n  public deployTemplates(projectTemplatesDir: string, force: boolean = false): void {\n    if (!this.hasBundledTemplates()) {\n      console.warn('No bundled templates found. Creating default templates programmatically.');\n      this.createDefaultTemplates(projectTemplatesDir, force);\n      return;\n    }\n\n    // Ensure project templates directory exists\n    if (!fs.existsSync(projectTemplatesDir)) {\n      fs.mkdirSync(projectTemplatesDir, { recursive: true });\n    }\n\n    const bundledFiles = this.listBundledTemplates();\n    let deployedCount = 0;\n\n    for (const templateFile of bundledFiles) {\n      const sourcePath = path.join(this.bundledTemplatesDir, templateFile);\n      const destPath = path.join(projectTemplatesDir, templateFile);\n\n      try {\n        // Check if file exists and force flag\n        if (fs.existsSync(destPath) && !force) {\n          console.log(`⏭️  Skipping ${templateFile} (already exists)`);\n          continue;\n        }\n\n        // Copy template file\n        fs.copyFileSync(sourcePath, destPath);\n        console.log(`✅ Deployed ${templateFile}`);\n        deployedCount++;\n      } catch (error) {\n        console.error(\n          `❌ Failed to deploy ${templateFile}: ${error instanceof Error ? error.message : 'Unknown error'}`\n        );\n      }\n    }\n\n    console.log(`📦 Deployed ${deployedCount} template(s) to ${projectTemplatesDir}`);\n  }\n\n  /**\n   * Create default templates programmatically if bundled templates are not available\n   */\n  private createDefaultTemplates(projectTemplatesDir: string, force: boolean = false): void {\n    if (!fs.existsSync(projectTemplatesDir)) {\n      fs.mkdirSync(projectTemplatesDir, { recursive: true });\n    }\n\n    const defaultTemplates: ItemTemplate[] = [\n      {\n        type: 'epic',\n        name: 'default',\n        description: 'Default epic template',\n        frontmatter_template: {\n          title: 'Epic Title',\n          description: 'Epic description',\n          status: 'planning',\n          priority: 'medium',\n          assignee: 'unassigned',\n          created_date: '',\n          updated_date: '',\n          estimated_tokens: 0,\n          actual_tokens: 0,\n          ai_context: [\n            'context/requirements',\n            'context/constraints',\n            'context/assumptions',\n            'context/dependencies',\n          ],\n          sync_status: 'local',\n        },\n        content_template: `# Epic: {{title}}\n\n## Overview\n{{description}}\n\n## Objectives\n- [ ] Objective 1\n- [ ] Objective 2\n- [ ] Objective 3\n\n## Acceptance Criteria\n- [ ] Criteria 1\n- [ ] Criteria 2\n\n## Related Issues\n{{#related_issues}}\n- {{.}}\n{{/related_issues}}\n\n## Notes\nAdd any additional notes here.`,\n      },\n      {\n        type: 'issue',\n        name: 'default',\n        description: 'Default issue template',\n        frontmatter_template: {\n          title: 'Issue Title',\n          description: 'Issue description',\n          status: 'planning',\n          priority: 'medium',\n          assignee: 'unassigned',\n          created_date: '',\n          updated_date: '',\n          estimated_tokens: 0,\n          actual_tokens: 0,\n          ai_context: [\n            'context/requirements',\n            'context/constraints',\n            'context/assumptions',\n            'context/dependencies',\n          ],\n          sync_status: 'local',\n        },\n        content_template: `# Issue: {{title}}\n\n## Description\n{{description}}\n\n## Tasks\n{{#related_tasks}}\n- [ ] {{.}}\n{{/related_tasks}}\n\n## Acceptance Criteria\n- [ ] Criteria 1\n- [ ] Criteria 2\n\n## Notes\nAdd any additional notes here.`,\n      },\n      {\n        type: 'task',\n        name: 'default',\n        description: 'Default task template',\n        frontmatter_template: {\n          title: 'Task Title',\n          description: 'Task description',\n          status: 'planning',\n          priority: 'medium',\n          assignee: 'unassigned',\n          created_date: '',\n          updated_date: '',\n          estimated_tokens: 0,\n          actual_tokens: 0,\n          ai_context: [\n            'context/requirements',\n            'context/constraints',\n            'context/assumptions',\n            'context/dependencies',\n          ],\n          sync_status: 'local',\n        },\n        content_template: `# Task: {{title}}\n\n## Description\n{{description}}\n\n## Steps\n1. Step 1\n2. Step 2\n3. Step 3\n\n## Acceptance Criteria\n- [ ] Criteria 1\n- [ ] Criteria 2\n\n## Notes\nAdd any additional notes here.`,\n      },\n      {\n        type: 'pr',\n        name: 'default',\n        description: 'Default PR template',\n        frontmatter_template: {\n          title: 'PR Title',\n          description: 'PR description',\n          status: 'planning',\n          priority: 'medium',\n          assignee: 'unassigned',\n          created_date: '',\n          updated_date: '',\n          estimated_tokens: 0,\n          actual_tokens: 0,\n          ai_context: [\n            'context/requirements',\n            'context/constraints',\n            'context/assumptions',\n            'context/dependencies',\n          ],\n          sync_status: 'local',\n        },\n        content_template: `# PR: {{title}}\n\n## Description\n{{description}}\n\n## Changes\n- Change 1\n- Change 2\n- Change 3\n\n## Testing\n- [ ] Unit tests pass\n- [ ] Integration tests pass\n- [ ] Manual testing completed\n\n## Checklist\n- [ ] Code follows style guidelines\n- [ ] Self-review completed\n- [ ] Documentation updated\n- [ ] Tests added/updated\n\n## Related\n- Issue: {{issue_id}}\n- Branch: {{branch_name}}\n- Target: {{target_branch}}\n\n## Notes\nAdd any additional notes here.`,\n      },\n    ];\n\n    let deployedCount = 0;\n\n    for (const template of defaultTemplates) {\n      const templatePath = path.join(projectTemplatesDir, `${template.type}-${template.name}.yaml`);\n\n      try {\n        // Check if file exists and force flag\n        if (fs.existsSync(templatePath) && !force) {\n          console.log(`⏭️  Skipping ${template.type}-${template.name}.yaml (already exists)`);\n          continue;\n        }\n\n        const templateContent = YAML.stringify(template, {\n          indent: 2,\n          lineWidth: 120,\n        });\n\n        fs.writeFileSync(templatePath, templateContent, 'utf8');\n        console.log(`✅ Created ${template.type}-${template.name}.yaml`);\n        deployedCount++;\n      } catch (error) {\n        console.error(\n          `❌ Failed to create ${template.type}-${template.name}.yaml: ${error instanceof Error ? error.message : 'Unknown error'}`\n        );\n      }\n    }\n\n    console.log(`📦 Created ${deployedCount} default template(s) in ${projectTemplatesDir}`);\n  }\n\n  /**\n   * Get template by type and name, with fallback to bundled templates\n   */\n  public getTemplate(\n    projectTemplatesDir: string,\n    type: 'epic' | 'issue' | 'task' | 'pr',\n    name: string = 'default'\n  ): ItemTemplate | null {\n    const templateFileName = `${type}-${name}.yaml`;\n\n    // First, try to load from project templates directory\n    const projectTemplatePath = path.join(projectTemplatesDir, templateFileName);\n    if (fs.existsSync(projectTemplatePath)) {\n      try {\n        const templateContent = fs.readFileSync(projectTemplatePath, 'utf8');\n        return YAML.parse(templateContent) as ItemTemplate;\n      } catch (error) {\n        console.warn(\n          `Failed to load project template ${projectTemplatePath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n        );\n      }\n    }\n\n    // Fallback to bundled templates\n    if (this.hasBundledTemplates()) {\n      const bundledTemplatePath = path.join(this.bundledTemplatesDir, templateFileName);\n      if (fs.existsSync(bundledTemplatePath)) {\n        try {\n          const templateContent = fs.readFileSync(bundledTemplatePath, 'utf8');\n          return YAML.parse(templateContent) as ItemTemplate;\n        } catch (error) {\n          console.warn(\n            `Failed to load bundled template ${bundledTemplatePath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n          );\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Validate template file structure\n   */\n  public validateTemplate(templatePath: string): boolean {\n    try {\n      const content = fs.readFileSync(templatePath, 'utf8');\n      const template = YAML.parse(content) as ItemTemplate;\n\n      // Check required fields\n      const requiredFields = [\n        'type',\n        'name',\n        'description',\n        'frontmatter_template',\n        'content_template',\n      ];\n      for (const field of requiredFields) {\n        if (!template[field as keyof ItemTemplate]) {\n          console.error(`Template ${templatePath} missing required field: ${field}`);\n          return false;\n        }\n      }\n\n      // Check valid type\n      const validTypes = ['epic', 'issue', 'task', 'pr'];\n      if (!validTypes.includes(template.type)) {\n        console.error(`Template ${templatePath} has invalid type: ${template.type}`);\n        return false;\n      }\n\n      return true;\n    } catch (error) {\n      console.error(\n        `Failed to validate template ${templatePath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n      return false;\n    }\n  }\n}\n","/**\n * Configuration Manager for AI-Trackdown\n * Handles .ai-trackdown/config.yaml configuration system\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as YAML from 'yaml';\nimport type { ItemTemplate, ProjectConfig } from '../types/ai-trackdown.js';\nimport { UnifiedPathResolver } from './unified-path-resolver.js';\n\nconst DEFAULT_CONFIG_DIR = '.ai-trackdown';\nconst DEFAULT_CONFIG_FILE = 'config.yaml';\nconst _DEFAULT_TEMPLATES_DIR = 'templates';\n\nexport class ConfigManager {\n  private configPath: string;\n  private config: ProjectConfig | null = null;\n\n  constructor(projectRoot?: string) {\n    const root = projectRoot || this.findProjectRoot();\n    this.configPath = path.join(root, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILE);\n  }\n\n  /**\n   * Load configuration from file\n   */\n  public loadConfig(): ProjectConfig {\n    if (this.config) {\n      return this.config;\n    }\n\n    if (!fs.existsSync(this.configPath)) {\n      throw new Error(\n        `AI-Trackdown configuration not found at ${this.configPath}. Run 'aitrackdown init' to create a new project.`\n      );\n    }\n\n    try {\n      const configContent = fs.readFileSync(this.configPath, 'utf8');\n      const rawConfig = YAML.parse(configContent) as any;\n\n      // Handle both old format (project.name) and new format (name)\n      if (rawConfig.project?.name && !rawConfig.name) {\n        // Convert old format to new format\n        this.config = {\n          name: rawConfig.project.name,\n          description: rawConfig.project.description,\n          version: rawConfig.version || '1.0.0',\n          tasks_directory: rawConfig.tasks_directory || 'tasks',\n          structure: rawConfig.structure || {\n            epics_dir: 'epics',\n            issues_dir: 'issues',\n            tasks_dir: 'tasks',\n            templates_dir: 'templates',\n            prs_dir: 'prs',\n          },\n          naming_conventions: rawConfig.naming_conventions || {\n            epic_prefix: 'EP',\n            issue_prefix: 'ISS',\n            task_prefix: 'TSK',\n            pr_prefix: 'PR',\n            file_extension: '.md',\n          },\n          default_assignee: rawConfig.default_assignee || 'unassigned',\n          ai_context_templates: rawConfig.ai_context_templates || [],\n          automation: rawConfig.automation || {\n            auto_update_timestamps: true,\n            auto_calculate_tokens: false,\n            auto_sync_status: true,\n          },\n        };\n      } else {\n        this.config = rawConfig as ProjectConfig;\n      }\n\n      // Validate and normalize config\n      this.validateConfig(this.config);\n      this.normalizeConfig(this.config);\n\n      return this.config;\n    } catch (error) {\n      throw new Error(\n        `Failed to load AI-Trackdown configuration: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Save configuration to file\n   */\n  public saveConfig(config: ProjectConfig): void {\n    this.validateConfig(config);\n\n    const configDir = path.dirname(this.configPath);\n    if (!fs.existsSync(configDir)) {\n      fs.mkdirSync(configDir, { recursive: true });\n    }\n\n    const yamlContent = YAML.stringify(config, {\n      indent: 2,\n      lineWidth: 120,\n      minContentWidth: 20,\n    });\n\n    fs.writeFileSync(this.configPath, yamlContent, 'utf8');\n    this.config = config;\n  }\n\n  /**\n   * Create default configuration\n   */\n  public createDefaultConfig(\n    projectName: string,\n    options: Partial<ProjectConfig> = {}\n  ): ProjectConfig {\n    const defaultConfig: ProjectConfig = {\n      name: projectName,\n      description: options.description || `AI-Trackdown project: ${projectName}`,\n      version: '1.0.0',\n      // NEW: Default tasks directory for unified structure\n      tasks_directory: options.tasks_directory || 'tasks',\n      structure: {\n        epics_dir: 'epics',\n        issues_dir: 'issues',\n        tasks_dir: 'tasks',\n        templates_dir: 'templates',\n        prs_dir: 'prs', // NEW: PR directory\n      },\n      naming_conventions: {\n        epic_prefix: 'EP',\n        issue_prefix: 'ISS',\n        task_prefix: 'TSK',\n        pr_prefix: 'PR', // NEW: PR prefix\n        file_extension: '.md',\n      },\n      default_assignee: options.default_assignee || 'unassigned',\n      ai_context_templates: [\n        'context/requirements',\n        'context/constraints',\n        'context/assumptions',\n        'context/dependencies',\n      ],\n      automation: {\n        auto_update_timestamps: true,\n        auto_calculate_tokens: false,\n        auto_sync_status: true,\n      },\n      ...options,\n    };\n\n    return defaultConfig;\n  }\n\n  /**\n   * Initialize new project with default structure\n   */\n  public initializeProject(\n    projectName: string,\n    options: Partial<ProjectConfig> = {}\n  ): ProjectConfig {\n    const config = this.createDefaultConfig(projectName, options);\n\n    // Create directory structure\n    this.createProjectStructure(config);\n\n    // Create default templates\n    this.createDefaultTemplates(config);\n\n    // Save configuration\n    this.saveConfig(config);\n\n    return config;\n  }\n\n  /**\n   * Initialize new project with structure only (no template creation)\n   */\n  public initializeProjectStructure(\n    projectName: string,\n    options: Partial<ProjectConfig> = {}\n  ): ProjectConfig {\n    const config = this.createDefaultConfig(projectName, options);\n\n    // Create directory structure only\n    this.createProjectStructure(config);\n\n    // Save configuration\n    this.saveConfig(config);\n\n    return config;\n  }\n\n  /**\n   * Update specific configuration values\n   */\n  public updateConfig(updates: Partial<ProjectConfig>): ProjectConfig {\n    const currentConfig = this.loadConfig();\n    const updatedConfig = this.deepMerge(currentConfig, updates);\n\n    this.saveConfig(updatedConfig);\n    return updatedConfig;\n  }\n\n  /**\n   * Get configuration with environment overrides\n   */\n  public getConfig(): ProjectConfig {\n    const config = this.loadConfig();\n\n    // Apply environment variable overrides\n    if (process.env.ATD_DEFAULT_ASSIGNEE) {\n      config.default_assignee = process.env.ATD_DEFAULT_ASSIGNEE;\n    }\n\n    if (process.env.ATD_AUTO_TIMESTAMPS === 'false') {\n      config.automation!.auto_update_timestamps = false;\n    }\n\n    if (process.env.ATD_AUTO_CALCULATE_TOKENS === 'true') {\n      config.automation!.auto_calculate_tokens = true;\n    }\n\n    return config;\n  }\n\n  /**\n   * Get absolute paths for project structure using unified directory layout\n   */\n  public getAbsolutePaths(cliTasksDir?: string): {\n    projectRoot: string;\n    configDir: string;\n    tasksRoot: string;\n    epicsDir: string;\n    issuesDir: string;\n    tasksDir: string;\n    prsDir: string;\n    templatesDir: string;\n  } {\n    const config = this.getConfig();\n    const projectRoot = path.dirname(path.dirname(this.configPath));\n\n    // Import UnifiedPathResolver dynamically to avoid circular dependencies\n    // UnifiedPathResolver already imported at the top\n    const pathResolver = new UnifiedPathResolver(config, projectRoot, cliTasksDir);\n    const unifiedPaths = pathResolver.getUnifiedPaths();\n\n    return {\n      projectRoot: unifiedPaths.projectRoot,\n      configDir: unifiedPaths.configDir,\n      tasksRoot: unifiedPaths.tasksRoot,\n      epicsDir: unifiedPaths.epicsDir,\n      issuesDir: unifiedPaths.issuesDir,\n      tasksDir: unifiedPaths.tasksDir,\n      prsDir: unifiedPaths.prsDir,\n      templatesDir: unifiedPaths.templatesDir,\n    };\n  }\n\n  /**\n   * Check if current directory is an AI-Trackdown project\n   */\n  public isProjectDirectory(dir?: string): boolean {\n    const checkDir = dir || process.cwd();\n    const configPath = path.join(checkDir, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILE);\n    return fs.existsSync(configPath);\n  }\n\n  /**\n   * Find project root by walking up directory tree\n   */\n  public findProjectRoot(startDir?: string): string {\n    let currentDir = startDir || process.cwd();\n\n    while (currentDir !== path.dirname(currentDir)) {\n      const configPath = path.join(currentDir, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILE);\n      if (fs.existsSync(configPath)) {\n        return currentDir;\n      }\n      currentDir = path.dirname(currentDir);\n    }\n\n    // If not found, return the starting directory\n    return startDir || process.cwd();\n  }\n\n  /**\n   * Validate configuration structure\n   */\n  private validateConfig(config: ProjectConfig): void {\n    const required = ['name', 'version', 'structure', 'naming_conventions'];\n\n    for (const field of required) {\n      if (!config[field as keyof ProjectConfig]) {\n        throw new Error(`Configuration missing required field: ${field}`);\n      }\n    }\n\n    // Validate structure paths\n    const structureFields = ['epics_dir', 'issues_dir', 'tasks_dir', 'templates_dir'];\n    for (const field of structureFields) {\n      if (!config.structure[field as keyof typeof config.structure]) {\n        throw new Error(`Configuration structure missing required field: ${field}`);\n      }\n    }\n\n    // Validate naming conventions\n    const namingFields = ['epic_prefix', 'issue_prefix', 'task_prefix', 'file_extension'];\n    for (const field of namingFields) {\n      if (!config.naming_conventions[field as keyof typeof config.naming_conventions]) {\n        throw new Error(`Configuration naming_conventions missing required field: ${field}`);\n      }\n    }\n  }\n\n  /**\n   * Normalize configuration (ensure defaults and proper types)\n   */\n  private normalizeConfig(config: ProjectConfig): void {\n    // Ensure automation defaults\n    if (!config.automation) {\n      config.automation = {\n        auto_update_timestamps: true,\n        auto_calculate_tokens: false,\n        auto_sync_status: true,\n      };\n    }\n\n    // Ensure arrays are arrays\n    if (!config.ai_context_templates) {\n      config.ai_context_templates = [];\n    }\n\n    // Normalize paths (remove leading/trailing slashes)\n    config.structure.epics_dir = config.structure.epics_dir.replace(/^\\/|\\/$/g, '');\n    config.structure.issues_dir = config.structure.issues_dir.replace(/^\\/|\\/$/g, '');\n    config.structure.tasks_dir = config.structure.tasks_dir.replace(/^\\/|\\/$/g, '');\n    config.structure.templates_dir = config.structure.templates_dir.replace(/^\\/|\\/$/g, '');\n\n    // Ensure file extension starts with dot\n    if (!config.naming_conventions.file_extension.startsWith('.')) {\n      config.naming_conventions.file_extension = `.${config.naming_conventions.file_extension}`;\n    }\n  }\n\n  /**\n   * Create project directory structure using unified layout\n   */\n  public createProjectStructure(config: ProjectConfig): void {\n    const projectRoot = path.dirname(path.dirname(this.configPath));\n\n    // Import UnifiedPathResolver dynamically to avoid circular dependencies\n    // UnifiedPathResolver already imported at the top\n    const pathResolver = new UnifiedPathResolver(config, projectRoot);\n    const requiredDirs = pathResolver.getRequiredDirectories();\n\n    for (const dir of requiredDirs) {\n      if (!fs.existsSync(dir)) {\n        fs.mkdirSync(dir, { recursive: true });\n      }\n    }\n  }\n\n  /**\n   * Create default templates\n   */\n  private createDefaultTemplates(config: ProjectConfig): void {\n    const projectRoot = path.dirname(path.dirname(this.configPath));\n\n    // Import UnifiedPathResolver dynamically to avoid circular dependencies\n    // UnifiedPathResolver already imported at the top\n    const pathResolver = new UnifiedPathResolver(config, projectRoot);\n    const paths = pathResolver.getUnifiedPaths();\n    const templatesDir = paths.templatesDir;\n\n    const templates: ItemTemplate[] = [\n      {\n        type: 'epic',\n        name: 'default',\n        description: 'Default epic template',\n        frontmatter_template: {\n          title: 'Epic Title',\n          description: 'Epic description',\n          status: 'planning',\n          priority: 'medium',\n          assignee: config.default_assignee || 'unassigned',\n          created_date: '',\n          updated_date: '',\n          estimated_tokens: 0,\n          actual_tokens: 0,\n          ai_context: config.ai_context_templates || [],\n          sync_status: 'local',\n        },\n        content_template: `# Epic: {{title}}\n\n## Overview\n{{description}}\n\n## Objectives\n- [ ] Objective 1\n- [ ] Objective 2\n- [ ] Objective 3\n\n## Acceptance Criteria\n- [ ] Criteria 1\n- [ ] Criteria 2\n\n## Related Issues\n{{#related_issues}}\n- {{.}}\n{{/related_issues}}\n\n## Notes\nAdd any additional notes here.`,\n      },\n      {\n        type: 'issue',\n        name: 'default',\n        description: 'Default issue template',\n        frontmatter_template: {\n          title: 'Issue Title',\n          description: 'Issue description',\n          status: 'planning',\n          priority: 'medium',\n          assignee: config.default_assignee || 'unassigned',\n          created_date: '',\n          updated_date: '',\n          estimated_tokens: 0,\n          actual_tokens: 0,\n          ai_context: config.ai_context_templates || [],\n          sync_status: 'local',\n        },\n        content_template: `# Issue: {{title}}\n\n## Description\n{{description}}\n\n## Tasks\n{{#related_tasks}}\n- [ ] {{.}}\n{{/related_tasks}}\n\n## Acceptance Criteria\n- [ ] Criteria 1\n- [ ] Criteria 2\n\n## Notes\nAdd any additional notes here.`,\n      },\n      {\n        type: 'task',\n        name: 'default',\n        description: 'Default task template',\n        frontmatter_template: {\n          title: 'Task Title',\n          description: 'Task description',\n          status: 'planning',\n          priority: 'medium',\n          assignee: config.default_assignee || 'unassigned',\n          created_date: '',\n          updated_date: '',\n          estimated_tokens: 0,\n          actual_tokens: 0,\n          ai_context: config.ai_context_templates || [],\n          sync_status: 'local',\n        },\n        content_template: `# Task: {{title}}\n\n## Description\n{{description}}\n\n## Steps\n1. Step 1\n2. Step 2\n3. Step 3\n\n## Acceptance Criteria\n- [ ] Criteria 1\n- [ ] Criteria 2\n\n## Notes\nAdd any additional notes here.`,\n      },\n      {\n        type: 'pr',\n        name: 'default',\n        description: 'Default PR template',\n        frontmatter_template: {\n          title: 'PR Title',\n          description: 'PR description',\n          status: 'planning',\n          priority: 'medium',\n          assignee: config.default_assignee || 'unassigned',\n          created_date: '',\n          updated_date: '',\n          estimated_tokens: 0,\n          actual_tokens: 0,\n          ai_context: config.ai_context_templates || [],\n          sync_status: 'local',\n        },\n        content_template: `# PR: {{title}}\n\n## Description\n{{description}}\n\n## Changes\n- Change 1\n- Change 2\n- Change 3\n\n## Testing\n- [ ] Unit tests pass\n- [ ] Integration tests pass\n- [ ] Manual testing completed\n\n## Checklist\n- [ ] Code follows style guidelines\n- [ ] Self-review completed\n- [ ] Documentation updated\n- [ ] Tests added/updated\n\n## Related\n- Issue: {{issue_id}}\n- Branch: {{branch_name}}\n- Target: {{target_branch}}\n\n## Notes\nAdd any additional notes here.`,\n      },\n    ];\n\n    for (const template of templates) {\n      const templatePath = path.join(templatesDir, `${template.type}-${template.name}.yaml`);\n      if (!fs.existsSync(templatePath)) {\n        const templateContent = YAML.stringify(template, {\n          indent: 2,\n          lineWidth: 120,\n        });\n        fs.writeFileSync(templatePath, templateContent, 'utf8');\n      }\n    }\n  }\n\n  /**\n   * Deep merge two objects\n   */\n  private deepMerge(target: any, source: any): any {\n    const result = { ...target };\n\n    for (const key in source) {\n      if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n        result[key] = this.deepMerge(result[key] || {}, source[key]);\n      } else {\n        result[key] = source[key];\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Get template by type and name\n   */\n  public getTemplate(\n    type: 'epic' | 'issue' | 'task' | 'pr',\n    name: string = 'default'\n  ): ItemTemplate | null {\n    const config = this.getConfig();\n    const projectRoot = path.dirname(path.dirname(this.configPath));\n\n    // Import UnifiedPathResolver dynamically to avoid circular dependencies\n    // UnifiedPathResolver already imported at the top\n    const pathResolver = new UnifiedPathResolver(config, projectRoot);\n    const paths = pathResolver.getUnifiedPaths();\n    const templatesDir = paths.templatesDir;\n\n    const templatePath = path.join(templatesDir, `${type}-${name}.yaml`);\n\n    if (!fs.existsSync(templatePath)) {\n      return null;\n    }\n\n    try {\n      const templateContent = fs.readFileSync(templatePath, 'utf8');\n      return YAML.parse(templateContent) as ItemTemplate;\n    } catch (error) {\n      console.warn(\n        `Failed to load template ${templatePath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n      return null;\n    }\n  }\n\n  /**\n   * Get template by type and name with fallback to bundled templates\n   */\n  public getTemplateWithFallback(\n    type: 'epic' | 'issue' | 'task' | 'pr',\n    name: string = 'default'\n  ): ItemTemplate | null {\n    const config = this.getConfig();\n    const projectRoot = path.dirname(path.dirname(this.configPath));\n\n    // Import UnifiedPathResolver dynamically to avoid circular dependencies\n    // UnifiedPathResolver already imported at the top\n    const pathResolver = new UnifiedPathResolver(config, projectRoot);\n    const paths = pathResolver.getUnifiedPaths();\n    const templatesDir = paths.templatesDir;\n\n    // Try to load from project templates first\n    const projectTemplate = this.getTemplate(type, name);\n    if (projectTemplate) {\n      return projectTemplate;\n    }\n\n    // Fallback to bundled templates using TemplateManager\n    const TemplateManager = require('./template-manager.js').TemplateManager;\n    const templateManager = new TemplateManager();\n    return templateManager.getTemplate(templatesDir, type, name);\n  }\n\n  /**\n   * List available templates\n   */\n  public listTemplates(): { type: string; name: string; description: string }[] {\n    const config = this.getConfig();\n    const projectRoot = path.dirname(path.dirname(this.configPath));\n\n    // Import UnifiedPathResolver dynamically to avoid circular dependencies\n    // UnifiedPathResolver already imported at the top\n    const pathResolver = new UnifiedPathResolver(config, projectRoot);\n    const paths = pathResolver.getUnifiedPaths();\n    const templatesDir = paths.templatesDir;\n\n    if (!fs.existsSync(templatesDir)) {\n      return [];\n    }\n\n    const templates: { type: string; name: string; description: string }[] = [];\n    const files = fs.readdirSync(templatesDir).filter((file) => file.endsWith('.yaml'));\n\n    for (const file of files) {\n      try {\n        const templateContent = fs.readFileSync(path.join(templatesDir, file), 'utf8');\n        const template = YAML.parse(templateContent) as ItemTemplate;\n        templates.push({\n          type: template.type,\n          name: template.name,\n          description: template.description,\n        });\n      } catch (error) {\n        console.warn(\n          `Failed to parse template ${file}: ${error instanceof Error ? error.message : 'Unknown error'}`\n        );\n      }\n    }\n\n    return templates;\n  }\n}\n","import chalk from 'chalk';\nimport type { Colors } from '../types/index.js';\n\n/**\n * Professional color scheme for the CLI\n * Provides consistent, accessible colors across the application\n */\nexport const colors: Colors = {\n  // Main brand color - cyan for professional tech feel\n  primary: chalk.cyan,\n\n  // Success operations and positive feedback\n  success: chalk.green,\n\n  // Warnings and cautionary messages\n  warning: chalk.yellow,\n\n  // Errors and critical issues\n  error: chalk.red,\n\n  // Informational messages and tips\n  info: chalk.blue,\n\n  // Secondary text and less important information\n  muted: chalk.gray,\n\n  // Important highlights and emphasis\n  highlight: chalk.bold.white,\n};\n\n/**\n * Specialized color functions for specific UI elements\n */\nexport class ColorTheme {\n  // Priority-based colors\n  static priority(level: string): (text: string) => string {\n    switch (level.toLowerCase()) {\n      case 'low':\n        return chalk.gray;\n      case 'medium':\n        return chalk.yellow;\n      case 'high':\n        return chalk.magenta;\n      case 'critical':\n        return chalk.red.bold;\n      default:\n        return chalk.whiteBright;\n    }\n  }\n\n  // Status-based colors\n  static status(status: string): (text: string) => string {\n    switch (status.toLowerCase()) {\n      case 'todo':\n        return chalk.gray;\n      case 'in-progress':\n        return chalk.blue;\n      case 'done':\n        return chalk.green;\n      case 'blocked':\n        return chalk.red;\n      default:\n        return chalk.whiteBright;\n    }\n  }\n\n  // Command-specific colors\n  static command(command: string): string {\n    return chalk.cyan.bold(command);\n  }\n\n  // Option colors\n  static option(option: string): string {\n    return chalk.yellow(option);\n  }\n\n  // Argument colors\n  static argument(arg: string): string {\n    return chalk.green(arg);\n  }\n\n  // Header styling\n  static header(text: string): string {\n    return chalk.bold.cyan(`\\n${text}\\n${'='.repeat(text.length)}`);\n  }\n\n  // Subheader styling\n  static subheader(text: string): string {\n    return chalk.bold.white(`\\n${text}\\n${'-'.repeat(text.length)}`);\n  }\n\n  // Badge styling for tags, labels, etc.\n  static badge(text: string, variant: 'info' | 'success' | 'warning' | 'error' = 'info'): string {\n    const colorFn = colors[variant];\n    return colorFn(` ${text} `);\n  }\n\n  // Create a bordered box for important messages\n  static box(text: string, variant: 'info' | 'success' | 'warning' | 'error' = 'info'): string {\n    const lines = text.split('\\n');\n    const maxLength = Math.max(...lines.map((line) => line.length));\n    const colorFn = colors[variant];\n\n    const border = '─'.repeat(maxLength + 2);\n    const top = `┌${border}┐`;\n    const bottom = `└${border}┘`;\n\n    const content = lines.map((line) => `│ ${line.padEnd(maxLength)} │`).join('\\n');\n\n    return colorFn(`${top}\\n${content}\\n${bottom}`);\n  }\n\n  // Progress indicators\n  static progress(current: number, total: number): string {\n    const percentage = Math.round((current / total) * 100);\n    const filled = Math.round((current / total) * 20);\n    const empty = 20 - filled;\n\n    const bar = '█'.repeat(filled) + '░'.repeat(empty);\n\n    if (percentage < 30) {\n      return chalk.red(`[${bar}] ${percentage}%`);\n    } else if (percentage < 70) {\n      return chalk.yellow(`[${bar}] ${percentage}%`);\n    } else {\n      return chalk.green(`[${bar}] ${percentage}%`);\n    }\n  }\n\n  // Create a separator line\n  static separator(char = '─', length = 50): string {\n    return chalk.gray(char.repeat(length));\n  }\n\n  // Timestamp formatting\n  static timestamp(date: Date): string {\n    return chalk.dim(date.toISOString().replace('T', ' ').substring(0, 19));\n  }\n\n  // File path formatting\n  static path(path: string): string {\n    return chalk.cyan.underline(path);\n  }\n\n  // Code formatting\n  static code(code: string): string {\n    return chalk.gray.inverse(` ${code} `);\n  }\n\n  // URL formatting\n  static url(url: string): string {\n    return chalk.blue.underline(url);\n  }\n\n  // Keyboard shortcut formatting\n  static key(key: string): string {\n    return chalk.inverse(` ${key} `);\n  }\n}\n\n/**\n * Check if colors should be disabled based on environment\n */\nexport function shouldUseColors(): boolean {\n  // Check environment variables\n  if (process.env.NO_COLOR || process.env.FORCE_COLOR === '0') {\n    return false;\n  }\n\n  if (\n    process.env.FORCE_COLOR === '1' ||\n    process.env.FORCE_COLOR === '2' ||\n    process.env.FORCE_COLOR === '3'\n  ) {\n    return true;\n  }\n\n  // Check if stdout is a TTY\n  return process.stdout.isTTY;\n}\n\n/**\n * Disable colors globally\n */\nexport function disableColors(): void {\n  chalk.level = 0;\n}\n\n/**\n * Enable colors globally\n */\nexport function enableColors(): void {\n  chalk.level = 3;\n}\n","import boxen from 'boxen';\nimport figlet from 'figlet';\nimport type { LogLevel, TrackdownItem } from '../types/index.js';\nimport { ColorTheme, colors } from './colors.js';\n\nexport class Formatter {\n  static success(message: string): string {\n    return colors.success(`✅ ${message}`);\n  }\n\n  static error(message: string): string {\n    return colors.error(`❌ ${message}`);\n  }\n\n  static warning(message: string): string {\n    return colors.warning(`⚠️  ${message}`);\n  }\n\n  static info(message: string): string {\n    return colors.info(`ℹ️  ${message}`);\n  }\n\n  static debug(message: string): string {\n    return colors.muted(`🔍 ${message}`);\n  }\n\n  static header(text: string): string {\n    return ColorTheme.header(text);\n  }\n\n  static subheader(text: string): string {\n    return ColorTheme.subheader(text);\n  }\n\n  static highlight(text: string): string {\n    return colors.highlight(text);\n  }\n\n  static dim(text: string): string {\n    return colors.muted(text);\n  }\n\n  // Enhanced banner for CLI startup\n  static banner(text: string): string {\n    try {\n      const ascii = figlet.textSync(text, {\n        font: 'ANSI Shadow',\n        horizontalLayout: 'default',\n        verticalLayout: 'default',\n        width: 80,\n        whitespaceBreak: true,\n      });\n      return colors.primary(ascii);\n    } catch {\n      // Fallback if figlet fails\n      return ColorTheme.header(text);\n    }\n  }\n\n  // Create beautiful notification boxes\n  static box(message: string, variant: 'info' | 'success' | 'warning' | 'error' = 'info'): string {\n    const borderColors = {\n      info: 'cyan',\n      success: 'green',\n      warning: 'yellow',\n      error: 'red',\n    };\n\n    return boxen(message, {\n      padding: 1,\n      margin: 1,\n      borderStyle: 'round',\n      borderColor: borderColors[variant],\n      backgroundColor: undefined,\n    });\n  }\n\n  // Professional item formatting with enhanced styling\n  static formatItem(item: TrackdownItem, format: 'compact' | 'detailed' = 'detailed'): string {\n    const statusBadge = ColorTheme.badge(\n      item.status.toUpperCase(),\n      Formatter.getStatusVariant(item.status)\n    );\n    const priorityBadge = ColorTheme.badge(\n      item.priority.toUpperCase(),\n      Formatter.getPriorityVariant(item.priority)\n    );\n\n    if (format === 'compact') {\n      return [\n        `${statusBadge} ${priorityBadge} ${colors.highlight(item.title)}`,\n        colors.muted(`ID: ${item.id}`),\n        item.assignee ? colors.info(`@${item.assignee}`) : '',\n        item.tags?.length ? colors.muted(`[${item.tags.join(', ')}]`) : '',\n      ]\n        .filter(Boolean)\n        .join(' ');\n    }\n\n    const sections = [\n      `${statusBadge} ${priorityBadge}`,\n      colors.highlight(item.title),\n      colors.muted(`ID: ${item.id}`),\n      item.assignee ? colors.info(`👤 Assignee: ${item.assignee}`) : '',\n      item.description ? colors.muted(`📝 ${item.description}`) : '',\n      item.estimate ? colors.warning(`📊 ${item.estimate} story points`) : '',\n      item.tags?.length ? colors.primary(`🏷️  Tags: ${item.tags.join(', ')}`) : '',\n      ColorTheme.timestamp(item.createdAt),\n    ];\n\n    return sections.filter(Boolean).join('\\n');\n  }\n\n  // Enhanced list formatting with statistics\n  static formatList(items: TrackdownItem[], showStats = true): string {\n    if (items.length === 0) {\n      return Formatter.box('No items found', 'info');\n    }\n\n    const formatted = items\n      .map((item, index) => {\n        const prefix = colors.muted(`${(index + 1).toString().padStart(2, ' ')}. `);\n        return `${prefix}${Formatter.formatItem(item, 'compact')}`;\n      })\n      .join('\\n');\n\n    if (!showStats) {\n      return formatted;\n    }\n\n    const stats = Formatter.generateStats(items);\n    return `${formatted}\\n\\n${stats}`;\n  }\n\n  // Generate item statistics\n  static generateStats(items: TrackdownItem[]): string {\n    const total = items.length;\n    const byStatus = Formatter.groupBy(items, 'status');\n    const byPriority = Formatter.groupBy(items, 'priority');\n\n    const statusSection = Object.entries(byStatus)\n      .map(([status, count]) => {\n        const color = ColorTheme.status(status);\n        return color(`${status}: ${count}`);\n      })\n      .join(' | ');\n\n    const prioritySection = Object.entries(byPriority)\n      .map(([priority, count]) => {\n        const color = ColorTheme.priority(priority);\n        return color(`${priority}: ${count}`);\n      })\n      .join(' | ');\n\n    return [\n      ColorTheme.separator(),\n      colors.highlight(`📊 Statistics (${total} total)`),\n      `Status: ${statusSection}`,\n      `Priority: ${prioritySection}`,\n      ColorTheme.separator(),\n    ].join('\\n');\n  }\n\n  // Enhanced table formatting\n  static formatTable(items: TrackdownItem[]): string {\n    if (items.length === 0) {\n      return Formatter.box('No items found', 'info');\n    }\n\n    const headers = ['ID', 'Title', 'Status', 'Priority', 'Assignee', 'Tags'];\n    const maxWidths = Formatter.calculateColumnWidths(items, headers);\n\n    const headerRow = headers\n      .map((header, i) => colors.highlight(header.padEnd(maxWidths[i])))\n      .join(' | ');\n\n    const separator = ColorTheme.separator('─', headerRow.length);\n\n    const rows = items.map((item) => {\n      const cells = [\n        item.id,\n        item.title.length > 30 ? `${item.title.substring(0, 27)}...` : item.title,\n        item.status,\n        item.priority,\n        item.assignee || 'unassigned',\n        item.tags?.join(', ') || '',\n      ];\n\n      return cells\n        .map((cell, i) => {\n          const colored =\n            i === 2\n              ? ColorTheme.status(cell)(cell)\n              : i === 3\n                ? ColorTheme.priority(cell)(cell)\n                : cell;\n          return colored.padEnd(maxWidths[i]);\n        })\n        .join(' | ');\n    });\n\n    return [headerRow, separator, ...rows].join('\\n');\n  }\n\n  // Format export output\n  static formatExport(items: TrackdownItem[], format: string): string {\n    switch (format) {\n      case 'json':\n        return JSON.stringify(items, null, 2);\n      case 'csv':\n        return Formatter.formatCSV(items);\n      case 'yaml':\n        // Would need yaml package import\n        return Formatter.formatYAML(items);\n      case 'markdown':\n        return Formatter.formatMarkdown(items);\n      default:\n        return Formatter.formatTable(items);\n    }\n  }\n\n  // Enhanced help formatting\n  static formatHelp(\n    command: string,\n    description: string,\n    usage: string,\n    options: Array<{ flag: string; description: string }>,\n    examples: string[]\n  ): string {\n    const sections = [\n      ColorTheme.header(`${command.toUpperCase()} COMMAND`),\n      `${colors.info('Description:')} ${description}`,\n      '',\n      `${colors.info('Usage:')} ${ColorTheme.command(usage)}`,\n      '',\n      colors.info('Options:'),\n      ...options.map((opt) => `  ${ColorTheme.option(opt.flag.padEnd(20))} ${opt.description}`),\n      '',\n      colors.info('Examples:'),\n      ...examples.map((ex) => `  ${colors.muted('$')} ${ex}`),\n    ];\n\n    return sections.join('\\n');\n  }\n\n  // Enhanced logging with context\n  static log(level: LogLevel, message: string, context?: Record<string, any>): void {\n    const timestamp = ColorTheme.timestamp(new Date());\n    const contextStr = context ? ` ${colors.muted(JSON.stringify(context))}` : '';\n\n    switch (level) {\n      case 'debug':\n        console.log(`${timestamp} ${Formatter.debug(message)}${contextStr}`);\n        break;\n      case 'info':\n        console.log(`${timestamp} ${Formatter.info(message)}${contextStr}`);\n        break;\n      case 'warn':\n        console.warn(`${timestamp} ${Formatter.warning(message)}${contextStr}`);\n        break;\n      case 'error':\n        console.error(`${timestamp} ${Formatter.error(message)}${contextStr}`);\n        break;\n    }\n  }\n\n  // Helper methods\n  private static getStatusVariant(status: string): 'info' | 'success' | 'warning' | 'error' {\n    switch (status) {\n      case 'done':\n        return 'success';\n      case 'blocked':\n        return 'error';\n      case 'in-progress':\n        return 'warning';\n      default:\n        return 'info';\n    }\n  }\n\n  private static getPriorityVariant(priority: string): 'info' | 'success' | 'warning' | 'error' {\n    switch (priority) {\n      case 'critical':\n        return 'error';\n      case 'high':\n        return 'warning';\n      case 'medium':\n        return 'info';\n      default:\n        return 'success';\n    }\n  }\n\n  private static groupBy<T>(items: T[], key: keyof T): Record<string, number> {\n    return items.reduce(\n      (acc, item) => {\n        const value = String(item[key]);\n        acc[value] = (acc[value] || 0) + 1;\n        return acc;\n      },\n      {} as Record<string, number>\n    );\n  }\n\n  private static calculateColumnWidths(items: TrackdownItem[], headers: string[]): number[] {\n    const rows = items.map((item) => [\n      item.id,\n      item.title.length > 30 ? `${item.title.substring(0, 27)}...` : item.title,\n      item.status,\n      item.priority,\n      item.assignee || 'unassigned',\n      item.tags?.join(', ') || '',\n    ]);\n\n    return headers.map((header, i) => {\n      const columnValues = [header, ...rows.map((row) => row[i])];\n      return Math.max(...columnValues.map((val) => val.length)) + 2;\n    });\n  }\n\n  private static formatCSV(items: TrackdownItem[]): string {\n    const headers = [\n      'ID',\n      'Title',\n      'Description',\n      'Status',\n      'Priority',\n      'Assignee',\n      'Created',\n      'Updated',\n      'Tags',\n    ];\n    const rows = items.map((item) => [\n      item.id,\n      `\"${item.title.replace(/\"/g, '\"\"')}\"`,\n      `\"${(item.description || '').replace(/\"/g, '\"\"')}\"`,\n      item.status,\n      item.priority,\n      item.assignee || '',\n      item.createdAt.toISOString(),\n      item.updatedAt.toISOString(),\n      `\"${(item.tags || []).join(', ')}\"`,\n    ]);\n\n    return [headers.join(','), ...rows.map((row) => row.join(','))].join('\\n');\n  }\n\n  private static formatYAML(items: TrackdownItem[]): string {\n    // Basic YAML formatting - would be better with yaml package\n    return items\n      .map((item) => {\n        return [\n          `- id: ${item.id}`,\n          `  title: \"${item.title}\"`,\n          `  description: \"${item.description || ''}\"`,\n          `  status: ${item.status}`,\n          `  priority: ${item.priority}`,\n          `  assignee: ${item.assignee || ''}`,\n          `  created: ${item.createdAt.toISOString()}`,\n          `  updated: ${item.updatedAt.toISOString()}`,\n          `  tags: [${(item.tags || []).map((t) => `\"${t}\"`).join(', ')}]`,\n        ].join('\\n');\n      })\n      .join('\\n');\n  }\n\n  private static formatMarkdown(items: TrackdownItem[]): string {\n    const table = [\n      '| ID | Title | Status | Priority | Assignee | Tags |',\n      '|---|---|---|---|---|---|',\n      ...items.map(\n        (item) =>\n          `| ${item.id} | ${item.title} | ${item.status} | ${item.priority} | ${item.assignee || ''} | ${(item.tags || []).join(', ')} |`\n      ),\n    ].join('\\n');\n\n    return `# Trackdown Items\\n\\n${table}\\n\\n*Generated at ${new Date().toISOString()}*`;\n  }\n}\n","/**\n * YAML Frontmatter Parser for AI-Trackdown\n * Handles parsing and serialization of Epic, Issue, and Task files\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as YAML from 'yaml';\nimport type {\n  AnyFrontmatter,\n  AnyItemData,\n  EpicData,\n  EpicFrontmatter,\n  IssueData,\n  IssueFrontmatter,\n  PRData,\n  PRFrontmatter,\n  TaskData,\n  TaskFrontmatter,\n  ValidationError,\n  ValidationResult,\n} from '../types/ai-trackdown.js';\n\n// Frontmatter delimiter patterns\nconst FRONTMATTER_DELIMITER = '---';\nconst FRONTMATTER_REGEX = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/;\n\nexport class FrontmatterParser {\n  /**\n   * Parse an Epic file with YAML frontmatter\n   */\n  public parseEpic(filePath: string): EpicData {\n    const { frontmatter, content } = this.parseFile(filePath);\n\n    // Validate that this is an epic\n    if (!frontmatter.epic_id) {\n      throw new Error(`File ${filePath} is missing epic_id field`);\n    }\n\n    const epicFrontmatter = frontmatter as EpicFrontmatter;\n    this.validateEpicFrontmatter(epicFrontmatter);\n\n    return {\n      ...epicFrontmatter,\n      content,\n      file_path: filePath,\n    };\n  }\n\n  /**\n   * Parse an Issue file with YAML frontmatter\n   */\n  public parseIssue(filePath: string): IssueData {\n    const { frontmatter, content } = this.parseFile(filePath);\n\n    // Validate that this is an issue\n    if (!frontmatter.issue_id) {\n      throw new Error(`File ${filePath} is missing required issue_id field`);\n    }\n\n    const issueFrontmatter = frontmatter as IssueFrontmatter;\n    this.validateIssueFrontmatter(issueFrontmatter);\n\n    return {\n      ...issueFrontmatter,\n      content,\n      file_path: filePath,\n    };\n  }\n\n  /**\n   * Parse a Task file with YAML frontmatter\n   */\n  public parseTask(filePath: string): TaskData {\n    const { frontmatter, content } = this.parseFile(filePath);\n\n    // Validate that this is a task\n    if (!frontmatter.task_id || !frontmatter.issue_id) {\n      throw new Error(`File ${filePath} is missing required task_id or issue_id field`);\n    }\n\n    const taskFrontmatter = frontmatter as TaskFrontmatter;\n    this.validateTaskFrontmatter(taskFrontmatter);\n\n    return {\n      ...taskFrontmatter,\n      content,\n      file_path: filePath,\n    };\n  }\n\n  /**\n   * Parse a PR file with YAML frontmatter\n   */\n  public parsePR(filePath: string): PRData {\n    const { frontmatter, content } = this.parseFile(filePath);\n\n    // Validate that this is a PR\n    if (!frontmatter.pr_id || !frontmatter.issue_id) {\n      throw new Error(`File ${filePath} is missing required pr_id or issue_id field`);\n    }\n\n    const prFrontmatter = frontmatter as PRFrontmatter;\n    this.validatePRFrontmatter(prFrontmatter);\n\n    return {\n      ...prFrontmatter,\n      content,\n      file_path: filePath,\n    };\n  }\n\n  /**\n   * Generic file parser for any ai-trackdown item\n   */\n  public parseAnyItem(filePath: string): AnyItemData {\n    const { frontmatter } = this.parseFile(filePath);\n\n    if (\n      frontmatter.epic_id &&\n      !frontmatter.issue_id &&\n      !frontmatter.task_id &&\n      !frontmatter.pr_id\n    ) {\n      return this.parseEpic(filePath);\n    } else if (\n      frontmatter.issue_id &&\n      !frontmatter.task_id &&\n      !frontmatter.pr_id\n    ) {\n      return this.parseIssue(filePath);\n    } else if (\n      frontmatter.task_id &&\n      frontmatter.issue_id &&\n      !frontmatter.pr_id\n    ) {\n      return this.parseTask(filePath);\n    } else if (\n      frontmatter.pr_id &&\n      frontmatter.issue_id &&\n      !frontmatter.task_id\n    ) {\n      return this.parsePR(filePath);\n    } else {\n      throw new Error(`File ${filePath} does not match any ai-trackdown item type`);\n    }\n  }\n\n  /**\n   * Serialize Epic data back to file format\n   */\n  public serializeEpic(data: EpicFrontmatter, content: string): string {\n    const frontmatter = this.cleanFrontmatter(data);\n    return this.serializeWithFrontmatter(frontmatter, content);\n  }\n\n  /**\n   * Serialize Issue data back to file format\n   */\n  public serializeIssue(data: IssueFrontmatter, content: string): string {\n    const frontmatter = this.cleanFrontmatter(data);\n    return this.serializeWithFrontmatter(frontmatter, content);\n  }\n\n  /**\n   * Serialize Task data back to file format\n   */\n  public serializeTask(data: TaskFrontmatter, content: string): string {\n    const frontmatter = this.cleanFrontmatter(data);\n    return this.serializeWithFrontmatter(frontmatter, content);\n  }\n\n  /**\n   * Serialize PR data back to file format\n   */\n  public serializePR(data: PRFrontmatter, content: string): string {\n    const frontmatter = this.cleanFrontmatter(data);\n    return this.serializeWithFrontmatter(frontmatter, content);\n  }\n\n  /**\n   * Write Epic data to file\n   */\n  public writeEpic(filePath: string, data: EpicFrontmatter, content: string): void {\n    const serialized = this.serializeEpic(data, content);\n    this.ensureDirectoryExists(path.dirname(filePath));\n    fs.writeFileSync(filePath, serialized, 'utf8');\n  }\n\n  /**\n   * Write Issue data to file\n   */\n  public writeIssue(filePath: string, data: IssueFrontmatter, content: string): void {\n    const serialized = this.serializeIssue(data, content);\n    this.ensureDirectoryExists(path.dirname(filePath));\n    fs.writeFileSync(filePath, serialized, 'utf8');\n  }\n\n  /**\n   * Write Task data to file\n   */\n  public writeTask(filePath: string, data: TaskFrontmatter, content: string): void {\n    const serialized = this.serializeTask(data, content);\n    this.ensureDirectoryExists(path.dirname(filePath));\n    fs.writeFileSync(filePath, serialized, 'utf8');\n  }\n\n  /**\n   * Write PR data to file\n   */\n  public writePR(filePath: string, data: PRFrontmatter, content: string): void {\n    const serialized = this.serializePR(data, content);\n    this.ensureDirectoryExists(path.dirname(filePath));\n    fs.writeFileSync(filePath, serialized, 'utf8');\n  }\n\n  /**\n   * Update existing file with new frontmatter data\n   */\n  public updateFile(filePath: string, updates: Partial<AnyFrontmatter>): AnyItemData {\n    const existing = this.parseAnyItem(filePath);\n\n    // Merge updates with existing data\n    const updated = {\n      ...existing,\n      ...updates,\n      updated_date: new Date().toISOString(),\n    };\n\n    // Write back to file\n    if ('epic_id' in updated && !('issue_id' in updated)) {\n      this.writeEpic(filePath, updated as EpicFrontmatter, existing.content);\n    } else if ('issue_id' in updated && !('task_id' in updated) && !('pr_id' in updated)) {\n      this.writeIssue(filePath, updated as IssueFrontmatter, existing.content);\n    } else if ('task_id' in updated) {\n      this.writeTask(filePath, updated as TaskFrontmatter, existing.content);\n    } else if ('pr_id' in updated) {\n      this.writePR(filePath, updated as PRFrontmatter, existing.content);\n    }\n\n    return updated;\n  }\n\n  /**\n   * Validate file structure and content\n   */\n  public validateFile(filePath: string): ValidationResult {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationError[] = [];\n\n    try {\n      if (!fs.existsSync(filePath)) {\n        errors.push({\n          field: 'file',\n          message: `File does not exist: ${filePath}`,\n          severity: 'error',\n        });\n        return { valid: false, errors, warnings };\n      }\n\n      const data = this.parseAnyItem(filePath);\n\n      // Validate required fields based on type\n      if ('epic_id' in data && !('issue_id' in data)) {\n        return this.validateEpicData(data as EpicData);\n      } else if ('issue_id' in data && !('task_id' in data) && !('pr_id' in data)) {\n        return this.validateIssueData(data as IssueData);\n      } else if ('task_id' in data) {\n        return this.validateTaskData(data as TaskData);\n      } else if ('pr_id' in data) {\n        return this.validatePRData(data as PRData);\n      }\n    } catch (error) {\n      errors.push({\n        field: 'parse',\n        message: `Failed to parse file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        severity: 'error',\n      });\n    }\n\n    return { valid: errors.length === 0, errors, warnings };\n  }\n\n  /**\n   * Private: Core file parsing logic\n   */\n  private parseFile(filePath: string): { frontmatter: AnyFrontmatter; content: string } {\n    if (!fs.existsSync(filePath)) {\n      throw new Error(`File not found: ${filePath}`);\n    }\n\n    const fileContent = fs.readFileSync(filePath, 'utf8');\n    const match = fileContent.match(FRONTMATTER_REGEX);\n\n    if (!match) {\n      throw new Error(`No valid YAML frontmatter found in file: ${filePath}`);\n    }\n\n    const [, yamlContent, markdownContent] = match;\n\n    try {\n      const frontmatter = YAML.parse(yamlContent) as AnyFrontmatter;\n      return {\n        frontmatter,\n        content: markdownContent.trim(),\n      };\n    } catch (error) {\n      throw new Error(\n        `Failed to parse YAML frontmatter in ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Private: Serialize frontmatter and content to file format\n   */\n  private serializeWithFrontmatter(frontmatter: AnyFrontmatter, content: string): string {\n    const yamlString = YAML.stringify(frontmatter, {\n      indent: 2,\n      lineWidth: 120,\n      minContentWidth: 20,\n    });\n\n    return `${FRONTMATTER_DELIMITER}\\n${yamlString}${FRONTMATTER_DELIMITER}\\n\\n${content}\\n`;\n  }\n\n  /**\n   * Private: Clean frontmatter object (remove undefined/null values)\n   */\n  private cleanFrontmatter(data: AnyFrontmatter): AnyFrontmatter {\n    const cleaned: Record<string, any> = {};\n\n    for (const [key, value] of Object.entries(data)) {\n      if (value !== undefined && value !== null) {\n        cleaned[key] = value;\n      }\n    }\n\n    return cleaned as AnyFrontmatter;\n  }\n\n  /**\n   * Private: Ensure directory exists\n   */\n  private ensureDirectoryExists(dirPath: string): void {\n    if (!fs.existsSync(dirPath)) {\n      fs.mkdirSync(dirPath, { recursive: true });\n    }\n  }\n\n  /**\n   * Private: Validate Epic frontmatter\n   */\n  private validateEpicFrontmatter(data: EpicFrontmatter): void {\n    const required = ['epic_id', 'title', 'status', 'priority', 'assignee', 'created_date'];\n    for (const field of required) {\n      if (!data[field as keyof EpicFrontmatter]) {\n        throw new Error(`Epic missing required field: ${field}`);\n      }\n    }\n  }\n\n  /**\n   * Private: Validate Issue frontmatter\n   */\n  private validateIssueFrontmatter(data: IssueFrontmatter): void {\n    const required = [\n      'issue_id',\n      'title',\n      'status',\n      'priority',\n      'assignee',\n      'created_date',\n    ];\n    for (const field of required) {\n      if (!data[field as keyof IssueFrontmatter]) {\n        throw new Error(`Issue missing required field: ${field}`);\n      }\n    }\n  }\n\n  /**\n   * Private: Validate Task frontmatter\n   */\n  private validateTaskFrontmatter(data: TaskFrontmatter): void {\n    const required = [\n      'task_id',\n      'issue_id',\n      'title',\n      'status',\n      'priority',\n      'assignee',\n      'created_date',\n    ];\n    for (const field of required) {\n      if (!data[field as keyof TaskFrontmatter]) {\n        throw new Error(`Task missing required field: ${field}`);\n      }\n    }\n  }\n\n  /**\n   * Private: Validate PR frontmatter\n   */\n  private validatePRFrontmatter(data: PRFrontmatter): void {\n    const required = [\n      'pr_id',\n      'issue_id',\n      'title',\n      'status',\n      'pr_status',\n      'priority',\n      'assignee',\n      'created_date',\n    ];\n    for (const field of required) {\n      if (!data[field as keyof PRFrontmatter]) {\n        throw new Error(`PR missing required field: ${field}`);\n      }\n    }\n  }\n\n  /**\n   * Private: Comprehensive Epic data validation\n   */\n  private validateEpicData(data: EpicData): ValidationResult {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationError[] = [];\n\n    // Required field validation\n    if (!data.epic_id)\n      errors.push({ field: 'epic_id', message: 'Epic ID is required', severity: 'error' });\n    if (!data.title)\n      errors.push({ field: 'title', message: 'Title is required', severity: 'error' });\n    if (!data.status)\n      errors.push({ field: 'status', message: 'Status is required', severity: 'error' });\n\n    // Format validation\n    if (data.epic_id && !/^EP-\\d{4}$/.test(data.epic_id)) {\n      warnings.push({\n        field: 'epic_id',\n        message: 'Epic ID should follow format EP-XXXX',\n        severity: 'warning',\n      });\n    }\n\n    return { valid: errors.length === 0, errors, warnings };\n  }\n\n  /**\n   * Private: Comprehensive Issue data validation\n   */\n  private validateIssueData(data: IssueData): ValidationResult {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationError[] = [];\n\n    // Required field validation\n    if (!data.issue_id)\n      errors.push({ field: 'issue_id', message: 'Issue ID is required', severity: 'error' });\n    if (!data.title)\n      errors.push({ field: 'title', message: 'Title is required', severity: 'error' });\n\n    // Format validation\n    if (data.issue_id && !/^ISS-\\d{4}$/.test(data.issue_id)) {\n      warnings.push({\n        field: 'issue_id',\n        message: 'Issue ID should follow format ISS-XXXX',\n        severity: 'warning',\n      });\n    }\n\n    return { valid: errors.length === 0, errors, warnings };\n  }\n\n  /**\n   * Private: Comprehensive Task data validation\n   */\n  private validateTaskData(data: TaskData): ValidationResult {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationError[] = [];\n\n    // Required field validation\n    if (!data.task_id)\n      errors.push({ field: 'task_id', message: 'Task ID is required', severity: 'error' });\n    if (!data.issue_id)\n      errors.push({ field: 'issue_id', message: 'Issue ID is required', severity: 'error' });\n\n    // Format validation\n    if (data.task_id && !/^TSK-\\d{4}$/.test(data.task_id)) {\n      warnings.push({\n        field: 'task_id',\n        message: 'Task ID should follow format TSK-XXXX',\n        severity: 'warning',\n      });\n    }\n\n    return { valid: errors.length === 0, errors, warnings };\n  }\n\n  /**\n   * Private: Comprehensive PR data validation\n   */\n  private validatePRData(data: PRData): ValidationResult {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationError[] = [];\n\n    // Required field validation\n    if (!data.pr_id)\n      errors.push({ field: 'pr_id', message: 'PR ID is required', severity: 'error' });\n    if (!data.issue_id)\n      errors.push({ field: 'issue_id', message: 'Issue ID is required', severity: 'error' });\n    if (!data.pr_status)\n      errors.push({ field: 'pr_status', message: 'PR status is required', severity: 'error' });\n\n    // Format validation\n    if (data.pr_id && !/^PR-\\d{4}$/.test(data.pr_id)) {\n      warnings.push({\n        field: 'pr_id',\n        message: 'PR ID should follow format PR-XXXX',\n        severity: 'warning',\n      });\n    }\n\n    // PR-specific validation\n    const validPRStatuses = ['draft', 'open', 'review', 'approved', 'merged', 'closed'];\n    if (data.pr_status && !validPRStatuses.includes(data.pr_status)) {\n      errors.push({\n        field: 'pr_status',\n        message: `Invalid PR status: ${data.pr_status}`,\n        severity: 'error',\n      });\n    }\n\n    return { valid: errors.length === 0, errors, warnings };\n  }\n\n  /**\n   * Bulk operations for directory processing\n   */\n  public parseDirectory(\n    dirPath: string,\n    itemType: 'epic' | 'issue' | 'task' | 'pr'\n  ): AnyItemData[] {\n    if (!fs.existsSync(dirPath)) {\n      return [];\n    }\n\n    const files = fs\n      .readdirSync(dirPath)\n      .filter((file) => file.endsWith('.md'))\n      .map((file) => path.join(dirPath, file));\n\n    const results: AnyItemData[] = [];\n\n    for (const filePath of files) {\n      try {\n        let data: AnyItemData;\n\n        switch (itemType) {\n          case 'epic':\n            data = this.parseEpic(filePath);\n            break;\n          case 'issue':\n            data = this.parseIssue(filePath);\n            break;\n          case 'task':\n            data = this.parseTask(filePath);\n            break;\n          case 'pr':\n            data = this.parsePR(filePath);\n            break;\n          default:\n            continue;\n        }\n\n        results.push(data);\n      } catch (error) {\n        console.warn(\n          `Failed to parse ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n        );\n      }\n    }\n\n    return results;\n  }\n}\n","/**\n * Hierarchical Relationship Manager for AI-Trackdown\n * Manages Epic → Issue → Task relationships and dependencies\n */\n\nimport type {\n  AnyItemData,\n  EpicData,\n  EpicHierarchy,\n  IssueData,\n  IssueHierarchy,\n  PRData,\n  PRHierarchy,\n  ProjectConfig,\n  SearchFilters,\n  SearchResult,\n  TaskData,\n  TaskHierarchy,\n  ValidationError,\n  ValidationResult,\n} from '../types/ai-trackdown.js';\nimport { FrontmatterParser } from './frontmatter-parser.js';\nimport { UnifiedPathResolver } from './unified-path-resolver.js';\n\nexport class RelationshipManager {\n  private parser: FrontmatterParser;\n  private config: ProjectConfig;\n  private projectRoot: string;\n  private cliTasksDir?: string;\n\n  // In-memory caches for performance\n  private epicCache: Map<string, EpicData> = new Map();\n  private issueCache: Map<string, IssueData> = new Map();\n  private taskCache: Map<string, TaskData> = new Map();\n  private prCache: Map<string, PRData> = new Map();\n\n  private lastCacheUpdate: number = 0;\n  private cacheExpiry: number = 300000; // 5 minutes\n\n  constructor(config: ProjectConfig, projectRoot?: string, cliTasksDir?: string) {\n    this.parser = new FrontmatterParser();\n    this.config = config;\n    this.projectRoot = projectRoot || process.cwd();\n    this.cliTasksDir = cliTasksDir;\n  }\n\n  /**\n   * Get complete hierarchy for an epic (epic + all issues + all tasks)\n   */\n  public getEpicHierarchy(epicId: string): EpicHierarchy | null {\n    this.refreshCacheIfNeeded();\n\n    const epic = this.epicCache.get(epicId);\n    if (!epic) {\n      return null;\n    }\n\n    const issues = Array.from(this.issueCache.values())\n      .filter((issue) => issue.epic_id === epicId)\n      .sort((a, b) => a.created_date.localeCompare(b.created_date));\n\n    const tasks = Array.from(this.taskCache.values())\n      .filter((task) => task.epic_id === epicId)\n      .sort((a, b) => a.created_date.localeCompare(b.created_date));\n\n    const prs = Array.from(this.prCache.values())\n      .filter((pr) => pr.epic_id === epicId)\n      .sort((a, b) => a.created_date.localeCompare(b.created_date));\n\n    return {\n      epic,\n      issues,\n      tasks,\n      prs,\n    };\n  }\n\n  /**\n   * Get hierarchy for an issue (issue + its tasks + parent epic)\n   */\n  public getIssueHierarchy(issueId: string): IssueHierarchy | null {\n    this.refreshCacheIfNeeded();\n\n    const issue = this.issueCache.get(issueId);\n    if (!issue) {\n      return null;\n    }\n\n    const tasks = Array.from(this.taskCache.values())\n      .filter((task) => task.issue_id === issueId)\n      .sort((a, b) => a.created_date.localeCompare(b.created_date));\n\n    const prs = Array.from(this.prCache.values())\n      .filter((pr) => pr.issue_id === issueId)\n      .sort((a, b) => a.created_date.localeCompare(b.created_date));\n\n    const epic = this.epicCache.get(issue.epic_id);\n\n    return {\n      issue,\n      tasks,\n      prs,\n      epic,\n    };\n  }\n\n  /**\n   * Get hierarchy for a PR (PR + parent issue + parent epic)\n   */\n  public getPRHierarchy(prId: string): PRHierarchy | null {\n    this.refreshCacheIfNeeded();\n\n    const pr = this.prCache.get(prId);\n    if (!pr) {\n      return null;\n    }\n\n    const issue = this.issueCache.get(pr.issue_id);\n    if (!issue) {\n      return null;\n    }\n\n    const epic = this.epicCache.get(pr.epic_id);\n\n    return {\n      pr,\n      issue,\n      epic,\n    };\n  }\n\n  /**\n   * Get hierarchy for a task (task + parent issue + parent epic)\n   */\n  public getTaskHierarchy(taskId: string): TaskHierarchy | null {\n    this.refreshCacheIfNeeded();\n\n    const task = this.taskCache.get(taskId);\n    if (!task) {\n      return null;\n    }\n\n    const issue = this.issueCache.get(task.issue_id);\n    if (!issue) {\n      return null;\n    }\n\n    const epic = task.epic_id ? this.epicCache.get(task.epic_id) : undefined;\n\n    return {\n      task,\n      issue,\n      epic,\n    };\n  }\n\n  /**\n   * Get all children items for a parent ID\n   */\n  public getChildren(parentId: string, type: 'epic' | 'issue'): AnyItemData[] {\n    this.refreshCacheIfNeeded();\n\n    if (type === 'epic') {\n      return Array.from(this.issueCache.values()).filter((issue) => issue.epic_id === parentId);\n    } else if (type === 'issue') {\n      return Array.from(this.taskCache.values()).filter((task) => task.issue_id === parentId);\n    }\n\n    return [];\n  }\n\n  /**\n   * Get parent item for a child ID\n   */\n  public getParent(childId: string, childType: 'issue' | 'task' | 'pr'): AnyItemData | null {\n    this.refreshCacheIfNeeded();\n\n    if (childType === 'issue') {\n      const issue = this.issueCache.get(childId);\n      return issue ? this.epicCache.get(issue.epic_id) || null : null;\n    } else if (childType === 'task') {\n      const task = this.taskCache.get(childId);\n      return task ? this.issueCache.get(task.issue_id) || null : null;\n    } else if (childType === 'pr') {\n      const pr = this.prCache.get(childId);\n      return pr ? this.issueCache.get(pr.issue_id) || null : null;\n    }\n\n    return null;\n  }\n\n  /**\n   * Get all related items (siblings and dependencies)\n   */\n  public getRelatedItems(itemId: string): {\n    siblings: AnyItemData[];\n    dependencies: AnyItemData[];\n    dependents: AnyItemData[];\n    blocked_by: AnyItemData[];\n    blocks: AnyItemData[];\n  } {\n    this.refreshCacheIfNeeded();\n\n    const item = this.findItemById(itemId);\n    if (!item) {\n      return { siblings: [], dependencies: [], dependents: [], blocked_by: [], blocks: [] };\n    }\n\n    // Get siblings (same parent)\n    let siblings: AnyItemData[] = [];\n    if ('task_id' in item) {\n      siblings = Array.from(this.taskCache.values()).filter(\n        (task) => task.issue_id === item.issue_id && task.task_id !== itemId\n      );\n    } else if ('pr_id' in item) {\n      siblings = Array.from(this.prCache.values()).filter(\n        (pr) => pr.issue_id === item.issue_id && pr.pr_id !== itemId\n      );\n    } else if ('issue_id' in item && !('task_id' in item) && !('pr_id' in item)) {\n      siblings = Array.from(this.issueCache.values()).filter(\n        (issue) => issue.epic_id === item.epic_id && issue.issue_id !== itemId\n      );\n    }\n\n    // Get dependencies and dependents\n    const dependencies = this.resolveDependencies(item.dependencies || []);\n    const dependents = this.findDependents(itemId);\n\n    // Get blocked relationships (if item supports it)\n    const blocked_by = 'blocked_by' in item ? this.resolveDependencies(item.blocked_by || []) : [];\n    const blocks = 'blocks' in item ? this.resolveDependencies(item.blocks || []) : [];\n\n    return {\n      siblings,\n      dependencies,\n      dependents,\n      blocked_by,\n      blocks,\n    };\n  }\n\n  /**\n   * Search across all items with filters\n   */\n  public search(filters: SearchFilters): SearchResult<AnyItemData> {\n    const startTime = Date.now();\n    this.refreshCacheIfNeeded();\n\n    let allItems: AnyItemData[] = [\n      ...Array.from(this.epicCache.values()),\n      ...Array.from(this.issueCache.values()),\n      ...Array.from(this.taskCache.values()),\n      ...Array.from(this.prCache.values()),\n    ];\n\n    // Apply filters\n    if (filters.status) {\n      const statuses = Array.isArray(filters.status) ? filters.status : [filters.status];\n      allItems = allItems.filter((item) => statuses.includes(item.status));\n    }\n\n    if (filters.priority) {\n      const priorities = Array.isArray(filters.priority) ? filters.priority : [filters.priority];\n      allItems = allItems.filter((item) => priorities.includes(item.priority));\n    }\n\n    if (filters.assignee) {\n      const assignees = Array.isArray(filters.assignee) ? filters.assignee : [filters.assignee];\n      allItems = allItems.filter((item) => assignees.includes(item.assignee));\n    }\n\n    if (filters.tags) {\n      const tags = Array.isArray(filters.tags) ? filters.tags : [filters.tags];\n      allItems = allItems.filter((item) => {\n        const itemTags = 'tags' in item ? item.tags || [] : [];\n        return tags.some((tag) => itemTags.includes(tag));\n      });\n    }\n\n    if (filters.created_after) {\n      allItems = allItems.filter((item) => item.created_date >= filters.created_after!);\n    }\n\n    if (filters.created_before) {\n      allItems = allItems.filter((item) => item.created_date <= filters.created_before!);\n    }\n\n    if (filters.updated_after) {\n      allItems = allItems.filter((item) => item.updated_date >= filters.updated_after!);\n    }\n\n    if (filters.updated_before) {\n      allItems = allItems.filter((item) => item.updated_date <= filters.updated_before!);\n    }\n\n    if (filters.content_search) {\n      const searchTerm = filters.content_search.toLowerCase();\n      allItems = allItems.filter(\n        (item) =>\n          item.title.toLowerCase().includes(searchTerm) ||\n          item.description.toLowerCase().includes(searchTerm) ||\n          item.content.toLowerCase().includes(searchTerm)\n      );\n    }\n\n    if (filters.ai_context_search) {\n      const searchTerm = filters.ai_context_search.toLowerCase();\n      allItems = allItems.filter((item) =>\n        item.ai_context.some((context) => context.toLowerCase().includes(searchTerm))\n      );\n    }\n\n    const executionTime = Date.now() - startTime;\n\n    return {\n      items: allItems,\n      total_count: allItems.length,\n      search_query: filters,\n      execution_time: executionTime,\n    };\n  }\n\n  /**\n   * Validate relationships and hierarchical integrity\n   */\n  public validateRelationships(): ValidationResult {\n    this.refreshCacheIfNeeded();\n\n    const errors: ValidationError[] = [];\n    const warnings: ValidationError[] = [];\n\n    // Check orphaned issues (epic_id doesn't exist)\n    for (const issue of this.issueCache.values()) {\n      if (!this.epicCache.has(issue.epic_id)) {\n        errors.push({\n          field: 'epic_id',\n          message: `Issue ${issue.issue_id} references non-existent epic ${issue.epic_id}`,\n          severity: 'error',\n        });\n      }\n    }\n\n    // Check orphaned tasks (issue_id doesn't exist)\n    for (const task of this.taskCache.values()) {\n      if (!this.issueCache.has(task.issue_id)) {\n        errors.push({\n          field: 'issue_id',\n          message: `Task ${task.task_id} references non-existent issue ${task.issue_id}`,\n          severity: 'error',\n        });\n      }\n\n      if (!this.epicCache.has(task.epic_id)) {\n        errors.push({\n          field: 'epic_id',\n          message: `Task ${task.task_id} references non-existent epic ${task.epic_id}`,\n          severity: 'error',\n        });\n      }\n    }\n\n    // Check orphaned PRs (issue_id doesn't exist)\n    for (const pr of this.prCache.values()) {\n      if (!this.issueCache.has(pr.issue_id)) {\n        errors.push({\n          field: 'issue_id',\n          message: `PR ${pr.pr_id} references non-existent issue ${pr.issue_id}`,\n          severity: 'error',\n        });\n      }\n\n      if (!this.epicCache.has(pr.epic_id)) {\n        errors.push({\n          field: 'epic_id',\n          message: `PR ${pr.pr_id} references non-existent epic ${pr.epic_id}`,\n          severity: 'error',\n        });\n      }\n    }\n\n    // Check circular dependencies\n    const circularDeps = this.findCircularDependencies();\n    for (const cycle of circularDeps) {\n      errors.push({\n        field: 'dependencies',\n        message: `Circular dependency detected: ${cycle.join(' → ')}`,\n        severity: 'error',\n      });\n    }\n\n    // Check for inconsistent epic_id in task hierarchy\n    for (const task of this.taskCache.values()) {\n      const issue = this.issueCache.get(task.issue_id);\n      if (issue && task.epic_id !== issue.epic_id) {\n        warnings.push({\n          field: 'epic_id',\n          message: `Task ${task.task_id} epic_id (${task.epic_id}) doesn't match issue's epic_id (${issue.epic_id})`,\n          severity: 'warning',\n        });\n      }\n    }\n\n    // Check for inconsistent epic_id in PR hierarchy\n    for (const pr of this.prCache.values()) {\n      const issue = this.issueCache.get(pr.issue_id);\n      if (issue && pr.epic_id !== issue.epic_id) {\n        warnings.push({\n          field: 'epic_id',\n          message: `PR ${pr.pr_id} epic_id (${pr.epic_id}) doesn't match issue's epic_id (${issue.epic_id})`,\n          severity: 'warning',\n        });\n      }\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n      warnings,\n    };\n  }\n\n  /**\n   * Rebuild all caches from filesystem\n   */\n  public rebuildCache(): void {\n    this.epicCache.clear();\n    this.issueCache.clear();\n    this.taskCache.clear();\n    this.prCache.clear();\n\n    // Get absolute paths using UnifiedPathResolver\n    const pathResolver = new UnifiedPathResolver(this.config, this.projectRoot, this.cliTasksDir);\n    const paths = pathResolver.getUnifiedPaths();\n\n    // Load epics\n    const epics = this.parser.parseDirectory(paths.epicsDir, 'epic');\n    for (const epic of epics as EpicData[]) {\n      this.epicCache.set(epic.epic_id, epic);\n    }\n\n    // Load issues\n    const issues = this.parser.parseDirectory(paths.issuesDir, 'issue');\n    for (const issue of issues as IssueData[]) {\n      this.issueCache.set(issue.issue_id, issue);\n    }\n\n    // Load tasks\n    const tasks = this.parser.parseDirectory(paths.tasksDir, 'task');\n    for (const task of tasks as TaskData[]) {\n      this.taskCache.set(task.task_id, task);\n    }\n\n    // Load PRs\n    const prs = this.parser.parseDirectory(paths.prsDir, 'pr');\n    for (const pr of prs as PRData[]) {\n      this.prCache.set(pr.pr_id, pr);\n    }\n\n    this.lastCacheUpdate = Date.now();\n  }\n\n  /**\n   * Get cache statistics\n   */\n  public getCacheStats(): {\n    epics: number;\n    issues: number;\n    tasks: number;\n    prs: number;\n    lastUpdate: Date;\n    isStale: boolean;\n  } {\n    return {\n      epics: this.epicCache.size,\n      issues: this.issueCache.size,\n      tasks: this.taskCache.size,\n      prs: this.prCache.size,\n      lastUpdate: new Date(this.lastCacheUpdate),\n      isStale: Date.now() - this.lastCacheUpdate > this.cacheExpiry,\n    };\n  }\n\n  /**\n   * Force refresh cache if stale\n   */\n  private refreshCacheIfNeeded(): void {\n    if (Date.now() - this.lastCacheUpdate > this.cacheExpiry) {\n      this.rebuildCache();\n    }\n  }\n\n  /**\n   * Find item by ID across all caches\n   */\n  private findItemById(itemId: string): AnyItemData | null {\n    return (\n      this.epicCache.get(itemId) ||\n      this.issueCache.get(itemId) ||\n      this.taskCache.get(itemId) ||\n      this.prCache.get(itemId) ||\n      null\n    );\n  }\n\n  /**\n   * Resolve dependency IDs to actual items\n   */\n  private resolveDependencies(dependencyIds: string[]): AnyItemData[] {\n    const dependencies: AnyItemData[] = [];\n\n    for (const depId of dependencyIds) {\n      const item = this.findItemById(depId);\n      if (item) {\n        dependencies.push(item);\n      }\n    }\n\n    return dependencies;\n  }\n\n  /**\n   * Find items that depend on the given item\n   */\n  private findDependents(itemId: string): AnyItemData[] {\n    const dependents: AnyItemData[] = [];\n\n    const allItems = [\n      ...Array.from(this.epicCache.values()),\n      ...Array.from(this.issueCache.values()),\n      ...Array.from(this.taskCache.values()),\n      ...Array.from(this.prCache.values()),\n    ];\n\n    for (const item of allItems) {\n      if (item.dependencies?.includes(itemId)) {\n        dependents.push(item);\n      }\n    }\n\n    return dependents;\n  }\n\n  /**\n   * Find circular dependencies using DFS\n   */\n  private findCircularDependencies(): string[][] {\n    const cycles: string[][] = [];\n    const visited = new Set<string>();\n    const recursionStack = new Set<string>();\n\n    const allItems = [\n      ...Array.from(this.epicCache.values()),\n      ...Array.from(this.issueCache.values()),\n      ...Array.from(this.taskCache.values()),\n      ...Array.from(this.prCache.values()),\n    ];\n\n    for (const item of allItems) {\n      const itemId = this.getItemId(item);\n      if (!visited.has(itemId)) {\n        const path: string[] = [];\n        this.dfsForCycles(itemId, visited, recursionStack, path, cycles);\n      }\n    }\n\n    return cycles;\n  }\n\n  /**\n   * DFS helper for cycle detection\n   */\n  private dfsForCycles(\n    itemId: string,\n    visited: Set<string>,\n    recursionStack: Set<string>,\n    path: string[],\n    cycles: string[][]\n  ): void {\n    visited.add(itemId);\n    recursionStack.add(itemId);\n    path.push(itemId);\n\n    const item = this.findItemById(itemId);\n    if (item?.dependencies) {\n      for (const depId of item.dependencies) {\n        if (!visited.has(depId)) {\n          this.dfsForCycles(depId, visited, recursionStack, path, cycles);\n        } else if (recursionStack.has(depId)) {\n          // Found a cycle\n          const cycleStart = path.indexOf(depId);\n          const cycle = path.slice(cycleStart).concat([depId]);\n          cycles.push(cycle);\n        }\n      }\n    }\n\n    recursionStack.delete(itemId);\n    path.pop();\n  }\n\n  /**\n   * Get appropriate ID field from any item\n   */\n  private getItemId(item: AnyItemData): string {\n    if ('epic_id' in item && !('issue_id' in item)) {\n      return item.epic_id;\n    } else if ('issue_id' in item && !('task_id' in item) && !('pr_id' in item)) {\n      return item.issue_id;\n    } else if ('task_id' in item) {\n      return item.task_id;\n    } else if ('pr_id' in item) {\n      return item.pr_id;\n    }\n    throw new Error('Unknown item type');\n  }\n\n  /**\n   * Get project overview statistics\n   */\n  public getProjectOverview(): {\n    totals: { epics: number; issues: number; tasks: number; prs: number };\n    status_breakdown: Record<string, number>;\n    priority_breakdown: Record<string, number>;\n    completion_metrics: {\n      completed_epics: number;\n      completed_issues: number;\n      completed_tasks: number;\n      completed_prs: number;\n      overall_completion: number;\n    };\n  } {\n    this.refreshCacheIfNeeded();\n\n    const allItems = [\n      ...Array.from(this.epicCache.values()),\n      ...Array.from(this.issueCache.values()),\n      ...Array.from(this.taskCache.values()),\n      ...Array.from(this.prCache.values()),\n    ];\n\n    const statusBreakdown: Record<string, number> = {};\n    const priorityBreakdown: Record<string, number> = {};\n\n    for (const item of allItems) {\n      statusBreakdown[item.status] = (statusBreakdown[item.status] || 0) + 1;\n      priorityBreakdown[item.priority] = (priorityBreakdown[item.priority] || 0) + 1;\n    }\n\n    const completedEpics = Array.from(this.epicCache.values()).filter(\n      (e) => e.status === 'completed'\n    ).length;\n    const completedIssues = Array.from(this.issueCache.values()).filter(\n      (i) => i.status === 'completed'\n    ).length;\n    const completedTasks = Array.from(this.taskCache.values()).filter(\n      (t) => t.status === 'completed'\n    ).length;\n    const completedPRs = Array.from(this.prCache.values()).filter(\n      (p) => p.status === 'completed' || p.pr_status === 'merged'\n    ).length;\n\n    const totalItems = allItems.length;\n    const completedItems = completedEpics + completedIssues + completedTasks + completedPRs;\n    const overallCompletion = totalItems > 0 ? (completedItems / totalItems) * 100 : 0;\n\n    return {\n      totals: {\n        epics: this.epicCache.size,\n        issues: this.issueCache.size,\n        tasks: this.taskCache.size,\n        prs: this.prCache.size,\n      },\n      status_breakdown: statusBreakdown,\n      priority_breakdown: priorityBreakdown,\n      completion_metrics: {\n        completed_epics: completedEpics,\n        completed_issues: completedIssues,\n        completed_tasks: completedTasks,\n        completed_prs: completedPRs,\n        overall_completion: Math.round(overallCompletion * 100) / 100,\n      },\n    };\n  }\n\n  /**\n   * Get all PRs\n   */\n  public getAllPRs(): PRData[] {\n    this.refreshCacheIfNeeded();\n    return Array.from(this.prCache.values());\n  }\n\n  /**\n   * Get all epics\n   */\n  public getAllEpics(): EpicData[] {\n    this.refreshCacheIfNeeded();\n    return Array.from(this.epicCache.values());\n  }\n\n  /**\n   * Get all issues\n   */\n  public getAllIssues(): IssueData[] {\n    this.refreshCacheIfNeeded();\n    return Array.from(this.issueCache.values());\n  }\n\n  /**\n   * Get all tasks\n   */\n  public getAllTasks(): TaskData[] {\n    this.refreshCacheIfNeeded();\n    return Array.from(this.taskCache.values());\n  }\n}\n","/**\n * AI Context Command\n * Manage AI context for items\n */\n\nimport { Command } from 'commander';\nimport type { AnyItemData, ProjectConfig } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface ContextOptions {\n  itemId?: string;\n  add?: string;\n  remove?: string;\n  list?: boolean;\n  clear?: boolean;\n  template?: boolean;\n  format?: 'table' | 'json' | 'list';\n}\n\nexport function createAiContextCommand(): Command {\n  const cmd = new Command('context');\n\n  cmd\n    .description('Manage AI context for items')\n    .option('-i, --item-id <id>', 'specific item ID to manage')\n    .option('--add <context>', 'add context entry (comma-separated for multiple)')\n    .option('--remove <context>', 'remove context entry (comma-separated for multiple)')\n    .option('-l, --list', 'list context for item or all items')\n    .option('--clear', 'clear all context for item')\n    .option('-t, --template', 'show available context templates')\n    .option('-f, --format <type>', 'output format (table|json|list)', 'table')\n    .action(async (options: ContextOptions) => {\n      try {\n        await manageContext(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to manage context: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function manageContext(options: ContextOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n  const parser = new FrontmatterParser();\n\n  // Show templates\n  if (options.template) {\n    await showContextTemplates(config);\n    return;\n  }\n\n  // List context\n  if (options.list || (!options.itemId && !options.add && !options.remove && !options.clear)) {\n    await listContext(relationshipManager, options.itemId, options.format || 'table');\n    return;\n  }\n\n  // Manage specific item context\n  if (!options.itemId) {\n    throw new Error('Item ID is required for context management operations');\n  }\n\n  await updateItemContext(relationshipManager, parser, options);\n}\n\nasync function showContextTemplates(config: ProjectConfig): Promise<void> {\n  console.log(Formatter.success('AI Context Templates'));\n  console.log('');\n\n  if (config.ai_context_templates && config.ai_context_templates.length > 0) {\n    console.log(Formatter.info('Available templates:'));\n    for (const template of config.ai_context_templates) {\n      console.log(`  • ${template}`);\n    }\n  } else {\n    console.log(Formatter.warning('No AI context templates configured.'));\n    console.log('');\n    console.log(Formatter.info('Common AI context patterns:'));\n    console.log('  • context/requirements');\n    console.log('  • context/constraints');\n    console.log('  • context/assumptions');\n    console.log('  • context/dependencies');\n    console.log('  • context/user-story');\n    console.log('  • context/technical-specs');\n    console.log('  • context/acceptance-criteria');\n  }\n}\n\nasync function listContext(\n  relationshipManager: RelationshipManager,\n  itemId?: string,\n  format: string = 'table'\n): Promise<void> {\n  if (itemId) {\n    // Show context for specific item\n    const searchResult = relationshipManager.search({ content_search: itemId });\n    const item = searchResult.items.find((item) => {\n      if (itemId.startsWith('EP-') && 'epic_id' in item) return item.epic_id === itemId;\n      if (itemId.startsWith('ISS-') && 'issue_id' in item) return item.issue_id === itemId;\n      if (itemId.startsWith('TSK-') && 'task_id' in item) return item.task_id === itemId;\n      return false;\n    });\n\n    if (!item) {\n      throw new Error(`Item not found: ${itemId}`);\n    }\n\n    console.log(Formatter.success(`AI Context for ${itemId}: ${item.title}`));\n    console.log('');\n\n    if (item.ai_context && item.ai_context.length > 0) {\n      switch (format) {\n        case 'json':\n          console.log(JSON.stringify(item.ai_context, null, 2));\n          break;\n        case 'list':\n          for (const context of item.ai_context) {\n            console.log(context);\n          }\n          break;\n        default:\n          for (let i = 0; i < item.ai_context.length; i++) {\n            console.log(`${i + 1}. ${item.ai_context[i]}`);\n          }\n      }\n    } else {\n      console.log(Formatter.info('No AI context configured for this item.'));\n    }\n  } else {\n    // Show context for all items\n    const searchResult = relationshipManager.search({});\n    const itemsWithContext = searchResult.items.filter(\n      (item) => item.ai_context && item.ai_context.length > 0\n    );\n\n    console.log(Formatter.success(`AI Context Overview`));\n    console.log('');\n\n    if (itemsWithContext.length === 0) {\n      console.log(Formatter.info('No items have AI context configured.'));\n      return;\n    }\n\n    switch (format) {\n      case 'json': {\n        const jsonData = itemsWithContext.map((item) => ({\n          id: getItemId(item),\n          title: item.title,\n          type: getItemType(item),\n          ai_context: item.ai_context,\n        }));\n        console.log(JSON.stringify(jsonData, null, 2));\n        break;\n      }\n\n      default:\n        // Table format\n        for (const item of itemsWithContext) {\n          console.log(Formatter.info(`${getItemId(item)}: ${item.title}`));\n          for (const context of item.ai_context) {\n            console.log(`  • ${context}`);\n          }\n          console.log('');\n        }\n    }\n\n    console.log(Formatter.success(`Total items with context: ${itemsWithContext.length}`));\n  }\n}\n\nasync function updateItemContext(\n  relationshipManager: RelationshipManager,\n  parser: FrontmatterParser,\n  options: ContextOptions\n): Promise<void> {\n  // Find the item\n  if (!options.itemId) {\n    console.error(Formatter.error('Item ID is required'));\n    return;\n  }\n  const searchResult = relationshipManager.search({ content_search: options.itemId });\n  const item = searchResult.items.find((item) => {\n    if (options.itemId?.startsWith('EP-') && 'epic_id' in item)\n      return item.epic_id === options.itemId;\n    if (options.itemId?.startsWith('ISS-') && 'issue_id' in item)\n      return item.issue_id === options.itemId;\n    if (options.itemId?.startsWith('TSK-') && 'task_id' in item)\n      return item.task_id === options.itemId;\n    return false;\n  });\n\n  if (!item) {\n    throw new Error(`Item not found: ${options.itemId}`);\n  }\n\n  let currentContext = [...(item.ai_context || [])];\n  let hasChanges = false;\n\n  // Clear context\n  if (options.clear) {\n    currentContext = [];\n    hasChanges = true;\n  }\n\n  // Add context\n  if (options.add) {\n    const toAdd = options.add.split(',').map((ctx) => ctx.trim());\n    for (const ctx of toAdd) {\n      if (!currentContext.includes(ctx)) {\n        currentContext.push(ctx);\n        hasChanges = true;\n      }\n    }\n  }\n\n  // Remove context\n  if (options.remove) {\n    const toRemove = options.remove.split(',').map((ctx) => ctx.trim());\n    const originalLength = currentContext.length;\n    currentContext = currentContext.filter((ctx) => !toRemove.includes(ctx));\n    hasChanges = originalLength !== currentContext.length;\n  }\n\n  if (!hasChanges) {\n    console.log(Formatter.warning('No changes to make.'));\n    return;\n  }\n\n  // Update the item\n  const updates = {\n    ai_context: currentContext.length > 0 ? currentContext : [],\n    updated_date: new Date().toISOString(),\n  };\n\n  const updatedItem = parser.updateFile(item.file_path, updates);\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`AI context updated successfully!`));\n  console.log(Formatter.info(`Item: ${options.itemId} - ${item.title}`));\n  console.log('');\n  console.log(Formatter.success('Current AI context:'));\n\n  if (updatedItem.ai_context && updatedItem.ai_context.length > 0) {\n    for (let i = 0; i < updatedItem.ai_context.length; i++) {\n      console.log(`${i + 1}. ${updatedItem.ai_context[i]}`);\n    }\n  } else {\n    console.log(Formatter.info('(No AI context configured)'));\n  }\n}\n\nfunction getItemId(item: AnyItemData): string {\n  if (item.epic_id && !item.issue_id && !item.task_id) return item.epic_id;\n  if (item.issue_id && !item.task_id) return item.issue_id;\n  if (item.task_id) return item.task_id;\n  return 'UNKNOWN';\n}\n\nfunction getItemType(item: AnyItemData): string {\n  if (item.epic_id && !item.issue_id && !item.task_id) return 'epic';\n  if (item.issue_id && !item.task_id) return 'issue';\n  if (item.task_id) return 'task';\n  return 'unknown';\n}\n","/**\n * AI Generate LLMs.txt Command\n * Generates llms.txt file from project structure\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { EpicData, IssueData, ProjectConfig, TaskData } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface GenerateOptions {\n  output?: string;\n  includeContent?: boolean;\n  includeCompleted?: boolean;\n  format?: 'standard' | 'detailed' | 'summary';\n  dryRun?: boolean;\n}\n\ninterface ProjectOverview {\n  totals: {\n    epics: number;\n    issues: number;\n    tasks: number;\n  };\n  completion_metrics: {\n    overall_completion: number;\n  };\n  status_breakdown: Record<string, number>;\n  priority_breakdown: Record<string, number>;\n}\n\nexport function createAiGenerateLlmsCommand(): Command {\n  const cmd = new Command('generate-llms-txt');\n\n  cmd\n    .description('Generate llms.txt file from project structure')\n    .option('-o, --output <path>', 'output file path', 'llms.txt')\n    .option('--include-content', 'include full content in output')\n    .option('--include-completed', 'include completed items')\n    .option('-f, --format <type>', 'output format (standard|detailed|summary)', 'standard')\n    .option('--dry-run', 'show what would be generated without creating file')\n    .action(async (options: GenerateOptions) => {\n      try {\n        await generateLlmsTxt(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to generate llms.txt: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function generateLlmsTxt(options: GenerateOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get project overview\n  const overview = relationshipManager.getProjectOverview();\n\n  // Get all items\n  const searchResult = relationshipManager.search({});\n  const allItems = searchResult.items;\n\n  // Filter items based on options\n  let filteredItems = allItems;\n  if (!options.includeCompleted) {\n    filteredItems = allItems.filter((item) => item.status !== 'completed');\n  }\n\n  // Separate by type\n  const epics = filteredItems.filter((item) => 'epic_id' in item && !('issue_id' in item));\n  const issues = filteredItems.filter((item) => 'issue_id' in item && !('task_id' in item));\n  const tasks = filteredItems.filter((item) => 'task_id' in item);\n\n  // Generate content based on format\n  let content = '';\n\n  switch (options.format) {\n    case 'summary':\n      content = generateSummaryFormat(config, overview, epics, issues, tasks);\n      break;\n    case 'detailed':\n      content = generateDetailedFormat(\n        config,\n        overview,\n        epics,\n        issues,\n        tasks,\n        options.includeContent\n      );\n      break;\n    default:\n      content = generateStandardFormat(config, overview, epics, issues, tasks);\n  }\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - Generated llms.txt content:'));\n    console.log('');\n    console.log(content);\n    console.log('');\n    console.log(Formatter.info(`Content length: ${content.length} characters`));\n    return;\n  }\n\n  // Write to file\n  const outputPath = path.resolve(options.output || 'llms.txt');\n  fs.writeFileSync(outputPath, content, 'utf8');\n\n  console.log(Formatter.success(`llms.txt generated successfully!`));\n  console.log(Formatter.info(`Output: ${outputPath}`));\n  console.log(Formatter.info(`Format: ${options.format || 'standard'}`));\n  console.log(Formatter.info(`Content length: ${content.length} characters`));\n  console.log(Formatter.info(`Items included: ${filteredItems.length} total`));\n  console.log(`  • Epics: ${epics.length}`);\n  console.log(`  • Issues: ${issues.length}`);\n  console.log(`  • Tasks: ${tasks.length}`);\n}\n\nfunction generateSummaryFormat(\n  config: ProjectConfig,\n  overview: ProjectOverview,\n  epics: EpicData[],\n  issues: IssueData[],\n  tasks: TaskData[]\n): string {\n  return `# ${config.name} - Project Summary\n\n## Overview\n- **Total Items**: ${overview.totals.epics + overview.totals.issues + overview.totals.tasks}\n- **Completion Rate**: ${overview.completion_metrics.overall_completion}%\n- **Generated**: ${new Date().toISOString()}\n\n## Status Breakdown\n${Object.entries(overview.status_breakdown)\n  .map(([status, count]) => `- **${status.charAt(0).toUpperCase() + status.slice(1)}**: ${count}`)\n  .join('\\n')}\n\n## Priority Breakdown\n${Object.entries(overview.priority_breakdown)\n  .map(\n    ([priority, count]) => `- **${priority.charAt(0).toUpperCase() + priority.slice(1)}**: ${count}`\n  )\n  .join('\\n')}\n\n## Active Items\n\n### Epics (${epics.length})\n${epics.map((epic) => `- ${epic.epic_id}: ${epic.title} [${epic.status}]`).join('\\n')}\n\n### Issues (${issues.length})\n${issues.map((issue) => `- ${issue.issue_id}: ${issue.title} [${issue.status}]`).join('\\n')}\n\n### Tasks (${tasks.length})\n${tasks.map((task) => `- ${task.task_id}: ${task.title} [${task.status}]`).join('\\n')}\n`;\n}\n\nfunction generateStandardFormat(\n  config: ProjectConfig,\n  overview: ProjectOverview,\n  epics: EpicData[],\n  issues: IssueData[],\n  tasks: TaskData[]\n): string {\n  let content = `# ${config.name} - AI Project Context\n\n> Generated on ${new Date().toISOString()}\n> AI-Trackdown project management system\n\n## Project Statistics\n- **Epics**: ${epics.length} active\n- **Issues**: ${issues.length} active  \n- **Tasks**: ${tasks.length} active\n- **Overall Completion**: ${overview.completion_metrics.overall_completion}%\n\n## Project Structure\n\n`;\n\n  // Group issues by epic\n  const issuesByEpic = issues.reduce(\n    (acc, issue) => {\n      if (!acc[issue.epic_id]) acc[issue.epic_id] = [];\n      acc[issue.epic_id].push(issue);\n      return acc;\n    },\n    {} as Record<string, IssueData[]>\n  );\n\n  // Group tasks by issue\n  const tasksByIssue = tasks.reduce(\n    (acc, task) => {\n      if (!acc[task.issue_id]) acc[task.issue_id] = [];\n      acc[task.issue_id].push(task);\n      return acc;\n    },\n    {} as Record<string, TaskData[]>\n  );\n\n  for (const epic of epics) {\n    content += `### ${epic.epic_id}: ${epic.title}\\n`;\n    content += `**Status**: ${epic.status} | **Priority**: ${epic.priority} | **Assignee**: ${epic.assignee}\\n`;\n    if (epic.description) {\n      content += `**Description**: ${epic.description}\\n`;\n    }\n    content += '\\n';\n\n    const epicIssues = issuesByEpic[epic.epic_id] || [];\n    for (const issue of epicIssues) {\n      content += `#### ${issue.issue_id}: ${issue.title}\\n`;\n      content += `**Status**: ${issue.status} | **Priority**: ${issue.priority} | **Assignee**: ${issue.assignee}\\n`;\n      if (issue.description) {\n        content += `**Description**: ${issue.description}\\n`;\n      }\n      content += '\\n';\n\n      const issueTasks = tasksByIssue[issue.issue_id] || [];\n      if (issueTasks.length > 0) {\n        content += `**Tasks**:\\n`;\n        for (const task of issueTasks) {\n          content += `- ${task.task_id}: ${task.title} [${task.status}]\\n`;\n        }\n        content += '\\n';\n      }\n    }\n  }\n\n  return content;\n}\n\nfunction generateDetailedFormat(\n  config: ProjectConfig,\n  overview: ProjectOverview,\n  epics: EpicData[],\n  issues: IssueData[],\n  tasks: TaskData[],\n  includeContent: boolean = false\n): string {\n  let content = generateStandardFormat(config, overview, epics, issues, tasks);\n\n  if (includeContent) {\n    content += '\\n## Detailed Content\\n\\n';\n\n    for (const epic of epics) {\n      content += `### ${epic.epic_id} Content\\n`;\n      content += '```markdown\\n';\n      content += epic.content || '(No content)';\n      content += '\\n```\\n\\n';\n    }\n\n    for (const issue of issues) {\n      content += `### ${issue.issue_id} Content\\n`;\n      content += '```markdown\\n';\n      content += issue.content || '(No content)';\n      content += '\\n```\\n\\n';\n    }\n\n    for (const task of tasks) {\n      content += `### ${task.task_id} Content\\n`;\n      content += '```markdown\\n';\n      content += task.content || '(No content)';\n      content += '\\n```\\n\\n';\n    }\n  }\n\n  // Add AI context information\n  content += '\\n## AI Context Templates\\n\\n';\n  if (config.ai_context_templates && config.ai_context_templates.length > 0) {\n    for (const template of config.ai_context_templates) {\n      content += `- ${template}\\n`;\n    }\n  } else {\n    content += 'No AI context templates configured.\\n';\n  }\n\n  // Add token usage summary\n  content += '\\n## Token Usage Summary\\n\\n';\n  const totalEstimated = [...epics, ...issues, ...tasks].reduce(\n    (sum, item) => sum + (item.estimated_tokens || 0),\n    0\n  );\n  const totalActual = [...epics, ...issues, ...tasks].reduce(\n    (sum, item) => sum + (item.actual_tokens || 0),\n    0\n  );\n\n  content += `- **Total Estimated Tokens**: ${totalEstimated}\\n`;\n  content += `- **Total Actual Tokens**: ${totalActual}\\n`;\n  if (totalEstimated > 0) {\n    content += `- **Token Efficiency**: ${((totalActual / totalEstimated) * 100).toFixed(1)}%\\n`;\n  }\n\n  return content;\n}\n","/**\n * AI Track Tokens Command\n * Track and update token usage across items\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface TrackOptions {\n  itemId?: string;\n  type?: 'epic' | 'issue' | 'task';\n  estimated?: number;\n  actual?: number;\n  operation?: 'add' | 'set';\n  report?: boolean;\n  format?: 'table' | 'json' | 'summary';\n}\n\nexport function createAiTrackTokensCommand(): Command {\n  const cmd = new Command('track-tokens');\n\n  cmd\n    .description('Track and update token usage across items')\n    .option('-i, --item-id <id>', 'specific item ID to update')\n    .option('-t, --type <type>', 'item type filter (epic|issue|task)')\n    .option('-e, --estimated <number>', 'set estimated tokens')\n    .option('-a, --actual <number>', 'set actual tokens')\n    .option('-o, --operation <op>', 'operation (add|set)', 'set')\n    .option('-r, --report', 'show token usage report')\n    .option('-f, --format <type>', 'output format (table|json|summary)', 'table')\n    .action(async (options: TrackOptions) => {\n      try {\n        await trackTokens(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to track tokens: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function trackTokens(options: TrackOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n  const parser = new FrontmatterParser();\n\n  // If just showing report\n  if (options.report || (!options.itemId && !options.estimated && !options.actual)) {\n    await showTokenReport(relationshipManager, options.format || 'table', options.type);\n    return;\n  }\n\n  // If updating specific item\n  if (options.itemId) {\n    await updateItemTokens(relationshipManager, parser, options);\n    return;\n  }\n\n  throw new Error('Must specify either --item-id for updates or --report for viewing usage');\n}\n\nasync function updateItemTokens(\n  relationshipManager: RelationshipManager,\n  parser: FrontmatterParser,\n  options: TrackOptions\n): Promise<void> {\n  // Find the item\n  const searchResult = relationshipManager.search({ content_search: options.itemId! });\n  const item = searchResult.items.find((item) => {\n    if (options.itemId?.startsWith('EP-') && 'epic_id' in item)\n      return item.epic_id === options.itemId;\n    if (options.itemId?.startsWith('ISS-') && 'issue_id' in item)\n      return item.issue_id === options.itemId;\n    if (options.itemId?.startsWith('TSK-') && 'task_id' in item)\n      return item.task_id === options.itemId;\n    return false;\n  });\n\n  if (!item) {\n    throw new Error(`Item not found: ${options.itemId}`);\n  }\n\n  // Prepare updates\n  const updates: any = {\n    updated_date: new Date().toISOString(),\n  };\n\n  if (options.estimated !== undefined) {\n    if (options.operation === 'add') {\n      updates.estimated_tokens = (item.estimated_tokens || 0) + options.estimated;\n    } else {\n      updates.estimated_tokens = options.estimated;\n    }\n  }\n\n  if (options.actual !== undefined) {\n    if (options.operation === 'add') {\n      updates.actual_tokens = (item.actual_tokens || 0) + options.actual;\n    } else {\n      updates.actual_tokens = options.actual;\n    }\n  }\n\n  // Update the item\n  const updatedItem = parser.updateFile(item.file_path, updates);\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`Token usage updated successfully!`));\n  console.log(Formatter.info(`Item: ${options.itemId} - ${item.title}`));\n  console.log(\n    Formatter.info(\n      `Estimated Tokens: ${item.estimated_tokens || 0} → ${updatedItem.estimated_tokens || 0}`\n    )\n  );\n  console.log(\n    Formatter.info(`Actual Tokens: ${item.actual_tokens || 0} → ${updatedItem.actual_tokens || 0}`)\n  );\n\n  if (updatedItem.estimated_tokens > 0) {\n    const efficiency = (updatedItem.actual_tokens || 0) / updatedItem.estimated_tokens;\n    const efficiencyDisplay =\n      efficiency <= 1\n        ? Formatter.success(`${(efficiency * 100).toFixed(1)}%`)\n        : Formatter.warning(`${(efficiency * 100).toFixed(1)}%`);\n    console.log(Formatter.info(`Token Efficiency: ${efficiencyDisplay}`));\n  }\n}\n\nasync function showTokenReport(\n  relationshipManager: RelationshipManager,\n  format: string,\n  typeFilter?: string\n): Promise<void> {\n  // Get all items\n  const searchResult = relationshipManager.search({});\n  let items = searchResult.items;\n\n  // Apply type filter\n  if (typeFilter) {\n    items = items.filter((item) => {\n      switch (typeFilter) {\n        case 'epic':\n          return 'epic_id' in item && !('issue_id' in item);\n        case 'issue':\n          return 'issue_id' in item && !('task_id' in item);\n        case 'task':\n          return 'task_id' in item;\n        default:\n          return true;\n      }\n    });\n  }\n\n  // Calculate totals\n  const totalEstimated = items.reduce((sum, item) => sum + (item.estimated_tokens || 0), 0);\n  const totalActual = items.reduce((sum, item) => sum + (item.actual_tokens || 0), 0);\n  const overallEfficiency = totalEstimated > 0 ? (totalActual / totalEstimated) * 100 : 0;\n\n  // Show report based on format\n  switch (format) {\n    case 'json': {\n      const jsonReport = {\n        summary: {\n          total_items: items.length,\n          total_estimated: totalEstimated,\n          total_actual: totalActual,\n          efficiency_percentage: overallEfficiency,\n        },\n        items: items.map((item) => ({\n          id: getItemId(item),\n          title: item.title,\n          type: getItemType(item),\n          status: item.status,\n          estimated_tokens: item.estimated_tokens || 0,\n          actual_tokens: item.actual_tokens || 0,\n          efficiency:\n            item.estimated_tokens > 0\n              ? ((item.actual_tokens || 0) / item.estimated_tokens) * 100\n              : 0,\n        })),\n      };\n      console.log(JSON.stringify(jsonReport, null, 2));\n      break;\n    }\n\n    case 'summary': {\n      console.log(Formatter.success('Token Usage Summary'));\n      console.log('');\n      console.log(`Total Items: ${items.length}`);\n      console.log(`Total Estimated Tokens: ${totalEstimated}`);\n      console.log(`Total Actual Tokens: ${totalActual}`);\n      console.log(`Overall Efficiency: ${overallEfficiency.toFixed(1)}%`);\n      console.log('');\n\n      // Group by type\n      const byType = items.reduce(\n        (acc, item) => {\n          const type = getItemType(item);\n          if (!acc[type]) acc[type] = [];\n          acc[type].push(item);\n          return acc;\n        },\n        {} as Record<string, any[]>\n      );\n\n      for (const [type, typeItems] of Object.entries(byType)) {\n        const typeEstimated = typeItems.reduce(\n          (sum, item) => sum + (item.estimated_tokens || 0),\n          0\n        );\n        const typeActual = typeItems.reduce((sum, item) => sum + (item.actual_tokens || 0), 0);\n        const typeEfficiency = typeEstimated > 0 ? (typeActual / typeEstimated) * 100 : 0;\n\n        console.log(`${type.charAt(0).toUpperCase() + type.slice(1)}s:`);\n        console.log(`  Count: ${typeItems.length}`);\n        console.log(`  Estimated: ${typeEstimated}`);\n        console.log(`  Actual: ${typeActual}`);\n        console.log(`  Efficiency: ${typeEfficiency.toFixed(1)}%`);\n        console.log('');\n      }\n      break;\n    }\n\n    default: {\n      // Table format\n      console.log(Formatter.success('Token Usage Report'));\n      console.log('');\n\n      if (items.length === 0) {\n        console.log(Formatter.info('No items found.'));\n        return;\n      }\n\n      // Table headers\n      const headers = ['ID', 'Title', 'Type', 'Status', 'Estimated', 'Actual', 'Efficiency'];\n      const colWidths = [12, 40, 8, 10, 10, 10, 10];\n\n      // Print header\n      printTableRow(headers, colWidths, true);\n      printSeparator(colWidths);\n\n      // Print items\n      for (const item of items) {\n        const efficiency =\n          item.estimated_tokens > 0\n            ? `${(((item.actual_tokens || 0) / item.estimated_tokens) * 100).toFixed(1)}%`\n            : 'N/A';\n\n        const row = [\n          getItemId(item),\n          truncateText(item.title, 38),\n          getItemType(item).toUpperCase(),\n          item.status.toUpperCase(),\n          (item.estimated_tokens || 0).toString(),\n          (item.actual_tokens || 0).toString(),\n          efficiency,\n        ];\n\n        printTableRow(row, colWidths, false);\n      }\n\n      // Print summary\n      console.log('');\n      console.log(Formatter.success('Summary:'));\n      console.log(`Total Items: ${items.length}`);\n      console.log(`Total Estimated: ${totalEstimated}`);\n      console.log(`Total Actual: ${totalActual}`);\n      console.log(`Overall Efficiency: ${overallEfficiency.toFixed(1)}%`);\n    }\n  }\n}\n\nfunction getItemId(item: any): string {\n  if (item.epic_id && !item.issue_id && !item.task_id) return item.epic_id;\n  if (item.issue_id && !item.task_id) return item.issue_id;\n  if (item.task_id) return item.task_id;\n  return 'UNKNOWN';\n}\n\nfunction getItemType(item: any): string {\n  if (item.epic_id && !item.issue_id && !item.task_id) return 'epic';\n  if (item.issue_id && !item.task_id) return 'issue';\n  if (item.task_id) return 'task';\n  return 'unknown';\n}\n\nfunction printTableRow(row: string[], widths: number[], isHeader: boolean): void {\n  const paddedRow = row.map((cell, i) => cell.padEnd(widths[i]));\n  const rowText = paddedRow.join(' | ');\n\n  if (isHeader) {\n    console.log(Formatter.info(rowText));\n  } else {\n    console.log(rowText);\n  }\n}\n\nfunction printSeparator(widths: number[]): void {\n  const separator = widths.map((width) => '-'.repeat(width)).join('-+-');\n  console.log(separator);\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n  if (text.length <= maxLength) return text;\n  return `${text.substring(0, maxLength - 3)}...`;\n}\n","/**\n * AI Command Group for AI-Trackdown\n * AI-specific functionality for token tracking and context management\n */\n\nimport { Command } from 'commander';\nimport { createAiContextCommand } from './ai/context.js';\nimport { createAiGenerateLlmsCommand } from './ai/generate-llms-txt.js';\nimport { createAiTrackTokensCommand } from './ai/track-tokens.js';\n\nexport function createAiCommand(): Command {\n  const cmd = new Command('ai');\n\n  cmd\n    .description('AI-specific functionality for token tracking and context management')\n    .addCommand(createAiGenerateLlmsCommand())\n    .addCommand(createAiTrackTokensCommand())\n    .addCommand(createAiContextCommand());\n\n  return cmd;\n}\n","/**\n * Backlog Command\n * Provides comprehensive backlog reading functionality\n */\n\nimport { Command } from 'commander';\nimport type { EpicData, IssueData, TaskData } from '../types/ai-trackdown.js';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { FrontmatterParser } from '../utils/frontmatter-parser.js';\nimport type { UnifiedPaths } from '../utils/unified-path-resolver.js';\n\ninterface BacklogOptions {\n  epic?: string;\n  status?: string;\n  format?: 'table' | 'json' | 'markdown';\n  full?: boolean;\n  withIssues?: boolean;\n  withTasks?: boolean;\n}\n\nexport function createBacklogCommand(): Command {\n  const cmd = new Command('backlog');\n\n  cmd\n    .description('Show comprehensive project backlog')\n    .option('--epic <epic-id>', 'filter by specific epic')\n    .option('--status <status>', 'filter by status (planning, active, completed, archived)')\n    .option('--format <format>', 'output format (table, json, markdown)', 'table')\n    .option('--full', 'show full backlog with all details')\n    .option('--with-issues', 'include issues in epic display')\n    .option('--with-tasks', 'include tasks in issue display')\n    .action(async (options: BacklogOptions) => {\n      try {\n        await showBacklog(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to show backlog: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function showBacklog(options: BacklogOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const parser = new FrontmatterParser();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n\n  console.log(Formatter.info('📋 Project Backlog'));\n  console.log('='.repeat(50));\n\n  try {\n    // Parse all epics\n    const epics = parser.parseDirectory(paths.epicsDir, 'epic') as EpicData[];\n\n    if (epics.length === 0) {\n      console.log(Formatter.warning('No epics found in project'));\n      return;\n    }\n\n    // Filter epics by options\n    let filteredEpics = epics;\n\n    if (options.epic) {\n      filteredEpics = epics.filter((epic) => epic.epic_id === options.epic);\n    }\n\n    if (options.status) {\n      filteredEpics = epics.filter((epic) => epic.status === options.status);\n    }\n\n    if (options.format === 'json') {\n      console.log(JSON.stringify(filteredEpics, null, 2));\n      return;\n    }\n\n    // Display epics\n    for (const epic of filteredEpics) {\n      await displayEpic(epic, parser, paths, options);\n    }\n\n    // Summary\n    console.log('');\n    console.log(Formatter.info(`📊 Summary: ${filteredEpics.length} epic(s)`));\n    console.log(Formatter.success('✅ Backlog display complete'));\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Error reading backlog: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n  }\n}\n\nasync function displayEpic(\n  epic: EpicData,\n  parser: FrontmatterParser,\n  paths: UnifiedPaths,\n  options: BacklogOptions\n): Promise<void> {\n  console.log('');\n  console.log(Formatter.success(`🎯 ${epic.epic_id}: ${epic.title}`));\n  console.log(\n    Formatter.info(\n      `   Status: ${epic.status} | Priority: ${epic.priority} | Assignee: ${epic.assignee}`\n    )\n  );\n  console.log(Formatter.debug(`   Created: ${epic.created_date} | Updated: ${epic.updated_date}`));\n\n  if (epic.description && options.full) {\n    console.log(Formatter.debug(`   Description: ${epic.description}`));\n  }\n\n  if (epic.tags && epic.tags.length > 0) {\n    console.log(Formatter.debug(`   Tags: ${epic.tags.join(', ')}`));\n  }\n\n  // Show issues if requested\n  if (options.withIssues) {\n    try {\n      const allIssues = parser.parseDirectory(paths.issuesDir, 'issue') as IssueData[];\n      const epicIssues = allIssues.filter((issue) => issue.epic_id === epic.epic_id);\n\n      if (epicIssues.length > 0) {\n        console.log(Formatter.info(`   📋 Issues (${epicIssues.length}):`));\n        for (const issue of epicIssues) {\n          console.log(\n            Formatter.debug(`     • ${issue.issue_id}: ${issue.title} [${issue.status}]`)\n          );\n\n          // Show tasks if requested\n          if (options.withTasks) {\n            try {\n              const allTasks = parser.parseDirectory(paths.tasksDir, 'task') as TaskData[];\n              const issueTasks = allTasks.filter((task) => task.issue_id === issue.issue_id);\n\n              if (issueTasks.length > 0) {\n                for (const task of issueTasks) {\n                  console.log(\n                    Formatter.debug(`       - ${task.task_id}: ${task.title} [${task.status}]`)\n                  );\n                }\n              }\n            } catch (taskError) {\n              console.log(Formatter.warning(`       Error reading tasks: ${taskError}`));\n            }\n          }\n        }\n      }\n    } catch (issueError) {\n      console.log(Formatter.warning(`   Error reading issues: ${issueError}`));\n    }\n  }\n}\n","/**\n * Project Detection System for AI-Trackdown CLI\n * Automatically determines whether to operate in single-project or multi-project mode\n * and resolves paths accordingly.\n */\n\nimport { existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ConfigManager } from './config-manager.js';\n\nexport type ProjectMode = 'single' | 'multi';\n\nexport interface ProjectDetectionResult {\n  mode: ProjectMode;\n  projectRoot: string;\n  projectsDir?: string;\n  detectedProjects?: string[];\n  migrationNeeded: boolean;\n  recommendations: string[];\n}\n\nexport interface ProjectContext {\n  mode: ProjectMode;\n  projectRoot: string;\n  projectsDir?: string;\n  currentProject?: string;\n  availableProjects: string[];\n}\n\n/**\n * ProjectDetector class handles automatic detection of project structure\n * and determines whether to operate in single-project or multi-project mode.\n */\nexport class ProjectDetector {\n  private projectRoot: string;\n  private configManager?: ConfigManager;\n  private modeOverride?: ProjectMode;\n\n  constructor(\n    projectRoot: string = process.cwd(),\n    configManager?: ConfigManager,\n    modeOverride?: ProjectMode\n  ) {\n    this.projectRoot = projectRoot;\n    this.configManager = configManager;\n    this.modeOverride = modeOverride;\n  }\n\n  /**\n   * Detect project mode based on directory structure and configuration\n   */\n  detectProjectMode(): ProjectDetectionResult {\n    // Check for explicit mode override\n    if (this.modeOverride) {\n      return this.buildDetectionResult(this.modeOverride);\n    }\n\n    // Check environment variable override\n    const envMode = this.getEnvironmentMode();\n    if (envMode) {\n      return this.buildDetectionResult(envMode);\n    }\n\n    // Check configuration file override\n    const configMode = this.getConfigurationMode();\n    if (configMode) {\n      return this.buildDetectionResult(configMode);\n    }\n\n    // Auto-detect based on directory structure\n    return this.autoDetectMode();\n  }\n\n  /**\n   * Get environment variable mode override\n   */\n  private getEnvironmentMode(): ProjectMode | null {\n    const envMode = process.env.AITRACKDOWN_PROJECT_MODE;\n    if (envMode === 'single' || envMode === 'multi') {\n      return envMode;\n    }\n    return null;\n  }\n\n  /**\n   * Get configuration file mode override\n   */\n  private getConfigurationMode(): ProjectMode | null {\n    if (!this.configManager) {\n      return null;\n    }\n\n    try {\n      const config = this.configManager.getConfig();\n      // Check for project_mode in config\n      if (\n        'project_mode' in config &&\n        (config.project_mode === 'single' || config.project_mode === 'multi')\n      ) {\n        return config.project_mode as ProjectMode;\n      }\n    } catch (_error) {\n      // Config not found or invalid - continue with auto-detection\n    }\n\n    return null;\n  }\n\n  /**\n   * Auto-detect project mode based on directory structure\n   */\n  private autoDetectMode(): ProjectDetectionResult {\n    const indicators = this.scanDirectoryIndicators();\n\n    // Multi-project indicators (in order of priority):\n    // 1. projects/ directory exists\n    // 2. PRJ-XXXX files exist in root\n    // 3. Multiple .ai-trackdown directories in subdirectories\n\n    if (indicators.hasProjectsDirectory) {\n      return this.buildDetectionResult('multi', {\n        projectsDir: join(this.projectRoot, 'projects'),\n        detectedProjects: indicators.projectsInDirectory,\n        migrationNeeded: false,\n        recommendations: indicators.multiProjectRecommendations,\n      });\n    }\n\n    if (indicators.hasPRJFiles) {\n      return this.buildDetectionResult('multi', {\n        detectedProjects: indicators.prjFileProjects,\n        migrationNeeded: true,\n        recommendations: indicators.migrationRecommendations,\n      });\n    }\n\n    if (indicators.hasMultipleAITrackdownDirs) {\n      return this.buildDetectionResult('multi', {\n        detectedProjects: indicators.aiTrackdownProjects,\n        migrationNeeded: true,\n        recommendations: indicators.consolidationRecommendations,\n      });\n    }\n\n    // Default to single-project mode\n    return this.buildDetectionResult('single', {\n      migrationNeeded: indicators.hasLegacyStructure,\n      recommendations: indicators.singleProjectRecommendations,\n    });\n  }\n\n  /**\n   * Scan directory for project mode indicators\n   */\n  private scanDirectoryIndicators() {\n    const indicators = {\n      hasProjectsDirectory: false,\n      projectsInDirectory: [] as string[],\n      hasPRJFiles: false,\n      prjFileProjects: [] as string[],\n      hasMultipleAITrackdownDirs: false,\n      aiTrackdownProjects: [] as string[],\n      hasLegacyStructure: false,\n      multiProjectRecommendations: [] as string[],\n      migrationRecommendations: [] as string[],\n      consolidationRecommendations: [] as string[],\n      singleProjectRecommendations: [] as string[],\n    };\n\n    try {\n      const entries = readdirSync(this.projectRoot, { withFileTypes: true });\n\n      // Check for projects/ directory\n      const projectsDir = entries.find((entry) => entry.isDirectory() && entry.name === 'projects');\n      if (projectsDir) {\n        indicators.hasProjectsDirectory = true;\n        const projectsPath = join(this.projectRoot, 'projects');\n        try {\n          const projectEntries = readdirSync(projectsPath, { withFileTypes: true });\n          indicators.projectsInDirectory = projectEntries\n            .filter((entry) => entry.isDirectory())\n            .map((entry) => entry.name);\n        } catch (_error) {\n          // projects directory not readable\n        }\n      }\n\n      // Check for PRJ-XXXX files\n      const prjFiles = entries.filter(\n        (entry) => entry.isFile() && /^PRJ-\\d{4}.*\\.md$/.test(entry.name)\n      );\n      if (prjFiles.length > 0) {\n        indicators.hasPRJFiles = true;\n        indicators.prjFileProjects = prjFiles.map((file) => file.name);\n        indicators.migrationRecommendations.push(\n          'Detected PRJ-XXXX files in root directory',\n          'Consider creating projects/ directory structure:',\n          'mkdir -p projects/',\n          ...prjFiles.map((file) => `mkdir -p projects/${file.name.replace(/\\.md$/, '')}/`)\n        );\n      }\n\n      // Check for multiple .ai-trackdown directories\n      const subdirs = entries.filter((entry) => entry.isDirectory() && entry.name !== 'projects');\n      let aiTrackdownCount = 0;\n\n      for (const subdir of subdirs) {\n        const aiTrackdownPath = join(this.projectRoot, subdir.name, '.ai-trackdown');\n        if (existsSync(aiTrackdownPath)) {\n          aiTrackdownCount++;\n          indicators.aiTrackdownProjects.push(subdir.name);\n        }\n      }\n\n      if (aiTrackdownCount > 1) {\n        indicators.hasMultipleAITrackdownDirs = true;\n        indicators.consolidationRecommendations.push(\n          'Multiple .ai-trackdown directories detected',\n          'Consider consolidating into multi-project structure:',\n          'mkdir -p projects/',\n          ...indicators.aiTrackdownProjects.map((proj) => `mv ${proj} projects/${proj}/`)\n        );\n      }\n\n      // Check for legacy structure indicators\n      const legacyDirs = ['trackdown', 'epics', 'issues', 'tasks'].filter((dir) =>\n        entries.some((entry) => entry.isDirectory() && entry.name === dir)\n      );\n\n      if (legacyDirs.length > 0) {\n        indicators.hasLegacyStructure = true;\n        indicators.singleProjectRecommendations.push(\n          'Legacy directory structure detected',\n          'Consider running migration:',\n          'aitrackdown migrate-structure --from-legacy'\n        );\n      }\n    } catch (_error) {\n      // Directory not readable - continue with defaults\n    }\n\n    return indicators;\n  }\n\n  /**\n   * Build detection result with common fields\n   */\n  private buildDetectionResult(\n    mode: ProjectMode,\n    options: Partial<ProjectDetectionResult> = {}\n  ): ProjectDetectionResult {\n    return {\n      mode,\n      projectRoot: this.projectRoot,\n      projectsDir: options.projectsDir,\n      detectedProjects: options.detectedProjects || [],\n      migrationNeeded: options.migrationNeeded || false,\n      recommendations: options.recommendations || [],\n      ...options,\n    };\n  }\n\n  /**\n   * Get project context for CLI operations\n   */\n  getProjectContext(projectName?: string): ProjectContext {\n    const detection = this.detectProjectMode();\n\n    const context: ProjectContext = {\n      mode: detection.mode,\n      projectRoot: detection.projectRoot,\n      projectsDir: detection.projectsDir,\n      availableProjects: detection.detectedProjects || [],\n    };\n\n    if (detection.mode === 'multi') {\n      if (projectName) {\n        // Validate project exists\n        if (context.availableProjects.includes(projectName)) {\n          context.currentProject = projectName;\n        } else {\n          throw new Error(\n            `Project '${projectName}' not found. Available projects: ${context.availableProjects.join(', ')}`\n          );\n        }\n      } else if (context.availableProjects.length === 1) {\n        // Auto-select single project\n        context.currentProject = context.availableProjects[0];\n      }\n    }\n\n    return context;\n  }\n\n  /**\n   * List available projects in multi-project mode\n   */\n  listAvailableProjects(): string[] {\n    const detection = this.detectProjectMode();\n\n    if (detection.mode === 'single') {\n      return [];\n    }\n\n    return detection.detectedProjects || [];\n  }\n\n  /**\n   * Check if project exists in multi-project mode\n   */\n  projectExists(projectName: string): boolean {\n    const detection = this.detectProjectMode();\n\n    if (detection.mode === 'single') {\n      return false;\n    }\n\n    return (detection.detectedProjects || []).includes(projectName);\n  }\n\n  /**\n   * Get project directory path\n   */\n  getProjectPath(projectName?: string): string {\n    const detection = this.detectProjectMode();\n\n    if (detection.mode === 'single') {\n      return this.projectRoot;\n    }\n\n    if (!projectName) {\n      throw new Error('Project name required in multi-project mode');\n    }\n\n    if (!this.projectExists(projectName)) {\n      throw new Error(`Project '${projectName}' not found`);\n    }\n\n    return join(detection.projectsDir || join(this.projectRoot, 'projects'), projectName);\n  }\n\n  /**\n   * Create new project in multi-project mode\n   */\n  createProject(projectName: string): string {\n    const detection = this.detectProjectMode();\n\n    if (detection.mode === 'single') {\n      throw new Error('Cannot create project in single-project mode');\n    }\n\n    const projectsDir = detection.projectsDir || join(this.projectRoot, 'projects');\n    const projectPath = join(projectsDir, projectName);\n\n    if (existsSync(projectPath)) {\n      throw new Error(`Project '${projectName}' already exists`);\n    }\n\n    return projectPath;\n  }\n\n  /**\n   * Set mode override for testing or explicit control\n   */\n  setModeOverride(mode: ProjectMode | undefined): void {\n    this.modeOverride = mode;\n  }\n\n  /**\n   * Show detection results and recommendations\n   */\n  showDetectionInfo(): void {\n    const detection = this.detectProjectMode();\n\n    console.log(`\\n🔍 AI-Trackdown Project Detection`);\n    console.log(`Mode: ${detection.mode.toUpperCase()}`);\n    console.log(`Root: ${detection.projectRoot}`);\n\n    if (detection.mode === 'multi') {\n      console.log(`Projects Directory: ${detection.projectsDir || 'Not set'}`);\n      if (detection.detectedProjects && detection.detectedProjects.length > 0) {\n        console.log(`Available Projects: ${detection.detectedProjects.join(', ')}`);\n      }\n    }\n\n    if (detection.migrationNeeded) {\n      console.log(`\\n⚠️  Migration needed`);\n    }\n\n    if (detection.recommendations.length > 0) {\n      console.log(`\\n📋 Recommendations:`);\n      detection.recommendations.forEach((rec) => console.log(`   ${rec}`));\n    }\n  }\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ConfigManager } from './config.js';\nimport { type ProjectContext, ProjectDetector, type ProjectMode } from './project-detector.js';\n\n/**\n * PathResolver provides configurable directory path resolution\n * with support for both single-project and multi-project modes\n * Priority: CLI option > Environment variable > Config file > Auto-detection > Default\n */\nexport class PathResolver {\n  private configManager: ConfigManager;\n  private cliRootDir?: string;\n  private projectDetector: ProjectDetector;\n  private projectContext?: ProjectContext;\n  private modeOverride?: ProjectMode;\n\n  constructor(\n    configManager: ConfigManager,\n    cliRootDir?: string,\n    projectName?: string,\n    modeOverride?: ProjectMode\n  ) {\n    this.configManager = configManager;\n    this.cliRootDir = cliRootDir;\n    this.modeOverride = modeOverride;\n    this.projectDetector = new ProjectDetector(process.cwd(), configManager, modeOverride);\n\n    // Initialize project context\n    try {\n      this.projectContext = this.projectDetector.getProjectContext(projectName);\n    } catch (_error) {\n      // Will be handled by individual methods if needed\n    }\n  }\n\n  /**\n   * Get the root directory with proper priority resolution:\n   * 1. CLI option override (--root-dir, --tasks-dir)\n   * 2. Environment variable (AITRACKDOWN_ROOT_DIR)\n   * 3. Config file setting (rootDirectory)\n   * 4. Project mode detection\n   * 5. Default to \"tasks/\"\n   */\n  getRootDirectory(): string {\n    // 1. CLI option takes highest priority\n    if (this.cliRootDir) {\n      return this.cliRootDir;\n    }\n\n    // 2. Environment variable override\n    const envRootDir = process.env.AITRACKDOWN_ROOT_DIR || process.env.AITRACKDOWN_TASKS_DIR;\n    if (envRootDir) {\n      return envRootDir;\n    }\n\n    // 3. Config file setting\n    const config = this.configManager.getConfig();\n    if (config.rootDirectory) {\n      return config.rootDirectory;\n    }\n\n    // 4. Project mode detection\n    const projectPath = this.getProjectBasePath();\n    if (projectPath !== process.cwd()) {\n      // In multi-project mode, use tasks relative to project directory\n      return join(projectPath, 'tasks');\n    }\n\n    // 5. Default to \"tasks/\" (NEW DEFAULT - was \"trackdown/\")\n    return 'tasks';\n  }\n\n  /**\n   * Get the project base path (project directory in multi-project mode)\n   */\n  getProjectBasePath(): string {\n    if (!this.projectContext) {\n      return process.cwd();\n    }\n\n    if (this.projectContext.mode === 'single') {\n      return this.projectContext.projectRoot;\n    }\n\n    // Multi-project mode\n    if (this.projectContext.currentProject) {\n      return this.projectDetector.getProjectPath(this.projectContext.currentProject);\n    }\n\n    // No current project selected\n    return this.projectContext.projectRoot;\n  }\n\n  /**\n   * Get the epics directory\n   */\n  getEpicsDir(): string {\n    return join(this.getRootDirectory(), 'epics');\n  }\n\n  /**\n   * Get the issues directory\n   */\n  getIssuesDir(): string {\n    return join(this.getRootDirectory(), 'issues');\n  }\n\n  /**\n   * Get the tasks directory\n   */\n  getTasksDir(): string {\n    return join(this.getRootDirectory(), 'tasks');\n  }\n\n  /**\n   * Get the PRs directory\n   */\n  getPRsDir(): string {\n    return join(this.getRootDirectory(), 'prs');\n  }\n\n  /**\n   * Get the templates directory\n   */\n  getTemplatesDir(): string {\n    return join(this.getRootDirectory(), 'templates');\n  }\n\n  /**\n   * Get the exports directory\n   */\n  getExportsDir(): string {\n    return join(this.getRootDirectory(), 'exports');\n  }\n\n  /**\n   * Get the documentation directory\n   */\n  getDocsDir(): string {\n    return join(this.getRootDirectory(), 'docs');\n  }\n\n  /**\n   * Get the archived tasks directory\n   */\n  getArchivedDir(): string {\n    return join(this.getRootDirectory(), 'archived');\n  }\n\n  /**\n   * DEPRECATED: Legacy method for backward compatibility\n   * Use getEpicsDir() instead\n   */\n  getActiveDir(): string {\n    return this.getEpicsDir();\n  }\n\n  /**\n   * DEPRECATED: Legacy method for backward compatibility\n   * Use getArchivedDir() instead\n   */\n  getCompletedDir(): string {\n    return this.getArchivedDir();\n  }\n\n  /**\n   * Check if legacy \"trackdown/\" directory exists and root is still default\n   */\n  shouldMigrate(): boolean {\n    const config = this.configManager.getConfig();\n    const hasLegacyDir = existsSync(join(process.cwd(), 'trackdown'));\n    const usingDefaultRoot = this.getRootDirectory() === 'tasks';\n    const migrationEnabled = config.migrateFromTrackdown !== false;\n\n    return hasLegacyDir && usingDefaultRoot && migrationEnabled;\n  }\n\n  /**\n   * Get legacy trackdown directory for migration detection\n   */\n  getLegacyTrackdownDir(): string {\n    return join(process.cwd(), 'trackdown');\n  }\n\n  /**\n   * Get all standard directories that should be created\n   */\n  getStandardDirectories(): string[] {\n    return [\n      this.getEpicsDir(),\n      this.getIssuesDir(),\n      this.getTasksDir(),\n      this.getPRsDir(),\n      this.getTemplatesDir(),\n      this.getExportsDir(),\n      this.getDocsDir(),\n      this.getArchivedDir(),\n    ];\n  }\n\n  /**\n   * Get directory for specific item type\n   */\n  getItemTypeDirectory(type: 'epic' | 'issue' | 'task' | 'pr'): string {\n    switch (type) {\n      case 'epic':\n        return this.getEpicsDir();\n      case 'issue':\n        return this.getIssuesDir();\n      case 'task':\n        return this.getTasksDir();\n      case 'pr':\n        return this.getPRsDir();\n      default:\n        throw new Error(`Unknown item type: ${type}`);\n    }\n  }\n\n  /**\n   * Get template-specific directories based on project template\n   */\n  getTemplateDirectories(\n    templateType: string\n  ): Array<{ path: string; type: 'directory' | 'file' }> {\n    const rootDir = this.getRootDirectory();\n\n    const templates: Record<string, Array<{ path: string; type: 'directory' | 'file' }>> = {\n      standard: [\n        { path: join(rootDir, 'active'), type: 'directory' },\n        { path: join(rootDir, 'completed'), type: 'directory' },\n        { path: join(rootDir, 'templates'), type: 'directory' },\n        { path: join(rootDir, 'exports'), type: 'directory' },\n        { path: join(rootDir, 'docs'), type: 'directory' },\n      ],\n      cli: [\n        { path: join(rootDir, 'features'), type: 'directory' },\n        { path: join(rootDir, 'bugs'), type: 'directory' },\n        { path: join(rootDir, 'releases'), type: 'directory' },\n        { path: join(rootDir, 'documentation'), type: 'directory' },\n      ],\n      web: [\n        { path: join(rootDir, 'frontend'), type: 'directory' },\n        { path: join(rootDir, 'backend'), type: 'directory' },\n        { path: join(rootDir, 'testing'), type: 'directory' },\n        { path: join(rootDir, 'deployment'), type: 'directory' },\n      ],\n      api: [\n        { path: join(rootDir, 'endpoints'), type: 'directory' },\n        { path: join(rootDir, 'schemas'), type: 'directory' },\n        { path: join(rootDir, 'testing'), type: 'directory' },\n        { path: join(rootDir, 'documentation'), type: 'directory' },\n      ],\n      mobile: [\n        { path: join(rootDir, 'features'), type: 'directory' },\n        { path: join(rootDir, 'ui-ux'), type: 'directory' },\n        { path: join(rootDir, 'testing'), type: 'directory' },\n        { path: join(rootDir, 'releases'), type: 'directory' },\n      ],\n    };\n\n    return templates[templateType] || templates.standard;\n  }\n\n  /**\n   * Update CLI root directory override\n   */\n  setCliRootDir(rootDir: string): void {\n    this.cliRootDir = rootDir;\n  }\n\n  /**\n   * Clear CLI root directory override\n   */\n  clearCliRootDir(): void {\n    this.cliRootDir = undefined;\n  }\n\n  /**\n   * Set project context for multi-project operations\n   */\n  setProjectContext(projectName: string): void {\n    this.projectContext = this.projectDetector.getProjectContext(projectName);\n  }\n\n  /**\n   * Get current project context\n   */\n  getProjectContext(): ProjectContext | undefined {\n    return this.projectContext;\n  }\n\n  /**\n   * Get project mode (single or multi)\n   */\n  getProjectMode(): ProjectMode {\n    return this.projectContext?.mode || 'single';\n  }\n\n  /**\n   * List available projects in multi-project mode\n   */\n  getAvailableProjects(): string[] {\n    return this.projectDetector.listAvailableProjects();\n  }\n\n  /**\n   * Check if project exists\n   */\n  projectExists(projectName: string): boolean {\n    return this.projectDetector.projectExists(projectName);\n  }\n\n  /**\n   * Create new project directory structure\n   */\n  createProjectStructure(projectName?: string): void {\n    const _projectPath = projectName\n      ? this.projectDetector.createProject(projectName)\n      : this.getProjectBasePath();\n\n    // Create all standard directories\n    const directories = this.getStandardDirectories();\n    for (const dir of directories) {\n      if (!existsSync(dir)) {\n        require('node:fs').mkdirSync(dir, { recursive: true });\n      }\n    }\n  }\n\n  /**\n   * Show migration warning if legacy directory exists\n   */\n  showMigrationWarning(): void {\n    if (this.shouldMigrate()) {\n      console.warn(`\n⚠️  LEGACY DIRECTORY DETECTED\n\nFound existing \"trackdown/\" directory. The CLI now defaults to \"${this.getRootDirectory()}/\" directory.\n\nMigration Options:\n1. Automatic: Set AITRACKDOWN_ROOT_DIR=trackdown to continue using the existing directory\n2. Manual: Move files from trackdown/ to ${this.getRootDirectory()}/ manually\n3. Configuration: Update .trackdownrc.json with \"rootDirectory\": \"trackdown\"\n\nExamples:\n  export AITRACKDOWN_ROOT_DIR=trackdown    # Use existing directory\n  aitrackdown --root-dir trackdown init    # Specify directory per command\n      `);\n    }\n\n    // Show project detection info\n    this.projectDetector.showDetectionInfo();\n  }\n\n  /**\n   * Get migration command suggestions\n   */\n  getMigrationCommands(): string[] {\n    if (!this.shouldMigrate()) {\n      return [];\n    }\n\n    const rootDir = this.getRootDirectory();\n    return [\n      `# Option 1: Set environment variable to use existing trackdown/ directory`,\n      `export AITRACKDOWN_ROOT_DIR=trackdown`,\n      ``,\n      `# Option 2: Move files to new ${rootDir}/ directory`,\n      `mkdir -p ${rootDir}`,\n      `mv trackdown/active ${rootDir}/active 2>/dev/null || true`,\n      `mv trackdown/completed ${rootDir}/completed 2>/dev/null || true`,\n      `mv trackdown/templates ${rootDir}/templates 2>/dev/null || true`,\n      `mv trackdown/exports ${rootDir}/exports 2>/dev/null || true`,\n      ``,\n      `# Option 3: Update configuration file`,\n      `echo '{\"rootDirectory\": \"trackdown\"}' > .trackdownrc.json`,\n    ];\n  }\n}\n","/**\n * Project Context Manager for AI-Trackdown CLI\n * Manages project context for CLI operations in both single and multi-project modes\n */\n\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ProjectConfig } from '../types/ai-trackdown.js';\nimport { ConfigManager } from './config-manager.js';\nimport { PathResolver } from './path-resolver.js';\nimport { type ProjectContext, ProjectDetector, type ProjectMode } from './project-detector.js';\n\nexport interface ContextualizedPaths {\n  projectRoot: string;\n  configDir: string;\n  tasksRoot: string;\n  epicsDir: string;\n  issuesDir: string;\n  tasksDir: string;\n  prsDir: string;\n  templatesDir: string;\n}\n\nexport interface ProjectContextState {\n  context: ProjectContext;\n  paths: ContextualizedPaths;\n  configManager: ConfigManager;\n  pathResolver: PathResolver;\n  projectDetector: ProjectDetector;\n}\n\n/**\n * ProjectContextManager handles project context setup and management\n * for CLI operations across both single and multi-project modes\n */\nexport class ProjectContextManager {\n  private projectRoot: string;\n  private currentContext?: ProjectContextState;\n  private modeOverride?: ProjectMode;\n  private cliRootDir?: string;\n\n  constructor(\n    projectRoot: string = process.cwd(),\n    modeOverride?: ProjectMode,\n    cliRootDir?: string\n  ) {\n    this.projectRoot = projectRoot;\n    this.modeOverride = modeOverride;\n    this.cliRootDir = cliRootDir;\n  }\n\n  /**\n   * Initialize project context for CLI operations\n   */\n  async initializeContext(projectName?: string): Promise<ProjectContextState> {\n    // Create project detector\n    const projectDetector = new ProjectDetector(this.projectRoot, undefined, this.modeOverride);\n\n    // Get project context\n    const context = projectDetector.getProjectContext(projectName);\n\n    // Determine the actual project root path\n    const actualProjectRoot = this.getActualProjectRoot(context);\n\n    // Create config manager for the project\n    const configManager = new ConfigManager(actualProjectRoot);\n\n    // Create path resolver with project context\n    const pathResolver = new PathResolver(\n      configManager,\n      this.cliRootDir,\n      context.currentProject,\n      this.modeOverride\n    );\n\n    // Build contextualized paths\n    const paths = this.buildContextualizedPaths(context, pathResolver, actualProjectRoot);\n\n    // Create and cache the context state\n    this.currentContext = {\n      context,\n      paths,\n      configManager,\n      pathResolver,\n      projectDetector,\n    };\n\n    return this.currentContext;\n  }\n\n  /**\n   * Get the current project context state\n   */\n  getCurrentContext(): ProjectContextState | undefined {\n    return this.currentContext;\n  }\n\n  /**\n   * Switch to a different project in multi-project mode\n   */\n  async switchProject(projectName: string): Promise<ProjectContextState> {\n    if (!this.currentContext) {\n      throw new Error('No project context initialized. Call initializeContext() first.');\n    }\n\n    if (this.currentContext.context.mode === 'single') {\n      throw new Error('Cannot switch projects in single-project mode');\n    }\n\n    // Re-initialize with new project\n    return await this.initializeContext(projectName);\n  }\n\n  /**\n   * Create a new project in multi-project mode\n   */\n  async createProject(\n    projectName: string,\n    config?: Partial<ProjectConfig>\n  ): Promise<ProjectContextState> {\n    if (!this.currentContext) {\n      // Initialize context first to detect mode\n      await this.initializeContext();\n    }\n\n    if (!this.currentContext) {\n      throw new Error('Failed to initialize project context');\n    }\n\n    if (this.currentContext.context.mode === 'single') {\n      throw new Error('Cannot create projects in single-project mode');\n    }\n\n    // Create project directory\n    const projectPath = this.currentContext.projectDetector.createProject(projectName);\n\n    // Create directory structure\n    mkdirSync(projectPath, { recursive: true });\n\n    // Initialize project with config\n    const projectConfigManager = new ConfigManager(projectPath);\n    const _projectConfig = projectConfigManager.initializeProject(projectName, config);\n\n    // Switch to the new project\n    return await this.switchProject(projectName);\n  }\n\n  /**\n   * List available projects\n   */\n  listProjects(): string[] {\n    if (!this.currentContext) {\n      throw new Error('No project context initialized. Call initializeContext() first.');\n    }\n\n    return this.currentContext.context.availableProjects;\n  }\n\n  /**\n   * Get project mode\n   */\n  getProjectMode(): ProjectMode {\n    if (!this.currentContext) {\n      throw new Error('No project context initialized. Call initializeContext() first.');\n    }\n\n    return this.currentContext.context.mode;\n  }\n\n  /**\n   * Get contextualized paths for current project\n   */\n  getPaths(): ContextualizedPaths {\n    if (!this.currentContext) {\n      throw new Error('No project context initialized. Call initializeContext() first.');\n    }\n\n    return this.currentContext.paths;\n  }\n\n  /**\n   * Get path resolver for current project\n   */\n  getPathResolver(): PathResolver {\n    if (!this.currentContext) {\n      throw new Error('No project context initialized. Call initializeContext() first.');\n    }\n\n    return this.currentContext.pathResolver;\n  }\n\n  /**\n   * Get config manager for current project\n   */\n  getConfigManager(): ConfigManager {\n    if (!this.currentContext) {\n      throw new Error('No project context initialized. Call initializeContext() first.');\n    }\n\n    return this.currentContext.configManager;\n  }\n\n  /**\n   * Ensure project structure exists\n   */\n  async ensureProjectStructure(): Promise<void> {\n    if (!this.currentContext) {\n      throw new Error('No project context initialized. Call initializeContext() first.');\n    }\n\n    const { paths, configManager } = this.currentContext;\n\n    // Create all required directories\n    const directories = [\n      paths.configDir,\n      paths.tasksRoot,\n      paths.epicsDir,\n      paths.issuesDir,\n      paths.tasksDir,\n      paths.prsDir,\n      paths.templatesDir,\n    ];\n\n    for (const dir of directories) {\n      if (!existsSync(dir)) {\n        mkdirSync(dir, { recursive: true });\n      }\n    }\n\n    // Initialize config if it doesn't exist\n    if (!configManager.isProjectDirectory(paths.projectRoot)) {\n      await configManager.initializeProject(\n        this.currentContext.context.currentProject || 'default-project'\n      );\n    }\n  }\n\n  /**\n   * Validate project context\n   */\n  validateContext(): {\n    valid: boolean;\n    issues: string[];\n    warnings: string[];\n  } {\n    if (!this.currentContext) {\n      return {\n        valid: false,\n        issues: ['No project context initialized'],\n        warnings: [],\n      };\n    }\n\n    const issues: string[] = [];\n    const warnings: string[] = [];\n\n    // Check if project exists in multi-project mode\n    if (this.currentContext.context.mode === 'multi') {\n      if (!this.currentContext.context.currentProject) {\n        issues.push('No project selected in multi-project mode');\n      } else if (\n        !this.currentContext.projectDetector.projectExists(\n          this.currentContext.context.currentProject\n        )\n      ) {\n        issues.push(`Project '${this.currentContext.context.currentProject}' does not exist`);\n      }\n    }\n\n    // Check if required directories exist\n    const requiredDirs = [this.currentContext.paths.configDir, this.currentContext.paths.tasksRoot];\n\n    for (const dir of requiredDirs) {\n      if (!existsSync(dir)) {\n        warnings.push(`Required directory does not exist: ${dir}`);\n      }\n    }\n\n    // Check config validity\n    try {\n      const _config = this.currentContext.configManager.getConfig();\n      const validation = this.currentContext.configManager.validateConfig();\n      if (!validation.valid) {\n        issues.push(...validation.errors);\n      }\n    } catch (error) {\n      issues.push(\n        `Configuration error: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n\n    return {\n      valid: issues.length === 0,\n      issues,\n      warnings,\n    };\n  }\n\n  /**\n   * Show context information\n   */\n  showContextInfo(): void {\n    if (!this.currentContext) {\n      console.log('❌ No project context initialized');\n      return;\n    }\n\n    const { context, paths } = this.currentContext;\n\n    console.log(`\\n📋 Project Context Information`);\n    console.log(`Mode: ${context.mode.toUpperCase()}`);\n    console.log(`Root: ${context.projectRoot}`);\n\n    if (context.mode === 'multi') {\n      console.log(`Projects Directory: ${context.projectsDir || 'Not set'}`);\n      console.log(`Current Project: ${context.currentProject || 'None selected'}`);\n      console.log(`Available Projects: ${context.availableProjects.join(', ') || 'None'}`);\n    }\n\n    console.log(`\\n📁 Directory Structure:`);\n    console.log(`   Config: ${paths.configDir}`);\n    console.log(`   Tasks Root: ${paths.tasksRoot}`);\n    console.log(`   ├── Epics: ${paths.epicsDir}`);\n    console.log(`   ├── Issues: ${paths.issuesDir}`);\n    console.log(`   ├── Tasks: ${paths.tasksDir}`);\n    console.log(`   ├── PRs: ${paths.prsDir}`);\n    console.log(`   └── Templates: ${paths.templatesDir}`);\n\n    // Show validation results\n    const validation = this.validateContext();\n    if (!validation.valid) {\n      console.log(`\\n❌ Context Issues:`);\n      validation.issues.forEach((issue) => console.log(`   • ${issue}`));\n    }\n\n    if (validation.warnings.length > 0) {\n      console.log(`\\n⚠️  Warnings:`);\n      validation.warnings.forEach((warning) => console.log(`   • ${warning}`));\n    }\n  }\n\n  /**\n   * Get the actual project root path based on context\n   */\n  private getActualProjectRoot(context: ProjectContext): string {\n    if (context.mode === 'single') {\n      return context.projectRoot;\n    }\n\n    // Multi-project mode\n    if (context.currentProject) {\n      return join(\n        context.projectsDir || join(context.projectRoot, 'projects'),\n        context.currentProject\n      );\n    }\n\n    // No project selected in multi-project mode\n    return context.projectRoot;\n  }\n\n  /**\n   * Build contextualized paths for the current project\n   */\n  private buildContextualizedPaths(\n    _context: ProjectContext,\n    pathResolver: PathResolver,\n    actualProjectRoot: string\n  ): ContextualizedPaths {\n    return {\n      projectRoot: actualProjectRoot,\n      configDir: join(actualProjectRoot, '.ai-trackdown'),\n      tasksRoot: pathResolver.getRootDirectory(),\n      epicsDir: pathResolver.getEpicsDir(),\n      issuesDir: pathResolver.getIssuesDir(),\n      tasksDir: pathResolver.getTasksDir(),\n      prsDir: pathResolver.getPRsDir(),\n      templatesDir: pathResolver.getTemplatesDir(),\n    };\n  }\n\n  /**\n   * Reset context (useful for testing)\n   */\n  reset(): void {\n    this.currentContext = undefined;\n  }\n\n  /**\n   * Set mode override\n   */\n  setModeOverride(mode: ProjectMode | undefined): void {\n    this.modeOverride = mode;\n    // Reset context to force re-initialization\n    this.currentContext = undefined;\n  }\n\n  /**\n   * Set CLI root directory override\n   */\n  setCliRootDir(rootDir: string | undefined): void {\n    this.cliRootDir = rootDir;\n    // Reset context to force re-initialization\n    this.currentContext = undefined;\n  }\n}\n","/**\n * TrackdownIndexManager - High-Performance Index File System for AI-Trackdown\n * Implements .ai-trackdown-index file system to eliminate expensive directory searches\n *\n * Performance Targets:\n * - Index Load Time: < 10ms for projects with 1000+ items\n * - Update Time: < 5ms for single item updates\n * - Rebuild Time: < 100ms for full project scan\n * - Memory Usage: < 5MB for large projects\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport type {\n  AnyItemData,\n  EpicData,\n  IssueData,\n  ItemStatus,\n  ItemType,\n  PRData,\n  Priority,\n  ProjectConfig,\n  TaskData,\n} from '../types/ai-trackdown.js';\nimport { FrontmatterParser } from './frontmatter-parser.js';\nimport { type ProjectDetectionResult, ProjectDetector } from './project-detector.js';\nimport { UnifiedPathResolver } from './unified-path-resolver.js';\n\n// Async file operations for better performance\nconst readFile = promisify(fs.readFile);\nconst writeFile = promisify(fs.writeFile);\nconst stat = promisify(fs.stat);\nconst readdir = promisify(fs.readdir);\nconst access = promisify(fs.access);\n\n// Index file format and location\nconst INDEX_FILE_NAME = '.ai-trackdown-index';\nconst INDEX_VERSION = '1.0.0';\nconst MAX_CONCURRENT_READS = 50; // Limit concurrent file reads for performance\n\n// Core index data structure\nexport interface TrackdownIndexEntry {\n  id: string;\n  title: string;\n  filePath: string;\n  status: ItemStatus;\n  priority: Priority;\n  lastModified: string;\n  fileSize: number;\n  assignee?: string;\n  tags?: string[];\n}\n\nexport interface ProjectIndexEntry extends TrackdownIndexEntry {\n  name: string;\n  git_origin?: string;\n  git_branch?: string;\n  repository_url?: string;\n  team_members?: string[];\n  framework?: string;\n  completion_percentage?: number;\n  epicIds: string[];\n}\n\nexport interface EpicIndexEntry extends TrackdownIndexEntry {\n  issueIds: string[];\n  milestone?: string;\n  completion_percentage?: number;\n}\n\nexport interface IssueIndexEntry extends TrackdownIndexEntry {\n  epicId: string;\n  taskIds: string[];\n  prIds: string[];\n  blocked_by?: string[];\n  blocks?: string[];\n}\n\nexport interface TaskIndexEntry extends TrackdownIndexEntry {\n  issueId: string;\n  epicId: string;\n  time_estimate?: string;\n  time_spent?: string;\n  parent_task?: string;\n  subtasks?: string[];\n}\n\nexport interface PRIndexEntry extends TrackdownIndexEntry {\n  issueId: string;\n  epicId: string;\n  pr_status: string;\n  branch_name?: string;\n  pr_number?: number;\n  reviewers?: string[];\n}\n\nexport interface TrackdownIndex {\n  version: string;\n  lastUpdated: string;\n  projectPath: string;\n  projects: Record<string, ProjectIndexEntry>;\n  epics: Record<string, EpicIndexEntry>;\n  issues: Record<string, IssueIndexEntry>;\n  tasks: Record<string, TaskIndexEntry>;\n  prs: Record<string, PRIndexEntry>;\n  stats: {\n    totalProjects: number;\n    totalEpics: number;\n    totalIssues: number;\n    totalTasks: number;\n    totalPRs: number;\n    lastFullScan: string;\n    indexSize: number;\n    performanceMetrics: {\n      lastLoadTime: number;\n      lastUpdateTime: number;\n      lastRebuildTime: number;\n    };\n  };\n}\n\n// Performance tracking interface\ninterface PerformanceTracker {\n  startTime: number;\n  operation: string;\n}\n\nexport class TrackdownIndexManager {\n  private indexPath: string;\n  private tasksDir: string;\n  private projectPath: string;\n  private config: ProjectConfig;\n  private pathResolver: UnifiedPathResolver;\n  private frontmatterParser: FrontmatterParser;\n  private projectDetector: ProjectDetector;\n\n  // Memory cache for performance\n  private cachedIndex: TrackdownIndex | null = null;\n  private cacheTimestamp: number = 0;\n  private readonly CACHE_TTL = 5000; // 5 seconds cache TTL\n\n  // Store project detection results for auto-project creation\n  private lastProjectDetection: ProjectDetectionResult | null = null;\n\n  // Test mode flags for performance optimization\n  private readonly isTestMode: boolean;\n  private readonly disableIndexing: boolean;\n  private readonly useMockIndex: boolean;\n\n  constructor(config: ProjectConfig, projectPath: string, cliTasksDir?: string) {\n    this.config = config;\n    this.projectPath = projectPath;\n    this.pathResolver = new UnifiedPathResolver(config, projectPath, cliTasksDir);\n    this.frontmatterParser = new FrontmatterParser();\n    this.projectDetector = new ProjectDetector(projectPath);\n\n    // Check test mode flags for performance optimization\n    this.isTestMode =\n      process.env.NODE_ENV === 'test' || process.env.AI_TRACKDOWN_TEST_MODE === 'true';\n    this.disableIndexing = process.env.AI_TRACKDOWN_DISABLE_INDEX === 'true';\n    this.useMockIndex = process.env.AI_TRACKDOWN_MOCK_INDEX === 'true';\n\n    const paths = this.pathResolver.getUnifiedPaths();\n    this.tasksDir = paths.tasksRoot;\n    this.indexPath = path.join(this.tasksDir, INDEX_FILE_NAME);\n  }\n\n  /**\n   * Load index with memory caching and performance optimization\n   */\n  public async loadIndex(): Promise<TrackdownIndex> {\n    const tracker = this.startPerformanceTracking('loadIndex');\n\n    try {\n      // Check memory cache first\n      if (this.cachedIndex && Date.now() - this.cacheTimestamp < this.CACHE_TTL) {\n        this.endPerformanceTracking(tracker);\n        return this.cachedIndex;\n      }\n\n      // Check if index file exists\n      if (!(await this.indexExists())) {\n        // In test mode, suppress rebuild warnings and return minimal index\n        if (this.isTestMode && this.disableIndexing) {\n          return this.createMinimalTestIndex();\n        }\n\n        if (!this.isTestMode) {\n          console.warn(`Index file not found at ${this.indexPath}. Rebuilding...`);\n        }\n        return await this.rebuildIndex();\n      }\n\n      // Load from disk\n      const indexContent = await readFile(this.indexPath, 'utf8');\n      const index = JSON.parse(indexContent) as TrackdownIndex;\n\n      // Validate index structure\n      if (!this.validateIndexStructure(index)) {\n        // In test mode, suppress warnings and return minimal index\n        if (this.isTestMode && this.disableIndexing) {\n          return this.createMinimalTestIndex();\n        }\n\n        if (!this.isTestMode) {\n          console.warn('Index file corrupted. Rebuilding...');\n        }\n        return await this.rebuildIndex();\n      }\n\n      // Update cache\n      this.cachedIndex = index;\n      this.cacheTimestamp = Date.now();\n\n      // Update performance metrics\n      const loadTime = this.endPerformanceTracking(tracker);\n      index.stats.performanceMetrics.lastLoadTime = loadTime;\n\n      return index;\n    } catch (error) {\n      // In test mode, suppress warnings and return minimal index\n      if (this.isTestMode && this.disableIndexing) {\n        return this.createMinimalTestIndex();\n      }\n\n      if (!this.isTestMode) {\n        console.warn(\n          `Failed to load index: ${error instanceof Error ? error.message : 'Unknown error'}. Rebuilding...`\n        );\n      }\n      return await this.rebuildIndex();\n    }\n  }\n\n  /**\n   * Save index with atomic writes and compression consideration\n   */\n  public async saveIndex(index: TrackdownIndex): Promise<void> {\n    const tracker = this.startPerformanceTracking('saveIndex');\n\n    try {\n      // Update metadata\n      index.lastUpdated = new Date().toISOString();\n      index.projectPath = this.projectPath;\n\n      // Calculate stats\n      index.stats.totalProjects = Object.keys(index.projects).length;\n      index.stats.totalEpics = Object.keys(index.epics).length;\n      index.stats.totalIssues = Object.keys(index.issues).length;\n      index.stats.totalTasks = Object.keys(index.tasks).length;\n      index.stats.totalPRs = Object.keys(index.prs).length;\n\n      // Serialize with proper formatting\n      const indexContent = JSON.stringify(index, null, 2);\n      index.stats.indexSize = Buffer.byteLength(indexContent, 'utf8');\n\n      // Ensure tasks directory exists\n      await this.ensureTasksDirectoryExists();\n\n      // Atomic write using temp file + rename\n      const tempPath = `${this.indexPath}.tmp`;\n      await writeFile(tempPath, indexContent, 'utf8');\n\n      // Rename temp file to final location (atomic operation)\n      fs.renameSync(tempPath, this.indexPath);\n\n      // Update cache\n      this.cachedIndex = index;\n      this.cacheTimestamp = Date.now();\n\n      // Update performance metrics\n      const saveTime = this.endPerformanceTracking(tracker);\n      index.stats.performanceMetrics.lastUpdateTime = saveTime;\n    } catch (error) {\n      throw new Error(\n        `Failed to save index: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Rebuild entire index by scanning filesystem\n   */\n  public async rebuildIndex(): Promise<TrackdownIndex> {\n    const tracker = this.startPerformanceTracking('rebuildIndex');\n\n    // In test mode with disabled indexing, return mock index immediately\n    if (this.isTestMode && this.disableIndexing) {\n      return this.createMinimalTestIndex();\n    }\n\n    if (!this.isTestMode) {\n      console.log('🔄 Rebuilding AI-Trackdown index...');\n    }\n\n    const newIndex: TrackdownIndex = {\n      version: INDEX_VERSION,\n      lastUpdated: new Date().toISOString(),\n      projectPath: this.projectPath,\n      projects: {},\n      epics: {},\n      issues: {},\n      tasks: {},\n      prs: {},\n      stats: {\n        totalProjects: 0,\n        totalEpics: 0,\n        totalIssues: 0,\n        totalTasks: 0,\n        totalPRs: 0,\n        lastFullScan: new Date().toISOString(),\n        indexSize: 0,\n        performanceMetrics: {\n          lastLoadTime: 0,\n          lastUpdateTime: 0,\n          lastRebuildTime: 0,\n        },\n      },\n    };\n\n    try {\n      // Detect project structure before scanning directories\n      if (!this.isTestMode) {\n        console.log('🔍 Detecting project structure...');\n      }\n      const projectDetection = this.projectDetector.detectProjectMode();\n      this.lastProjectDetection = projectDetection;\n\n      // Log detection results (suppress in test mode)\n      if (!this.isTestMode) {\n        console.log(`📋 Project Mode: ${projectDetection.mode.toUpperCase()}`);\n        if (projectDetection.mode === 'multi') {\n          if (projectDetection.detectedProjects && projectDetection.detectedProjects.length > 0) {\n            console.log(`📁 Detected Projects: ${projectDetection.detectedProjects.join(', ')}`);\n          }\n          if (projectDetection.projectsDir) {\n            console.log(`📂 Projects Directory: ${projectDetection.projectsDir}`);\n          }\n        }\n\n        if (projectDetection.migrationNeeded) {\n          console.log('⚠️  Migration may be needed for optimal structure');\n        }\n\n        if (projectDetection.recommendations.length > 0) {\n          console.log('💡 Recommendations available (run with --show-recommendations for details)');\n        }\n      }\n\n      // Auto-create projects based on detection results (ISS-0015 & ISS-0016)\n      await this.autoCreateProjects(projectDetection);\n\n      const paths = this.pathResolver.getUnifiedPaths();\n\n      // Parallel processing for better performance\n      const scanTasks = [\n        this.scanDirectory(paths.epicsDir, 'epic'),\n        this.scanDirectory(paths.issuesDir, 'issue'),\n        this.scanDirectory(paths.tasksDir, 'task'),\n        this.scanDirectory(paths.prsDir, 'pr'),\n      ];\n\n      const [epics, issues, tasks, prs] = await Promise.all(scanTasks);\n\n      // Populate index with scanned data\n      for (const epic of epics) {\n        const epicData = epic as EpicData;\n        newIndex.epics[epicData.epic_id] = await this.createEpicIndexEntry(epicData);\n      }\n\n      for (const issue of issues) {\n        const issueData = issue as IssueData;\n        newIndex.issues[issueData.issue_id] = await this.createIssueIndexEntry(issueData);\n      }\n\n      for (const task of tasks) {\n        const taskData = task as TaskData;\n        newIndex.tasks[taskData.task_id] = await this.createTaskIndexEntry(taskData);\n      }\n\n      for (const pr of prs) {\n        const prData = pr as PRData;\n        newIndex.prs[prData.pr_id] = await this.createPRIndexEntry(prData);\n      }\n\n      // Build relationships\n      this.buildRelationships(newIndex);\n\n      // Save the new index\n      await this.saveIndex(newIndex);\n\n      const rebuildTime = this.endPerformanceTracking(tracker);\n      newIndex.stats.performanceMetrics.lastRebuildTime = rebuildTime;\n\n      if (!this.isTestMode) {\n        console.log(`✅ Index rebuilt successfully in ${rebuildTime}ms`);\n        console.log(\n          `📊 Indexed: ${newIndex.stats.totalProjects} projects, ${newIndex.stats.totalEpics} epics, ${newIndex.stats.totalIssues} issues, ${newIndex.stats.totalTasks} tasks, ${newIndex.stats.totalPRs} PRs`\n        );\n      }\n\n      return newIndex;\n    } catch (error) {\n      throw new Error(\n        `Failed to rebuild index: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Update single item in index (incremental update)\n   */\n  public async updateItem(type: ItemType, id: string): Promise<void> {\n    const tracker = this.startPerformanceTracking('updateItem');\n\n    try {\n      const index = await this.loadIndex();\n      const filePath = await this.findItemFile(type, id);\n\n      if (!filePath || !fs.existsSync(filePath)) {\n        // Item was deleted, remove from index\n        await this.removeItem(type, id);\n        return;\n      }\n\n      // Parse the updated file\n      const itemData = this.frontmatterParser.parseAnyItem(filePath);\n\n      // Update the appropriate index section\n      switch (type) {\n        case 'epic':\n          index.epics[id] = await this.createEpicIndexEntry(itemData as EpicData);\n          break;\n        case 'issue':\n          index.issues[id] = await this.createIssueIndexEntry(itemData as IssueData);\n          break;\n        case 'task':\n          index.tasks[id] = await this.createTaskIndexEntry(itemData as TaskData);\n          break;\n        case 'pr':\n          index.prs[id] = await this.createPRIndexEntry(itemData as PRData);\n          break;\n      }\n\n      // Rebuild relationships for this item\n      this.updateRelationships(index, type, id);\n\n      // Save updated index\n      await this.saveIndex(index);\n\n      this.endPerformanceTracking(tracker);\n    } catch (error) {\n      throw new Error(\n        `Failed to update item ${type}/${id}: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Remove item from index\n   */\n  public async removeItem(type: ItemType, id: string): Promise<void> {\n    const tracker = this.startPerformanceTracking('removeItem');\n\n    try {\n      const index = await this.loadIndex();\n\n      // Remove from appropriate index section\n      switch (type) {\n        case 'epic':\n          delete index.epics[id];\n          // Remove related issues and tasks\n          for (const issueId of Object.keys(index.issues)) {\n            if (index.issues[issueId].epicId === id) {\n              delete index.issues[issueId];\n            }\n          }\n          for (const taskId of Object.keys(index.tasks)) {\n            if (index.tasks[taskId].epicId === id) {\n              delete index.tasks[taskId];\n            }\n          }\n          break;\n        case 'issue':\n          delete index.issues[id];\n          // Remove related tasks and PRs\n          for (const taskId of Object.keys(index.tasks)) {\n            if (index.tasks[taskId].issueId === id) {\n              delete index.tasks[taskId];\n            }\n          }\n          for (const prId of Object.keys(index.prs)) {\n            if (index.prs[prId].issueId === id) {\n              delete index.prs[prId];\n            }\n          }\n          break;\n        case 'task':\n          delete index.tasks[id];\n          break;\n        case 'pr':\n          delete index.prs[id];\n          break;\n      }\n\n      // Clean up relationships\n      this.cleanupRelationships(index, type, id);\n\n      // Save updated index\n      await this.saveIndex(index);\n\n      this.endPerformanceTracking(tracker);\n    } catch (error) {\n      throw new Error(\n        `Failed to remove item ${type}/${id}: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Validate index structure and detect corruption\n   */\n  public async validateIndex(): Promise<boolean> {\n    try {\n      const index = await this.loadIndex();\n      return this.validateIndexStructure(index);\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Enhanced index validation with detailed health check\n   */\n  public async validateIndexHealth(): Promise<{\n    isValid: boolean;\n    issues: string[];\n    suggestions: string[];\n    stats: {\n      fileCount: number;\n      indexedCount: number;\n      missingCount: number;\n      orphanedCount: number;\n    };\n  }> {\n    const issues: string[] = [];\n    const suggestions: string[] = [];\n    let isValid = true;\n\n    try {\n      // Check if index file exists\n      const indexExists = await this.indexExists();\n      if (!indexExists) {\n        issues.push('Index file does not exist');\n        suggestions.push('Run: aitrackdown backlog-enhanced --rebuild-index');\n        return {\n          isValid: false,\n          issues,\n          suggestions,\n          stats: { fileCount: 0, indexedCount: 0, missingCount: 0, orphanedCount: 0 }\n        };\n      }\n\n      // Load and validate basic structure\n      const index = await this.loadIndex();\n      if (!this.validateIndexStructure(index)) {\n        issues.push('Index structure is corrupted');\n        isValid = false;\n      }\n\n      // Count actual files vs indexed files\n      const paths = this.pathResolver.getUnifiedPaths();\n      const actualCounts = await this.countActualFiles(paths);\n      const indexedCounts = {\n        epics: Object.keys(index.epics).length,\n        issues: Object.keys(index.issues).length,\n        tasks: Object.keys(index.tasks).length,\n        prs: Object.keys(index.prs).length\n      };\n\n      const totalActual = actualCounts.epics + actualCounts.issues + actualCounts.tasks + actualCounts.prs;\n      const totalIndexed = indexedCounts.epics + indexedCounts.issues + indexedCounts.tasks + indexedCounts.prs;\n\n      // Check for significant discrepancies\n      if (totalActual > totalIndexed * 1.1) { // More than 10% missing\n        issues.push(`Index appears outdated: ${totalActual} files found but only ${totalIndexed} indexed`);\n        suggestions.push('Run: aitrackdown backlog-enhanced --rebuild-index');\n        isValid = false;\n      }\n\n      // Check for orphaned entries\n      const orphanedCount = await this.countOrphanedEntries(index);\n      if (orphanedCount > 0) {\n        issues.push(`${orphanedCount} orphaned entries found in index`);\n        suggestions.push('Run index rebuild to clean up orphaned entries');\n      }\n\n      // Check index age\n      const indexAge = Date.now() - new Date(index.lastUpdated).getTime();\n      if (indexAge > 24 * 60 * 60 * 1000) { // More than 24 hours old\n        issues.push('Index is more than 24 hours old');\n        suggestions.push('Consider running regular index updates');\n      }\n\n      return {\n        isValid,\n        issues,\n        suggestions,\n        stats: {\n          fileCount: totalActual,\n          indexedCount: totalIndexed,\n          missingCount: Math.max(0, totalActual - totalIndexed),\n          orphanedCount\n        }\n      };\n    } catch (error) {\n      issues.push(`Index validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n      suggestions.push('Try rebuilding the index completely');\n      return {\n        isValid: false,\n        issues,\n        suggestions,\n        stats: { fileCount: 0, indexedCount: 0, missingCount: 0, orphanedCount: 0 }\n      };\n    }\n  }\n\n  /**\n   * Auto-repair index if issues are detected\n   */\n  public async autoRepairIndex(): Promise<{\n    repaired: boolean;\n    actions: string[];\n    errors: string[];\n  }> {\n    const actions: string[] = [];\n    const errors: string[] = [];\n\n    try {\n      const healthCheck = await this.validateIndexHealth();\n      \n      if (healthCheck.isValid) {\n        return { repaired: false, actions: ['Index is already healthy'], errors: [] };\n      }\n\n      actions.push('Starting auto-repair process...');\n\n      // If index is missing or corrupted, rebuild completely\n      if (healthCheck.issues.some(issue => \n        issue.includes('does not exist') || \n        issue.includes('corrupted') || \n        issue.includes('outdated')\n      )) {\n        actions.push('Rebuilding index completely due to corruption/missing files');\n        await this.rebuildIndex();\n        actions.push('Index rebuilt successfully');\n        return { repaired: true, actions, errors };\n      }\n\n      // Otherwise, try incremental repairs\n      if (healthCheck.stats.orphanedCount > 0) {\n        actions.push(`Cleaning up ${healthCheck.stats.orphanedCount} orphaned entries`);\n        await this.cleanOrphanedEntries();\n        actions.push('Orphaned entries cleaned up');\n      }\n\n      if (healthCheck.stats.missingCount > 0) {\n        actions.push(`Adding ${healthCheck.stats.missingCount} missing entries`);\n        await this.rebuildIndex(); // For now, rebuild is safest for missing entries\n        actions.push('Missing entries added');\n      }\n\n      return { repaired: true, actions, errors };\n    } catch (error) {\n      const errorMsg = `Auto-repair failed: ${error instanceof Error ? error.message : 'Unknown error'}`;\n      errors.push(errorMsg);\n      return { repaired: false, actions, errors };\n    }\n  }\n\n  /**\n   * Get index statistics and health information\n   */\n  public async getIndexStats(): Promise<\n    TrackdownIndex['stats'] & {\n      healthy: boolean;\n      cacheHit: boolean;\n      indexFileExists: boolean;\n      lastModified?: Date;\n    }\n  > {\n    try {\n      const indexExists = await this.indexExists();\n      let lastModified: Date | undefined;\n\n      if (indexExists) {\n        const stats = await stat(this.indexPath);\n        lastModified = stats.mtime;\n      }\n\n      const index = await this.loadIndex();\n      const cacheHit = Date.now() - this.cacheTimestamp < this.CACHE_TTL;\n\n      return {\n        ...index.stats,\n        healthy: this.validateIndexStructure(index),\n        cacheHit,\n        indexFileExists: indexExists,\n        lastModified,\n      };\n    } catch (_error) {\n      return {\n        totalEpics: 0,\n        totalIssues: 0,\n        totalTasks: 0,\n        totalPRs: 0,\n        lastFullScan: '',\n        indexSize: 0,\n        performanceMetrics: {\n          lastLoadTime: 0,\n          lastUpdateTime: 0,\n          lastRebuildTime: 0,\n        },\n        healthy: false,\n        cacheHit: false,\n        indexFileExists: false,\n      };\n    }\n  }\n\n  /**\n   * Clear memory cache (useful for testing or forcing reload)\n   */\n  public clearCache(): void {\n    this.cachedIndex = null;\n    this.cacheTimestamp = 0;\n  }\n\n  /**\n   * Get the last project detection results for auto-project creation\n   */\n  public getLastProjectDetection(): ProjectDetectionResult | null {\n    return this.lastProjectDetection;\n  }\n\n  /**\n   * Get project detector instance for direct access\n   */\n  public getProjectDetector(): ProjectDetector {\n    return this.projectDetector;\n  }\n\n  /**\n   * Auto-create projects based on detection results (ISS-0015 & ISS-0016)\n   */\n  private async autoCreateProjects(detection: ProjectDetectionResult): Promise<void> {\n    try {\n      // Check if projects should be auto-created\n      if (detection.mode === 'single') {\n        await this.autoCreateSingleProject(detection);\n      } else if (detection.mode === 'multi') {\n        await this.autoCreateMultiProjects(detection);\n      }\n    } catch (error) {\n      console.warn(\n        `⚠️  Auto-project creation warning: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Auto-create default project for single-project structure (ISS-0015)\n   */\n  private async autoCreateSingleProject(detection: ProjectDetectionResult): Promise<void> {\n    // Import ProjectContextManager here to avoid circular dependency\n    const { ProjectContextManager } = await import('./project-context-manager.js');\n\n    // Check if a project task already exists in single-project mode\n    const existingProjects = await this.checkExistingProjects();\n    if (existingProjects.length > 0) {\n      console.log(`📋 Found existing projects: ${existingProjects.join(', ')}`);\n      return;\n    }\n\n    console.log('🚀 Auto-creating default project for single-project structure...');\n\n    try {\n      const contextManager = new ProjectContextManager(detection.projectRoot);\n      await contextManager.initializeContext();\n\n      // Create a default project entry in the index\n      const defaultProjectName = 'default-project';\n\n      // Since we're in single-project mode, we'll create a conceptual project\n      // that represents the entire codebase\n      console.log(`📁 Creating default project: ${defaultProjectName}`);\n\n      // Ensure project structure exists\n      await contextManager.ensureProjectStructure();\n\n      console.log(`✅ Auto-created default project for single-project structure`);\n    } catch (error) {\n      throw new Error(\n        `Failed to auto-create single project: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Auto-create project tasks for multi-project structure (ISS-0016)\n   */\n  private async autoCreateMultiProjects(detection: ProjectDetectionResult): Promise<void> {\n    // Import ProjectContextManager here to avoid circular dependency\n    const { ProjectContextManager } = await import('./project-context-manager.js');\n\n    if (!detection.detectedProjects || detection.detectedProjects.length === 0) {\n      console.log('📋 No projects detected for auto-creation in multi-project mode');\n      return;\n    }\n\n    console.log(`🚀 Auto-creating projects for multi-project structure...`);\n    console.log(\n      `📁 Detected ${detection.detectedProjects.length} projects: ${detection.detectedProjects.join(', ')}`\n    );\n\n    const contextManager = new ProjectContextManager(detection.projectRoot);\n    await contextManager.initializeContext();\n\n    // Check if projects already exist to avoid duplicates\n    const existingProjects = await this.checkExistingProjects();\n\n    let createdCount = 0;\n\n    for (const projectName of detection.detectedProjects) {\n      if (existingProjects.includes(projectName)) {\n        console.log(`📋 Project '${projectName}' already exists, skipping...`);\n        continue;\n      }\n\n      try {\n        console.log(`📁 Auto-creating project: ${projectName}`);\n\n        // In multi-project mode, the directory structure should already exist\n        // We just need to ensure the project has proper configuration\n        if (detection.projectsDir) {\n          const projectPath = path.join(detection.projectsDir, projectName);\n          if (fs.existsSync(projectPath)) {\n            // Create a simple config manager for this project\n            const { ConfigManager } = await import('./config-manager.js');\n            const projectConfigManager = new ConfigManager(projectPath);\n\n            // Check if project already has config, if not create minimal one\n            if (!projectConfigManager.isProjectDirectory(projectPath)) {\n              const defaultConfig = {\n                name: projectName,\n                description: `Auto-created project for ${projectName}`,\n                version: '1.0.0',\n                project_mode: 'multi' as const,\n                structure: {\n                  epics_dir: 'epics',\n                  issues_dir: 'issues',\n                  tasks_dir: 'tasks',\n                  templates_dir: 'templates',\n                  prs_dir: 'prs',\n                },\n                naming_conventions: {\n                  project_prefix: 'PROJ',\n                  epic_prefix: 'EP',\n                  issue_prefix: 'ISS',\n                  task_prefix: 'TSK',\n                  pr_prefix: 'PR',\n                  file_extension: '.md',\n                },\n              };\n\n              projectConfigManager.initializeProject(projectName, defaultConfig);\n              createdCount++;\n              console.log(`✅ Auto-created project: ${projectName}`);\n            } else {\n              console.log(`📋 Project '${projectName}' already configured, skipping...`);\n            }\n          }\n        }\n      } catch (error) {\n        console.warn(\n          `⚠️  Failed to auto-create project '${projectName}': ${error instanceof Error ? error.message : 'Unknown error'}`\n        );\n      }\n    }\n\n    if (createdCount > 0) {\n      console.log(`✅ Auto-created ${createdCount} projects for multi-project structure`);\n    } else {\n      console.log(`📋 All detected projects already exist or are configured`);\n    }\n  }\n\n  /**\n   * Check for existing projects to avoid duplicates\n   */\n  private async checkExistingProjects(): Promise<string[]> {\n    try {\n      const index = await this.loadIndex();\n      return Object.keys(index.projects);\n    } catch (_error) {\n      // Index doesn't exist yet or is corrupted\n      return [];\n    }\n  }\n\n  /**\n   * Get all items of a specific type with fast index lookup\n   */\n  public async getItemsByType(type: ItemType): Promise<TrackdownIndexEntry[]> {\n    const index = await this.loadIndex();\n\n    switch (type) {\n      case 'epic':\n        return Object.values(index.epics);\n      case 'issue':\n        return Object.values(index.issues);\n      case 'task':\n        return Object.values(index.tasks);\n      case 'pr':\n        return Object.values(index.prs);\n      default:\n        return [];\n    }\n  }\n\n  /**\n   * Fast item lookup by ID\n   */\n  public async getItemById(type: ItemType, id: string): Promise<TrackdownIndexEntry | null> {\n    const index = await this.loadIndex();\n\n    switch (type) {\n      case 'epic':\n        return index.epics[id] || null;\n      case 'issue':\n        return index.issues[id] || null;\n      case 'task':\n        return index.tasks[id] || null;\n      case 'pr':\n        return index.prs[id] || null;\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Get items by status with fast filtering\n   */\n  public async getItemsByStatus(status: ItemStatus): Promise<TrackdownIndexEntry[]> {\n    const index = await this.loadIndex();\n    const allItems: TrackdownIndexEntry[] = [\n      ...Object.values(index.epics),\n      ...Object.values(index.issues),\n      ...Object.values(index.tasks),\n      ...Object.values(index.prs),\n    ];\n\n    return allItems.filter((item) => item.status === status);\n  }\n\n  /**\n   * Get project overview with pre-calculated metrics\n   */\n  public async getProjectOverview(): Promise<{\n    totalItems: number;\n    byStatus: Record<ItemStatus, number>;\n    byPriority: Record<Priority, number>;\n    byType: Record<ItemType, number>;\n    completionRate: number;\n    recentActivity: TrackdownIndexEntry[];\n  }> {\n    const index = await this.loadIndex();\n    const allItems: TrackdownIndexEntry[] = [\n      ...Object.values(index.epics),\n      ...Object.values(index.issues),\n      ...Object.values(index.tasks),\n      ...Object.values(index.prs),\n    ];\n\n    // Calculate metrics\n    const byStatus = allItems.reduce(\n      (acc, item) => {\n        acc[item.status] = (acc[item.status] || 0) + 1;\n        return acc;\n      },\n      {} as Record<ItemStatus, number>\n    );\n\n    const byPriority = allItems.reduce(\n      (acc, item) => {\n        acc[item.priority] = (acc[item.priority] || 0) + 1;\n        return acc;\n      },\n      {} as Record<Priority, number>\n    );\n\n    const byType: Record<ItemType, number> = {\n      project: index.stats.totalProjects || 0,\n      epic: index.stats.totalEpics,\n      issue: index.stats.totalIssues,\n      task: index.stats.totalTasks,\n      pr: index.stats.totalPRs,\n    };\n\n    const completedItems = byStatus.completed || 0;\n    const completionRate =\n      allItems.length > 0 ? Math.round((completedItems / allItems.length) * 100) : 0;\n\n    // Get recent activity (last 7 days)\n    const lastWeek = new Date();\n    lastWeek.setDate(lastWeek.getDate() - 7);\n    const recentActivity = allItems\n      .filter((item) => new Date(item.lastModified) >= lastWeek)\n      .sort((a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime())\n      .slice(0, 10);\n\n    return {\n      totalItems: allItems.length,\n      byStatus,\n      byPriority,\n      byType,\n      completionRate,\n      recentActivity,\n    };\n  }\n\n  // Private helper methods\n\n  private async indexExists(): Promise<boolean> {\n    try {\n      await access(this.indexPath);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  private validateIndexStructure(index: TrackdownIndex): boolean {\n    return !!(\n      index.version &&\n      index.lastUpdated &&\n      index.projectPath &&\n      index.epics &&\n      index.issues &&\n      index.tasks &&\n      index.prs &&\n      index.stats\n    );\n  }\n\n  private async ensureTasksDirectoryExists(): Promise<void> {\n    try {\n      await access(this.tasksDir);\n    } catch {\n      fs.mkdirSync(this.tasksDir, { recursive: true });\n    }\n  }\n\n  private async scanDirectory(dirPath: string, _itemType: ItemType): Promise<AnyItemData[]> {\n    try {\n      await access(dirPath);\n    } catch {\n      return []; // Directory doesn't exist\n    }\n\n    const files = await readdir(dirPath);\n    const mdFiles = files.filter((file) => file.endsWith('.md'));\n\n    // Process files in batches to avoid overwhelming the system\n    const results: AnyItemData[] = [];\n    const batchSize = Math.min(MAX_CONCURRENT_READS, mdFiles.length);\n\n    for (let i = 0; i < mdFiles.length; i += batchSize) {\n      const batch = mdFiles.slice(i, i + batchSize);\n      const batchPromises = batch.map(async (file) => {\n        try {\n          const filePath = path.join(dirPath, file);\n          return this.frontmatterParser.parseAnyItem(filePath);\n        } catch (error) {\n          console.warn(\n            `Failed to parse ${file}: ${error instanceof Error ? error.message : 'Unknown error'}`\n          );\n          return null;\n        }\n      });\n\n      const batchResults = await Promise.all(batchPromises);\n      results.push(...(batchResults.filter(Boolean) as AnyItemData[]));\n    }\n\n    return results;\n  }\n\n  private async createEpicIndexEntry(epic: EpicData): Promise<EpicIndexEntry> {\n    const stats = await stat(epic.file_path);\n    return {\n      id: epic.epic_id,\n      title: epic.title,\n      filePath: epic.file_path,\n      status: epic.status,\n      priority: epic.priority,\n      lastModified: epic.updated_date,\n      fileSize: stats.size,\n      assignee: epic.assignee !== 'unassigned' ? epic.assignee : undefined,\n      tags: epic.tags,\n      issueIds: epic.related_issues || [],\n      milestone: epic.milestone,\n      completion_percentage: epic.completion_percentage,\n    };\n  }\n\n  private async createIssueIndexEntry(issue: IssueData): Promise<IssueIndexEntry> {\n    const stats = await stat(issue.file_path);\n    return {\n      id: issue.issue_id,\n      title: issue.title,\n      filePath: issue.file_path,\n      status: issue.status,\n      priority: issue.priority,\n      lastModified: issue.updated_date,\n      fileSize: stats.size,\n      assignee: issue.assignee !== 'unassigned' ? issue.assignee : undefined,\n      tags: issue.tags,\n      epicId: issue.epic_id,\n      taskIds: issue.related_tasks || [],\n      prIds: issue.related_prs || [],\n      blocked_by: issue.blocked_by,\n      blocks: issue.blocks,\n    };\n  }\n\n  private async createTaskIndexEntry(task: TaskData): Promise<TaskIndexEntry> {\n    const stats = await stat(task.file_path);\n    return {\n      id: task.task_id,\n      title: task.title,\n      filePath: task.file_path,\n      status: task.status,\n      priority: task.priority,\n      lastModified: task.updated_date,\n      fileSize: stats.size,\n      assignee: task.assignee !== 'unassigned' ? task.assignee : undefined,\n      tags: task.tags,\n      issueId: task.issue_id,\n      epicId: task.epic_id,\n      time_estimate: task.time_estimate,\n      time_spent: task.time_spent,\n      parent_task: task.parent_task,\n      subtasks: task.subtasks,\n    };\n  }\n\n  private async createPRIndexEntry(pr: PRData): Promise<PRIndexEntry> {\n    const stats = await stat(pr.file_path);\n    return {\n      id: pr.pr_id,\n      title: pr.title,\n      filePath: pr.file_path,\n      status: pr.status,\n      priority: pr.priority,\n      lastModified: pr.updated_date,\n      fileSize: stats.size,\n      assignee: pr.assignee !== 'unassigned' ? pr.assignee : undefined,\n      tags: pr.tags,\n      issueId: pr.issue_id,\n      epicId: pr.epic_id,\n      pr_status: pr.pr_status,\n      branch_name: pr.branch_name,\n      pr_number: pr.pr_number,\n      reviewers: pr.reviewers,\n    };\n  }\n\n  private buildRelationships(index: TrackdownIndex): void {\n    // Build Epic -> Issues relationships\n    for (const epic of Object.values(index.epics)) {\n      epic.issueIds = Object.values(index.issues)\n        .filter((issue) => issue.epicId === epic.id)\n        .map((issue) => issue.id);\n    }\n\n    // Build Issue -> Tasks/PRs relationships\n    for (const issue of Object.values(index.issues)) {\n      issue.taskIds = Object.values(index.tasks)\n        .filter((task) => task.issueId === issue.id)\n        .map((task) => task.id);\n\n      issue.prIds = Object.values(index.prs)\n        .filter((pr) => pr.issueId === issue.id)\n        .map((pr) => pr.id);\n    }\n  }\n\n  private updateRelationships(index: TrackdownIndex, _type: ItemType, _id: string): void {\n    // This is a simplified version - in production, you'd want more sophisticated relationship tracking\n    this.buildRelationships(index);\n  }\n\n  private cleanupRelationships(index: TrackdownIndex, type: ItemType, id: string): void {\n    // Remove references to deleted items\n    switch (type) {\n      case 'project':\n        // Project cleanup would involve removing project references from all items\n        // For now, we'll keep it simple since project deletion is rare\n        break;\n      case 'epic':\n        for (const epic of Object.values(index.epics)) {\n          epic.issueIds = epic.issueIds.filter((issueId) => issueId !== id);\n        }\n        break;\n      case 'issue':\n        for (const issue of Object.values(index.issues)) {\n          issue.taskIds = issue.taskIds.filter((taskId) => taskId !== id);\n          issue.prIds = issue.prIds.filter((prId) => prId !== id);\n        }\n        break;\n      case 'task':\n        // Task cleanup\n        break;\n      case 'pr':\n        // PR cleanup\n        break;\n    }\n  }\n\n  private async findItemFile(type: ItemType, id: string): Promise<string | null> {\n    const _paths = this.pathResolver.getUnifiedPaths();\n    const typeDir = this.pathResolver.getItemTypeDirectory(type);\n\n    try {\n      const files = await readdir(typeDir);\n      const mdFiles = files.filter((file) => file.endsWith('.md'));\n\n      for (const file of mdFiles) {\n        if (file.includes(id)) {\n          return path.join(typeDir, file);\n        }\n      }\n    } catch {\n      // Directory doesn't exist or other error\n    }\n\n    return null;\n  }\n\n  private startPerformanceTracking(operation: string): PerformanceTracker {\n    return {\n      startTime: Date.now(),\n      operation,\n    };\n  }\n\n  private endPerformanceTracking(tracker: PerformanceTracker): number {\n    const duration = Date.now() - tracker.startTime;\n\n    // Log performance if it's unusually slow (suppress in test mode)\n    if (duration > 100 && !this.isTestMode) {\n      console.warn(`⚠️ Slow ${tracker.operation}: ${duration}ms`);\n    }\n\n    return duration;\n  }\n\n  /**\n   * Create minimal test index for fast test execution\n   */\n  private createMinimalTestIndex(): TrackdownIndex {\n    return {\n      version: INDEX_VERSION,\n      lastUpdated: new Date().toISOString(),\n      projectPath: this.projectPath,\n      projects: {},\n      epics: {},\n      issues: {},\n      tasks: {},\n      prs: {},\n      stats: {\n        totalProjects: 0,\n        totalEpics: 0,\n        totalIssues: 0,\n        totalTasks: 0,\n        totalPRs: 0,\n        lastFullScan: new Date().toISOString(),\n        indexSize: 0,\n        performanceMetrics: {\n          lastLoadTime: 1,\n          lastUpdateTime: 1,\n          lastRebuildTime: 1,\n        },\n      },\n    };\n  }\n\n  /**\n   * Count actual files in the filesystem\n   */\n  private async countActualFiles(paths: any): Promise<{\n    epics: number;\n    issues: number;\n    tasks: number;\n    prs: number;\n  }> {\n    const counts = { epics: 0, issues: 0, tasks: 0, prs: 0 };\n\n    try {\n      // Count epics\n      if (await this.directoryExists(paths.epicsDir)) {\n        const epicFiles = await readdir(paths.epicsDir);\n        counts.epics = epicFiles.filter(f => f.endsWith('.md')).length;\n      }\n\n      // Count issues\n      if (await this.directoryExists(paths.issuesDir)) {\n        const issueFiles = await readdir(paths.issuesDir);\n        counts.issues = issueFiles.filter(f => f.endsWith('.md')).length;\n      }\n\n      // Count tasks\n      if (await this.directoryExists(paths.tasksDir)) {\n        const taskFiles = await readdir(paths.tasksDir);\n        counts.tasks = taskFiles.filter(f => f.endsWith('.md')).length;\n      }\n\n      // Count PRs\n      if (await this.directoryExists(paths.prsDir)) {\n        const prFiles = await readdir(paths.prsDir);\n        counts.prs = prFiles.filter(f => f.endsWith('.md')).length;\n      }\n    } catch (error) {\n      console.warn(`Warning: Failed to count actual files: ${error instanceof Error ? error.message : 'Unknown error'}`);\n    }\n\n    return counts;\n  }\n\n  /**\n   * Count orphaned entries in the index (entries that reference missing files)\n   */\n  private async countOrphanedEntries(index: TrackdownIndex): Promise<number> {\n    let orphanedCount = 0;\n\n    try {\n      // Check epics\n      for (const epic of Object.values(index.epics)) {\n        if (!(await this.fileExists(epic.filePath))) {\n          orphanedCount++;\n        }\n      }\n\n      // Check issues\n      for (const issue of Object.values(index.issues)) {\n        if (!(await this.fileExists(issue.filePath))) {\n          orphanedCount++;\n        }\n      }\n\n      // Check tasks\n      for (const task of Object.values(index.tasks)) {\n        if (!(await this.fileExists(task.filePath))) {\n          orphanedCount++;\n        }\n      }\n\n      // Check PRs\n      for (const pr of Object.values(index.prs)) {\n        if (!(await this.fileExists(pr.filePath))) {\n          orphanedCount++;\n        }\n      }\n    } catch (error) {\n      console.warn(`Warning: Failed to count orphaned entries: ${error instanceof Error ? error.message : 'Unknown error'}`);\n    }\n\n    return orphanedCount;\n  }\n\n  /**\n   * Clean orphaned entries from the index\n   */\n  private async cleanOrphanedEntries(): Promise<void> {\n    const index = await this.loadIndex();\n    let cleanedCount = 0;\n\n    // Clean epics\n    for (const [id, epic] of Object.entries(index.epics)) {\n      if (!(await this.fileExists(epic.filePath))) {\n        delete index.epics[id];\n        cleanedCount++;\n      }\n    }\n\n    // Clean issues\n    for (const [id, issue] of Object.entries(index.issues)) {\n      if (!(await this.fileExists(issue.filePath))) {\n        delete index.issues[id];\n        cleanedCount++;\n      }\n    }\n\n    // Clean tasks\n    for (const [id, task] of Object.entries(index.tasks)) {\n      if (!(await this.fileExists(task.filePath))) {\n        delete index.tasks[id];\n        cleanedCount++;\n      }\n    }\n\n    // Clean PRs\n    for (const [id, pr] of Object.entries(index.prs)) {\n      if (!(await this.fileExists(pr.filePath))) {\n        delete index.prs[id];\n        cleanedCount++;\n      }\n    }\n\n    if (cleanedCount > 0) {\n      // Rebuild relationships after cleanup\n      this.buildRelationships(index);\n      await this.saveIndex(index);\n      \n      if (!this.isTestMode) {\n        console.log(`✅ Cleaned ${cleanedCount} orphaned entries from index`);\n      }\n    }\n  }\n\n  /**\n   * Check if a directory exists\n   */\n  private async directoryExists(dirPath: string): Promise<boolean> {\n    try {\n      const stats = await stat(dirPath);\n      return stats.isDirectory();\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Check if a file exists\n   */\n  private async fileExists(filePath: string): Promise<boolean> {\n    try {\n      await access(filePath);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n}\n","/**\n * Enhanced Backlog Command with TrackdownIndexManager\n * High-performance backlog overview using the .ai-trackdown-index file system\n *\n * Performance Benefits:\n * - Instant backlog generation from pre-indexed data\n * - Fast filtering and hierarchical navigation\n * - Real-time progress tracking with cached metrics\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { TrackdownIndexManager } from '../utils/trackdown-index-manager.js';\n\ninterface BacklogOptions {\n  epic?: string;\n  status?: string;\n  priority?: string;\n  assignee?: string;\n  detailed?: boolean;\n  hierarchy?: boolean;\n  progress?: boolean;\n  export?: string;\n  rebuildIndex?: boolean;\n}\n\nexport function createBacklogEnhancedCommand(): Command {\n  const command = new Command('backlog-enhanced');\n\n  command\n    .description('Display project backlog with hierarchical view using high-performance index')\n    .option('-e, --epic <epic-id>', 'filter by specific epic')\n    .option('-s, --status <status>', 'filter by status (planning|active|completed|archived)')\n    .option('-p, --priority <priority>', 'filter by priority (low|medium|high|critical)')\n    .option('-a, --assignee <name>', 'filter by assignee')\n    .option('-d, --detailed', 'show detailed information for each item')\n    .option('--hierarchy', 'show complete hierarchical structure')\n    .option('--progress', 'show detailed progress metrics')\n    .option('--export <file>', 'export backlog to JSON file')\n    .option('--rebuild-index', 'force rebuild of index before displaying backlog')\n    .addHelpText(\n      'after',\n      `\nExamples:\n  $ aitrackdown backlog-enhanced\n  $ aitrackdown backlog-enhanced --hierarchy --progress\n  $ aitrackdown backlog-enhanced --epic EP-0001 --detailed\n  $ aitrackdown backlog-enhanced --status active --priority high\n  $ aitrackdown backlog-enhanced --export backlog.json\n\nPerformance Features:\n  ⚡ Instant backlog generation from indexed data\n  🔗 Pre-calculated hierarchical relationships\n  📊 Real-time progress tracking\n  🎯 Fast filtering across all dimensions\n`\n    )\n    .action(async (options: BacklogOptions) => {\n      try {\n        await displayEnhancedBacklog(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to display backlog: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n\nasync function displayEnhancedBacklog(options: BacklogOptions): Promise<void> {\n  const startTime = Date.now();\n\n  // Initialize configuration and index manager\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const parentCommand = (process as any).command?.parent;\n  const cliTasksDir = parentCommand?.opts()?.rootDir || parentCommand?.opts()?.tasksDir;\n\n  const projectRoot = configManager.findProjectRoot();\n  const indexManager = new TrackdownIndexManager(config, projectRoot, cliTasksDir);\n\n  // Force rebuild index if requested\n  if (options.rebuildIndex) {\n    console.log(Formatter.info('🔄 Rebuilding index...'));\n    await indexManager.rebuildIndex();\n  }\n\n  console.log(Formatter.header(`📋 ${config.name || 'AI-Trackdown'} Project Backlog (Enhanced)`));\n\n  // Check index health and auto-repair if needed\n  const healthCheck = await indexManager.validateIndexHealth();\n  if (!healthCheck.isValid) {\n    console.log(Formatter.warning('⚠️  Index health issues detected:'));\n    for (const issue of healthCheck.issues) {\n      console.log(Formatter.warning(`   • ${issue}`));\n    }\n    \n    console.log(Formatter.info('🔧 Auto-repairing index...'));\n    const repairResult = await indexManager.autoRepairIndex();\n    \n    if (repairResult.repaired) {\n      console.log(Formatter.success('✅ Index repaired successfully'));\n      for (const action of repairResult.actions) {\n        console.log(Formatter.dim(`   • ${action}`));\n      }\n    } else {\n      console.log(Formatter.warning('⚠️  Auto-repair failed, continuing with current index'));\n      for (const error of repairResult.errors) {\n        console.log(Formatter.warning(`   • ${error}`));\n      }\n    }\n    console.log('');\n  }\n\n  // Get all data from index\n  const [epics, issues, tasks, prs] = await Promise.all([\n    indexManager.getItemsByType('epic'),\n    indexManager.getItemsByType('issue'),\n    indexManager.getItemsByType('task'),\n    indexManager.getItemsByType('pr'),\n  ]);\n\n  // Apply filters\n  const filteredData = applyBacklogFilters({ epics, issues, tasks, prs }, options);\n\n  // Show progress summary if requested\n  if (options.progress) {\n    displayProgressSummary(filteredData);\n  }\n\n  // Display backlog based on view mode\n  if (options.hierarchy) {\n    displayHierarchicalView(filteredData, options);\n  } else {\n    displayBacklogView(filteredData, options);\n  }\n\n  // Export if requested\n  if (options.export) {\n    await exportBacklog(filteredData, options.export);\n  }\n\n  // Show performance metrics\n  const totalTime = Date.now() - startTime;\n  console.log(Formatter.dim(`\\n⚡ Generated in ${totalTime}ms using index system`));\n}\n\nfunction applyBacklogFilters(data: any, options: BacklogOptions): any {\n  let { epics, issues, tasks, prs } = data;\n\n  // Filter by epic if specified\n  if (options.epic) {\n    epics = epics.filter((epic: any) => epic.id === options.epic);\n    issues = issues.filter((issue: any) => issue.epicId === options.epic);\n    tasks = tasks.filter((task: any) => task.epicId === options.epic);\n    prs = prs.filter((pr: any) => pr.epicId === options.epic);\n  }\n\n  // Filter by status\n  if (options.status) {\n    epics = epics.filter((epic: any) => epic.status === options.status);\n    issues = issues.filter((issue: any) => issue.status === options.status);\n    tasks = tasks.filter((task: any) => task.status === options.status);\n    prs = prs.filter((pr: any) => pr.status === options.status);\n  }\n\n  // Filter by priority\n  if (options.priority) {\n    epics = epics.filter((epic: any) => epic.priority === options.priority);\n    issues = issues.filter((issue: any) => issue.priority === options.priority);\n    tasks = tasks.filter((task: any) => task.priority === options.priority);\n    prs = prs.filter((pr: any) => pr.priority === options.priority);\n  }\n\n  // Filter by assignee\n  if (options.assignee) {\n    epics = epics.filter((epic: any) => epic.assignee === options.assignee);\n    issues = issues.filter((issue: any) => issue.assignee === options.assignee);\n    tasks = tasks.filter((task: any) => task.assignee === options.assignee);\n    prs = prs.filter((pr: any) => pr.assignee === options.assignee);\n  }\n\n  return { epics, issues, tasks, prs };\n}\n\nfunction displayProgressSummary(data: any): void {\n  const { epics, issues, tasks, prs } = data;\n  const total = epics.length + issues.length + tasks.length + prs.length;\n\n  if (total === 0) {\n    console.log(Formatter.box('No items match the current filters', 'info'));\n    return;\n  }\n\n  console.log(Formatter.subheader('📊 Progress Summary'));\n\n  // Overall completion metrics\n  const completedItems = [\n    ...epics.filter((e: any) => e.status === 'completed'),\n    ...issues.filter((i: any) => i.status === 'completed'),\n    ...tasks.filter((t: any) => t.status === 'completed'),\n    ...prs.filter((p: any) => p.status === 'completed'),\n  ].length;\n\n  const completionRate = total > 0 ? Math.round((completedItems / total) * 100) : 0;\n\n  console.log(Formatter.info(`Total Items: ${total}`));\n  console.log(Formatter.info(`Completed: ${completedItems} (${completionRate}%)`));\n  console.log(\n    Formatter.info(\n      `In Progress: ${[...epics, ...issues, ...tasks, ...prs].filter((item: any) => item.status === 'active').length}`\n    )\n  );\n  console.log(\n    Formatter.info(\n      `Planned: ${[...epics, ...issues, ...tasks, ...prs].filter((item: any) => item.status === 'planning').length}`\n    )\n  );\n\n  // Progress by type\n  console.log(Formatter.subheader('\\n📈 Progress by Type'));\n  displayTypeProgress('Epics', epics);\n  displayTypeProgress('Issues', issues);\n  displayTypeProgress('Tasks', tasks);\n  displayTypeProgress('PRs', prs);\n\n  console.log('');\n}\n\nfunction displayTypeProgress(typeName: string, items: any[]): void {\n  if (items.length === 0) return;\n\n  const completed = items.filter((item) => item.status === 'completed').length;\n  const rate = Math.round((completed / items.length) * 100);\n  const progressBar = createProgressBar(rate);\n\n  console.log(Formatter.info(`${typeName}: ${completed}/${items.length} ${progressBar} ${rate}%`));\n}\n\nfunction createProgressBar(percentage: number, width: number = 20): string {\n  const filled = Math.round((percentage / 100) * width);\n  const empty = width - filled;\n  return `[${'█'.repeat(filled)}${' '.repeat(empty)}]`;\n}\n\nfunction displayHierarchicalView(data: any, options: BacklogOptions): void {\n  const { epics, issues, tasks, prs } = data;\n\n  console.log(Formatter.subheader('🌳 Hierarchical Backlog View'));\n\n  if (epics.length === 0) {\n    console.log(Formatter.box('No epics match the current filters', 'info'));\n    return;\n  }\n\n  epics.forEach((epic: any) => {\n    displayEpic(epic, options);\n\n    // Get related issues for this epic\n    const epicIssues = issues.filter((issue: any) => issue.epicId === epic.id);\n\n    epicIssues.forEach((issue: any, issueIndex: number) => {\n      const isLastIssue = issueIndex === epicIssues.length - 1;\n      displayIssue(issue, isLastIssue, options);\n\n      // Get related tasks for this issue\n      const issueTasks = tasks.filter((task: any) => task.issueId === issue.id);\n      const issuePRs = prs.filter((pr: any) => pr.issueId === issue.id);\n\n      issueTasks.forEach((task: any, taskIndex: number) => {\n        const isLastTask = taskIndex === issueTasks.length - 1 && issuePRs.length === 0;\n        displayTask(task, isLastIssue, isLastTask, options);\n      });\n\n      issuePRs.forEach((pr: any, prIndex: number) => {\n        const isLastPR = prIndex === issuePRs.length - 1;\n        displayPR(pr, isLastIssue, isLastPR, options);\n      });\n    });\n\n    console.log('');\n  });\n}\n\nfunction displayBacklogView(data: any, options: BacklogOptions): void {\n  const { epics, issues, tasks, prs } = data;\n\n  console.log(Formatter.subheader('📋 Backlog Overview'));\n\n  // Group all items by status\n  const allItems = [...epics, ...issues, ...tasks, ...prs]\n    .map((item) => ({\n      ...item,\n      type: getItemType(item.id),\n    }))\n    .sort((a, b) => {\n      // Sort by priority first, then by last modified\n      const priorityOrder = { critical: 4, high: 3, medium: 2, low: 1 };\n      const priorityDiff =\n        priorityOrder[b.priority as keyof typeof priorityOrder] -\n        priorityOrder[a.priority as keyof typeof priorityOrder];\n      if (priorityDiff !== 0) return priorityDiff;\n\n      return new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime();\n    });\n\n  if (allItems.length === 0) {\n    console.log(Formatter.box('No items match the current filters', 'info'));\n    return;\n  }\n\n  // Group by status\n  const grouped = allItems.reduce(\n    (acc, item) => {\n      if (!acc[item.status]) acc[item.status] = [];\n      acc[item.status].push(item);\n      return acc;\n    },\n    {} as Record<string, any[]>\n  );\n\n  // Display each status group\n  for (const [status, statusItems] of Object.entries(grouped)) {\n    if (statusItems.length > 0) {\n      const statusEmoji = getStatusEmoji(status);\n      console.log(\n        Formatter.subheader(`${statusEmoji} ${status.toUpperCase()} (${statusItems.length})`)\n      );\n\n      statusItems.forEach((item: any, index: number) => {\n        displayBacklogItem(item, index, options);\n      });\n      console.log('');\n    }\n  }\n}\n\nfunction displayEpic(epic: any, options: BacklogOptions): void {\n  const statusEmoji = getStatusEmoji(epic.status);\n  const priorityColor = getPriorityColor(epic.priority);\n  const completionInfo =\n    epic.completion_percentage !== undefined ? ` (${epic.completion_percentage}%)` : '';\n\n  console.log(\n    `🎯 ${statusEmoji} ${priorityColor(epic.priority.toUpperCase())} ${Formatter.highlight(epic.title)}${completionInfo} ${Formatter.dim(`(${epic.id})`)}`\n  );\n\n  if (options.detailed) {\n    console.log(`   Assignee: ${epic.assignee || 'unassigned'}`);\n    if (epic.milestone) console.log(`   Milestone: ${epic.milestone}`);\n    if (epic.tags?.length) console.log(`   Tags: ${epic.tags.join(', ')}`);\n    console.log(`   Modified: ${new Date(epic.lastModified).toLocaleString()}`);\n  }\n}\n\nfunction displayIssue(issue: any, isLast: boolean, options: BacklogOptions): void {\n  const prefix = isLast ? '└── ' : '├── ';\n  const statusEmoji = getStatusEmoji(issue.status);\n  const priorityColor = getPriorityColor(issue.priority);\n\n  console.log(\n    `${prefix}📋 ${statusEmoji} ${priorityColor(issue.priority.toUpperCase())} ${issue.title} ${Formatter.dim(`(${issue.id})`)}`\n  );\n\n  if (options.detailed) {\n    const indent = isLast ? '    ' : '│   ';\n    console.log(`${indent}Assignee: ${issue.assignee || 'unassigned'}`);\n    if (issue.tags?.length) console.log(`${indent}Tags: ${issue.tags.join(', ')}`);\n    console.log(`${indent}Modified: ${new Date(issue.lastModified).toLocaleString()}`);\n  }\n}\n\nfunction displayTask(\n  task: any,\n  issueIsLast: boolean,\n  isLast: boolean,\n  options: BacklogOptions\n): void {\n  const issuePrefix = issueIsLast ? '    ' : '│   ';\n  const taskPrefix = isLast ? '└── ' : '├── ';\n  const statusEmoji = getStatusEmoji(task.status);\n  const priorityColor = getPriorityColor(task.priority);\n\n  console.log(\n    `${issuePrefix}${taskPrefix}✅ ${statusEmoji} ${priorityColor(task.priority.toUpperCase())} ${task.title} ${Formatter.dim(`(${task.id})`)}`\n  );\n\n  if (options.detailed) {\n    const indent = issuePrefix + (isLast ? '    ' : '│   ');\n    console.log(`${indent}Assignee: ${task.assignee || 'unassigned'}`);\n    if (task.time_estimate) console.log(`${indent}Estimate: ${task.time_estimate}`);\n    if (task.tags?.length) console.log(`${indent}Tags: ${task.tags.join(', ')}`);\n  }\n}\n\nfunction displayPR(pr: any, issueIsLast: boolean, isLast: boolean, options: BacklogOptions): void {\n  const issuePrefix = issueIsLast ? '    ' : '│   ';\n  const prPrefix = isLast ? '└── ' : '├── ';\n  const statusEmoji = getStatusEmoji(pr.status);\n  const priorityColor = getPriorityColor(pr.priority);\n\n  console.log(\n    `${issuePrefix}${prPrefix}🔄 ${statusEmoji} ${priorityColor(pr.priority.toUpperCase())} ${pr.title} ${Formatter.dim(`(${pr.id})`)}`\n  );\n\n  if (options.detailed) {\n    const indent = issuePrefix + (isLast ? '    ' : '│   ');\n    console.log(`${indent}PR Status: ${pr.pr_status}`);\n    if (pr.branch_name) console.log(`${indent}Branch: ${pr.branch_name}`);\n    if (pr.reviewers?.length) console.log(`${indent}Reviewers: ${pr.reviewers.join(', ')}`);\n  }\n}\n\nfunction displayBacklogItem(item: any, index: number, options: BacklogOptions): void {\n  const typeEmoji = getTypeEmoji(item.type);\n  const statusEmoji = getStatusEmoji(item.status);\n  const priorityColor = getPriorityColor(item.priority);\n  const assigneeInfo = item.assignee ? ` @${item.assignee}` : '';\n  const tagsInfo = item.tags?.length ? ` [${item.tags.join(', ')}]` : '';\n\n  console.log(\n    `  ${(index + 1).toString().padStart(3, ' ')}. ${typeEmoji} ${statusEmoji} ${priorityColor(item.priority.toUpperCase())} ${item.title}${assigneeInfo}${tagsInfo} ${Formatter.dim(`(${item.id})`)}`\n  );\n\n  if (options.detailed) {\n    console.log(`      Modified: ${new Date(item.lastModified).toLocaleString()}`);\n    if (item.type === 'epic' && item.completion_percentage !== undefined) {\n      console.log(`      Completion: ${item.completion_percentage}%`);\n    }\n    if (item.type === 'pr' && item.pr_status) {\n      console.log(`      PR Status: ${item.pr_status}`);\n    }\n  }\n}\n\nasync function exportBacklog(data: any, filename: string): Promise<void> {\n  const exportData = {\n    exportTime: new Date().toISOString(),\n    summary: {\n      totalEpics: data.epics.length,\n      totalIssues: data.issues.length,\n      totalTasks: data.tasks.length,\n      totalPRs: data.prs.length,\n    },\n    data,\n  };\n\n  const fs = await import('node:fs');\n  fs.writeFileSync(filename, JSON.stringify(exportData, null, 2));\n  console.log(Formatter.success(`Backlog exported to ${filename}`));\n}\n\n// Helper functions\nfunction getItemType(id: string): string {\n  if (id.startsWith('EP-')) return 'epic';\n  if (id.startsWith('ISS-')) return 'issue';\n  if (id.startsWith('TSK-')) return 'task';\n  if (id.startsWith('PR-')) return 'pr';\n  return 'unknown';\n}\n\nfunction getTypeEmoji(type: string): string {\n  switch (type) {\n    case 'epic':\n      return '🎯';\n    case 'issue':\n      return '📋';\n    case 'task':\n      return '✅';\n    case 'pr':\n      return '🔄';\n    default:\n      return '📄';\n  }\n}\n\nfunction getStatusEmoji(status: string): string {\n  switch (status) {\n    case 'planning':\n      return '📝';\n    case 'active':\n      return '🔄';\n    case 'completed':\n      return '✅';\n    case 'archived':\n      return '📦';\n    default:\n      return '📄';\n  }\n}\n\nfunction getPriorityColor(priority: string): (text: string) => string {\n  switch (priority) {\n    case 'low':\n      return Formatter.dim;\n    case 'medium':\n      return (text: string) => text;\n    case 'high':\n      return Formatter.highlight;\n    case 'critical':\n      return Formatter.error;\n    default:\n      return (text: string) => text;\n  }\n}\n","/**\n * Epic Complete Command\n * Mark epics as completed with validation\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface CompleteOptions {\n  force?: boolean;\n  actualTokens?: number;\n  completionNotes?: string;\n  autoCompleteChildren?: boolean;\n  dryRun?: boolean;\n}\n\nexport function createEpicCompleteCommand(): Command {\n  const cmd = new Command('complete');\n\n  cmd\n    .description('Mark an epic as completed')\n    .argument('<epic-id>', 'epic ID to complete')\n    .option('-f, --force', 'complete even if issues/tasks are not completed')\n    .option('--actual-tokens <number>', 'set actual token usage')\n    .option('--completion-notes <text>', 'add completion notes')\n    .option('--auto-complete-children', 'automatically complete all child issues and tasks')\n    .option('--dry-run', 'show what would be completed without completing')\n    .action(async (epicId: string, options: CompleteOptions) => {\n      try {\n        await completeEpic(epicId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to complete epic: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function completeEpic(epicId: string, options: CompleteOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n  const parser = new FrontmatterParser();\n\n  // Get epic hierarchy\n  const hierarchy = relationshipManager.getEpicHierarchy(epicId);\n  if (!hierarchy) {\n    throw new Error(`Epic not found: ${epicId}`);\n  }\n\n  const { epic, issues, tasks } = hierarchy;\n\n  // Check if already completed\n  if (epic.status === 'completed') {\n    console.log(Formatter.warning(`Epic ${epicId} is already completed.`));\n    return;\n  }\n\n  // Check completion status of children\n  const incompleteIssues = issues.filter((issue) => issue.status !== 'completed');\n  const incompleteTasks = tasks.filter((task) => task.status !== 'completed');\n\n  // Show status\n  console.log(Formatter.info(`Epic: ${epic.title}`));\n  console.log(Formatter.info(`Current Status: ${epic.status}`));\n  console.log('');\n\n  // Show completion statistics\n  const issueCompletionRate =\n    issues.length > 0 ? ((issues.length - incompleteIssues.length) / issues.length) * 100 : 100;\n  const taskCompletionRate =\n    tasks.length > 0 ? ((tasks.length - incompleteTasks.length) / tasks.length) * 100 : 100;\n\n  console.log(Formatter.success('Completion Status:'));\n  console.log(\n    `  Issues: ${issues.length - incompleteIssues.length}/${issues.length} completed (${issueCompletionRate.toFixed(1)}%)`\n  );\n  console.log(\n    `  Tasks: ${tasks.length - incompleteTasks.length}/${tasks.length} completed (${taskCompletionRate.toFixed(1)}%)`\n  );\n  console.log('');\n\n  // Check if all children are completed\n  if (\n    (incompleteIssues.length > 0 || incompleteTasks.length > 0) &&\n    !options.force &&\n    !options.autoCompleteChildren\n  ) {\n    console.log(Formatter.warning('Epic has incomplete items:'));\n\n    if (incompleteIssues.length > 0) {\n      console.log(Formatter.info(`  Incomplete Issues (${incompleteIssues.length}):`));\n      for (const issue of incompleteIssues.slice(0, 5)) {\n        console.log(`    • ${issue.issue_id}: ${issue.title} [${issue.status}]`);\n      }\n      if (incompleteIssues.length > 5) {\n        console.log(`    ... and ${incompleteIssues.length - 5} more`);\n      }\n    }\n\n    if (incompleteTasks.length > 0) {\n      console.log(Formatter.info(`  Incomplete Tasks (${incompleteTasks.length}):`));\n      for (const task of incompleteTasks.slice(0, 5)) {\n        console.log(`    • ${task.task_id}: ${task.title} [${task.status}]`);\n      }\n      if (incompleteTasks.length > 5) {\n        console.log(`    ... and ${incompleteTasks.length - 5} more`);\n      }\n    }\n\n    console.log('');\n    console.log(Formatter.info('Options:'));\n    console.log('  - Use --force to complete anyway');\n    console.log('  - Use --auto-complete-children to complete all child items');\n    console.log('  - Complete child items manually first');\n\n    throw new Error(\n      'Cannot complete epic with incomplete children without --force or --auto-complete-children'\n    );\n  }\n\n  // Prepare updates\n  const updates: Record<string, unknown> = {\n    status: 'completed' as const,\n    completion_percentage: 100,\n    updated_date: new Date().toISOString(),\n  };\n\n  if (options.actualTokens !== undefined) {\n    updates.actual_tokens = parseInt(options.actualTokens.toString(), 10);\n  }\n\n  // Prepare child completions if auto-complete is enabled\n  const childUpdates = [];\n\n  if (options.autoCompleteChildren) {\n    for (const issue of incompleteIssues) {\n      childUpdates.push({\n        type: 'issue',\n        id: issue.issue_id,\n        filePath: issue.file_path,\n        updates: {\n          status: 'completed' as const,\n          completion_percentage: 100,\n          updated_date: new Date().toISOString(),\n        },\n      });\n    }\n\n    for (const task of incompleteTasks) {\n      childUpdates.push({\n        type: 'task',\n        id: task.task_id,\n        filePath: task.file_path,\n        updates: {\n          status: 'completed' as const,\n          updated_date: new Date().toISOString(),\n        },\n      });\n    }\n  }\n\n  // Show what would be updated\n  console.log(Formatter.info(`${options.dryRun ? 'Dry run - ' : ''}Would complete:`));\n  console.log(`  Epic: ${epic.epic_id} - ${epic.title}`);\n  console.log(`    Status: ${epic.status} → completed`);\n  console.log(`    Progress: ${epic.completion_percentage || 0}% → 100%`);\n\n  if (options.actualTokens !== undefined) {\n    console.log(`    Actual Tokens: ${epic.actual_tokens || 0} → ${options.actualTokens}`);\n  }\n\n  if (childUpdates.length > 0) {\n    console.log(`  Child Items (${childUpdates.length}):`);\n    for (const child of childUpdates) {\n      console.log(`    • ${child.id}: ${child.type} → completed`);\n    }\n  }\n\n  if (options.dryRun) {\n    return;\n  }\n\n  // Perform updates\n  try {\n    // Update epic\n    const updatedEpic = parser.updateFile(epic.file_path, updates);\n\n    // Update children if auto-complete is enabled\n    for (const child of childUpdates) {\n      parser.updateFile(child.filePath, child.updates);\n    }\n\n    // Refresh cache\n    relationshipManager.rebuildCache();\n\n    console.log(Formatter.success(`Epic completed successfully!`));\n    console.log(Formatter.info(`Epic ID: ${epicId}`));\n    console.log(Formatter.info(`Title: ${updatedEpic.title}`));\n    console.log(Formatter.info(`Status: ${updatedEpic.status}`));\n    console.log(Formatter.info(`Progress: ${updatedEpic.completion_percentage}%`));\n\n    if (updatedEpic.actual_tokens) {\n      console.log(Formatter.info(`Actual Tokens: ${updatedEpic.actual_tokens}`));\n\n      if (updatedEpic.estimated_tokens > 0) {\n        const efficiency = updatedEpic.actual_tokens / updatedEpic.estimated_tokens;\n        const efficiencyDisplay =\n          efficiency <= 1\n            ? Formatter.success(`${(efficiency * 100).toFixed(1)}%`)\n            : Formatter.warning(`${(efficiency * 100).toFixed(1)}%`);\n        console.log(Formatter.info(`Token Efficiency: ${efficiencyDisplay}`));\n      }\n    }\n\n    if (childUpdates.length > 0) {\n      console.log(Formatter.info(`Also completed ${childUpdates.length} child items.`));\n    }\n\n    console.log('');\n    console.log(Formatter.success('🎉 Epic completion summary:'));\n    console.log(`  • ${issues.length} issues total`);\n    console.log(`  • ${tasks.length} tasks total`);\n    console.log(`  • Completed on ${new Date().toLocaleDateString()}`);\n\n    if (options.completionNotes) {\n      console.log(`  • Notes: ${options.completionNotes}`);\n    }\n  } catch (error) {\n    throw new Error(\n      `Failed to update files: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n","/**\n * Simple ID Generator for AI-Trackdown Items\n * Generates unique IDs for Epics, Issues, and Tasks\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport class IdGenerator {\n  private countersPath: string;\n  private counters: {\n    epic: number;\n    issue: number;\n    task: number;\n    pr: number;\n  } = {\n    epic: 1,\n    issue: 1,\n    task: 1,\n    pr: 1,\n  };\n\n  constructor() {\n    // Use current working directory for now\n    this.countersPath = path.join(process.cwd(), '.ai-trackdown', 'counters.json');\n    this.loadCounters();\n  }\n\n  /**\n   * Generate unique Epic ID\n   */\n  public generateEpicId(_title: string): string {\n    const id = `EP-${this.counters.epic.toString().padStart(4, '0')}`;\n    this.counters.epic++;\n    this.saveCounters();\n    return id;\n  }\n\n  /**\n   * Generate unique Issue ID\n   */\n  public generateIssueId(_epic_id: string, _title: string): string {\n    const id = `ISS-${this.counters.issue.toString().padStart(4, '0')}`;\n    this.counters.issue++;\n    this.saveCounters();\n    return id;\n  }\n\n  /**\n   * Generate unique Task ID\n   */\n  public generateTaskId(_issue_id: string, _title: string): string {\n    const id = `TSK-${this.counters.task.toString().padStart(4, '0')}`;\n    this.counters.task++;\n    this.saveCounters();\n    return id;\n  }\n\n  /**\n   * Generate unique PR ID\n   */\n  public generatePRId(_issue_id: string, _title: string): string {\n    const id = `PR-${this.counters.pr.toString().padStart(4, '0')}`;\n    this.counters.pr++;\n    this.saveCounters();\n    return id;\n  }\n\n  /**\n   * Load counters from file\n   */\n  private loadCounters(): void {\n    try {\n      if (fs.existsSync(this.countersPath)) {\n        const data = fs.readFileSync(this.countersPath, 'utf8');\n        const loaded = JSON.parse(data);\n\n        this.counters.epic = Math.max(1, loaded.epic || 1);\n        this.counters.issue = Math.max(1, loaded.issue || 1);\n        this.counters.task = Math.max(1, loaded.task || 1);\n        this.counters.pr = Math.max(1, loaded.pr || 1);\n      }\n    } catch (_error) {\n      // Keep default values\n    }\n  }\n\n  /**\n   * Save counters to file\n   */\n  private saveCounters(): void {\n    try {\n      const dir = path.dirname(this.countersPath);\n      if (!fs.existsSync(dir)) {\n        fs.mkdirSync(dir, { recursive: true });\n      }\n\n      const data = JSON.stringify(this.counters, null, 2);\n      fs.writeFileSync(this.countersPath, data, 'utf8');\n    } catch (_error) {\n      // Silently fail\n    }\n  }\n}\n","/**\n * Epic Create Command\n * Creates new epics using YAML frontmatter system with project context support\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { EpicFrontmatter, ItemStatus, Priority } from '../../types/ai-trackdown.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { ProjectContextManager } from '../../utils/project-context-manager.js';\nimport { IdGenerator } from '../../utils/simple-id-generator.js';\nimport { TrackdownIndexManager } from '../../utils/trackdown-index-manager.js';\n\ninterface CreateOptions {\n  title?: string;\n  description?: string;\n  assignee?: string;\n  priority?: Priority;\n  status?: ItemStatus;\n  template?: string;\n  estimatedTokens?: number;\n  tags?: string;\n  milestone?: string;\n  project?: string;\n  dryRun?: boolean;\n}\n\nexport function createEpicCreateCommand(): Command {\n  const cmd = new Command('create');\n\n  cmd\n    .description('Create a new epic')\n    .argument('[title]', 'epic title (optional if using --title flag)')\n    .option('--title <text>', 'epic title (alternative to positional argument)')\n    .option('-d, --description <text>', 'epic description')\n    .option('-a, --assignee <username>', 'assignee username')\n    .option('-p, --priority <level>', 'priority level (low|medium|high|critical)', 'medium')\n    .option(\n      '-s, --status <status>',\n      'initial status (planning|active|completed|archived)',\n      'planning'\n    )\n    .option('-t, --template <name>', 'template to use', 'default')\n    .option('-e, --estimated-tokens <number>', 'estimated token usage', '0')\n    .option('--tags <tags>', 'comma-separated tags')\n    .option('-m, --milestone <name>', 'milestone name')\n    .option('--project <name>', 'project name (for multi-project mode)')\n    .option('--dry-run', 'show what would be created without creating')\n    .action(async (titleArg: string | undefined, options: CreateOptions) => {\n      try {\n        // Support both positional argument and --title flag\n        const title = titleArg || options.title;\n        if (!title) {\n          throw new Error(\n            'Epic title is required. Provide it as a positional argument or use --title flag.'\n          );\n        }\n        await createEpic(title, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to create epic: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function createEpic(title: string, options: CreateOptions): Promise<void> {\n  // Initialize project context manager\n  const contextManager = new ProjectContextManager();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Initialize project context\n  const projectContext = await contextManager.initializeContext(options.project);\n\n  // Ensure project structure exists\n  await contextManager.ensureProjectStructure();\n\n  // Get managers and paths from context\n  const configManager = projectContext.configManager;\n  const config = configManager.getConfig();\n  const paths = projectContext.paths;\n  const parser = new FrontmatterParser();\n  const idGenerator = new IdGenerator();\n\n  // Generate epic ID\n  const epicId = idGenerator.generateEpicId(title);\n\n  // Get template with fallback to bundled templates\n  const template = configManager.getTemplateWithFallback('epic', options.template || 'default');\n  if (!template) {\n    throw new Error(`Epic template '${options.template || 'default'}' not found`);\n  }\n\n  // Parse tags\n  const tags = options.tags ? options.tags.split(',').map((tag) => tag.trim()) : [];\n\n  // Create epic frontmatter with project context\n  const now = new Date().toISOString();\n  const epicFrontmatter: EpicFrontmatter = {\n    epic_id: epicId,\n    project_id: projectContext.context.currentProject || undefined,\n    title,\n    description: options.description || template.frontmatter_template.description || '',\n    status: options.status || 'planning',\n    priority: options.priority || 'medium',\n    assignee: options.assignee || config.default_assignee || 'unassigned',\n    created_date: now,\n    updated_date: now,\n    estimated_tokens: parseInt(options.estimatedTokens || '0', 10),\n    actual_tokens: 0,\n    ai_context: template.ai_context_defaults || config.ai_context_templates || [],\n    sync_status: 'local',\n    related_issues: [],\n    tags: tags.length > 0 ? tags : undefined,\n    milestone: options.milestone,\n    dependencies: [],\n    completion_percentage: 0,\n  };\n\n  // Generate content from template\n  const content = template.content_template\n    .replace(/\\{\\{title\\}\\}/g, title)\n    .replace(/\\{\\{description\\}\\}/g, epicFrontmatter.description);\n\n  // Create filename\n  const filename = `${epicId}-${title.toLowerCase().replace(/[^a-z0-9]+/g, '-')}${config.naming_conventions.file_extension}`;\n  const filePath = path.join(paths.epicsDir, filename);\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - Epic would be created with:'));\n    console.log(Formatter.debug(`File: ${filePath}`));\n    console.log(Formatter.debug(`Epic ID: ${epicId}`));\n    console.log(Formatter.debug(`Title: ${title}`));\n    console.log(Formatter.debug(`Status: ${epicFrontmatter.status}`));\n    console.log(Formatter.debug(`Priority: ${epicFrontmatter.priority}`));\n    console.log(Formatter.debug(`Assignee: ${epicFrontmatter.assignee}`));\n    if (epicFrontmatter.project_id) {\n      console.log(Formatter.debug(`Project: ${epicFrontmatter.project_id}`));\n    }\n    if (tags.length > 0) {\n      console.log(Formatter.debug(`Tags: ${tags.join(', ')}`));\n    }\n    if (options.milestone) {\n      console.log(Formatter.debug(`Milestone: ${options.milestone}`));\n    }\n    return;\n  }\n\n  // Check if file already exists\n  if (fs.existsSync(filePath)) {\n    throw new Error(`Epic file already exists: ${filePath}`);\n  }\n\n  // Write the epic file\n  parser.writeEpic(filePath, epicFrontmatter, content);\n\n  // Update the index for better performance\n  try {\n    const indexManager = new TrackdownIndexManager(config, paths.projectRoot, cliTasksDir);\n    await indexManager.updateItem('epic', epicId);\n  } catch (error) {\n    console.warn(\n      Formatter.warning(\n        `Index update failed (non-critical): ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n  }\n\n  console.log(Formatter.success(`Epic created successfully!`));\n  console.log(Formatter.info(`Epic ID: ${epicId}`));\n  console.log(Formatter.info(`File: ${filePath}`));\n  console.log(Formatter.info(`Title: ${title}`));\n  console.log(Formatter.info(`Status: ${epicFrontmatter.status}`));\n  console.log(Formatter.info(`Priority: ${epicFrontmatter.priority}`));\n  console.log(Formatter.info(`Assignee: ${epicFrontmatter.assignee}`));\n\n  if (epicFrontmatter.project_id) {\n    console.log(Formatter.info(`Project: ${epicFrontmatter.project_id}`));\n  }\n\n  if (tags.length > 0) {\n    console.log(Formatter.info(`Tags: ${tags.join(', ')}`));\n  }\n\n  if (options.milestone) {\n    console.log(Formatter.info(`Milestone: ${options.milestone}`));\n  }\n}\n","/**\n * Epic Delete Command\n * Delete epics with safety checks for related items\n */\n\nimport * as fs from 'node:fs';\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface DeleteOptions {\n  force?: boolean;\n  recursive?: boolean;\n  dryRun?: boolean;\n}\n\nexport function createEpicDeleteCommand(): Command {\n  const cmd = new Command('delete');\n\n  cmd\n    .description('Delete an epic')\n    .argument('<epic-id>', 'epic ID to delete')\n    .option('-f, --force', 'force deletion without confirmation')\n    .option('-r, --recursive', 'delete all related issues and tasks')\n    .option('--dry-run', 'show what would be deleted without deleting')\n    .action(async (epicId: string, options: DeleteOptions) => {\n      try {\n        await deleteEpic(epicId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to delete epic: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function deleteEpic(epicId: string, options: DeleteOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get epic hierarchy\n  const hierarchy = relationshipManager.getEpicHierarchy(epicId);\n  if (!hierarchy) {\n    throw new Error(`Epic not found: ${epicId}`);\n  }\n\n  const { epic, issues, tasks } = hierarchy;\n\n  // Check for related items\n  if ((issues.length > 0 || tasks.length > 0) && !options.recursive) {\n    console.log(Formatter.warning('Epic has related items:'));\n    console.log(`  Issues: ${issues.length}`);\n    console.log(`  Tasks: ${tasks.length}`);\n    console.log('');\n    console.log(\n      Formatter.info('Use --recursive to delete all related items, or reassign them first.')\n    );\n    console.log(Formatter.info('Related items:'));\n\n    if (issues.length > 0) {\n      console.log(Formatter.info('  Issues:'));\n      for (const issue of issues.slice(0, 5)) {\n        console.log(`    • ${issue.issue_id}: ${issue.title}`);\n      }\n      if (issues.length > 5) {\n        console.log(`    ... and ${issues.length - 5} more`);\n      }\n    }\n\n    if (tasks.length > 0) {\n      console.log(Formatter.info('  Tasks:'));\n      for (const task of tasks.slice(0, 5)) {\n        console.log(`    • ${task.task_id}: ${task.title}`);\n      }\n      if (tasks.length > 5) {\n        console.log(`    ... and ${tasks.length - 5} more`);\n      }\n    }\n\n    throw new Error('Cannot delete epic with related items without --recursive flag');\n  }\n\n  // Check for dependencies\n  const related = relationshipManager.getRelatedItems(epicId);\n  if (related.dependents.length > 0) {\n    console.log(Formatter.warning('Epic has items that depend on it:'));\n    for (const dependent of related.dependents) {\n      const depId = getItemId(dependent);\n      console.log(`  • ${depId}: ${dependent.title}`);\n    }\n\n    if (!options.force) {\n      throw new Error(\n        'Cannot delete epic with dependents. Use --force to override or remove dependencies first.'\n      );\n    }\n  }\n\n  // Prepare deletion list\n  const filesToDelete = [epic.file_path];\n\n  if (options.recursive) {\n    filesToDelete.push(...issues.map((issue) => issue.file_path));\n    filesToDelete.push(...tasks.map((task) => task.file_path));\n  }\n\n  // Show what would be deleted\n  console.log(Formatter.info(`${options.dryRun ? 'Dry run - ' : ''}Would delete:`));\n  console.log(`  Epic: ${epic.epic_id} - ${epic.title}`);\n  console.log(`    File: ${epic.file_path}`);\n\n  if (options.recursive && issues.length > 0) {\n    console.log(`  Issues (${issues.length}):`);\n    for (const issue of issues) {\n      console.log(`    • ${issue.issue_id}: ${issue.title}`);\n      console.log(`      File: ${issue.file_path}`);\n    }\n  }\n\n  if (options.recursive && tasks.length > 0) {\n    console.log(`  Tasks (${tasks.length}):`);\n    for (const task of tasks) {\n      console.log(`    • ${task.task_id}: ${task.title}`);\n      console.log(`      File: ${task.file_path}`);\n    }\n  }\n\n  console.log('');\n  console.log(Formatter.info(`Total files to delete: ${filesToDelete.length}`));\n\n  if (options.dryRun) {\n    return;\n  }\n\n  // Confirmation\n  if (!options.force) {\n    const readline = await import('node:readline');\n    const rl = readline.createInterface({\n      input: process.stdin,\n      output: process.stdout,\n    });\n\n    const answer = await new Promise<string>((resolve) => {\n      rl.question(\n        Formatter.warning(\n          'Are you sure you want to delete this epic and all related items? (yes/no): '\n        ),\n        resolve\n      );\n    });\n\n    rl.close();\n\n    if (answer.toLowerCase() !== 'yes' && answer.toLowerCase() !== 'y') {\n      console.log(Formatter.info('Deletion cancelled.'));\n      return;\n    }\n  }\n\n  // Perform deletion\n  let deletedCount = 0;\n  const errors: string[] = [];\n\n  for (const filePath of filesToDelete) {\n    try {\n      if (fs.existsSync(filePath)) {\n        fs.unlinkSync(filePath);\n        deletedCount++;\n      } else {\n        console.log(Formatter.warning(`File not found: ${filePath}`));\n      }\n    } catch (error) {\n      const errorMsg = `Failed to delete ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n      errors.push(errorMsg);\n      console.error(Formatter.error(errorMsg));\n    }\n  }\n\n  // Refresh cache after deletion\n  relationshipManager.rebuildCache();\n\n  // Report results\n  console.log(Formatter.success(`Epic deletion completed!`));\n  console.log(Formatter.info(`Files deleted: ${deletedCount}/${filesToDelete.length}`));\n\n  if (errors.length > 0) {\n    console.log(Formatter.warning(`Errors encountered: ${errors.length}`));\n    for (const error of errors) {\n      console.log(Formatter.error(`  • ${error}`));\n    }\n  }\n\n  console.log('');\n  console.log(Formatter.success(`Epic ${epicId} has been deleted.`));\n\n  if (options.recursive && (issues.length > 0 || tasks.length > 0)) {\n    console.log(Formatter.info(`Also deleted ${issues.length} issues and ${tasks.length} tasks.`));\n  }\n\n  if (related.dependents.length > 0) {\n    console.log(\n      Formatter.warning('Warning: Items that depended on this epic may need to be updated:')\n    );\n    for (const dependent of related.dependents) {\n      const depId = getItemId(dependent);\n      console.log(`  • ${depId}: ${dependent.title}`);\n    }\n  }\n}\n\nfunction getItemId(item: any): string {\n  if (item.epic_id && !item.issue_id && !item.task_id) return item.epic_id;\n  if (item.issue_id && !item.task_id) return item.issue_id;\n  if (item.task_id) return item.task_id;\n  return 'UNKNOWN';\n}\n","/**\n * State Migration Utilities\n * Handles migration from legacy status field to unified state field\n */\n\nimport {\n  AnyItemData,\n  BaseFrontmatter,\n  ItemStatus,\n  UnifiedState,\n  StateMetadata,\n  MigrationResult,\n  MigrationLogEntry,\n  ItemType,\n  StateManager\n} from '../types/ai-trackdown.js';\n\nexport class StateMigration {\n  /**\n   * Migrates a single item from legacy status to unified state\n   */\n  static migrateItem(\n    item: AnyItemData,\n    migrated_by: string = 'system'\n  ): { item: AnyItemData; success: boolean; error?: string } {\n    try {\n      // If item already has state field, no migration needed\n      if (item.state && item.state_metadata) {\n        return { item, success: true };\n      }\n\n      // Create new state based on legacy status\n      const new_state = StateManager.migrateStatusToState(item.status);\n      \n      // Create state metadata\n      const state_metadata: StateMetadata = {\n        transitioned_at: new Date().toISOString(),\n        transitioned_by: migrated_by,\n        previous_state: undefined, // No previous state for migration\n        automation_eligible: false, // Migration is manual\n        transition_reason: 'Legacy status migration',\n        automation_source: undefined\n      };\n\n      // Update item with new fields\n      const migrated_item: AnyItemData = {\n        ...item,\n        state: new_state,\n        state_metadata,\n        // Keep status field for backward compatibility\n        status: item.status\n      };\n\n      return { item: migrated_item, success: true };\n    } catch (error) {\n      return {\n        item,\n        success: false,\n        error: error instanceof Error ? error.message : 'Unknown migration error'\n      };\n    }\n  }\n\n  /**\n   * Migrates multiple items with detailed logging\n   */\n  static migrateItems(\n    items: AnyItemData[],\n    migrated_by: string = 'system'\n  ): MigrationResult {\n    const migration_log: MigrationLogEntry[] = [];\n    const migrated_items: AnyItemData[] = [];\n    let migrated_count = 0;\n    let failed_count = 0;\n    const errors: string[] = [];\n\n    for (const item of items) {\n      const result = this.migrateItem(item, migrated_by);\n      \n      const log_entry: MigrationLogEntry = {\n        item_id: this.getItemId(item),\n        item_type: this.getItemType(item),\n        old_status: item.status,\n        new_state: result.success ? result.item.state! : item.status as UnifiedState,\n        timestamp: new Date().toISOString(),\n        success: result.success,\n        error: result.error\n      };\n\n      migration_log.push(log_entry);\n\n      if (result.success) {\n        migrated_items.push(result.item);\n        migrated_count++;\n      } else {\n        migrated_items.push(item); // Keep original on failure\n        failed_count++;\n        if (result.error) {\n          errors.push(`${log_entry.item_id}: ${result.error}`);\n        }\n      }\n    }\n\n    return {\n      success: failed_count === 0,\n      migrated_count,\n      failed_count,\n      errors,\n      migration_log\n    };\n  }\n\n  /**\n   * Validates if migration is needed for an item\n   */\n  static needsMigration(item: BaseFrontmatter): boolean {\n    // Migration needed if no state field or no state metadata\n    return !item.state || !item.state_metadata;\n  }\n\n  /**\n   * Creates a migration preview without modifying items\n   */\n  static previewMigration(items: AnyItemData[]): {\n    total_items: number;\n    needs_migration: number;\n    already_migrated: number;\n    migration_preview: Array<{\n      item_id: string;\n      item_type: ItemType;\n      current_status: ItemStatus;\n      target_state: UnifiedState;\n      needs_migration: boolean;\n    }>;\n  } {\n    let needs_migration = 0;\n    let already_migrated = 0;\n\n    const migration_preview = items.map(item => {\n      const needs_mig = this.needsMigration(item);\n      if (needs_mig) {\n        needs_migration++;\n      } else {\n        already_migrated++;\n      }\n\n      return {\n        item_id: this.getItemId(item),\n        item_type: this.getItemType(item),\n        current_status: item.status,\n        target_state: StateManager.migrateStatusToState(item.status),\n        needs_migration: needs_mig\n      };\n    });\n\n    return {\n      total_items: items.length,\n      needs_migration,\n      already_migrated,\n      migration_preview\n    };\n  }\n\n  /**\n   * Validates migration results\n   */\n  static validateMigration(items: AnyItemData[]): {\n    valid: boolean;\n    errors: string[];\n    warnings: string[];\n    validation_details: Array<{\n      item_id: string;\n      has_state: boolean;\n      has_metadata: boolean;\n      metadata_valid: boolean;\n      backward_compatible: boolean;\n    }>;\n  } {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n    const validation_details = [];\n\n    for (const item of items) {\n      const has_state = !!item.state;\n      const has_metadata = !!item.state_metadata;\n      const backward_compatible = !!item.status; // Legacy field preserved\n\n      let metadata_valid = true;\n      if (has_metadata && item.state_metadata) {\n        const validation = StateManager.validateStateMetadata(item.state_metadata);\n        metadata_valid = validation.valid;\n        \n        if (!metadata_valid) {\n          errors.push(...validation.errors.map(e => \n            `${this.getItemId(item)}: ${e.message}`\n          ));\n        }\n        \n        warnings.push(...validation.warnings.map(w => \n          `${this.getItemId(item)}: ${w.message}`\n        ));\n      }\n\n      validation_details.push({\n        item_id: this.getItemId(item),\n        has_state,\n        has_metadata,\n        metadata_valid,\n        backward_compatible\n      });\n\n      if (!has_state) {\n        errors.push(`${this.getItemId(item)}: Missing state field`);\n      }\n\n      if (!has_metadata) {\n        errors.push(`${this.getItemId(item)}: Missing state metadata`);\n      }\n\n      if (!backward_compatible) {\n        warnings.push(`${this.getItemId(item)}: Legacy status field missing (backward compatibility affected)`);\n      }\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n      warnings,\n      validation_details\n    };\n  }\n\n  /**\n   * Creates a rollback plan for migration\n   */\n  static createRollbackPlan(migration_log: MigrationLogEntry[]): {\n    rollback_operations: Array<{\n      item_id: string;\n      action: 'remove_state_fields' | 'restore_status' | 'no_action';\n      original_status: ItemStatus;\n    }>;\n    rollback_summary: {\n      total_operations: number;\n      remove_state_fields: number;\n      restore_status: number;\n      no_action: number;\n    };\n  } {\n    const rollback_operations = migration_log.map(entry => {\n      let action: 'remove_state_fields' | 'restore_status' | 'no_action' = 'no_action';\n\n      if (entry.success) {\n        // Successfully migrated - need to remove state fields\n        action = 'remove_state_fields';\n      } else {\n        // Failed migration - restore original status if needed\n        action = 'restore_status';\n      }\n\n      return {\n        item_id: entry.item_id,\n        action,\n        original_status: entry.old_status\n      };\n    });\n\n    const rollback_summary = {\n      total_operations: rollback_operations.length,\n      remove_state_fields: rollback_operations.filter(op => op.action === 'remove_state_fields').length,\n      restore_status: rollback_operations.filter(op => op.action === 'restore_status').length,\n      no_action: rollback_operations.filter(op => op.action === 'no_action').length\n    };\n\n    return {\n      rollback_operations,\n      rollback_summary\n    };\n  }\n\n  // Helper methods for item identification\n  private static getItemId(item: AnyItemData): string {\n    if ('project_id' in item) return item.project_id;\n    if ('epic_id' in item) return item.epic_id;\n    if ('issue_id' in item) return item.issue_id;\n    if ('task_id' in item) return item.task_id;\n    if ('pr_id' in item) return item.pr_id;\n    throw new Error('Unknown item type - no valid ID field found');\n  }\n\n  private static getItemType(item: AnyItemData): ItemType {\n    if ('project_id' in item && 'type' in item) return 'project';\n    if ('epic_id' in item) return 'epic';\n    if ('issue_id' in item && 'pr_id' in item) return 'pr';\n    if ('issue_id' in item && 'task_id' in item) return 'task';\n    if ('issue_id' in item) return 'issue';\n    throw new Error('Unknown item type');\n  }\n}\n\n/**\n * State transition utilities for workflow management\n */\nexport class StateTransition {\n  /**\n   * Performs a state transition with validation\n   */\n  static transitionState(\n    item: AnyItemData,\n    to_state: UnifiedState,\n    transitioned_by: string,\n    transition_reason?: string,\n    reviewer?: string,\n    user_role?: string\n  ): { item: AnyItemData; success: boolean; errors: string[]; warnings: string[] } {\n    const current_state = StateManager.getEffectiveState(item);\n    \n    // Validate transition\n    const validation = StateManager.validateTransition(current_state, to_state, user_role);\n    \n    if (!validation.valid) {\n      return {\n        item,\n        success: false,\n        errors: validation.errors,\n        warnings: validation.warnings\n      };\n    }\n\n    // Create new state metadata\n    const state_metadata = StateManager.createStateMetadata(\n      transitioned_by,\n      current_state,\n      validation.warnings.length === 0, // automation_eligible if no warnings\n      undefined, // automation_source\n      transition_reason,\n      reviewer\n    );\n\n    // Update item\n    const updated_item: AnyItemData = {\n      ...item,\n      state: to_state,\n      state_metadata,\n      updated_date: new Date().toISOString()\n    };\n\n    return {\n      item: updated_item,\n      success: true,\n      errors: [],\n      warnings: validation.warnings\n    };\n  }\n\n  /**\n   * Gets available transitions for an item\n   */\n  static getAvailableTransitions(item: AnyItemData, user_role?: string): UnifiedState[] {\n    const current_state = StateManager.getEffectiveState(item);\n    const all_transitions = StateManager.getAllowedTransitions(current_state);\n    \n    // Filter by user role if specified\n    if (user_role) {\n      return all_transitions.filter(to_state => {\n        const validation = StateManager.validateTransition(current_state, to_state, user_role);\n        return validation.valid;\n      });\n    }\n    \n    return all_transitions;\n  }\n\n  /**\n   * Checks if an item can be automated\n   */\n  static canAutomate(item: AnyItemData, to_state: UnifiedState): boolean {\n    const current_state = StateManager.getEffectiveState(item);\n    const validation = StateManager.validateTransition(current_state, to_state);\n    \n    return validation.valid && validation.warnings.length === 0;\n  }\n}","/**\n * AI-Trackdown Data Models and Types\n * Hierarchical project management with YAML frontmatter support\n */\n\n// Core status and priority enums\nexport type ItemStatus = 'planning' | 'active' | 'completed' | 'archived';\nexport type Priority = 'low' | 'medium' | 'high' | 'critical';\nexport type SyncStatus = 'local' | 'synced' | 'conflict';\n\n// Resolution states for unified state management\nexport type ResolutionState = \n  | 'ready_for_engineering'\n  | 'ready_for_qa'\n  | 'ready_for_deployment'\n  | 'won_t_do'\n  | 'done';\n\n// Combined state type that includes both legacy status and resolution states\nexport type UnifiedState = ItemStatus | ResolutionState;\n\n// State metadata for tracking transitions and automation\nexport interface StateMetadata {\n  transitioned_at: string;\n  transitioned_by: string;\n  previous_state?: UnifiedState;\n  automation_eligible: boolean;\n  automation_source?: string;\n  transition_reason?: string;\n  reviewer?: string;\n}\n\n// GitHub sync configuration\nexport interface GitHubSyncConfig {\n  enabled: boolean;\n  repository: string; // Format: \"owner/repo\"\n  token: string; // GitHub personal access token\n  auto_sync: boolean;\n  conflict_resolution: 'most_recent' | 'local_wins' | 'remote_wins';\n  sync_labels: boolean;\n  sync_milestones: boolean;\n  sync_assignees: boolean;\n  rate_limit_delay: number; // Delay in milliseconds between API calls\n  batch_size: number; // Number of items to process in each batch\n}\n\n// Base frontmatter interface shared by all items\nexport interface BaseFrontmatter {\n  title: string;\n  description: string;\n  // Legacy status field (deprecated, use state instead)\n  status: ItemStatus;\n  // NEW: Unified state field for enhanced resolution tracking\n  state?: UnifiedState;\n  // NEW: State metadata for transition tracking\n  state_metadata?: StateMetadata;\n  priority: Priority;\n  assignee: string;\n  created_date: string;\n  updated_date: string;\n  estimated_tokens: number;\n  actual_tokens: number;\n  ai_context: string[];\n  sync_status: SyncStatus;\n  // GitHub sync metadata\n  github_id?: number; // GitHub issue ID\n  github_number?: number; // GitHub issue number\n  github_url?: string; // GitHub issue URL\n  github_updated_at?: string; // GitHub issue last updated timestamp\n  github_labels?: string[]; // GitHub labels\n  github_milestone?: string; // GitHub milestone\n  github_assignee?: string; // GitHub assignee\n}\n\n// Project frontmatter - Top-level container for multi-project management\nexport interface ProjectFrontmatter extends BaseFrontmatter {\n  project_id: string;\n  type: 'project';\n  name: string;\n  git_origin?: string;\n  git_branch?: string;\n  repository_url?: string;\n  clone_url?: string;\n  default_branch?: string;\n  languages?: string[];\n  framework?: string;\n  deployment_url?: string;\n  documentation_url?: string;\n  team_members?: string[];\n  license?: string;\n  completion_percentage?: number;\n  related_projects?: string[];\n  // Add properties for compatibility with AnyItemData operations\n  tags?: string[];\n  dependencies?: string[];\n  milestone?: string;\n}\n\n// Epic frontmatter - Top level organizational unit\nexport interface EpicFrontmatter extends BaseFrontmatter {\n  epic_id: string;\n  project_id?: string; // Optional for backward compatibility in single-project mode\n  related_issues: string[];\n  milestone?: string;\n  tags?: string[];\n  dependencies?: string[];\n  completion_percentage?: number;\n}\n\n// Issue frontmatter - Mid-level work units within epics\nexport interface IssueFrontmatter extends BaseFrontmatter {\n  issue_id: string;\n  project_id?: string; // Optional for backward compatibility in single-project mode\n  epic_id?: string;\n  related_tasks: string[];\n  related_prs?: string[];\n  related_issues?: string[];\n  milestone?: string;\n  tags?: string[];\n  dependencies?: string[];\n  completion_percentage?: number;\n  blocked_by?: string[];\n  blocks?: string[];\n}\n\n// Task frontmatter - Granular work items within issues\nexport interface TaskFrontmatter extends BaseFrontmatter {\n  task_id: string;\n  project_id?: string; // Optional for backward compatibility in single-project mode\n  issue_id: string;\n  epic_id?: string;\n  subtasks?: string[];\n  parent_task?: string;\n  tags?: string[];\n  dependencies?: string[];\n  time_estimate?: string;\n  time_spent?: string;\n  blocked_by?: string[];\n  blocks?: string[];\n  completion_percentage?: number;\n  milestone?: string;\n}\n\n// PR status specific to pull request lifecycle\nexport type PRStatus = 'draft' | 'open' | 'review' | 'approved' | 'merged' | 'closed';\n\n// PR frontmatter - Pull request tracking within issues\nexport interface PRFrontmatter extends BaseFrontmatter {\n  pr_id: string;\n  project_id?: string; // Optional for backward compatibility in single-project mode\n  issue_id: string;\n  epic_id?: string;\n  pr_status: PRStatus;\n  branch_name?: string;\n  source_branch?: string;\n  target_branch?: string;\n  repository_url?: string;\n  pr_number?: number;\n  reviewers?: string[];\n  approvals?: string[];\n  merge_commit?: string;\n  tags?: string[];\n  dependencies?: string[];\n  blocked_by?: string[];\n  blocks?: string[];\n  related_prs?: string[];\n  template_used?: string;\n}\n\n// Combined types with content\nexport interface ProjectData extends ProjectFrontmatter {\n  content: string;\n  file_path: string;\n}\n\nexport interface EpicData extends EpicFrontmatter {\n  content: string;\n  file_path: string;\n}\n\nexport interface IssueData extends IssueFrontmatter {\n  content: string;\n  file_path: string;\n}\n\nexport interface TaskData extends TaskFrontmatter {\n  content: string;\n  file_path: string;\n}\n\nexport interface PRData extends PRFrontmatter {\n  content: string;\n  file_path: string;\n}\n\n// Hierarchical relationship types\nexport interface ProjectHierarchy {\n  project: ProjectData;\n  epics: EpicData[];\n  issues: IssueData[];\n  tasks: TaskData[];\n  prs: PRData[];\n}\n\nexport interface EpicHierarchy {\n  epic: EpicData;\n  issues: IssueData[];\n  tasks: TaskData[];\n  prs: PRData[];\n  project?: ProjectData;\n}\n\nexport interface IssueHierarchy {\n  issue: IssueData;\n  tasks: TaskData[];\n  prs: PRData[];\n  epic?: EpicData;\n  project?: ProjectData;\n}\n\nexport interface PRHierarchy {\n  pr: PRData;\n  issue: IssueData;\n  epic?: EpicData;\n  project?: ProjectData;\n}\n\nexport interface TaskHierarchy {\n  task: TaskData;\n  issue: IssueData;\n  epic?: EpicData;\n  project?: ProjectData;\n}\n\n// Project configuration\nexport interface ProjectConfig {\n  name: string;\n  description?: string;\n  version: string;\n  // NEW: Single configurable root directory for all task types\n  tasks_directory?: string; // Default: \"tasks\"\n  // NEW: Project mode configuration\n  project_mode?: 'single' | 'multi'; // Default: auto-detect\n  structure: {\n    projects_dir?: string; // NEW: Projects directory for multi-project mode\n    epics_dir: string;\n    issues_dir: string;\n    tasks_dir: string;\n    templates_dir: string;\n    // NEW: PR directory for pull request tracking\n    prs_dir?: string;\n  };\n  naming_conventions: {\n    project_prefix?: string; // NEW: Project prefix\n    epic_prefix: string;\n    issue_prefix: string;\n    task_prefix: string;\n    pr_prefix?: string; // NEW: PR prefix\n    file_extension: string;\n  };\n  default_assignee?: string;\n  ai_context_templates?: string[];\n  automation?: {\n    auto_update_timestamps: boolean;\n    auto_calculate_tokens: boolean;\n    auto_sync_status: boolean;\n  };\n  // GitHub sync configuration\n  github_sync?: GitHubSyncConfig;\n}\n\n// Search and filter types\nexport interface SearchFilters {\n  status?: ItemStatus | ItemStatus[];\n  // NEW: Support filtering by unified state\n  state?: UnifiedState | UnifiedState[];\n  priority?: Priority | Priority[];\n  assignee?: string | string[];\n  tags?: string | string[];\n  created_after?: string;\n  created_before?: string;\n  updated_after?: string;\n  updated_before?: string;\n  content_search?: string;\n  ai_context_search?: string;\n  // NEW: Filter by state transition metadata\n  transitioned_by?: string | string[];\n  automation_eligible?: boolean;\n}\n\nexport interface SearchResult<T> {\n  items: T[];\n  total_count: number;\n  search_query: SearchFilters;\n  execution_time: number;\n}\n\n// Analytics and reporting types\nexport interface ProjectAnalytics {\n  total_epics: number;\n  total_issues: number;\n  total_tasks: number;\n  completion_rate: number;\n  status_breakdown: Record<ItemStatus, number>;\n  // NEW: State breakdown for resolution analytics\n  state_breakdown: Record<UnifiedState, number>;\n  priority_breakdown: Record<Priority, number>;\n  assignee_breakdown: Record<string, number>;\n  // NEW: Resolution analytics\n  resolution_analytics: {\n    ready_for_engineering: number;\n    ready_for_qa: number;\n    ready_for_deployment: number;\n    won_t_do: number;\n    done: number;\n    automation_rate: number;\n  };\n  token_usage: {\n    estimated_total: number;\n    actual_total: number;\n    efficiency_ratio: number;\n  };\n}\n\nexport interface TimelineEntry {\n  id: string;\n  type: 'project' | 'epic' | 'issue' | 'task' | 'pr';\n  action: 'created' | 'updated' | 'completed' | 'archived' | 'merged' | 'closed' | 'state_transitioned';\n  timestamp: string;\n  item_id: string;\n  changes?: Record<string, { from: any; to: any }>;\n  // NEW: State transition metadata\n  state_transition?: {\n    from_state: UnifiedState;\n    to_state: UnifiedState;\n    transitioned_by: string;\n    automation_eligible: boolean;\n    transition_reason?: string;\n  };\n}\n\n// Validation types\nexport interface ValidationError {\n  field: string;\n  message: string;\n  severity: 'error' | 'warning';\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: ValidationError[];\n  warnings: ValidationError[];\n}\n\n// File operation types\nexport interface FileOperation {\n  type: 'create' | 'update' | 'delete' | 'move';\n  source_path?: string;\n  target_path: string;\n  content?: string;\n  timestamp: string;\n}\n\nexport interface BatchOperation {\n  operations: FileOperation[];\n  description: string;\n  dry_run: boolean;\n}\n\n// Template types\nexport interface ItemTemplate {\n  type: 'project' | 'epic' | 'issue' | 'task' | 'pr';\n  name: string;\n  description: string;\n  frontmatter_template: Partial<BaseFrontmatter>;\n  content_template: string;\n  ai_context_defaults?: string[];\n}\n\n// Export union types for type safety\nexport type AnyFrontmatter =\n  | ProjectFrontmatter\n  | EpicFrontmatter\n  | IssueFrontmatter\n  | TaskFrontmatter\n  | PRFrontmatter;\nexport type AnyItemData = ProjectData | EpicData | IssueData | TaskData | PRData;\nexport type ItemType = 'project' | 'epic' | 'issue' | 'task' | 'pr';\n\n// Type guards\nexport function isProjectFrontmatter(item: AnyFrontmatter): item is ProjectFrontmatter {\n  return 'project_id' in item && 'type' in item && (item as any).type === 'project';\n}\n\nexport function isEpicFrontmatter(item: AnyFrontmatter): item is EpicFrontmatter {\n  return 'epic_id' in item && !('issue_id' in item) && !('task_id' in item) && !('pr_id' in item);\n}\n\nexport function isIssueFrontmatter(item: AnyFrontmatter): item is IssueFrontmatter {\n  return 'issue_id' in item && !('task_id' in item) && !('pr_id' in item);\n}\n\nexport function isTaskFrontmatter(item: AnyFrontmatter): item is TaskFrontmatter {\n  return 'task_id' in item && 'issue_id' in item && !('pr_id' in item);\n}\n\nexport function isPRFrontmatter(item: AnyFrontmatter): item is PRFrontmatter {\n  return 'pr_id' in item && 'issue_id' in item && !('task_id' in item);\n}\n\nexport function isProjectData(item: AnyItemData): item is ProjectData {\n  return isProjectFrontmatter(item);\n}\n\nexport function isEpicData(item: AnyItemData): item is EpicData {\n  return isEpicFrontmatter(item);\n}\n\nexport function isIssueData(item: AnyItemData): item is IssueData {\n  return isIssueFrontmatter(item);\n}\n\nexport function isTaskData(item: AnyItemData): item is TaskData {\n  return isTaskFrontmatter(item);\n}\n\nexport function isPRData(item: AnyItemData): item is PRData {\n  return isPRFrontmatter(item);\n}\n\n// Utility function to get the main ID from any item\nexport function getItemId(item: AnyItemData): string {\n  if (isProjectData(item)) return item.project_id;\n  if (isEpicData(item)) return item.epic_id;\n  if (isIssueData(item)) return item.issue_id;\n  if (isTaskData(item)) return item.task_id;\n  if (isPRData(item)) return item.pr_id;\n  throw new Error('Unknown item type');\n}\n\n// Utility type for ID generation\nexport interface IdGenerator {\n  generateProjectId(title: string): string;\n  generateEpicId(title: string): string;\n  generateIssueId(epic_id: string, title: string): string;\n  generateTaskId(issue_id: string, title: string): string;\n  generatePRId(issue_id: string, title: string): string;\n}\n\n// API response types for future consistency\nexport interface APIResponse<T> {\n  data: T;\n  success: boolean;\n  message?: string;\n  timestamp: string;\n}\n\nexport interface PaginatedResponse<T> {\n  data: T[];\n  pagination: {\n    page: number;\n    per_page: number;\n    total_count: number;\n    total_pages: number;\n    has_next: boolean;\n    has_prev: boolean;\n  };\n  success: boolean;\n  message?: string;\n  timestamp: string;\n}\n\n// GitHub sync types\nexport interface GitHubIssue {\n  id: number;\n  number: number;\n  title: string;\n  body: string;\n  state: 'open' | 'closed';\n  created_at: string;\n  updated_at: string;\n  assignee?: {\n    login: string;\n    id: number;\n  };\n  labels: Array<{\n    name: string;\n    color: string;\n  }>;\n  milestone?: {\n    title: string;\n    number: number;\n  };\n  html_url: string;\n}\n\nexport interface SyncOperation {\n  type: 'push' | 'pull' | 'conflict';\n  local_issue: IssueData;\n  github_issue?: GitHubIssue;\n  action: 'create' | 'update' | 'skip';\n  reason?: string;\n}\n\nexport interface SyncResult {\n  success: boolean;\n  operations: SyncOperation[];\n  errors: string[];\n  conflicts: SyncOperation[];\n  pushed_count: number;\n  pulled_count: number;\n  skipped_count: number;\n  conflict_count: number;\n}\n\nexport interface SyncStatusInfo {\n  enabled: boolean;\n  repository: string;\n  last_sync: string;\n  next_sync?: string;\n  auto_sync: boolean;\n  pending_operations: number;\n  conflicts: number;\n  sync_health: 'healthy' | 'degraded' | 'failed';\n}\n\n// State validation and transition types\nexport interface StateValidationRule {\n  from_state: UnifiedState;\n  to_state: UnifiedState;\n  required_role?: string;\n  automation_eligible: boolean;\n  validation_function?: (item: AnyItemData) => boolean;\n  prerequisites?: string[];\n}\n\nexport interface StateValidationResult {\n  valid: boolean;\n  errors: string[];\n  warnings: string[];\n  allowed_transitions: UnifiedState[];\n}\n\n// Migration types for converting legacy status to unified state\nexport interface MigrationMapping {\n  legacy_status: ItemStatus;\n  default_state: UnifiedState;\n  fallback_state: UnifiedState;\n  preserve_metadata: boolean;\n}\n\nexport interface MigrationResult {\n  success: boolean;\n  migrated_count: number;\n  failed_count: number;\n  errors: string[];\n  migration_log: MigrationLogEntry[];\n}\n\nexport interface MigrationLogEntry {\n  item_id: string;\n  item_type: ItemType;\n  old_status: ItemStatus;\n  new_state: UnifiedState;\n  timestamp: string;\n  success: boolean;\n  error?: string;\n}\n\n// Backward compatibility interfaces\nexport interface LegacyItem {\n  // Items that only have status field (pre-state implementation)\n  status: ItemStatus;\n  state?: never;\n  state_metadata?: never;\n}\n\nexport interface ModernItem {\n  // Items with both fields during transition period\n  status: ItemStatus; // Kept for backward compatibility\n  state: UnifiedState;\n  state_metadata: StateMetadata;\n}\n\nexport interface StateOnlyItem {\n  // Future items that only use state field\n  status?: never;\n  state: UnifiedState;\n  state_metadata: StateMetadata;\n}\n\n// Type for mixed environments during migration\nexport type MigrationCompatibleItem = LegacyItem | ModernItem | StateOnlyItem;\n\n// State management utility functions\n// Re-export StateTransition from utils for convenience\nexport { StateTransition } from '../utils/state-migration.js';\n\nexport class StateManager {\n  private static readonly STATE_TRANSITIONS: StateValidationRule[] = [\n    // Engineering workflow\n    { from_state: 'planning', to_state: 'ready_for_engineering', automation_eligible: true },\n    { from_state: 'active', to_state: 'ready_for_engineering', automation_eligible: true },\n    { from_state: 'ready_for_engineering', to_state: 'active', automation_eligible: false },\n    { from_state: 'ready_for_engineering', to_state: 'ready_for_qa', automation_eligible: true },\n    \n    // QA workflow\n    { from_state: 'ready_for_qa', to_state: 'active', automation_eligible: false },\n    { from_state: 'ready_for_qa', to_state: 'ready_for_deployment', automation_eligible: true },\n    { from_state: 'ready_for_qa', to_state: 'ready_for_engineering', automation_eligible: false },\n    \n    // Deployment workflow\n    { from_state: 'ready_for_deployment', to_state: 'done', automation_eligible: true },\n    { from_state: 'ready_for_deployment', to_state: 'ready_for_qa', automation_eligible: false },\n    \n    // Terminal states\n    { from_state: 'done', to_state: 'archived', automation_eligible: true },\n    { from_state: 'won_t_do', to_state: 'archived', automation_eligible: true },\n    \n    // Universal transitions\n    { from_state: 'planning', to_state: 'won_t_do', automation_eligible: false },\n    { from_state: 'active', to_state: 'won_t_do', automation_eligible: false },\n    { from_state: 'ready_for_engineering', to_state: 'won_t_do', automation_eligible: false },\n    { from_state: 'ready_for_qa', to_state: 'won_t_do', automation_eligible: false },\n    { from_state: 'ready_for_deployment', to_state: 'won_t_do', automation_eligible: false },\n  ];\n\n  private static readonly LEGACY_MIGRATION_MAP: MigrationMapping[] = [\n    { \n      legacy_status: 'planning', \n      default_state: 'planning', \n      fallback_state: 'planning',\n      preserve_metadata: false \n    },\n    { \n      legacy_status: 'active', \n      default_state: 'active', \n      fallback_state: 'active',\n      preserve_metadata: false \n    },\n    { \n      legacy_status: 'completed', \n      default_state: 'done', \n      fallback_state: 'ready_for_deployment',\n      preserve_metadata: false \n    },\n    { \n      legacy_status: 'archived', \n      default_state: 'archived', \n      fallback_state: 'archived',\n      preserve_metadata: true \n    },\n  ];\n\n  /**\n   * Validates if a state transition is allowed\n   */\n  static validateTransition(\n    from_state: UnifiedState, \n    to_state: UnifiedState, \n    user_role?: string\n  ): StateValidationResult {\n    const rule = this.STATE_TRANSITIONS.find(\n      r => r.from_state === from_state && r.to_state === to_state\n    );\n\n    if (!rule) {\n      return {\n        valid: false,\n        errors: [`Invalid transition from ${from_state} to ${to_state}`],\n        warnings: [],\n        allowed_transitions: this.getAllowedTransitions(from_state)\n      };\n    }\n\n    if (rule.required_role && user_role !== rule.required_role) {\n      return {\n        valid: false,\n        errors: [`Transition requires role: ${rule.required_role}`],\n        warnings: [],\n        allowed_transitions: this.getAllowedTransitions(from_state)\n      };\n    }\n\n    return {\n      valid: true,\n      errors: [],\n      warnings: rule.automation_eligible ? [] : ['Manual transition - automation not recommended'],\n      allowed_transitions: this.getAllowedTransitions(from_state)\n    };\n  }\n\n  /**\n   * Gets all allowed transitions from a given state\n   */\n  static getAllowedTransitions(from_state: UnifiedState): UnifiedState[] {\n    return this.STATE_TRANSITIONS\n      .filter(rule => rule.from_state === from_state)\n      .map(rule => rule.to_state);\n  }\n\n  /**\n   * Creates state metadata for a transition\n   */\n  static createStateMetadata(\n    transitioned_by: string,\n    previous_state?: UnifiedState,\n    automation_eligible: boolean = false,\n    automation_source?: string,\n    transition_reason?: string,\n    reviewer?: string\n  ): StateMetadata {\n    return {\n      transitioned_at: new Date().toISOString(),\n      transitioned_by,\n      previous_state,\n      automation_eligible,\n      automation_source,\n      transition_reason,\n      reviewer\n    };\n  }\n\n  /**\n   * Migrates legacy status to unified state\n   */\n  static migrateStatusToState(legacy_status: ItemStatus): UnifiedState {\n    const mapping = this.LEGACY_MIGRATION_MAP.find(m => m.legacy_status === legacy_status);\n    return mapping ? mapping.default_state : legacy_status as UnifiedState;\n  }\n\n  /**\n   * Gets the effective state from an item (handles backward compatibility)\n   */\n  static getEffectiveState(item: BaseFrontmatter): UnifiedState {\n    // If state field exists, use it\n    if (item.state) {\n      return item.state;\n    }\n    \n    // Fall back to migrating from status\n    return this.migrateStatusToState(item.status);\n  }\n\n  /**\n   * Checks if a state is a resolution state\n   */\n  static isResolutionState(state: UnifiedState): state is ResolutionState {\n    const resolutionStates: ResolutionState[] = [\n      'ready_for_engineering',\n      'ready_for_qa', \n      'ready_for_deployment',\n      'won_t_do',\n      'done'\n    ];\n    return resolutionStates.includes(state as ResolutionState);\n  }\n\n  /**\n   * Checks if a state is a legacy status\n   */\n  static isLegacyStatus(state: UnifiedState): state is ItemStatus {\n    const legacyStatuses: ItemStatus[] = ['planning', 'active', 'completed', 'archived'];\n    return legacyStatuses.includes(state as ItemStatus);\n  }\n\n  /**\n   * Validates state metadata completeness\n   */\n  static validateStateMetadata(metadata: StateMetadata): ValidationResult {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationError[] = [];\n\n    if (!metadata.transitioned_at) {\n      errors.push({\n        field: 'transitioned_at',\n        message: 'Transition timestamp is required',\n        severity: 'error'\n      });\n    }\n\n    if (!metadata.transitioned_by) {\n      errors.push({\n        field: 'transitioned_by',\n        message: 'Transition author is required',\n        severity: 'error'\n      });\n    }\n\n    if (metadata.automation_eligible && !metadata.automation_source) {\n      warnings.push({\n        field: 'automation_source',\n        message: 'Automation source recommended for eligible transitions',\n        severity: 'warning'\n      });\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n      warnings\n    };\n  }\n}\n","/**\n * Epic List Command\n * Lists epics with filtering and sorting options with project context support\n */\n\nimport { Command } from 'commander';\nimport type { ItemStatus, Priority, SearchFilters } from '../../types/ai-trackdown.js';\nimport { isEpicData } from '../../types/ai-trackdown.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { ProjectContextManager } from '../../utils/project-context-manager.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface ListOptions {\n  status?: string;\n  priority?: string;\n  assignee?: string;\n  tags?: string;\n  milestone?: string;\n  search?: string;\n  format?: 'table' | 'json' | 'yaml';\n  sortBy?: 'created' | 'updated' | 'title' | 'priority' | 'status';\n  sortOrder?: 'asc' | 'desc';\n  limit?: number;\n  showProgress?: boolean;\n  showIssues?: boolean;\n  showProject?: boolean;\n  active?: boolean;\n  project?: string;\n}\n\nexport function createEpicListCommand(): Command {\n  const cmd = new Command('list');\n\n  cmd\n    .description('List epics with filtering options')\n    .option('-s, --status <statuses>', 'filter by status (comma-separated)')\n    .option('-p, --priority <priorities>', 'filter by priority (comma-separated)')\n    .option('-a, --assignee <username>', 'filter by assignee')\n    .option('-t, --tags <tags>', 'filter by tags (comma-separated)')\n    .option('-m, --milestone <name>', 'filter by milestone')\n    .option('--search <term>', 'search in title, description, and content')\n    .option('-f, --format <type>', 'output format (table|json|yaml)', 'table')\n    .option('--sort-by <field>', 'sort by field (created|updated|title|priority|status)', 'created')\n    .option('--sort-order <order>', 'sort order (asc|desc)', 'desc')\n    .option('-l, --limit <number>', 'limit number of results')\n    .option('--show-progress', 'show completion progress')\n    .option('--show-issues', 'show related issues count')\n    .option('--show-project', 'show project information')\n    .option('--active', 'show only active epics (equivalent to --status active)')\n    .option('--project <name>', 'filter by project (for multi-project mode)')\n    .action(async (options: ListOptions) => {\n      try {\n        await listEpics(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to list epics: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function listEpics(options: ListOptions): Promise<void> {\n  // Initialize project context manager\n  const contextManager = new ProjectContextManager();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Initialize project context\n  const projectContext = await contextManager.initializeContext(options.project);\n\n  // Get managers and paths from context\n  const configManager = projectContext.configManager;\n  const config = configManager.getConfig();\n  const paths = projectContext.paths;\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Build search filters\n  const filters: SearchFilters = {};\n\n  if (options.active) {\n    filters.status = 'active';\n  } else if (options.status) {\n    const statuses = options.status.split(',').map((s) => s.trim()) as ItemStatus[];\n    filters.status = statuses.length === 1 ? statuses[0] : statuses;\n  }\n\n  if (options.priority) {\n    const priorities = options.priority.split(',').map((p) => p.trim()) as Priority[];\n    filters.priority = priorities.length === 1 ? priorities[0] : priorities;\n  }\n\n  if (options.assignee) {\n    filters.assignee = options.assignee;\n  }\n\n  if (options.tags) {\n    const tags = options.tags.split(',').map((t) => t.trim());\n    filters.tags = tags.length === 1 ? tags[0] : tags;\n  }\n\n  if (options.search) {\n    filters.content_search = options.search;\n  }\n\n  // Search for items\n  const searchResult = relationshipManager.search(filters);\n\n  // Filter to only epics\n  const epics = searchResult.items.filter(isEpicData);\n\n  // Additional filtering for milestone (not in search filters yet)\n  let filteredEpics = epics;\n  if (options.milestone) {\n    filteredEpics = epics.filter((epic) => epic.milestone === options.milestone);\n  }\n\n  // Sort epics\n  sortEpics(filteredEpics, options.sortBy || 'created', options.sortOrder || 'desc');\n\n  // Apply limit\n  if (options.limit) {\n    const limit = parseInt(options.limit.toString(), 10);\n    filteredEpics = filteredEpics.slice(0, limit);\n  }\n\n  // Output results\n  switch (options.format) {\n    case 'json':\n      console.log(JSON.stringify(filteredEpics, null, 2));\n      break;\n    case 'yaml': {\n      const YAML = await import('yaml');\n      console.log(YAML.stringify(filteredEpics));\n      break;\n    }\n    default:\n      await displayEpicsTable(filteredEpics, options, relationshipManager, projectContext);\n  }\n}\n\nfunction sortEpics(epics: any[], sortBy: string, sortOrder: string): void {\n  epics.sort((a, b) => {\n    let aVal: any, bVal: any;\n\n    switch (sortBy) {\n      case 'created':\n        aVal = new Date(a.created_date);\n        bVal = new Date(b.created_date);\n        break;\n      case 'updated':\n        aVal = new Date(a.updated_date);\n        bVal = new Date(b.updated_date);\n        break;\n      case 'title':\n        aVal = a.title.toLowerCase();\n        bVal = b.title.toLowerCase();\n        break;\n      case 'priority': {\n        const priorityOrder = { critical: 4, high: 3, medium: 2, low: 1 };\n        aVal = priorityOrder[a.priority as keyof typeof priorityOrder] || 0;\n        bVal = priorityOrder[b.priority as keyof typeof priorityOrder] || 0;\n        break;\n      }\n      case 'status': {\n        const statusOrder = { active: 4, planning: 3, completed: 2, archived: 1 };\n        aVal = statusOrder[a.status as keyof typeof statusOrder] || 0;\n        bVal = statusOrder[b.status as keyof typeof statusOrder] || 0;\n        break;\n      }\n      default:\n        aVal = a.created_date;\n        bVal = b.created_date;\n    }\n\n    if (sortOrder === 'asc') {\n      return aVal < bVal ? -1 : aVal > bVal ? 1 : 0;\n    } else {\n      return aVal > bVal ? -1 : aVal < bVal ? 1 : 0;\n    }\n  });\n}\n\nasync function displayEpicsTable(\n  epics: any[],\n  options: ListOptions,\n  relationshipManager: RelationshipManager,\n  projectContext: any\n): Promise<void> {\n  if (epics.length === 0) {\n    console.log(Formatter.info('No epics found matching the criteria.'));\n    return;\n  }\n\n  // Show project context information\n  if (projectContext.context.mode === 'multi' && projectContext.context.currentProject) {\n    console.log(Formatter.info(`📋 Project: ${projectContext.context.currentProject}`));\n  }\n\n  console.log(Formatter.success(`Found ${epics.length} epic(s):`));\n  console.log('');\n\n  // Table headers\n  const headers = ['ID', 'Title', 'Status', 'Priority', 'Assignee'];\n  if (options.showProject) headers.push('Project');\n  if (options.showProgress) headers.push('Progress');\n  if (options.showIssues) headers.push('Issues');\n  headers.push('Created');\n\n  // Calculate column widths\n  const colWidths = headers.map(() => 0);\n\n  // Prepare rows data\n  const rows: string[][] = [];\n\n  for (const epic of epics) {\n    const row = [\n      epic.epic_id,\n      truncateText(epic.title, 40),\n      getStatusDisplay(epic.status),\n      getPriorityDisplay(epic.priority),\n      epic.assignee,\n    ];\n\n    if (options.showProject) {\n      row.push(epic.project_id || '-');\n    }\n\n    if (options.showProgress) {\n      const progress = epic.completion_percentage || 0;\n      row.push(`${progress}%`);\n    }\n\n    if (options.showIssues) {\n      const hierarchy = relationshipManager.getEpicHierarchy(epic.epic_id);\n      const issueCount = hierarchy ? hierarchy.issues.length : 0;\n      row.push(issueCount.toString());\n    }\n\n    row.push(formatDate(epic.created_date));\n    rows.push(row);\n  }\n\n  // Calculate column widths\n  for (let i = 0; i < headers.length; i++) {\n    colWidths[i] = Math.max(headers[i].length, ...rows.map((row) => row[i].length));\n  }\n\n  // Print table\n  printTableRow(headers, colWidths, true);\n  printSeparator(colWidths);\n\n  for (const row of rows) {\n    printTableRow(row, colWidths, false);\n  }\n\n  console.log('');\n  console.log(Formatter.info(`Total: ${epics.length} epic(s)`));\n}\n\nfunction printTableRow(row: string[], widths: number[], isHeader: boolean): void {\n  const paddedRow = row.map((cell, i) => cell.padEnd(widths[i]));\n  const rowText = paddedRow.join(' | ');\n\n  if (isHeader) {\n    console.log(Formatter.info(rowText));\n  } else {\n    console.log(rowText);\n  }\n}\n\nfunction printSeparator(widths: number[]): void {\n  const separator = widths.map((width) => '-'.repeat(width)).join('-+-');\n  console.log(separator);\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n  if (text.length <= maxLength) return text;\n  return `${text.substring(0, maxLength - 3)}...`;\n}\n\nfunction getStatusDisplay(status: string): string {\n  const statusColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.success(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = statusColors[status] || ((text) => text);\n  return colorFn(status.toUpperCase());\n}\n\nfunction getPriorityDisplay(priority: string): string {\n  const priorityColors: Record<string, (text: string) => string> = {\n    critical: (text) => Formatter.error(text),\n    high: (text) => Formatter.warning(text),\n    medium: (text) => Formatter.info(text),\n    low: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = priorityColors[priority] || ((text) => text);\n  return colorFn(priority.toUpperCase());\n}\n\nfunction formatDate(dateString: string): string {\n  const date = new Date(dateString);\n  return date.toLocaleDateString();\n}\n","/**\n * Epic Show Command\n * Display detailed information about a specific epic with project context support\n */\n\nimport { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\nimport { ProjectContextManager } from '../../utils/project-context-manager.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface ShowOptions {\n  format?: 'detailed' | 'json' | 'yaml';\n  showIssues?: boolean;\n  showTasks?: boolean;\n  showContent?: boolean;\n  showRelated?: boolean;\n  project?: string;\n}\n\nexport function createEpicShowCommand(): Command {\n  const cmd = new Command('show');\n\n  cmd\n    .description('Show detailed information about an epic')\n    .argument('<epic-id>', 'epic ID to show')\n    .option('-f, --format <type>', 'output format (detailed|json|yaml)', 'detailed')\n    .option('--show-issues, --with-issues', 'show related issues')\n    .option('--show-tasks', 'show all related tasks')\n    .option('--show-content', 'show epic content/description')\n    .option('--show-related', 'show related epics and dependencies')\n    .option('--project <name>', 'specify project (for multi-project mode)')\n    .action(async (epicId: string, options: ShowOptions) => {\n      try {\n        await showEpic(epicId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to show epic: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function showEpic(epicId: string, options: ShowOptions): Promise<void> {\n  // Initialize project context manager\n  const contextManager = new ProjectContextManager();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Initialize project context\n  const projectContext = await contextManager.initializeContext(options.project);\n\n  // Get managers and paths from context\n  const configManager = projectContext.configManager;\n  const config = configManager.getConfig();\n\n  // Get absolute paths with CLI override\n  const paths = projectContext.paths;\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get epic hierarchy\n  const hierarchy = relationshipManager.getEpicHierarchy(epicId);\n  if (!hierarchy) {\n    // Provide helpful error message with suggestions\n    const cacheStats = relationshipManager.getCacheStats();\n    let errorMessage = `Epic not found: ${epicId}\\n`;\n    errorMessage += `\\nSearched in: ${paths.epicsDir}`;\n    errorMessage += `\\nFound ${cacheStats.epics} epics in this project.`;\n\n    if (cacheStats.epics > 0) {\n      errorMessage += `\\n\\nTry one of these commands:`;\n      errorMessage += `\\n  • aitrackdown epic list --active`;\n      errorMessage += `\\n  • aitrackdown epic show <epic-id> --project-dir <path>`;\n    } else {\n      errorMessage += `\\n\\nNo epics found. Create one with:`;\n      errorMessage += `\\n  • aitrackdown epic create \"Epic Title\"`;\n    }\n\n    throw new Error(errorMessage);\n  }\n\n  const { epic, issues, tasks } = hierarchy;\n\n  // Output based on format\n  switch (options.format) {\n    case 'json': {\n      const jsonOutput = {\n        epic,\n        ...(options.showIssues && { issues }),\n        ...(options.showTasks && { tasks }),\n      };\n      console.log(JSON.stringify(jsonOutput, null, 2));\n      break;\n    }\n\n    case 'yaml': {\n      const YAML = await import('yaml');\n      const yamlOutput = {\n        epic,\n        ...(options.showIssues && { issues }),\n        ...(options.showTasks && { tasks }),\n      };\n      console.log(YAML.stringify(yamlOutput));\n      break;\n    }\n\n    default:\n      await displayEpicDetailed(epic, issues, tasks, options, relationshipManager);\n  }\n}\n\nasync function displayEpicDetailed(\n  epic: any,\n  issues: any[],\n  tasks: any[],\n  options: ShowOptions,\n  relationshipManager: RelationshipManager\n): Promise<void> {\n  // Header\n  console.log(Formatter.success(`\\n=== EPIC: ${epic.title} ===`));\n  console.log(Formatter.info(`ID: ${epic.epic_id}`));\n  console.log('');\n\n  // Basic Information\n  console.log(Formatter.success('Basic Information:'));\n  console.log(`  Title: ${epic.title}`);\n  console.log(`  Status: ${getStatusDisplay(epic.status)}`);\n  console.log(`  Priority: ${getPriorityDisplay(epic.priority)}`);\n  console.log(`  Assignee: ${epic.assignee}`);\n\n  if (epic.milestone) {\n    console.log(`  Milestone: ${epic.milestone}`);\n  }\n\n  if (epic.tags && epic.tags.length > 0) {\n    console.log(`  Tags: ${epic.tags.join(', ')}`);\n  }\n\n  if (epic.completion_percentage !== undefined) {\n    console.log(`  Progress: ${epic.completion_percentage}%`);\n  }\n\n  console.log('');\n\n  // Dates and Tracking\n  console.log(Formatter.success('Tracking Information:'));\n  console.log(`  Created: ${formatDateTime(epic.created_date)}`);\n  console.log(`  Updated: ${formatDateTime(epic.updated_date)}`);\n  console.log(`  Estimated Tokens: ${epic.estimated_tokens || 0}`);\n  console.log(`  Actual Tokens: ${epic.actual_tokens || 0}`);\n\n  if (epic.estimated_tokens > 0) {\n    const efficiency = epic.actual_tokens / epic.estimated_tokens;\n    console.log(`  Token Efficiency: ${(efficiency * 100).toFixed(1)}%`);\n  }\n\n  console.log(`  Sync Status: ${epic.sync_status || 'local'}`);\n  console.log('');\n\n  // Description\n  if (epic.description) {\n    console.log(Formatter.success('Description:'));\n    console.log(`  ${epic.description}`);\n    console.log('');\n  }\n\n  // Content\n  if (options.showContent && epic.content) {\n    console.log(Formatter.success('Content:'));\n    console.log(epic.content);\n    console.log('');\n  }\n\n  // AI Context\n  if (epic.ai_context && epic.ai_context.length > 0) {\n    console.log(Formatter.success('AI Context:'));\n    for (const context of epic.ai_context) {\n      console.log(`  • ${context}`);\n    }\n    console.log('');\n  }\n\n  // Dependencies\n  if (epic.dependencies && epic.dependencies.length > 0) {\n    console.log(Formatter.success('Dependencies:'));\n    for (const dep of epic.dependencies) {\n      console.log(`  • ${dep}`);\n    }\n    console.log('');\n  }\n\n  // Related Issues\n  if (options.showIssues || issues.length > 0) {\n    console.log(Formatter.success(`Related Issues (${issues.length}):`));\n    if (issues.length === 0) {\n      console.log(Formatter.debug('  No issues found'));\n    } else {\n      for (const issue of issues) {\n        const statusIcon = getStatusIcon(issue.status);\n        const priorityColor = getPriorityDisplay(issue.priority);\n        console.log(`  ${statusIcon} ${issue.issue_id}: ${issue.title} [${priorityColor}]`);\n      }\n    }\n    console.log('');\n  }\n\n  // Related Tasks\n  if (options.showTasks || tasks.length > 0) {\n    console.log(Formatter.success(`All Related Tasks (${tasks.length}):`));\n    if (tasks.length === 0) {\n      console.log(Formatter.debug('  No tasks found'));\n    } else {\n      // Group tasks by issue\n      const tasksByIssue = tasks.reduce(\n        (acc, task) => {\n          if (!acc[task.issue_id]) acc[task.issue_id] = [];\n          acc[task.issue_id].push(task);\n          return acc;\n        },\n        {} as Record<string, any[]>\n      );\n\n      for (const [issueId, issueTasks] of Object.entries(tasksByIssue)) {\n        const issue = issues.find((i) => i.issue_id === issueId);\n        console.log(`  ${issue ? issue.title : issueId}:`);\n        for (const task of issueTasks) {\n          const statusIcon = getStatusIcon(task.status);\n          console.log(`    ${statusIcon} ${task.task_id}: ${task.title}`);\n        }\n      }\n    }\n    console.log('');\n  }\n\n  // Related Items (if requested)\n  if (options.showRelated) {\n    const related = relationshipManager.getRelatedItems(epic.epic_id);\n\n    if (related.dependencies.length > 0) {\n      console.log(Formatter.success('Dependencies:'));\n      for (const dep of related.dependencies) {\n        console.log(`  • ${getItemId(dep)}: ${dep.title}`);\n      }\n      console.log('');\n    }\n\n    if (related.dependents.length > 0) {\n      console.log(Formatter.success('Dependents:'));\n      for (const dep of related.dependents) {\n        console.log(`  • ${getItemId(dep)}: ${dep.title}`);\n      }\n      console.log('');\n    }\n  }\n\n  // File Information\n  console.log(Formatter.success('File Information:'));\n  console.log(`  Path: ${epic.file_path}`);\n  console.log('');\n\n  // Summary Statistics\n  const completedIssues = issues.filter((i) => i.status === 'completed').length;\n  const completedTasks = tasks.filter((t) => t.status === 'completed').length;\n\n  console.log(Formatter.success('Summary:'));\n  console.log(`  Issues: ${completedIssues}/${issues.length} completed`);\n  console.log(`  Tasks: ${completedTasks}/${tasks.length} completed`);\n\n  if (issues.length > 0) {\n    const issueCompletionRate = ((completedIssues / issues.length) * 100).toFixed(1);\n    console.log(`  Issue Completion: ${issueCompletionRate}%`);\n  }\n\n  if (tasks.length > 0) {\n    const taskCompletionRate = ((completedTasks / tasks.length) * 100).toFixed(1);\n    console.log(`  Task Completion: ${taskCompletionRate}%`);\n  }\n}\n\nfunction getStatusDisplay(status: string): string {\n  const statusColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.success(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = statusColors[status] || ((text) => text);\n  return colorFn(status.toUpperCase());\n}\n\nfunction getPriorityDisplay(priority: string): string {\n  const priorityColors: Record<string, (text: string) => string> = {\n    critical: (text) => Formatter.error(text),\n    high: (text) => Formatter.warning(text),\n    medium: (text) => Formatter.info(text),\n    low: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = priorityColors[priority] || ((text) => text);\n  return colorFn(priority.toUpperCase());\n}\n\nfunction getStatusIcon(status: string): string {\n  const icons: Record<string, string> = {\n    planning: '⏳',\n    active: '🔄',\n    completed: '✅',\n    archived: '📦',\n  };\n\n  return icons[status] || '❓';\n}\n\nfunction formatDateTime(dateString: string): string {\n  const date = new Date(dateString);\n  return date.toLocaleString();\n}\n\nfunction getItemId(item: any): string {\n  if (item.epic_id && !item.issue_id && !item.task_id) return item.epic_id;\n  if (item.issue_id && !item.task_id) return item.issue_id;\n  if (item.task_id) return item.task_id;\n  return 'UNKNOWN';\n}\n","/**\n * Epic Update Command\n * Update epic fields using YAML frontmatter system\n */\n\nimport { Command } from 'commander';\nimport type { EpicFrontmatter, ItemStatus, Priority } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface UpdateOptions {\n  title?: string;\n  description?: string;\n  status?: ItemStatus;\n  priority?: Priority;\n  assignee?: string;\n  addTags?: string;\n  removeTags?: string;\n  milestone?: string;\n  clearMilestone?: boolean;\n  estimatedTokens?: number;\n  actualTokens?: number;\n  addDependencies?: string;\n  removeDependencies?: string;\n  progress?: number;\n  dryRun?: boolean;\n}\n\nexport function createEpicUpdateCommand(): Command {\n  const cmd = new Command('update');\n\n  cmd\n    .description('Update an existing epic')\n    .argument('<epic-id>', 'epic ID to update')\n    .option('-t, --title <text>', 'update title')\n    .option('-d, --description <text>', 'update description')\n    .option('-s, --status <status>', 'update status (planning|active|completed|archived)')\n    .option('-p, --priority <level>', 'update priority (low|medium|high|critical)')\n    .option('-a, --assignee <username>', 'update assignee')\n    .option('--add-tags <tags>', 'add tags (comma-separated)')\n    .option('--remove-tags <tags>', 'remove tags (comma-separated)')\n    .option('-m, --milestone <name>', 'set milestone')\n    .option('--clear-milestone', 'clear milestone')\n    .option('-e, --estimated-tokens <number>', 'update estimated tokens')\n    .option('--actual-tokens <number>', 'update actual tokens')\n    .option('--add-dependencies <ids>', 'add dependencies (comma-separated IDs)')\n    .option('--remove-dependencies <ids>', 'remove dependencies (comma-separated IDs)')\n    .option('--progress <percentage>', 'update completion percentage (0-100)')\n    .option('--dry-run', 'show what would be updated without updating')\n    .action(async (epicId: string, options: UpdateOptions) => {\n      try {\n        await updateEpic(epicId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to update epic: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function updateEpic(epicId: string, options: UpdateOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n  const parser = new FrontmatterParser();\n\n  // Get epic hierarchy to find the epic\n  const hierarchy = relationshipManager.getEpicHierarchy(epicId);\n  if (!hierarchy) {\n    throw new Error(`Epic not found: ${epicId}`);\n  }\n\n  const epic = hierarchy.epic;\n  const filePath = epic.file_path;\n\n  // Build updates object\n  const updates: Partial<EpicFrontmatter> = {};\n\n  if (options.title) {\n    updates.title = options.title;\n  }\n\n  if (options.description) {\n    updates.description = options.description;\n  }\n\n  if (options.status) {\n    updates.status = options.status;\n  }\n\n  if (options.priority) {\n    updates.priority = options.priority;\n  }\n\n  if (options.assignee) {\n    updates.assignee = options.assignee;\n  }\n\n  if (options.milestone) {\n    updates.milestone = options.milestone;\n  }\n\n  if (options.clearMilestone) {\n    updates.milestone = undefined;\n  }\n\n  if (options.estimatedTokens !== undefined) {\n    updates.estimated_tokens = parseInt(options.estimatedTokens.toString(), 10);\n  }\n\n  if (options.actualTokens !== undefined) {\n    updates.actual_tokens = parseInt(options.actualTokens.toString(), 10);\n  }\n\n  if (options.progress !== undefined) {\n    const progress = parseInt(options.progress.toString(), 10);\n    if (progress < 0 || progress > 100) {\n      throw new Error('Progress must be between 0 and 100');\n    }\n    updates.completion_percentage = progress;\n  }\n\n  // Handle tags\n  if (options.addTags || options.removeTags) {\n    const currentTags = epic.tags || [];\n    let newTags = [...currentTags];\n\n    if (options.addTags) {\n      const tagsToAdd = options.addTags.split(',').map((tag) => tag.trim());\n      for (const tag of tagsToAdd) {\n        if (!newTags.includes(tag)) {\n          newTags.push(tag);\n        }\n      }\n    }\n\n    if (options.removeTags) {\n      const tagsToRemove = options.removeTags.split(',').map((tag) => tag.trim());\n      newTags = newTags.filter((tag) => !tagsToRemove.includes(tag));\n    }\n\n    updates.tags = newTags.length > 0 ? newTags : undefined;\n  }\n\n  // Handle dependencies\n  if (options.addDependencies || options.removeDependencies) {\n    const currentDeps = epic.dependencies || [];\n    let newDeps = [...currentDeps];\n\n    if (options.addDependencies) {\n      const depsToAdd = options.addDependencies.split(',').map((dep) => dep.trim());\n      for (const dep of depsToAdd) {\n        if (!newDeps.includes(dep)) {\n          newDeps.push(dep);\n        }\n      }\n    }\n\n    if (options.removeDependencies) {\n      const depsToRemove = options.removeDependencies.split(',').map((dep) => dep.trim());\n      newDeps = newDeps.filter((dep) => !depsToRemove.includes(dep));\n    }\n\n    updates.dependencies = newDeps.length > 0 ? newDeps : undefined;\n  }\n\n  // Show what would be updated (dry run or verbose)\n  if (options.dryRun || Object.keys(updates).length === 0) {\n    console.log(Formatter.info(`${options.dryRun ? 'Dry run - ' : ''}Epic would be updated:`));\n    console.log(Formatter.debug(`Epic ID: ${epicId}`));\n    console.log(Formatter.debug(`File: ${filePath}`));\n\n    if (Object.keys(updates).length === 0) {\n      console.log(Formatter.warning('No updates specified'));\n      return;\n    }\n\n    for (const [key, value] of Object.entries(updates)) {\n      const currentValue = epic[key as keyof typeof epic];\n      console.log(Formatter.debug(`${key}: ${currentValue} → ${value}`));\n    }\n\n    if (options.dryRun) {\n      return;\n    }\n  }\n\n  // Update the file\n  const updatedEpic = parser.updateFile(filePath, updates);\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`Epic updated successfully!`));\n  console.log(Formatter.info(`Epic ID: ${epicId}`));\n  console.log(Formatter.info(`File: ${filePath}`));\n\n  // Show what was changed\n  const changedFields = Object.keys(updates);\n  if (changedFields.length > 0) {\n    console.log(Formatter.info(`Updated fields: ${changedFields.join(', ')}`));\n  }\n\n  // Show current values\n  console.log('');\n  console.log(Formatter.success('Current values:'));\n  console.log(`  Title: ${updatedEpic.title}`);\n  console.log(`  Status: ${getStatusDisplay(updatedEpic.status)}`);\n  console.log(`  Priority: ${getPriorityDisplay(updatedEpic.priority)}`);\n  console.log(`  Assignee: ${updatedEpic.assignee}`);\n\n  if (updatedEpic.milestone) {\n    console.log(`  Milestone: ${updatedEpic.milestone}`);\n  }\n\n  if (updatedEpic.tags && updatedEpic.tags.length > 0) {\n    console.log(`  Tags: ${updatedEpic.tags.join(', ')}`);\n  }\n\n  if (updatedEpic.completion_percentage !== undefined) {\n    console.log(`  Progress: ${updatedEpic.completion_percentage}%`);\n  }\n\n  if (updatedEpic.dependencies && updatedEpic.dependencies.length > 0) {\n    console.log(`  Dependencies: ${updatedEpic.dependencies.join(', ')}`);\n  }\n\n  console.log(`  Estimated Tokens: ${updatedEpic.estimated_tokens || 0}`);\n  console.log(`  Actual Tokens: ${updatedEpic.actual_tokens || 0}`);\n}\n\nfunction getStatusDisplay(status: string): string {\n  const statusColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.success(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = statusColors[status] || ((text) => text);\n  return colorFn(status.toUpperCase());\n}\n\nfunction getPriorityDisplay(priority: string): string {\n  const priorityColors: Record<string, (text: string) => string> = {\n    critical: (text) => Formatter.error(text),\n    high: (text) => Formatter.warning(text),\n    medium: (text) => Formatter.info(text),\n    low: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = priorityColors[priority] || ((text) => text);\n  return colorFn(priority.toUpperCase());\n}\n","/**\n * Epic Command Group for AI-Trackdown\n * Top-level organizational unit commands\n */\n\nimport { Command } from 'commander';\nimport { createEpicCompleteCommand } from './epic/complete.js';\nimport { createEpicCreateCommand } from './epic/create.js';\nimport { createEpicDeleteCommand } from './epic/delete.js';\nimport { createEpicListCommand } from './epic/list.js';\nimport { createEpicShowCommand } from './epic/show.js';\nimport { createEpicUpdateCommand } from './epic/update.js';\n\nexport function createEpicCommand(): Command {\n  const cmd = new Command('epic');\n\n  cmd\n    .description('Manage epics (top-level organizational units)')\n    .addCommand(createEpicCreateCommand())\n    .addCommand(createEpicListCommand())\n    .addCommand(createEpicShowCommand())\n    .addCommand(createEpicUpdateCommand())\n    .addCommand(createEpicDeleteCommand())\n    .addCommand(createEpicCompleteCommand());\n\n  return cmd;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { extname, join } from 'node:path';\nimport YAML from 'yaml';\nimport type { TrackdownConfig } from '../types/index.js';\n\nconst DEFAULT_CONFIG: TrackdownConfig = {\n  projectName: 'aitrackdown-project',\n  outputFormat: 'md',\n  defaultAssignee: 'unassigned',\n  templatePath: './templates',\n  defaultTemplate: 'standard',\n  colorOutput: true,\n  defaultPriority: 'medium',\n  autoAssign: true,\n  rootDirectory: 'tasks', // NEW DEFAULT: tasks/ instead of trackdown/\n  migrateFromTrackdown: true, // NEW: enable migration by default\n  customFields: [],\n  integrations: {\n    git: true,\n    jira: false,\n    slack: false,\n  },\n  exportSettings: {\n    includeCompleted: true,\n    dateFormat: 'YYYY-MM-DD',\n    timezone: 'UTC',\n  },\n};\n\nexport class ConfigManager {\n  private configPath: string;\n  private config: TrackdownConfig;\n  private globalConfigPath: string;\n\n  constructor(configPath?: string) {\n    this.configPath = configPath || this.findConfigFile();\n    this.globalConfigPath = join(homedir(), '.trackdown', 'config.json');\n    this.config = this.loadConfig();\n  }\n\n  private findConfigFile(): string {\n    const possibleFiles = [\n      '.trackdownrc.json',\n      '.trackdownrc.yaml',\n      '.trackdownrc.yml',\n      'trackdown.config.json',\n      'trackdown.config.yaml',\n      'trackdown.config.yml',\n    ];\n\n    for (const file of possibleFiles) {\n      const fullPath = join(process.cwd(), file);\n      if (existsSync(fullPath)) {\n        return fullPath;\n      }\n    }\n\n    return join(process.cwd(), '.trackdownrc.json');\n  }\n\n  private loadConfig(): TrackdownConfig {\n    let config = { ...DEFAULT_CONFIG };\n\n    // Load global configuration first\n    config = { ...config, ...this.loadConfigFile(this.globalConfigPath) };\n\n    // Load local configuration (overrides global)\n    config = { ...config, ...this.loadConfigFile(this.configPath) };\n\n    // Load environment variables (overrides file configs)\n    config = { ...config, ...this.loadEnvironmentConfig() };\n\n    return config;\n  }\n\n  private loadConfigFile(path: string): Partial<TrackdownConfig> {\n    try {\n      if (!existsSync(path)) {\n        return {};\n      }\n\n      const fileContent = readFileSync(path, 'utf-8');\n      const ext = extname(path);\n\n      if (ext === '.yaml' || ext === '.yml') {\n        return YAML.parse(fileContent) as TrackdownConfig;\n      } else {\n        return JSON.parse(fileContent) as TrackdownConfig;\n      }\n    } catch (_error) {\n      console.warn(`Warning: Could not load config from ${path}, skipping`);\n      return {};\n    }\n  }\n\n  private loadEnvironmentConfig(): Partial<TrackdownConfig> {\n    const envConfig: Partial<TrackdownConfig> = {};\n\n    if (process.env.TRACKDOWN_PROJECT_NAME) {\n      envConfig.projectName = process.env.TRACKDOWN_PROJECT_NAME;\n    }\n\n    if (process.env.TRACKDOWN_OUTPUT_FORMAT) {\n      envConfig.outputFormat = process.env.TRACKDOWN_OUTPUT_FORMAT as any;\n    }\n\n    if (process.env.TRACKDOWN_DEFAULT_ASSIGNEE) {\n      envConfig.defaultAssignee = process.env.TRACKDOWN_DEFAULT_ASSIGNEE;\n    }\n\n    if (process.env.TRACKDOWN_DEFAULT_PRIORITY) {\n      envConfig.defaultPriority = process.env.TRACKDOWN_DEFAULT_PRIORITY as any;\n    }\n\n    if (process.env.TRACKDOWN_TEMPLATE_PATH) {\n      envConfig.templatePath = process.env.TRACKDOWN_TEMPLATE_PATH;\n    }\n\n    if (process.env.TRACKDOWN_COLOR_OUTPUT) {\n      envConfig.colorOutput = process.env.TRACKDOWN_COLOR_OUTPUT === 'true';\n    }\n\n    if (process.env.TRACKDOWN_AUTO_ASSIGN) {\n      envConfig.autoAssign = process.env.TRACKDOWN_AUTO_ASSIGN === 'true';\n    }\n\n    // NEW: Support for root directory environment variables\n    if (process.env.AITRACKDOWN_ROOT_DIR) {\n      envConfig.rootDirectory = process.env.AITRACKDOWN_ROOT_DIR;\n    }\n\n    if (process.env.AITRACKDOWN_TASKS_DIR) {\n      envConfig.rootDirectory = process.env.AITRACKDOWN_TASKS_DIR;\n    }\n\n    // NEW: Support for project mode environment variable\n    if (process.env.AITRACKDOWN_PROJECT_MODE) {\n      const mode = process.env.AITRACKDOWN_PROJECT_MODE;\n      if (mode === 'single' || mode === 'multi') {\n        (envConfig as any).project_mode = mode;\n      }\n    }\n\n    if (process.env.TRACKDOWN_MIGRATE_FROM_TRACKDOWN) {\n      envConfig.migrateFromTrackdown = process.env.TRACKDOWN_MIGRATE_FROM_TRACKDOWN === 'true';\n    }\n\n    return envConfig;\n  }\n\n  public getConfig(): TrackdownConfig {\n    return { ...this.config };\n  }\n\n  public updateConfig(updates: Partial<TrackdownConfig>): void {\n    this.config = { ...this.config, ...updates };\n    this.saveConfig();\n  }\n\n  public saveConfig(global = false): void {\n    const targetPath = global ? this.globalConfigPath : this.configPath;\n\n    try {\n      // Ensure directory exists\n      const dir = join(targetPath, '..');\n      if (!existsSync(dir)) {\n        mkdirSync(dir, { recursive: true });\n      }\n\n      const ext = extname(targetPath);\n      let content: string;\n\n      if (ext === '.yaml' || ext === '.yml') {\n        content = YAML.stringify(this.config);\n      } else {\n        content = JSON.stringify(this.config, null, 2);\n      }\n\n      writeFileSync(targetPath, content);\n    } catch (error) {\n      throw new Error(`Failed to save config to ${targetPath}: ${error}`);\n    }\n  }\n\n  public resetConfig(): void {\n    this.config = { ...DEFAULT_CONFIG };\n    this.saveConfig();\n  }\n\n  public getConfigPath(): string {\n    return this.configPath;\n  }\n\n  public getGlobalConfigPath(): string {\n    return this.globalConfigPath;\n  }\n\n  public validateConfig(): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    if (\n      this.config.outputFormat &&\n      !['json', 'yaml', 'md', 'csv', 'table'].includes(this.config.outputFormat)\n    ) {\n      errors.push(`Invalid output format: ${this.config.outputFormat}`);\n    }\n\n    if (\n      this.config.defaultPriority &&\n      !['low', 'medium', 'high', 'critical'].includes(this.config.defaultPriority)\n    ) {\n      errors.push(`Invalid default priority: ${this.config.defaultPriority}`);\n    }\n\n    if (this.config.customFields) {\n      this.config.customFields.forEach((field, index) => {\n        if (!field.name) {\n          errors.push(`Custom field at index ${index} is missing a name`);\n        }\n        if (!['string', 'number', 'boolean', 'date'].includes(field.type)) {\n          errors.push(`Custom field '${field.name}' has invalid type: ${field.type}`);\n        }\n      });\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n    };\n  }\n\n  public createDefaultConfigFile(format: 'json' | 'yaml' = 'json'): string {\n    const filename = format === 'yaml' ? '.trackdownrc.yaml' : '.trackdownrc.json';\n    const path = join(process.cwd(), filename);\n\n    this.configPath = path;\n    this.config = { ...DEFAULT_CONFIG };\n    this.saveConfig();\n\n    return path;\n  }\n}\n","import { existsSync } from 'node:fs';\nimport { extname } from 'node:path';\nimport type { CliError } from '../types/index.js';\n\nexport class ValidationError extends Error implements CliError {\n  public exitCode: number;\n  public suggestion?: string;\n  public command?: string;\n  public validOptions?: string[];\n\n  constructor(\n    message: string,\n    suggestion?: string,\n    exitCode = 1,\n    command?: string,\n    validOptions?: string[]\n  ) {\n    super(message);\n    this.name = 'ValidationError';\n    this.exitCode = exitCode;\n    this.suggestion = suggestion;\n    this.command = command;\n    this.validOptions = validOptions;\n  }\n}\n\nexport function validateRequired(value: string | undefined, fieldName: string): string {\n  if (!value || value.trim().length === 0) {\n    throw new ValidationError(\n      `${fieldName} is required`,\n      `Please provide a valid ${fieldName.toLowerCase()}`,\n      1,\n      undefined,\n      ['Provide a non-empty value', 'Check the command usage with --help']\n    );\n  }\n  return value.trim();\n}\n\nexport function validateProjectName(name: string): string {\n  const validName = validateRequired(name, 'Project name');\n\n  // Check for valid project name format\n  const nameRegex = /^[a-zA-Z0-9-_]+$/;\n  if (!nameRegex.test(validName)) {\n    throw new ValidationError(\n      'Project name contains invalid characters',\n      'Use only letters, numbers, hyphens, and underscores',\n      1,\n      'init',\n      ['my-project', 'awesome_tool', 'project123']\n    );\n  }\n\n  if (validName.length > 50) {\n    throw new ValidationError(\n      'Project name is too long',\n      'Please use a name with 50 characters or less',\n      1,\n      'init'\n    );\n  }\n\n  if (validName.length < 2) {\n    throw new ValidationError(\n      'Project name is too short',\n      'Please use a name with at least 2 characters',\n      1,\n      'init'\n    );\n  }\n\n  // Check for reserved names\n  const reservedNames = ['aitrackdown', 'atd', 'config', 'help', 'version'];\n  if (reservedNames.includes(validName.toLowerCase())) {\n    throw new ValidationError(\n      `Project name '${validName}' is reserved`,\n      'Please choose a different name',\n      1,\n      'init',\n      ['my-aitrackdown-project', 'awesome-tracker']\n    );\n  }\n\n  return validName;\n}\n\nexport function validatePriority(priority: string): 'low' | 'medium' | 'high' | 'critical' {\n  const normalizedPriority = priority.toLowerCase().trim();\n  const validPriorities = ['low', 'medium', 'high', 'critical'] as const;\n\n  if (!validPriorities.includes(normalizedPriority as (typeof validPriorities)[number])) {\n    throw new ValidationError(\n      `Invalid priority: ${priority}`,\n      `Valid priorities are: ${validPriorities.join(', ')}`,\n      1,\n      'track',\n      validPriorities.map((p) => `--priority ${p}`)\n    );\n  }\n\n  return normalizedPriority as 'low' | 'medium' | 'high' | 'critical';\n}\n\nexport function validateStatus(status: string): 'todo' | 'in-progress' | 'done' | 'blocked' {\n  const normalizedStatus = status.toLowerCase().trim();\n  const validStatuses = ['todo', 'in-progress', 'done', 'blocked'] as const;\n\n  if (!validStatuses.includes(normalizedStatus as (typeof validStatuses)[number])) {\n    throw new ValidationError(\n      `Invalid status: ${status}`,\n      `Valid statuses are: ${validStatuses.join(', ')}`,\n      1,\n      'status',\n      validStatuses.map((s) => `--filter status=${s}`)\n    );\n  }\n\n  return normalizedStatus as 'todo' | 'in-progress' | 'done' | 'blocked';\n}\n\nexport function validateOutputFormat(\n  format: string\n): 'json' | 'csv' | 'markdown' | 'yaml' | 'table' {\n  const normalizedFormat = format.toLowerCase().trim();\n  const validFormats = ['json', 'csv', 'markdown', 'yaml', 'table'] as const;\n\n  if (!validFormats.includes(normalizedFormat as (typeof validFormats)[number])) {\n    throw new ValidationError(\n      `Invalid output format: ${format}`,\n      `Valid formats are: ${validFormats.join(', ')}`,\n      1,\n      'export',\n      validFormats.map((f) => `--format ${f}`)\n    );\n  }\n\n  return normalizedFormat as 'json' | 'csv' | 'markdown' | 'yaml' | 'table';\n}\n\nexport function validateProjectType(type: string): 'cli' | 'web' | 'api' | 'mobile' | 'general' {\n  const normalizedType = type.toLowerCase().trim();\n  const validTypes = ['cli', 'web', 'api', 'mobile', 'general'] as const;\n\n  if (!validTypes.includes(normalizedType as (typeof validTypes)[number])) {\n    throw new ValidationError(\n      `Invalid project type: ${type}`,\n      `Valid types are: ${validTypes.join(', ')}`,\n      1,\n      'init',\n      validTypes.map((t) => `--type ${t}`)\n    );\n  }\n\n  return normalizedType as 'cli' | 'web' | 'api' | 'mobile' | 'general';\n}\n\nexport function validateFilePath(path: string, shouldExist = false): string {\n  const validPath = validateRequired(path, 'File path');\n\n  if (shouldExist && !existsSync(validPath)) {\n    throw new ValidationError(\n      `File does not exist: ${validPath}`,\n      'Please check the file path and try again',\n      1,\n      undefined,\n      ['Use an absolute path', 'Check file permissions', 'Ensure the file exists']\n    );\n  }\n\n  return validPath;\n}\n\nexport function validateConfigFormat(configPath: string): 'json' | 'yaml' {\n  const ext = extname(configPath);\n\n  if (ext === '.json') {\n    return 'json';\n  } else if (ext === '.yaml' || ext === '.yml') {\n    return 'yaml';\n  } else {\n    throw new ValidationError(\n      `Unsupported config file format: ${ext}`,\n      'Configuration files must be JSON (.json) or YAML (.yaml/.yml)',\n      1,\n      'init',\n      ['config.json', 'config.yaml', '.trackdownrc.json']\n    );\n  }\n}\n\nexport function validateStoryPoints(points: string): number {\n  const num = Number.parseFloat(points);\n\n  if (Number.isNaN(num)) {\n    throw new ValidationError(\n      `Invalid story points: ${points}`,\n      'Story points must be a valid number',\n      1,\n      'track',\n      ['1', '2.5', '5', '8', '13']\n    );\n  }\n\n  if (num < 0) {\n    throw new ValidationError(\n      'Story points cannot be negative',\n      'Please provide a positive number',\n      1,\n      'track'\n    );\n  }\n\n  if (num > 100) {\n    throw new ValidationError(\n      'Story points seem unusually high',\n      'Consider breaking this task into smaller pieces',\n      1,\n      'track'\n    );\n  }\n\n  return num;\n}\n\nexport function validateTags(tagsString: string): string[] {\n  if (!tagsString || tagsString.trim().length === 0) {\n    return [];\n  }\n\n  const tags = tagsString\n    .split(',')\n    .map((tag) => tag.trim())\n    .filter(Boolean);\n\n  // Validate individual tags\n  const tagRegex = /^[a-zA-Z0-9-_]+$/;\n  const invalidTags = tags.filter((tag) => !tagRegex.test(tag));\n\n  if (invalidTags.length > 0) {\n    throw new ValidationError(\n      `Invalid tags: ${invalidTags.join(', ')}`,\n      'Tags can only contain letters, numbers, hyphens, and underscores',\n      1,\n      'track',\n      ['bug', 'feature', 'urgent', 'frontend']\n    );\n  }\n\n  // Check for duplicate tags\n  const uniqueTags = [...new Set(tags)];\n  if (uniqueTags.length !== tags.length) {\n    throw new ValidationError('Duplicate tags detected', 'Each tag should be unique', 1, 'track');\n  }\n\n  return uniqueTags;\n}\n\nexport function validateAssignee(assignee: string): string {\n  const validAssignee = validateRequired(assignee, 'Assignee');\n\n  // Basic email validation if it looks like an email\n  if (validAssignee.includes('@')) {\n    const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n    if (!emailRegex.test(validAssignee)) {\n      throw new ValidationError(\n        `Invalid email format: ${validAssignee}`,\n        'Please provide a valid email address',\n        1,\n        'track',\n        ['user@example.com', 'john.doe@company.com']\n      );\n    }\n  }\n\n  // Username validation (letters, numbers, dots, hyphens, underscores)\n  const usernameRegex = /^[a-zA-Z0-9._-]+$/;\n  if (!usernameRegex.test(validAssignee)) {\n    throw new ValidationError(\n      `Invalid assignee format: ${validAssignee}`,\n      'Assignee can contain letters, numbers, dots, hyphens, and underscores',\n      1,\n      'track',\n      ['john.doe', 'user123', 'team-lead']\n    );\n  }\n\n  return validAssignee;\n}\n\nexport function validateId(id: string): string {\n  const validId = validateRequired(id, 'ID');\n\n  // ID format validation\n  const idRegex = /^[a-zA-Z0-9-_]+$/;\n  if (!idRegex.test(validId)) {\n    throw new ValidationError(\n      `Invalid ID format: ${validId}`,\n      'IDs can only contain letters, numbers, hyphens, and underscores',\n      1,\n      'track',\n      ['TD-123', 'feature-login', 'bug_fix_001']\n    );\n  }\n\n  if (validId.length > 50) {\n    throw new ValidationError(\n      'ID is too long',\n      'Please use an ID with 50 characters or less',\n      1,\n      'track'\n    );\n  }\n\n  if (validId.length < 2) {\n    throw new ValidationError(\n      'ID is too short',\n      'Please use an ID with at least 2 characters',\n      1,\n      'track'\n    );\n  }\n\n  return validId;\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport type { StatusFilter, TrackdownItem } from '../types/index.js';\nimport { ConfigManager } from '../utils/config.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { PathResolver } from '../utils/path-resolver.js';\nimport {\n  ValidationError,\n  validateAssignee,\n  validatePriority,\n  validateStatus,\n} from '../utils/validation.js';\n\nexport function createExportCommand(): Command {\n  const command = new Command('export');\n\n  command\n    .description('Export trackdown data with advanced filtering and professional output formats')\n    .option('-f, --format <type>', 'export format (json, yaml, csv, md, table)', 'json')\n    .option('-o, --output <file>', 'output file path (auto-generated if not specified)')\n    .option('--filter <expr>', 'advanced filter expression (e.g., \"status=todo,priority=high\")')\n    .option('-s, --status <status>', 'filter by status (todo, in-progress, done, blocked)')\n    .option('-p, --priority <priority>', 'filter by priority (low, medium, high, critical)')\n    .option('-a, --assignee <name>', 'filter by assignee name or email')\n    .option('-t, --tags <tags>', 'filter by tags (comma-separated)')\n    .option('-i, --id <id>', 'filter by specific item ID')\n    .option('--created-after <date>', 'show items created after date (YYYY-MM-DD)')\n    .option('--created-before <date>', 'show items created before date (YYYY-MM-DD)')\n    .option('--updated-after <date>', 'show items updated after date (YYYY-MM-DD)')\n    .option('--updated-before <date>', 'show items updated before date (YYYY-MM-DD)')\n    .option('--estimate-min <points>', 'minimum story points')\n    .option('--estimate-max <points>', 'maximum story points')\n    .option('--include-completed', 'include completed items', false)\n    .option('--include-descriptions', 'include full descriptions in export', true)\n    .option('--include-metadata', 'include export metadata and statistics', true)\n    .option(\n      '--sort <field>',\n      'sort by field (created, updated, priority, status, title)',\n      'updated'\n    )\n    .option('--order <direction>', 'sort order (asc, desc)', 'desc')\n    .option('--limit <count>', 'limit number of results exported')\n    .option('--interactive', 'interactive export configuration mode')\n    .option('--preview', 'preview export without saving to file')\n    .option('--compress', 'compress output for large exports')\n    .option('--template <name>', 'use export template (summary, detailed, minimal)')\n    .addHelpText(\n      'after',\n      `\nExamples:\n  $ aitrackdown export\n  $ aitrackdown export --format csv --output project-data.csv\n  $ aitrackdown export --filter \"status=todo,priority=high\" --format json\n  $ aitrackdown export --assignee john.doe --created-after 2024-01-01\n  $ aitrackdown export --tags backend,security --format yaml\n  $ aitrackdown export --interactive\n  $ aitrackdown export --preview --format table\n  $ aitrackdown export --template summary --format md\n\nExport Formats:\n  json          - Structured JSON with metadata\n  yaml          - YAML format for configuration management\n  csv           - Spreadsheet-compatible format\n  md            - Markdown format for documentation\n  table         - Human-readable table format\n\nFilter Expressions:\n  status=todo,blocked        - Multiple status values\n  priority=high              - Single priority\n  assignee=john.doe          - Specific assignee\n  tags=backend,api           - Items with any of these tags\n  estimate=5-13              - Story points range\n\nExport Templates:\n  summary       - Basic information only\n  detailed      - Full item details with descriptions\n  minimal       - ID, title, status only\n`\n    )\n    .action(\n      async (options?: {\n        format?: string;\n        output?: string;\n        filter?: string;\n        status?: string;\n        priority?: string;\n        assignee?: string;\n        tags?: string;\n        id?: string;\n        createdAfter?: string;\n        createdBefore?: string;\n        updatedAfter?: string;\n        updatedBefore?: string;\n        estimateMin?: string;\n        estimateMax?: string;\n        includeCompleted?: boolean;\n        includeDescriptions?: boolean;\n        includeMetadata?: boolean;\n        sort?: string;\n        order?: string;\n        limit?: string;\n        interactive?: boolean;\n        preview?: boolean;\n        compress?: boolean;\n        template?: string;\n      }) => {\n        try {\n          // Handle interactive mode first\n          let currentOptions = options;\n          if (options?.interactive) {\n            currentOptions = await runInteractiveExportMode(options);\n          }\n\n          // Get CLI root directory option\n          const parentCommand = command.parent;\n          const rootDirOption = parentCommand?.opts()?.rootDir || parentCommand?.opts()?.tasksDir;\n\n          const configManager = new ConfigManager();\n          const config = configManager.getConfig();\n\n          // Initialize path resolver with CLI override\n          const pathResolver = new PathResolver(configManager, rootDirOption);\n\n          const trackdownDir = join(process.cwd(), pathResolver.getRootDirectory());\n\n          if (!existsSync(trackdownDir)) {\n            // Check for migration scenario\n            if (pathResolver.shouldMigrate()) {\n              pathResolver.showMigrationWarning();\n              console.log('\\nMigration commands:');\n              pathResolver.getMigrationCommands().forEach((cmd) => {\n                console.log(Formatter.highlight(cmd));\n              });\n              process.exit(1);\n            }\n\n            console.error(\n              Formatter.error(\n                `No ${pathResolver.getRootDirectory()} project found in current directory`\n              )\n            );\n            console.log(Formatter.info('Run \"aitrackdown init\" to initialize a new project'));\n            process.exit(1);\n          }\n\n          // Validate and process options with professional UX\n          const exportConfig = await validateAndProcessExportOptions(currentOptions, config);\n\n          console.log(Formatter.header('🚀 Starting Export Process'));\n\n          const spinner = ora('Collecting trackdown items...').start();\n\n          try {\n            // Collect all items\n            const items = collectItems(trackdownDir, exportConfig.includeCompleted, pathResolver);\n            spinner.text = `Processing ${items.length} items...`;\n\n            // Parse and apply filters\n            const filters = parseAdvancedFilters(exportConfig);\n            const filteredItems = applyAdvancedFilters(items, filters);\n\n            if (filteredItems.length === 0) {\n              spinner.fail('No items match the specified filters');\n              console.log(\n                Formatter.info('Try adjusting your filter criteria or use --interactive mode')\n              );\n              return;\n            }\n\n            // Sort items\n            const sortedItems = sortItems(filteredItems, exportConfig.sort, exportConfig.order);\n\n            // Apply limit if specified\n            const finalItems = exportConfig.limit\n              ? sortedItems.slice(0, parseInt(exportConfig.limit))\n              : sortedItems;\n\n            spinner.succeed(`Prepared ${finalItems.length} items for export`);\n\n            // Preview mode - display without saving\n            if (exportConfig.preview) {\n              console.log(Formatter.header('📋 Export Preview'));\n              await displayExportPreview(finalItems, exportConfig);\n              return;\n            }\n\n            // Generate export data\n            const progressSpinner = ora('Generating export data...').start();\n            const exportedData = await generateAdvancedExportData(\n              finalItems,\n              exportConfig,\n              config.projectName\n            );\n\n            // Handle output\n            if (exportConfig.output) {\n              const outputPath = resolveOutputPath(exportConfig.output, trackdownDir, pathResolver);\n              ensureDirectoryExists(outputPath);\n\n              progressSpinner.text = 'Writing export file...';\n              writeFileSync(outputPath, exportedData);\n              progressSpinner.succeed(`Export saved to ${outputPath}`);\n\n              // Display comprehensive export summary\n              displayExportSummary(finalItems, exportConfig, outputPath);\n            } else {\n              progressSpinner.succeed('Export data generated');\n              console.log(exportedData);\n            }\n          } catch (processingError) {\n            spinner.fail('Export processing failed');\n            throw processingError;\n          }\n        } catch (error) {\n          console.error(\n            Formatter.error(\n              `Export failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n            )\n          );\n\n          if (error instanceof ValidationError) {\n            console.log(\n              Formatter.info('Use --help for usage information or --interactive for guided setup')\n            );\n          }\n\n          process.exit(1);\n        }\n      }\n    );\n\n  return command;\n}\n\n// ===== ENHANCED PHASE 2 FUNCTIONS =====\n\nasync function runInteractiveExportMode(currentOptions: any): Promise<any> {\n  console.log(Formatter.header('📤 Interactive Export Configuration'));\n\n  const answers = await inquirer.prompt([\n    {\n      type: 'list',\n      name: 'format',\n      message: 'Select export format:',\n      choices: [\n        { name: 'JSON - Structured data with metadata', value: 'json' },\n        { name: 'CSV - Spreadsheet compatible', value: 'csv' },\n        { name: 'YAML - Configuration friendly', value: 'yaml' },\n        { name: 'Markdown - Documentation format', value: 'md' },\n        { name: 'Table - Human readable', value: 'table' },\n      ],\n      default: currentOptions?.format || 'json',\n    },\n    {\n      type: 'input',\n      name: 'output',\n      message: 'Output file path (leave empty for auto-generated):',\n      default: currentOptions?.output || '',\n    },\n    {\n      type: 'list',\n      name: 'template',\n      message: 'Choose export template:',\n      choices: [\n        { name: 'Detailed - Full information with descriptions', value: 'detailed' },\n        { name: 'Summary - Essential information only', value: 'summary' },\n        { name: 'Minimal - ID, title, status only', value: 'minimal' },\n      ],\n      default: currentOptions?.template || 'detailed',\n    },\n    {\n      type: 'checkbox',\n      name: 'statusFilter',\n      message: 'Filter by status (select multiple):',\n      choices: [\n        { name: 'Todo', value: 'todo' },\n        { name: 'In Progress', value: 'in-progress' },\n        { name: 'Blocked', value: 'blocked' },\n        { name: 'Done', value: 'done' },\n      ],\n      default: currentOptions?.status ? [currentOptions.status] : [],\n    },\n    {\n      type: 'checkbox',\n      name: 'priorityFilter',\n      message: 'Filter by priority (select multiple):',\n      choices: [\n        { name: 'Critical', value: 'critical' },\n        { name: 'High', value: 'high' },\n        { name: 'Medium', value: 'medium' },\n        { name: 'Low', value: 'low' },\n      ],\n      default: currentOptions?.priority ? [currentOptions.priority] : [],\n    },\n    {\n      type: 'input',\n      name: 'assignee',\n      message: 'Filter by assignee (leave empty for all):',\n      default: currentOptions?.assignee || '',\n    },\n    {\n      type: 'input',\n      name: 'tags',\n      message: 'Filter by tags (comma-separated):',\n      default: currentOptions?.tags || '',\n    },\n    {\n      type: 'input',\n      name: 'limit',\n      message: 'Limit number of items (leave empty for all):',\n      default: currentOptions?.limit || '',\n    },\n    {\n      type: 'list',\n      name: 'sort',\n      message: 'Sort by:',\n      choices: [\n        { name: 'Last Updated', value: 'updated' },\n        { name: 'Created Date', value: 'created' },\n        { name: 'Priority', value: 'priority' },\n        { name: 'Status', value: 'status' },\n        { name: 'Title', value: 'title' },\n      ],\n      default: currentOptions?.sort || 'updated',\n    },\n    {\n      type: 'list',\n      name: 'order',\n      message: 'Sort order:',\n      choices: [\n        { name: 'Descending (newest first)', value: 'desc' },\n        { name: 'Ascending (oldest first)', value: 'asc' },\n      ],\n      default: currentOptions?.order || 'desc',\n    },\n    {\n      type: 'confirm',\n      name: 'includeCompleted',\n      message: 'Include completed items?',\n      default: currentOptions?.includeCompleted || false,\n    },\n    {\n      type: 'confirm',\n      name: 'includeDescriptions',\n      message: 'Include item descriptions?',\n      default: currentOptions?.includeDescriptions !== false,\n    },\n    {\n      type: 'confirm',\n      name: 'includeMetadata',\n      message: 'Include export metadata and statistics?',\n      default: currentOptions?.includeMetadata !== false,\n    },\n    {\n      type: 'confirm',\n      name: 'preview',\n      message: 'Preview export without saving?',\n      default: currentOptions?.preview || false,\n    },\n  ]);\n\n  // Process answers\n  const processedOptions = {\n    ...currentOptions,\n    format: answers.format,\n    output: answers.output || undefined,\n    template: answers.template,\n    status: answers.statusFilter.length > 0 ? answers.statusFilter.join(',') : undefined,\n    priority: answers.priorityFilter.length > 0 ? answers.priorityFilter.join(',') : undefined,\n    assignee: answers.assignee || undefined,\n    tags: answers.tags || undefined,\n    limit: answers.limit || undefined,\n    sort: answers.sort,\n    order: answers.order,\n    includeCompleted: answers.includeCompleted,\n    includeDescriptions: answers.includeDescriptions,\n    includeMetadata: answers.includeMetadata,\n    preview: answers.preview,\n  };\n\n  console.log(Formatter.success('Export configuration completed!'));\n  return processedOptions;\n}\n\nasync function validateAndProcessExportOptions(options: any, config: any): Promise<any> {\n  const exportConfig = {\n    format: options?.format || config.outputFormat || 'json',\n    output: options?.output,\n    includeCompleted: options?.includeCompleted || false,\n    includeDescriptions: options?.includeDescriptions !== false,\n    includeMetadata: options?.includeMetadata !== false,\n    sort: options?.sort || 'updated',\n    order: options?.order || 'desc',\n    limit: options?.limit,\n    template: options?.template || 'detailed',\n    preview: options?.preview || false,\n    compress: options?.compress || false,\n    ...options,\n  };\n\n  // Validate format\n  const supportedFormats = ['json', 'yaml', 'csv', 'md', 'table'];\n  if (!supportedFormats.includes(exportConfig.format)) {\n    throw new ValidationError(\n      `Unsupported format: ${exportConfig.format}. Supported: ${supportedFormats.join(', ')}`\n    );\n  }\n\n  // Validate template\n  const supportedTemplates = ['summary', 'detailed', 'minimal'];\n  if (exportConfig.template && !supportedTemplates.includes(exportConfig.template)) {\n    throw new ValidationError(\n      `Unsupported template: ${exportConfig.template}. Supported: ${supportedTemplates.join(', ')}`\n    );\n  }\n\n  // Validate status if provided\n  if (exportConfig.status) {\n    const statuses = exportConfig.status.split(',').map((s: string) => s.trim());\n    for (const status of statuses) {\n      validateStatus(status);\n    }\n  }\n\n  // Validate priority if provided\n  if (exportConfig.priority) {\n    const priorities = exportConfig.priority.split(',').map((p: string) => p.trim());\n    for (const priority of priorities) {\n      validatePriority(priority);\n    }\n  }\n\n  // Validate assignee if provided\n  if (exportConfig.assignee) {\n    validateAssignee(exportConfig.assignee);\n  }\n\n  // Validate limit if provided\n  if (exportConfig.limit) {\n    const limit = parseInt(exportConfig.limit);\n    if (Number.isNaN(limit) || limit <= 0) {\n      throw new ValidationError('Limit must be a positive number');\n    }\n  }\n\n  // Validate sort field\n  const validSortFields = ['created', 'updated', 'priority', 'status', 'title'];\n  if (!validSortFields.includes(exportConfig.sort)) {\n    throw new ValidationError(\n      `Invalid sort field: ${exportConfig.sort}. Valid: ${validSortFields.join(', ')}`\n    );\n  }\n\n  // Validate sort order\n  if (!['asc', 'desc'].includes(exportConfig.order)) {\n    throw new ValidationError('Sort order must be \"asc\" or \"desc\"');\n  }\n\n  return exportConfig;\n}\n\nfunction parseAdvancedFilters(options: any): StatusFilter {\n  const filters: StatusFilter = {};\n\n  // Parse filter expression if provided\n  if (options.filter) {\n    const filterParts = options.filter.split(',');\n    for (const part of filterParts) {\n      const [key, value] = part.split('=');\n      if (key && value) {\n        const trimmedKey = key.trim();\n        const trimmedValue = value.trim();\n\n        switch (trimmedKey) {\n          case 'status':\n            filters.status = trimmedValue.split(',').map((s) => s.trim());\n            break;\n          case 'priority':\n            filters.priority = trimmedValue.split(',').map((p) => p.trim());\n            break;\n          case 'assignee':\n            filters.assignee = trimmedValue;\n            break;\n          case 'tags':\n            filters.tags = trimmedValue.split(',').map((t) => t.trim());\n            break;\n          case 'estimate':\n            if (trimmedValue.includes('-')) {\n              const [min, max] = trimmedValue.split('-').map((n) => parseInt(n.trim()));\n              filters.estimateMin = min;\n              filters.estimateMax = max;\n            } else {\n              filters.estimate = parseInt(trimmedValue);\n            }\n            break;\n        }\n      }\n    }\n  }\n\n  // Apply individual filter options\n  if (options.status) {\n    filters.status = options.status.split(',').map((s: string) => s.trim());\n  }\n  if (options.priority) {\n    filters.priority = options.priority.split(',').map((p: string) => p.trim());\n  }\n  if (options.assignee) {\n    filters.assignee = options.assignee;\n  }\n  if (options.tags) {\n    filters.tags = options.tags.split(',').map((t: string) => t.trim());\n  }\n  if (options.id) {\n    filters.id = options.id;\n  }\n  if (options.createdAfter) {\n    filters.createdAfter = new Date(options.createdAfter);\n  }\n  if (options.createdBefore) {\n    filters.createdBefore = new Date(options.createdBefore);\n  }\n  if (options.updatedAfter) {\n    filters.updatedAfter = new Date(options.updatedAfter);\n  }\n  if (options.updatedBefore) {\n    filters.updatedBefore = new Date(options.updatedBefore);\n  }\n  if (options.estimateMin) {\n    filters.estimateMin = parseInt(options.estimateMin);\n  }\n  if (options.estimateMax) {\n    filters.estimateMax = parseInt(options.estimateMax);\n  }\n\n  return filters;\n}\n\nfunction applyAdvancedFilters(items: TrackdownItem[], filters: StatusFilter): TrackdownItem[] {\n  return items.filter((item) => {\n    // Status filter\n    if (filters.status && !filters.status.includes(item.status)) {\n      return false;\n    }\n\n    // Priority filter\n    if (filters.priority && !filters.priority.includes(item.priority)) {\n      return false;\n    }\n\n    // Assignee filter\n    if (filters.assignee && item.assignee !== filters.assignee) {\n      return false;\n    }\n\n    // ID filter\n    if (filters.id && item.id !== filters.id) {\n      return false;\n    }\n\n    // Tags filter (item must have at least one of the specified tags)\n    if (filters.tags && filters.tags.length > 0) {\n      if (!item.tags || !filters.tags.some((tag) => item.tags?.includes(tag))) {\n        return false;\n      }\n    }\n\n    // Date filters\n    if (filters.createdAfter && item.createdAt < filters.createdAfter) {\n      return false;\n    }\n    if (filters.createdBefore && item.createdAt > filters.createdBefore) {\n      return false;\n    }\n    if (filters.updatedAfter && item.updatedAt < filters.updatedAfter) {\n      return false;\n    }\n    if (filters.updatedBefore && item.updatedAt > filters.updatedBefore) {\n      return false;\n    }\n\n    // Story point filters\n    if (filters.estimate && item.estimate !== filters.estimate) {\n      return false;\n    }\n    if (filters.estimateMin && (!item.estimate || item.estimate < filters.estimateMin)) {\n      return false;\n    }\n    if (filters.estimateMax && (!item.estimate || item.estimate > filters.estimateMax)) {\n      return false;\n    }\n\n    return true;\n  });\n}\n\nfunction sortItems(items: TrackdownItem[], sortField: string, order: string): TrackdownItem[] {\n  const sortedItems = [...items];\n\n  sortedItems.sort((a, b) => {\n    let comparison = 0;\n\n    switch (sortField) {\n      case 'created':\n        comparison = a.createdAt.getTime() - b.createdAt.getTime();\n        break;\n      case 'updated':\n        comparison = a.updatedAt.getTime() - b.updatedAt.getTime();\n        break;\n      case 'priority': {\n        const priorityOrder = { critical: 4, high: 3, medium: 2, low: 1 };\n        comparison =\n          (priorityOrder[a.priority as keyof typeof priorityOrder] || 0) -\n          (priorityOrder[b.priority as keyof typeof priorityOrder] || 0);\n        break;\n      }\n      case 'status': {\n        const statusOrder = { todo: 1, 'in-progress': 2, blocked: 3, done: 4 };\n        comparison =\n          (statusOrder[a.status as keyof typeof statusOrder] || 0) -\n          (statusOrder[b.status as keyof typeof statusOrder] || 0);\n        break;\n      }\n      case 'title':\n        comparison = a.title.localeCompare(b.title);\n        break;\n      default:\n        comparison = 0;\n    }\n\n    return order === 'desc' ? -comparison : comparison;\n  });\n\n  return sortedItems;\n}\n\nasync function displayExportPreview(items: TrackdownItem[], config: any): Promise<void> {\n  console.log(\n    Formatter.subheader(`Preview: ${items.length} items in ${config.format.toUpperCase()} format`)\n  );\n\n  if (config.format === 'table' || items.length <= 10) {\n    // Show full preview for table format or small datasets\n    const previewData = await generateAdvancedExportData(items, config, 'preview-project');\n    console.log(previewData);\n  } else {\n    // Show sample for large datasets\n    const sampleItems = items.slice(0, 3);\n    console.log(Formatter.info(`Showing first 3 items (${items.length} total):`));\n    const sampleData = await generateAdvancedExportData(sampleItems, config, 'preview-project');\n    console.log(sampleData);\n    console.log(Formatter.dim('... (additional items truncated for preview)'));\n  }\n\n  console.log(Formatter.info(`Full export would contain ${items.length} items`));\n}\n\nfunction resolveOutputPath(\n  outputPath: string,\n  _trackdownDir: string,\n  pathResolver: PathResolver\n): string {\n  if (outputPath.startsWith('/') || outputPath.includes(':')) {\n    // Absolute path\n    return outputPath;\n  } else {\n    // Relative path - resolve from exports directory\n    return join(process.cwd(), pathResolver.getExportsDir(), outputPath);\n  }\n}\n\nfunction ensureDirectoryExists(filePath: string): void {\n  const dir = join(filePath, '..');\n  if (!existsSync(dir)) {\n    mkdirSync(dir, { recursive: true });\n  }\n}\n\nfunction displayExportSummary(items: TrackdownItem[], config: any, outputPath: string): void {\n  console.log('');\n  console.log(Formatter.header('📊 Export Summary'));\n\n  // Basic stats\n  console.log(Formatter.success(`✅ Successfully exported ${items.length} items`));\n  console.log(Formatter.info(`📁 Output: ${outputPath}`));\n  console.log(Formatter.info(`📋 Format: ${config.format.toUpperCase()}`));\n  console.log(Formatter.info(`📝 Template: ${config.template}`));\n\n  // Status breakdown\n  const statusCounts = items.reduce(\n    (acc, item) => {\n      acc[item.status] = (acc[item.status] || 0) + 1;\n      return acc;\n    },\n    {} as Record<string, number>\n  );\n\n  console.log('');\n  console.log(Formatter.subheader('Status Breakdown:'));\n  Object.entries(statusCounts).forEach(([status, count]) => {\n    console.log(`  ${status}: ${count}`);\n  });\n\n  // Priority breakdown\n  const priorityCounts = items.reduce(\n    (acc, item) => {\n      acc[item.priority] = (acc[item.priority] || 0) + 1;\n      return acc;\n    },\n    {} as Record<string, number>\n  );\n\n  console.log('');\n  console.log(Formatter.subheader('Priority Breakdown:'));\n  Object.entries(priorityCounts).forEach(([priority, count]) => {\n    console.log(`  ${priority}: ${count}`);\n  });\n\n  // File size info\n  try {\n    const stats = statSync(outputPath);\n    const fileSizeKB = (stats.size / 1024).toFixed(2);\n    console.log('');\n    console.log(Formatter.info(`📊 File size: ${fileSizeKB} KB`));\n  } catch {\n    // Ignore file size errors\n  }\n}\n\nasync function generateAdvancedExportData(\n  items: TrackdownItem[],\n  config: any,\n  projectName?: string\n): Promise<string> {\n  const metadata = {\n    project: projectName || 'trackdown-project',\n    exportedAt: new Date().toISOString(),\n    itemCount: items.length,\n    format: config.format,\n    template: config.template,\n    filters: getAppliedFiltersInfo(config),\n    sorting: {\n      field: config.sort,\n      order: config.order,\n    },\n  };\n\n  // Apply template filtering\n  const processedItems = applyTemplate(items, config.template, config);\n\n  switch (config.format) {\n    case 'json':\n      return generateJSONExport(processedItems, metadata, config);\n\n    case 'yaml':\n      return generateYAMLExport(processedItems, metadata, config);\n\n    case 'csv':\n      return generateCSVExport(processedItems, metadata, config);\n\n    case 'md':\n      return generateMarkdownExport(processedItems, metadata, config);\n\n    case 'table':\n      return generateTableExport(processedItems, metadata, config);\n\n    default:\n      throw new Error(`Unsupported format: ${config.format}`);\n  }\n}\n\nfunction applyTemplate(items: TrackdownItem[], template: string, config: any): any[] {\n  switch (template) {\n    case 'minimal':\n      return items.map((item) => ({\n        id: item.id,\n        title: item.title,\n        status: item.status,\n      }));\n\n    case 'summary':\n      return items.map((item) => ({\n        id: item.id,\n        title: item.title,\n        status: item.status,\n        priority: item.priority,\n        assignee: item.assignee,\n        createdAt: item.createdAt,\n        updatedAt: item.updatedAt,\n        tags: item.tags,\n      }));\n    default:\n      return items.map((item) => ({\n        ...item,\n        description: config.includeDescriptions ? item.description : undefined,\n      }));\n  }\n}\n\nfunction generateJSONExport(items: any[], metadata: any, config: any): string {\n  const exportData = {\n    ...(config.includeMetadata ? { metadata } : {}),\n    items,\n  };\n\n  return JSON.stringify(exportData, null, 2);\n}\n\nfunction generateYAMLExport(items: any[], metadata: any, config: any): string {\n  const lines: string[] = [];\n\n  if (config.includeMetadata) {\n    lines.push('metadata:');\n    lines.push(`  project: \"${metadata.project}\"`);\n    lines.push(`  exportedAt: \"${metadata.exportedAt}\"`);\n    lines.push(`  itemCount: ${metadata.itemCount}`);\n    lines.push(`  format: \"${metadata.format}\"`);\n    lines.push(`  template: \"${metadata.template}\"`);\n    lines.push('');\n  }\n\n  lines.push('items:');\n\n  for (const item of items) {\n    lines.push(`  - id: \"${item.id}\"`);\n    lines.push(`    title: \"${item.title}\"`);\n    lines.push(`    status: \"${item.status}\"`);\n\n    if (item.priority) lines.push(`    priority: \"${item.priority}\"`);\n    if (item.assignee) lines.push(`    assignee: \"${item.assignee}\"`);\n    if (item.description) lines.push(`    description: \"${item.description.replace(/\"/g, '\\\\\"')}\"`);\n    if (item.estimate) lines.push(`    estimate: ${item.estimate}`);\n    if (item.createdAt) lines.push(`    createdAt: \"${item.createdAt.toISOString()}\"`);\n    if (item.updatedAt) lines.push(`    updatedAt: \"${item.updatedAt.toISOString()}\"`);\n    if (item.tags && item.tags.length > 0) {\n      lines.push(`    tags: [${item.tags.map((tag: string) => `\"${tag}\"`).join(', ')}]`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n\nfunction generateCSVExport(items: any[], metadata: any, config: any): string {\n  const headers = Object.keys(items[0] || {}).filter(\n    (key) => (key !== 'createdAt' && key !== 'updatedAt') || config.template === 'detailed'\n  );\n\n  // Add date columns if detailed template\n  if (config.template === 'detailed') {\n    headers.push('createdAt', 'updatedAt');\n  }\n\n  const headerRow = headers.join(',');\n\n  const dataRows = items.map((item) => {\n    return headers\n      .map((header) => {\n        const value = item[header];\n        if (value === undefined || value === null) return '';\n        if (Array.isArray(value)) return `\"${value.join(', ')}\"`;\n        if (typeof value === 'string' && value.includes(','))\n          return `\"${value.replace(/\"/g, '\"\"')}\"`;\n        if (value instanceof Date) return value.toISOString();\n        return String(value);\n      })\n      .join(',');\n  });\n\n  const csvContent = [headerRow, ...dataRows].join('\\n');\n\n  if (config.includeMetadata) {\n    const metadataLines = [\n      `# Export Metadata`,\n      `# Project: ${metadata.project}`,\n      `# Exported: ${metadata.exportedAt}`,\n      `# Items: ${metadata.itemCount}`,\n      `# Template: ${metadata.template}`,\n      `#`,\n      csvContent,\n    ];\n    return metadataLines.join('\\n');\n  }\n\n  return csvContent;\n}\n\nfunction generateMarkdownExport(items: any[], metadata: any, config: any): string {\n  const lines: string[] = [];\n\n  lines.push(`# ${metadata.project} Export`);\n  lines.push('');\n\n  if (config.includeMetadata) {\n    lines.push(`**Exported**: ${metadata.exportedAt}`);\n    lines.push(`**Items**: ${metadata.itemCount}`);\n    lines.push(`**Format**: ${metadata.format}`);\n    lines.push(`**Template**: ${metadata.template}`);\n    lines.push('');\n  }\n\n  lines.push('## Items');\n  lines.push('');\n\n  for (const item of items) {\n    lines.push(`### ${item.title}`);\n    lines.push('');\n    lines.push(`- **ID**: ${item.id}`);\n    lines.push(`- **Status**: ${item.status}`);\n\n    if (item.priority) lines.push(`- **Priority**: ${item.priority}`);\n    if (item.assignee) lines.push(`- **Assignee**: ${item.assignee}`);\n    if (item.estimate) lines.push(`- **Estimate**: ${item.estimate} story points`);\n    if (item.createdAt) lines.push(`- **Created**: ${item.createdAt.toISOString().split('T')[0]}`);\n    if (item.updatedAt) lines.push(`- **Updated**: ${item.updatedAt.toISOString().split('T')[0]}`);\n    if (item.tags && item.tags.length > 0) {\n      lines.push(`- **Tags**: ${item.tags.join(', ')}`);\n    }\n\n    lines.push('');\n\n    if (item.description) {\n      lines.push(item.description);\n      lines.push('');\n    }\n\n    lines.push('---');\n    lines.push('');\n  }\n\n  return lines.join('\\n');\n}\n\nfunction generateTableExport(items: any[], _metadata: any, _config: any): string {\n  // Use the formatter's table functionality\n  return Formatter.formatTable(items as TrackdownItem[]);\n}\n\nfunction getAppliedFiltersInfo(config: any): Record<string, any> {\n  const filters: Record<string, any> = {};\n\n  if (config.status) filters.status = config.status;\n  if (config.priority) filters.priority = config.priority;\n  if (config.assignee) filters.assignee = config.assignee;\n  if (config.tags) filters.tags = config.tags;\n  if (config.createdAfter) filters.createdAfter = config.createdAfter;\n  if (config.createdBefore) filters.createdBefore = config.createdBefore;\n  if (config.updatedAfter) filters.updatedAfter = config.updatedAfter;\n  if (config.updatedBefore) filters.updatedBefore = config.updatedBefore;\n  if (config.estimateMin) filters.estimateMin = config.estimateMin;\n  if (config.estimateMax) filters.estimateMax = config.estimateMax;\n  if (config.limit) filters.limit = config.limit;\n\n  return filters;\n}\n\n// Keep the enhanced collectItems and parseTrackdownFile functions from the original\nfunction collectItems(\n  _trackdownDir: string,\n  includeCompleted: boolean,\n  pathResolver: PathResolver\n): TrackdownItem[] {\n  const items: TrackdownItem[] = [];\n  const directories = [pathResolver.getActiveDir()];\n\n  if (includeCompleted) {\n    directories.push(pathResolver.getCompletedDir());\n  }\n\n  for (const dir of directories) {\n    const fullPath = join(process.cwd(), dir);\n    if (existsSync(fullPath)) {\n      const files = readdirSync(fullPath).filter((file) => file.endsWith('.md'));\n\n      for (const file of files) {\n        try {\n          const item = parseTrackdownFile(join(fullPath, file));\n          if (item) {\n            items.push(item);\n          }\n        } catch (_error) {\n          console.warn(Formatter.warning(`Could not parse file: ${file}`));\n        }\n      }\n    }\n  }\n\n  return items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n}\n\nfunction parseTrackdownFile(filePath: string): TrackdownItem | null {\n  try {\n    const content = readFileSync(filePath, 'utf-8');\n\n    // Extract metadata from markdown\n    const titleMatch = content.match(/^# (.+)$/m);\n    const idMatch = content.match(/\\*\\*ID\\*\\*:\\s*(.+)$/m);\n    const statusMatch = content.match(/\\*\\*Status\\*\\*:\\s*(.+)$/m);\n    const priorityMatch = content.match(/\\*\\*Priority\\*\\*:\\s*(.+)$/m);\n    const assigneeMatch = content.match(/\\*\\*Assignee\\*\\*:\\s*(.+)$/m);\n    const createdMatch = content.match(/\\*\\*Created\\*\\*:\\s*(.+)$/m);\n    const updatedMatch = content.match(/\\*\\*Updated\\*\\*:\\s*(.+)$/m);\n    const tagsMatch = content.match(/\\*\\*Tags\\*\\*:\\s*(.+)$/m);\n    const estimateMatch = content.match(/\\*\\*Estimate\\*\\*:\\s*(.+)$/m);\n\n    if (!titleMatch || !idMatch) {\n      return null;\n    }\n\n    // Extract description\n    const descriptionMatch = content.match(/## Description\\n\\n(.*?)(\\n\\n##|\\n\\n---|\\n\\n$)/s);\n\n    // Parse tags\n    const tags = tagsMatch\n      ? tagsMatch[1]\n          .split(',')\n          .map((tag) => tag.trim().replace(/`/g, ''))\n          .filter(Boolean)\n      : undefined;\n\n    return {\n      id: idMatch[1].trim(),\n      title: titleMatch[1].trim(),\n      description: descriptionMatch ? descriptionMatch[1].trim() : undefined,\n      status: (statusMatch?.[1]?.trim() || 'todo') as 'todo' | 'in-progress' | 'done' | 'blocked',\n      priority: (priorityMatch?.[1]?.trim() || 'medium') as 'low' | 'medium' | 'high' | 'critical',\n      assignee:\n        assigneeMatch?.[1]?.trim() !== 'Unassigned' ? assigneeMatch?.[1]?.trim() : undefined,\n      createdAt: createdMatch ? new Date(createdMatch[1].trim()) : new Date(),\n      updatedAt: updatedMatch ? new Date(updatedMatch[1].trim()) : new Date(),\n      estimate: estimateMatch ? parseInt(estimateMatch[1].trim()) : undefined,\n      tags,\n    };\n  } catch (_error) {\n    return null;\n  }\n}\n","/**\n * Universal Ticketing Interface for Health Monitoring\n * Provides a unified interface for aggregating ticket data across different commands\n * and ensuring real-time monitoring capabilities\n */\n\nimport type { EpicData, IssueData, ProjectConfig, TaskData } from '../types/ai-trackdown.js';\nimport { ConfigManager } from './config-manager.js';\nimport { Formatter } from './formatter.js';\nimport { RelationshipManager } from './relationship-manager.js';\n\nexport interface TicketCounts {\n  epics: number;\n  issues: number;\n  tasks: number;\n  total: number;\n}\n\nexport interface TicketHealthMetrics {\n  counts: TicketCounts;\n  statusBreakdown: {\n    planning: number;\n    active: number;\n    completed: number;\n    blocked: number;\n  };\n  priorityBreakdown: {\n    low: number;\n    medium: number;\n    high: number;\n    critical: number;\n  };\n  recentActivity: {\n    updatedLastWeek: number;\n    createdLastWeek: number;\n  };\n  completionRate: number;\n  lastUpdated: Date;\n}\n\nexport interface TicketData {\n  epics: EpicData[];\n  issues: IssueData[];\n  tasks: TaskData[];\n}\n\nexport class UniversalTicketingInterface {\n  private relationshipManager: RelationshipManager;\n  private config: ProjectConfig;\n  private lastCacheUpdate: number = 0;\n  private cacheExpiry: number = 60000; // 1 minute cache for health monitoring\n\n  constructor(config?: ProjectConfig, projectRoot?: string, cliTasksDir?: string) {\n    if (!config) {\n      const configManager = new ConfigManager(projectRoot);\n      this.config = configManager.getConfig();\n    } else {\n      this.config = config;\n    }\n\n    this.relationshipManager = new RelationshipManager(this.config, projectRoot, cliTasksDir);\n  }\n\n  /**\n   * Get accurate ticket counts using the same logic as individual commands\n   */\n  public getTicketCounts(): TicketCounts {\n    const epics = this.relationshipManager.getAllEpics();\n    const issues = this.relationshipManager.getAllIssues();\n    const tasks = this.relationshipManager.getAllTasks();\n\n    return {\n      epics: epics.length,\n      issues: issues.length,\n      tasks: tasks.length,\n      total: epics.length + issues.length + tasks.length,\n    };\n  }\n\n  /**\n   * Get all ticket data for further processing\n   */\n  public getAllTicketData(): TicketData {\n    return {\n      epics: this.relationshipManager.getAllEpics(),\n      issues: this.relationshipManager.getAllIssues(),\n      tasks: this.relationshipManager.getAllTasks(),\n    };\n  }\n\n  /**\n   * Get comprehensive health metrics\n   */\n  public getHealthMetrics(): TicketHealthMetrics {\n    const data = this.getAllTicketData();\n    const allItems = [...data.epics, ...data.issues, ...data.tasks];\n\n    // Calculate status breakdown\n    const statusBreakdown = {\n      planning: 0,\n      active: 0,\n      completed: 0,\n      blocked: 0,\n    };\n\n    // Calculate priority breakdown\n    const priorityBreakdown = {\n      low: 0,\n      medium: 0,\n      high: 0,\n      critical: 0,\n    };\n\n    // Calculate recent activity\n    const lastWeek = new Date();\n    lastWeek.setDate(lastWeek.getDate() - 7);\n    let updatedLastWeek = 0;\n    let createdLastWeek = 0;\n\n    for (const item of allItems) {\n      // Status breakdown\n      switch (item.status) {\n        case 'planning':\n          statusBreakdown.planning++;\n          break;\n        case 'active':\n          statusBreakdown.active++;\n          break;\n        case 'completed':\n          statusBreakdown.completed++;\n          break;\n        case 'blocked':\n          statusBreakdown.blocked++;\n          break;\n      }\n\n      // Priority breakdown\n      switch (item.priority) {\n        case 'low':\n          priorityBreakdown.low++;\n          break;\n        case 'medium':\n          priorityBreakdown.medium++;\n          break;\n        case 'high':\n          priorityBreakdown.high++;\n          break;\n        case 'critical':\n          priorityBreakdown.critical++;\n          break;\n      }\n\n      // Recent activity\n      const updatedDate = new Date(item.updated_date);\n      const createdDate = new Date(item.created_date);\n\n      if (updatedDate >= lastWeek) {\n        updatedLastWeek++;\n      }\n      if (createdDate >= lastWeek) {\n        createdLastWeek++;\n      }\n    }\n\n    const completionRate =\n      allItems.length > 0 ? Math.round((statusBreakdown.completed / allItems.length) * 100) : 0;\n\n    return {\n      counts: this.getTicketCounts(),\n      statusBreakdown,\n      priorityBreakdown,\n      recentActivity: {\n        updatedLastWeek,\n        createdLastWeek,\n      },\n      completionRate,\n      lastUpdated: new Date(),\n    };\n  }\n\n  /**\n   * Display health metrics in a formatted way\n   */\n  public displayHealthMetrics(): void {\n    const metrics = this.getHealthMetrics();\n\n    console.log(Formatter.header('🎯 Universal Ticketing Interface - Health Monitoring'));\n    console.log('');\n\n    // Ticket counts\n    console.log(Formatter.subheader('📊 Ticket Counts'));\n    console.log(`   📋 Epics: ${Formatter.highlight(metrics.counts.epics.toString())}`);\n    console.log(`   🐛 Issues: ${Formatter.highlight(metrics.counts.issues.toString())}`);\n    console.log(`   ✅ Tasks: ${Formatter.highlight(metrics.counts.tasks.toString())}`);\n    console.log(`   🔢 Total: ${Formatter.highlight(metrics.counts.total.toString())}`);\n    console.log('');\n\n    // Status breakdown\n    console.log(Formatter.subheader('🎯 Status Breakdown'));\n    console.log(`   📝 Planning: ${metrics.statusBreakdown.planning}`);\n    console.log(`   🔄 Active: ${metrics.statusBreakdown.active}`);\n    console.log(`   ✅ Completed: ${metrics.statusBreakdown.completed}`);\n    console.log(`   🚫 Blocked: ${metrics.statusBreakdown.blocked}`);\n    console.log('');\n\n    // Priority breakdown\n    console.log(Formatter.subheader('⚡ Priority Distribution'));\n    console.log(`   🔴 Critical: ${metrics.priorityBreakdown.critical}`);\n    console.log(`   🟠 High: ${metrics.priorityBreakdown.high}`);\n    console.log(`   🟡 Medium: ${metrics.priorityBreakdown.medium}`);\n    console.log(`   🟢 Low: ${metrics.priorityBreakdown.low}`);\n    console.log('');\n\n    // Health indicators\n    console.log(Formatter.subheader('🏥 Health Indicators'));\n    console.log(`   📈 Completion Rate: ${Formatter.highlight(`${metrics.completionRate}%`)}`);\n    console.log(\n      `   🔄 Recent Activity: ${metrics.recentActivity.updatedLastWeek} updated, ${metrics.recentActivity.createdLastWeek} created (last 7 days)`\n    );\n    console.log(`   ⏰ Last Updated: ${metrics.lastUpdated.toLocaleString()}`);\n    console.log('');\n\n    // Health alerts\n    this.displayHealthAlerts(metrics);\n  }\n\n  /**\n   * Display health alerts based on metrics\n   */\n  private displayHealthAlerts(metrics: TicketHealthMetrics): void {\n    const alerts = [];\n\n    // Check for high number of blocked items\n    if (metrics.statusBreakdown.blocked > 3) {\n      alerts.push(`⚠️ High number of blocked items: ${metrics.statusBreakdown.blocked}`);\n    }\n\n    // Check for low completion rate\n    if (metrics.completionRate < 10 && metrics.counts.total > 10) {\n      alerts.push(`⚠️ Low completion rate: ${metrics.completionRate}%`);\n    }\n\n    // Check for high critical priority items\n    if (metrics.priorityBreakdown.critical > 5) {\n      alerts.push(`🚨 High number of critical items: ${metrics.priorityBreakdown.critical}`);\n    }\n\n    // Check for stale items (low recent activity)\n    if (metrics.recentActivity.updatedLastWeek < Math.ceil(metrics.counts.total * 0.1)) {\n      alerts.push(\n        `⏰ Low recent activity: only ${metrics.recentActivity.updatedLastWeek} items updated in last 7 days`\n      );\n    }\n\n    if (alerts.length > 0) {\n      console.log(Formatter.subheader('🚨 Health Alerts'));\n      alerts.forEach((alert) => {\n        console.log(`   ${alert}`);\n      });\n      console.log('');\n    } else {\n      console.log(Formatter.success('✅ All health indicators are within normal ranges'));\n      console.log('');\n    }\n  }\n\n  /**\n   * Get real-time monitoring data (with caching)\n   */\n  public getMonitoringData(): TicketHealthMetrics {\n    const now = Date.now();\n    if (now - this.lastCacheUpdate > this.cacheExpiry) {\n      this.relationshipManager.rebuildCache();\n      this.lastCacheUpdate = now;\n    }\n\n    return this.getHealthMetrics();\n  }\n\n  /**\n   * Lifecycle management methods\n   */\n  public refreshData(): void {\n    this.relationshipManager.rebuildCache();\n    this.lastCacheUpdate = Date.now();\n  }\n\n  /**\n   * Get epic-specific metrics\n   */\n  public getEpicMetrics(): {\n    total: number;\n    active: number;\n    completed: number;\n    averageCompletion: number;\n  } {\n    const epics = this.relationshipManager.getAllEpics();\n    const active = epics.filter((epic) => epic.status === 'active').length;\n    const completed = epics.filter((epic) => epic.status === 'completed').length;\n    const averageCompletion =\n      epics.length > 0\n        ? Math.round(\n            epics.reduce((sum, epic) => sum + (epic.completion_percentage || 0), 0) / epics.length\n          )\n        : 0;\n\n    return {\n      total: epics.length,\n      active,\n      completed,\n      averageCompletion,\n    };\n  }\n\n  /**\n   * Get issue-specific metrics\n   */\n  public getIssueMetrics(): {\n    total: number;\n    byEpic: Record<string, number>;\n    unassigned: number;\n    highPriority: number;\n  } {\n    const issues = this.relationshipManager.getAllIssues();\n    const byEpic: Record<string, number> = {};\n    let unassigned = 0;\n    let highPriority = 0;\n\n    for (const issue of issues) {\n      // Count by epic\n      if (issue.epic_id) {\n        byEpic[issue.epic_id] = (byEpic[issue.epic_id] || 0) + 1;\n      }\n\n      // Count unassigned\n      if (!issue.assignee || issue.assignee === 'unassigned') {\n        unassigned++;\n      }\n\n      // Count high priority\n      if (issue.priority === 'high' || issue.priority === 'critical') {\n        highPriority++;\n      }\n    }\n\n    return {\n      total: issues.length,\n      byEpic,\n      unassigned,\n      highPriority,\n    };\n  }\n\n  /**\n   * Get task-specific metrics\n   */\n  public getTaskMetrics(): {\n    total: number;\n    byIssue: Record<string, number>;\n    standalone: number;\n    estimatedVsActual: { estimated: number; actual: number };\n  } {\n    const tasks = this.relationshipManager.getAllTasks();\n    const byIssue: Record<string, number> = {};\n    let standalone = 0;\n    let totalEstimated = 0;\n    let totalActual = 0;\n\n    for (const task of tasks) {\n      // Count by issue\n      if (task.issue_id) {\n        byIssue[task.issue_id] = (byIssue[task.issue_id] || 0) + 1;\n      } else {\n        standalone++;\n      }\n\n      // Sum estimates\n      if (task.estimated_tokens) {\n        totalEstimated += task.estimated_tokens;\n      }\n      if (task.actual_tokens) {\n        totalActual += task.actual_tokens;\n      }\n    }\n\n    return {\n      total: tasks.length,\n      byIssue,\n      standalone,\n      estimatedVsActual: {\n        estimated: totalEstimated,\n        actual: totalActual,\n      },\n    };\n  }\n}\n","/**\n * Health Command - Universal Ticketing Interface\n * Provides comprehensive health monitoring using the universal ticketing interface\n */\n\nimport { Command } from 'commander';\nimport { Formatter } from '../utils/formatter.js';\nimport { UniversalTicketingInterface } from '../utils/universal-ticketing-interface.js';\n\nexport function createHealthCommand(): Command {\n  const command = new Command('health');\n\n  command\n    .description('Display comprehensive project health metrics using universal ticketing interface')\n    .option('--counts-only', 'show only ticket counts')\n    .option('--metrics-only', 'show only health metrics')\n    .option('--json', 'output in JSON format')\n    .option('--refresh', 'force refresh of all data')\n    .option('--watch', 'continuously monitor health metrics')\n    .option('--epic-details', 'show detailed epic metrics')\n    .option('--issue-details', 'show detailed issue metrics')\n    .option('--task-details', 'show detailed task metrics')\n    .addHelpText(\n      'after',\n      `\nExamples:\n  $ aitrackdown health                    # Full health report\n  $ aitrackdown health --counts-only      # Just the counts\n  $ aitrackdown health --json             # JSON output\n  $ aitrackdown health --refresh          # Force refresh data\n  $ aitrackdown health --epic-details     # Epic-specific metrics\n  $ aitrackdown health --watch            # Live monitoring\n\nThis command uses the Universal Ticketing Interface to provide:\n- Accurate ticket counts matching individual commands\n- Real-time health monitoring\n- Comprehensive project metrics\n- Health alerts and recommendations\n      `\n    )\n    .action(async (options) => {\n      try {\n        await executeHealthCommand(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Health check failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n\nasync function executeHealthCommand(options: {\n  countsOnly?: boolean;\n  metricsOnly?: boolean;\n  json?: boolean;\n  refresh?: boolean;\n  watch?: boolean;\n  epicDetails?: boolean;\n  issueDetails?: boolean;\n  taskDetails?: boolean;\n}): Promise<void> {\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Initialize the universal ticketing interface\n  const ticketingInterface = new UniversalTicketingInterface(undefined, process.cwd(), cliTasksDir);\n\n  // Force refresh if requested\n  if (options.refresh) {\n    console.log('🔄 Refreshing ticket data...');\n    ticketingInterface.refreshData();\n    console.log('✅ Data refreshed successfully');\n    console.log('');\n  }\n\n  // Watch mode\n  if (options.watch) {\n    return runWatchMode(ticketingInterface);\n  }\n\n  // Get metrics\n  const healthMetrics = ticketingInterface.getHealthMetrics();\n  const counts = ticketingInterface.getTicketCounts();\n\n  // JSON output\n  if (options.json) {\n    const output = {\n      counts,\n      healthMetrics,\n      timestamp: new Date().toISOString(),\n    };\n    console.log(JSON.stringify(output, null, 2));\n    return;\n  }\n\n  // Counts only\n  if (options.countsOnly) {\n    console.log(Formatter.header('🎯 Universal Ticketing Interface - Ticket Counts'));\n    console.log('');\n    console.log(`📋 Epics: ${Formatter.highlight(counts.epics.toString())}`);\n    console.log(`🐛 Issues: ${Formatter.highlight(counts.issues.toString())}`);\n    console.log(`✅ Tasks: ${Formatter.highlight(counts.tasks.toString())}`);\n    console.log(`🔢 Total: ${Formatter.highlight(counts.total.toString())}`);\n    console.log('');\n\n    // Verification note\n    console.log(\n      Formatter.info('✅ These counts match the individual epic/issue/task list commands')\n    );\n    return;\n  }\n\n  // Metrics only\n  if (options.metricsOnly) {\n    ticketingInterface.displayHealthMetrics();\n    return;\n  }\n\n  // Full health report (default)\n  console.log(Formatter.header('🏥 Project Health Report'));\n  console.log(Formatter.info('Using Universal Ticketing Interface for accurate health monitoring'));\n  console.log('');\n\n  // Display main health metrics\n  ticketingInterface.displayHealthMetrics();\n\n  // Detailed metrics if requested\n  if (options.epicDetails) {\n    displayEpicDetails(ticketingInterface);\n  }\n\n  if (options.issueDetails) {\n    displayIssueDetails(ticketingInterface);\n  }\n\n  if (options.taskDetails) {\n    displayTaskDetails(ticketingInterface);\n  }\n\n  // Summary and recommendations\n  displayRecommendations(healthMetrics);\n}\n\nfunction displayEpicDetails(ticketingInterface: UniversalTicketingInterface): void {\n  const epicMetrics = ticketingInterface.getEpicMetrics();\n\n  console.log(Formatter.subheader('📋 Epic Details'));\n  console.log(`   Total Epics: ${epicMetrics.total}`);\n  console.log(`   Active Epics: ${epicMetrics.active}`);\n  console.log(`   Completed Epics: ${epicMetrics.completed}`);\n  console.log(`   Average Completion: ${epicMetrics.averageCompletion}%`);\n  console.log('');\n}\n\nfunction displayIssueDetails(ticketingInterface: UniversalTicketingInterface): void {\n  const issueMetrics = ticketingInterface.getIssueMetrics();\n\n  console.log(Formatter.subheader('🐛 Issue Details'));\n  console.log(`   Total Issues: ${issueMetrics.total}`);\n  console.log(`   Unassigned Issues: ${issueMetrics.unassigned}`);\n  console.log(`   High Priority Issues: ${issueMetrics.highPriority}`);\n  console.log('');\n\n  if (Object.keys(issueMetrics.byEpic).length > 0) {\n    console.log(Formatter.subheader('📊 Issues by Epic'));\n    Object.entries(issueMetrics.byEpic).forEach(([epic, count]) => {\n      console.log(`   ${epic}: ${count} issues`);\n    });\n    console.log('');\n  }\n}\n\nfunction displayTaskDetails(ticketingInterface: UniversalTicketingInterface): void {\n  const taskMetrics = ticketingInterface.getTaskMetrics();\n\n  console.log(Formatter.subheader('✅ Task Details'));\n  console.log(`   Total Tasks: ${taskMetrics.total}`);\n  console.log(`   Standalone Tasks: ${taskMetrics.standalone}`);\n  console.log(`   Estimated Tokens: ${taskMetrics.estimatedVsActual.estimated}`);\n  console.log(`   Actual Tokens: ${taskMetrics.estimatedVsActual.actual}`);\n  console.log('');\n\n  if (Object.keys(taskMetrics.byIssue).length > 0) {\n    console.log(Formatter.subheader('📊 Tasks by Issue'));\n    Object.entries(taskMetrics.byIssue).forEach(([issue, count]) => {\n      console.log(`   ${issue}: ${count} tasks`);\n    });\n    console.log('');\n  }\n}\n\nfunction displayRecommendations(healthMetrics: any): void {\n  console.log(Formatter.subheader('💡 Health Recommendations'));\n\n  const recommendations = [];\n\n  // Based on completion rate\n  if (healthMetrics.completionRate < 20) {\n    recommendations.push(\n      'Consider focusing on completing existing tickets before creating new ones'\n    );\n  }\n\n  // Based on priority distribution\n  if (healthMetrics.priorityBreakdown.critical > 3) {\n    recommendations.push('High number of critical issues detected - consider prioritizing these');\n  }\n\n  // Based on recent activity\n  if (healthMetrics.recentActivity.updatedLastWeek < healthMetrics.counts.total * 0.1) {\n    recommendations.push('Low recent activity detected - consider reviewing stale tickets');\n  }\n\n  // Based on status distribution\n  if (healthMetrics.statusBreakdown.blocked > 0) {\n    recommendations.push(\n      `Review ${healthMetrics.statusBreakdown.blocked} blocked tickets to remove blockers`\n    );\n  }\n\n  if (recommendations.length > 0) {\n    recommendations.forEach((rec) => {\n      console.log(`   • ${rec}`);\n    });\n  } else {\n    console.log('   ✅ Project health looks good! Keep up the great work.');\n  }\n\n  console.log('');\n}\n\nasync function runWatchMode(ticketingInterface: UniversalTicketingInterface): Promise<void> {\n  console.log(Formatter.info('👁️ Health monitoring mode enabled - updating every 30 seconds'));\n  console.log(Formatter.info('Press Ctrl+C to exit'));\n  console.log('');\n\n  const displayHealthData = () => {\n    console.clear();\n    console.log(Formatter.header(`🏥 Live Health Monitoring - ${new Date().toLocaleTimeString()}`));\n    console.log('');\n\n    const metrics = ticketingInterface.getMonitoringData();\n\n    // Quick overview\n    console.log(Formatter.subheader('📊 Quick Overview'));\n    console.log(`   Total Tickets: ${metrics.counts.total}`);\n    console.log(`   Completion Rate: ${metrics.completionRate}%`);\n    console.log(`   Active Items: ${metrics.statusBreakdown.active}`);\n    console.log(`   Blocked Items: ${metrics.statusBreakdown.blocked}`);\n    console.log(`   Recent Activity: ${metrics.recentActivity.updatedLastWeek} updated (7 days)`);\n    console.log('');\n\n    // Health status\n    const isHealthy =\n      metrics.statusBreakdown.blocked === 0 &&\n      metrics.priorityBreakdown.critical < 3 &&\n      metrics.completionRate > 10;\n\n    if (isHealthy) {\n      console.log(Formatter.success('✅ Project Health: GOOD'));\n    } else {\n      console.log(Formatter.warning('⚠️ Project Health: NEEDS ATTENTION'));\n    }\n\n    console.log('');\n    console.log(Formatter.dim(`Last updated: ${new Date().toLocaleTimeString()}`));\n  };\n\n  // Initial display\n  displayHealthData();\n\n  // Set up interval\n  const interval = setInterval(displayHealthData, 30000);\n\n  // Handle graceful shutdown\n  process.on('SIGINT', () => {\n    clearInterval(interval);\n    console.log(Formatter.info('\\n👋 Health monitoring stopped'));\n    process.exit(0);\n  });\n}\n","/**\n * Index Health Command - Validate and repair index corruption\n * Provides comprehensive index diagnostics and auto-repair functionality\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { TrackdownIndexManager } from '../utils/trackdown-index-manager.js';\n\ninterface IndexHealthOptions {\n  repair?: boolean;\n  verbose?: boolean;\n  force?: boolean;\n  rebuildIndex?: boolean;\n}\n\nexport function createIndexHealthCommand(): Command {\n  const command = new Command('index-health');\n\n  command\n    .description('Validate index health and detect corruption issues')\n    .option('-r, --repair', 'automatically repair detected issues')\n    .option('-v, --verbose', 'show detailed diagnostics')\n    .option('-f, --force', 'force repair even if index appears healthy')\n    .option('--rebuild-index', 'force complete index rebuild (nuclear option)')\n    .addHelpText(\n      'after',\n      `\nExamples:\n  $ aitrackdown index-health                # Basic health check\n  $ aitrackdown index-health --verbose      # Detailed diagnostics\n  $ aitrackdown index-health --repair       # Auto-repair detected issues\n  $ aitrackdown index-health --rebuild-index # Force complete rebuild\n\nExit Codes:\n  0 - Index is healthy\n  1 - Index has issues but repair succeeded\n  2 - Index has issues and repair failed\n  3 - Critical error occurred\n`\n    )\n    .action(async (options: IndexHealthOptions) => {\n      try {\n        const exitCode = await runIndexHealthCheck(options);\n        process.exit(exitCode);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Index health check failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(3);\n      }\n    });\n\n  return command;\n}\n\nasync function runIndexHealthCheck(options: IndexHealthOptions): Promise<number> {\n  const startTime = Date.now();\n\n  // Initialize configuration and index manager\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const parentCommand = (process as any).command?.parent;\n  const cliTasksDir = parentCommand?.opts()?.rootDir || parentCommand?.opts()?.tasksDir;\n\n  const projectRoot = configManager.findProjectRoot();\n  const indexManager = new TrackdownIndexManager(config, projectRoot, cliTasksDir);\n\n  console.log(Formatter.header(`🔍 AI-Trackdown Index Health Check`));\n  console.log(Formatter.info(`Project: ${config.name || 'AI-Trackdown'}`));\n  console.log(Formatter.info(`Root: ${projectRoot}`));\n  console.log('');\n\n  // Force rebuild if requested\n  if (options.rebuildIndex) {\n    console.log(Formatter.warning('🔄 Force rebuilding index (nuclear option)...'));\n    await indexManager.rebuildIndex();\n    console.log(Formatter.success('✅ Index rebuilt successfully'));\n    console.log(Formatter.dim(`\\n⚡ Completed in ${Date.now() - startTime}ms`));\n    return 0;\n  }\n\n  // Run health validation\n  console.log(Formatter.info('🏥 Running health diagnostics...'));\n  const healthCheck = await indexManager.validateIndexHealth();\n\n  // Display basic health status\n  if (healthCheck.isValid) {\n    console.log(Formatter.success('✅ Index is healthy'));\n  } else {\n    console.log(Formatter.error('❌ Index has issues'));\n  }\n\n  console.log('');\n\n  // Display statistics\n  console.log(Formatter.subheader('📊 Index Statistics'));\n  console.log(Formatter.info(`Files found: ${healthCheck.stats.fileCount}`));\n  console.log(Formatter.info(`Files indexed: ${healthCheck.stats.indexedCount}`));\n  \n  if (healthCheck.stats.missingCount > 0) {\n    console.log(Formatter.warning(`Missing from index: ${healthCheck.stats.missingCount}`));\n  }\n  \n  if (healthCheck.stats.orphanedCount > 0) {\n    console.log(Formatter.warning(`Orphaned entries: ${healthCheck.stats.orphanedCount}`));\n  }\n\n  if (healthCheck.stats.missingCount === 0 && healthCheck.stats.orphanedCount === 0) {\n    console.log(Formatter.success('No missing or orphaned entries detected'));\n  }\n\n  console.log('');\n\n  // Display issues if any\n  if (healthCheck.issues.length > 0) {\n    console.log(Formatter.subheader('⚠️  Detected Issues'));\n    for (const issue of healthCheck.issues) {\n      console.log(Formatter.warning(`• ${issue}`));\n    }\n    console.log('');\n  }\n\n  // Display suggestions\n  if (healthCheck.suggestions.length > 0) {\n    console.log(Formatter.subheader('💡 Suggestions'));\n    for (const suggestion of healthCheck.suggestions) {\n      console.log(Formatter.info(`• ${suggestion}`));\n    }\n    console.log('');\n  }\n\n  // Show verbose information if requested\n  if (options.verbose) {\n    await displayVerboseDiagnostics(indexManager);\n  }\n\n  // Auto-repair if requested or forced\n  if (options.repair || options.force) {\n    if (healthCheck.isValid && !options.force) {\n      console.log(Formatter.info('📝 Index is healthy, no repair needed'));\n    } else {\n      console.log(Formatter.info('🔧 Starting auto-repair process...'));\n      \n      const repairResult = await indexManager.autoRepairIndex();\n      \n      if (repairResult.repaired) {\n        console.log(Formatter.success('✅ Index repair completed successfully'));\n        \n        if (repairResult.actions.length > 0) {\n          console.log(Formatter.subheader('🛠️  Repair Actions Taken'));\n          for (const action of repairResult.actions) {\n            console.log(Formatter.info(`• ${action}`));\n          }\n        }\n      } else {\n        console.log(Formatter.error('❌ Index repair failed'));\n        \n        if (repairResult.errors.length > 0) {\n          console.log(Formatter.subheader('❌ Repair Errors'));\n          for (const error of repairResult.errors) {\n            console.log(Formatter.error(`• ${error}`));\n          }\n        }\n      }\n      \n      console.log('');\n    }\n  }\n\n  console.log(Formatter.dim(`\\n⚡ Health check completed in ${Date.now() - startTime}ms`));\n\n  // Return appropriate exit code\n  if (healthCheck.isValid) {\n    return 0; // Healthy\n  } else if (options.repair || options.force) {\n    const repairResult = await indexManager.autoRepairIndex();\n    return repairResult.repaired ? 1 : 2; // Repaired or failed to repair\n  } else {\n    return 1; // Has issues but no repair attempted\n  }\n}\n\nasync function displayVerboseDiagnostics(indexManager: TrackdownIndexManager): Promise<void> {\n  console.log(Formatter.subheader('🔍 Verbose Diagnostics'));\n  \n  try {\n    const stats = await indexManager.getIndexStats();\n    \n    console.log(Formatter.info(`Cache hit: ${stats.cacheHit ? 'Yes' : 'No'}`));\n    console.log(Formatter.info(`Index file exists: ${stats.indexFileExists ? 'Yes' : 'No'}`));\n    \n    if (stats.lastModified) {\n      const ageHours = Math.round((Date.now() - stats.lastModified.getTime()) / (1000 * 60 * 60));\n      console.log(Formatter.info(`Index age: ${ageHours} hours`));\n    }\n    \n    console.log(Formatter.info(`Last full scan: ${stats.lastFullScan || 'Never'}`));\n    console.log(Formatter.info(`Index size: ${(stats.indexSize / 1024).toFixed(2)} KB`));\n    \n    // Performance metrics\n    console.log(Formatter.subheader('⚡ Performance Metrics'));\n    console.log(Formatter.info(`Last load time: ${stats.performanceMetrics.lastLoadTime}ms`));\n    console.log(Formatter.info(`Last update time: ${stats.performanceMetrics.lastUpdateTime}ms`));\n    console.log(Formatter.info(`Last rebuild time: ${stats.performanceMetrics.lastRebuildTime}ms`));\n    \n    // Breakdown by type\n    console.log(Formatter.subheader('📈 Item Breakdown'));\n    console.log(Formatter.info(`Projects: ${stats.totalProjects || 0}`));\n    console.log(Formatter.info(`Epics: ${stats.totalEpics}`));\n    console.log(Formatter.info(`Issues: ${stats.totalIssues}`));\n    console.log(Formatter.info(`Tasks: ${stats.totalTasks}`));\n    console.log(Formatter.info(`PRs: ${stats.totalPRs}`));\n    \n  } catch (error) {\n    console.log(Formatter.warning(`Could not gather verbose diagnostics: ${error instanceof Error ? error.message : 'Unknown error'}`));\n  }\n  \n  console.log('');\n}","/**\n * ID Generator for AI-Trackdown Items\n * Generates unique IDs for Epics, Issues, and Tasks\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { IdGenerator, ProjectConfig } from '../types/ai-trackdown.js';\n\nexport class AITrackdownIdGenerator implements IdGenerator {\n  private config: ProjectConfig;\n\n  // Counters for ID generation (loaded from .ai-trackdown/counters.json)\n  private counters: {\n    project: number;\n    epic: number;\n    issue: number;\n    task: number;\n    pr: number;\n  } = {\n    project: 1,\n    epic: 1,\n    issue: 1,\n    task: 1,\n    pr: 1,\n  };\n\n  private countersPath: string;\n\n  constructor(config: ProjectConfig, projectRoot: string) {\n    this.config = config;\n    this.countersPath = path.join(projectRoot, '.ai-trackdown', 'counters.json');\n    this.loadCounters();\n  }\n\n  /**\n   * Generate unique Project ID\n   */\n  public generateProjectId(_title: string): string {\n    const prefix = this.config.naming_conventions.project_prefix || 'PRJ';\n    const id = `${prefix}-${this.counters.project.toString().padStart(4, '0')}`;\n    this.counters.project++;\n    this.saveCounters();\n    return id;\n  }\n\n  /**\n   * Generate unique Epic ID\n   */\n  public generateEpicId(_title: string): string {\n    const id = `${this.config.naming_conventions.epic_prefix}-${this.counters.epic.toString().padStart(4, '0')}`;\n    this.counters.epic++;\n    this.saveCounters();\n    return id;\n  }\n\n  /**\n   * Generate unique Issue ID\n   */\n  public generateIssueId(_epic_id: string, _title: string): string {\n    const id = `${this.config.naming_conventions.issue_prefix}-${this.counters.issue.toString().padStart(4, '0')}`;\n    this.counters.issue++;\n    this.saveCounters();\n    return id;\n  }\n\n  /**\n   * Generate unique Task ID\n   */\n  public generateTaskId(_issue_id: string, _title: string): string {\n    const id = `${this.config.naming_conventions.task_prefix}-${this.counters.task.toString().padStart(4, '0')}`;\n    this.counters.task++;\n    this.saveCounters();\n    return id;\n  }\n\n  /**\n   * Generate unique PR ID\n   */\n  public generatePRId(_issue_id: string, _title: string): string {\n    const prefix = this.config.naming_conventions.pr_prefix || 'PR';\n    const id = `${prefix}-${this.counters.pr.toString().padStart(4, '0')}`;\n    this.counters.pr++;\n    this.saveCounters();\n    return id;\n  }\n\n  /**\n   * Generate filename for an item\n   */\n  public generateFilename(itemId: string, title: string): string {\n    // Sanitize title for filename\n    const sanitizedTitle = title\n      .toLowerCase()\n      .replace(/[^a-z0-9\\s-]/g, '')\n      .replace(/\\s+/g, '-')\n      .replace(/-+/g, '-')\n      .slice(0, 50)\n      .replace(/^-|-$/g, '');\n\n    return `${itemId}-${sanitizedTitle}${this.config.naming_conventions.file_extension}`;\n  }\n\n  /**\n   * Get next available ID without incrementing counter\n   */\n  public peekNextId(type: 'project' | 'epic' | 'issue' | 'task' | 'pr'): string {\n    const prefix =\n      this.config.naming_conventions[`${type}_prefix`] ||\n      (type === 'project' ? 'PRJ' : type === 'pr' ? 'PR' : '');\n    const counter = this.counters[type];\n    return `${prefix}-${counter.toString().padStart(4, '0')}`;\n  }\n\n  /**\n   * Reset counters (dangerous - only for testing or project reset)\n   */\n  public resetCounters(): void {\n    this.counters = { project: 1, epic: 1, issue: 1, task: 1, pr: 1 };\n    this.saveCounters();\n  }\n\n  /**\n   * Get current counter values\n   */\n  public getCounters(): typeof this.counters {\n    return { ...this.counters };\n  }\n\n  /**\n   * Set specific counter value (useful for migration)\n   */\n  public setCounter(type: 'project' | 'epic' | 'issue' | 'task' | 'pr', value: number): void {\n    this.counters[type] = Math.max(1, value);\n    this.saveCounters();\n  }\n\n  /**\n   * Auto-detect and set counters based on existing files\n   */\n  public autoDetectCounters(projectRoot: string): void {\n    const epicsDir = path.join(projectRoot, this.config.structure.epics_dir);\n    const issuesDir = path.join(projectRoot, this.config.structure.issues_dir);\n    const tasksDir = path.join(projectRoot, this.config.structure.tasks_dir);\n\n    // Find highest existing epic ID\n    const epicPrefix = this.config.naming_conventions.epic_prefix;\n    const epicPattern = new RegExp(`${epicPrefix}-(\\\\d+)`);\n    let maxEpic = 0;\n\n    if (fs.existsSync(epicsDir)) {\n      const epicFiles = fs.readdirSync(epicsDir);\n      for (const file of epicFiles) {\n        const match = file.match(epicPattern);\n        if (match) {\n          maxEpic = Math.max(maxEpic, parseInt(match[1], 10));\n        }\n      }\n    }\n\n    // Find highest existing issue ID\n    const issuePrefix = this.config.naming_conventions.issue_prefix;\n    const issuePattern = new RegExp(`${issuePrefix}-(\\\\d+)`);\n    let maxIssue = 0;\n\n    if (fs.existsSync(issuesDir)) {\n      const issueFiles = fs.readdirSync(issuesDir);\n      for (const file of issueFiles) {\n        const match = file.match(issuePattern);\n        if (match) {\n          maxIssue = Math.max(maxIssue, parseInt(match[1], 10));\n        }\n      }\n    }\n\n    // Find highest existing task ID\n    const taskPrefix = this.config.naming_conventions.task_prefix;\n    const taskPattern = new RegExp(`${taskPrefix}-(\\\\d+)`);\n    let maxTask = 0;\n\n    if (fs.existsSync(tasksDir)) {\n      const taskFiles = fs.readdirSync(tasksDir);\n      for (const file of taskFiles) {\n        const match = file.match(taskPattern);\n        if (match) {\n          maxTask = Math.max(maxTask, parseInt(match[1], 10));\n        }\n      }\n    }\n\n    // Set counters to next available numbers\n    this.counters.epic = maxEpic + 1;\n    this.counters.issue = maxIssue + 1;\n    this.counters.task = maxTask + 1;\n\n    this.saveCounters();\n  }\n\n  /**\n   * Load counters from file\n   */\n  private loadCounters(): void {\n    try {\n      if (fs.existsSync(this.countersPath)) {\n        const data = fs.readFileSync(this.countersPath, 'utf8');\n        const loaded = JSON.parse(data);\n\n        // Validate and merge with defaults\n        this.counters.project = Math.max(1, loaded.project || 1);\n        this.counters.epic = Math.max(1, loaded.epic || 1);\n        this.counters.issue = Math.max(1, loaded.issue || 1);\n        this.counters.task = Math.max(1, loaded.task || 1);\n        this.counters.pr = Math.max(1, loaded.pr || 1);\n      }\n    } catch (error) {\n      console.warn(\n        `Failed to load counters, using defaults: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n      // Keep default values\n    }\n  }\n\n  /**\n   * Save counters to file\n   */\n  private saveCounters(): void {\n    try {\n      const dir = path.dirname(this.countersPath);\n      if (!fs.existsSync(dir)) {\n        fs.mkdirSync(dir, { recursive: true });\n      }\n\n      const data = JSON.stringify(this.counters, null, 2);\n      fs.writeFileSync(this.countersPath, data, 'utf8');\n    } catch (error) {\n      console.warn(\n        `Failed to save counters: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Validate ID format\n   */\n  public validateId(id: string, type: 'project' | 'epic' | 'issue' | 'task' | 'pr'): boolean {\n    const prefix =\n      this.config.naming_conventions[`${type}_prefix`] ||\n      (type === 'project' ? 'PRJ' : type === 'pr' ? 'PR' : '');\n    const pattern = new RegExp(`^${prefix}-\\\\d{4}$`);\n    return pattern.test(id);\n  }\n\n  /**\n   * Extract number from ID\n   */\n  public extractIdNumber(\n    id: string,\n    type: 'project' | 'epic' | 'issue' | 'task' | 'pr'\n  ): number | null {\n    const prefix =\n      this.config.naming_conventions[`${type}_prefix`] ||\n      (type === 'project' ? 'PRJ' : type === 'pr' ? 'PR' : '');\n    const pattern = new RegExp(`^${prefix}-(\\\\d{4})$`);\n    const match = id.match(pattern);\n    return match ? parseInt(match[1], 10) : null;\n  }\n\n  /**\n   * Generate batch of IDs (useful for bulk operations)\n   */\n  public generateBatchIds(\n    type: 'project' | 'epic' | 'issue' | 'task' | 'pr',\n    count: number\n  ): string[] {\n    const ids: string[] = [];\n    const prefix =\n      this.config.naming_conventions[`${type}_prefix`] ||\n      (type === 'project' ? 'PRJ' : type === 'pr' ? 'PR' : '');\n\n    for (let i = 0; i < count; i++) {\n      const id = `${prefix}-${this.counters[type].toString().padStart(4, '0')}`;\n      ids.push(id);\n      this.counters[type]++;\n    }\n\n    this.saveCounters();\n    return ids;\n  }\n}\n","/**\n * AI-Trackdown Init Command\n * Initialize new ai-trackdown projects with YAML frontmatter architecture\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport type { ProjectConfig } from '../types/ai-trackdown.js';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { FrontmatterParser } from '../utils/frontmatter-parser.js';\nimport { AITrackdownIdGenerator } from '../utils/id-generator.js';\nimport { TemplateManager } from '../utils/template-manager.js';\nimport { UnifiedPathResolver } from '../utils/unified-path-resolver.js';\n\ninterface InitOptions {\n  force?: boolean;\n  interactive?: boolean;\n  skipInteractive?: boolean;\n  projectName?: string;\n  type?: string;\n  assignee?: string;\n  name?: string;\n  tasksDirectory?: string; // NEW: Support for --tasks-dir option\n}\n\nexport function createInitCommand(): Command {\n  const command = new Command('init');\n\n  command\n    .description('Initialize a new AI-Trackdown project with hierarchical structure')\n    .argument('[project-name]', 'name of the project')\n    .option('--project-name <name>', 'project name (alternative to positional argument)')\n    .option('--type <type>', 'project type (software, research, business, general)', 'general')\n    .option('--assignee <assignee>', 'default assignee for items')\n    .option(\n      '--tasks-directory <path>',\n      'root directory for all task types (default: tasks)',\n      'tasks'\n    )\n    .option('--force', 'overwrite existing project')\n    .option('--interactive', 'interactive setup mode')\n    .option(\n      '--skip-interactive',\n      'skip interactive prompts, use defaults or fail if required info missing'\n    )\n    .addHelpText(\n      'after',\n      `\nExamples:\n  $ aitrackdown init my-project --type software\n  $ aitrackdown init research-project --type research --interactive\n  $ aitrackdown init --interactive\n  $ aitrackdown init my-project --tasks-directory work\n  $ aitrackdown init --project-name my-project --skip-interactive\n  $ echo \"my-project\" | aitrackdown init --skip-interactive\n\nProject Types:\n  software  - Software development projects\n  research  - Research and analysis projects  \n  business  - Business process and planning\n  general   - General purpose projects\n\nDirectory Structure:\n  Default structure with --tasks-directory \"tasks\":\n    tasks/epics/, tasks/issues/, tasks/tasks/, tasks/templates/\n  \n  Custom structure with --tasks-directory \"work\":\n    work/epics/, work/issues/, work/tasks/, work/templates/\n`\n    )\n    .action(async (projectName?: string, options: InitOptions = {}) => {\n      try {\n        // Determine project name from various sources\n        let finalProjectName = projectName || options.projectName;\n\n        // Try to read from stdin if no project name provided\n        if (!finalProjectName) {\n          const stdinName = await readProjectNameFromStdin();\n          if (stdinName) {\n            finalProjectName = stdinName;\n          }\n        }\n\n        let config = {\n          name: finalProjectName,\n          type: options.type || 'general',\n          assignee: options.assignee || process.env.USER || 'unassigned',\n          tasksDirectory: options.tasksDirectory || process.env.CLI_TASKS_DIR || 'tasks',\n          force: options.force || false,\n        };\n\n        // Determine if we should run interactive mode\n        const shouldRunInteractive =\n          options.interactive ||\n          (!options.skipInteractive && !finalProjectName && !isNonInteractive());\n\n        // Interactive mode\n        if (shouldRunInteractive) {\n          if (isNonInteractive()) {\n            throw new Error(\n              'Interactive mode requested but running in non-interactive environment. Use --skip-interactive or provide --project-name.'\n            );\n          }\n          config = await runInteractiveSetup(config);\n        } else if (options.skipInteractive && !config.name) {\n          throw new Error(\n            'Project name is required when using --skip-interactive. Use --project-name or provide as argument.'\n          );\n        }\n\n        // Validate project name\n        const projectNameValue = config.name || 'ai-trackdown-project';\n        if (!/^[a-zA-Z0-9][a-zA-Z0-9-_]*$/.test(projectNameValue)) {\n          throw new Error(\n            'Project name must start with alphanumeric character and contain only letters, numbers, hyphens, and underscores'\n          );\n        }\n\n        const projectPath = path.resolve(process.cwd(), projectNameValue);\n\n        // Check if project already exists\n        if (fs.existsSync(projectPath) && !config.force) {\n          console.error(`❌ Project \"${projectNameValue}\" already exists`);\n          console.log('💡 Use --force to overwrite existing project');\n          process.exit(1);\n        }\n\n        const spinner = ora('Initializing AI-Trackdown project...').start();\n\n        try {\n          // Create project directory\n          if (!fs.existsSync(projectPath)) {\n            fs.mkdirSync(projectPath, { recursive: true });\n          }\n\n          // Create ConfigManager and initialize project\n          const configManager = new ConfigManager(projectPath);\n          const projectConfig = configManager.createDefaultConfig(projectNameValue, {\n            description: `AI-Trackdown ${config.type} project: ${projectNameValue}`,\n            default_assignee: config.assignee,\n            tasks_directory: config.tasksDirectory,\n          });\n\n          spinner.text = 'Creating project structure...';\n\n          // Initialize the project structure only (without default templates)\n          configManager.createProjectStructure(projectConfig);\n          configManager.saveConfig(projectConfig);\n\n          spinner.text = 'Deploying templates...';\n\n          // Deploy bundled templates using TemplateManager\n          const templateManager = new TemplateManager();\n          const pathResolver = new UnifiedPathResolver(projectConfig, projectPath);\n          const paths = pathResolver.getUnifiedPaths();\n\n          templateManager.deployTemplates(paths.templatesDir, config.force);\n\n          spinner.text = 'Setting up ID generator...';\n\n          // Initialize ID generator\n          const idGenerator = new AITrackdownIdGenerator(projectConfig, projectPath);\n\n          spinner.text = 'Creating example items...';\n\n          // Create example epic, issue, and task\n          await createExampleItems(projectPath, projectConfig, idGenerator);\n\n          spinner.text = 'Creating documentation...';\n\n          // Create README\n          createProjectReadme(projectPath, projectNameValue, config.type, projectConfig);\n\n          // Create .gitignore\n          createGitignore(projectPath);\n\n          spinner.succeed('AI-Trackdown project initialized successfully!');\n\n          // Show success message\n          console.log(`\n🎉 AI-Trackdown project \"${projectNameValue}\" created successfully!\n\nProject Type: ${config.type}\nLocation: ${projectPath}\nConfiguration: .ai-trackdown/config.yaml\nTasks Directory: ${config.tasksDirectory}/\n\n📁 Project Structure (Unified Layout):\n├── .ai-trackdown/          # Configuration and metadata\n│   ├── config.yaml         # Project configuration\n│   ├── counters.json       # ID counters\n│   └── templates/          # Item templates  \n├── ${config.tasksDirectory}/                # Tasks root directory\n│   ├── epics/              # Epic-level planning\n│   ├── issues/             # Issue-level work items\n│   ├── tasks/              # Task-level activities\n│   ├── prs/                # Pull request tracking\n│   └── templates/          # Item templates\n├── .gitignore             # Git ignore patterns\n└── README.md              # Project documentation\n\n🚀 Next Steps:\n1. Navigate to your project:\n   cd ${projectNameValue}\n\n2. Explore the example items:\n   ls ${config.tasksDirectory}/epics/ ${config.tasksDirectory}/issues/ ${config.tasksDirectory}/tasks/\n\n3. Create your first epic:\n   aitrackdown epic create \"New Feature Development\"\n\n4. Create an issue within the epic:\n   aitrackdown issue create \"API Implementation\" --epic EP-0001\n\n5. Create tasks for the issue:\n   aitrackdown task create \"Design API Schema\" --issue ISS-0001\n\n6. View project status:\n   aitrackdown status\n\n7. Get help:\n   aitrackdown --help\n`);\n        } catch (error) {\n          spinner.fail('Project initialization failed');\n          throw error;\n        }\n      } catch (error) {\n        console.error(\n          `❌ Failed to initialize project: ${error instanceof Error ? error.message : 'Unknown error'}`\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n\n/**\n * Check if running in a non-interactive environment\n */\nfunction isNonInteractive(): boolean {\n  return !process.stdout.isTTY || !process.stdin.isTTY || process.env.CI === 'true';\n}\n\n/**\n * Read project name from stdin if available\n */\nasync function readProjectNameFromStdin(): Promise<string | null> {\n  return new Promise((resolve) => {\n    // Check if stdin has data available (piped input)\n    if (!process.stdin.isTTY) {\n      let input = '';\n      let resolved = false;\n\n      const timeout = setTimeout(() => {\n        if (!resolved) {\n          resolved = true;\n          resolve(null);\n        }\n      }, 100); // Short timeout for piped input\n\n      process.stdin.setEncoding('utf8');\n\n      // For piped input, we need to read immediately\n      process.stdin.on('data', (chunk) => {\n        input += chunk.toString();\n      });\n\n      process.stdin.on('end', () => {\n        if (!resolved) {\n          resolved = true;\n          clearTimeout(timeout);\n          const projectName = input.trim();\n          resolve(projectName || null);\n        }\n      });\n\n      // Handle case where stdin is not available or empty\n      process.stdin.on('error', () => {\n        if (!resolved) {\n          resolved = true;\n          clearTimeout(timeout);\n          resolve(null);\n        }\n      });\n\n      // For certain environments, stdin might be immediately available\n      setImmediate(() => {\n        if (!resolved && process.stdin.readable) {\n          const chunk = process.stdin.read();\n          if (chunk !== null) {\n            input += chunk.toString();\n          }\n        }\n      });\n    } else {\n      resolve(null);\n    }\n  });\n}\n\nasync function runInteractiveSetup(initialConfig: any) {\n  console.log(`\n🚀 AI-Trackdown Interactive Setup\n`);\n\n  // Check if we're in a non-interactive environment before attempting to prompt\n  if (isNonInteractive()) {\n    throw new Error(\n      'Cannot run interactive setup in non-interactive environment. Use --skip-interactive or provide --project-name.'\n    );\n  }\n\n  try {\n    const answers = await inquirer.prompt([\n      {\n        type: 'input',\n        name: 'name',\n        message: 'Project name:',\n        default: initialConfig.name || 'my-trackdown-project',\n        validate: (input: string) => {\n          if (!/^[a-zA-Z0-9][a-zA-Z0-9-_]*$/.test(input)) {\n            return 'Project name must start with alphanumeric character and contain only letters, numbers, hyphens, and underscores';\n          }\n          return true;\n        },\n      },\n      {\n        type: 'list',\n        name: 'type',\n        message: 'Project type:',\n        choices: [\n          { name: '💻 Software - Software development projects', value: 'software' },\n          { name: '🔬 Research - Research and analysis projects', value: 'research' },\n          { name: '📊 Business - Business process and planning', value: 'business' },\n          { name: '📁 General - General purpose projects', value: 'general' },\n        ],\n        default: initialConfig.type,\n      },\n      {\n        type: 'input',\n        name: 'assignee',\n        message: 'Default assignee:',\n        default: initialConfig.assignee,\n      },\n      {\n        type: 'input',\n        name: 'tasksDirectory',\n        message: 'Tasks root directory:',\n        default: initialConfig.tasksDirectory || 'tasks',\n        validate: (input: string) => {\n          if (!/^[a-zA-Z0-9][a-zA-Z0-9-_/]*$/.test(input)) {\n            return 'Tasks directory must start with alphanumeric character and contain only letters, numbers, hyphens, underscores, and slashes';\n          }\n          return true;\n        },\n      },\n      {\n        type: 'confirm',\n        name: 'force',\n        message: 'Overwrite existing project if it exists?',\n        default: initialConfig.force,\n        when: (answers) => fs.existsSync(path.resolve(process.cwd(), answers.name)),\n      },\n    ]);\n\n    return { ...initialConfig, ...answers };\n  } catch (error) {\n    if (error instanceof Error) {\n      if (\n        error.message.includes('User force closed the prompt') ||\n        error.message.includes('prompt aborted') ||\n        error.message.includes('canceled')\n      ) {\n        throw new Error(\n          'Interactive setup was cancelled. Use --skip-interactive to bypass prompts.'\n        );\n      }\n      throw error;\n    }\n    throw new Error('Interactive setup failed. Use --skip-interactive to bypass prompts.');\n  }\n}\n\nasync function createExampleItems(\n  projectPath: string,\n  config: ProjectConfig,\n  idGenerator: AITrackdownIdGenerator\n): Promise<void> {\n  const parser = new FrontmatterParser();\n\n  // Get unified paths for the project\n  // UnifiedPathResolver already imported at the top\n  const pathResolver = new UnifiedPathResolver(config, projectPath);\n  const paths = pathResolver.getUnifiedPaths();\n\n  // Create example epic\n  const epicId = idGenerator.generateEpicId('Project Setup and Initial Development');\n  const epicPath = path.join(\n    paths.epicsDir,\n    idGenerator.generateFilename(epicId, 'Project Setup and Initial Development')\n  );\n\n  const epicData = {\n    epic_id: epicId,\n    title: 'Project Setup and Initial Development',\n    description: 'Initial setup and foundational development for the project',\n    status: 'active' as const,\n    priority: 'high' as const,\n    assignee: config.default_assignee || 'unassigned',\n    created_date: new Date().toISOString(),\n    updated_date: new Date().toISOString(),\n    estimated_tokens: 500,\n    actual_tokens: 0,\n    ai_context: ['project-setup', 'initial-development', 'foundation'],\n    related_issues: ['ISS-0001'],\n    sync_status: 'local' as const,\n    tags: ['setup', 'foundation'],\n    milestone: 'v1.0.0',\n  };\n\n  const epicContent = `# Epic: Project Setup and Initial Development\n\n## Overview\nThis epic covers the foundational work needed to get the project up and running, including environment setup, initial architecture decisions, and core infrastructure.\n\n## Objectives\n- [ ] Set up development environment\n- [ ] Establish project structure and conventions\n- [ ] Implement core infrastructure\n- [ ] Create initial documentation\n\n## Success Criteria\n- Development environment is fully configured\n- Team can effectively collaborate on the project\n- Core infrastructure is in place and tested\n- Documentation is comprehensive and up-to-date\n\n## Related Issues\n- ISS-0001: Development Environment Setup\n\n## Notes\nThis is a foundational epic that will enable all future development work.`;\n\n  parser.writeEpic(epicPath, epicData, epicContent);\n\n  // Create example issue\n  const issueId = idGenerator.generateIssueId(epicId, 'Development Environment Setup');\n  const issuePath = path.join(\n    paths.issuesDir,\n    idGenerator.generateFilename(issueId, 'Development Environment Setup')\n  );\n\n  const issueData = {\n    issue_id: issueId,\n    epic_id: epicId,\n    title: 'Development Environment Setup',\n    description: 'Configure development environment and tooling for the project',\n    status: 'active' as const,\n    priority: 'high' as const,\n    assignee: config.default_assignee || 'unassigned',\n    created_date: new Date().toISOString(),\n    updated_date: new Date().toISOString(),\n    estimated_tokens: 200,\n    actual_tokens: 0,\n    ai_context: ['environment-setup', 'tooling', 'configuration'],\n    related_tasks: ['TSK-0001', 'TSK-0002'],\n    sync_status: 'local' as const,\n    tags: ['setup', 'environment'],\n    dependencies: [],\n  };\n\n  const issueContent = `# Issue: Development Environment Setup\n\n## Description\nSet up a consistent development environment that all team members can use. This includes configuring development tools, establishing coding standards, and creating setup documentation.\n\n## Tasks\n- TSK-0001: Install and configure development tools\n- TSK-0002: Create development setup documentation\n\n## Acceptance Criteria\n- [ ] All required development tools are identified and documented\n- [ ] Setup instructions are created and tested\n- [ ] Development environment can be replicated consistently\n- [ ] Team members can successfully set up their environments\n\n## Dependencies\nNone - this is foundational work.\n\n## Notes\nFocus on creating a setup that is reliable and easy to follow for new team members.`;\n\n  parser.writeIssue(issuePath, issueData, issueContent);\n\n  // Create example task 1\n  const task1Id = idGenerator.generateTaskId(issueId, 'Install and configure development tools');\n  const task1Path = path.join(\n    paths.tasksDir,\n    idGenerator.generateFilename(task1Id, 'Install and configure development tools')\n  );\n\n  const task1Data = {\n    task_id: task1Id,\n    issue_id: issueId,\n    epic_id: epicId,\n    title: 'Install and configure development tools',\n    description: 'Install required development tools and configure them for the project',\n    status: 'planning' as const,\n    priority: 'high' as const,\n    assignee: config.default_assignee || 'unassigned',\n    created_date: new Date().toISOString(),\n    updated_date: new Date().toISOString(),\n    estimated_tokens: 100,\n    actual_tokens: 0,\n    ai_context: ['tool-installation', 'configuration', 'setup'],\n    sync_status: 'local' as const,\n    tags: ['tools', 'setup'],\n    time_estimate: '4 hours',\n    dependencies: [],\n  };\n\n  const task1Content = `# Task: Install and configure development tools\n\n## Description\nInstall and configure all necessary development tools for the project including IDE, version control, package managers, and any project-specific tools.\n\n## Steps\n1. Install IDE/editor with required extensions\n2. Configure version control (Git)\n3. Install package managers and dependencies\n4. Set up project-specific tools and utilities\n5. Test the complete development setup\n\n## Acceptance Criteria\n- [ ] All required tools are installed and working\n- [ ] Configuration is documented\n- [ ] Setup can be reproduced on different machines\n- [ ] All tools integrate properly with the project\n\n## Tools to Install\n- [ ] IDE/Editor (VS Code, IntelliJ, etc.)\n- [ ] Git and Git client\n- [ ] Node.js/Python/etc. (as needed)\n- [ ] Package managers\n- [ ] Project-specific tools\n\n## Notes\nDocument any platform-specific setup requirements.`;\n\n  parser.writeTask(task1Path, task1Data, task1Content);\n\n  // Create example task 2\n  const task2Id = idGenerator.generateTaskId(issueId, 'Create development setup documentation');\n  const task2Path = path.join(\n    paths.tasksDir,\n    idGenerator.generateFilename(task2Id, 'Create development setup documentation')\n  );\n\n  const task2Data = {\n    task_id: task2Id,\n    issue_id: issueId,\n    epic_id: epicId,\n    title: 'Create development setup documentation',\n    description: 'Write comprehensive documentation for setting up the development environment',\n    status: 'planning' as const,\n    priority: 'medium' as const,\n    assignee: config.default_assignee || 'unassigned',\n    created_date: new Date().toISOString(),\n    updated_date: new Date().toISOString(),\n    estimated_tokens: 100,\n    actual_tokens: 0,\n    ai_context: ['documentation', 'setup-guide', 'onboarding'],\n    sync_status: 'local' as const,\n    tags: ['documentation', 'setup'],\n    time_estimate: '2 hours',\n    dependencies: ['TSK-0001'],\n  };\n\n  const task2Content = `# Task: Create development setup documentation\n\n## Description\nCreate comprehensive setup documentation that enables new team members to quickly and reliably set up their development environment.\n\n## Steps\n1. Document all required tools and versions\n2. Write step-by-step setup instructions\n3. Include troubleshooting section\n4. Add platform-specific notes (Windows/Mac/Linux)\n5. Test documentation with a fresh setup\n\n## Acceptance Criteria\n- [ ] Documentation is complete and accurate\n- [ ] Instructions work on all supported platforms\n- [ ] Troubleshooting section addresses common issues\n- [ ] Documentation is easily accessible to team members\n\n## Documentation Sections\n- [ ] Prerequisites and system requirements\n- [ ] Tool installation instructions\n- [ ] Configuration steps\n- [ ] Verification and testing\n- [ ] Troubleshooting common issues\n- [ ] Contact information for help\n\n## Notes\nKeep documentation updated as tools and requirements evolve.`;\n\n  parser.writeTask(task2Path, task2Data, task2Content);\n}\n\nfunction createProjectReadme(\n  projectPath: string,\n  projectName: string,\n  projectType: string,\n  config: ProjectConfig\n): void {\n  const tasksDir = config.tasks_directory || 'tasks';\n  const readmeContent = `# ${projectName}\n\nAn AI-Trackdown project for hierarchical project management.\n\n**Project Type:** ${projectType}  \n**Created:** ${new Date().toISOString().split('T')[0]}\n**Tasks Directory:** ${tasksDir}/\n\n## Overview\n\nThis project uses AI-Trackdown for hierarchical project management with Epics, Issues, and Tasks. Each item has YAML frontmatter for metadata and Markdown content for descriptions.\n\n## Unified Directory Structure\n\n\\`\\`\\`\n${projectName}/\n├── .ai-trackdown/          # Configuration and metadata\n│   ├── config.yaml         # Project configuration\n│   ├── counters.json       # ID generation counters\n│   └── templates/          # Item templates\n├── ${tasksDir}/                  # Tasks root directory (configurable)\n│   ├── epics/              # Epic-level planning (.md files)\n│   ├── issues/             # Issue-level work items (.md files)\n│   ├── tasks/              # Task-level activities (.md files)\n│   ├── prs/                # Pull request tracking (.md files)\n│   └── templates/          # Item templates\n├── .gitignore             # Git ignore patterns\n└── README.md              # This file\n\\`\\`\\`\n\n## Hierarchy\n\n- **Epics** (${config.naming_conventions.epic_prefix}-XXXX): High-level features or objectives\n- **Issues** (${config.naming_conventions.issue_prefix}-XXXX): Specific work items within epics\n- **Tasks** (${config.naming_conventions.task_prefix}-XXXX): Granular activities within issues\n\n## Getting Started\n\n### View Items\n\\`\\`\\`bash\n# List all epics\nls ${tasksDir}/epics/\n\n# List all issues\nls ${tasksDir}/issues/\n\n# List all tasks\nls ${tasksDir}/tasks/\n\n# List all PRs\nls ${tasksDir}/prs/\n\\`\\`\\`\n\n### Create New Items\n\\`\\`\\`bash\n# Create a new epic\naitrackdown epic create \"New Feature Development\"\n\n# Create an issue within an epic\naitrackdown issue create \"API Implementation\" --epic EP-0001\n\n# Create a task within an issue\naitrackdown task create \"Design API Schema\" --issue ISS-0001\n\\`\\`\\`\n\n### Project Management\n\\`\\`\\`bash\n# View project status\naitrackdown status\n\n# Search items\naitrackdown search --status active --priority high\n\n# Update item status\naitrackdown task update TSK-0001 --status completed\n\n# Export project data\naitrackdown export --format json\n\\`\\`\\`\n\n## Configuration\n\nProject configuration is stored in \\`.ai-trackdown/config.yaml\\`. You can modify:\n\n- Directory structure\n- Naming conventions\n- Default assignee\n- AI context templates\n- Automation settings\n\n## File Format\n\nEach item file contains YAML frontmatter and Markdown content:\n\n\\`\\`\\`markdown\n---\nepic_id: EP-0001\ntitle: Project Setup and Initial Development\ndescription: Initial setup and foundational development\nstatus: active\npriority: high\nassignee: ${config.default_assignee}\ncreated_date: 2023-XX-XX\nupdated_date: 2023-XX-XX\nestimated_tokens: 500\nactual_tokens: 0\nai_context:\n  - project-setup\n  - initial-development\nrelated_issues:\n  - ISS-0001\nsync_status: local\n---\n\n# Epic: Project Setup and Initial Development\n\n## Overview\nDetailed description of the epic...\n\\`\\`\\`\n\n## Examples\n\nThe project includes example items to help you get started:\n- **EP-0001**: Project Setup and Initial Development\n- **ISS-0001**: Development Environment Setup\n- **TSK-0001**: Install and configure development tools\n- **TSK-0002**: Create development setup documentation\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| \\`aitrackdown init\\` | Initialize a new project |\n| \\`aitrackdown epic create\\` | Create a new epic |\n| \\`aitrackdown issue create\\` | Create a new issue |\n| \\`aitrackdown task create\\` | Create a new task |\n| \\`aitrackdown status\\` | View project status |\n| \\`aitrackdown search\\` | Search items |\n| \\`aitrackdown export\\` | Export project data |\n\n## Links\n\n- [AI-Trackdown Documentation](https://github.com/your-org/ai-trackdown-tools)\n- [Project Issues](https://github.com/your-org/ai-trackdown-tools/issues)\n\n---\n\n*Generated by ai-trackdown-tools on ${new Date().toISOString().split('T')[0]}*\n`;\n\n  fs.writeFileSync(path.join(projectPath, 'README.md'), readmeContent, 'utf8');\n}\n\nfunction createGitignore(projectPath: string): void {\n  const gitignoreContent = `# AI-Trackdown exports\n.ai-trackdown/exports/\n*.backup\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Coverage directory used by tools like istanbul\ncoverage/\n*.lcov\n\n# Dependency directories\nnode_modules/\n\n# Optional npm cache directory\n.npm\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n.env.test\n\n# IDE files\n.vscode/\n.idea/\n*.swp\n*.swo\n\n# OS generated files\n.DS_Store\n.DS_Store?\n._*\n.Spotlight-V100\n.Trashes\nehthumbs.db\nThumbs.db\n`;\n\n  fs.writeFileSync(path.join(projectPath, '.gitignore'), gitignoreContent, 'utf8');\n}\n","/**\n * Issue Assign Command\n * Assign or reassign issues to users\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface AssignOptions {\n  dryRun?: boolean;\n}\n\nexport function createIssueAssignCommand(): Command {\n  const cmd = new Command('assign');\n\n  cmd\n    .description('Assign an issue to a user')\n    .argument('<issue-id>', 'issue ID to assign')\n    .argument('<assignee>', 'username to assign to')\n    .option('--dry-run', 'show what would be assigned without assigning')\n    .action(async (issueId: string, assignee: string, options: AssignOptions) => {\n      try {\n        await assignIssue(issueId, assignee, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to assign issue: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function assignIssue(\n  issueId: string,\n  assignee: string,\n  options: AssignOptions\n): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n  const parser = new FrontmatterParser();\n\n  // Get issue hierarchy\n  const hierarchy = relationshipManager.getIssueHierarchy(issueId);\n  if (!hierarchy) {\n    throw new Error(`Issue not found: ${issueId}`);\n  }\n\n  const issue = hierarchy.issue;\n  const currentAssignee = issue.assignee;\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - Issue would be assigned:'));\n    console.log(Formatter.debug(`Issue ID: ${issueId}`));\n    console.log(Formatter.debug(`Title: ${issue.title}`));\n    console.log(Formatter.debug(`Current Assignee: ${currentAssignee}`));\n    console.log(Formatter.debug(`New Assignee: ${assignee}`));\n    return;\n  }\n\n  if (currentAssignee === assignee) {\n    console.log(Formatter.warning(`Issue ${issueId} is already assigned to ${assignee}`));\n    return;\n  }\n\n  // Update the issue\n  const _updatedIssue = parser.updateFile(issue.file_path, {\n    assignee,\n    updated_date: new Date().toISOString(),\n  });\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`Issue assigned successfully!`));\n  console.log(Formatter.info(`Issue ID: ${issueId}`));\n  console.log(Formatter.info(`Title: ${issue.title}`));\n  console.log(Formatter.info(`Previous Assignee: ${currentAssignee}`));\n  console.log(Formatter.info(`New Assignee: ${assignee}`));\n}\n","/**\n * Issue close command - Mark issues as completed in ai-trackdown\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface IssueCloseOptions {\n  comment?: string;\n  force?: boolean;\n  dryRun?: boolean;\n  verbose?: boolean;\n}\n\nexport function createIssueCloseCommand(): Command {\n  const cmd = new Command('close');\n\n  cmd\n    .description('Close an issue by marking it as completed')\n    .argument('<issue-id>', 'Issue ID (e.g., ISS-0001)')\n    .option('-c, --comment <text>', 'Add completion comment')\n    .option('-f, --force', 'force closure even if tasks are not completed')\n    .option('--dry-run', 'show what would be closed without closing')\n    .option('-v, --verbose', 'Show detailed output')\n    .action(async (issueId: string, options: IssueCloseOptions) => {\n      try {\n        await handleCloseIssue(issueId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to close issue: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function handleCloseIssue(issueId: string, options: IssueCloseOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n  const parser = new FrontmatterParser();\n\n  // Get issue hierarchy\n  const hierarchy = relationshipManager.getIssueHierarchy(issueId);\n  if (!hierarchy) {\n    throw new Error(`Issue not found: ${issueId}`);\n  }\n\n  const { issue, tasks } = hierarchy;\n\n  // Check if already closed\n  if (issue.status === 'completed') {\n    console.log(Formatter.warning(`Issue ${issueId} is already closed.`));\n    return;\n  }\n\n  // Check completion status of tasks\n  const incompleteTasks = tasks.filter((task) => task.status !== 'completed');\n\n  // Show status\n  if (options.verbose) {\n    console.log(Formatter.info(`Issue: ${issue.title}`));\n    console.log(Formatter.info(`Current Status: ${issue.status}`));\n    console.log('');\n  }\n\n  // Check if all tasks are completed\n  if (incompleteTasks.length > 0 && !options.force) {\n    console.log(Formatter.warning('Issue has incomplete tasks:'));\n\n    for (const task of incompleteTasks.slice(0, 3)) {\n      console.log(`  • ${task.task_id}: ${task.title} [${task.status}]`);\n    }\n    if (incompleteTasks.length > 3) {\n      console.log(`  ... and ${incompleteTasks.length - 3} more`);\n    }\n\n    console.log('');\n    console.log(Formatter.info('Use --force to close anyway, or complete tasks first.'));\n\n    throw new Error('Cannot close issue with incomplete tasks without --force');\n  }\n\n  // Prepare updates\n  const updates = {\n    status: 'completed' as const,\n    completion_percentage: 100,\n    updated_date: new Date().toISOString(),\n  };\n\n  // Add comment if provided\n  if (options.comment) {\n    updates.closing_comment = options.comment;\n  }\n\n  // Show what would be updated\n  console.log(Formatter.info(`${options.dryRun ? 'Dry run - ' : ''}Closing issue:`));\n  console.log(`  Issue: ${issue.issue_id} - ${issue.title}`);\n  console.log(`  Status: ${issue.status} → completed`);\n  console.log(`  Progress: ${issue.completion_percentage || 0}% → 100%`);\n\n  if (options.comment) {\n    console.log(`  Comment: ${options.comment}`);\n  }\n\n  if (options.dryRun) {\n    return;\n  }\n\n  // Perform update\n  try {\n    const updatedIssue = parser.updateFile(issue.file_path, updates);\n\n    // Refresh cache\n    relationshipManager.rebuildCache();\n\n    console.log(Formatter.success(`Issue closed successfully!`));\n    console.log(Formatter.info(`Issue ID: ${issueId}`));\n    console.log(Formatter.info(`Title: ${updatedIssue.title}`));\n    console.log(Formatter.info(`Status: ${updatedIssue.status}`));\n    console.log(Formatter.info(`Closed on: ${new Date().toLocaleDateString()}`));\n\n    if (incompleteTasks.length > 0) {\n      console.log(Formatter.warning(`Note: ${incompleteTasks.length} tasks remain incomplete.`));\n    }\n  } catch (error) {\n    throw new Error(\n      `Failed to update issue file: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\n// Export for use in other commands\nexport { handleCloseIssue };\n","/**\n * Issue Complete Command\n * Mark issues as completed with validation\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface CompleteOptions {\n  force?: boolean;\n  actualTokens?: number;\n  completionNotes?: string;\n  comment?: string;\n  autoCompleteTasks?: boolean;\n  dryRun?: boolean;\n}\n\nexport function createIssueCompleteCommand(): Command {\n  const cmd = new Command('complete');\n\n  cmd\n    .description('Mark an issue as completed')\n    .argument('<issue-id>', 'issue ID to complete')\n    .option('-f, --force', 'complete even if tasks are not completed')\n    .option('--actual-tokens <number>', 'set actual token usage')\n    .option('--completion-notes <text>', 'add completion notes')\n    .option('-c, --comment <text>', 'add completion comment')\n    .option('--auto-complete-tasks', 'automatically complete all child tasks')\n    .option('--dry-run', 'show what would be completed without completing')\n    .action(async (issueId: string, options: CompleteOptions) => {\n      try {\n        await completeIssue(issueId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to complete issue: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function completeIssue(issueId: string, options: CompleteOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n  const parser = new FrontmatterParser();\n\n  // Get issue hierarchy\n  const hierarchy = relationshipManager.getIssueHierarchy(issueId);\n  if (!hierarchy) {\n    throw new Error(`Issue not found: ${issueId}`);\n  }\n\n  const { issue, tasks } = hierarchy;\n\n  // Check if already completed\n  if (issue.status === 'completed') {\n    console.log(Formatter.warning(`Issue ${issueId} is already completed.`));\n    return;\n  }\n\n  // Check completion status of tasks\n  const incompleteTasks = tasks.filter((task) => task.status !== 'completed');\n\n  // Show status\n  console.log(Formatter.info(`Issue: ${issue.title}`));\n  console.log(Formatter.info(`Current Status: ${issue.status}`));\n  console.log('');\n\n  // Show completion statistics\n  const taskCompletionRate =\n    tasks.length > 0 ? ((tasks.length - incompleteTasks.length) / tasks.length) * 100 : 100;\n\n  console.log(Formatter.success('Completion Status:'));\n  console.log(\n    `  Tasks: ${tasks.length - incompleteTasks.length}/${tasks.length} completed (${taskCompletionRate.toFixed(1)}%)`\n  );\n  console.log('');\n\n  // Check if all tasks are completed\n  if (incompleteTasks.length > 0 && !options.force && !options.autoCompleteTasks) {\n    console.log(Formatter.warning('Issue has incomplete tasks:'));\n\n    for (const task of incompleteTasks.slice(0, 5)) {\n      console.log(`    • ${task.task_id}: ${task.title} [${task.status}]`);\n    }\n    if (incompleteTasks.length > 5) {\n      console.log(`    ... and ${incompleteTasks.length - 5} more`);\n    }\n\n    console.log('');\n    console.log(Formatter.info('Options:'));\n    console.log('  - Use --force to complete anyway');\n    console.log('  - Use --auto-complete-tasks to complete all tasks');\n    console.log('  - Complete tasks manually first');\n\n    throw new Error(\n      'Cannot complete issue with incomplete tasks without --force or --auto-complete-tasks'\n    );\n  }\n\n  // Prepare updates\n  const updates = {\n    status: 'completed' as const,\n    completion_percentage: 100,\n    updated_date: new Date().toISOString(),\n  };\n\n  if (options.actualTokens !== undefined) {\n    (updates as any).actual_tokens = parseInt(options.actualTokens.toString(), 10);\n  }\n\n  // Add comment if provided\n  if (options.comment) {\n    (updates as any).completion_comment = options.comment;\n  }\n\n  // Prepare task completions if auto-complete is enabled\n  const taskUpdates = [];\n\n  if (options.autoCompleteTasks) {\n    for (const task of incompleteTasks) {\n      taskUpdates.push({\n        id: task.task_id,\n        filePath: task.file_path,\n        updates: {\n          status: 'completed' as const,\n          updated_date: new Date().toISOString(),\n        },\n      });\n    }\n  }\n\n  // Show what would be updated\n  console.log(Formatter.info(`${options.dryRun ? 'Dry run - ' : ''}Would complete:`));\n  console.log(`  Issue: ${issue.issue_id} - ${issue.title}`);\n  console.log(`    Status: ${issue.status} → completed`);\n  console.log(`    Progress: ${issue.completion_percentage || 0}% → 100%`);\n\n  if (options.actualTokens !== undefined) {\n    console.log(`    Actual Tokens: ${issue.actual_tokens || 0} → ${options.actualTokens}`);\n  }\n\n  if (options.comment) {\n    console.log(`    Comment: ${options.comment}`);\n  }\n\n  if (taskUpdates.length > 0) {\n    console.log(`  Tasks (${taskUpdates.length}):`);\n    for (const task of taskUpdates) {\n      console.log(`    • ${task.id}: → completed`);\n    }\n  }\n\n  if (options.dryRun) {\n    return;\n  }\n\n  // Perform updates\n  try {\n    // Update issue\n    const updatedIssue = parser.updateFile(issue.file_path, updates);\n\n    // Update tasks if auto-complete is enabled\n    for (const task of taskUpdates) {\n      parser.updateFile(task.filePath, task.updates);\n    }\n\n    // Refresh cache\n    relationshipManager.rebuildCache();\n\n    console.log(Formatter.success(`Issue completed successfully!`));\n    console.log(Formatter.info(`Issue ID: ${issueId}`));\n    console.log(Formatter.info(`Title: ${updatedIssue.title}`));\n    console.log(Formatter.info(`Status: ${updatedIssue.status}`));\n    console.log(Formatter.info(`Progress: ${updatedIssue.completion_percentage}%`));\n\n    if (updatedIssue.actual_tokens) {\n      console.log(Formatter.info(`Actual Tokens: ${updatedIssue.actual_tokens}`));\n\n      if (updatedIssue.estimated_tokens > 0) {\n        const efficiency = updatedIssue.actual_tokens / updatedIssue.estimated_tokens;\n        const efficiencyDisplay =\n          efficiency <= 1\n            ? Formatter.success(`${(efficiency * 100).toFixed(1)}%`)\n            : Formatter.warning(`${(efficiency * 100).toFixed(1)}%`);\n        console.log(Formatter.info(`Token Efficiency: ${efficiencyDisplay}`));\n      }\n    }\n\n    if (taskUpdates.length > 0) {\n      console.log(Formatter.info(`Also completed ${taskUpdates.length} tasks.`));\n    }\n\n    console.log('');\n    console.log(Formatter.success('🎉 Issue completion summary:'));\n    console.log(`  • ${tasks.length} tasks total`);\n    console.log(`  • Completed on ${new Date().toLocaleDateString()}`);\n\n    if (options.completionNotes) {\n      console.log(`  • Notes: ${options.completionNotes}`);\n    }\n\n    if (options.comment) {\n      console.log(`  • Comment: ${options.comment}`);\n    }\n  } catch (error) {\n    throw new Error(\n      `Failed to update files: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n","/**\n * Issue Create Command\n * Creates new issues using YAML frontmatter system with project context support\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { IssueFrontmatter, ItemStatus, Priority, UnifiedState } from '../../types/ai-trackdown.js';\nimport type { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { ProjectContextManager } from '../../utils/project-context-manager.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\nimport { IdGenerator } from '../../utils/simple-id-generator.js';\nimport { TrackdownIndexManager } from '../../utils/trackdown-index-manager.js';\n\ninterface CreateOptions {\n  title?: string;\n  epic?: string;\n  description?: string;\n  assignee?: string;\n  priority?: Priority;\n  status?: ItemStatus;\n  state?: UnifiedState;\n  template?: string;\n  estimatedTokens?: number;\n  tags?: string;\n  milestone?: string;\n  dependencies?: string;\n  project?: string;\n  dryRun?: boolean;\n}\n\nexport function createIssueCreateCommand(): Command {\n  const cmd = new Command('create');\n\n  cmd\n    .description('Create a new issue (optionally within an epic)')\n    .argument('[title]', 'issue title (optional if using --title flag)')\n    .option('--title <text>', 'issue title (alternative to positional argument)')\n    .option('-e, --epic <epic-id>', 'parent epic ID (auto-creates if missing)')\n    .option('-d, --description <text>', 'issue description')\n    .option('-a, --assignee <username>', 'assignee username')\n    .option('-p, --priority <level>', 'priority level (low|medium|high|critical)', 'medium')\n    .option(\n      '-s, --status <status>',\n      'initial status (planning|active|completed|archived)',\n      'planning'\n    )\n    .option(\n      '--state <state>',\n      'initial unified state (planning|active|completed|archived|ready_for_engineering|ready_for_qa|ready_for_deployment|won_t_do|done)'\n    )\n    .option('-t, --template <name>', 'template to use', 'default')\n    .option('--estimated-tokens <number>', 'estimated token usage', '0')\n    .option('--tags <tags>', 'comma-separated tags')\n    .option('-m, --milestone <name>', 'milestone name')\n    .option('--dependencies <ids>', 'comma-separated dependency IDs')\n    .option('--project <name>', 'project name (for multi-project mode)')\n    .option('--dry-run', 'show what would be created without creating')\n    .action(async (titleArg: string | undefined, options: CreateOptions) => {\n      try {\n        // Support both positional argument and --title flag\n        const title = titleArg || options.title;\n        if (!title) {\n          throw new Error(\n            'Issue title is required. Provide it as a positional argument or use --title flag.'\n          );\n        }\n        await createIssue(title, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to create issue: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function createIssue(title: string, options: CreateOptions): Promise<void> {\n  // Initialize project context manager\n  const contextManager = new ProjectContextManager();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Initialize project context\n  const projectContext = await contextManager.initializeContext(options.project);\n\n  // Ensure project structure exists\n  await contextManager.ensureProjectStructure();\n\n  // Get managers and paths from context\n  const configManager = projectContext.configManager;\n  const config = configManager.getConfig();\n  const paths = projectContext.paths;\n  const parser = new FrontmatterParser();\n  const idGenerator = new IdGenerator();\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Handle epic parameter with flexible creation\n  let epicId = options.epic;\n  let epicHierarchy: any = null;\n\n  if (epicId) {\n    // Check if epic exists\n    epicHierarchy = relationshipManager.getEpicHierarchy(epicId);\n    if (!epicHierarchy) {\n      console.warn(Formatter.warning(`Epic ${epicId} not found. Creating placeholder epic...`));\n\n      // Auto-create missing epic\n      try {\n        await createPlaceholderEpic(epicId, paths, configManager, parser, idGenerator);\n        console.log(Formatter.success(`Created placeholder epic ${epicId}`));\n\n        // Reload relationship manager to pick up new epic\n        relationshipManager.rebuildCache();\n        epicHierarchy = relationshipManager.getEpicHierarchy(epicId);\n      } catch (error) {\n        console.warn(\n          Formatter.warning(\n            `Failed to create placeholder epic: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        console.log(Formatter.info(`Continuing with issue creation without epic...`));\n        epicId = undefined;\n      }\n    }\n  } else {\n    // No epic specified - create standalone issue\n    console.log(Formatter.info(`Creating standalone issue without epic...`));\n  }\n\n  // Generate issue ID\n  const issueId = idGenerator.generateIssueId(epicId, title);\n\n  // Get template\n  const template = configManager.getTemplateWithFallback('issue', options.template || 'default');\n  if (!template) {\n    throw new Error(`Issue template '${options.template || 'default'}' not found`);\n  }\n\n  // Parse tags and dependencies\n  const tags = options.tags ? options.tags.split(',').map((tag) => tag.trim()) : [];\n  const dependencies = options.dependencies\n    ? options.dependencies.split(',').map((dep) => dep.trim())\n    : [];\n\n  // Create issue frontmatter\n  const now = new Date().toISOString();\n  const issueFrontmatter: IssueFrontmatter = {\n    issue_id: issueId,\n    epic_id: epicId,\n    title,\n    description: options.description || template.frontmatter_template.description || '',\n    status: options.status || 'planning',\n    // Add state field if provided\n    ...(options.state && { \n      state: options.state,\n      state_metadata: {\n        transitioned_at: now,\n        transitioned_by: process.env.USER || 'system',\n        automation_eligible: false,\n        transition_reason: 'Initial creation'\n      }\n    }),\n    priority: options.priority || 'medium',\n    assignee: options.assignee || config.default_assignee || 'unassigned',\n    created_date: now,\n    updated_date: now,\n    estimated_tokens: parseInt(options.estimatedTokens || '0', 10),\n    actual_tokens: 0,\n    ai_context: template.ai_context_defaults || config.ai_context_templates || [],\n    sync_status: 'local',\n    related_tasks: [],\n    related_issues: [],\n    tags: tags.length > 0 ? tags : undefined,\n    milestone: options.milestone,\n    dependencies: dependencies.length > 0 ? dependencies : undefined,\n    completion_percentage: 0,\n    blocked_by: [],\n    blocks: [],\n  };\n\n  // Generate content from template\n  const content = template.content_template\n    .replace(/\\{\\{title\\}\\}/g, title)\n    .replace(/\\{\\{description\\}\\}/g, issueFrontmatter.description);\n\n  // Create filename\n  const filename = `${issueId}-${title.toLowerCase().replace(/[^a-z0-9]+/g, '-')}${config.naming_conventions.file_extension}`;\n  const filePath = path.join(paths.issuesDir, filename);\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - Issue would be created with:'));\n    console.log(Formatter.debug(`File: ${filePath}`));\n    console.log(Formatter.debug(`Issue ID: ${issueId}`));\n    console.log(Formatter.debug(`Epic ID: ${epicId || 'none'}`));\n    console.log(Formatter.debug(`Title: ${title}`));\n    console.log(Formatter.debug(`Status: ${issueFrontmatter.status}`));\n    if (issueFrontmatter.state) {\n      console.log(Formatter.debug(`State: ${issueFrontmatter.state}`));\n    }\n    console.log(Formatter.debug(`Priority: ${issueFrontmatter.priority}`));\n    console.log(Formatter.debug(`Assignee: ${issueFrontmatter.assignee}`));\n    if (tags.length > 0) {\n      console.log(Formatter.debug(`Tags: ${tags.join(', ')}`));\n    }\n    if (dependencies.length > 0) {\n      console.log(Formatter.debug(`Dependencies: ${dependencies.join(', ')}`));\n    }\n    return;\n  }\n\n  // Check if file already exists\n  if (fs.existsSync(filePath)) {\n    throw new Error(`Issue file already exists: ${filePath}`);\n  }\n\n  // Write the issue file\n  parser.writeIssue(filePath, issueFrontmatter, content);\n\n  // Update the epic's related issues (if epic exists)\n  if (epicHierarchy?.epic) {\n    const epic = epicHierarchy.epic;\n    const updatedRelatedIssues = [...(epic.related_issues || []), issueId];\n    parser.updateFile(epic.file_path, { related_issues: updatedRelatedIssues });\n  }\n\n  // Update the index for better performance\n  try {\n    const indexManager = new TrackdownIndexManager(config, paths.projectRoot, cliTasksDir);\n    await indexManager.updateItem('issue', issueId);\n    if (epicId) {\n      await indexManager.updateItem('epic', epicId); // Update parent epic too\n    }\n  } catch (error) {\n    console.warn(\n      Formatter.warning(\n        `Index update failed (non-critical): ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n  }\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`Issue created successfully!`));\n  console.log(Formatter.info(`Issue ID: ${issueId}`));\n  console.log(Formatter.info(`Epic ID: ${epicId || 'none'}`));\n  console.log(Formatter.info(`File: ${filePath}`));\n  console.log(Formatter.info(`Title: ${title}`));\n  console.log(Formatter.info(`Status: ${issueFrontmatter.status}`));\n  console.log(Formatter.info(`Priority: ${issueFrontmatter.priority}`));\n  console.log(Formatter.info(`Assignee: ${issueFrontmatter.assignee}`));\n\n  if (tags.length > 0) {\n    console.log(Formatter.info(`Tags: ${tags.join(', ')}`));\n  }\n\n  if (dependencies.length > 0) {\n    console.log(Formatter.info(`Dependencies: ${dependencies.join(', ')}`));\n  }\n\n  if (options.milestone) {\n    console.log(Formatter.info(`Milestone: ${options.milestone}`));\n  }\n\n  console.log('');\n  if (epicHierarchy) {\n    console.log(Formatter.success(`Issue added to epic \"${epicHierarchy.epic.title}\"`));\n  } else {\n    console.log(Formatter.success(`Standalone issue created successfully`));\n  }\n}\n\n/**\n * Create a placeholder epic when an epic ID is referenced but doesn't exist\n */\nasync function createPlaceholderEpic(\n  epicId: string,\n  paths: any,\n  configManager: ConfigManager,\n  parser: FrontmatterParser,\n  _idGenerator: IdGenerator\n): Promise<void> {\n  const config = configManager.getConfig();\n\n  // Get template for placeholder epic\n  const template = configManager.getTemplateWithFallback('epic', 'default');\n  if (!template) {\n    throw new Error('No epic template found for placeholder creation');\n  }\n\n  const now = new Date().toISOString();\n  const epicFrontmatter = {\n    epic_id: epicId,\n    title: `Placeholder Epic - ${epicId}`,\n    description: `Auto-generated placeholder epic for ${epicId}. Please update with proper details.`,\n    status: 'planning',\n    priority: 'medium',\n    assignee: config.default_assignee || 'unassigned',\n    created_date: now,\n    updated_date: now,\n    estimated_tokens: 0,\n    actual_tokens: 0,\n    ai_context: template.ai_context_defaults || [],\n    sync_status: 'local',\n    related_issues: [],\n    dependencies: [],\n    completion_percentage: 0,\n  };\n\n  // Generate content from template\n  const content = template.content_template\n    .replace(/\\{\\{title\\}\\}/g, epicFrontmatter.title)\n    .replace(/\\{\\{description\\}\\}/g, epicFrontmatter.description);\n\n  // Create filename\n  const filename = `${epicId}-placeholder-epic${config.naming_conventions.file_extension}`;\n  const filePath = path.join(paths.epicsDir, filename);\n\n  // Create epic file\n  parser.writeEpic(filePath, epicFrontmatter, content);\n}\n","/**\n * Issue Delete Command\n * Delete issues with safety checks for related items\n */\n\nimport * as fs from 'node:fs';\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface DeleteOptions {\n  force?: boolean;\n  recursive?: boolean;\n  dryRun?: boolean;\n}\n\nexport function createIssueDeleteCommand(): Command {\n  const cmd = new Command('delete');\n\n  cmd\n    .description('Delete an issue')\n    .argument('<issue-id>', 'issue ID to delete')\n    .option('-f, --force', 'force deletion without confirmation')\n    .option('-r, --recursive', 'delete all related tasks')\n    .option('--dry-run', 'show what would be deleted without deleting')\n    .action(async (issueId: string, options: DeleteOptions) => {\n      try {\n        await deleteIssue(issueId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to delete issue: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function deleteIssue(issueId: string, options: DeleteOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get issue hierarchy\n  const hierarchy = relationshipManager.getIssueHierarchy(issueId);\n  if (!hierarchy) {\n    throw new Error(`Issue not found: ${issueId}`);\n  }\n\n  const { issue, tasks } = hierarchy;\n\n  // Check for related tasks\n  if (tasks.length > 0 && !options.recursive) {\n    console.log(Formatter.warning('Issue has related tasks:'));\n    console.log(`  Tasks: ${tasks.length}`);\n    console.log('');\n    console.log(\n      Formatter.info('Use --recursive to delete all related tasks, or reassign them first.')\n    );\n    console.log(Formatter.info('Related tasks:'));\n\n    for (const task of tasks.slice(0, 5)) {\n      console.log(`  • ${task.task_id}: ${task.title}`);\n    }\n    if (tasks.length > 5) {\n      console.log(`  ... and ${tasks.length - 5} more`);\n    }\n\n    throw new Error('Cannot delete issue with related tasks without --recursive flag');\n  }\n\n  // Check for dependencies\n  const related = relationshipManager.getRelatedItems(issueId);\n  if (related.dependents.length > 0) {\n    console.log(Formatter.warning('Issue has items that depend on it:'));\n    for (const dependent of related.dependents) {\n      const depId = getItemId(dependent);\n      console.log(`  • ${depId}: ${dependent.title}`);\n    }\n\n    if (!options.force) {\n      throw new Error(\n        'Cannot delete issue with dependents. Use --force to override or remove dependencies first.'\n      );\n    }\n  }\n\n  // Prepare deletion list\n  const filesToDelete = [issue.file_path];\n\n  if (options.recursive) {\n    filesToDelete.push(...tasks.map((task) => task.file_path));\n  }\n\n  // Show what would be deleted\n  console.log(Formatter.info(`${options.dryRun ? 'Dry run - ' : ''}Would delete:`));\n  console.log(`  Issue: ${issue.issue_id} - ${issue.title}`);\n  console.log(`    File: ${issue.file_path}`);\n\n  if (options.recursive && tasks.length > 0) {\n    console.log(`  Tasks (${tasks.length}):`);\n    for (const task of tasks) {\n      console.log(`    • ${task.task_id}: ${task.title}`);\n      console.log(`      File: ${task.file_path}`);\n    }\n  }\n\n  console.log('');\n  console.log(Formatter.info(`Total files to delete: ${filesToDelete.length}`));\n\n  if (options.dryRun) {\n    return;\n  }\n\n  // Confirmation\n  if (!options.force) {\n    const readline = await import('node:readline');\n    const rl = readline.createInterface({\n      input: process.stdin,\n      output: process.stdout,\n    });\n\n    const answer = await new Promise<string>((resolve) => {\n      rl.question(\n        Formatter.warning(\n          'Are you sure you want to delete this issue and all related tasks? (yes/no): '\n        ),\n        resolve\n      );\n    });\n\n    rl.close();\n\n    if (answer.toLowerCase() !== 'yes' && answer.toLowerCase() !== 'y') {\n      console.log(Formatter.info('Deletion cancelled.'));\n      return;\n    }\n  }\n\n  // Perform deletion\n  let deletedCount = 0;\n  const errors: string[] = [];\n\n  for (const filePath of filesToDelete) {\n    try {\n      if (fs.existsSync(filePath)) {\n        fs.unlinkSync(filePath);\n        deletedCount++;\n      } else {\n        console.log(Formatter.warning(`File not found: ${filePath}`));\n      }\n    } catch (error) {\n      const errorMsg = `Failed to delete ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n      errors.push(errorMsg);\n      console.error(Formatter.error(errorMsg));\n    }\n  }\n\n  // Refresh cache after deletion\n  relationshipManager.rebuildCache();\n\n  // Report results\n  console.log(Formatter.success(`Issue deletion completed!`));\n  console.log(Formatter.info(`Files deleted: ${deletedCount}/${filesToDelete.length}`));\n\n  if (errors.length > 0) {\n    console.log(Formatter.warning(`Errors encountered: ${errors.length}`));\n    for (const error of errors) {\n      console.log(Formatter.error(`  • ${error}`));\n    }\n  }\n\n  console.log('');\n  console.log(Formatter.success(`Issue ${issueId} has been deleted.`));\n\n  if (options.recursive && tasks.length > 0) {\n    console.log(Formatter.info(`Also deleted ${tasks.length} tasks.`));\n  }\n\n  if (related.dependents.length > 0) {\n    console.log(\n      Formatter.warning('Warning: Items that depended on this issue may need to be updated:')\n    );\n    for (const dependent of related.dependents) {\n      const depId = getItemId(dependent);\n      console.log(`  • ${depId}: ${dependent.title}`);\n    }\n  }\n}\n\nfunction getItemId(item: any): string {\n  if (item.epic_id && !item.issue_id && !item.task_id) return item.epic_id;\n  if (item.issue_id && !item.task_id) return item.issue_id;\n  if (item.task_id) return item.task_id;\n  return 'UNKNOWN';\n}\n","/**\n * Issue List Command\n * Lists issues with filtering and sorting options\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\nimport { StateManager } from '../../types/ai-trackdown.js';\n\ninterface ListOptions {\n  status?: string;\n  state?: string;\n  priority?: string;\n  assignee?: string;\n  epic?: string;\n  tags?: string[];\n  format?: 'table' | 'json' | 'yaml';\n  limit?: number;\n  offset?: number;\n  active?: boolean;\n  showState?: boolean;\n}\n\nexport function createIssueListCommand(): Command {\n  const cmd = new Command('list');\n\n  cmd\n    .description('List issues with filtering options')\n    .option('--status <status>', 'filter by status (todo|in-progress|done|blocked)')\n    .option('--state <state>', 'filter by unified state (planning|active|completed|archived|ready_for_engineering|ready_for_qa|ready_for_deployment|won_t_do|done)')\n    .option('--show-state', 'show unified state column in table output')\n    .option('--priority <priority>', 'filter by priority (low|medium|high|critical)')\n    .option('--assignee <assignee>', 'filter by assignee')\n    .option('--epic <epic-id>', 'filter by epic ID')\n    .option('--tags <tags...>', 'filter by tags')\n    .option('-f, --format <type>', 'output format (table|json|yaml)', 'table')\n    .option('--limit <number>', 'limit number of results', '50')\n    .option('--offset <number>', 'offset for pagination', '0')\n    .option('--active', 'show only active issues (equivalent to --status active)')\n    .action(async (options: ListOptions) => {\n      try {\n        await listIssues(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to list issues: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function listIssues(options: ListOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get all issues\n  let issues = relationshipManager.getAllIssues();\n\n  // Apply filters\n  if (options.active) {\n    issues = issues.filter((issue) => issue.status === 'active');\n  } else if (options.status) {\n    issues = issues.filter((issue) => issue.status === options.status);\n  }\n\n  if (options.priority) {\n    issues = issues.filter((issue) => issue.priority === options.priority);\n  }\n\n  if (options.assignee) {\n    issues = issues.filter((issue) => issue.assignee === options.assignee);\n  }\n\n  if (options.epic) {\n    issues = issues.filter((issue) => issue.epic_id === options.epic);\n  }\n\n  // Filter by unified state\n  if (options.state) {\n    issues = issues.filter((issue) => {\n      const effectiveState = StateManager.getEffectiveState(issue);\n      return effectiveState === options.state;\n    });\n  }\n\n  if (options.tags && options.tags.length > 0) {\n    issues = issues.filter(\n      (issue) => issue.tags && options.tags?.some((tag) => issue.tags.includes(tag))\n    );\n  }\n\n  // Apply pagination\n  const limit = parseInt(options.limit || '50');\n  const offset = parseInt(options.offset || '0');\n  const paginatedIssues = issues.slice(offset, offset + limit);\n\n  // Output based on format\n  switch (options.format) {\n    case 'json':\n      console.log(JSON.stringify(paginatedIssues, null, 2));\n      break;\n\n    case 'yaml': {\n      const YAML = await import('yaml');\n      console.log(YAML.stringify(paginatedIssues));\n      break;\n    }\n\n    default:\n      await displayIssuesTable(paginatedIssues, issues.length, offset, limit, options);\n  }\n}\n\nasync function displayIssuesTable(\n  issues: any[],\n  totalCount: number,\n  offset: number,\n  limit: number,\n  options: ListOptions\n): Promise<void> {\n  if (issues.length === 0) {\n    console.log(Formatter.info('No issues found matching the criteria'));\n    return;\n  }\n\n  // Header\n  console.log(Formatter.success(`\\n=== ISSUES (${issues.length}/${totalCount}) ===`));\n\n  if (totalCount > limit) {\n    console.log(\n      Formatter.info(\n        `Showing ${offset + 1}-${Math.min(offset + limit, totalCount)} of ${totalCount} issues`\n      )\n    );\n  }\n\n  console.log('');\n\n  // Table headers\n  const headers = ['ID', 'Title', 'Status'];\n  const columnWidths = [12, 40, 12];\n  \n  if (options.showState) {\n    headers.push('State');\n    columnWidths.push(15);\n  }\n  \n  headers.push('Priority', 'Epic', 'Assignee', 'Updated');\n  columnWidths.push(10, 12, 15, 12);\n\n  // Print headers\n  const headerRow = headers.map((header, i) => header.padEnd(columnWidths[i])).join(' ');\n  console.log(Formatter.success(headerRow));\n  console.log(Formatter.success('-'.repeat(headerRow.length)));\n\n  // Print issues\n  for (const issue of issues) {\n    const row = [\n      issue.issue_id || 'N/A',\n      truncate(issue.title || 'Untitled', columnWidths[1]),\n      getStatusDisplay(issue.status),\n    ];\n    \n    if (options.showState) {\n      const effectiveState = StateManager.getEffectiveState(issue);\n      row.push(getStateDisplay(effectiveState));\n    }\n    \n    row.push(\n      getPriorityDisplay(issue.priority),\n      issue.epic_id || 'N/A',\n      issue.assignee || 'Unassigned',\n      formatDate(issue.updated_date)\n    );\n\n    const formattedRow = row.map((cell, i) => cell.toString().padEnd(columnWidths[i])).join(' ');\n    console.log(formattedRow);\n  }\n\n  console.log('');\n\n  // Pagination info\n  if (totalCount > limit) {\n    const nextOffset = offset + limit;\n    const hasNext = nextOffset < totalCount;\n    const prevOffset = Math.max(0, offset - limit);\n    const hasPrev = offset > 0;\n\n    console.log(Formatter.info('Pagination:'));\n    if (hasPrev) {\n      console.log(`  Previous: aitrackdown issue list --offset ${prevOffset} --limit ${limit}`);\n    }\n    if (hasNext) {\n      console.log(`  Next: aitrackdown issue list --offset ${nextOffset} --limit ${limit}`);\n    }\n    console.log('');\n  }\n}\n\nfunction getStatusDisplay(status: string): string {\n  const statusColors: Record<string, (text: string) => string> = {\n    todo: (text) => Formatter.info(text),\n    'in-progress': (text) => Formatter.warning(text),\n    done: (text) => Formatter.success(text),\n    blocked: (text) => Formatter.error(text),\n  };\n\n  const colorFn = statusColors[status] || ((text) => text);\n  return colorFn(status.toUpperCase());\n}\n\nfunction getPriorityDisplay(priority: string): string {\n  const priorityColors: Record<string, (text: string) => string> = {\n    critical: (text) => Formatter.error(text),\n    high: (text) => Formatter.warning(text),\n    medium: (text) => Formatter.info(text),\n    low: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = priorityColors[priority] || ((text) => text);\n  return colorFn(priority.toUpperCase());\n}\n\nfunction formatDate(dateString: string): string {\n  if (!dateString) return 'N/A';\n  const date = new Date(dateString);\n  return date.toLocaleDateString();\n}\n\nfunction getStateDisplay(state: string): string {\n  const stateColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.warning(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n    ready_for_engineering: (text) => Formatter.info(text),\n    ready_for_qa: (text) => Formatter.warning(text),\n    ready_for_deployment: (text) => Formatter.info(text),\n    won_t_do: (text) => Formatter.error(text),\n    done: (text) => Formatter.success(text),\n  };\n\n  const colorFn = stateColors[state] || ((text) => text);\n  return colorFn(state.toUpperCase().replace(/_/g, ' '));\n}\n\nfunction truncate(text: string, maxLength: number): string {\n  if (text.length <= maxLength) return text;\n  return `${text.substring(0, maxLength - 3)}...`;\n}\n","/**\n * Professional output formatters for CLI display\n */\n\nimport chalk from 'chalk';\n// import type { GitHubIssue, GitHubLabel, GitHubMilestone, GitHubComment } from '../types/github.js'; // Removed GitHub dependencies\nimport type { FormatOptions } from '../types/commands.js';\n\nexport interface TableColumn {\n  key: string;\n  header: string;\n  width?: number;\n  align?: 'left' | 'center' | 'right';\n  formatter?: (value: any) => string;\n}\n\nexport interface ProgressBarOptions {\n  width?: number;\n  showPercentage?: boolean;\n  showNumbers?: boolean;\n  style?: 'block' | 'bar' | 'simple';\n}\n\nexport class OutputFormatter {\n  /**\n   * Format issues as a table\n   */\n  public static formatIssuesTable(issues: GitHubIssue[], options: FormatOptions = {}): string {\n    if (issues.length === 0) {\n      return chalk.gray('No issues found.');\n    }\n\n    const columns: TableColumn[] = [\n      {\n        key: 'number',\n        header: '#',\n        width: 6,\n        align: 'right',\n        formatter: (num) => chalk.cyan(`#${num}`),\n      },\n      {\n        key: 'title',\n        header: 'Title',\n        width: 50,\n        formatter: (title, issue) => {\n          const truncated = title.length > 47 ? `${title.substring(0, 44)}...` : title;\n          return issue.state === 'open' ? chalk.green(truncated) : chalk.red(truncated);\n        },\n      },\n      {\n        key: 'labels',\n        header: 'Labels',\n        width: 20,\n        formatter: (labels) => {\n          if (!labels || labels.length === 0) return chalk.gray('none');\n          return (\n            labels\n              .slice(0, 2)\n              .map((label: any) => chalk.hex(`#${label.color}`).bold(label.name))\n              .join(' ') + (labels.length > 2 ? chalk.gray(` +${labels.length - 2}`) : '')\n          );\n        },\n      },\n      {\n        key: 'assignees',\n        header: 'Assignee',\n        width: 15,\n        formatter: (assignees) => {\n          if (!assignees || assignees.length === 0) return chalk.gray('unassigned');\n          return (\n            assignees\n              .slice(0, 1)\n              .map((user: any) => chalk.blue(user.login))\n              .join(', ') + (assignees.length > 1 ? chalk.gray(` +${assignees.length - 1}`) : '')\n          );\n        },\n      },\n      {\n        key: 'created_at',\n        header: 'Created',\n        width: 12,\n        formatter: (date) => OutputFormatter.formatRelativeDate(date),\n      },\n    ];\n\n    return OutputFormatter.formatTable(issues, columns, options);\n  }\n\n  /**\n   * Format a single issue details\n   */\n  public static formatIssueDetails(\n    issue: GitHubIssue,\n    options: { comments?: boolean; reactions?: boolean } = {}\n  ): string {\n    const lines: string[] = [];\n\n    // Header\n    lines.push(chalk.bold.cyan(`Issue #${issue.number}: ${issue.title}`));\n    lines.push(chalk.gray('─'.repeat(80)));\n\n    // Status and metadata\n    const statusIcon = issue.state === 'open' ? chalk.green('●') : chalk.red('●');\n    const stateReason = issue.state_reason ? ` (${issue.state_reason})` : '';\n    lines.push(`${statusIcon} ${chalk.bold(issue.state.toUpperCase())}${stateReason}`);\n\n    lines.push(`${chalk.bold('Author:')} ${chalk.blue(issue.user.login)}`);\n    lines.push(`${chalk.bold('Created:')} ${OutputFormatter.formatAbsoluteDate(issue.created_at)}`);\n    lines.push(`${chalk.bold('Updated:')} ${OutputFormatter.formatAbsoluteDate(issue.updated_at)}`);\n\n    if (issue.closed_at) {\n      lines.push(`${chalk.bold('Closed:')} ${OutputFormatter.formatAbsoluteDate(issue.closed_at)}`);\n    }\n\n    // Assignees\n    if (issue.assignees && issue.assignees.length > 0) {\n      const assigneesList = issue.assignees.map((user) => chalk.blue(user.login)).join(', ');\n      lines.push(`${chalk.bold('Assignees:')} ${assigneesList}`);\n    }\n\n    // Labels\n    if (issue.labels && issue.labels.length > 0) {\n      const labelsList = issue.labels\n        .map((label) => chalk.hex(`#${label.color}`).bold(label.name))\n        .join(' ');\n      lines.push(`${chalk.bold('Labels:')} ${labelsList}`);\n    }\n\n    // Milestone\n    if (issue.milestone) {\n      lines.push(`${chalk.bold('Milestone:')} ${chalk.yellow(issue.milestone.title)}`);\n    }\n\n    // Comments count\n    if (issue.comments > 0) {\n      lines.push(`${chalk.bold('Comments:')} ${issue.comments}`);\n    }\n\n    // Reactions\n    if (options.reactions && issue.reactions && issue.reactions.total_count > 0) {\n      const reactions = OutputFormatter.formatReactions(issue.reactions);\n      if (reactions) {\n        lines.push(`${chalk.bold('Reactions:')} ${reactions}`);\n      }\n    }\n\n    // Body\n    if (issue.body) {\n      lines.push('');\n      lines.push(chalk.bold('Description:'));\n      lines.push(OutputFormatter.formatMarkdown(issue.body));\n    }\n\n    // URLs\n    lines.push('');\n    lines.push(chalk.gray(`Web: ${issue.html_url}`));\n    lines.push(chalk.gray(`API: ${issue.url}`));\n\n    return lines.join('\\n');\n  }\n\n  /**\n   * Format labels as a table\n   */\n  public static formatLabelsTable(labels: GitHubLabel[], options: FormatOptions = {}): string {\n    if (labels.length === 0) {\n      return chalk.gray('No labels found.');\n    }\n\n    const columns: TableColumn[] = [\n      {\n        key: 'name',\n        header: 'Name',\n        width: 25,\n        formatter: (name, label) => chalk.hex(`#${label.color}`).bold(name),\n      },\n      {\n        key: 'description',\n        header: 'Description',\n        width: 40,\n        formatter: (desc) => (desc ? chalk.gray(desc) : chalk.gray('no description')),\n      },\n      {\n        key: 'color',\n        header: 'Color',\n        width: 10,\n        formatter: (color) => chalk.hex(`#${color}`).bold(`#${color}`),\n      },\n      {\n        key: 'default',\n        header: 'Default',\n        width: 8,\n        formatter: (isDefault) => (isDefault ? chalk.green('✓') : chalk.gray('✗')),\n      },\n    ];\n\n    return OutputFormatter.formatTable(labels, columns, options);\n  }\n\n  /**\n   * Format milestones as a table\n   */\n  public static formatMilestonesTable(\n    milestones: GitHubMilestone[],\n    options: FormatOptions = {}\n  ): string {\n    if (milestones.length === 0) {\n      return chalk.gray('No milestones found.');\n    }\n\n    const columns: TableColumn[] = [\n      {\n        key: 'title',\n        header: 'Title',\n        width: 25,\n        formatter: (title, milestone) => {\n          const color = milestone.state === 'open' ? chalk.green : chalk.gray;\n          return color.bold(title);\n        },\n      },\n      {\n        key: 'description',\n        header: 'Description',\n        width: 30,\n        formatter: (desc) =>\n          desc\n            ? chalk.gray(desc.substring(0, 27) + (desc.length > 27 ? '...' : ''))\n            : chalk.gray('no description'),\n      },\n      {\n        key: 'progress',\n        header: 'Progress',\n        width: 20,\n        formatter: (_, milestone) => {\n          const total = milestone.open_issues + milestone.closed_issues;\n          if (total === 0) return chalk.gray('no issues');\n\n          const percentage = Math.round((milestone.closed_issues / total) * 100);\n          return OutputFormatter.formatProgressBar(percentage, { width: 15, showPercentage: true });\n        },\n      },\n      {\n        key: 'due_on',\n        header: 'Due Date',\n        width: 12,\n        formatter: (dueDate) =>\n          dueDate ? OutputFormatter.formatRelativeDate(dueDate) : chalk.gray('no due date'),\n      },\n    ];\n\n    return OutputFormatter.formatTable(milestones, columns, options);\n  }\n\n  /**\n   * Format milestone progress with detailed information\n   */\n  public static formatMilestoneProgress(\n    milestone: GitHubMilestone,\n    options: { detailed?: boolean; chart?: boolean } = {}\n  ): string {\n    const lines: string[] = [];\n\n    // Header\n    lines.push(chalk.bold.yellow(`Milestone: ${milestone.title}`));\n    lines.push(chalk.gray('─'.repeat(50)));\n\n    const total = milestone.open_issues + milestone.closed_issues;\n    const percentage = total > 0 ? Math.round((milestone.closed_issues / total) * 100) : 0;\n\n    // Progress bar\n    const progressBar = OutputFormatter.formatProgressBar(percentage, {\n      width: 30,\n      showPercentage: true,\n      showNumbers: true,\n    });\n    lines.push(`Progress: ${progressBar}`);\n\n    // Statistics\n    lines.push(`${chalk.green('Closed:')} ${milestone.closed_issues}`);\n    lines.push(`${chalk.red('Open:')} ${milestone.open_issues}`);\n    lines.push(`${chalk.blue('Total:')} ${total}`);\n\n    // Due date\n    if (milestone.due_on) {\n      const dueDate = new Date(milestone.due_on);\n      const now = new Date();\n      const isOverdue = dueDate < now && milestone.state === 'open';\n\n      if (isOverdue) {\n        lines.push(\n          `${chalk.bold('Due:')} ${chalk.red('OVERDUE')} (${OutputFormatter.formatAbsoluteDate(milestone.due_on)})`\n        );\n      } else {\n        lines.push(`${chalk.bold('Due:')} ${OutputFormatter.formatAbsoluteDate(milestone.due_on)}`);\n      }\n    }\n\n    // Description\n    if (milestone.description) {\n      lines.push('');\n      lines.push(chalk.bold('Description:'));\n      lines.push(chalk.gray(milestone.description));\n    }\n\n    // Detailed breakdown\n    if (options.detailed && total > 0) {\n      lines.push('');\n      lines.push(chalk.bold('Statistics:'));\n      lines.push(`Completion Rate: ${percentage}%`);\n\n      if (milestone.state === 'open' && milestone.due_on) {\n        const dueDate = new Date(milestone.due_on);\n        const now = new Date();\n        const daysRemaining = Math.ceil(\n          (dueDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)\n        );\n\n        if (daysRemaining > 0) {\n          lines.push(`Days Remaining: ${daysRemaining}`);\n          if (milestone.open_issues > 0) {\n            const issuesPerDay = milestone.open_issues / daysRemaining;\n            lines.push(`Required Velocity: ${issuesPerDay.toFixed(1)} issues/day`);\n          }\n        }\n      }\n    }\n\n    return lines.join('\\n');\n  }\n\n  /**\n   * Format comments as a list\n   */\n  public static formatCommentsList(\n    comments: GitHubComment[],\n    _options: FormatOptions = {}\n  ): string {\n    if (comments.length === 0) {\n      return chalk.gray('No comments found.');\n    }\n\n    const lines: string[] = [];\n\n    comments.forEach((comment, index) => {\n      if (index > 0) lines.push('');\n\n      // Comment header\n      const header = `${chalk.blue.bold(comment.user.login)} • ${OutputFormatter.formatRelativeDate(comment.created_at)}`;\n      lines.push(header);\n      lines.push(chalk.gray('─'.repeat(header.length)));\n\n      // Comment body\n      if (comment.body) {\n        lines.push(OutputFormatter.formatMarkdown(comment.body));\n      }\n\n      // Reactions\n      if (comment.reactions && comment.reactions.total_count > 0) {\n        const reactions = OutputFormatter.formatReactions(comment.reactions);\n        if (reactions) {\n          lines.push('');\n          lines.push(chalk.gray(`Reactions: ${reactions}`));\n        }\n      }\n    });\n\n    return lines.join('\\n');\n  }\n\n  /**\n   * Format data as JSON\n   */\n  public static formatJSON(data: any, options: { pretty?: boolean } = {}): string {\n    if (options.pretty) {\n      return JSON.stringify(data, null, 2);\n    }\n    return JSON.stringify(data);\n  }\n\n  /**\n   * Format data as YAML\n   */\n  public static formatYAML(data: any): string {\n    // Simple YAML formatter - in production, use a proper YAML library\n    return JSON.stringify(data, null, 2)\n      .replace(/\"/g, '')\n      .replace(/,$/gm, '')\n      .replace(/^\\s*{\\s*$/gm, '')\n      .replace(/^\\s*}\\s*$/gm, '');\n  }\n\n  /**\n   * Format data as CSV\n   */\n  public static formatCSV(data: any[], headers?: string[]): string {\n    if (data.length === 0) return '';\n\n    const keys = headers || Object.keys(data[0]);\n    const lines: string[] = [];\n\n    // Add header\n    lines.push(keys.map((key) => `\"${key}\"`).join(','));\n\n    // Add data rows\n    data.forEach((item) => {\n      const row = keys.map((key) => {\n        const value = item[key];\n        if (value === null || value === undefined) return '\"\"';\n        if (typeof value === 'object') return `\"${JSON.stringify(value)}\"`;\n        return `\"${String(value).replace(/\"/g, '\"\"')}\"`;\n      });\n      lines.push(row.join(','));\n    });\n\n    return lines.join('\\n');\n  }\n\n  // Private helper methods\n  private static formatTable(data: any[], columns: TableColumn[], options: FormatOptions): string {\n    if (data.length === 0) return '';\n\n    const lines: string[] = [];\n\n    // Header\n    if (!options.noHeader) {\n      const headerRow = columns\n        .map((col) => {\n          const header = col.header.padEnd(col.width || 20);\n          return chalk.bold.cyan(header);\n        })\n        .join(' ');\n      lines.push(headerRow);\n\n      const separator = columns.map((col) => '─'.repeat(col.width || 20)).join(' ');\n      lines.push(chalk.gray(separator));\n    }\n\n    // Data rows\n    data.forEach((item) => {\n      const row = columns\n        .map((col) => {\n          const value = OutputFormatter.getNestedProperty(item, col.key);\n          let formatted = col.formatter ? col.formatter(value, item) : String(value || '');\n\n          // Strip ANSI codes for width calculation\n          const plainText = formatted.replace(/\\u001b\\[[0-9;]*m/g, '');\n          const width = col.width || 20;\n\n          if (plainText.length > width) {\n            // Truncate while preserving ANSI codes\n            const excess = plainText.length - width + 3; // +3 for '...'\n            formatted = `${formatted.substring(0, formatted.length - excess)}...`;\n          } else {\n            // Pad to width\n            const padding = ' '.repeat(width - plainText.length);\n            formatted += padding;\n          }\n\n          return formatted;\n        })\n        .join(' ');\n\n      lines.push(row);\n    });\n\n    return lines.join('\\n');\n  }\n\n  private static formatProgressBar(percentage: number, options: ProgressBarOptions = {}): string {\n    const width = options.width || 20;\n    const filled = Math.round((percentage / 100) * width);\n    const empty = width - filled;\n\n    const bar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\n\n    let result = `[${bar}]`;\n\n    if (options.showPercentage) {\n      result += ` ${percentage}%`;\n    }\n\n    return result;\n  }\n\n  private static formatRelativeDate(dateString: string): string {\n    const date = new Date(dateString);\n    const now = new Date();\n    const diffMs = now.getTime() - date.getTime();\n    const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n    const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n    const diffMinutes = Math.floor(diffMs / (1000 * 60));\n\n    if (diffDays > 0) {\n      return chalk.gray(`${diffDays}d ago`);\n    } else if (diffHours > 0) {\n      return chalk.gray(`${diffHours}h ago`);\n    } else if (diffMinutes > 0) {\n      return chalk.gray(`${diffMinutes}m ago`);\n    } else {\n      return chalk.gray('now');\n    }\n  }\n\n  private static formatAbsoluteDate(dateString: string): string {\n    const date = new Date(dateString);\n    return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;\n  }\n\n  private static formatReactions(reactions: any): string {\n    const reactionEmojis: Record<string, string> = {\n      '+1': '👍',\n      '-1': '👎',\n      laugh: '😄',\n      hooray: '🎉',\n      confused: '😕',\n      heart: '❤️',\n      rocket: '🚀',\n      eyes: '👀',\n    };\n\n    const parts: string[] = [];\n\n    Object.entries(reactions).forEach(([key, count]) => {\n      if (key !== 'url' && key !== 'total_count' && count && Number(count) > 0) {\n        const emoji = reactionEmojis[key] || key;\n        parts.push(`${emoji} ${count}`);\n      }\n    });\n\n    return parts.join(' ');\n  }\n\n  private static formatMarkdown(text: string): string {\n    // Simple markdown formatting for terminal\n    return text\n      .replace(/\\*\\*(.*?)\\*\\*/g, chalk.bold('$1'))\n      .replace(/\\*(.*?)\\*/g, chalk.italic('$1'))\n      .replace(/`(.*?)`/g, chalk.cyan('$1'))\n      .replace(/^#\\s+(.*$)/gm, chalk.bold.yellow('$1'))\n      .replace(/^##\\s+(.*$)/gm, chalk.bold.blue('$1'))\n      .replace(/^>\\s+(.*$)/gm, chalk.gray('│ $1'));\n  }\n\n  private static getNestedProperty(obj: any, path: string): any {\n    return path.split('.').reduce((current, key) => current?.[key], obj);\n  }\n}\n\n// Utility functions for common formatting operations\nexport function formatError(message: string): string {\n  return chalk.red.bold('Error: ') + chalk.red(message);\n}\n\nexport function formatWarning(message: string): string {\n  return chalk.yellow.bold('Warning: ') + chalk.yellow(message);\n}\n\nexport function formatSuccess(message: string): string {\n  return chalk.green.bold('Success: ') + chalk.green(message);\n}\n\nexport function formatInfo(message: string): string {\n  return chalk.blue.bold('Info: ') + chalk.blue(message);\n}\n\nexport function formatDebug(message: string): string {\n  return chalk.gray.bold('Debug: ') + chalk.gray(message);\n}\n\nexport function formatSpinner(message: string): string {\n  return chalk.cyan('◐ ') + message;\n}\n\nexport function formatCheckmark(message: string): string {\n  return chalk.green('✓ ') + message;\n}\n\nexport function formatCross(message: string): string {\n  return chalk.red('✗ ') + message;\n}\n\nexport function formatBullet(message: string): string {\n  return chalk.blue('• ') + message;\n}\n\nexport function formatBadge(\n  text: string,\n  color: 'red' | 'green' | 'blue' | 'yellow' | 'gray' = 'blue'\n): string {\n  const colors = {\n    red: chalk.red.bold,\n    green: chalk.green.bold,\n    blue: chalk.blue.bold,\n    yellow: chalk.yellow.bold,\n    gray: chalk.gray.bold,\n  };\n\n  return colors[color](`[${text}]`);\n}\n","/**\n * Issue reopen command - Deprecated in favor of issue update\n */\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { formatError, formatInfo } from '../../utils/formatters.js';\n\ninterface IssueReopenOptions {\n  comment?: string;\n  format?: string;\n  verbose?: boolean;\n}\n\nexport function createIssueReopenCommand(): Command {\n  const cmd = new Command('reopen');\n\n  cmd\n    .description('Reopen an issue (deprecated - use \"issue update\")')\n    .argument('<issue-id>', 'Issue ID (e.g., ISS-0001)')\n    .option('-c, --comment <text>', 'Add comment when reopening')\n    .option('--format <format>', 'Output format (table, json, yaml)', 'table')\n    .option('-v, --verbose', 'Show detailed output')\n    .action(async (issueId: string, options: IssueReopenOptions) => {\n      try {\n        await handleReopenIssue(issueId, options);\n      } catch (error) {\n        console.error(\n          formatError(error instanceof Error ? error.message : 'Unknown error occurred')\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function handleReopenIssue(issueId: string, options: IssueReopenOptions): Promise<void> {\n  // This command is deprecated\n  console.log(formatInfo(`The \"reopen\" command is deprecated.`));\n  console.log(formatInfo(`Please use: aitrackdown issue update ${issueId} --status todo`));\n\n  if (options.comment) {\n    console.log(formatInfo(`To add a comment, edit the issue content directly.`));\n  }\n\n  console.log('');\n  console.log(chalk.yellow('The \"reopen\" command will be removed in a future version.'));\n  console.log(chalk.yellow('Please update your scripts to use the \"update\" command instead.'));\n}\n\n// Export for use in other commands\nexport { handleReopenIssue };\n","/**\n * Issue Show Command\n * Display detailed information about a specific issue\n */\n\nimport { Command } from 'commander';\nimport type { EpicData, IssueData, PRData, TaskData } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface ShowOptions {\n  format?: 'detailed' | 'json' | 'yaml';\n  showTasks?: boolean;\n  showPRs?: boolean;\n  showContent?: boolean;\n  showRelated?: boolean;\n}\n\nexport function createIssueShowCommand(): Command {\n  const cmd = new Command('show');\n\n  cmd\n    .description('Show detailed information about an issue')\n    .argument('<issue-id>', 'issue ID to show')\n    .option('-f, --format <type>', 'output format (detailed|json|yaml)', 'detailed')\n    .option('--show-tasks, --with-tasks', 'show related tasks')\n    .option('--show-prs', 'show related pull requests')\n    .option('--show-content', 'show issue content/description')\n    .option('--show-related', 'show related issues and dependencies')\n    .action(async (issueId: string, options: ShowOptions) => {\n      try {\n        await showIssue(issueId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to show issue: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function showIssue(issueId: string, options: ShowOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get issue hierarchy\n  const hierarchy = relationshipManager.getIssueHierarchy(issueId);\n  if (!hierarchy) {\n    throw new Error(`Issue not found: ${issueId}`);\n  }\n\n  const { issue, tasks, prs, epic } = hierarchy;\n\n  // Output based on format\n  switch (options.format) {\n    case 'json': {\n      const jsonOutput = {\n        issue,\n        ...(options.showTasks && { tasks }),\n        ...(options.showPRs && { prs }),\n        ...(epic && { epic }),\n      };\n      console.log(JSON.stringify(jsonOutput, null, 2));\n      break;\n    }\n\n    case 'yaml': {\n      const YAML = await import('yaml');\n      const yamlOutput = {\n        issue,\n        ...(options.showTasks && { tasks }),\n        ...(options.showPRs && { prs }),\n        ...(epic && { epic }),\n      };\n      console.log(YAML.stringify(yamlOutput));\n      break;\n    }\n\n    default:\n      await displayIssueDetailed(issue, tasks, prs, epic, options, relationshipManager);\n  }\n}\n\nasync function displayIssueDetailed(\n  issue: IssueData,\n  tasks: TaskData[],\n  prs: PRData[],\n  epic: EpicData | undefined,\n  options: ShowOptions,\n  relationshipManager: RelationshipManager\n): Promise<void> {\n  // Header\n  console.log(Formatter.success(`\\n=== ISSUE: ${issue.title} ===`));\n  console.log(Formatter.info(`ID: ${issue.issue_id}`));\n  console.log('');\n\n  // Basic Information\n  console.log(Formatter.success('Basic Information:'));\n  console.log(`  Title: ${issue.title}`);\n  console.log(`  Status: ${getStatusDisplay(issue.status)}`);\n  console.log(`  Priority: ${getPriorityDisplay(issue.priority)}`);\n  console.log(`  Assignee: ${issue.assignee || 'Unassigned'}`);\n\n  if (epic) {\n    console.log(`  Epic: ${epic.epic_id} - ${epic.title}`);\n  }\n\n  if (issue.milestone) {\n    console.log(`  Milestone: ${issue.milestone}`);\n  }\n\n  if (issue.tags && issue.tags.length > 0) {\n    console.log(`  Tags: ${issue.tags.join(', ')}`);\n  }\n\n  if (issue.completion_percentage !== undefined) {\n    console.log(`  Progress: ${issue.completion_percentage}%`);\n  }\n\n  console.log('');\n\n  // Dates and Tracking\n  console.log(Formatter.success('Tracking Information:'));\n  console.log(`  Created: ${formatDateTime(issue.created_date)}`);\n  console.log(`  Updated: ${formatDateTime(issue.updated_date)}`);\n  console.log(`  Estimated Tokens: ${issue.estimated_tokens || 0}`);\n  console.log(`  Actual Tokens: ${issue.actual_tokens || 0}`);\n\n  if (issue.estimated_tokens > 0) {\n    const efficiency = issue.actual_tokens / issue.estimated_tokens;\n    console.log(`  Token Efficiency: ${(efficiency * 100).toFixed(1)}%`);\n  }\n\n  console.log(`  Sync Status: ${issue.sync_status || 'local'}`);\n  console.log('');\n\n  // Description\n  if (issue.description) {\n    console.log(Formatter.success('Description:'));\n    console.log(`  ${issue.description}`);\n    console.log('');\n  }\n\n  // Content\n  if (options.showContent && issue.content) {\n    console.log(Formatter.success('Content:'));\n    console.log(issue.content);\n    console.log('');\n  }\n\n  // AI Context\n  if (issue.ai_context && issue.ai_context.length > 0) {\n    console.log(Formatter.success('AI Context:'));\n    for (const context of issue.ai_context) {\n      console.log(`  • ${context}`);\n    }\n    console.log('');\n  }\n\n  // Dependencies\n  if (issue.dependencies && issue.dependencies.length > 0) {\n    console.log(Formatter.success('Dependencies:'));\n    for (const dep of issue.dependencies) {\n      console.log(`  • ${dep}`);\n    }\n    console.log('');\n  }\n\n  // Blocked by / Blocks\n  if (issue.blocked_by && issue.blocked_by.length > 0) {\n    console.log(Formatter.success('Blocked By:'));\n    for (const blocker of issue.blocked_by) {\n      console.log(`  • ${blocker}`);\n    }\n    console.log('');\n  }\n\n  if (issue.blocks && issue.blocks.length > 0) {\n    console.log(Formatter.success('Blocks:'));\n    for (const blocked of issue.blocks) {\n      console.log(`  • ${blocked}`);\n    }\n    console.log('');\n  }\n\n  // Related Tasks\n  if (options.showTasks || tasks.length > 0) {\n    console.log(Formatter.success(`Related Tasks (${tasks.length}):`));\n    if (tasks.length === 0) {\n      console.log(Formatter.debug('  No tasks found'));\n    } else {\n      for (const task of tasks) {\n        const statusIcon = getStatusIcon(task.status);\n        const priorityColor = getPriorityDisplay(task.priority);\n        console.log(`  ${statusIcon} ${task.task_id}: ${task.title} [${priorityColor}]`);\n      }\n    }\n    console.log('');\n  }\n\n  // Related PRs\n  if (options.showPRs || prs.length > 0) {\n    console.log(Formatter.success(`Related Pull Requests (${prs.length}):`));\n    if (prs.length === 0) {\n      console.log(Formatter.debug('  No pull requests found'));\n    } else {\n      for (const pr of prs) {\n        const statusIcon = getPRStatusIcon(pr.pr_status);\n        console.log(`  ${statusIcon} ${pr.pr_id}: ${pr.title} [${pr.pr_status.toUpperCase()}]`);\n      }\n    }\n    console.log('');\n  }\n\n  // Related Issues\n  if (issue.related_issues && issue.related_issues.length > 0) {\n    console.log(Formatter.success('Related Issues:'));\n    for (const relatedId of issue.related_issues) {\n      console.log(`  • ${relatedId}`);\n    }\n    console.log('');\n  }\n\n  // Related Items (if requested)\n  if (options.showRelated) {\n    const related = relationshipManager.getRelatedItems(issue.issue_id);\n\n    if (related.siblings.length > 0) {\n      console.log(Formatter.success('Sibling Issues:'));\n      for (const sibling of related.siblings) {\n        console.log(`  • ${getItemId(sibling)}: ${sibling.title}`);\n      }\n      console.log('');\n    }\n\n    if (related.dependencies.length > 0) {\n      console.log(Formatter.success('Dependencies:'));\n      for (const dep of related.dependencies) {\n        console.log(`  • ${getItemId(dep)}: ${dep.title}`);\n      }\n      console.log('');\n    }\n\n    if (related.dependents.length > 0) {\n      console.log(Formatter.success('Dependents:'));\n      for (const dep of related.dependents) {\n        console.log(`  • ${getItemId(dep)}: ${dep.title}`);\n      }\n      console.log('');\n    }\n  }\n\n  // GitHub sync information\n  if (issue.github_id || issue.github_number || issue.github_url) {\n    console.log(Formatter.success('GitHub Integration:'));\n    if (issue.github_id) {\n      console.log(`  GitHub ID: ${issue.github_id}`);\n    }\n    if (issue.github_number) {\n      console.log(`  GitHub Number: #${issue.github_number}`);\n    }\n    if (issue.github_url) {\n      console.log(`  GitHub URL: ${issue.github_url}`);\n    }\n    if (issue.github_labels && issue.github_labels.length > 0) {\n      console.log(`  GitHub Labels: ${issue.github_labels.join(', ')}`);\n    }\n    console.log('');\n  }\n\n  // File Information\n  console.log(Formatter.success('File Information:'));\n  console.log(`  Path: ${issue.file_path}`);\n  console.log('');\n\n  // Summary Statistics\n  const completedTasks = tasks.filter((t) => t.status === 'completed').length;\n  const mergedPRs = prs.filter((p) => p.pr_status === 'merged').length;\n\n  console.log(Formatter.success('Summary:'));\n  console.log(`  Tasks: ${completedTasks}/${tasks.length} completed`);\n  console.log(`  PRs: ${mergedPRs}/${prs.length} merged`);\n\n  if (tasks.length > 0) {\n    const taskCompletionRate = ((completedTasks / tasks.length) * 100).toFixed(1);\n    console.log(`  Task Completion: ${taskCompletionRate}%`);\n  }\n\n  if (prs.length > 0) {\n    const prMergeRate = ((mergedPRs / prs.length) * 100).toFixed(1);\n    console.log(`  PR Merge Rate: ${prMergeRate}%`);\n  }\n}\n\nfunction getStatusDisplay(status: string): string {\n  const statusColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.success(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = statusColors[status] || ((text) => text);\n  return colorFn(status.toUpperCase());\n}\n\nfunction getPriorityDisplay(priority: string): string {\n  const priorityColors: Record<string, (text: string) => string> = {\n    critical: (text) => Formatter.error(text),\n    high: (text) => Formatter.warning(text),\n    medium: (text) => Formatter.info(text),\n    low: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = priorityColors[priority] || ((text) => text);\n  return colorFn(priority.toUpperCase());\n}\n\nfunction getStatusIcon(status: string): string {\n  const icons: Record<string, string> = {\n    planning: '⏳',\n    active: '🔄',\n    completed: '✅',\n    archived: '📦',\n  };\n\n  return icons[status] || '❓';\n}\n\nfunction getPRStatusIcon(status: string): string {\n  const icons: Record<string, string> = {\n    draft: '📝',\n    open: '🔓',\n    review: '👀',\n    approved: '✅',\n    merged: '🔗',\n    closed: '❌',\n  };\n\n  return icons[status] || '❓';\n}\n\nfunction formatDateTime(dateString: string): string {\n  if (!dateString) return 'N/A';\n  const date = new Date(dateString);\n  return date.toLocaleString();\n}\n\nfunction getItemId(item: any): string {\n  if (item.epic_id && !item.issue_id && !item.task_id) return item.epic_id;\n  if (item.issue_id && !item.task_id) return item.issue_id;\n  if (item.task_id) return item.task_id;\n  if (item.pr_id) return item.pr_id;\n  return 'UNKNOWN';\n}\n","/**\n * Issue Update Command\n * Update issue fields using YAML frontmatter system\n */\n\nimport { Command } from 'commander';\nimport type { IssueFrontmatter, ItemStatus, Priority, UnifiedState } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\nimport { StateManager, StateTransition } from '../../types/ai-trackdown.js';\n\ninterface UpdateOptions {\n  title?: string;\n  description?: string;\n  status?: ItemStatus;\n  state?: UnifiedState;\n  priority?: Priority;\n  assignee?: string;\n  epicId?: string;\n  addTags?: string;\n  removeTags?: string;\n  milestone?: string;\n  clearMilestone?: boolean;\n  estimatedTokens?: number;\n  actualTokens?: number;\n  addDependencies?: string;\n  removeDependencies?: string;\n  addBlockedBy?: string;\n  removeBlockedBy?: string;\n  addBlocks?: string;\n  removeBlocks?: string;\n  progress?: number;\n  reason?: string;\n  reviewer?: string;\n  dryRun?: boolean;\n}\n\nexport function createIssueUpdateCommand(): Command {\n  const cmd = new Command('update');\n\n  cmd\n    .description('Update an existing issue')\n    .argument('<issue-id>', 'issue ID to update')\n    .option('-t, --title <text>', 'update title')\n    .option('-d, --description <text>', 'update description')\n    .option('-s, --status <status>', 'update status (planning|active|completed|archived)')\n    .option('--state <state>', 'update unified state (planning|active|completed|archived|ready_for_engineering|ready_for_qa|ready_for_deployment|won_t_do|done)')\n    .option('-p, --priority <level>', 'update priority (low|medium|high|critical)')\n    .option('-a, --assignee <username>', 'update assignee')\n    .option('--epic-id <id>', 'update epic ID')\n    .option('--add-tags <tags>', 'add tags (comma-separated)')\n    .option('--remove-tags <tags>', 'remove tags (comma-separated)')\n    .option('-m, --milestone <name>', 'set milestone')\n    .option('--clear-milestone', 'clear milestone')\n    .option('-e, --estimated-tokens <number>', 'update estimated tokens')\n    .option('--actual-tokens <number>', 'update actual tokens')\n    .option('--add-dependencies <ids>', 'add dependencies (comma-separated IDs)')\n    .option('--remove-dependencies <ids>', 'remove dependencies (comma-separated IDs)')\n    .option('--add-blocked-by <ids>', 'add blocked by (comma-separated IDs)')\n    .option('--remove-blocked-by <ids>', 'remove blocked by (comma-separated IDs)')\n    .option('--add-blocks <ids>', 'add blocks (comma-separated IDs)')\n    .option('--remove-blocks <ids>', 'remove blocks (comma-separated IDs)')\n    .option('--progress <percentage>', 'update completion percentage (0-100)')\n    .option('--reason <text>', 'reason for state change (recommended for state updates)')\n    .option('--reviewer <username>', 'reviewer who approved the change (for state updates)')\n    .option('--dry-run', 'show what would be updated without updating')\n    .action(async (issueId: string, options: UpdateOptions) => {\n      try {\n        await updateIssue(issueId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to update issue: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function updateIssue(issueId: string, options: UpdateOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n  const parser = new FrontmatterParser();\n\n  // Get issue hierarchy to find the issue\n  const hierarchy = relationshipManager.getIssueHierarchy(issueId);\n  if (!hierarchy) {\n    throw new Error(`Issue not found: ${issueId}`);\n  }\n\n  const issue = hierarchy.issue;\n  const filePath = issue.file_path;\n\n  // Build updates object\n  const updates: Partial<IssueFrontmatter> = {};\n\n  if (options.title) {\n    updates.title = options.title;\n  }\n\n  if (options.description) {\n    updates.description = options.description;\n  }\n\n  if (options.status) {\n    updates.status = options.status;\n  }\n\n  // Handle state updates with proper validation\n  if (options.state) {\n    const currentState = StateManager.getEffectiveState(issue);\n    \n    // Validate state transition\n    const transitionResult = StateTransition.transitionState(\n      issue,\n      options.state,\n      process.env.USER || 'system',\n      options.reason,\n      options.reviewer\n    );\n\n    if (!transitionResult.success) {\n      console.error(Formatter.error('State transition failed:'));\n      transitionResult.errors.forEach(error => \n        console.error(Formatter.error(`  - ${error}`))\n      );\n      throw new Error('Invalid state transition');\n    }\n\n    if (transitionResult.warnings.length > 0) {\n      console.log(Formatter.warning('State transition warnings:'));\n      transitionResult.warnings.forEach(warning => \n        console.log(Formatter.warning(`  - ${warning}`))\n      );\n    }\n\n    updates.state = transitionResult.item.state;\n    updates.state_metadata = transitionResult.item.state_metadata;\n  }\n\n  if (options.priority) {\n    updates.priority = options.priority;\n  }\n\n  if (options.assignee) {\n    updates.assignee = options.assignee;\n  }\n\n  if (options.epicId) {\n    updates.epic_id = options.epicId;\n  }\n\n  if (options.milestone) {\n    updates.milestone = options.milestone;\n  }\n\n  if (options.clearMilestone) {\n    updates.milestone = undefined;\n  }\n\n  if (options.estimatedTokens !== undefined) {\n    updates.estimated_tokens = parseInt(options.estimatedTokens.toString(), 10);\n  }\n\n  if (options.actualTokens !== undefined) {\n    updates.actual_tokens = parseInt(options.actualTokens.toString(), 10);\n  }\n\n  if (options.progress !== undefined) {\n    const progress = parseInt(options.progress.toString(), 10);\n    if (progress < 0 || progress > 100) {\n      throw new Error('Progress must be between 0 and 100');\n    }\n    updates.completion_percentage = progress;\n  }\n\n  // Handle tags\n  if (options.addTags || options.removeTags) {\n    const currentTags = issue.tags || [];\n    let newTags = [...currentTags];\n\n    if (options.addTags) {\n      const tagsToAdd = options.addTags.split(',').map((tag) => tag.trim());\n      for (const tag of tagsToAdd) {\n        if (!newTags.includes(tag)) {\n          newTags.push(tag);\n        }\n      }\n    }\n\n    if (options.removeTags) {\n      const tagsToRemove = options.removeTags.split(',').map((tag) => tag.trim());\n      newTags = newTags.filter((tag) => !tagsToRemove.includes(tag));\n    }\n\n    updates.tags = newTags.length > 0 ? newTags : undefined;\n  }\n\n  // Handle dependencies\n  if (options.addDependencies || options.removeDependencies) {\n    const currentDeps = issue.dependencies || [];\n    let newDeps = [...currentDeps];\n\n    if (options.addDependencies) {\n      const depsToAdd = options.addDependencies.split(',').map((dep) => dep.trim());\n      for (const dep of depsToAdd) {\n        if (!newDeps.includes(dep)) {\n          newDeps.push(dep);\n        }\n      }\n    }\n\n    if (options.removeDependencies) {\n      const depsToRemove = options.removeDependencies.split(',').map((dep) => dep.trim());\n      newDeps = newDeps.filter((dep) => !depsToRemove.includes(dep));\n    }\n\n    updates.dependencies = newDeps.length > 0 ? newDeps : undefined;\n  }\n\n  // Handle blocked_by\n  if (options.addBlockedBy || options.removeBlockedBy) {\n    const currentBlocked = issue.blocked_by || [];\n    let newBlocked = [...currentBlocked];\n\n    if (options.addBlockedBy) {\n      const blockedToAdd = options.addBlockedBy.split(',').map((id) => id.trim());\n      for (const id of blockedToAdd) {\n        if (!newBlocked.includes(id)) {\n          newBlocked.push(id);\n        }\n      }\n    }\n\n    if (options.removeBlockedBy) {\n      const blockedToRemove = options.removeBlockedBy.split(',').map((id) => id.trim());\n      newBlocked = newBlocked.filter((id) => !blockedToRemove.includes(id));\n    }\n\n    updates.blocked_by = newBlocked.length > 0 ? newBlocked : undefined;\n  }\n\n  // Handle blocks\n  if (options.addBlocks || options.removeBlocks) {\n    const currentBlocks = issue.blocks || [];\n    let newBlocks = [...currentBlocks];\n\n    if (options.addBlocks) {\n      const blocksToAdd = options.addBlocks.split(',').map((id) => id.trim());\n      for (const id of blocksToAdd) {\n        if (!newBlocks.includes(id)) {\n          newBlocks.push(id);\n        }\n      }\n    }\n\n    if (options.removeBlocks) {\n      const blocksToRemove = options.removeBlocks.split(',').map((id) => id.trim());\n      newBlocks = newBlocks.filter((id) => !blocksToRemove.includes(id));\n    }\n\n    updates.blocks = newBlocks.length > 0 ? newBlocks : undefined;\n  }\n\n  // Show what would be updated (dry run or verbose)\n  if (options.dryRun || Object.keys(updates).length === 0) {\n    console.log(Formatter.info(`${options.dryRun ? 'Dry run - ' : ''}Issue would be updated:`));\n    console.log(Formatter.debug(`Issue ID: ${issueId}`));\n    console.log(Formatter.debug(`File: ${filePath}`));\n\n    if (Object.keys(updates).length === 0) {\n      console.log(Formatter.warning('No updates specified'));\n      return;\n    }\n\n    for (const [key, value] of Object.entries(updates)) {\n      const currentValue = issue[key as keyof typeof issue];\n      console.log(Formatter.debug(`${key}: ${currentValue} → ${value}`));\n    }\n\n    if (options.dryRun) {\n      return;\n    }\n  }\n\n  // Update the updated_date\n  updates.updated_date = new Date().toISOString();\n\n  // Update the file\n  const updatedIssue = parser.updateFile(filePath, updates);\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`Issue updated successfully!`));\n  console.log(Formatter.info(`Issue ID: ${issueId}`));\n  console.log(Formatter.info(`File: ${filePath}`));\n\n  // Show what was changed\n  const changedFields = Object.keys(updates).filter((key) => key !== 'updated_date');\n  if (changedFields.length > 0) {\n    console.log(Formatter.info(`Updated fields: ${changedFields.join(', ')}`));\n  }\n\n  // Show current values\n  console.log('');\n  console.log(Formatter.success('Current values:'));\n  console.log(`  Title: ${updatedIssue.title}`);\n  console.log(`  Status: ${getStatusDisplay(updatedIssue.status)}`);\n  if (updatedIssue.state) {\n    console.log(`  State: ${getStateDisplay(updatedIssue.state)}`);\n  }\n  console.log(`  Priority: ${getPriorityDisplay(updatedIssue.priority)}`);\n  console.log(`  Assignee: ${updatedIssue.assignee}`);\n  console.log(`  Epic ID: ${updatedIssue.epic_id}`);\n\n  if (updatedIssue.milestone) {\n    console.log(`  Milestone: ${updatedIssue.milestone}`);\n  }\n\n  if (updatedIssue.tags && updatedIssue.tags.length > 0) {\n    console.log(`  Tags: ${updatedIssue.tags.join(', ')}`);\n  }\n\n  if (updatedIssue.completion_percentage !== undefined) {\n    console.log(`  Progress: ${updatedIssue.completion_percentage}%`);\n  }\n\n  if (updatedIssue.dependencies && updatedIssue.dependencies.length > 0) {\n    console.log(`  Dependencies: ${updatedIssue.dependencies.join(', ')}`);\n  }\n\n  if (updatedIssue.blocked_by && updatedIssue.blocked_by.length > 0) {\n    console.log(`  Blocked By: ${updatedIssue.blocked_by.join(', ')}`);\n  }\n\n  if (updatedIssue.blocks && updatedIssue.blocks.length > 0) {\n    console.log(`  Blocks: ${updatedIssue.blocks.join(', ')}`);\n  }\n\n  console.log(`  Estimated Tokens: ${updatedIssue.estimated_tokens || 0}`);\n  console.log(`  Actual Tokens: ${updatedIssue.actual_tokens || 0}`);\n\n  console.log(`  Updated: ${new Date(updatedIssue.updated_date).toLocaleString()}`);\n}\n\nfunction getStatusDisplay(status: string): string {\n  const statusColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.success(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = statusColors[status] || ((text) => text);\n  return colorFn(status.toUpperCase());\n}\n\nfunction getPriorityDisplay(priority: string): string {\n  const priorityColors: Record<string, (text: string) => string> = {\n    critical: (text) => Formatter.error(text),\n    high: (text) => Formatter.warning(text),\n    medium: (text) => Formatter.info(text),\n    low: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = priorityColors[priority] || ((text) => text);\n  return colorFn(priority.toUpperCase());\n}\n\nfunction getStateDisplay(state: string): string {\n  const stateColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.warning(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n    ready_for_engineering: (text) => Formatter.info(text),\n    ready_for_qa: (text) => Formatter.warning(text),\n    ready_for_deployment: (text) => Formatter.info(text),\n    won_t_do: (text) => Formatter.error(text),\n    done: (text) => Formatter.success(text),\n  };\n\n  const colorFn = stateColors[state] || ((text) => text);\n  return colorFn(state.toUpperCase().replace(/_/g, ' '));\n}\n","/**\n * Issue Command Group for AI-Trackdown\n * Mid-level work units within epics\n */\n\nimport { Command } from 'commander';\nimport { createIssueAssignCommand } from './issue/assign.js';\nimport { createIssueCloseCommand } from './issue/close.js';\nimport { createIssueCompleteCommand } from './issue/complete.js';\nimport { createIssueCreateCommand } from './issue/create.js';\nimport { createIssueDeleteCommand } from './issue/delete.js';\nimport { createIssueListCommand } from './issue/list.js';\nimport { createIssueReopenCommand } from './issue/reopen.js';\nimport { createIssueShowCommand } from './issue/show.js';\nimport { createIssueUpdateCommand } from './issue/update.js';\n\nexport function createIssueCommand(): Command {\n  const cmd = new Command('issue');\n\n  cmd\n    .description('Manage issues (mid-level work units within epics)')\n    .alias('issues')\n    .addCommand(createIssueCreateCommand())\n    .addCommand(createIssueListCommand())\n    .addCommand(createIssueShowCommand())\n    .addCommand(createIssueUpdateCommand())\n    .addCommand(createIssueDeleteCommand())\n    .addCommand(createIssueCompleteCommand())\n    .addCommand(createIssueAssignCommand())\n    .addCommand(createIssueCloseCommand())\n    .addCommand(createIssueReopenCommand());\n\n  return cmd;\n}\n","#!/usr/bin/env node\n\n/**\n * Migration Tool for AI-Trackdown\n * Converts legacy .trackdownrc.json to .ai-trackdown/config.yaml\n * Migrates active/completed/ to epics/issues/tasks/ structure\n * Adds YAML frontmatter to existing markdown files\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport * as YAML from 'yaml';\nimport type { EpicFrontmatter, IssueFrontmatter, TaskFrontmatter } from '../types/ai-trackdown.js';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { FrontmatterParser } from '../utils/frontmatter-parser.js';\nimport { IdGenerator } from '../utils/simple-id-generator.js';\n\ninterface LegacyConfig {\n  directory_root?: string;\n  github?: {\n    owner?: string;\n    repo?: string;\n    token?: string;\n  };\n  default_assignee?: string;\n  labels?: string[];\n  milestones?: string[];\n}\n\ninterface MigrationStats {\n  configMigrated: boolean;\n  filesProcessed: number;\n  epicsMigrated: number;\n  issuesMigrated: number;\n  tasksMigrated: number;\n  errors: string[];\n}\n\nexport class MigrationTool {\n  private frontmatterParser = new FrontmatterParser();\n  private configManager = new ConfigManager();\n  private idGenerator = new IdGenerator();\n  private stats: MigrationStats = {\n    configMigrated: false,\n    filesProcessed: 0,\n    epicsMigrated: 0,\n    issuesMigrated: 0,\n    tasksMigrated: 0,\n    errors: [],\n  };\n\n  /**\n   * Main migration entry point\n   */\n  public async migrate(\n    sourceDir: string = process.cwd(),\n    options: {\n      dryRun?: boolean;\n      verbose?: boolean;\n      backup?: boolean;\n    } = {}\n  ): Promise<MigrationStats> {\n    const spinner = ora('Starting AI-Trackdown migration...').start();\n\n    try {\n      // Step 1: Backup if requested\n      if (options.backup) {\n        await this.createBackup(sourceDir);\n        spinner.text = 'Backup created';\n      }\n\n      // Step 2: Migrate configuration\n      spinner.text = 'Migrating configuration...';\n      await this.migrateConfiguration(sourceDir, options.dryRun);\n\n      // Step 3: Create new directory structure\n      spinner.text = 'Creating directory structure...';\n      await this.createDirectoryStructure(sourceDir, options.dryRun);\n\n      // Step 4: Migrate existing files\n      spinner.text = 'Migrating files...';\n      await this.migrateFiles(sourceDir, options.dryRun, options.verbose);\n\n      // Step 5: Cleanup legacy files\n      spinner.text = 'Cleaning up...';\n      await this.cleanupLegacyFiles(sourceDir, options.dryRun);\n\n      spinner.succeed('Migration completed successfully!');\n      this.displaySummary();\n    } catch (error) {\n      spinner.fail(`Migration failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n      throw error;\n    }\n\n    return this.stats;\n  }\n\n  /**\n   * Migrate .trackdownrc.json to .ai-trackdown/config.yaml\n   */\n  private async migrateConfiguration(sourceDir: string, dryRun = false): Promise<void> {\n    const legacyConfigPath = path.join(sourceDir, '.trackdownrc.json');\n\n    if (!fs.existsSync(legacyConfigPath)) {\n      console.log(chalk.yellow('No legacy .trackdownrc.json found, creating default config'));\n      return;\n    }\n\n    try {\n      const legacyConfig: LegacyConfig = JSON.parse(fs.readFileSync(legacyConfigPath, 'utf8'));\n\n      // Convert to new config format\n      const newConfig = {\n        version: '1.0.0',\n        directory_root: legacyConfig.directory_root || '.ai-trackdown',\n        defaults: {\n          assignee: legacyConfig.default_assignee || 'unassigned',\n          priority: 'medium',\n          status: 'todo',\n        },\n        templates: {\n          epic: 'default',\n          issue: 'default',\n          task: 'default',\n        },\n        integrations: {\n          // Note: GitHub integration removed in new architecture\n        },\n        automation: {\n          auto_assign_ids: true,\n          auto_update_dates: true,\n          auto_track_relationships: true,\n        },\n      };\n\n      if (!dryRun) {\n        const configDir = path.join(sourceDir, '.ai-trackdown');\n        if (!fs.existsSync(configDir)) {\n          fs.mkdirSync(configDir, { recursive: true });\n        }\n\n        const newConfigPath = path.join(configDir, 'config.yaml');\n        fs.writeFileSync(newConfigPath, YAML.stringify(newConfig, { indent: 2 }));\n\n        console.log(chalk.green(`✓ Configuration migrated to ${newConfigPath}`));\n      } else {\n        console.log(chalk.blue(`[DRY RUN] Would migrate config to .ai-trackdown/config.yaml`));\n      }\n\n      this.stats.configMigrated = true;\n    } catch (error) {\n      const errorMsg = `Failed to migrate configuration: ${error instanceof Error ? error.message : 'Unknown error'}`;\n      this.stats.errors.push(errorMsg);\n      throw new Error(errorMsg);\n    }\n  }\n\n  /**\n   * Create the new directory structure\n   */\n  private async createDirectoryStructure(sourceDir: string, dryRun = false): Promise<void> {\n    const aiTrackdownDir = path.join(sourceDir, '.ai-trackdown');\n    const directories = [\n      path.join(aiTrackdownDir, 'epics'),\n      path.join(aiTrackdownDir, 'issues'),\n      path.join(aiTrackdownDir, 'tasks'),\n      path.join(aiTrackdownDir, 'templates'),\n    ];\n\n    if (!dryRun) {\n      for (const dir of directories) {\n        if (!fs.existsSync(dir)) {\n          fs.mkdirSync(dir, { recursive: true });\n          console.log(chalk.green(`✓ Created directory: ${dir}`));\n        }\n      }\n    } else {\n      console.log(chalk.blue(`[DRY RUN] Would create directories: ${directories.join(', ')}`));\n    }\n  }\n\n  /**\n   * Migrate existing files from legacy structure\n   */\n  private async migrateFiles(sourceDir: string, dryRun = false, verbose = false): Promise<void> {\n    const legacyDirs = [\n      path.join(sourceDir, 'active'),\n      path.join(sourceDir, 'completed'),\n      path.join(sourceDir, 'trackdown'), // Handle existing trackdown folder\n    ];\n\n    for (const legacyDir of legacyDirs) {\n      if (fs.existsSync(legacyDir)) {\n        await this.processLegacyDirectory(legacyDir, sourceDir, dryRun, verbose);\n      }\n    }\n  }\n\n  /**\n   * Process a legacy directory and migrate its files\n   */\n  private async processLegacyDirectory(\n    legacyDir: string,\n    sourceDir: string,\n    dryRun = false,\n    verbose = false\n  ): Promise<void> {\n    const files = fs.readdirSync(legacyDir).filter((file) => file.endsWith('.md'));\n\n    for (const file of files) {\n      const filePath = path.join(legacyDir, file);\n\n      try {\n        await this.migrateFile(filePath, sourceDir, dryRun, verbose);\n        this.stats.filesProcessed++;\n      } catch (error) {\n        const errorMsg = `Failed to migrate ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`;\n        this.stats.errors.push(errorMsg);\n        if (verbose) {\n          console.log(chalk.red(`✗ ${errorMsg}`));\n        }\n      }\n    }\n  }\n\n  /**\n   * Migrate a single file\n   */\n  private async migrateFile(\n    filePath: string,\n    sourceDir: string,\n    dryRun = false,\n    verbose = false\n  ): Promise<void> {\n    const content = fs.readFileSync(filePath, 'utf8');\n    const filename = path.basename(filePath, '.md');\n\n    // Determine file type and destination\n    const { type, frontmatter, targetPath } = this.analyzeAndPrepareFile(\n      filename,\n      content,\n      sourceDir\n    );\n\n    if (!dryRun) {\n      // Ensure target directory exists\n      const targetDir = path.dirname(targetPath);\n      if (!fs.existsSync(targetDir)) {\n        fs.mkdirSync(targetDir, { recursive: true });\n      }\n\n      // Write migrated file with frontmatter\n      let migratedContent: string;\n\n      switch (type) {\n        case 'epic':\n          migratedContent = this.frontmatterParser.serializeEpic(\n            frontmatter as EpicFrontmatter,\n            this.extractContent(content)\n          );\n          this.stats.epicsMigrated++;\n          break;\n        case 'issue':\n          migratedContent = this.frontmatterParser.serializeIssue(\n            frontmatter as IssueFrontmatter,\n            this.extractContent(content)\n          );\n          this.stats.issuesMigrated++;\n          break;\n        case 'task':\n          migratedContent = this.frontmatterParser.serializeTask(\n            frontmatter as TaskFrontmatter,\n            this.extractContent(content)\n          );\n          this.stats.tasksMigrated++;\n          break;\n        default:\n          throw new Error(`Unknown file type: ${type}`);\n      }\n\n      fs.writeFileSync(targetPath, migratedContent);\n\n      if (verbose) {\n        console.log(chalk.green(`✓ Migrated ${type}: ${filePath} → ${targetPath}`));\n      }\n    } else {\n      console.log(chalk.blue(`[DRY RUN] Would migrate ${type}: ${filePath} → ${targetPath}`));\n    }\n  }\n\n  /**\n   * Analyze a file and prepare frontmatter\n   */\n  private analyzeAndPrepareFile(\n    filename: string,\n    content: string,\n    sourceDir: string\n  ): {\n    type: 'epic' | 'issue' | 'task';\n    frontmatter: EpicFrontmatter | IssueFrontmatter | TaskFrontmatter;\n    targetPath: string;\n  } {\n    const aiTrackdownDir = path.join(sourceDir, '.ai-trackdown');\n\n    // Try to determine type from filename patterns\n    let type: 'epic' | 'issue' | 'task';\n    let id: string;\n\n    if (filename.startsWith('EPIC-') || filename.includes('epic')) {\n      type = 'epic';\n      id = this.extractOrGenerateId(filename, 'EP');\n    } else if (filename.startsWith('ISSUE-') || filename.includes('issue')) {\n      type = 'issue';\n      id = this.extractOrGenerateId(filename, 'ISS');\n    } else if (\n      filename.startsWith('TASK-') ||\n      filename.includes('task') ||\n      filename.startsWith('TSK-')\n    ) {\n      type = 'task';\n      id = this.extractOrGenerateId(filename, 'TSK');\n    } else {\n      // Default to issue if unclear\n      type = 'issue';\n      id = this.extractOrGenerateId(filename, 'ISS');\n    }\n\n    const now = new Date().toISOString();\n    const title = this.extractTitle(content) || filename.replace(/-/g, ' ');\n\n    // Create appropriate frontmatter\n    const baseFrontmatter = {\n      title,\n      status: 'todo' as const,\n      priority: 'medium' as const,\n      assignee: 'unassigned',\n      labels: [],\n      created_date: now,\n      updated_date: now,\n    };\n\n    let frontmatter: EpicFrontmatter | IssueFrontmatter | TaskFrontmatter;\n    let targetPath: string;\n\n    switch (type) {\n      case 'epic':\n        frontmatter = {\n          epic_id: id,\n          ...baseFrontmatter,\n          story_points: 0,\n          completion_percentage: 0,\n        } as EpicFrontmatter;\n        targetPath = path.join(aiTrackdownDir, 'epics', `${id}.md`);\n        break;\n\n      case 'issue': {\n        // For issues, we need to assign to an epic (use first available or create default)\n        const epicId = this.findOrCreateDefaultEpic(sourceDir);\n        frontmatter = {\n          issue_id: id,\n          epic_id: epicId,\n          ...baseFrontmatter,\n          story_points: 1,\n        } as IssueFrontmatter;\n        targetPath = path.join(aiTrackdownDir, 'issues', `${id}.md`);\n        break;\n      }\n\n      case 'task': {\n        // For tasks, we need epic and issue IDs\n        const taskEpicId = this.findOrCreateDefaultEpic(sourceDir);\n        const issueId = this.findOrCreateDefaultIssue(sourceDir, taskEpicId);\n        frontmatter = {\n          task_id: id,\n          issue_id: issueId,\n          epic_id: taskEpicId,\n          ...baseFrontmatter,\n          estimated_hours: 1,\n          actual_hours: 0,\n        } as TaskFrontmatter;\n        targetPath = path.join(aiTrackdownDir, 'tasks', `${id}.md`);\n        break;\n      }\n    }\n\n    return { type, frontmatter, targetPath };\n  }\n\n  /**\n   * Extract or generate an ID from filename\n   */\n  private extractOrGenerateId(filename: string, prefix: string): string {\n    // Try to extract existing ID\n    const patterns = [\n      new RegExp(`${prefix}-(\\\\d{4})`),\n      new RegExp(`(${prefix.toLowerCase()}|${prefix})-(\\\\d+)`, 'i'),\n      /(\\d{4})/,\n    ];\n\n    for (const pattern of patterns) {\n      const match = filename.match(pattern);\n      if (match) {\n        const num = match[1] || match[2];\n        return `${prefix}-${num.padStart(4, '0')}`;\n      }\n    }\n\n    // Generate new ID\n    switch (prefix) {\n      case 'EP':\n        return this.idGenerator.generateEpicId('migrated');\n      case 'ISS':\n        return this.idGenerator.generateIssueId('EP-0001', 'migrated');\n      case 'TSK':\n        return this.idGenerator.generateTaskId('ISS-0001', 'migrated');\n      default:\n        return `${prefix}-0001`;\n    }\n  }\n\n  /**\n   * Extract title from content\n   */\n  private extractTitle(content: string): string | null {\n    // Look for markdown title (# Title)\n    const titleMatch = content.match(/^#\\s+(.+)$/m);\n    if (titleMatch) {\n      return titleMatch[1].trim();\n    }\n\n    // Look for first non-empty line\n    const lines = content\n      .split('\\n')\n      .map((line) => line.trim())\n      .filter((line) => line);\n    if (lines.length > 0) {\n      return lines[0].replace(/^#+\\s*/, '');\n    }\n\n    return null;\n  }\n\n  /**\n   * Extract content without title\n   */\n  private extractContent(content: string): string {\n    // Remove first title line if present\n    const lines = content.split('\\n');\n    if (lines[0]?.trim().startsWith('# ')) {\n      return lines.slice(1).join('\\n').trim();\n    }\n    return content.trim();\n  }\n\n  /**\n   * Find or create default epic for migration\n   */\n  private findOrCreateDefaultEpic(_sourceDir: string): string {\n    // Return default epic ID - this will be created if needed\n    return 'EP-0001';\n  }\n\n  /**\n   * Find or create default issue for migration\n   */\n  private findOrCreateDefaultIssue(_sourceDir: string, _epicId: string): string {\n    // Return default issue ID - this will be created if needed\n    return 'ISS-0001';\n  }\n\n  /**\n   * Create backup of source directory\n   */\n  private async createBackup(sourceDir: string): Promise<void> {\n    const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n    const backupDir = path.join(sourceDir, `backup-${timestamp}`);\n\n    // Simple recursive copy\n    this.copyDirectory(sourceDir, backupDir, ['node_modules', '.git', 'backup-*']);\n\n    console.log(chalk.green(`✓ Backup created at ${backupDir}`));\n  }\n\n  /**\n   * Copy directory recursively\n   */\n  private copyDirectory(src: string, dest: string, exclude: string[] = []): void {\n    if (!fs.existsSync(dest)) {\n      fs.mkdirSync(dest, { recursive: true });\n    }\n\n    const items = fs.readdirSync(src);\n\n    for (const item of items) {\n      const srcPath = path.join(src, item);\n      const destPath = path.join(dest, item);\n\n      // Skip excluded patterns\n      if (exclude.some((pattern) => item.match(new RegExp(pattern)))) {\n        continue;\n      }\n\n      const stat = fs.statSync(srcPath);\n\n      if (stat.isDirectory()) {\n        this.copyDirectory(srcPath, destPath, exclude);\n      } else {\n        fs.copyFileSync(srcPath, destPath);\n      }\n    }\n  }\n\n  /**\n   * Cleanup legacy files after successful migration\n   */\n  private async cleanupLegacyFiles(sourceDir: string, dryRun = false): Promise<void> {\n    const legacyFiles = [path.join(sourceDir, '.trackdownrc.json')];\n\n    const legacyDirs = [path.join(sourceDir, 'active'), path.join(sourceDir, 'completed')];\n\n    if (!dryRun) {\n      // Remove legacy config file\n      for (const file of legacyFiles) {\n        if (fs.existsSync(file)) {\n          fs.unlinkSync(file);\n          console.log(chalk.green(`✓ Removed legacy file: ${file}`));\n        }\n      }\n\n      // Archive legacy directories\n      for (const dir of legacyDirs) {\n        if (fs.existsSync(dir)) {\n          const archiveDir = path.join(sourceDir, `${path.basename(dir)}-legacy`);\n          fs.renameSync(dir, archiveDir);\n          console.log(chalk.green(`✓ Archived legacy directory: ${dir} → ${archiveDir}`));\n        }\n      }\n    } else {\n      console.log(chalk.blue(`[DRY RUN] Would cleanup legacy files and directories`));\n    }\n  }\n\n  /**\n   * Display migration summary\n   */\n  private displaySummary(): void {\n    console.log(`\\n${chalk.bold.green('Migration Summary:')}`);\n    console.log(chalk.green(`✓ Configuration migrated: ${this.stats.configMigrated}`));\n    console.log(chalk.green(`✓ Files processed: ${this.stats.filesProcessed}`));\n    console.log(chalk.green(`✓ Epics migrated: ${this.stats.epicsMigrated}`));\n    console.log(chalk.green(`✓ Issues migrated: ${this.stats.issuesMigrated}`));\n    console.log(chalk.green(`✓ Tasks migrated: ${this.stats.tasksMigrated}`));\n\n    if (this.stats.errors.length > 0) {\n      console.log(chalk.red(`✗ Errors encountered: ${this.stats.errors.length}`));\n      this.stats.errors.forEach((error) => {\n        console.log(chalk.red(`  - ${error}`));\n      });\n    }\n\n    console.log(`\\n${chalk.bold.blue('Next Steps:')}`);\n    console.log('1. Review migrated files in .ai-trackdown/ directory');\n    console.log('2. Update .ai-trackdown/config.yaml as needed');\n    console.log('3. Test the new system with: aitrackdown status');\n    console.log('4. Archive or remove legacy files when satisfied');\n  }\n}\n\n// CLI Command Setup\nexport function createMigrateCommand(): Command {\n  return new Command('migrate')\n    .description('Migrate from legacy trackdown to ai-trackdown structure')\n    .option('-d, --dry-run', 'Preview migration without making changes')\n    .option('-v, --verbose', 'Show detailed migration progress')\n    .option('-b, --backup', 'Create backup before migration')\n    .option('--source <dir>', 'Source directory to migrate from', process.cwd())\n    .action(async (options) => {\n      const migrationTool = new MigrationTool();\n\n      try {\n        console.log(chalk.bold.blue('AI-Trackdown Migration Tool'));\n        console.log(chalk.gray('Converting legacy structure to new ai-trackdown format\\n'));\n\n        const _stats = await migrationTool.migrate(options.source, {\n          dryRun: options.dryRun,\n          verbose: options.verbose,\n          backup: options.backup,\n        });\n\n        if (options.dryRun) {\n          console.log(\n            chalk.yellow('\\nDry run completed. Use without --dry-run to perform actual migration.')\n          );\n        }\n\n        process.exit(0);\n      } catch (error) {\n        console.error(\n          chalk.red(`Migration failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n        );\n        process.exit(1);\n      }\n    });\n}\n\nexport default createMigrateCommand;\n","/**\n * Structure Migration Command\n * ATT-004: Migrate from separate root directories to unified structure\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { UnifiedPathResolver } from '../utils/unified-path-resolver.js';\n\ninterface MigrateOptions {\n  dryRun?: boolean;\n  backup?: boolean;\n  verbose?: boolean;\n  force?: boolean;\n  tasksDir?: string;\n}\n\nexport function createMigrateStructureCommand(): Command {\n  const cmd = new Command('migrate-structure');\n\n  cmd\n    .description('Migrate from separate root directories to unified structure')\n    .option('--dry-run', 'show what would be migrated without making changes')\n    .option('--backup', 'create backup before migration')\n    .option('--verbose', 'verbose output')\n    .option('--force', 'force migration even if target directories exist')\n    .option('--tasks-dir <path>', 'target tasks directory (default: from config or \"tasks\")')\n    .addHelpText(\n      'after',\n      `\nExamples:\n  $ aitrackdown migrate-structure --dry-run\n  $ aitrackdown migrate-structure --backup --verbose\n  $ aitrackdown migrate-structure --tasks-dir work\n\nMigration Process:\n  1. Detects legacy directory structure (epics/, issues/, tasks/ at root)\n  2. Creates unified structure under configurable root (default: tasks/)\n  3. Moves files to new structure: epics/ -> tasks/epics/\n  4. Updates configuration if needed\n  5. Optionally creates backup of original structure\n\nBefore Migration:\n  project/\n  ├── epics/           # ❌ Separate root directory\n  ├── issues/          # ❌ Separate root directory\n  └── tasks/           # ❌ Separate root directory\n\nAfter Migration:\n  project/\n  └── tasks/           # ✅ Single configurable root\n      ├── epics/\n      ├── issues/\n      ├── tasks/\n      ├── prs/\n      └── templates/\n`\n    )\n    .action(async (options: MigrateOptions) => {\n      try {\n        await migrateStructure(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Migration failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function migrateStructure(options: MigrateOptions): Promise<void> {\n  const projectRoot = process.cwd();\n\n  try {\n    // Check if this is an AI-Trackdown project\n    const configManager = new ConfigManager(projectRoot);\n    if (!configManager.isProjectDirectory(projectRoot)) {\n      throw new Error('Not an AI-Trackdown project. Run \"aitrackdown init\" first.');\n    }\n\n    const config = configManager.getConfig();\n    const cliTasksDir = options.tasksDir || process.env.CLI_TASKS_DIR;\n\n    // Create path resolver to detect legacy structure\n    const pathResolver = new UnifiedPathResolver(config, projectRoot, cliTasksDir);\n    const legacy = pathResolver.detectLegacyStructure();\n\n    if (!legacy.hasLegacy) {\n      console.log(\n        Formatter.success(\n          '✅ No legacy directory structure detected. Project already uses unified structure.'\n        )\n      );\n\n      // Show current structure for verification\n      pathResolver.showStructureInfo();\n      return;\n    }\n\n    console.log(Formatter.warning('🔍 Legacy directory structure detected:'));\n    legacy.legacyDirs.forEach((dir) => {\n      console.log(Formatter.info(`   • ${path.relative(projectRoot, dir)}`));\n    });\n\n    const targetPaths = pathResolver.getUnifiedPaths();\n    const targetTasksRoot = path.relative(projectRoot, targetPaths.tasksRoot);\n\n    console.log(Formatter.info(`\\n📋 Migration Plan:`));\n    console.log(Formatter.info(`   Target structure: ${targetTasksRoot}/`));\n\n    // Plan the migration\n    const migrationPlan = planMigration(projectRoot, legacy.legacyDirs, pathResolver);\n\n    if (migrationPlan.length === 0) {\n      console.log(Formatter.warning('No files to migrate.'));\n      return;\n    }\n\n    console.log(Formatter.info(`\\n📁 Files to migrate: ${migrationPlan.length}`));\n\n    if (options.verbose || options.dryRun) {\n      migrationPlan.forEach((item) => {\n        const sourcePath = path.relative(projectRoot, item.source);\n        const targetPath = path.relative(projectRoot, item.target);\n        console.log(Formatter.debug(`   ${sourcePath} → ${targetPath}`));\n      });\n    }\n\n    if (options.dryRun) {\n      console.log(\n        Formatter.info('\\n🔍 Dry run completed. Use without --dry-run to perform migration.')\n      );\n      return;\n    }\n\n    // Check for conflicts\n    const conflicts = migrationPlan.filter((item) => fs.existsSync(item.target));\n    if (conflicts.length > 0 && !options.force) {\n      console.log(Formatter.error('\\n❌ Migration conflicts detected:'));\n      conflicts.forEach((item) => {\n        const targetPath = path.relative(projectRoot, item.target);\n        console.log(Formatter.error(`   Target exists: ${targetPath}`));\n      });\n      console.log(\n        Formatter.info(\n          '\\n💡 Use --force to overwrite existing files or --backup to create backups first.'\n        )\n      );\n      return;\n    }\n\n    // Create backup if requested\n    if (options.backup) {\n      await createBackup(projectRoot, legacy.legacyDirs);\n    }\n\n    // Perform the migration\n    console.log(Formatter.info('\\n🚀 Starting migration...'));\n\n    // Create target directories\n    await createTargetDirectories(pathResolver);\n\n    // Move files\n    let migratedCount = 0;\n    for (const item of migrationPlan) {\n      try {\n        // Ensure target directory exists\n        const targetDir = path.dirname(item.target);\n        if (!fs.existsSync(targetDir)) {\n          fs.mkdirSync(targetDir, { recursive: true });\n        }\n\n        // Move file\n        fs.renameSync(item.source, item.target);\n        migratedCount++;\n\n        if (options.verbose) {\n          const sourcePath = path.relative(projectRoot, item.source);\n          const targetPath = path.relative(projectRoot, item.target);\n          console.log(Formatter.success(`   ✓ ${sourcePath} → ${targetPath}`));\n        }\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to migrate ${item.source}: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n      }\n    }\n\n    // Remove empty legacy directories\n    await removeEmptyLegacyDirectories(legacy.legacyDirs);\n\n    // Update configuration if needed\n    if (cliTasksDir && cliTasksDir !== config.tasks_directory) {\n      configManager.updateConfig({ tasks_directory: cliTasksDir });\n      console.log(\n        Formatter.success(`✅ Updated configuration: tasks_directory = \"${cliTasksDir}\"`)\n      );\n    }\n\n    console.log(Formatter.success(`\\n🎉 Migration completed successfully!`));\n    console.log(Formatter.info(`   Files migrated: ${migratedCount}`));\n    console.log(Formatter.info(`   Target structure: ${targetTasksRoot}/`));\n\n    // Show final structure\n    console.log(Formatter.info('\\n📁 Final directory structure:'));\n    pathResolver.showStructureInfo();\n  } catch (error) {\n    throw new Error(\n      `Migration failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\nfunction planMigration(\n  _projectRoot: string,\n  legacyDirs: string[],\n  pathResolver: UnifiedPathResolver\n): Array<{ source: string; target: string; type: string }> {\n  const plan: Array<{ source: string; target: string; type: string }> = [];\n  const targetPaths = pathResolver.getUnifiedPaths();\n\n  for (const legacyDir of legacyDirs) {\n    if (!fs.existsSync(legacyDir)) continue;\n\n    const dirName = path.basename(legacyDir);\n    let targetDir: string;\n\n    // Map legacy directories to unified structure\n    switch (dirName) {\n      case 'epics':\n        targetDir = targetPaths.epicsDir;\n        break;\n      case 'issues':\n        targetDir = targetPaths.issuesDir;\n        break;\n      case 'tasks':\n        targetDir = targetPaths.tasksDir;\n        break;\n      case 'templates':\n        targetDir = targetPaths.templatesDir;\n        break;\n      case 'trackdown': {\n        // For old trackdown structure, check subdirectories\n        const subdirs = fs\n          .readdirSync(legacyDir, { withFileTypes: true })\n          .filter((dirent) => dirent.isDirectory())\n          .map((dirent) => dirent.name);\n\n        for (const subdir of subdirs) {\n          const sourceSubdir = path.join(legacyDir, subdir);\n          let targetSubdir: string;\n\n          switch (subdir) {\n            case 'active':\n            case 'epics':\n              targetSubdir = targetPaths.epicsDir;\n              break;\n            case 'issues':\n              targetSubdir = targetPaths.issuesDir;\n              break;\n            case 'tasks':\n              targetSubdir = targetPaths.tasksDir;\n              break;\n            case 'templates':\n              targetSubdir = targetPaths.templatesDir;\n              break;\n            default:\n              continue; // Skip unknown subdirectories\n          }\n\n          // Add files from trackdown subdirectory\n          if (fs.existsSync(sourceSubdir)) {\n            const files = fs\n              .readdirSync(sourceSubdir)\n              .filter((file) => file.endsWith('.md') || file.endsWith('.yaml'));\n\n            for (const file of files) {\n              plan.push({\n                source: path.join(sourceSubdir, file),\n                target: path.join(targetSubdir, file),\n                type: subdir,\n              });\n            }\n          }\n        }\n        continue;\n      }\n      default:\n        continue; // Skip unknown directories\n    }\n\n    // Add files from legacy directory\n    if (fs.existsSync(legacyDir)) {\n      const files = fs\n        .readdirSync(legacyDir)\n        .filter((file) => file.endsWith('.md') || file.endsWith('.yaml'));\n\n      for (const file of files) {\n        plan.push({\n          source: path.join(legacyDir, file),\n          target: path.join(targetDir, file),\n          type: dirName,\n        });\n      }\n    }\n  }\n\n  return plan;\n}\n\nasync function createTargetDirectories(pathResolver: UnifiedPathResolver): Promise<void> {\n  const requiredDirs = pathResolver.getRequiredDirectories();\n\n  for (const dir of requiredDirs) {\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n  }\n}\n\nasync function createBackup(projectRoot: string, legacyDirs: string[]): Promise<void> {\n  const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n  const backupDir = path.join(projectRoot, `.backup-${timestamp}`);\n\n  console.log(Formatter.info(`📦 Creating backup in ${path.relative(projectRoot, backupDir)}...`));\n\n  fs.mkdirSync(backupDir, { recursive: true });\n\n  for (const legacyDir of legacyDirs) {\n    if (fs.existsSync(legacyDir)) {\n      const targetBackupDir = path.join(backupDir, path.basename(legacyDir));\n      await copyDirectory(legacyDir, targetBackupDir);\n    }\n  }\n\n  console.log(Formatter.success(`✅ Backup created: ${path.relative(projectRoot, backupDir)}`));\n}\n\nasync function copyDirectory(source: string, target: string): Promise<void> {\n  if (!fs.existsSync(target)) {\n    fs.mkdirSync(target, { recursive: true });\n  }\n\n  const items = fs.readdirSync(source, { withFileTypes: true });\n\n  for (const item of items) {\n    const sourcePath = path.join(source, item.name);\n    const targetPath = path.join(target, item.name);\n\n    if (item.isDirectory()) {\n      await copyDirectory(sourcePath, targetPath);\n    } else {\n      fs.copyFileSync(sourcePath, targetPath);\n    }\n  }\n}\n\nasync function removeEmptyLegacyDirectories(legacyDirs: string[]): Promise<void> {\n  for (const dir of legacyDirs) {\n    try {\n      if (fs.existsSync(dir)) {\n        const items = fs.readdirSync(dir);\n        if (items.length === 0) {\n          fs.rmdirSync(dir);\n          console.log(Formatter.success(`✅ Removed empty directory: ${path.basename(dir)}`));\n        }\n      }\n    } catch (_error) {\n      // Ignore errors removing directories\n    }\n  }\n}\n","/**\n * Resolve Command Group for AI-Trackdown\n * Handles transitioning tickets to resolution states\n */\n\nimport { Command } from 'commander';\nimport type { \n  AnyItemData, \n  ResolutionState, \n  UnifiedState, \n  StateValidationResult \n} from '../types/ai-trackdown.js';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { FrontmatterParser } from '../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../utils/relationship-manager.js';\nimport { StateManager, StateTransition } from '../types/ai-trackdown.js';\n\ninterface ResolveOptions {\n  reason?: string;\n  reviewer?: string;\n  assignee?: string;\n  dryRun?: boolean;\n  force?: boolean;\n  batch?: boolean;\n  verbose?: boolean;\n}\n\nexport function createResolveCommand(): Command {\n  const cmd = new Command('resolve');\n\n  cmd\n    .description('Transition tickets to resolution states')\n    .option('--dry-run', 'show what would be resolved without making changes')\n    .option('--force', 'force resolution even if validation warnings exist')\n    .option('--batch', 'enable batch processing for multiple items')\n    .option('--verbose', 'show detailed transition information');\n\n  // Individual resolution commands\n  cmd\n    .command('engineering <item-id>')\n    .description('Mark item as ready for engineering')\n    .option('-r, --reason <text>', 'reason for transition')\n    .option('--reviewer <username>', 'reviewer who approved the transition')\n    .option('-a, --assignee <username>', 'assign to specific engineer')\n    .option('--dry-run', 'show what would be resolved without making changes')\n    .option('--force', 'force resolution even if validation warnings exist')\n    .option('--verbose', 'show detailed transition information')\n    .action(async (itemId: string, options: ResolveOptions) => {\n      await resolveItem(itemId, 'ready_for_engineering', options);\n    });\n\n  cmd\n    .command('qa <item-id>')\n    .description('Mark item as ready for QA')\n    .option('-r, --reason <text>', 'reason for transition')\n    .option('--reviewer <username>', 'reviewer who approved the transition')\n    .option('-a, --assignee <username>', 'assign to specific QA engineer')\n    .option('--dry-run', 'show what would be resolved without making changes')\n    .option('--force', 'force resolution even if validation warnings exist')\n    .option('--verbose', 'show detailed transition information')\n    .action(async (itemId: string, options: ResolveOptions) => {\n      await resolveItem(itemId, 'ready_for_qa', options);\n    });\n\n  cmd\n    .command('deployment <item-id>')\n    .description('Mark item as ready for deployment')\n    .option('-r, --reason <text>', 'reason for transition')\n    .option('--reviewer <username>', 'reviewer who approved the transition')\n    .option('-a, --assignee <username>', 'assign to specific deployment engineer')\n    .option('--dry-run', 'show what would be resolved without making changes')\n    .option('--force', 'force resolution even if validation warnings exist')\n    .option('--verbose', 'show detailed transition information')\n    .action(async (itemId: string, options: ResolveOptions) => {\n      await resolveItem(itemId, 'ready_for_deployment', options);\n    });\n\n  cmd\n    .command('done <item-id>')\n    .description('Mark item as completed/done')\n    .option('-r, --reason <text>', 'reason for completion')\n    .option('--reviewer <username>', 'reviewer who approved completion')\n    .option('--dry-run', 'show what would be resolved without making changes')\n    .option('--force', 'force resolution even if validation warnings exist')\n    .option('--verbose', 'show detailed transition information')\n    .action(async (itemId: string, options: ResolveOptions) => {\n      await resolveItem(itemId, 'done', options);\n    });\n\n  cmd\n    .command('reject <item-id>')\n    .description('Mark item as won\\'t do (rejected)')\n    .option('-r, --reason <text>', 'reason for rejection (required for rejection)')\n    .option('--reviewer <username>', 'reviewer who made the rejection decision')\n    .option('--dry-run', 'show what would be resolved without making changes')\n    .option('--force', 'force resolution even if validation warnings exist')\n    .option('--verbose', 'show detailed transition information')\n    .action(async (itemId: string, options: ResolveOptions) => {\n      if (!options.reason && !options.dryRun) {\n        console.error(Formatter.error('Reason is required when rejecting items'));\n        process.exit(1);\n      }\n      await resolveItem(itemId, 'won_t_do', options);\n    });\n\n  // Batch resolution commands\n  cmd\n    .command('batch-engineering')\n    .description('Mark multiple items as ready for engineering')\n    .argument('<item-ids...>', 'space-separated list of item IDs')\n    .option('-r, --reason <text>', 'reason for transitions')\n    .option('--reviewer <username>', 'reviewer who approved the transitions')\n    .option('-a, --assignee <username>', 'assign to specific engineer')\n    .option('--dry-run', 'show what would be resolved without making changes')\n    .option('--force', 'force resolution even if validation warnings exist')\n    .option('--verbose', 'show detailed transition information')\n    .action(async (itemIds: string[], options: ResolveOptions) => {\n      await resolveBatch(itemIds, 'ready_for_engineering', options);\n    });\n\n  cmd\n    .command('batch-qa')\n    .description('Mark multiple items as ready for QA')\n    .argument('<item-ids...>', 'space-separated list of item IDs')\n    .option('-r, --reason <text>', 'reason for transitions')\n    .option('--reviewer <username>', 'reviewer who approved the transitions')\n    .option('-a, --assignee <username>', 'assign to specific QA engineer')\n    .option('--dry-run', 'show what would be resolved without making changes')\n    .option('--force', 'force resolution even if validation warnings exist')\n    .option('--verbose', 'show detailed transition information')\n    .action(async (itemIds: string[], options: ResolveOptions) => {\n      await resolveBatch(itemIds, 'ready_for_qa', options);\n    });\n\n  cmd\n    .command('batch-deployment')\n    .description('Mark multiple items as ready for deployment')\n    .argument('<item-ids...>', 'space-separated list of item IDs')\n    .option('-r, --reason <text>', 'reason for transitions')\n    .option('--reviewer <username>', 'reviewer who approved the transitions')\n    .option('-a, --assignee <username>', 'assign to specific deployment engineer')\n    .option('--dry-run', 'show what would be resolved without making changes')\n    .option('--force', 'force resolution even if validation warnings exist')\n    .option('--verbose', 'show detailed transition information')\n    .action(async (itemIds: string[], options: ResolveOptions) => {\n      await resolveBatch(itemIds, 'ready_for_deployment', options);\n    });\n\n  // Show available transitions\n  cmd\n    .command('status <item-id>')\n    .description('Show current state and available transitions for an item')\n    .option('--verbose', 'show detailed state information')\n    .action(async (itemId: string, options: { verbose?: boolean }) => {\n      await showResolveStatus(itemId, options);\n    });\n\n  return cmd;\n}\n\nasync function resolveItem(\n  itemId: string, \n  targetState: ResolutionState, \n  options: ResolveOptions\n): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n    const parser = new FrontmatterParser();\n\n    // Find the item\n    const item = findItem(relationshipManager, itemId);\n    if (!item) {\n      throw new Error(`Item not found: ${itemId}`);\n    }\n\n    const currentState = StateManager.getEffectiveState(item);\n    \n    if (options.verbose || options.dryRun) {\n      console.log(Formatter.info(`Resolving ${itemId} to ${targetState}`));\n      console.log(Formatter.debug(`Current state: ${currentState}`));\n      console.log(Formatter.debug(`Target state: ${targetState}`));\n      console.log(Formatter.debug(`File: ${item.file_path}`));\n    }\n\n    // Perform state transition\n    const transitionResult = StateTransition.transitionState(\n      item,\n      targetState,\n      process.env.USER || 'system',\n      options.reason,\n      options.reviewer\n    );\n\n    if (!transitionResult.success) {\n      if (options.force && transitionResult.warnings.length > 0 && transitionResult.errors.length === 0) {\n        console.log(Formatter.warning('Forcing transition despite warnings:'));\n        transitionResult.warnings.forEach(warning => \n          console.log(Formatter.warning(`  - ${warning}`))\n        );\n      } else {\n        console.error(Formatter.error('State transition failed:'));\n        transitionResult.errors.forEach(error => \n          console.error(Formatter.error(`  - ${error}`))\n        );\n        process.exit(1);\n      }\n    }\n\n    if (transitionResult.warnings.length > 0 && !options.force) {\n      console.log(Formatter.warning('Transition warnings:'));\n      transitionResult.warnings.forEach(warning => \n        console.log(Formatter.warning(`  - ${warning}`))\n      );\n    }\n\n    if (options.dryRun) {\n      console.log(Formatter.info('Dry run - no changes made'));\n      return;\n    }\n\n    // Update assignee if provided\n    if (options.assignee) {\n      transitionResult.item.assignee = options.assignee;\n    }\n\n    // Write the updated item\n    const updates = {\n      state: transitionResult.item.state,\n      state_metadata: transitionResult.item.state_metadata,\n      updated_date: transitionResult.item.updated_date,\n      ...(options.assignee && { assignee: options.assignee })\n    };\n\n    parser.updateFile(item.file_path, updates);\n\n    // Refresh cache\n    relationshipManager.rebuildCache();\n\n    console.log(Formatter.success(`Item ${itemId} resolved to ${targetState}`));\n    \n    if (options.verbose) {\n      console.log('');\n      console.log(Formatter.info('Updated fields:'));\n      console.log(`  State: ${currentState} → ${targetState}`);\n      console.log(`  Transitioned by: ${transitionResult.item.state_metadata?.transitioned_by}`);\n      console.log(`  Transitioned at: ${new Date(transitionResult.item.state_metadata?.transitioned_at || '').toLocaleString()}`);\n      if (options.reason) {\n        console.log(`  Reason: ${options.reason}`);\n      }\n      if (options.reviewer) {\n        console.log(`  Reviewer: ${options.reviewer}`);\n      }\n      if (options.assignee) {\n        console.log(`  Assigned to: ${options.assignee}`);\n      }\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Failed to resolve item: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function resolveBatch(\n  itemIds: string[], \n  targetState: ResolutionState, \n  options: ResolveOptions\n): Promise<void> {\n  console.log(Formatter.info(`Batch resolving ${itemIds.length} items to ${targetState}`));\n  \n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - no changes will be made'));\n  }\n\n  let successCount = 0;\n  let failureCount = 0;\n  const failures: string[] = [];\n\n  for (const itemId of itemIds) {\n    try {\n      await resolveItem(itemId, targetState, { ...options, verbose: false });\n      successCount++;\n      console.log(Formatter.success(`✓ ${itemId}`));\n    } catch (error) {\n      failureCount++;\n      const errorMsg = error instanceof Error ? error.message : 'Unknown error';\n      failures.push(`${itemId}: ${errorMsg}`);\n      console.log(Formatter.error(`✗ ${itemId}: ${errorMsg}`));\n    }\n  }\n\n  console.log('');\n  console.log(Formatter.info('Batch resolution summary:'));\n  console.log(`  Successful: ${successCount}`);\n  console.log(`  Failed: ${failureCount}`);\n  console.log(`  Total: ${itemIds.length}`);\n\n  if (failures.length > 0 && options.verbose) {\n    console.log('');\n    console.log(Formatter.error('Failures:'));\n    failures.forEach(failure => console.log(Formatter.error(`  - ${failure}`)));\n  }\n\n  if (failureCount > 0) {\n    process.exit(1);\n  }\n}\n\nasync function showResolveStatus(itemId: string, options: { verbose?: boolean }): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n    // Find the item\n    const item = findItem(relationshipManager, itemId);\n    if (!item) {\n      throw new Error(`Item not found: ${itemId}`);\n    }\n\n    const currentState = StateManager.getEffectiveState(item);\n    const availableTransitions = StateTransition.getAvailableTransitions(item);\n\n    console.log(Formatter.info(`Resolve status for ${itemId}:`));\n    console.log(`  Current state: ${getStateDisplay(currentState)}`);\n    console.log(`  Item type: ${getItemType(item)}`);\n    console.log(`  File: ${item.file_path}`);\n\n    if (item.state_metadata) {\n      console.log('');\n      console.log(Formatter.info('State metadata:'));\n      console.log(`  Transitioned by: ${item.state_metadata.transitioned_by}`);\n      console.log(`  Transitioned at: ${new Date(item.state_metadata.transitioned_at).toLocaleString()}`);\n      \n      if (item.state_metadata.previous_state) {\n        console.log(`  Previous state: ${item.state_metadata.previous_state}`);\n      }\n      \n      if (item.state_metadata.transition_reason) {\n        console.log(`  Reason: ${item.state_metadata.transition_reason}`);\n      }\n      \n      if (item.state_metadata.reviewer) {\n        console.log(`  Reviewer: ${item.state_metadata.reviewer}`);\n      }\n      \n      console.log(`  Automation eligible: ${item.state_metadata.automation_eligible ? 'Yes' : 'No'}`);\n    }\n\n    console.log('');\n    console.log(Formatter.info('Available transitions:'));\n    \n    if (availableTransitions.length === 0) {\n      console.log('  No valid transitions available');\n    } else {\n      availableTransitions.forEach(state => {\n        const canAutomate = StateTransition.canAutomate(item, state);\n        const automateText = canAutomate ? ' (automation eligible)' : ' (manual only)';\n        console.log(`  → ${getStateDisplay(state)}${automateText}`);\n      });\n    }\n\n    if (options.verbose) {\n      console.log('');\n      console.log(Formatter.debug('Item details:'));\n      console.log(`  Title: ${item.title}`);\n      console.log(`  Priority: ${item.priority}`);\n      console.log(`  Assignee: ${item.assignee}`);\n      console.log(`  Created: ${new Date(item.created_date).toLocaleString()}`);\n      console.log(`  Updated: ${new Date(item.updated_date).toLocaleString()}`);\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Failed to get resolve status: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nfunction findItem(relationshipManager: RelationshipManager, itemId: string): AnyItemData | null {\n  // Try to find in different hierarchies\n  const epic = relationshipManager.getEpicHierarchy(itemId);\n  if (epic) return epic.epic;\n\n  const issue = relationshipManager.getIssueHierarchy(itemId);\n  if (issue) return issue.issue;\n\n  const task = relationshipManager.getTaskHierarchy(itemId);\n  if (task) return task.task;\n\n  const pr = relationshipManager.getPRHierarchy(itemId);\n  if (pr) return pr.pr;\n\n  return null;\n}\n\nfunction getItemType(item: AnyItemData): string {\n  if ('epic_id' in item && !('issue_id' in item)) return 'epic';\n  if ('issue_id' in item && 'pr_id' in item) return 'pr';\n  if ('issue_id' in item && 'task_id' in item) return 'task';\n  if ('issue_id' in item) return 'issue';\n  if ('project_id' in item) return 'project';\n  return 'unknown';\n}\n\nfunction getStateDisplay(state: UnifiedState): string {\n  const stateColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.warning(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n    ready_for_engineering: (text) => Formatter.info(text),\n    ready_for_qa: (text) => Formatter.warning(text),\n    ready_for_deployment: (text) => Formatter.info(text),\n    won_t_do: (text) => Formatter.error(text),\n    done: (text) => Formatter.success(text),\n  };\n\n  const colorFn = stateColors[state] || ((text) => text);\n  return colorFn(state.toUpperCase().replace(/_/g, ' '));\n}","/**\n * State Command Group for AI-Trackdown\n * Handles querying and updating ticket states\n */\n\nimport { Command } from 'commander';\nimport type { \n  AnyItemData, \n  UnifiedState, \n  SearchFilters,\n  StateMetadata\n} from '../types/ai-trackdown.js';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { FrontmatterParser } from '../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../utils/relationship-manager.js';\nimport { StateManager, StateTransition } from '../types/ai-trackdown.js';\n\ninterface StateQueryOptions {\n  type?: string;\n  status?: string;\n  state?: string;\n  assignee?: string;\n  verbose?: boolean;\n  format?: 'table' | 'json' | 'summary';\n  showTransitions?: boolean;\n}\n\ninterface StateUpdateOptions {\n  reason?: string;\n  reviewer?: string;\n  assignee?: string;\n  dryRun?: boolean;\n  force?: boolean;\n  verbose?: boolean;\n}\n\nexport function createStateCommand(): Command {\n  const cmd = new Command('state');\n\n  cmd\n    .description('Query and update ticket states')\n    .option('--verbose', 'show detailed state information');\n\n  // Query states\n  cmd\n    .command('list')\n    .description('List items and their current states')\n    .option('--type <type>', 'filter by item type (epic|issue|task|pr)')\n    .option('--status <status>', 'filter by legacy status (planning|active|completed|archived)')\n    .option('--state <state>', 'filter by unified state')\n    .option('--assignee <username>', 'filter by assignee')\n    .option('--format <format>', 'output format (table|json|summary)', 'table')\n    .option('--show-transitions', 'show available transitions for each item')\n    .option('--verbose', 'show detailed state information')\n    .action(async (options: StateQueryOptions) => {\n      await listStates(options);\n    });\n\n  // Show state for specific item\n  cmd\n    .command('show <item-id>')\n    .description('Show detailed state information for a specific item')\n    .option('--show-transitions', 'show available state transitions')\n    .option('--verbose', 'show detailed state metadata')\n    .action(async (itemId: string, options: { showTransitions?: boolean; verbose?: boolean }) => {\n      await showState(itemId, options);\n    });\n\n  // Update state\n  cmd\n    .command('update <item-id> <new-state>')\n    .description('Update item state directly')\n    .option('-r, --reason <text>', 'reason for state change')\n    .option('--reviewer <username>', 'reviewer who approved the change')\n    .option('-a, --assignee <username>', 'update assignee along with state')\n    .option('--dry-run', 'show what would be updated without making changes')\n    .option('--force', 'force update even if validation warnings exist')\n    .option('--verbose', 'show detailed update information')\n    .action(async (itemId: string, newState: string, options: StateUpdateOptions) => {\n      await updateState(itemId, newState as UnifiedState, options);\n    });\n\n  // Validate states\n  cmd\n    .command('validate')\n    .description('Validate state consistency across all items')\n    .option('--type <type>', 'validate specific item type only')\n    .option('--fix', 'attempt to fix validation issues')\n    .option('--verbose', 'show detailed validation information')\n    .action(async (options: { type?: string; fix?: boolean; verbose?: boolean }) => {\n      await validateStates(options);\n    });\n\n  // State analytics\n  cmd\n    .command('analytics')\n    .description('Show state distribution and analytics')\n    .option('--type <type>', 'analytics for specific item type only')\n    .option('--format <format>', 'output format (table|json)', 'table')\n    .option('--verbose', 'show detailed analytics')\n    .action(async (options: { type?: string; format?: string; verbose?: boolean }) => {\n      await showStateAnalytics(options);\n    });\n\n  // Show state workflow\n  cmd\n    .command('workflow')\n    .description('Show state transition workflow and rules')\n    .option('--from <state>', 'show transitions from specific state')\n    .option('--to <state>', 'show transitions to specific state')\n    .option('--verbose', 'show detailed workflow information')\n    .action(async (options: { from?: string; to?: string; verbose?: boolean }) => {\n      await showStateWorkflow(options);\n    });\n\n  // Batch state operations\n  cmd\n    .command('batch-update <new-state>')\n    .description('Update multiple items to same state')\n    .argument('<item-ids...>', 'space-separated list of item IDs')\n    .option('-r, --reason <text>', 'reason for state changes')\n    .option('--reviewer <username>', 'reviewer who approved the changes')\n    .option('--dry-run', 'show what would be updated without making changes')\n    .option('--force', 'force updates even if validation warnings exist')\n    .option('--verbose', 'show detailed update information')\n    .action(async (newState: string, itemIds: string[], options: StateUpdateOptions) => {\n      await batchUpdateState(itemIds, newState as UnifiedState, options);\n    });\n\n  return cmd;\n}\n\nasync function listStates(options: StateQueryOptions): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n    // Get all items\n    let items: AnyItemData[] = [];\n    \n    // Collect items based on type filter\n    if (!options.type || options.type === 'epic') {\n      items.push(...relationshipManager.getAllEpics());\n    }\n    if (!options.type || options.type === 'issue') {\n      items.push(...relationshipManager.getAllIssues());\n    }\n    if (!options.type || options.type === 'task') {\n      items.push(...relationshipManager.getAllTasks());\n    }\n    if (!options.type || options.type === 'pr') {\n      items.push(...relationshipManager.getAllPRs());\n    }\n\n    // Apply filters\n    if (options.status) {\n      items = items.filter(item => item.status === options.status);\n    }\n    \n    if (options.state) {\n      items = items.filter(item => {\n        const effectiveState = StateManager.getEffectiveState(item);\n        return effectiveState === options.state;\n      });\n    }\n    \n    if (options.assignee) {\n      items = items.filter(item => item.assignee === options.assignee);\n    }\n\n    if (options.format === 'json') {\n      const output = items.map(item => ({\n        id: getItemId(item),\n        type: getItemType(item),\n        title: item.title,\n        status: item.status,\n        state: StateManager.getEffectiveState(item),\n        assignee: item.assignee,\n        created_date: item.created_date,\n        updated_date: item.updated_date,\n        ...(options.showTransitions && {\n          available_transitions: StateTransition.getAvailableTransitions(item)\n        }),\n        ...(options.verbose && {\n          state_metadata: item.state_metadata\n        })\n      }));\n      console.log(JSON.stringify(output, null, 2));\n      return;\n    }\n\n    if (options.format === 'summary') {\n      showStateSummary(items);\n      return;\n    }\n\n    // Table format\n    console.log(Formatter.info(`Found ${items.length} items`));\n    console.log('');\n\n    if (items.length === 0) {\n      console.log(Formatter.warning('No items found matching the criteria'));\n      return;\n    }\n\n    // Table headers\n    const headers = ['ID', 'Type', 'Title', 'Status', 'State', 'Assignee'];\n    if (options.showTransitions) headers.push('Available Transitions');\n    \n    console.log(headers.map(h => Formatter.info(h.padEnd(15))).join(' '));\n    console.log(headers.map(() => '─'.repeat(15)).join(' '));\n\n    // Table rows\n    for (const item of items) {\n      const id = getItemId(item);\n      const type = getItemType(item);\n      const title = item.title.length > 30 ? item.title.substring(0, 27) + '...' : item.title;\n      const status = item.status;\n      const state = StateManager.getEffectiveState(item);\n      const assignee = item.assignee || 'unassigned';\n      \n      const row = [\n        id.padEnd(15),\n        type.padEnd(15),\n        title.padEnd(15),\n        getStatusDisplay(status).padEnd(15),\n        getStateDisplay(state).padEnd(15),\n        assignee.padEnd(15)\n      ];\n\n      if (options.showTransitions) {\n        const transitions = StateTransition.getAvailableTransitions(item);\n        const transitionsText = transitions.slice(0, 2).join(', ') + (transitions.length > 2 ? '...' : '');\n        row.push(transitionsText.padEnd(15));\n      }\n\n      console.log(row.join(' '));\n    }\n\n    if (options.verbose) {\n      console.log('');\n      showStateSummary(items);\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Failed to list states: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function showState(itemId: string, options: { showTransitions?: boolean; verbose?: boolean }): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n    const item = findItem(relationshipManager, itemId);\n    if (!item) {\n      throw new Error(`Item not found: ${itemId}`);\n    }\n\n    const currentState = StateManager.getEffectiveState(item);\n    const isResolutionState = StateManager.isResolutionState(currentState);\n    const isLegacyStatus = StateManager.isLegacyStatus(currentState);\n\n    console.log(Formatter.info(`State information for ${itemId}:`));\n    console.log(`  Title: ${item.title}`);\n    console.log(`  Type: ${getItemType(item)}`);\n    console.log(`  Legacy Status: ${getStatusDisplay(item.status)}`);\n    console.log(`  Current State: ${getStateDisplay(currentState)}`);\n    console.log(`  State Type: ${isResolutionState ? 'Resolution State' : 'Legacy Status'}`);\n    console.log(`  Assignee: ${item.assignee}`);\n    \n    if (item.state_metadata) {\n      console.log('');\n      console.log(Formatter.info('State Metadata:'));\n      console.log(`  Transitioned by: ${item.state_metadata.transitioned_by}`);\n      console.log(`  Transitioned at: ${new Date(item.state_metadata.transitioned_at).toLocaleString()}`);\n      \n      if (item.state_metadata.previous_state) {\n        console.log(`  Previous state: ${getStateDisplay(item.state_metadata.previous_state)}`);\n      }\n      \n      if (item.state_metadata.transition_reason) {\n        console.log(`  Reason: ${item.state_metadata.transition_reason}`);\n      }\n      \n      if (item.state_metadata.reviewer) {\n        console.log(`  Reviewer: ${item.state_metadata.reviewer}`);\n      }\n      \n      console.log(`  Automation eligible: ${item.state_metadata.automation_eligible ? 'Yes' : 'No'}`);\n      \n      if (item.state_metadata.automation_source) {\n        console.log(`  Automation source: ${item.state_metadata.automation_source}`);\n      }\n    } else if (item.state) {\n      console.log('');\n      console.log(Formatter.warning('State metadata missing (may need migration)'));\n    }\n\n    if (options.showTransitions) {\n      const availableTransitions = StateTransition.getAvailableTransitions(item);\n      console.log('');\n      console.log(Formatter.info('Available Transitions:'));\n      \n      if (availableTransitions.length === 0) {\n        console.log('  No valid transitions available');\n      } else {\n        availableTransitions.forEach(state => {\n          const canAutomate = StateTransition.canAutomate(item, state);\n          const automateText = canAutomate ? ' (automation eligible)' : ' (manual only)';\n          console.log(`  → ${getStateDisplay(state)}${automateText}`);\n        });\n      }\n    }\n\n    if (options.verbose) {\n      console.log('');\n      console.log(Formatter.debug('Additional Information:'));\n      console.log(`  Priority: ${item.priority}`);\n      console.log(`  Created: ${new Date(item.created_date).toLocaleString()}`);\n      console.log(`  Updated: ${new Date(item.updated_date).toLocaleString()}`);\n      console.log(`  File: ${item.file_path}`);\n      \n      if (item.tags && item.tags.length > 0) {\n        console.log(`  Tags: ${item.tags.join(', ')}`);\n      }\n      \n      if (item.dependencies && item.dependencies.length > 0) {\n        console.log(`  Dependencies: ${item.dependencies.join(', ')}`);\n      }\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Failed to show state: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function updateState(itemId: string, newState: UnifiedState, options: StateUpdateOptions): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n    const parser = new FrontmatterParser();\n\n    const item = findItem(relationshipManager, itemId);\n    if (!item) {\n      throw new Error(`Item not found: ${itemId}`);\n    }\n\n    const currentState = StateManager.getEffectiveState(item);\n    \n    if (options.verbose || options.dryRun) {\n      console.log(Formatter.info(`Updating state for ${itemId}`));\n      console.log(Formatter.debug(`Current state: ${currentState}`));\n      console.log(Formatter.debug(`New state: ${newState}`));\n      console.log(Formatter.debug(`File: ${item.file_path}`));\n    }\n\n    // Perform state transition\n    const transitionResult = StateTransition.transitionState(\n      item,\n      newState,\n      process.env.USER || 'system',\n      options.reason,\n      options.reviewer\n    );\n\n    if (!transitionResult.success) {\n      if (options.force && transitionResult.warnings.length > 0 && transitionResult.errors.length === 0) {\n        console.log(Formatter.warning('Forcing state update despite warnings:'));\n        transitionResult.warnings.forEach(warning => \n          console.log(Formatter.warning(`  - ${warning}`))\n        );\n      } else {\n        console.error(Formatter.error('State update failed:'));\n        transitionResult.errors.forEach(error => \n          console.error(Formatter.error(`  - ${error}`))\n        );\n        process.exit(1);\n      }\n    }\n\n    if (transitionResult.warnings.length > 0 && !options.force) {\n      console.log(Formatter.warning('Update warnings:'));\n      transitionResult.warnings.forEach(warning => \n        console.log(Formatter.warning(`  - ${warning}`))\n      );\n    }\n\n    if (options.dryRun) {\n      console.log(Formatter.info('Dry run - no changes made'));\n      return;\n    }\n\n    // Update assignee if provided\n    if (options.assignee) {\n      transitionResult.item.assignee = options.assignee;\n    }\n\n    // Write the updated item\n    const updates = {\n      state: transitionResult.item.state,\n      state_metadata: transitionResult.item.state_metadata,\n      updated_date: transitionResult.item.updated_date,\n      ...(options.assignee && { assignee: options.assignee })\n    };\n\n    parser.updateFile(item.file_path, updates);\n\n    // Refresh cache\n    relationshipManager.rebuildCache();\n\n    console.log(Formatter.success(`State updated for ${itemId}: ${currentState} → ${newState}`));\n    \n    if (options.verbose) {\n      console.log('');\n      console.log(Formatter.info('Update details:'));\n      console.log(`  Transitioned by: ${transitionResult.item.state_metadata?.transitioned_by}`);\n      console.log(`  Transitioned at: ${new Date(transitionResult.item.state_metadata?.transitioned_at || '').toLocaleString()}`);\n      if (options.reason) {\n        console.log(`  Reason: ${options.reason}`);\n      }\n      if (options.reviewer) {\n        console.log(`  Reviewer: ${options.reviewer}`);\n      }\n      if (options.assignee) {\n        console.log(`  Assigned to: ${options.assignee}`);\n      }\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Failed to update state: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function validateStates(options: { type?: string; fix?: boolean; verbose?: boolean }): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n    // Get all items\n    let items: AnyItemData[] = [];\n    \n    if (!options.type || options.type === 'epic') {\n      items.push(...relationshipManager.getAllEpics());\n    }\n    if (!options.type || options.type === 'issue') {\n      items.push(...relationshipManager.getAllIssues());\n    }\n    if (!options.type || options.type === 'task') {\n      items.push(...relationshipManager.getAllTasks());\n    }\n    if (!options.type || options.type === 'pr') {\n      items.push(...relationshipManager.getAllPRs());\n    }\n\n    console.log(Formatter.info(`Validating ${items.length} items...`));\n\n    let validCount = 0;\n    let invalidCount = 0;\n    let warningCount = 0;\n    const issues: Array<{ itemId: string; type: 'error' | 'warning'; message: string }> = [];\n\n    for (const item of items) {\n      const itemId = getItemId(item);\n      let hasErrors = false;\n\n      // Check if item has state field\n      if (!item.state) {\n        issues.push({\n          itemId,\n          type: 'warning',\n          message: 'Missing state field (using legacy status)'\n        });\n        warningCount++;\n      }\n\n      // Check if item has state metadata when it has state\n      if (item.state && !item.state_metadata) {\n        issues.push({\n          itemId,\n          type: 'error',\n          message: 'Missing state metadata'\n        });\n        hasErrors = true;\n      }\n\n      // Validate state metadata if present\n      if (item.state_metadata) {\n        const validation = StateManager.validateStateMetadata(item.state_metadata);\n        if (!validation.valid) {\n          validation.errors.forEach(error => {\n            issues.push({\n              itemId,\n              type: 'error',\n              message: `Invalid state metadata: ${error.message}`\n            });\n          });\n          hasErrors = true;\n        }\n        \n        validation.warnings.forEach(warning => {\n          issues.push({\n            itemId,\n            type: 'warning',\n            message: `State metadata warning: ${warning.message}`\n          });\n          warningCount++;\n        });\n      }\n\n      if (hasErrors) {\n        invalidCount++;\n      } else {\n        validCount++;\n      }\n    }\n\n    console.log('');\n    console.log(Formatter.info('Validation Results:'));\n    console.log(`  Valid: ${validCount}`);\n    console.log(`  Invalid: ${invalidCount}`);\n    console.log(`  Warnings: ${warningCount}`);\n    console.log(`  Total: ${items.length}`);\n\n    if (issues.length > 0) {\n      console.log('');\n      console.log(Formatter.warning('Issues Found:'));\n      \n      const errors = issues.filter(i => i.type === 'error');\n      const warnings = issues.filter(i => i.type === 'warning');\n\n      if (errors.length > 0) {\n        console.log('');\n        console.log(Formatter.error('Errors:'));\n        errors.forEach(issue => {\n          console.log(Formatter.error(`  ${issue.itemId}: ${issue.message}`));\n        });\n      }\n\n      if (warnings.length > 0 && options.verbose) {\n        console.log('');\n        console.log(Formatter.warning('Warnings:'));\n        warnings.forEach(issue => {\n          console.log(Formatter.warning(`  ${issue.itemId}: ${issue.message}`));\n        });\n      }\n\n      if (options.fix) {\n        console.log('');\n        console.log(Formatter.info('Fix option not yet implemented - would apply automatic fixes'));\n      }\n    } else {\n      console.log('');\n      console.log(Formatter.success('All items have valid state configuration!'));\n    }\n\n    if (invalidCount > 0) {\n      process.exit(1);\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Failed to validate states: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function showStateAnalytics(options: { type?: string; format?: string; verbose?: boolean }): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n    // Get all items\n    let items: AnyItemData[] = [];\n    \n    if (!options.type || options.type === 'epic') {\n      items.push(...relationshipManager.getAllEpics());\n    }\n    if (!options.type || options.type === 'issue') {\n      items.push(...relationshipManager.getAllIssues());\n    }\n    if (!options.type || options.type === 'task') {\n      items.push(...relationshipManager.getAllTasks());\n    }\n    if (!options.type || options.type === 'pr') {\n      items.push(...relationshipManager.getAllPRs());\n    }\n\n    // Calculate analytics\n    const stateDistribution: Record<string, number> = {};\n    const statusDistribution: Record<string, number> = {};\n    const typeDistribution: Record<string, number> = {};\n    let hasMigration = 0;\n    let needsMigration = 0;\n\n    items.forEach(item => {\n      const state = StateManager.getEffectiveState(item);\n      const status = item.status;\n      const type = getItemType(item);\n\n      stateDistribution[state] = (stateDistribution[state] || 0) + 1;\n      statusDistribution[status] = (statusDistribution[status] || 0) + 1;\n      typeDistribution[type] = (typeDistribution[type] || 0) + 1;\n\n      if (item.state && item.state_metadata) {\n        hasMigration++;\n      } else {\n        needsMigration++;\n      }\n    });\n\n    if (options.format === 'json') {\n      const analytics = {\n        total_items: items.length,\n        state_distribution: stateDistribution,\n        status_distribution: statusDistribution,\n        type_distribution: typeDistribution,\n        migration_status: {\n          migrated: hasMigration,\n          needs_migration: needsMigration,\n          migration_percentage: hasMigration / (hasMigration + needsMigration) * 100\n        }\n      };\n      console.log(JSON.stringify(analytics, null, 2));\n      return;\n    }\n\n    // Table format\n    console.log(Formatter.info(`State Analytics (${items.length} total items):`));\n    console.log('');\n\n    console.log(Formatter.info('State Distribution:'));\n    Object.entries(stateDistribution)\n      .sort(([,a], [,b]) => b - a)\n      .forEach(([state, count]) => {\n        const percentage = (count / items.length * 100).toFixed(1);\n        console.log(`  ${getStateDisplay(state).padEnd(20)} ${count.toString().padStart(4)} (${percentage}%)`);\n      });\n\n    if (options.verbose) {\n      console.log('');\n      console.log(Formatter.info('Legacy Status Distribution:'));\n      Object.entries(statusDistribution)\n        .sort(([,a], [,b]) => b - a)\n        .forEach(([status, count]) => {\n          const percentage = (count / items.length * 100).toFixed(1);\n          console.log(`  ${getStatusDisplay(status).padEnd(20)} ${count.toString().padStart(4)} (${percentage}%)`);\n        });\n\n      console.log('');\n      console.log(Formatter.info('Type Distribution:'));\n      Object.entries(typeDistribution)\n        .sort(([,a], [,b]) => b - a)\n        .forEach(([type, count]) => {\n          const percentage = (count / items.length * 100).toFixed(1);\n          console.log(`  ${type.padEnd(20)} ${count.toString().padStart(4)} (${percentage}%)`);\n        });\n    }\n\n    console.log('');\n    console.log(Formatter.info('Migration Status:'));\n    console.log(`  Migrated to unified state: ${hasMigration}`);\n    console.log(`  Needs migration: ${needsMigration}`);\n    if (hasMigration + needsMigration > 0) {\n      const migrationPercentage = (hasMigration / (hasMigration + needsMigration) * 100).toFixed(1);\n      console.log(`  Migration progress: ${migrationPercentage}%`);\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Failed to show analytics: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function showStateWorkflow(options: { from?: string; to?: string; verbose?: boolean }): Promise<void> {\n  const allStates: UnifiedState[] = [\n    'planning', 'active', 'completed', 'archived',\n    'ready_for_engineering', 'ready_for_qa', 'ready_for_deployment', 'won_t_do', 'done'\n  ];\n\n  console.log(Formatter.info('State Transition Workflow:'));\n  console.log('');\n\n  if (options.from) {\n    const fromState = options.from as UnifiedState;\n    const transitions = StateManager.getAllowedTransitions(fromState);\n    \n    console.log(Formatter.info(`Transitions from ${getStateDisplay(fromState)}:`));\n    if (transitions.length === 0) {\n      console.log('  No transitions available');\n    } else {\n      transitions.forEach(state => {\n        console.log(`  → ${getStateDisplay(state)}`);\n      });\n    }\n    return;\n  }\n\n  if (options.to) {\n    const toState = options.to as UnifiedState;\n    const fromStates = allStates.filter(state => {\n      const transitions = StateManager.getAllowedTransitions(state);\n      return transitions.includes(toState);\n    });\n    \n    console.log(Formatter.info(`Transitions to ${getStateDisplay(toState)}:`));\n    if (fromStates.length === 0) {\n      console.log('  No transitions lead to this state');\n    } else {\n      fromStates.forEach(state => {\n        console.log(`  ${getStateDisplay(state)} →`);\n      });\n    }\n    return;\n  }\n\n  // Show complete workflow\n  console.log(Formatter.info('Complete Workflow:'));\n  console.log('');\n  \n  console.log(Formatter.info('Legacy Status Flow:'));\n  console.log('  planning → active → completed → archived');\n  console.log('');\n  \n  console.log(Formatter.info('Resolution State Flow:'));\n  console.log('  planning → ready_for_engineering');\n  console.log('  active → ready_for_engineering');\n  console.log('  ready_for_engineering → ready_for_qa');\n  console.log('  ready_for_qa → ready_for_deployment');\n  console.log('  ready_for_deployment → done');\n  console.log('  done → archived');\n  console.log('');\n  \n  console.log(Formatter.info('Rejection Flow:'));\n  console.log('  any_state → won_t_do → archived');\n\n  if (options.verbose) {\n    console.log('');\n    console.log(Formatter.info('All Available Transitions:'));\n    allStates.forEach(state => {\n      const transitions = StateManager.getAllowedTransitions(state);\n      console.log(`  ${getStateDisplay(state)}:`);\n      if (transitions.length === 0) {\n        console.log('    (no transitions)');\n      } else {\n        transitions.forEach(toState => {\n          console.log(`    → ${getStateDisplay(toState)}`);\n        });\n      }\n    });\n  }\n}\n\nasync function batchUpdateState(itemIds: string[], newState: UnifiedState, options: StateUpdateOptions): Promise<void> {\n  console.log(Formatter.info(`Batch updating ${itemIds.length} items to ${newState}`));\n  \n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - no changes will be made'));\n  }\n\n  let successCount = 0;\n  let failureCount = 0;\n  const failures: string[] = [];\n\n  for (const itemId of itemIds) {\n    try {\n      await updateState(itemId, newState, { ...options, verbose: false });\n      successCount++;\n      console.log(Formatter.success(`✓ ${itemId}`));\n    } catch (error) {\n      failureCount++;\n      const errorMsg = error instanceof Error ? error.message : 'Unknown error';\n      failures.push(`${itemId}: ${errorMsg}`);\n      console.log(Formatter.error(`✗ ${itemId}: ${errorMsg}`));\n    }\n  }\n\n  console.log('');\n  console.log(Formatter.info('Batch update summary:'));\n  console.log(`  Successful: ${successCount}`);\n  console.log(`  Failed: ${failureCount}`);\n  console.log(`  Total: ${itemIds.length}`);\n\n  if (failures.length > 0 && options.verbose) {\n    console.log('');\n    console.log(Formatter.error('Failures:'));\n    failures.forEach(failure => console.log(Formatter.error(`  - ${failure}`)));\n  }\n\n  if (failureCount > 0) {\n    process.exit(1);\n  }\n}\n\n// Helper functions\nfunction findItem(relationshipManager: RelationshipManager, itemId: string): AnyItemData | null {\n  // Try to find in different hierarchies\n  const epic = relationshipManager.getEpicHierarchy(itemId);\n  if (epic) return epic.epic;\n\n  const issue = relationshipManager.getIssueHierarchy(itemId);\n  if (issue) return issue.issue;\n\n  const task = relationshipManager.getTaskHierarchy(itemId);\n  if (task) return task.task;\n\n  const pr = relationshipManager.getPRHierarchy(itemId);\n  if (pr) return pr.pr;\n\n  return null;\n}\n\nfunction getItemId(item: AnyItemData): string {\n  if ('project_id' in item && 'type' in item) return item.project_id;\n  if ('epic_id' in item) return item.epic_id;\n  if ('issue_id' in item && 'pr_id' in item) return item.pr_id;\n  if ('issue_id' in item && 'task_id' in item) return item.task_id;\n  if ('issue_id' in item) return item.issue_id;\n  throw new Error('Unknown item type');\n}\n\nfunction getItemType(item: AnyItemData): string {\n  if ('project_id' in item && 'type' in item) return 'project';\n  if ('epic_id' in item && !('issue_id' in item)) return 'epic';\n  if ('issue_id' in item && 'pr_id' in item) return 'pr';\n  if ('issue_id' in item && 'task_id' in item) return 'task';\n  if ('issue_id' in item) return 'issue';\n  return 'unknown';\n}\n\nfunction getStateDisplay(state: UnifiedState): string {\n  const stateColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.warning(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n    ready_for_engineering: (text) => Formatter.info(text),\n    ready_for_qa: (text) => Formatter.warning(text),\n    ready_for_deployment: (text) => Formatter.info(text),\n    won_t_do: (text) => Formatter.error(text),\n    done: (text) => Formatter.success(text),\n  };\n\n  const colorFn = stateColors[state] || ((text) => text);\n  return colorFn(state.toUpperCase().replace(/_/g, ' '));\n}\n\nfunction getStatusDisplay(status: string): string {\n  const statusColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.success(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = statusColors[status] || ((text) => text);\n  return colorFn(status.toUpperCase());\n}\n\nfunction showStateSummary(items: AnyItemData[]): void {\n  const stateDistribution: Record<string, number> = {};\n  \n  items.forEach(item => {\n    const state = StateManager.getEffectiveState(item);\n    stateDistribution[state] = (stateDistribution[state] || 0) + 1;\n  });\n\n  console.log(Formatter.info('State Summary:'));\n  Object.entries(stateDistribution)\n    .sort(([,a], [,b]) => b - a)\n    .forEach(([state, count]) => {\n      const percentage = (count / items.length * 100).toFixed(1);\n      console.log(`  ${getStateDisplay(state).padEnd(20)} ${count.toString().padStart(4)} (${percentage}%)`);\n    });\n}","/**\n * State Migration Command for AI-Trackdown\n * Converts legacy status field to unified state field\n */\n\nimport { Command } from 'commander';\nimport { writeFileSync } from 'fs';\nimport type { \n  AnyItemData, \n  MigrationResult,\n  MigrationLogEntry\n} from '../types/ai-trackdown.js';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { FrontmatterParser } from '../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../utils/relationship-manager.js';\nimport { StateMigration } from '../utils/state-migration.js';\n\ninterface MigrateStateOptions {\n  type?: string;\n  dryRun?: boolean;\n  backup?: boolean;\n  force?: boolean;\n  verbose?: boolean;\n  logFile?: string;\n  migratedBy?: string;\n}\n\nexport function createMigrateStateCommand(): Command {\n  const cmd = new Command('migrate-state');\n\n  cmd\n    .description('Migrate legacy status field to unified state field')\n    .option('--type <type>', 'migrate specific item type only (epic|issue|task|pr)')\n    .option('--dry-run', 'preview migration without making changes')\n    .option('--backup', 'create backup files before migration')\n    .option('--force', 'proceed with migration even if validation warnings exist')\n    .option('--verbose', 'show detailed migration information')\n    .option('--log-file <path>', 'save migration log to file')\n    .option('--migrated-by <username>', 'specify who performed the migration', 'system')\n    .action(async (options: MigrateStateOptions) => {\n      await migrateStates(options);\n    });\n\n  // Preview migration\n  cmd\n    .command('preview')\n    .description('Preview migration changes without applying them')\n    .option('--type <type>', 'preview specific item type only')\n    .option('--verbose', 'show detailed preview information')\n    .action(async (options: { type?: string; verbose?: boolean }) => {\n      await previewMigration(options);\n    });\n\n  // Validate migration\n  cmd\n    .command('validate')\n    .description('Validate migration results')\n    .option('--type <type>', 'validate specific item type only')\n    .option('--verbose', 'show detailed validation information')\n    .action(async (options: { type?: string; verbose?: boolean }) => {\n      await validateMigration(options);\n    });\n\n  // Rollback migration\n  cmd\n    .command('rollback <log-file>')\n    .description('Rollback migration using log file')\n    .option('--dry-run', 'preview rollback without making changes')\n    .option('--verbose', 'show detailed rollback information')\n    .action(async (logFile: string, options: { dryRun?: boolean; verbose?: boolean }) => {\n      await rollbackMigration(logFile, options);\n    });\n\n  // Status command\n  cmd\n    .command('status')\n    .description('Show migration status for all items')\n    .option('--type <type>', 'show status for specific item type only')\n    .option('--format <format>', 'output format (table|json)', 'table')\n    .action(async (options: { type?: string; format?: string }) => {\n      await showMigrationStatus(options);\n    });\n\n  return cmd;\n}\n\nasync function migrateStates(options: MigrateStateOptions): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n    const parser = new FrontmatterParser();\n\n    // Get all items\n    let items: AnyItemData[] = [];\n    \n    if (!options.type || options.type === 'epic') {\n      items.push(...relationshipManager.getAllEpics());\n    }\n    if (!options.type || options.type === 'issue') {\n      items.push(...relationshipManager.getAllIssues());\n    }\n    if (!options.type || options.type === 'task') {\n      items.push(...relationshipManager.getAllTasks());\n    }\n    if (!options.type || options.type === 'pr') {\n      items.push(...relationshipManager.getAllPRs());\n    }\n\n    console.log(Formatter.info(`Found ${items.length} items for migration`));\n\n    // Filter items that need migration\n    const itemsNeedingMigration = items.filter(item => StateMigration.needsMigration(item));\n    \n    console.log(Formatter.info(`${itemsNeedingMigration.length} items need migration`));\n    console.log(Formatter.info(`${items.length - itemsNeedingMigration.length} items already migrated`));\n\n    if (itemsNeedingMigration.length === 0) {\n      console.log(Formatter.success('All items are already migrated!'));\n      return;\n    }\n\n    if (options.dryRun) {\n      console.log(Formatter.info('Dry run - showing migration preview:'));\n      const preview = StateMigration.previewMigration(itemsNeedingMigration);\n      showMigrationPreview(preview, options.verbose);\n      return;\n    }\n\n    // Create backup if requested\n    if (options.backup) {\n      console.log(Formatter.info('Creating backup files...'));\n      await createBackups(itemsNeedingMigration);\n      console.log(Formatter.success('Backup files created'));\n    }\n\n    // Perform migration\n    console.log(Formatter.info('Starting migration...'));\n    const migrationResult = StateMigration.migrateItems(\n      itemsNeedingMigration, \n      options.migratedBy || 'system'\n    );\n\n    // Apply migrations to files\n    let filesUpdated = 0;\n    let filesFailedToUpdate = 0;\n\n    for (let i = 0; i < itemsNeedingMigration.length; i++) {\n      const originalItem = itemsNeedingMigration[i];\n      const logEntry = migrationResult.migration_log[i];\n      \n      if (logEntry.success && migrationResult.migration_log[i]) {\n        try {\n          // Find the migrated item\n          const migratedItem = items.find(item => \n            getItemId(item) === logEntry.item_id\n          );\n          \n          if (migratedItem) {\n            // Perform the migration on this specific item\n            const singleMigrationResult = StateMigration.migrateItem(\n              migratedItem, \n              options.migratedBy || 'system'\n            );\n            \n            if (singleMigrationResult.success) {\n              // Update the file\n              const updates = {\n                state: singleMigrationResult.item.state,\n                state_metadata: singleMigrationResult.item.state_metadata,\n                updated_date: new Date().toISOString()\n              };\n              \n              parser.updateFile(originalItem.file_path, updates);\n              filesUpdated++;\n              \n              if (options.verbose) {\n                console.log(Formatter.success(`✓ ${logEntry.item_id}: ${logEntry.old_status} → ${logEntry.new_state}`));\n              }\n            }\n          }\n        } catch (error) {\n          filesFailedToUpdate++;\n          const errorMsg = error instanceof Error ? error.message : 'Unknown error';\n          console.log(Formatter.error(`✗ ${logEntry.item_id}: ${errorMsg}`));\n        }\n      }\n    }\n\n    // Refresh cache\n    relationshipManager.rebuildCache();\n\n    // Save migration log\n    const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n    const defaultLogFile = `migration-log-${timestamp}.json`;\n    const logFile = options.logFile || defaultLogFile;\n    \n    const logData = {\n      timestamp: new Date().toISOString(),\n      migration_result: migrationResult,\n      files_updated: filesUpdated,\n      files_failed: filesFailedToUpdate,\n      options: {\n        type: options.type,\n        migrated_by: options.migratedBy,\n        backup_created: options.backup\n      }\n    };\n    \n    writeFileSync(logFile, JSON.stringify(logData, null, 2));\n\n    // Show results\n    console.log('');\n    console.log(Formatter.info('Migration Results:'));\n    console.log(`  Items processed: ${itemsNeedingMigration.length}`);\n    console.log(`  Successfully migrated: ${migrationResult.migrated_count}`);\n    console.log(`  Failed migrations: ${migrationResult.failed_count}`);\n    console.log(`  Files updated: ${filesUpdated}`);\n    console.log(`  Files failed to update: ${filesFailedToUpdate}`);\n    console.log(`  Migration log: ${logFile}`);\n\n    if (migrationResult.errors.length > 0) {\n      console.log('');\n      console.log(Formatter.error('Migration Errors:'));\n      migrationResult.errors.forEach(error => {\n        console.log(Formatter.error(`  - ${error}`));\n      });\n    }\n\n    if (migrationResult.failed_count > 0 || filesFailedToUpdate > 0) {\n      console.log('');\n      console.log(Formatter.warning('Some items failed to migrate. Check the log file for details.'));\n      process.exit(1);\n    } else {\n      console.log('');\n      console.log(Formatter.success('Migration completed successfully!'));\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Migration failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function previewMigration(options: { type?: string; verbose?: boolean }): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n    // Get all items\n    let items: AnyItemData[] = [];\n    \n    if (!options.type || options.type === 'epic') {\n      items.push(...relationshipManager.getAllEpics());\n    }\n    if (!options.type || options.type === 'issue') {\n      items.push(...relationshipManager.getAllIssues());\n    }\n    if (!options.type || options.type === 'task') {\n      items.push(...relationshipManager.getAllTasks());\n    }\n    if (!options.type || options.type === 'pr') {\n      items.push(...relationshipManager.getAllPRs());\n    }\n\n    const preview = StateMigration.previewMigration(items);\n    \n    console.log(Formatter.info('Migration Preview:'));\n    console.log(`  Total items: ${preview.total_items}`);\n    console.log(`  Need migration: ${preview.needs_migration}`);\n    console.log(`  Already migrated: ${preview.already_migrated}`);\n\n    if (preview.needs_migration === 0) {\n      console.log('');\n      console.log(Formatter.success('All items are already migrated!'));\n      return;\n    }\n\n    showMigrationPreview(preview, options.verbose);\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Preview failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function validateMigration(options: { type?: string; verbose?: boolean }): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n    // Get all items\n    let items: AnyItemData[] = [];\n    \n    if (!options.type || options.type === 'epic') {\n      items.push(...relationshipManager.getAllEpics());\n    }\n    if (!options.type || options.type === 'issue') {\n      items.push(...relationshipManager.getAllIssues());\n    }\n    if (!options.type || options.type === 'task') {\n      items.push(...relationshipManager.getAllTasks());\n    }\n    if (!options.type || options.type === 'pr') {\n      items.push(...relationshipManager.getAllPRs());\n    }\n\n    const validation = StateMigration.validateMigration(items);\n    \n    console.log(Formatter.info('Migration Validation:'));\n    console.log(`  Valid: ${validation.valid ? 'Yes' : 'No'}`);\n    console.log(`  Total items: ${items.length}`);\n    console.log(`  Errors: ${validation.errors.length}`);\n    console.log(`  Warnings: ${validation.warnings.length}`);\n\n    if (validation.errors.length > 0) {\n      console.log('');\n      console.log(Formatter.error('Validation Errors:'));\n      validation.errors.forEach(error => {\n        console.log(Formatter.error(`  - ${error}`));\n      });\n    }\n\n    if (validation.warnings.length > 0 && options.verbose) {\n      console.log('');\n      console.log(Formatter.warning('Validation Warnings:'));\n      validation.warnings.forEach(warning => {\n        console.log(Formatter.warning(`  - ${warning}`));\n      });\n    }\n\n    if (options.verbose) {\n      console.log('');\n      console.log(Formatter.info('Validation Details:'));\n      validation.validation_details.forEach(detail => {\n        const status = detail.has_state && detail.has_metadata && detail.metadata_valid ? '✓' : '✗';\n        console.log(`  ${status} ${detail.item_id}: state=${detail.has_state}, metadata=${detail.has_metadata}, valid=${detail.metadata_valid}, backward_compat=${detail.backward_compatible}`);\n      });\n    }\n\n    if (!validation.valid) {\n      process.exit(1);\n    } else {\n      console.log('');\n      console.log(Formatter.success('Migration validation passed!'));\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function rollbackMigration(logFile: string, options: { dryRun?: boolean; verbose?: boolean }): Promise<void> {\n  try {\n    // Read migration log\n    const logData = JSON.parse(require('fs').readFileSync(logFile, 'utf8'));\n    const migrationResult: MigrationResult = logData.migration_result;\n    \n    console.log(Formatter.info(`Rolling back migration from ${logFile}`));\n    console.log(`  Original migration: ${new Date(logData.timestamp).toLocaleString()}`);\n    console.log(`  Items to rollback: ${migrationResult.migration_log.length}`);\n\n    if (options.dryRun) {\n      console.log(Formatter.info('Dry run - showing rollback preview:'));\n    }\n\n    const rollbackPlan = StateMigration.createRollbackPlan(migrationResult.migration_log);\n    \n    console.log('');\n    console.log(Formatter.info('Rollback Plan:'));\n    console.log(`  Total operations: ${rollbackPlan.rollback_summary.total_operations}`);\n    console.log(`  Remove state fields: ${rollbackPlan.rollback_summary.remove_state_fields}`);\n    console.log(`  Restore status: ${rollbackPlan.rollback_summary.restore_status}`);\n    console.log(`  No action needed: ${rollbackPlan.rollback_summary.no_action}`);\n\n    if (options.verbose || options.dryRun) {\n      console.log('');\n      console.log(Formatter.info('Rollback Operations:'));\n      rollbackPlan.rollback_operations.forEach(op => {\n        console.log(`  ${op.item_id}: ${op.action} (original: ${op.original_status})`);\n      });\n    }\n\n    if (options.dryRun) {\n      return;\n    }\n\n    // Perform rollback\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n    const parser = new FrontmatterParser();\n\n    let successCount = 0;\n    let failureCount = 0;\n\n    for (const operation of rollbackPlan.rollback_operations) {\n      try {\n        if (operation.action === 'remove_state_fields') {\n          // Find the item and remove state fields\n          const item = findItem(relationshipManager, operation.item_id);\n          if (item) {\n            const updates = {\n              state: undefined,\n              state_metadata: undefined,\n              status: operation.original_status,\n              updated_date: new Date().toISOString()\n            };\n            \n            parser.updateFile(item.file_path, updates);\n            successCount++;\n            \n            if (options.verbose) {\n              console.log(Formatter.success(`✓ ${operation.item_id}: removed state fields`));\n            }\n          }\n        }\n      } catch (error) {\n        failureCount++;\n        const errorMsg = error instanceof Error ? error.message : 'Unknown error';\n        console.log(Formatter.error(`✗ ${operation.item_id}: ${errorMsg}`));\n      }\n    }\n\n    // Refresh cache\n    relationshipManager.rebuildCache();\n\n    console.log('');\n    console.log(Formatter.info('Rollback Results:'));\n    console.log(`  Successful: ${successCount}`);\n    console.log(`  Failed: ${failureCount}`);\n    console.log(`  Total: ${rollbackPlan.rollback_summary.total_operations}`);\n\n    if (failureCount > 0) {\n      console.log('');\n      console.log(Formatter.warning('Some rollback operations failed.'));\n      process.exit(1);\n    } else {\n      console.log('');\n      console.log(Formatter.success('Rollback completed successfully!'));\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Rollback failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\nasync function showMigrationStatus(options: { type?: string; format?: string }): Promise<void> {\n  try {\n    const configManager = new ConfigManager();\n    const config = configManager.getConfig();\n    const cliTasksDir = process.env.CLI_TASKS_DIR;\n    const paths = configManager.getAbsolutePaths(cliTasksDir);\n    const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n    // Get all items\n    let items: AnyItemData[] = [];\n    \n    if (!options.type || options.type === 'epic') {\n      items.push(...relationshipManager.getAllEpics());\n    }\n    if (!options.type || options.type === 'issue') {\n      items.push(...relationshipManager.getAllIssues());\n    }\n    if (!options.type || options.type === 'task') {\n      items.push(...relationshipManager.getAllTasks());\n    }\n    if (!options.type || options.type === 'pr') {\n      items.push(...relationshipManager.getAllPRs());\n    }\n\n    const preview = StateMigration.previewMigration(items);\n    \n    if (options.format === 'json') {\n      const status = {\n        total_items: preview.total_items,\n        needs_migration: preview.needs_migration,\n        already_migrated: preview.already_migrated,\n        migration_percentage: (preview.already_migrated / preview.total_items * 100).toFixed(1),\n        items: preview.migration_preview\n      };\n      console.log(JSON.stringify(status, null, 2));\n      return;\n    }\n\n    // Table format\n    console.log(Formatter.info('Migration Status:'));\n    console.log(`  Total items: ${preview.total_items}`);\n    console.log(`  Already migrated: ${preview.already_migrated}`);\n    console.log(`  Needs migration: ${preview.needs_migration}`);\n    \n    if (preview.total_items > 0) {\n      const percentage = (preview.already_migrated / preview.total_items * 100).toFixed(1);\n      console.log(`  Migration progress: ${percentage}%`);\n    }\n\n    if (preview.needs_migration > 0) {\n      console.log('');\n      console.log(Formatter.warning('Items needing migration:'));\n      preview.migration_preview\n        .filter(item => item.needs_migration)\n        .slice(0, 10)\n        .forEach(item => {\n          console.log(`  ${item.item_id} (${item.item_type}): ${item.current_status} → ${item.target_state}`);\n        });\n      \n      if (preview.needs_migration > 10) {\n        console.log(`  ... and ${preview.needs_migration - 10} more`);\n      }\n    } else {\n      console.log('');\n      console.log(Formatter.success('All items are migrated!'));\n    }\n\n  } catch (error) {\n    console.error(\n      Formatter.error(\n        `Status check failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n    process.exit(1);\n  }\n}\n\n// Helper functions\nfunction showMigrationPreview(preview: any, verbose?: boolean): void {\n  console.log('');\n  console.log(Formatter.info('Migration Preview:'));\n  \n  const needsMigration = preview.migration_preview.filter((item: any) => item.needs_migration);\n  const alreadyMigrated = preview.migration_preview.filter((item: any) => !item.needs_migration);\n\n  if (needsMigration.length > 0) {\n    console.log('');\n    console.log(Formatter.warning('Items that will be migrated:'));\n    needsMigration.slice(0, verbose ? needsMigration.length : 10).forEach((item: any) => {\n      console.log(`  ${item.item_id} (${item.item_type}): ${item.current_status} → ${item.target_state}`);\n    });\n    \n    if (!verbose && needsMigration.length > 10) {\n      console.log(`  ... and ${needsMigration.length - 10} more`);\n    }\n  }\n\n  if (alreadyMigrated.length > 0 && verbose) {\n    console.log('');\n    console.log(Formatter.success('Items already migrated:'));\n    alreadyMigrated.slice(0, 10).forEach((item: any) => {\n      console.log(`  ${item.item_id} (${item.item_type}): already has state field`);\n    });\n    \n    if (alreadyMigrated.length > 10) {\n      console.log(`  ... and ${alreadyMigrated.length - 10} more`);\n    }\n  }\n}\n\nasync function createBackups(items: AnyItemData[]): Promise<void> {\n  const backupDir = `migration-backup-${new Date().toISOString().replace(/[:.]/g, '-')}`;\n  require('fs').mkdirSync(backupDir, { recursive: true });\n  \n  for (const item of items) {\n    const content = require('fs').readFileSync(item.file_path, 'utf8');\n    const backupPath = `${backupDir}/${getItemId(item)}.md`;\n    require('fs').writeFileSync(backupPath, content);\n  }\n  \n  console.log(Formatter.info(`Backup created in: ${backupDir}`));\n}\n\nfunction findItem(relationshipManager: RelationshipManager, itemId: string): AnyItemData | null {\n  // Try to find in different hierarchies\n  const epic = relationshipManager.getEpicHierarchy(itemId);\n  if (epic) return epic.epic;\n\n  const issue = relationshipManager.getIssueHierarchy(itemId);\n  if (issue) return issue.issue;\n\n  const task = relationshipManager.getTaskHierarchy(itemId);\n  if (task) return task.task;\n\n  const pr = relationshipManager.getPRHierarchy(itemId);\n  if (pr) return pr.pr;\n\n  return null;\n}\n\nfunction getItemId(item: AnyItemData): string {\n  if ('project_id' in item && 'type' in item) return item.project_id;\n  if ('epic_id' in item) return item.epic_id;\n  if ('issue_id' in item && 'pr_id' in item) return item.pr_id;\n  if ('issue_id' in item && 'task_id' in item) return item.task_id;\n  if ('issue_id' in item) return item.issue_id;\n  throw new Error('Unknown item type');\n}","/**\n * Portfolio Command\n * Provides portfolio-wide status reporting across multiple ai-trackdown projects\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { EpicData, IssueData, ProjectConfig, TaskData } from '../types/ai-trackdown.js';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { FrontmatterParser } from '../utils/frontmatter-parser.js';\n\ninterface PortfolioOptions {\n  format?: 'table' | 'json' | 'markdown';\n  directory?: string;\n  health?: boolean;\n  summary?: boolean;\n}\n\ninterface ProjectSummary {\n  name: string;\n  path: string;\n  config: ProjectConfig | null;\n  epics: number;\n  issues: number;\n  tasks: number;\n  status: 'healthy' | 'warning' | 'error';\n  lastUpdated: string;\n}\n\nexport function createPortfolioCommand(): Command {\n  const cmd = new Command('portfolio');\n\n  cmd\n    .description('Portfolio-wide status reporting across multiple ai-trackdown projects')\n    .option('--format <format>', 'output format (table, json, markdown)', 'table')\n    .option('--directory <path>', 'root directory to scan for projects', '.')\n    .option('--health', 'focus on project health monitoring')\n    .option('--summary', 'show summary statistics only')\n    .action(async (options: PortfolioOptions) => {\n      try {\n        await showPortfolio(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to show portfolio: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function showPortfolio(options: PortfolioOptions): Promise<void> {\n  console.log(Formatter.info('🏢 AI-Trackdown Portfolio Status'));\n  console.log('='.repeat(60));\n\n  const scanDirectory = path.resolve(options.directory || '.');\n  const projects = await findAiTrackdownProjects(scanDirectory);\n\n  if (projects.length === 0) {\n    console.log(Formatter.warning('No AI-Trackdown projects found'));\n    return;\n  }\n\n  const projectSummaries: ProjectSummary[] = [];\n\n  for (const project of projects) {\n    try {\n      const summary = await analyzeProject(project);\n      projectSummaries.push(summary);\n    } catch (_error) {\n      projectSummaries.push({\n        name: path.basename(project),\n        path: project,\n        config: null,\n        epics: 0,\n        issues: 0,\n        tasks: 0,\n        status: 'error',\n        lastUpdated: 'unknown',\n      });\n    }\n  }\n\n  if (options.format === 'json') {\n    console.log(JSON.stringify(projectSummaries, null, 2));\n    return;\n  }\n\n  // Display portfolio summary\n  displayPortfolioSummary(projectSummaries, options);\n}\n\nasync function findAiTrackdownProjects(rootDir: string): Promise<string[]> {\n  const projects: string[] = [];\n\n  function scanDir(dir: string, depth: number = 0): void {\n    if (depth > 3) return; // Limit scan depth\n\n    try {\n      const items = fs.readdirSync(dir);\n\n      // Check if current directory is an ai-trackdown project\n      if (items.includes('.ai-trackdown')) {\n        projects.push(dir);\n        return; // Don't scan subdirectories of ai-trackdown projects\n      }\n\n      // Scan subdirectories\n      for (const item of items) {\n        if (item.startsWith('.') && item !== '.ai-trackdown') continue;\n\n        const itemPath = path.join(dir, item);\n        try {\n          const stat = fs.statSync(itemPath);\n          if (stat.isDirectory()) {\n            scanDir(itemPath, depth + 1);\n          }\n        } catch (_error) {\n          // Skip inaccessible directories\n        }\n      }\n    } catch (_error) {\n      // Skip inaccessible directories\n    }\n  }\n\n  scanDir(rootDir);\n  return projects;\n}\n\nasync function analyzeProject(projectPath: string): Promise<ProjectSummary> {\n  const configManager = new ConfigManager(projectPath);\n  const parser = new FrontmatterParser();\n\n  let config: ProjectConfig | null = null;\n  let status: 'healthy' | 'warning' | 'error' = 'healthy';\n\n  try {\n    config = configManager.getConfig();\n  } catch (_error) {\n    status = 'error';\n  }\n\n  const paths = configManager.getAbsolutePaths();\n\n  let epics = 0;\n  let issues = 0;\n  let tasks = 0;\n  let lastUpdated = 'never';\n\n  try {\n    // Count epics\n    const epicData = parser.parseDirectory(paths.epicsDir, 'epic') as EpicData[];\n    epics = epicData.length;\n\n    // Count issues\n    const issueData = parser.parseDirectory(paths.issuesDir, 'issue') as IssueData[];\n    issues = issueData.length;\n\n    // Count tasks\n    const taskData = parser.parseDirectory(paths.tasksDir, 'task') as TaskData[];\n    tasks = taskData.length;\n\n    // Find most recent update\n    const allItems = [...epicData, ...issueData, ...taskData];\n    if (allItems.length > 0) {\n      const dates = allItems\n        .map((item) => item.updated_date)\n        .filter((date) => date)\n        .sort()\n        .reverse();\n\n      if (dates.length > 0) {\n        lastUpdated = new Date(dates[0]).toLocaleDateString();\n      }\n    }\n\n    // Health check\n    if (epics === 0 && issues === 0 && tasks === 0) {\n      status = 'warning';\n    }\n  } catch (_error) {\n    status = 'error';\n  }\n\n  return {\n    name: config?.project_name || path.basename(projectPath),\n    path: projectPath,\n    config,\n    epics,\n    issues,\n    tasks,\n    status,\n    lastUpdated,\n  };\n}\n\nfunction displayPortfolioSummary(projects: ProjectSummary[], options: PortfolioOptions): void {\n  console.log(Formatter.info(`📊 Found ${projects.length} AI-Trackdown project(s)`));\n  console.log('');\n\n  // Overall statistics\n  const totalEpics = projects.reduce((sum, p) => sum + p.epics, 0);\n  const totalIssues = projects.reduce((sum, p) => sum + p.issues, 0);\n  const totalTasks = projects.reduce((sum, p) => sum + p.tasks, 0);\n  const healthyProjects = projects.filter((p) => p.status === 'healthy').length;\n  const warningProjects = projects.filter((p) => p.status === 'warning').length;\n  const errorProjects = projects.filter((p) => p.status === 'error').length;\n\n  console.log(Formatter.success(`📈 Portfolio Overview:`));\n  console.log(Formatter.info(`   Total Items: ${totalEpics + totalIssues + totalTasks}`));\n  console.log(\n    Formatter.info(`   Epics: ${totalEpics} | Issues: ${totalIssues} | Tasks: ${totalTasks}`)\n  );\n  console.log(\n    Formatter.info(\n      `   Health: ${healthyProjects} healthy, ${warningProjects} warnings, ${errorProjects} errors`\n    )\n  );\n  console.log('');\n\n  if (options.summary) {\n    return;\n  }\n\n  // Individual project details\n  console.log(Formatter.success('📋 Project Details:'));\n  console.log('');\n\n  for (const project of projects) {\n    const statusIcon = getStatusIcon(project.status);\n    const statusColor = getStatusColor(project.status);\n\n    console.log(statusColor(`${statusIcon} ${project.name}`));\n    console.log(Formatter.debug(`   Path: ${project.path}`));\n    console.log(\n      Formatter.debug(\n        `   Items: ${project.epics} epics, ${project.issues} issues, ${project.tasks} tasks`\n      )\n    );\n    console.log(Formatter.debug(`   Last Updated: ${project.lastUpdated}`));\n\n    if (options.health && project.status !== 'healthy') {\n      console.log(Formatter.warning(`   ⚠️  Status: ${project.status}`));\n    }\n\n    console.log('');\n  }\n}\n\nfunction getStatusIcon(status: string): string {\n  switch (status) {\n    case 'healthy':\n      return '✅';\n    case 'warning':\n      return '⚠️';\n    case 'error':\n      return '❌';\n    default:\n      return '❓';\n  }\n}\n\nfunction getStatusColor(status: string): (text: string) => string {\n  switch (status) {\n    case 'healthy':\n      return Formatter.success;\n    case 'warning':\n      return Formatter.warning;\n    case 'error':\n      return Formatter.error;\n    default:\n      return Formatter.info;\n  }\n}\n","/**\n * PR Approve Command\n * Approves PRs with validation and automatic status management\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { PRData, PRStatus } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface ApproveOptions {\n  comments?: string;\n  autoMerge?: boolean;\n  mergeStrategy?: 'merge' | 'squash' | 'rebase';\n  reviewer?: string;\n  bypassChecks?: boolean;\n  dryRun?: boolean;\n}\n\nexport function createPRApproveCommand(): Command {\n  const cmd = new Command('approve');\n\n  cmd\n    .description('Approve a PR and update its status')\n    .argument('<pr-id>', 'PR ID to approve')\n    .option('-c, --comments <text>', 'approval comments')\n    .option('-m, --auto-merge', 'automatically merge after approval')\n    .option('--merge-strategy <strategy>', 'merge strategy (merge|squash|rebase)', 'merge')\n    .option('--reviewer <username>', 'approver username (defaults to current user)')\n    .option('--bypass-checks', 'bypass approval requirement checks')\n    .option('--dry-run', 'show what would be done without making changes')\n    .action(async (prId: string, options: ApproveOptions) => {\n      try {\n        await approvePR(prId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to approve PR: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function approvePR(prId: string, options: ApproveOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n  const parser = new FrontmatterParser();\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n\n  // Find the PR\n  const prHierarchy = relationshipManager.getPRHierarchy(prId);\n  if (!prHierarchy) {\n    throw new Error(`PR not found: ${prId}`);\n  }\n\n  const pr = prHierarchy.pr;\n\n  // Validate PR can be approved\n  if (pr.pr_status === 'merged') {\n    throw new Error('Cannot approve a PR that is already merged');\n  }\n\n  if (pr.pr_status === 'closed') {\n    throw new Error('Cannot approve a PR that is closed');\n  }\n\n  // Get approver\n  const approver = options.reviewer || config.default_assignee || 'current-user';\n\n  // Check if already approved by this user\n  const currentApprovals = pr.approvals || [];\n  if (currentApprovals.includes(approver)) {\n    console.log(Formatter.warning(`PR ${prId} is already approved by ${approver}`));\n    if (!options.bypassChecks) {\n      return;\n    }\n  }\n\n  // Add approver to reviewers if not already present\n  const currentReviewers = pr.reviewers || [];\n  const updatedReviewers = currentReviewers.includes(approver)\n    ? currentReviewers\n    : [...currentReviewers, approver];\n\n  // Add approval\n  const updatedApprovals = currentApprovals.includes(approver)\n    ? currentApprovals\n    : [...currentApprovals, approver];\n\n  // Determine new status\n  let newStatus: PRStatus = 'review';\n\n  // Check if all reviewers have approved\n  const allApproved =\n    updatedReviewers.length > 0 && updatedApprovals.length >= updatedReviewers.length;\n\n  if (allApproved || options.bypassChecks) {\n    newStatus = 'approved';\n  }\n\n  // Auto-merge logic\n  const shouldAutoMerge = options.autoMerge && (allApproved || options.bypassChecks);\n\n  if (shouldAutoMerge) {\n    newStatus = 'merged';\n  }\n\n  // Validate merge strategy\n  const validMergeStrategies = ['merge', 'squash', 'rebase'];\n  if (options.mergeStrategy && !validMergeStrategies.includes(options.mergeStrategy)) {\n    throw new Error(\n      `Invalid merge strategy: ${options.mergeStrategy}. Must be one of: ${validMergeStrategies.join(', ')}`\n    );\n  }\n\n  const now = new Date().toISOString();\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - PR would be approved with:'));\n    console.log(Formatter.debug(`PR ID: ${prId}`));\n    console.log(Formatter.debug(`Approver: ${approver}`));\n    console.log(Formatter.debug(`Current Status: ${pr.pr_status}`));\n    console.log(Formatter.debug(`New Status: ${newStatus}`));\n    console.log(Formatter.debug(`Current Reviewers: ${currentReviewers.join(', ') || 'none'}`));\n    console.log(Formatter.debug(`Updated Reviewers: ${updatedReviewers.join(', ')}`));\n    console.log(Formatter.debug(`Current Approvals: ${currentApprovals.join(', ') || 'none'}`));\n    console.log(Formatter.debug(`Updated Approvals: ${updatedApprovals.join(', ')}`));\n    console.log(Formatter.debug(`All Approved: ${allApproved}`));\n    console.log(Formatter.debug(`Auto-merge: ${shouldAutoMerge}`));\n    if (options.mergeStrategy) {\n      console.log(Formatter.debug(`Merge Strategy: ${options.mergeStrategy}`));\n    }\n    if (options.comments) {\n      console.log(Formatter.debug(`Comments: ${options.comments}`));\n    }\n    return;\n  }\n\n  // Create approval review record\n  const reviewsDir = path.join(paths.prsDir, 'reviews');\n  if (!fs.existsSync(reviewsDir)) {\n    fs.mkdirSync(reviewsDir, { recursive: true });\n  }\n\n  const approvalReviewId = `${prId}-approval-${Date.now()}`;\n  const approvalContent = `# PR Approval: ${pr.title}\n\n**PR**: ${prId}  \n**Approver**: ${approver}  \n**Date**: ${now}  \n**Status**: ✅ APPROVED\n\n## Approval Comments\n\n${options.comments || 'No additional comments provided.'}\n\n## Approval Details\n\n- **Review Type**: Approval\n- **Approver**: ${approver}\n- **Auto-merge**: ${shouldAutoMerge ? 'Yes' : 'No'}\n${options.mergeStrategy ? `- **Merge Strategy**: ${options.mergeStrategy}` : ''}\n\n## Approval Checklist\n\n- [x] Code quality meets standards\n- [x] Functionality works as expected\n- [x] Tests pass (if applicable)\n- [x] Documentation updated (if applicable)\n- [x] No security concerns identified\n- [x] Performance impact acceptable\n\n## Decision\n\n✅ **APPROVED** - This PR is ready to merge.\n\n${shouldAutoMerge ? '🚀 **AUTO-MERGE ENABLED** - PR will be automatically merged.' : ''}\n`;\n\n  const approvalFrontmatter = {\n    review_id: approvalReviewId,\n    pr_id: prId,\n    reviewer: approver,\n    review_type: 'approve',\n    created_date: now,\n    updated_date: now,\n    status: 'submitted',\n    comments: options.comments,\n    auto_merge: shouldAutoMerge,\n    merge_strategy: options.mergeStrategy,\n  };\n\n  // Write approval review\n  const approvalFilePath = path.join(reviewsDir, `${approvalReviewId}.md`);\n  parser.writeFile(approvalFilePath, approvalFrontmatter, approvalContent);\n\n  // Update PR with approval information\n  const prUpdates: Partial<PRData> = {\n    reviewers: updatedReviewers,\n    approvals: updatedApprovals,\n    pr_status: newStatus,\n    updated_date: now,\n  };\n\n  // Add merge information if auto-merging\n  if (shouldAutoMerge) {\n    prUpdates.merge_commit = `auto-merge-${Date.now()}`;\n  }\n\n  parser.updateFile(pr.file_path, prUpdates);\n\n  // Handle status-based file movement\n  if (newStatus !== pr.pr_status) {\n    await handleStatusTransition(pr, newStatus, paths);\n  }\n\n  // Update linked tasks if merged\n  if (shouldAutoMerge && prHierarchy.issue) {\n    await updateLinkedTasks(prHierarchy.issue, relationshipManager, parser);\n  }\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`PR approved successfully!`));\n  console.log(Formatter.info(`PR: ${prId} - ${pr.title}`));\n  console.log(Formatter.info(`Approver: ${approver}`));\n  console.log(Formatter.info(`Status: ${pr.pr_status} → ${newStatus}`));\n  console.log(Formatter.info(`Approval File: ${approvalFilePath}`));\n\n  if (options.comments) {\n    console.log(Formatter.info(`Comments: ${options.comments}`));\n  }\n\n  console.log('');\n  console.log(Formatter.info(`📊 Approval Status:`));\n  console.log(Formatter.info(`   Reviewers: ${updatedReviewers.join(', ')}`));\n  console.log(\n    Formatter.info(`   Approvals: ${updatedApprovals.length}/${updatedReviewers.length}`)\n  );\n  console.log(Formatter.info(`   All Approved: ${allApproved ? '✅' : '❌'}`));\n\n  if (shouldAutoMerge) {\n    console.log('');\n    console.log(Formatter.success('🚀 PR automatically merged!'));\n    console.log(Formatter.info(`Merge Strategy: ${options.mergeStrategy || 'merge'}`));\n    console.log(Formatter.info('Linked tasks updated if applicable'));\n  } else if (newStatus === 'approved') {\n    console.log('');\n    console.log(Formatter.success('✅ PR is now approved and ready to merge!'));\n    console.log(Formatter.info('Use `aitrackdown pr merge` to merge the PR'));\n  } else {\n    console.log('');\n    console.log(Formatter.warning('⚠️  PR approved but waiting for additional reviewers'));\n    console.log(\n      Formatter.info(`Need ${updatedReviewers.length - updatedApprovals.length} more approvals`)\n    );\n  }\n}\n\nasync function handleStatusTransition(pr: PRData, newStatus: PRStatus, paths: any): Promise<void> {\n  // Define status-based directories\n  const statusDirs = {\n    draft: path.join(paths.prsDir, 'draft'),\n    open: path.join(paths.prsDir, 'active'),\n    review: path.join(paths.prsDir, 'active'),\n    approved: path.join(paths.prsDir, 'active'),\n    merged: path.join(paths.prsDir, 'merged'),\n    closed: path.join(paths.prsDir, 'closed'),\n  };\n\n  // Get current and target directories\n  const currentDir = path.dirname(pr.file_path);\n  const targetDir = statusDirs[newStatus];\n\n  // Only move if different directory\n  if (currentDir !== targetDir) {\n    // Ensure target directory exists\n    if (!fs.existsSync(targetDir)) {\n      fs.mkdirSync(targetDir, { recursive: true });\n    }\n\n    // Generate new file path\n    const fileName = path.basename(pr.file_path);\n    const newFilePath = path.join(targetDir, fileName);\n\n    // Move the file\n    fs.renameSync(pr.file_path, newFilePath);\n\n    console.log(Formatter.info(`Moved PR file: ${currentDir} → ${targetDir}`));\n  }\n}\n\nasync function updateLinkedTasks(\n  issue: any,\n  relationshipManager: RelationshipManager,\n  parser: FrontmatterParser\n): Promise<void> {\n  try {\n    // Get all tasks linked to the issue\n    const issueHierarchy = relationshipManager.getIssueHierarchy(issue.issue_id);\n    if (!issueHierarchy) {\n      return;\n    }\n\n    const tasks = issueHierarchy.tasks;\n    const now = new Date().toISOString();\n\n    // Update completed tasks to mark PR as merged\n    for (const task of tasks) {\n      if (task.status === 'completed') {\n        const taskUpdates = {\n          updated_date: now,\n          sync_status: 'synced' as const,\n        };\n\n        parser.updateFile(task.file_path, taskUpdates);\n      }\n    }\n\n    console.log(Formatter.info(`Updated ${tasks.length} linked tasks`));\n  } catch (error) {\n    console.warn(\n      Formatter.warning(\n        `Failed to update linked tasks: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n  }\n}\n","/**\n * PR Status Manager\n * Handles PR status transitions, validation, and file organization\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PRData, PRStatus } from '../types/ai-trackdown.js';\nimport type { ConfigManager } from './config-manager.js';\n\nexport class PRStatusManager {\n  private configManager: ConfigManager;\n\n  constructor(configManager: ConfigManager) {\n    this.configManager = configManager;\n  }\n\n  /**\n   * Validates if a status transition is allowed\n   */\n  isValidStatusTransition(currentStatus: PRStatus, newStatus: PRStatus): boolean {\n    const validTransitions: Record<PRStatus, PRStatus[]> = {\n      draft: ['open', 'closed'],\n      open: ['draft', 'review', 'approved', 'merged', 'closed'],\n      review: ['open', 'approved', 'closed'],\n      approved: ['review', 'merged', 'closed'],\n      merged: [], // Merged PRs cannot transition to other states\n      closed: ['draft', 'open'], // Closed PRs can be reopened\n    };\n\n    return validTransitions[currentStatus].includes(newStatus);\n  }\n\n  /**\n   * Gets the directory path for a given PR status\n   */\n  getStatusDirectory(status: PRStatus, basePRsDir: string): string {\n    const statusDirs = {\n      draft: path.join(basePRsDir, 'draft'),\n      open: path.join(basePRsDir, 'active'),\n      review: path.join(basePRsDir, 'active'),\n      approved: path.join(basePRsDir, 'active'),\n      merged: path.join(basePRsDir, 'merged'),\n      closed: path.join(basePRsDir, 'closed'),\n    };\n\n    return statusDirs[status];\n  }\n\n  /**\n   * Moves a PR file to the appropriate directory based on status\n   */\n  async moveToStatusDirectory(\n    pr: PRData,\n    newStatus: PRStatus,\n    basePRsDir: string\n  ): Promise<string | null> {\n    const currentDir = path.dirname(pr.file_path);\n    const targetDir = this.getStatusDirectory(newStatus, basePRsDir);\n\n    // Only move if different directory\n    if (currentDir === targetDir) {\n      return null; // No move needed\n    }\n\n    // Ensure target directory exists\n    if (!fs.existsSync(targetDir)) {\n      fs.mkdirSync(targetDir, { recursive: true });\n    }\n\n    // Generate new file path\n    const fileName = path.basename(pr.file_path);\n    const newFilePath = path.join(targetDir, fileName);\n\n    // Check if target file already exists\n    if (fs.existsSync(newFilePath)) {\n      throw new Error(`Target file already exists: ${newFilePath}`);\n    }\n\n    // Move the file\n    fs.renameSync(pr.file_path, newFilePath);\n\n    return newFilePath;\n  }\n\n  /**\n   * Validates PR status transition business rules\n   */\n  validateStatusTransition(\n    pr: PRData,\n    newStatus: PRStatus,\n    options: {\n      bypassChecks?: boolean;\n      requiredApprovals?: number;\n    } = {}\n  ): ValidationResult {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    // Check if transition is structurally valid\n    if (!this.isValidStatusTransition(pr.pr_status, newStatus)) {\n      errors.push(`Invalid status transition: ${pr.pr_status} → ${newStatus}`);\n    }\n\n    // Business rule validations (can be bypassed)\n    if (!options.bypassChecks) {\n      switch (newStatus) {\n        case 'approved': {\n          // Check if there are reviewers\n          if (!pr.reviewers || pr.reviewers.length === 0) {\n            warnings.push('PR has no reviewers assigned');\n          }\n\n          // Check if all reviewers have approved\n          const approvals = pr.approvals || [];\n          const reviewers = pr.reviewers || [];\n          const requiredApprovals = options.requiredApprovals || reviewers.length;\n\n          if (approvals.length < requiredApprovals) {\n            warnings.push(`PR needs ${requiredApprovals - approvals.length} more approvals`);\n          }\n          break;\n        }\n\n        case 'merged':\n          // Check if PR is approved\n          if (pr.pr_status !== 'approved') {\n            errors.push('PR must be approved before merging');\n          }\n\n          // Check for blocking dependencies\n          if (pr.blocked_by && pr.blocked_by.length > 0) {\n            errors.push(`PR is blocked by: ${pr.blocked_by.join(', ')}`);\n          }\n          break;\n\n        case 'closed':\n          // Warn if closing an approved PR\n          if (pr.pr_status === 'approved') {\n            warnings.push('Closing an approved PR - consider merging instead');\n          }\n          break;\n      }\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n      warnings,\n    };\n  }\n\n  /**\n   * Gets the next recommended status for a PR\n   */\n  getNextRecommendedStatus(pr: PRData): PRStatus | null {\n    switch (pr.pr_status) {\n      case 'draft':\n        return 'open';\n      case 'open':\n        return 'review';\n      case 'review': {\n        const approvals = pr.approvals || [];\n        const reviewers = pr.reviewers || [];\n        return approvals.length >= reviewers.length ? 'approved' : 'review';\n      }\n      case 'approved':\n        return 'merged';\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Gets status-specific requirements and suggestions\n   */\n  getStatusRequirements(status: PRStatus): StatusRequirements {\n    const requirements: Record<PRStatus, StatusRequirements> = {\n      draft: {\n        required: [],\n        recommended: ['title', 'description', 'branch_name'],\n        nextActions: ['Add reviewers', 'Update to open when ready'],\n      },\n      open: {\n        required: ['title', 'description'],\n        recommended: ['reviewers', 'target_branch'],\n        nextActions: ['Request reviews', 'Update to review status'],\n      },\n      review: {\n        required: ['reviewers'],\n        recommended: ['approval_count'],\n        nextActions: ['Wait for reviews', 'Address feedback'],\n      },\n      approved: {\n        required: ['approvals'],\n        recommended: ['merge_strategy'],\n        nextActions: ['Merge PR', 'Deploy changes'],\n      },\n      merged: {\n        required: ['merge_commit'],\n        recommended: ['linked_tasks_updated'],\n        nextActions: ['Close related tasks', 'Update documentation'],\n      },\n      closed: {\n        required: [],\n        recommended: ['close_reason'],\n        nextActions: ['Archive or reopen if needed'],\n      },\n    };\n\n    return requirements[status];\n  }\n\n  /**\n   * Applies automatic status transitions based on PR state\n   */\n  getAutoStatusTransition(pr: PRData): PRStatus | null {\n    // Auto-transition from review to approved if all reviewers approved\n    if (pr.pr_status === 'review') {\n      const approvals = pr.approvals || [];\n      const reviewers = pr.reviewers || [];\n\n      if (reviewers.length > 0 && approvals.length >= reviewers.length) {\n        return 'approved';\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Creates status-specific directories if they don't exist\n   */\n  ensureStatusDirectories(basePRsDir: string): void {\n    const statusDirs = ['draft', 'active', 'merged', 'closed', 'reviews', 'logs'];\n\n    statusDirs.forEach((dir) => {\n      const dirPath = path.join(basePRsDir, dir);\n      if (!fs.existsSync(dirPath)) {\n        fs.mkdirSync(dirPath, { recursive: true });\n      }\n    });\n  }\n\n  /**\n   * Generates a status transition report\n   */\n  generateStatusReport(\n    pr: PRData,\n    fromStatus: PRStatus,\n    toStatus: PRStatus,\n    metadata: any = {}\n  ): StatusTransitionReport {\n    const now = new Date().toISOString();\n\n    return {\n      pr_id: pr.pr_id,\n      from_status: fromStatus,\n      to_status: toStatus,\n      timestamp: now,\n      triggered_by: metadata.triggered_by || 'manual',\n      file_moved: metadata.file_moved || false,\n      new_file_path: metadata.new_file_path,\n      approvals_count: (pr.approvals || []).length,\n      reviewers_count: (pr.reviewers || []).length,\n      validation_passed: metadata.validation_passed || true,\n      validation_warnings: metadata.validation_warnings || [],\n    };\n  }\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n  warnings: string[];\n}\n\nexport interface StatusRequirements {\n  required: string[];\n  recommended: string[];\n  nextActions: string[];\n}\n\nexport interface StatusTransitionReport {\n  pr_id: string;\n  from_status: PRStatus;\n  to_status: PRStatus;\n  timestamp: string;\n  triggered_by: string;\n  file_moved: boolean;\n  new_file_path?: string;\n  approvals_count: number;\n  reviewers_count: number;\n  validation_passed: boolean;\n  validation_warnings: string[];\n}\n\nexport default PRStatusManager;\n","/**\n * PR File Manager\n * Handles PR file organization, movement, and directory structure\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PRData, PRStatus } from '../types/ai-trackdown.js';\nimport type { ConfigManager } from './config-manager.js';\nimport { PRStatusManager } from './pr-status-manager.js';\n\nexport class PRFileManager {\n  private configManager: ConfigManager;\n  private statusManager: PRStatusManager;\n\n  constructor(configManager: ConfigManager) {\n    this.configManager = configManager;\n    this.statusManager = new PRStatusManager(configManager);\n  }\n\n  /**\n   * Initialize PR directory structure\n   */\n  initializePRDirectories(basePRsDir: string): void {\n    const directories = [\n      'draft', // Draft PRs\n      'active', // Open, review, approved PRs\n      'merged', // Merged PRs\n      'closed', // Closed PRs\n      'reviews', // Review files\n      'logs', // Activity logs\n      'templates', // PR templates\n      'attachments', // File attachments\n    ];\n\n    directories.forEach((dir) => {\n      const dirPath = path.join(basePRsDir, dir);\n      if (!fs.existsSync(dirPath)) {\n        fs.mkdirSync(dirPath, { recursive: true });\n      }\n    });\n\n    // Create subdirectories for active PRs\n    const activeDirs = ['open', 'review', 'approved'];\n    activeDirs.forEach((subdir) => {\n      const subDirPath = path.join(basePRsDir, 'active', subdir);\n      if (!fs.existsSync(subDirPath)) {\n        fs.mkdirSync(subDirPath, { recursive: true });\n      }\n    });\n  }\n\n  /**\n   * Get the appropriate directory for a PR based on its status\n   */\n  getPRDirectory(status: PRStatus, basePRsDir: string): string {\n    const statusDirectories = {\n      draft: path.join(basePRsDir, 'draft'),\n      open: path.join(basePRsDir, 'active', 'open'),\n      review: path.join(basePRsDir, 'active', 'review'),\n      approved: path.join(basePRsDir, 'active', 'approved'),\n      merged: path.join(basePRsDir, 'merged'),\n      closed: path.join(basePRsDir, 'closed'),\n    };\n\n    return statusDirectories[status];\n  }\n\n  /**\n   * Move PR file to status-appropriate directory\n   */\n  async movePRToStatusDirectory(\n    pr: PRData,\n    newStatus: PRStatus,\n    basePRsDir: string\n  ): Promise<MovePRResult> {\n    const currentPath = pr.file_path;\n    const targetDir = this.getPRDirectory(newStatus, basePRsDir);\n    const fileName = path.basename(currentPath);\n    const newPath = path.join(targetDir, fileName);\n\n    // Check if move is needed\n    if (currentPath === newPath) {\n      return {\n        moved: false,\n        oldPath: currentPath,\n        newPath: currentPath,\n        reason: 'File already in correct location',\n      };\n    }\n\n    // Ensure target directory exists\n    if (!fs.existsSync(targetDir)) {\n      fs.mkdirSync(targetDir, { recursive: true });\n    }\n\n    // Check if target file already exists\n    if (fs.existsSync(newPath)) {\n      // Generate unique filename\n      const uniquePath = this.generateUniqueFilename(newPath);\n\n      fs.renameSync(currentPath, uniquePath);\n\n      return {\n        moved: true,\n        oldPath: currentPath,\n        newPath: uniquePath,\n        reason: 'Moved to unique filename to avoid conflict',\n      };\n    }\n\n    // Move the file\n    fs.renameSync(currentPath, newPath);\n\n    return {\n      moved: true,\n      oldPath: currentPath,\n      newPath: newPath,\n      reason: 'Moved to status-appropriate directory',\n    };\n  }\n\n  /**\n   * Generate unique filename if conflict exists\n   */\n  private generateUniqueFilename(filePath: string): string {\n    const dir = path.dirname(filePath);\n    const ext = path.extname(filePath);\n    const base = path.basename(filePath, ext);\n\n    let counter = 1;\n    let uniquePath = filePath;\n\n    while (fs.existsSync(uniquePath)) {\n      uniquePath = path.join(dir, `${base}-${counter}${ext}`);\n      counter++;\n    }\n\n    return uniquePath;\n  }\n\n  /**\n   * Create PR review file\n   */\n  async createReviewFile(\n    prId: string,\n    reviewer: string,\n    reviewType: 'approve' | 'request_changes' | 'comment',\n    content: string,\n    basePRsDir: string\n  ): Promise<string> {\n    const reviewsDir = path.join(basePRsDir, 'reviews');\n\n    // Ensure reviews directory exists\n    if (!fs.existsSync(reviewsDir)) {\n      fs.mkdirSync(reviewsDir, { recursive: true });\n    }\n\n    const reviewId = `${prId}-${reviewType}-${reviewer}-${Date.now()}`;\n    const reviewFileName = `${reviewId}.md`;\n    const reviewFilePath = path.join(reviewsDir, reviewFileName);\n\n    // Write review file\n    fs.writeFileSync(reviewFilePath, content, 'utf8');\n\n    return reviewFilePath;\n  }\n\n  /**\n   * Archive old PR files\n   */\n  async archiveOldPRs(basePRsDir: string, olderThanDays: number = 90): Promise<ArchiveResult> {\n    const archiveDir = path.join(basePRsDir, 'archive');\n    if (!fs.existsSync(archiveDir)) {\n      fs.mkdirSync(archiveDir, { recursive: true });\n    }\n\n    const cutoffDate = new Date();\n    cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);\n\n    const archivedFiles: string[] = [];\n    const errors: string[] = [];\n\n    // Check merged and closed directories\n    const dirsToCheck = [path.join(basePRsDir, 'merged'), path.join(basePRsDir, 'closed')];\n\n    for (const dir of dirsToCheck) {\n      if (!fs.existsSync(dir)) continue;\n\n      const files = fs.readdirSync(dir);\n\n      for (const file of files) {\n        const filePath = path.join(dir, file);\n        const stats = fs.statSync(filePath);\n\n        if (stats.mtime < cutoffDate) {\n          try {\n            const archivePath = path.join(archiveDir, file);\n            fs.renameSync(filePath, archivePath);\n            archivedFiles.push(file);\n          } catch (error) {\n            errors.push(`Failed to archive ${file}: ${error}`);\n          }\n        }\n      }\n    }\n\n    return {\n      archivedCount: archivedFiles.length,\n      archivedFiles,\n      errors,\n    };\n  }\n\n  /**\n   * Get PR directory statistics\n   */\n  getPRDirectoryStats(basePRsDir: string): PRDirectoryStats {\n    const stats: PRDirectoryStats = {\n      draft: 0,\n      open: 0,\n      review: 0,\n      approved: 0,\n      merged: 0,\n      closed: 0,\n      total: 0,\n      reviewFiles: 0,\n      diskUsage: 0,\n    };\n\n    const directories = {\n      draft: path.join(basePRsDir, 'draft'),\n      open: path.join(basePRsDir, 'active', 'open'),\n      review: path.join(basePRsDir, 'active', 'review'),\n      approved: path.join(basePRsDir, 'active', 'approved'),\n      merged: path.join(basePRsDir, 'merged'),\n      closed: path.join(basePRsDir, 'closed'),\n    };\n\n    Object.entries(directories).forEach(([status, dir]) => {\n      if (fs.existsSync(dir)) {\n        const files = fs.readdirSync(dir);\n        stats[status as keyof PRDirectoryStats] = files.length;\n        stats.total += files.length;\n\n        // Calculate disk usage\n        files.forEach((file) => {\n          const filePath = path.join(dir, file);\n          const fileStats = fs.statSync(filePath);\n          stats.diskUsage += fileStats.size;\n        });\n      }\n    });\n\n    // Count review files\n    const reviewsDir = path.join(basePRsDir, 'reviews');\n    if (fs.existsSync(reviewsDir)) {\n      const reviewFiles = fs.readdirSync(reviewsDir);\n      stats.reviewFiles = reviewFiles.length;\n    }\n\n    return stats;\n  }\n\n  /**\n   * Clean up empty directories\n   */\n  cleanupEmptyDirectories(basePRsDir: string): CleanupResult {\n    const removedDirs: string[] = [];\n    const errors: string[] = [];\n\n    const checkAndRemoveEmpty = (dir: string): void => {\n      try {\n        if (fs.existsSync(dir)) {\n          const files = fs.readdirSync(dir);\n          if (files.length === 0) {\n            fs.rmdirSync(dir);\n            removedDirs.push(dir);\n          }\n        }\n      } catch (error) {\n        errors.push(`Failed to remove ${dir}: ${error}`);\n      }\n    };\n\n    // Check subdirectories first\n    const subDirs = [\n      path.join(basePRsDir, 'active', 'open'),\n      path.join(basePRsDir, 'active', 'review'),\n      path.join(basePRsDir, 'active', 'approved'),\n    ];\n\n    subDirs.forEach(checkAndRemoveEmpty);\n\n    return {\n      removedCount: removedDirs.length,\n      removedDirs,\n      errors,\n    };\n  }\n\n  /**\n   * Validate PR directory structure\n   */\n  validatePRDirectoryStructure(basePRsDir: string): ValidationResult {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    const requiredDirs = ['draft', 'active', 'merged', 'closed', 'reviews'];\n\n    // Check required directories\n    requiredDirs.forEach((dir) => {\n      const dirPath = path.join(basePRsDir, dir);\n      if (!fs.existsSync(dirPath)) {\n        errors.push(`Missing required directory: ${dir}`);\n      }\n    });\n\n    // Check active subdirectories\n    const activeSubDirs = ['open', 'review', 'approved'];\n    activeSubDirs.forEach((subdir) => {\n      const subDirPath = path.join(basePRsDir, 'active', subdir);\n      if (!fs.existsSync(subDirPath)) {\n        warnings.push(`Missing active subdirectory: ${subdir}`);\n      }\n    });\n\n    // Check for orphaned files\n    const prFiles = this.findPRFiles(basePRsDir);\n    prFiles.forEach((file) => {\n      const relativePath = path.relative(basePRsDir, file);\n      const pathParts = relativePath.split(path.sep);\n\n      if (pathParts.length < 2) {\n        warnings.push(`PR file in root directory: ${file}`);\n      }\n    });\n\n    return {\n      valid: errors.length === 0,\n      errors,\n      warnings,\n    };\n  }\n\n  /**\n   * Find all PR files in the directory structure\n   */\n  findPRFiles(basePRsDir: string): string[] {\n    const prFiles: string[] = [];\n\n    const searchDir = (dir: string): void => {\n      if (!fs.existsSync(dir)) return;\n\n      const items = fs.readdirSync(dir);\n\n      items.forEach((item) => {\n        const itemPath = path.join(dir, item);\n        const stats = fs.statSync(itemPath);\n\n        if (stats.isDirectory()) {\n          searchDir(itemPath);\n        } else if (item.endsWith('.md') && item.startsWith('PR-')) {\n          prFiles.push(itemPath);\n        }\n      });\n    };\n\n    searchDir(basePRsDir);\n    return prFiles;\n  }\n}\n\nexport interface MovePRResult {\n  moved: boolean;\n  oldPath: string;\n  newPath: string;\n  reason: string;\n}\n\nexport interface ArchiveResult {\n  archivedCount: number;\n  archivedFiles: string[];\n  errors: string[];\n}\n\nexport interface PRDirectoryStats {\n  draft: number;\n  open: number;\n  review: number;\n  approved: number;\n  merged: number;\n  closed: number;\n  total: number;\n  reviewFiles: number;\n  diskUsage: number;\n}\n\nexport interface CleanupResult {\n  removedCount: number;\n  removedDirs: string[];\n  errors: string[];\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: string[];\n  warnings: string[];\n}\n\nexport default PRFileManager;\n","/**\n * PR Archive Command\n * Advanced PR archival system and file management\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { PRData, PRStatus } from '../../types/ai-trackdown.js';\nimport { colors } from '../../utils/colors.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { PRFileManager } from '../../utils/pr-file-manager.js';\nimport { PRStatusManager } from '../../utils/pr-status-manager.js';\n\nexport interface ArchiveOptions {\n  olderThanDays: number;\n  status: PRStatus[];\n  includeReviews: boolean;\n  compress: boolean;\n  createIndex: boolean;\n  preserveStructure: boolean;\n  dryRun: boolean;\n  force: boolean;\n}\n\nexport interface ArchiveResult {\n  success: boolean;\n  archivedPRs: number;\n  archivedReviews: number;\n  totalSizeBefore: number;\n  totalSizeAfter: number;\n  compressionRatio: number;\n  archivePath: string;\n  indexPath?: string;\n  errors: string[];\n  warnings: string[];\n  details: ArchiveDetail[];\n}\n\nexport interface ArchiveDetail {\n  prId: string;\n  originalPath: string;\n  archivePath: string;\n  sizeBytes: number;\n  archived: boolean;\n  reason?: string;\n}\n\nexport interface ArchiveIndex {\n  created: string;\n  totalPRs: number;\n  totalReviews: number;\n  totalSize: number;\n  compressionRatio: number;\n  prs: ArchiveIndexEntry[];\n}\n\nexport interface ArchiveIndexEntry {\n  prId: string;\n  title: string;\n  status: PRStatus;\n  assignee: string;\n  created: string;\n  merged?: string;\n  closed?: string;\n  archivePath: string;\n  sizeBytes: number;\n  linkedTasks: string[];\n  linkedIssues: string[];\n}\n\nexport function createPRArchiveCommand(): Command {\n  const cmd = new Command('archive');\n\n  cmd.description('Archive old or closed PRs for long-term storage');\n\n  // Main archive command\n  cmd\n    .option('-d, --days <days>', 'Archive PRs older than specified days', '90')\n    .option(\n      '-s, --status <status>',\n      'Archive PRs with specific status (comma-separated)',\n      'merged,closed'\n    )\n    .option('--include-reviews', 'Include review files in archive', false)\n    .option('--compress', 'Compress archived files', false)\n    .option('--create-index', 'Create searchable index of archived PRs', false)\n    .option('--preserve-structure', 'Preserve directory structure in archive', false)\n    .option('--force', 'Force archive even if files are recent', false)\n    .option('--dry-run', 'Show what would be archived without executing', false)\n    .action(async (options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const fileManager = new PRFileManager(configManager);\n      const _formatter = new Formatter();\n\n      const archiveOptions: ArchiveOptions = {\n        olderThanDays: parseInt(options.days),\n        status: options.status.split(',') as PRStatus[],\n        includeReviews: options.includeReviews,\n        compress: options.compress,\n        createIndex: options.createIndex,\n        preserveStructure: options.preserveStructure,\n        dryRun: options.dryRun,\n        force: options.force,\n      };\n\n      try {\n        const result = await performArchive(\n          archiveOptions,\n          statusManager,\n          fileManager,\n          configManager\n        );\n\n        if (options.dryRun) {\n          console.log(colors.yellow('🔍 Archive dry run - showing what would be archived:'));\n          console.log('');\n        }\n\n        displayArchiveResult(result);\n\n        if (!result.success) {\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(`❌ Archive failed: ${error instanceof Error ? error.message : String(error)}`)\n        );\n        process.exit(1);\n      }\n    });\n\n  // List archived PRs\n  cmd\n    .command('list')\n    .description('List archived PRs')\n    .option('-f, --format <format>', 'Output format (table|json)', 'table')\n    .option('--search <query>', 'Search archived PRs')\n    .action(async (options: any) => {\n      const configManager = new ConfigManager();\n      const formatter = new Formatter();\n\n      try {\n        const archived = await listArchivedPRs(configManager, options.search);\n        displayArchivedPRs(archived, options.format, formatter);\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error listing archived PRs: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  // Restore archived PR\n  cmd\n    .command('restore')\n    .description('Restore an archived PR')\n    .argument('<pr-id>', 'PR ID to restore')\n    .option('--to-status <status>', 'Restore to specific status', 'closed')\n    .action(async (prId: string, options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const fileManager = new PRFileManager(configManager);\n\n      try {\n        const result = await restorePR(\n          prId,\n          options.toStatus,\n          statusManager,\n          fileManager,\n          configManager\n        );\n\n        if (result.success) {\n          console.log(colors.green(`✅ Successfully restored PR ${prId}`));\n          console.log(`📁 Restored to: ${result.restoredPath}`);\n          console.log(`📋 Status: ${options.toStatus}`);\n        } else {\n          console.error(colors.red(`❌ Failed to restore PR ${prId}`));\n          result.errors.forEach((error) => console.error(colors.red(`  • ${error}`)));\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error restoring PR: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  // Clean up archive\n  cmd\n    .command('cleanup')\n    .description('Clean up archive by removing very old files')\n    .option('-d, --days <days>', 'Remove archives older than specified days', '365')\n    .option('--force', 'Force cleanup without confirmation', false)\n    .action(async (options: any) => {\n      const configManager = new ConfigManager();\n\n      try {\n        const result = await cleanupArchive(parseInt(options.days), options.force, configManager);\n\n        if (result.success) {\n          console.log(colors.green(`✅ Archive cleanup completed`));\n          console.log(`🗑️  Removed ${result.removedCount} old archives`);\n          console.log(`💾 Freed ${formatBytes(result.freedSpace)} of space`);\n        } else {\n          console.error(colors.red(`❌ Archive cleanup failed`));\n          result.errors.forEach((error) => console.error(colors.red(`  • ${error}`)));\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error during cleanup: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function performArchive(\n  options: ArchiveOptions,\n  statusManager: PRStatusManager,\n  _fileManager: PRFileManager,\n  configManager: ConfigManager\n): Promise<ArchiveResult> {\n  const result: ArchiveResult = {\n    success: false,\n    archivedPRs: 0,\n    archivedReviews: 0,\n    totalSizeBefore: 0,\n    totalSizeAfter: 0,\n    compressionRatio: 0,\n    archivePath: '',\n    errors: [],\n    warnings: [],\n    details: [],\n  };\n\n  try {\n    const basePRsDir = configManager.getPRsDirectory();\n    const archiveDir = path.join(basePRsDir, 'archive');\n    const timestamp = new Date().toISOString().split('T')[0];\n    const archivePath = path.join(archiveDir, `archive-${timestamp}`);\n\n    if (!options.dryRun) {\n      if (!fs.existsSync(archiveDir)) {\n        fs.mkdirSync(archiveDir, { recursive: true });\n      }\n\n      if (!fs.existsSync(archivePath)) {\n        fs.mkdirSync(archivePath, { recursive: true });\n      }\n    }\n\n    result.archivePath = archivePath;\n\n    // Find PRs to archive\n    const candidatePRs = await findArchiveCandidates(options, statusManager, configManager);\n\n    console.log(colors.blue(`🔄 Found ${candidatePRs.length} PRs matching archive criteria`));\n\n    if (candidatePRs.length === 0) {\n      console.log(colors.green('✅ No PRs need archiving'));\n      result.success = true;\n      return result;\n    }\n\n    // Calculate total size before archival\n    for (const pr of candidatePRs) {\n      const stats = fs.statSync(pr.file_path);\n      result.totalSizeBefore += stats.size;\n    }\n\n    // Archive each PR\n    for (const pr of candidatePRs) {\n      const detail = await archivePR(pr, archivePath, options, configManager);\n      result.details.push(detail);\n\n      if (detail.archived) {\n        result.archivedPRs++;\n        result.totalSizeAfter += detail.sizeBytes;\n      } else {\n        result.warnings.push(`Failed to archive ${pr.pr_id}: ${detail.reason}`);\n      }\n    }\n\n    // Archive review files if requested\n    if (options.includeReviews) {\n      const reviewCount = await archiveReviewFiles(archivePath, options, configManager);\n      result.archivedReviews = reviewCount;\n    }\n\n    // Calculate compression ratio\n    if (result.totalSizeBefore > 0) {\n      result.compressionRatio =\n        (result.totalSizeBefore - result.totalSizeAfter) / result.totalSizeBefore;\n    }\n\n    // Create index if requested\n    if (options.createIndex && !options.dryRun) {\n      const indexPath = await createArchiveIndex(candidatePRs, archivePath, result, configManager);\n      result.indexPath = indexPath;\n    }\n\n    // Compress archive if requested\n    if (options.compress && !options.dryRun) {\n      await compressArchive(archivePath, configManager);\n    }\n\n    result.success = result.errors.length === 0;\n\n    return result;\n  } catch (error) {\n    result.errors.push(\n      `Archive operation failed: ${error instanceof Error ? error.message : String(error)}`\n    );\n    return result;\n  }\n}\n\nasync function findArchiveCandidates(\n  options: ArchiveOptions,\n  statusManager: PRStatusManager,\n  _configManager: ConfigManager\n): Promise<PRData[]> {\n  const allPRs = await statusManager.listPRs();\n  const cutoffDate = new Date();\n  cutoffDate.setDate(cutoffDate.getDate() - options.olderThanDays);\n\n  return allPRs.filter((pr) => {\n    // Filter by status\n    if (!options.status.includes(pr.pr_status)) {\n      return false;\n    }\n\n    // Filter by age (unless forced)\n    if (!options.force) {\n      const prDate = new Date(pr.updated_date);\n      if (prDate > cutoffDate) {\n        return false;\n      }\n    }\n\n    return true;\n  });\n}\n\nasync function archivePR(\n  pr: PRData,\n  archivePath: string,\n  options: ArchiveOptions,\n  configManager: ConfigManager\n): Promise<ArchiveDetail> {\n  const detail: ArchiveDetail = {\n    prId: pr.pr_id,\n    originalPath: pr.file_path,\n    archivePath: '',\n    sizeBytes: 0,\n    archived: false,\n  };\n\n  try {\n    const stats = fs.statSync(pr.file_path);\n    detail.sizeBytes = stats.size;\n\n    // Determine archive file path\n    const fileName = path.basename(pr.file_path);\n    let targetPath: string;\n\n    if (options.preserveStructure) {\n      const relativePath = path.relative(configManager.getPRsDirectory(), pr.file_path);\n      targetPath = path.join(archivePath, relativePath);\n\n      // Ensure target directory exists\n      const targetDir = path.dirname(targetPath);\n      if (!fs.existsSync(targetDir)) {\n        fs.mkdirSync(targetDir, { recursive: true });\n      }\n    } else {\n      targetPath = path.join(archivePath, fileName);\n    }\n\n    detail.archivePath = targetPath;\n\n    if (!options.dryRun) {\n      // Copy file to archive\n      fs.copyFileSync(pr.file_path, targetPath);\n\n      // Remove original file\n      fs.unlinkSync(pr.file_path);\n    }\n\n    detail.archived = true;\n\n    return detail;\n  } catch (error) {\n    detail.reason = error instanceof Error ? error.message : String(error);\n    return detail;\n  }\n}\n\nasync function archiveReviewFiles(\n  archivePath: string,\n  options: ArchiveOptions,\n  configManager: ConfigManager\n): Promise<number> {\n  try {\n    const reviewsDir = path.join(configManager.getPRsDirectory(), 'reviews');\n\n    if (!fs.existsSync(reviewsDir)) {\n      return 0;\n    }\n\n    const reviewFiles = fs.readdirSync(reviewsDir);\n    const archiveReviewsDir = path.join(archivePath, 'reviews');\n\n    if (!options.dryRun && reviewFiles.length > 0) {\n      if (!fs.existsSync(archiveReviewsDir)) {\n        fs.mkdirSync(archiveReviewsDir, { recursive: true });\n      }\n    }\n\n    let archivedCount = 0;\n\n    for (const file of reviewFiles) {\n      const sourcePath = path.join(reviewsDir, file);\n      const targetPath = path.join(archiveReviewsDir, file);\n\n      try {\n        if (!options.dryRun) {\n          fs.copyFileSync(sourcePath, targetPath);\n          fs.unlinkSync(sourcePath);\n        }\n        archivedCount++;\n      } catch (error) {\n        console.warn(`Failed to archive review file ${file}: ${error}`);\n      }\n    }\n\n    return archivedCount;\n  } catch (error) {\n    console.error(`Error archiving review files: ${error}`);\n    return 0;\n  }\n}\n\nasync function createArchiveIndex(\n  prs: PRData[],\n  archivePath: string,\n  result: ArchiveResult,\n  _configManager: ConfigManager\n): Promise<string> {\n  const index: ArchiveIndex = {\n    created: new Date().toISOString(),\n    totalPRs: result.archivedPRs,\n    totalReviews: result.archivedReviews,\n    totalSize: result.totalSizeAfter,\n    compressionRatio: result.compressionRatio,\n    prs: [],\n  };\n\n  for (const pr of prs) {\n    const entry: ArchiveIndexEntry = {\n      prId: pr.pr_id,\n      title: pr.title,\n      status: pr.pr_status,\n      assignee: pr.assignee,\n      created: pr.created_date,\n      archivePath: path.relative(\n        archivePath,\n        result.details.find((d) => d.prId === pr.pr_id)?.archivePath || ''\n      ),\n      sizeBytes: result.details.find((d) => d.prId === pr.pr_id)?.sizeBytes || 0,\n      linkedTasks: [], // This would be populated from relationship manager\n      linkedIssues: [],\n    };\n\n    if (pr.pr_status === 'merged') {\n      entry.merged = pr.updated_date;\n    } else if (pr.pr_status === 'closed') {\n      entry.closed = pr.updated_date;\n    }\n\n    index.prs.push(entry);\n  }\n\n  const indexPath = path.join(archivePath, 'index.json');\n  fs.writeFileSync(indexPath, JSON.stringify(index, null, 2), 'utf8');\n\n  return indexPath;\n}\n\nasync function compressArchive(archivePath: string, _configManager: ConfigManager): Promise<void> {\n  // This would implement compression using a library like node-tar or zip\n  // For now, it's a placeholder\n  console.log(`Compressing archive at ${archivePath}...`);\n}\n\nasync function listArchivedPRs(\n  configManager: ConfigManager,\n  searchQuery?: string\n): Promise<ArchiveIndexEntry[]> {\n  const archiveDir = path.join(configManager.getPRsDirectory(), 'archive');\n\n  if (!fs.existsSync(archiveDir)) {\n    return [];\n  }\n\n  const archiveDirs = fs.readdirSync(archiveDir).filter((dir) => {\n    const dirPath = path.join(archiveDir, dir);\n    return fs.statSync(dirPath).isDirectory();\n  });\n\n  const allPRs: ArchiveIndexEntry[] = [];\n\n  for (const dir of archiveDirs) {\n    const indexPath = path.join(archiveDir, dir, 'index.json');\n\n    if (fs.existsSync(indexPath)) {\n      try {\n        const indexContent = fs.readFileSync(indexPath, 'utf8');\n        const index: ArchiveIndex = JSON.parse(indexContent);\n        allPRs.push(...index.prs);\n      } catch (error) {\n        console.warn(`Failed to read index for archive ${dir}: ${error}`);\n      }\n    }\n  }\n\n  // Apply search filter if provided\n  if (searchQuery) {\n    const query = searchQuery.toLowerCase();\n    return allPRs.filter(\n      (pr) =>\n        pr.prId.toLowerCase().includes(query) ||\n        pr.title.toLowerCase().includes(query) ||\n        pr.assignee.toLowerCase().includes(query)\n    );\n  }\n\n  return allPRs;\n}\n\nasync function restorePR(\n  prId: string,\n  targetStatus: string,\n  _statusManager: PRStatusManager,\n  fileManager: PRFileManager,\n  configManager: ConfigManager\n): Promise<{ success: boolean; restoredPath?: string; errors: string[] }> {\n  const result = {\n    success: false,\n    restoredPath: undefined as string | undefined,\n    errors: [] as string[],\n  };\n\n  try {\n    // Find archived PR\n    const archivedPRs = await listArchivedPRs(configManager);\n    const archivedPR = archivedPRs.find((pr) => pr.prId === prId);\n\n    if (!archivedPR) {\n      result.errors.push(`Archived PR ${prId} not found`);\n      return result;\n    }\n\n    // Determine restore path\n    const basePRsDir = configManager.getPRsDirectory();\n    const targetDir = fileManager.getPRDirectory(targetStatus as PRStatus, basePRsDir);\n    const fileName = path.basename(archivedPR.archivePath);\n    const restorePath = path.join(targetDir, fileName);\n\n    // Find archive file\n    const archiveDir = path.join(basePRsDir, 'archive');\n    const archiveDirs = fs.readdirSync(archiveDir).filter((dir) => {\n      const dirPath = path.join(archiveDir, dir);\n      return fs.statSync(dirPath).isDirectory();\n    });\n\n    let sourcePath: string | undefined;\n\n    for (const dir of archiveDirs) {\n      const candidatePath = path.join(archiveDir, dir, archivedPR.archivePath);\n      if (fs.existsSync(candidatePath)) {\n        sourcePath = candidatePath;\n        break;\n      }\n    }\n\n    if (!sourcePath) {\n      result.errors.push(`Archive file for PR ${prId} not found`);\n      return result;\n    }\n\n    // Restore file\n    if (!fs.existsSync(targetDir)) {\n      fs.mkdirSync(targetDir, { recursive: true });\n    }\n\n    fs.copyFileSync(sourcePath, restorePath);\n\n    result.success = true;\n    result.restoredPath = restorePath;\n\n    return result;\n  } catch (error) {\n    result.errors.push(`Restore failed: ${error instanceof Error ? error.message : String(error)}`);\n    return result;\n  }\n}\n\nasync function cleanupArchive(\n  olderThanDays: number,\n  force: boolean,\n  configManager: ConfigManager\n): Promise<{ success: boolean; removedCount: number; freedSpace: number; errors: string[] }> {\n  const result = {\n    success: false,\n    removedCount: 0,\n    freedSpace: 0,\n    errors: [] as string[],\n  };\n\n  try {\n    const archiveDir = path.join(configManager.getPRsDirectory(), 'archive');\n\n    if (!fs.existsSync(archiveDir)) {\n      result.success = true;\n      return result;\n    }\n\n    const cutoffDate = new Date();\n    cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);\n\n    const archiveDirs = fs.readdirSync(archiveDir).filter((dir) => {\n      const dirPath = path.join(archiveDir, dir);\n      return fs.statSync(dirPath).isDirectory();\n    });\n\n    for (const dir of archiveDirs) {\n      const dirPath = path.join(archiveDir, dir);\n      const stats = fs.statSync(dirPath);\n\n      if (stats.mtime < cutoffDate) {\n        try {\n          const size = calculateDirectorySize(dirPath);\n\n          if (force || (await confirmCleanup(dir))) {\n            fs.rmSync(dirPath, { recursive: true, force: true });\n            result.removedCount++;\n            result.freedSpace += size;\n          }\n        } catch (error) {\n          result.errors.push(`Failed to remove ${dir}: ${error}`);\n        }\n      }\n    }\n\n    result.success = result.errors.length === 0;\n    return result;\n  } catch (error) {\n    result.errors.push(`Cleanup failed: ${error instanceof Error ? error.message : String(error)}`);\n    return result;\n  }\n}\n\nfunction calculateDirectorySize(dirPath: string): number {\n  let totalSize = 0;\n\n  const items = fs.readdirSync(dirPath);\n\n  for (const item of items) {\n    const itemPath = path.join(dirPath, item);\n    const stats = fs.statSync(itemPath);\n\n    if (stats.isDirectory()) {\n      totalSize += calculateDirectorySize(itemPath);\n    } else {\n      totalSize += stats.size;\n    }\n  }\n\n  return totalSize;\n}\n\nasync function confirmCleanup(_archiveName: string): Promise<boolean> {\n  // This would implement user confirmation prompt\n  // For now, return false to be safe\n  return false;\n}\n\nfunction formatBytes(bytes: number): string {\n  if (bytes === 0) return '0 Bytes';\n\n  const k = 1024;\n  const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n  return `${parseFloat((bytes / k ** i).toFixed(2))} ${sizes[i]}`;\n}\n\nfunction displayArchiveResult(result: ArchiveResult): void {\n  console.log(colors.cyan(`\\n📦 Archive operation completed`));\n  console.log(`📁 Archive path: ${result.archivePath}`);\n  console.log(`📋 Archived PRs: ${result.archivedPRs}`);\n  console.log(`📝 Archived reviews: ${result.archivedReviews}`);\n  console.log(`💾 Size before: ${formatBytes(result.totalSizeBefore)}`);\n  console.log(`💾 Size after: ${formatBytes(result.totalSizeAfter)}`);\n\n  if (result.compressionRatio > 0) {\n    console.log(`📉 Compression: ${(result.compressionRatio * 100).toFixed(1)}%`);\n  }\n\n  if (result.indexPath) {\n    console.log(`📄 Index created: ${result.indexPath}`);\n  }\n\n  if (result.details.length > 0) {\n    console.log('\\n📋 Archive Details:');\n    result.details.forEach((detail) => {\n      const icon = detail.archived ? '✅' : '❌';\n      const color = detail.archived ? colors.green : colors.red;\n      const size = formatBytes(detail.sizeBytes);\n      console.log(color(`${icon} ${detail.prId} (${size})`));\n    });\n  }\n\n  if (result.warnings.length > 0) {\n    console.log(colors.yellow('\\n⚠️  Warnings:'));\n    result.warnings.forEach((warning) => {\n      console.log(colors.yellow(`  - ${warning}`));\n    });\n  }\n\n  if (result.errors.length > 0) {\n    console.log(colors.red('\\n❌ Errors:'));\n    result.errors.forEach((error) => {\n      console.log(colors.red(`  - ${error}`));\n    });\n  }\n\n  const successColor = result.success ? colors.green : colors.red;\n  const successIcon = result.success ? '✅' : '❌';\n  console.log(\n    successColor(`\\n${successIcon} Archive ${result.success ? 'completed successfully' : 'failed'}`)\n  );\n}\n\nfunction displayArchivedPRs(prs: ArchiveIndexEntry[], format: string, _formatter: Formatter): void {\n  if (format === 'json') {\n    console.log(JSON.stringify(prs, null, 2));\n  } else {\n    console.log(colors.blue(`\\n📦 Archived PRs (${prs.length} found)`));\n\n    if (prs.length === 0) {\n      console.log(colors.yellow('No archived PRs found'));\n      return;\n    }\n\n    console.table(\n      prs.map((pr) => ({\n        'PR ID': pr.prId,\n        Title: pr.title.substring(0, 40) + (pr.title.length > 40 ? '...' : ''),\n        Status: pr.status,\n        Assignee: pr.assignee,\n        Created: pr.created.split('T')[0],\n        Size: formatBytes(pr.sizeBytes),\n      }))\n    );\n  }\n}\n\nexport type { ArchiveOptions, ArchiveResult, ArchiveIndex };\n","/**\n * PR Close Command\n * Handles closing pull requests without merging\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { PRData } from '../../types/ai-trackdown.js';\nimport { colors } from '../../utils/colors.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { PRFileManager } from '../../utils/pr-file-manager.js';\nimport { PRStatusManager } from '../../utils/pr-status-manager.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\nexport type CloseReason = 'cancelled' | 'superseded' | 'rejected' | 'duplicate' | 'stale' | 'other';\n\nexport interface CloseOptions {\n  reason: CloseReason;\n  comment?: string;\n  updateLinkedTasks: boolean;\n  updateLinkedIssues: boolean;\n  deleteSourceBranch: boolean;\n  archiveFiles: boolean;\n  notifyReviewers: boolean;\n  addToReport: boolean;\n}\n\nexport interface CloseResult {\n  success: boolean;\n  prId: string;\n  reason: CloseReason;\n  updatedTasks: string[];\n  updatedIssues: string[];\n  archivedFiles: string[];\n  notifications: string[];\n  errors: string[];\n  warnings: string[];\n}\n\nexport function createPRCloseCommand(): Command {\n  const cmd = new Command('close');\n\n  cmd\n    .description('Close a pull request without merging')\n    .argument('<pr-id>', 'Pull request ID to close')\n    .option(\n      '-r, --reason <reason>',\n      'Reason for closing (cancelled|superseded|rejected|duplicate|stale|other)',\n      'cancelled'\n    )\n    .option('-c, --comment <comment>', 'Comment explaining the closure')\n    .option('--update-tasks', 'Update linked tasks with closure info', false)\n    .option('--update-issues', 'Update linked issues with closure info', false)\n    .option('--delete-branch', 'Delete source branch after closing', false)\n    .option('--no-archive', 'Do not archive PR after closing', false)\n    .option('--notify-reviewers', 'Notify reviewers of the closure', false)\n    .option('--add-to-report', 'Add to closure report', false)\n    .option('--force', 'Force close even if PR is approved', false)\n    .option('--dry-run', 'Show what would be done without executing', false)\n    .action(async (prId: string, options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const fileManager = new PRFileManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n      const _formatter = new Formatter();\n\n      const closeOptions: CloseOptions = {\n        reason: options.reason as CloseReason,\n        comment: options.comment,\n        updateLinkedTasks: options.updateTasks,\n        updateLinkedIssues: options.updateIssues,\n        deleteSourceBranch: options.deleteBranch,\n        archiveFiles: !options.noArchive,\n        notifyReviewers: options.notifyReviewers,\n        addToReport: options.addToReport,\n      };\n\n      try {\n        const result = await closePR(\n          prId,\n          closeOptions,\n          statusManager,\n          fileManager,\n          relationshipManager,\n          configManager,\n          options.force,\n          options.dryRun\n        );\n\n        if (options.dryRun) {\n          console.log(colors.yellow('🔍 Dry run - showing what would be done:'));\n          console.log('');\n        }\n\n        if (result.success) {\n          console.log(colors.green(`✅ Successfully closed PR ${prId}`));\n          console.log(`📋 Reason: ${result.reason}`);\n\n          if (result.updatedTasks.length > 0) {\n            console.log(`📝 Updated tasks: ${result.updatedTasks.join(', ')}`);\n          }\n\n          if (result.updatedIssues.length > 0) {\n            console.log(`🎯 Updated issues: ${result.updatedIssues.join(', ')}`);\n          }\n\n          if (result.archivedFiles.length > 0) {\n            console.log(`📁 Archived files: ${result.archivedFiles.length}`);\n          }\n\n          if (result.notifications.length > 0) {\n            console.log(`📬 Notifications sent: ${result.notifications.join(', ')}`);\n          }\n\n          if (result.warnings.length > 0) {\n            console.log(colors.yellow('⚠️  Warnings:'));\n            result.warnings.forEach((warning) => {\n              console.log(colors.yellow(`  - ${warning}`));\n            });\n          }\n        } else {\n          console.error(colors.red(`❌ Failed to close PR ${prId}`));\n          result.errors.forEach((error) => {\n            console.error(colors.red(`  • ${error}`));\n          });\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error closing PR: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function closePR(\n  prId: string,\n  options: CloseOptions,\n  statusManager: PRStatusManager,\n  fileManager: PRFileManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager,\n  force: boolean = false,\n  dryRun: boolean = false\n): Promise<CloseResult> {\n  const result: CloseResult = {\n    success: false,\n    prId,\n    reason: options.reason,\n    updatedTasks: [],\n    updatedIssues: [],\n    archivedFiles: [],\n    notifications: [],\n    errors: [],\n    warnings: [],\n  };\n\n  try {\n    // 1. Load PR data\n    const prData = await statusManager.loadPRData(prId);\n    if (!prData) {\n      result.errors.push(`PR ${prId} not found`);\n      return result;\n    }\n\n    // 2. Validate close reason\n    if (!isValidCloseReason(options.reason)) {\n      result.errors.push(`Invalid close reason: ${options.reason}`);\n      return result;\n    }\n\n    // 3. Check current PR status\n    const statusValidation = validatePRStatusForClose(prData, force);\n    if (!statusValidation.valid) {\n      result.errors.push(...statusValidation.errors);\n      return result;\n    }\n\n    // 4. Add warnings for significant closures\n    if (statusValidation.warnings.length > 0) {\n      result.warnings.push(...statusValidation.warnings);\n    }\n\n    // 5. Update PR status and move to closed directory\n    if (!dryRun) {\n      await statusManager.updatePRStatus(prId, 'closed');\n      const basePRsDir = configManager.getPRsDirectory();\n      const moveResult = await fileManager.movePRToStatusDirectory(prData, 'closed', basePRsDir);\n      if (moveResult.moved) {\n        result.archivedFiles.push(moveResult.newPath);\n      }\n    }\n\n    // 6. Update linked tasks and issues\n    if (options.updateLinkedTasks) {\n      const linkedTasks = await relationshipManager.getLinkedTasks(prId);\n\n      if (!dryRun) {\n        for (const taskId of linkedTasks) {\n          await updateTaskForClose(taskId, prId, options, configManager);\n          result.updatedTasks.push(taskId);\n        }\n      } else {\n        result.updatedTasks = linkedTasks;\n      }\n    }\n\n    if (options.updateLinkedIssues) {\n      const linkedIssues = await relationshipManager.getLinkedIssues(prId);\n\n      if (!dryRun) {\n        for (const issueId of linkedIssues) {\n          await updateIssueForClose(issueId, prId, options, configManager);\n          result.updatedIssues.push(issueId);\n        }\n      } else {\n        result.updatedIssues = linkedIssues;\n      }\n    }\n\n    // 7. Notify reviewers if requested\n    if (options.notifyReviewers && prData.reviewers) {\n      if (!dryRun) {\n        for (const reviewer of prData.reviewers) {\n          await notifyReviewer(reviewer, prId, options);\n          result.notifications.push(reviewer);\n        }\n      } else {\n        result.notifications = prData.reviewers;\n      }\n    }\n\n    // 8. Add to closure report if requested\n    if (options.addToReport) {\n      if (!dryRun) {\n        await addToClosureReport(prData, options, configManager);\n      }\n      result.warnings.push('Added to closure report');\n    }\n\n    // 9. Create closure activity log\n    if (!dryRun) {\n      await createClosureActivityLog(prData, options, result);\n    }\n\n    // 10. Update PR with closure information\n    if (!dryRun) {\n      await updatePRWithClosureInfo(prData, options, configManager);\n    }\n\n    result.success = true;\n    return result;\n  } catch (error) {\n    result.errors.push(\n      `Close operation failed: ${error instanceof Error ? error.message : String(error)}`\n    );\n    return result;\n  }\n}\n\nfunction isValidCloseReason(reason: string): reason is CloseReason {\n  return ['cancelled', 'superseded', 'rejected', 'duplicate', 'stale', 'other'].includes(reason);\n}\n\nfunction validatePRStatusForClose(\n  prData: PRData,\n  force: boolean\n): {\n  valid: boolean;\n  errors: string[];\n  warnings: string[];\n} {\n  const errors: string[] = [];\n  const warnings: string[] = [];\n\n  // Check if PR is already closed\n  if (prData.pr_status === 'closed') {\n    errors.push('PR is already closed');\n  }\n\n  // Check if PR is already merged\n  if (prData.pr_status === 'merged') {\n    errors.push('PR is already merged and cannot be closed');\n  }\n\n  // Warn about closing approved PRs\n  if (prData.pr_status === 'approved' && !force) {\n    warnings.push('PR is approved - consider merging instead of closing');\n  }\n\n  // Warn about closing PRs with approvals\n  if (prData.approvals && prData.approvals.length > 0 && !force) {\n    warnings.push(`PR has ${prData.approvals.length} approval(s) - closing will discard them`);\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n    warnings,\n  };\n}\n\nasync function updateTaskForClose(\n  taskId: string,\n  prId: string,\n  options: CloseOptions,\n  configManager: ConfigManager\n): Promise<void> {\n  try {\n    const tasksDir = configManager.getTasksDirectory();\n    const taskFiles = fs.readdirSync(tasksDir).filter((file) => file.includes(taskId));\n\n    if (taskFiles.length === 0) {\n      console.warn(`Task ${taskId} not found in ${tasksDir}`);\n      return;\n    }\n\n    const taskFile = taskFiles[0];\n    const taskPath = path.join(tasksDir, taskFile);\n    const taskContent = fs.readFileSync(taskPath, 'utf8');\n\n    // Update task content with closure information\n    const updatedContent = taskContent.replace(\n      /updated_date:\\s*[^\\n]+/,\n      `updated_date: ${new Date().toISOString()}`\n    );\n\n    // Add closure note\n    const closureNote = `\\n\\n## PR Closed\\n\\nPR ${prId} was closed (${options.reason})${options.comment ? `: ${options.comment}` : ''}.\\n\\nThis task may need attention or reassignment.\\n`;\n    const finalContent = updatedContent + closureNote;\n\n    fs.writeFileSync(taskPath, finalContent, 'utf8');\n  } catch (error) {\n    console.error(`Failed to update task ${taskId}: ${error}`);\n  }\n}\n\nasync function updateIssueForClose(\n  issueId: string,\n  prId: string,\n  options: CloseOptions,\n  configManager: ConfigManager\n): Promise<void> {\n  try {\n    const issuesDir = configManager.getIssuesDirectory();\n    const issueFiles = fs.readdirSync(issuesDir).filter((file) => file.includes(issueId));\n\n    if (issueFiles.length === 0) {\n      console.warn(`Issue ${issueId} not found in ${issuesDir}`);\n      return;\n    }\n\n    const issueFile = issueFiles[0];\n    const issuePath = path.join(issuesDir, issueFile);\n    const issueContent = fs.readFileSync(issuePath, 'utf8');\n\n    // Update issue content with closure information\n    const updatedContent = issueContent.replace(\n      /updated_date:\\s*[^\\n]+/,\n      `updated_date: ${new Date().toISOString()}`\n    );\n\n    // Add closure note\n    const closureNote = `\\n\\n## PR Closed\\n\\nPR ${prId} was closed (${options.reason})${options.comment ? `: ${options.comment}` : ''}.\\n\\nThis issue may need a new PR or different approach.\\n`;\n    const finalContent = updatedContent + closureNote;\n\n    fs.writeFileSync(issuePath, finalContent, 'utf8');\n  } catch (error) {\n    console.error(`Failed to update issue ${issueId}: ${error}`);\n  }\n}\n\nasync function notifyReviewer(\n  reviewer: string,\n  prId: string,\n  options: CloseOptions\n): Promise<void> {\n  // This would send notifications to reviewers\n  // Implementation depends on notification system\n  console.log(`Notifying ${reviewer} about PR ${prId} closure (${options.reason})`);\n}\n\nasync function addToClosureReport(\n  prData: PRData,\n  options: CloseOptions,\n  configManager: ConfigManager\n): Promise<void> {\n  const reportEntry = {\n    timestamp: new Date().toISOString(),\n    pr_id: prData.pr_id,\n    title: prData.title,\n    reason: options.reason,\n    comment: options.comment,\n    author: prData.assignee,\n    reviewers: prData.reviewers,\n    approvals: prData.approvals,\n  };\n\n  // This would append to a closure report file\n  const reportsDir = path.join(configManager.getPRsDirectory(), 'reports');\n  if (!fs.existsSync(reportsDir)) {\n    fs.mkdirSync(reportsDir, { recursive: true });\n  }\n\n  const reportPath = path.join(reportsDir, 'closure-report.json');\n  let reports: any[] = [];\n\n  if (fs.existsSync(reportPath)) {\n    const reportContent = fs.readFileSync(reportPath, 'utf8');\n    reports = JSON.parse(reportContent);\n  }\n\n  reports.push(reportEntry);\n  fs.writeFileSync(reportPath, JSON.stringify(reports, null, 2), 'utf8');\n}\n\nasync function createClosureActivityLog(\n  prData: PRData,\n  options: CloseOptions,\n  result: CloseResult\n): Promise<void> {\n  const logEntry = {\n    timestamp: new Date().toISOString(),\n    action: 'closed',\n    pr_id: prData.pr_id,\n    reason: options.reason,\n    comment: options.comment,\n    updated_tasks: result.updatedTasks,\n    updated_issues: result.updatedIssues,\n    archived_files: result.archivedFiles,\n    notifications: result.notifications,\n  };\n\n  // This would append to an activity log file\n  console.log('Closure activity logged:', JSON.stringify(logEntry, null, 2));\n}\n\nasync function updatePRWithClosureInfo(\n  prData: PRData,\n  options: CloseOptions,\n  _configManager: ConfigManager\n): Promise<void> {\n  try {\n    const prContent = fs.readFileSync(prData.file_path, 'utf8');\n\n    // Update PR content with closure information\n    const updatedContent = prContent\n      .replace(/pr_status:\\s*\\w+/, 'pr_status: closed')\n      .replace(/updated_date:\\s*[^\\n]+/, `updated_date: ${new Date().toISOString()}`);\n\n    // Add closure section\n    const closureSection = `\\n\\n## PR Closed\\n\\n**Reason**: ${options.reason}\\n${options.comment ? `**Comment**: ${options.comment}\\n` : ''}**Closed**: ${new Date().toISOString()}\\n`;\n    const finalContent = updatedContent + closureSection;\n\n    fs.writeFileSync(prData.file_path, finalContent, 'utf8');\n  } catch (error) {\n    console.error(`Failed to update PR ${prData.pr_id} with closure info: ${error}`);\n  }\n}\n\nexport { closePR, type CloseOptions, type CloseResult };\n","/**\n * PR Merge Command\n * Handles merging pull requests with multiple strategies and validation\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { PRData } from '../../types/ai-trackdown.js';\nimport { colors } from '../../utils/colors.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { PRFileManager } from '../../utils/pr-file-manager.js';\nimport { PRStatusManager } from '../../utils/pr-status-manager.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\nexport type MergeStrategy = 'merge' | 'squash' | 'rebase';\n\nexport interface MergeOptions {\n  strategy: MergeStrategy;\n  message?: string;\n  closeLinkedTasks: boolean;\n  deleteSourceBranch: boolean;\n  requireApproval: boolean;\n  runPreMergeChecks: boolean;\n  autoArchive: boolean;\n  updateMilestone: boolean;\n}\n\nexport interface MergeResult {\n  success: boolean;\n  prId: string;\n  strategy: MergeStrategy;\n  mergeCommit?: string;\n  updatedTasks: string[];\n  updatedIssues: string[];\n  archivedFiles: string[];\n  errors: string[];\n  warnings: string[];\n}\n\nexport interface PreMergeCheck {\n  name: string;\n  description: string;\n  required: boolean;\n  passed: boolean;\n  message: string;\n}\n\nexport function createPRMergeCommand(): Command {\n  const cmd = new Command('merge');\n\n  cmd\n    .description('Merge a pull request with specified strategy')\n    .argument('<pr-id>', 'Pull request ID to merge')\n    .option('-s, --strategy <strategy>', 'Merge strategy (merge|squash|rebase)', 'merge')\n    .option('-m, --message <message>', 'Custom merge commit message')\n    .option('--close-tasks', 'Close linked tasks after merge', false)\n    .option('--delete-branch', 'Delete source branch after merge', false)\n    .option('--skip-approval', 'Skip approval requirement check', false)\n    .option('--skip-checks', 'Skip pre-merge validation checks', false)\n    .option('--no-archive', 'Do not archive PR after merge', false)\n    .option('--update-milestone', 'Update milestone progress', false)\n    .option('--dry-run', 'Show what would be done without executing', false)\n    .action(async (prId: string, options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const fileManager = new PRFileManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n      const _formatter = new Formatter();\n\n      const mergeOptions: MergeOptions = {\n        strategy: options.strategy as MergeStrategy,\n        message: options.message,\n        closeLinkedTasks: options.closeTasks,\n        deleteSourceBranch: options.deleteBranch,\n        requireApproval: !options.skipApproval,\n        runPreMergeChecks: !options.skipChecks,\n        autoArchive: !options.noArchive,\n        updateMilestone: options.updateMilestone,\n      };\n\n      try {\n        const result = await mergePR(\n          prId,\n          mergeOptions,\n          statusManager,\n          fileManager,\n          relationshipManager,\n          configManager,\n          options.dryRun\n        );\n\n        if (options.dryRun) {\n          console.log(colors.yellow('🔍 Dry run - showing what would be done:'));\n          console.log('');\n        }\n\n        if (result.success) {\n          console.log(colors.green(`✅ Successfully merged PR ${prId}`));\n          console.log(`📋 Strategy: ${result.strategy}`);\n\n          if (result.mergeCommit) {\n            console.log(`🔗 Merge commit: ${result.mergeCommit}`);\n          }\n\n          if (result.updatedTasks.length > 0) {\n            console.log(`📝 Updated tasks: ${result.updatedTasks.join(', ')}`);\n          }\n\n          if (result.updatedIssues.length > 0) {\n            console.log(`🎯 Updated issues: ${result.updatedIssues.join(', ')}`);\n          }\n\n          if (result.archivedFiles.length > 0) {\n            console.log(`📁 Archived files: ${result.archivedFiles.length}`);\n          }\n\n          if (result.warnings.length > 0) {\n            console.log(colors.yellow('⚠️  Warnings:'));\n            result.warnings.forEach((warning) => {\n              console.log(colors.yellow(`  - ${warning}`));\n            });\n          }\n        } else {\n          console.error(colors.red(`❌ Failed to merge PR ${prId}`));\n          result.errors.forEach((error) => {\n            console.error(colors.red(`  • ${error}`));\n          });\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error merging PR: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function mergePR(\n  prId: string,\n  options: MergeOptions,\n  statusManager: PRStatusManager,\n  fileManager: PRFileManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager,\n  dryRun: boolean = false\n): Promise<MergeResult> {\n  const result: MergeResult = {\n    success: false,\n    prId,\n    strategy: options.strategy,\n    updatedTasks: [],\n    updatedIssues: [],\n    archivedFiles: [],\n    errors: [],\n    warnings: [],\n  };\n\n  try {\n    // 1. Load PR data\n    const prData = await statusManager.loadPRData(prId);\n    if (!prData) {\n      result.errors.push(`PR ${prId} not found`);\n      return result;\n    }\n\n    // 2. Validate merge strategy\n    if (!isValidMergeStrategy(options.strategy)) {\n      result.errors.push(`Invalid merge strategy: ${options.strategy}`);\n      return result;\n    }\n\n    // 3. Check current PR status\n    const statusValidation = validatePRStatusForMerge(prData);\n    if (!statusValidation.valid) {\n      result.errors.push(...statusValidation.errors);\n      return result;\n    }\n\n    // 4. Run pre-merge checks\n    if (options.runPreMergeChecks) {\n      const checkResults = await runPreMergeChecks(prData, options);\n      const failedChecks = checkResults.filter((check) => check.required && !check.passed);\n\n      if (failedChecks.length > 0) {\n        result.errors.push('Required pre-merge checks failed:');\n        failedChecks.forEach((check) => {\n          result.errors.push(`  - ${check.name}: ${check.message}`);\n        });\n        return result;\n      }\n\n      // Add warnings for non-required failed checks\n      checkResults\n        .filter((check) => !check.required && !check.passed)\n        .forEach((check) => {\n          result.warnings.push(`${check.name}: ${check.message}`);\n        });\n    }\n\n    // 5. Perform merge operation\n    if (!dryRun) {\n      const mergeResult = await performMerge(prData, options);\n      if (!mergeResult.success) {\n        result.errors.push(...mergeResult.errors);\n        return result;\n      }\n      result.mergeCommit = mergeResult.mergeCommit;\n    }\n\n    // 6. Update PR status and move to merged directory\n    if (!dryRun) {\n      await statusManager.updatePRStatus(prId, 'merged');\n      const basePRsDir = configManager.getPRsDirectory();\n      const moveResult = await fileManager.movePRToStatusDirectory(prData, 'merged', basePRsDir);\n      if (moveResult.moved) {\n        result.archivedFiles.push(moveResult.newPath);\n      }\n    }\n\n    // 7. Update linked tasks and issues\n    if (options.closeLinkedTasks) {\n      const linkedTasks = await relationshipManager.getLinkedTasks(prId);\n      const linkedIssues = await relationshipManager.getLinkedIssues(prId);\n\n      if (!dryRun) {\n        // Update linked tasks\n        for (const taskId of linkedTasks) {\n          await updateTaskForMerge(taskId, prId, configManager);\n          result.updatedTasks.push(taskId);\n        }\n\n        // Update linked issues\n        for (const issueId of linkedIssues) {\n          await updateIssueForMerge(issueId, prId, configManager);\n          result.updatedIssues.push(issueId);\n        }\n      } else {\n        result.updatedTasks = linkedTasks;\n        result.updatedIssues = linkedIssues;\n      }\n    }\n\n    // 8. Update milestone if requested\n    if (options.updateMilestone && prData.milestone) {\n      if (!dryRun) {\n        await updateMilestoneProgress(prData.milestone, configManager);\n      }\n      result.warnings.push(`Would update milestone: ${prData.milestone}`);\n    }\n\n    // 9. Create merge activity log\n    if (!dryRun) {\n      await createMergeActivityLog(prData, options, result);\n    }\n\n    result.success = true;\n    return result;\n  } catch (error) {\n    result.errors.push(\n      `Merge operation failed: ${error instanceof Error ? error.message : String(error)}`\n    );\n    return result;\n  }\n}\n\nfunction isValidMergeStrategy(strategy: string): strategy is MergeStrategy {\n  return ['merge', 'squash', 'rebase'].includes(strategy);\n}\n\nfunction validatePRStatusForMerge(prData: PRData): { valid: boolean; errors: string[] } {\n  const errors: string[] = [];\n\n  // Check if PR is in a mergeable state\n  if (!['approved', 'open', 'review'].includes(prData.pr_status)) {\n    errors.push(\n      `PR status '${prData.pr_status}' is not mergeable. Must be 'approved', 'open', or 'review'.`\n    );\n  }\n\n  // Check if PR is already merged or closed\n  if (prData.pr_status === 'merged') {\n    errors.push('PR is already merged');\n  }\n\n  if (prData.pr_status === 'closed') {\n    errors.push('PR is closed and cannot be merged');\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n  };\n}\n\nasync function runPreMergeChecks(prData: PRData, options: MergeOptions): Promise<PreMergeCheck[]> {\n  const checks: PreMergeCheck[] = [];\n\n  // Check 1: Approval requirement\n  if (options.requireApproval) {\n    const hasApproval = prData.approvals && prData.approvals.length > 0;\n    checks.push({\n      name: 'Approval Check',\n      description: 'PR must have at least one approval',\n      required: true,\n      passed: hasApproval || false,\n      message: hasApproval ? 'PR has required approvals' : 'PR lacks required approvals',\n    });\n  }\n\n  // Check 2: Review completion\n  const hasReviewers = prData.reviewers && prData.reviewers.length > 0;\n  const allReviewersCompleted =\n    hasReviewers &&\n    prData.reviewers?.every((reviewer) => prData.approvals?.includes(reviewer) || false);\n\n  checks.push({\n    name: 'Review Completion',\n    description: 'All assigned reviewers should have completed their reviews',\n    required: false,\n    passed: !hasReviewers || allReviewersCompleted,\n    message: allReviewersCompleted\n      ? 'All reviews completed'\n      : 'Some reviewers have not completed their reviews',\n  });\n\n  // Check 3: Branch validation\n  checks.push({\n    name: 'Branch Validation',\n    description: 'Source and target branches should be valid',\n    required: true,\n    passed: Boolean(prData.source_branch && prData.target_branch),\n    message:\n      prData.source_branch && prData.target_branch\n        ? 'Branches are valid'\n        : 'Missing branch information',\n  });\n\n  // Check 4: Conflict check (simulated)\n  checks.push({\n    name: 'Merge Conflict Check',\n    description: 'PR should not have merge conflicts',\n    required: true,\n    passed: true, // This would be implemented with actual Git integration\n    message: 'No merge conflicts detected',\n  });\n\n  // Check 5: Linked tasks completion\n  if (options.closeLinkedTasks) {\n    const linkedTasksCompleted = await checkLinkedTasksStatus(prData);\n    checks.push({\n      name: 'Linked Tasks Status',\n      description: 'Linked tasks should be completed if auto-closing',\n      required: false,\n      passed: linkedTasksCompleted,\n      message: linkedTasksCompleted\n        ? 'All linked tasks are completed'\n        : 'Some linked tasks are not completed',\n    });\n  }\n\n  return checks;\n}\n\nasync function checkLinkedTasksStatus(_prData: PRData): Promise<boolean> {\n  // This would check if all linked tasks are completed\n  // For now, we'll return true as a placeholder\n  return true;\n}\n\nasync function performMerge(\n  prData: PRData,\n  options: MergeOptions\n): Promise<{\n  success: boolean;\n  mergeCommit?: string;\n  errors: string[];\n}> {\n  const result = {\n    success: false,\n    mergeCommit: undefined as string | undefined,\n    errors: [] as string[],\n  };\n\n  try {\n    // This would integrate with actual Git operations\n    // For now, we'll simulate the merge\n    const mergeCommit = generateMergeCommit(prData, options);\n\n    // Simulate merge based on strategy\n    switch (options.strategy) {\n      case 'merge':\n        // Create merge commit\n        result.mergeCommit = mergeCommit;\n        break;\n      case 'squash':\n        // Squash commits and merge\n        result.mergeCommit = `squash-${mergeCommit}`;\n        break;\n      case 'rebase':\n        // Rebase and merge\n        result.mergeCommit = `rebase-${mergeCommit}`;\n        break;\n    }\n\n    result.success = true;\n    return result;\n  } catch (error) {\n    result.errors.push(`Merge failed: ${error instanceof Error ? error.message : String(error)}`);\n    return result;\n  }\n}\n\nfunction generateMergeCommit(prData: PRData, options: MergeOptions): string {\n  const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n  const strategy = options.strategy;\n\n  if (options.message) {\n    return `${strategy}-${timestamp}-custom`;\n  }\n\n  return `${strategy}-${timestamp}-${prData.pr_id}`;\n}\n\nasync function updateTaskForMerge(\n  taskId: string,\n  prId: string,\n  configManager: ConfigManager\n): Promise<void> {\n  try {\n    const tasksDir = configManager.getTasksDirectory();\n    const taskFiles = fs.readdirSync(tasksDir).filter((file) => file.includes(taskId));\n\n    if (taskFiles.length === 0) {\n      console.warn(`Task ${taskId} not found in ${tasksDir}`);\n      return;\n    }\n\n    const taskFile = taskFiles[0];\n    const taskPath = path.join(tasksDir, taskFile);\n    const taskContent = fs.readFileSync(taskPath, 'utf8');\n\n    // Update task content to mark as completed due to PR merge\n    const updatedContent = taskContent\n      .replace(/status:\\s*\\w+/, 'status: completed')\n      .replace(/updated_date:\\s*[^\\n]+/, `updated_date: ${new Date().toISOString()}`);\n\n    // Add merge note\n    const mergeNote = `\\n\\n## Completed via PR Merge\\n\\nThis task was automatically completed when PR ${prId} was merged.\\n`;\n    const finalContent = updatedContent + mergeNote;\n\n    fs.writeFileSync(taskPath, finalContent, 'utf8');\n  } catch (error) {\n    console.error(`Failed to update task ${taskId}: ${error}`);\n  }\n}\n\nasync function updateIssueForMerge(\n  issueId: string,\n  prId: string,\n  configManager: ConfigManager\n): Promise<void> {\n  try {\n    const issuesDir = configManager.getIssuesDirectory();\n    const issueFiles = fs.readdirSync(issuesDir).filter((file) => file.includes(issueId));\n\n    if (issueFiles.length === 0) {\n      console.warn(`Issue ${issueId} not found in ${issuesDir}`);\n      return;\n    }\n\n    const issueFile = issueFiles[0];\n    const issuePath = path.join(issuesDir, issueFile);\n    const issueContent = fs.readFileSync(issuePath, 'utf8');\n\n    // Update issue content to reflect PR merge\n    const updatedContent = issueContent.replace(\n      /updated_date:\\s*[^\\n]+/,\n      `updated_date: ${new Date().toISOString()}`\n    );\n\n    // Add merge note\n    const mergeNote = `\\n\\n## PR Merged\\n\\nPR ${prId} has been merged for this issue.\\n`;\n    const finalContent = updatedContent + mergeNote;\n\n    fs.writeFileSync(issuePath, finalContent, 'utf8');\n  } catch (error) {\n    console.error(`Failed to update issue ${issueId}: ${error}`);\n  }\n}\n\nasync function updateMilestoneProgress(\n  milestone: string,\n  _configManager: ConfigManager\n): Promise<void> {\n  // This would update milestone progress tracking\n  // Implementation would depend on milestone tracking system\n  console.log(`Updating milestone progress for: ${milestone}`);\n}\n\nasync function createMergeActivityLog(\n  prData: PRData,\n  options: MergeOptions,\n  result: MergeResult\n): Promise<void> {\n  const logEntry = {\n    timestamp: new Date().toISOString(),\n    action: 'merged',\n    pr_id: prData.pr_id,\n    strategy: options.strategy,\n    merge_commit: result.mergeCommit,\n    updated_tasks: result.updatedTasks,\n    updated_issues: result.updatedIssues,\n    archived_files: result.archivedFiles,\n  };\n\n  // This would append to an activity log file\n  console.log('Merge activity logged:', JSON.stringify(logEntry, null, 2));\n}\n\nexport { mergePR, type MergeOptions, type MergeResult };\n","/**\n * PR Batch Operations Command\n * Handles bulk actions and batch operations on multiple PRs\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { PRData, PRStatus, TaskData } from '../../types/ai-trackdown.js';\nimport { colors } from '../../utils/colors.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { PRFileManager } from '../../utils/pr-file-manager.js';\nimport { PRStatusManager } from '../../utils/pr-status-manager.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\nimport { type CloseOptions, closePR } from './close.js';\nimport { type MergeOptions, mergePR } from './merge.js';\n\nexport type BatchOperation =\n  | 'merge'\n  | 'close'\n  | 'approve'\n  | 'update-status'\n  | 'archive'\n  | 'create-from-tasks';\n\nexport interface BatchOptions {\n  operation: BatchOperation;\n  filter?: PRBatchFilter;\n  dryRun: boolean;\n  maxConcurrency: number;\n  continueOnError: boolean;\n  createReport: boolean;\n  autoApprove: boolean;\n}\n\nexport interface PRBatchFilter {\n  status?: PRStatus | PRStatus[];\n  assignee?: string | string[];\n  reviewer?: string | string[];\n  labels?: string | string[];\n  createdAfter?: string;\n  createdBefore?: string;\n  branch?: string;\n  author?: string;\n  milestone?: string;\n}\n\nexport interface BatchResult {\n  success: boolean;\n  operation: BatchOperation;\n  totalPRs: number;\n  processedPRs: number;\n  successfulPRs: number;\n  failedPRs: number;\n  skippedPRs: number;\n  results: PROperationResult[];\n  errors: string[];\n  warnings: string[];\n  executionTime: number;\n  report?: string;\n}\n\nexport interface PROperationResult {\n  prId: string;\n  success: boolean;\n  action: string;\n  message: string;\n  details?: any;\n  error?: string;\n  warnings?: string[];\n}\n\nexport function createPRBatchCommand(): Command {\n  const cmd = new Command('batch');\n\n  cmd\n    .description('Perform batch operations on multiple PRs')\n    .option(\n      '-o, --operation <operation>',\n      'Batch operation (merge|close|approve|update-status|archive|create-from-tasks)',\n      'merge'\n    )\n    .option('--status <status>', 'Filter by PR status (can be comma-separated)')\n    .option('--assignee <assignee>', 'Filter by assignee')\n    .option('--reviewer <reviewer>', 'Filter by reviewer')\n    .option('--labels <labels>', 'Filter by labels (comma-separated)')\n    .option('--created-after <date>', 'Filter PRs created after date')\n    .option('--created-before <date>', 'Filter PRs created before date')\n    .option('--branch <branch>', 'Filter by branch name')\n    .option('--author <author>', 'Filter by author')\n    .option('--milestone <milestone>', 'Filter by milestone')\n    .option('--max-concurrency <num>', 'Maximum concurrent operations', '5')\n    .option('--continue-on-error', 'Continue processing if one PR fails', false)\n    .option('--create-report', 'Create detailed report of operations', false)\n    .option('--auto-approve', 'Auto-approve operations when applicable', false)\n    .option('--dry-run', 'Show what would be done without executing', false)\n    .action(async (options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const fileManager = new PRFileManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n      const _formatter = new Formatter();\n\n      const batchOptions: BatchOptions = {\n        operation: options.operation as BatchOperation,\n        filter: {\n          status: options.status ? options.status.split(',') : undefined,\n          assignee: options.assignee,\n          reviewer: options.reviewer,\n          labels: options.labels ? options.labels.split(',') : undefined,\n          createdAfter: options.createdAfter,\n          createdBefore: options.createdBefore,\n          branch: options.branch,\n          author: options.author,\n          milestone: options.milestone,\n        },\n        dryRun: options.dryRun,\n        maxConcurrency: parseInt(options.maxConcurrency),\n        continueOnError: options.continueOnError,\n        createReport: options.createReport,\n        autoApprove: options.autoApprove,\n      };\n\n      try {\n        const result = await performBatchOperation(\n          batchOptions,\n          statusManager,\n          fileManager,\n          relationshipManager,\n          configManager\n        );\n\n        if (options.dryRun) {\n          console.log(colors.yellow('🔍 Batch dry run - showing what would be done:'));\n          console.log('');\n        }\n\n        console.log(colors.cyan(`📊 Batch ${result.operation} operation completed`));\n        console.log(`🎯 Total PRs: ${result.totalPRs}`);\n        console.log(`✅ Processed: ${result.processedPRs}`);\n        console.log(`🟢 Successful: ${result.successfulPRs}`);\n        console.log(`🔴 Failed: ${result.failedPRs}`);\n        console.log(`⏭️  Skipped: ${result.skippedPRs}`);\n        console.log(`⏱️  Time: ${result.executionTime}ms`);\n\n        if (result.results.length > 0) {\n          console.log('\\n📋 Operation Results:');\n          result.results.forEach((prResult) => {\n            const icon = prResult.success ? '✅' : '❌';\n            const color = prResult.success ? colors.green : colors.red;\n            console.log(color(`${icon} ${prResult.prId}: ${prResult.message}`));\n\n            if (prResult.warnings && prResult.warnings.length > 0) {\n              prResult.warnings.forEach((warning) => {\n                console.log(colors.yellow(`  ⚠️  ${warning}`));\n              });\n            }\n          });\n        }\n\n        if (result.warnings.length > 0) {\n          console.log(colors.yellow('\\n⚠️  Warnings:'));\n          result.warnings.forEach((warning) => {\n            console.log(colors.yellow(`  - ${warning}`));\n          });\n        }\n\n        if (result.errors.length > 0) {\n          console.log(colors.red('\\n❌ Errors:'));\n          result.errors.forEach((error) => {\n            console.log(colors.red(`  - ${error}`));\n          });\n        }\n\n        if (result.report) {\n          console.log(colors.blue(`\\n📄 Report saved to: ${result.report}`));\n        }\n\n        if (!result.success) {\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Batch operation failed: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function performBatchOperation(\n  options: BatchOptions,\n  statusManager: PRStatusManager,\n  fileManager: PRFileManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<BatchResult> {\n  const startTime = Date.now();\n\n  const result: BatchResult = {\n    success: false,\n    operation: options.operation,\n    totalPRs: 0,\n    processedPRs: 0,\n    successfulPRs: 0,\n    failedPRs: 0,\n    skippedPRs: 0,\n    results: [],\n    errors: [],\n    warnings: [],\n    executionTime: 0,\n  };\n\n  try {\n    // 1. Get PRs matching the filter\n    const allPRs = await statusManager.listPRs();\n    const filteredPRs = filterPRs(allPRs, options.filter);\n\n    result.totalPRs = filteredPRs.length;\n\n    if (filteredPRs.length === 0) {\n      result.warnings.push('No PRs match the specified filter criteria');\n      result.success = true;\n      result.executionTime = Date.now() - startTime;\n      return result;\n    }\n\n    console.log(\n      colors.blue(`🔄 Processing ${filteredPRs.length} PRs with operation: ${options.operation}`)\n    );\n\n    // 2. Perform batch operation based on type\n    switch (options.operation) {\n      case 'merge':\n        await performBatchMerge(\n          filteredPRs,\n          options,\n          result,\n          statusManager,\n          fileManager,\n          relationshipManager,\n          configManager\n        );\n        break;\n      case 'close':\n        await performBatchClose(\n          filteredPRs,\n          options,\n          result,\n          statusManager,\n          fileManager,\n          relationshipManager,\n          configManager\n        );\n        break;\n      case 'approve':\n        await performBatchApprove(filteredPRs, options, result, statusManager, configManager);\n        break;\n      case 'update-status':\n        await performBatchStatusUpdate(\n          filteredPRs,\n          options,\n          result,\n          statusManager,\n          fileManager,\n          configManager\n        );\n        break;\n      case 'archive':\n        await performBatchArchive(filteredPRs, options, result, fileManager, configManager);\n        break;\n      case 'create-from-tasks':\n        await performBatchCreateFromTasks(\n          options,\n          result,\n          statusManager,\n          relationshipManager,\n          configManager\n        );\n        break;\n      default:\n        result.errors.push(`Unknown batch operation: ${options.operation}`);\n        result.executionTime = Date.now() - startTime;\n        return result;\n    }\n\n    // 3. Create report if requested\n    if (options.createReport) {\n      result.report = await createBatchReport(result, options, configManager);\n    }\n\n    result.success = result.failedPRs === 0;\n    result.executionTime = Date.now() - startTime;\n\n    return result;\n  } catch (error) {\n    result.errors.push(\n      `Batch operation failed: ${error instanceof Error ? error.message : String(error)}`\n    );\n    result.executionTime = Date.now() - startTime;\n    return result;\n  }\n}\n\nfunction filterPRs(prs: PRData[], filter?: PRBatchFilter): PRData[] {\n  if (!filter) return prs;\n\n  return prs.filter((pr) => {\n    // Filter by status\n    if (filter.status) {\n      const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n      if (!statuses.includes(pr.pr_status)) return false;\n    }\n\n    // Filter by assignee\n    if (filter.assignee && pr.assignee !== filter.assignee) return false;\n\n    // Filter by reviewer\n    if (filter.reviewer && (!pr.reviewers || !pr.reviewers.includes(filter.reviewer))) return false;\n\n    // Filter by labels\n    if (filter.labels) {\n      const labels = Array.isArray(filter.labels) ? filter.labels : [filter.labels];\n      if (!pr.tags || !labels.some((label) => pr.tags?.includes(label))) return false;\n    }\n\n    // Filter by date range\n    if (filter.createdAfter && new Date(pr.created_date) < new Date(filter.createdAfter))\n      return false;\n    if (filter.createdBefore && new Date(pr.created_date) > new Date(filter.createdBefore))\n      return false;\n\n    // Filter by branch\n    if (filter.branch && pr.source_branch !== filter.branch) return false;\n\n    // Filter by author\n    if (filter.author && pr.assignee !== filter.author) return false;\n\n    // Filter by milestone\n    if (filter.milestone && pr.milestone !== filter.milestone) return false;\n\n    return true;\n  });\n}\n\nasync function performBatchMerge(\n  prs: PRData[],\n  options: BatchOptions,\n  result: BatchResult,\n  statusManager: PRStatusManager,\n  fileManager: PRFileManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<void> {\n  const mergeOptions: MergeOptions = {\n    strategy: 'merge',\n    closeLinkedTasks: true,\n    deleteSourceBranch: false,\n    requireApproval: !options.autoApprove,\n    runPreMergeChecks: true,\n    autoArchive: true,\n    updateMilestone: false,\n  };\n\n  for (const pr of prs) {\n    try {\n      // Skip if not in mergeable state\n      if (!['approved', 'open', 'review'].includes(pr.pr_status)) {\n        result.skippedPRs++;\n        result.results.push({\n          prId: pr.pr_id,\n          success: false,\n          action: 'merge',\n          message: `Skipped - PR status '${pr.pr_status}' is not mergeable`,\n        });\n        continue;\n      }\n\n      const mergeResult = await mergePR(\n        pr.pr_id,\n        mergeOptions,\n        statusManager,\n        fileManager,\n        relationshipManager,\n        configManager,\n        options.dryRun\n      );\n\n      result.processedPRs++;\n\n      if (mergeResult.success) {\n        result.successfulPRs++;\n        result.results.push({\n          prId: pr.pr_id,\n          success: true,\n          action: 'merge',\n          message: `Merged successfully with strategy: ${mergeResult.strategy}`,\n          details: mergeResult,\n          warnings: mergeResult.warnings,\n        });\n      } else {\n        result.failedPRs++;\n        result.results.push({\n          prId: pr.pr_id,\n          success: false,\n          action: 'merge',\n          message: `Merge failed: ${mergeResult.errors.join(', ')}`,\n          error: mergeResult.errors.join(', '),\n        });\n\n        if (!options.continueOnError) {\n          break;\n        }\n      }\n    } catch (error) {\n      result.failedPRs++;\n      result.results.push({\n        prId: pr.pr_id,\n        success: false,\n        action: 'merge',\n        message: `Merge failed with error`,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      if (!options.continueOnError) {\n        break;\n      }\n    }\n  }\n}\n\nasync function performBatchClose(\n  prs: PRData[],\n  options: BatchOptions,\n  result: BatchResult,\n  statusManager: PRStatusManager,\n  fileManager: PRFileManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<void> {\n  const closeOptions: CloseOptions = {\n    reason: 'stale',\n    updateLinkedTasks: true,\n    updateLinkedIssues: true,\n    deleteSourceBranch: false,\n    archiveFiles: true,\n    notifyReviewers: false,\n    addToReport: true,\n  };\n\n  for (const pr of prs) {\n    try {\n      // Skip if already closed or merged\n      if (['closed', 'merged'].includes(pr.pr_status)) {\n        result.skippedPRs++;\n        result.results.push({\n          prId: pr.pr_id,\n          success: false,\n          action: 'close',\n          message: `Skipped - PR is already ${pr.pr_status}`,\n        });\n        continue;\n      }\n\n      const closeResult = await closePR(\n        pr.pr_id,\n        closeOptions,\n        statusManager,\n        fileManager,\n        relationshipManager,\n        configManager,\n        false,\n        options.dryRun\n      );\n\n      result.processedPRs++;\n\n      if (closeResult.success) {\n        result.successfulPRs++;\n        result.results.push({\n          prId: pr.pr_id,\n          success: true,\n          action: 'close',\n          message: `Closed successfully with reason: ${closeResult.reason}`,\n          details: closeResult,\n          warnings: closeResult.warnings,\n        });\n      } else {\n        result.failedPRs++;\n        result.results.push({\n          prId: pr.pr_id,\n          success: false,\n          action: 'close',\n          message: `Close failed: ${closeResult.errors.join(', ')}`,\n          error: closeResult.errors.join(', '),\n        });\n\n        if (!options.continueOnError) {\n          break;\n        }\n      }\n    } catch (error) {\n      result.failedPRs++;\n      result.results.push({\n        prId: pr.pr_id,\n        success: false,\n        action: 'close',\n        message: `Close failed with error`,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      if (!options.continueOnError) {\n        break;\n      }\n    }\n  }\n}\n\nasync function performBatchApprove(\n  prs: PRData[],\n  options: BatchOptions,\n  result: BatchResult,\n  statusManager: PRStatusManager,\n  _configManager: ConfigManager\n): Promise<void> {\n  for (const pr of prs) {\n    try {\n      // Skip if not in reviewable state\n      if (!['open', 'review'].includes(pr.pr_status)) {\n        result.skippedPRs++;\n        result.results.push({\n          prId: pr.pr_id,\n          success: false,\n          action: 'approve',\n          message: `Skipped - PR status '${pr.pr_status}' is not reviewable`,\n        });\n        continue;\n      }\n\n      if (!options.dryRun) {\n        await statusManager.updatePRStatus(pr.pr_id, 'approved');\n      }\n\n      result.processedPRs++;\n      result.successfulPRs++;\n      result.results.push({\n        prId: pr.pr_id,\n        success: true,\n        action: 'approve',\n        message: 'Approved successfully',\n      });\n    } catch (error) {\n      result.failedPRs++;\n      result.results.push({\n        prId: pr.pr_id,\n        success: false,\n        action: 'approve',\n        message: `Approve failed with error`,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      if (!options.continueOnError) {\n        break;\n      }\n    }\n  }\n}\n\nasync function performBatchStatusUpdate(\n  prs: PRData[],\n  _options: BatchOptions,\n  result: BatchResult,\n  _statusManager: PRStatusManager,\n  _fileManager: PRFileManager,\n  _configManager: ConfigManager\n): Promise<void> {\n  // This would update PR status based on additional criteria\n  // For now, it's a placeholder\n  for (const pr of prs) {\n    result.skippedPRs++;\n    result.results.push({\n      prId: pr.pr_id,\n      success: false,\n      action: 'update-status',\n      message: 'Status update operation not implemented',\n    });\n  }\n}\n\nasync function performBatchArchive(\n  prs: PRData[],\n  options: BatchOptions,\n  result: BatchResult,\n  fileManager: PRFileManager,\n  configManager: ConfigManager\n): Promise<void> {\n  const basePRsDir = configManager.getPRsDirectory();\n\n  for (const pr of prs) {\n    try {\n      // Only archive merged or closed PRs\n      if (!['merged', 'closed'].includes(pr.pr_status)) {\n        result.skippedPRs++;\n        result.results.push({\n          prId: pr.pr_id,\n          success: false,\n          action: 'archive',\n          message: `Skipped - PR status '${pr.pr_status}' is not archivable`,\n        });\n        continue;\n      }\n\n      if (!options.dryRun) {\n        const _archiveResult = await fileManager.archiveOldPRs(basePRsDir, 0);\n        // This is a simplified archive - in practice, we'd move specific files\n      }\n\n      result.processedPRs++;\n      result.successfulPRs++;\n      result.results.push({\n        prId: pr.pr_id,\n        success: true,\n        action: 'archive',\n        message: 'Archived successfully',\n      });\n    } catch (error) {\n      result.failedPRs++;\n      result.results.push({\n        prId: pr.pr_id,\n        success: false,\n        action: 'archive',\n        message: `Archive failed with error`,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      if (!options.continueOnError) {\n        break;\n      }\n    }\n  }\n}\n\nasync function performBatchCreateFromTasks(\n  options: BatchOptions,\n  result: BatchResult,\n  statusManager: PRStatusManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<void> {\n  try {\n    // Get completed tasks that don't have PRs\n    const completedTasks = await getCompletedTasksWithoutPRs(configManager);\n\n    for (const task of completedTasks) {\n      try {\n        if (!options.dryRun) {\n          // Create PR from task\n          const prData = await createPRFromTask(task, statusManager, configManager);\n          await relationshipManager.linkPRToTask(prData.pr_id, task.task_id);\n        }\n\n        result.processedPRs++;\n        result.successfulPRs++;\n        result.results.push({\n          prId: `PR-${task.task_id}`,\n          success: true,\n          action: 'create-from-task',\n          message: `Created PR from task: ${task.title}`,\n        });\n      } catch (error) {\n        result.failedPRs++;\n        result.results.push({\n          prId: `PR-${task.task_id}`,\n          success: false,\n          action: 'create-from-task',\n          message: `Failed to create PR from task: ${task.title}`,\n          error: error instanceof Error ? error.message : String(error),\n        });\n\n        if (!options.continueOnError) {\n          break;\n        }\n      }\n    }\n\n    result.totalPRs = completedTasks.length;\n  } catch (error) {\n    result.errors.push(\n      `Failed to create PRs from tasks: ${error instanceof Error ? error.message : String(error)}`\n    );\n  }\n}\n\nasync function getCompletedTasksWithoutPRs(_configManager: ConfigManager): Promise<TaskData[]> {\n  // This would query for completed tasks that don't have associated PRs\n  // For now, return empty array as placeholder\n  return [];\n}\n\nasync function createPRFromTask(\n  task: TaskData,\n  _statusManager: PRStatusManager,\n  _configManager: ConfigManager\n): Promise<PRData> {\n  // This would create a PR from a task\n  // For now, return a mock PR\n  return {\n    pr_id: `PR-${task.task_id}`,\n    title: `PR for ${task.title}`,\n    description: task.description,\n    status: 'active',\n    priority: task.priority,\n    assignee: task.assignee,\n    created_date: new Date().toISOString(),\n    updated_date: new Date().toISOString(),\n    estimated_tokens: 0,\n    actual_tokens: 0,\n    ai_context: [],\n    sync_status: 'local',\n    issue_id: task.issue_id,\n    epic_id: task.epic_id,\n    pr_status: 'draft',\n    content: '',\n    file_path: '',\n  };\n}\n\nasync function createBatchReport(\n  result: BatchResult,\n  options: BatchOptions,\n  configManager: ConfigManager\n): Promise<string> {\n  const reportData = {\n    timestamp: new Date().toISOString(),\n    operation: result.operation,\n    summary: {\n      totalPRs: result.totalPRs,\n      processedPRs: result.processedPRs,\n      successfulPRs: result.successfulPRs,\n      failedPRs: result.failedPRs,\n      skippedPRs: result.skippedPRs,\n      executionTime: result.executionTime,\n    },\n    filter: options.filter,\n    results: result.results,\n    errors: result.errors,\n    warnings: result.warnings,\n  };\n\n  const reportsDir = path.join(configManager.getPRsDirectory(), 'reports');\n  if (!fs.existsSync(reportsDir)) {\n    fs.mkdirSync(reportsDir, { recursive: true });\n  }\n\n  const reportFileName = `batch-${result.operation}-${new Date().toISOString().split('T')[0]}.json`;\n  const reportPath = path.join(reportsDir, reportFileName);\n\n  fs.writeFileSync(reportPath, JSON.stringify(reportData, null, 2), 'utf8');\n\n  return reportPath;\n}\n\nexport { performBatchOperation, type BatchOptions, type BatchResult };\n","/**\n * PR Create Command\n * Creates new PRs using YAML frontmatter system\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { PRFrontmatter, PRStatus, Priority } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\nimport { IdGenerator } from '../../utils/simple-id-generator.js';\n\ninterface CreateOptions {\n  title?: string;\n  issue: string;\n  description?: string;\n  assignee?: string;\n  priority?: Priority;\n  prStatus?: PRStatus;\n  template?: string;\n  estimatedTokens?: number;\n  tags?: string;\n  branchName?: string;\n  sourceBranch?: string;\n  targetBranch?: string;\n  repositoryUrl?: string;\n  reviewers?: string;\n  dependencies?: string;\n  dryRun?: boolean;\n}\n\nexport function createPRCreateCommand(): Command {\n  const cmd = new Command('create');\n\n  cmd\n    .description('Create a new PR within an issue')\n    .argument('[title]', 'PR title (optional if using --title flag)')\n    .option('--title <text>', 'PR title (alternative to positional argument)')\n    .requiredOption('-i, --issue <issue-id>', 'parent issue ID')\n    .option('-d, --description <text>', 'PR description')\n    .option('-a, --assignee <username>', 'assignee username')\n    .option('-p, --priority <level>', 'priority level (low|medium|high|critical)', 'medium')\n    .option(\n      '-s, --pr-status <status>',\n      'initial PR status (draft|open|review|approved|merged|closed)',\n      'draft'\n    )\n    .option('-t, --template <name>', 'template to use', 'default')\n    .option('--estimated-tokens <number>', 'estimated token usage', '0')\n    .option('--tags <tags>', 'comma-separated tags')\n    .option('-b, --branch-name <name>', 'branch name for the PR')\n    .option('--source-branch <name>', 'source branch name')\n    .option('--target-branch <name>', 'target branch name (default: main)')\n    .option('--repository-url <url>', 'repository URL')\n    .option('--reviewers <usernames>', 'comma-separated reviewer usernames')\n    .option('--dependencies <ids>', 'comma-separated dependency IDs')\n    .option('--dry-run', 'show what would be created without creating')\n    .action(async (titleArg: string | undefined, options: CreateOptions) => {\n      try {\n        // Support both positional argument and --title flag\n        const title = titleArg || options.title;\n        if (!title) {\n          throw new Error(\n            'PR title is required. Provide it as a positional argument or use --title flag.'\n          );\n        }\n        await createPR(title, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to create PR: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function createPR(title: string, options: CreateOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n  const parser = new FrontmatterParser();\n  const idGenerator = new IdGenerator();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Validate that the issue exists\n  const issueHierarchy = relationshipManager.getIssueHierarchy(options.issue);\n  if (!issueHierarchy) {\n    throw new Error(`Issue not found: ${options.issue}`);\n  }\n\n  // Generate PR ID\n  const prId = idGenerator.generatePRId(options.issue, title);\n\n  // Get template\n  const template = configManager.getTemplateWithFallback('pr', options.template || 'default');\n  if (!template) {\n    throw new Error(`PR template '${options.template || 'default'}' not found`);\n  }\n\n  // Parse tags, reviewers, and dependencies\n  const tags = options.tags ? options.tags.split(',').map((tag) => tag.trim()) : [];\n  const reviewers = options.reviewers ? options.reviewers.split(',').map((r) => r.trim()) : [];\n  const dependencies = options.dependencies\n    ? options.dependencies.split(',').map((dep) => dep.trim())\n    : [];\n\n  // Create PR frontmatter\n  const now = new Date().toISOString();\n  const prFrontmatter: PRFrontmatter = {\n    pr_id: prId,\n    issue_id: options.issue,\n    epic_id: issueHierarchy.issue.epic_id,\n    title,\n    description: options.description || template.frontmatter_template.description || '',\n    status: 'planning', // Keep base status as 'planning'\n    pr_status: options.prStatus || 'draft',\n    priority: options.priority || 'medium',\n    assignee: options.assignee || config.default_assignee || 'unassigned',\n    created_date: now,\n    updated_date: now,\n    estimated_tokens: parseInt(options.estimatedTokens || '0', 10),\n    actual_tokens: 0,\n    ai_context: template.ai_context_defaults || config.ai_context_templates || [],\n    sync_status: 'local',\n    branch_name: options.branchName,\n    source_branch: options.sourceBranch,\n    target_branch: options.targetBranch || 'main',\n    repository_url: options.repositoryUrl,\n    reviewers: reviewers.length > 0 ? reviewers : undefined,\n    approvals: [],\n    tags: tags.length > 0 ? tags : undefined,\n    dependencies: dependencies.length > 0 ? dependencies : undefined,\n    blocked_by: [],\n    blocks: [],\n    related_prs: [],\n    template_used: options.template || 'default',\n  };\n\n  // Generate content from template\n  const content = template.content_template\n    .replace(/\\{\\{title\\}\\}/g, title)\n    .replace(/\\{\\{description\\}\\}/g, prFrontmatter.description)\n    .replace(/\\{\\{issue_id\\}\\}/g, options.issue)\n    .replace(/\\{\\{branch_name\\}\\}/g, prFrontmatter.branch_name || '')\n    .replace(/\\{\\{target_branch\\}\\}/g, prFrontmatter.target_branch || 'main');\n\n  // Create filename\n  const filename = `${prId}-${title.toLowerCase().replace(/[^a-z0-9]+/g, '-')}${config.naming_conventions.file_extension}`;\n  const filePath = path.join(paths.prsDir, filename);\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - PR would be created with:'));\n    console.log(Formatter.debug(`File: ${filePath}`));\n    console.log(Formatter.debug(`PR ID: ${prId}`));\n    console.log(Formatter.debug(`Issue ID: ${options.issue}`));\n    console.log(Formatter.debug(`Epic ID: ${issueHierarchy.issue.epic_id}`));\n    console.log(Formatter.debug(`Title: ${title}`));\n    console.log(Formatter.debug(`PR Status: ${prFrontmatter.pr_status}`));\n    console.log(Formatter.debug(`Priority: ${prFrontmatter.priority}`));\n    console.log(Formatter.debug(`Assignee: ${prFrontmatter.assignee}`));\n    console.log(Formatter.debug(`Target Branch: ${prFrontmatter.target_branch}`));\n    if (prFrontmatter.branch_name) {\n      console.log(Formatter.debug(`Branch Name: ${prFrontmatter.branch_name}`));\n    }\n    if (tags.length > 0) {\n      console.log(Formatter.debug(`Tags: ${tags.join(', ')}`));\n    }\n    if (reviewers.length > 0) {\n      console.log(Formatter.debug(`Reviewers: ${reviewers.join(', ')}`));\n    }\n    if (dependencies.length > 0) {\n      console.log(Formatter.debug(`Dependencies: ${dependencies.join(', ')}`));\n    }\n    return;\n  }\n\n  // Check if file already exists\n  if (fs.existsSync(filePath)) {\n    throw new Error(`PR file already exists: ${filePath}`);\n  }\n\n  // Write the PR file\n  parser.writePR(filePath, prFrontmatter, content);\n\n  // Update the issue's related PRs\n  const issue = issueHierarchy.issue;\n  const updatedRelatedPRs = [...(issue.related_prs || []), prId];\n  parser.updateFile(issue.file_path, { related_prs: updatedRelatedPRs });\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`PR created successfully!`));\n  console.log(Formatter.info(`PR ID: ${prId}`));\n  console.log(Formatter.info(`Issue ID: ${options.issue}`));\n  console.log(Formatter.info(`Epic ID: ${issueHierarchy.issue.epic_id}`));\n  console.log(Formatter.info(`File: ${filePath}`));\n  console.log(Formatter.info(`Title: ${title}`));\n  console.log(Formatter.info(`PR Status: ${prFrontmatter.pr_status}`));\n  console.log(Formatter.info(`Priority: ${prFrontmatter.priority}`));\n  console.log(Formatter.info(`Assignee: ${prFrontmatter.assignee}`));\n  console.log(Formatter.info(`Target Branch: ${prFrontmatter.target_branch}`));\n\n  if (prFrontmatter.branch_name) {\n    console.log(Formatter.info(`Branch Name: ${prFrontmatter.branch_name}`));\n  }\n\n  if (tags.length > 0) {\n    console.log(Formatter.info(`Tags: ${tags.join(', ')}`));\n  }\n\n  if (reviewers.length > 0) {\n    console.log(Formatter.info(`Reviewers: ${reviewers.join(', ')}`));\n  }\n\n  if (dependencies.length > 0) {\n    console.log(Formatter.info(`Dependencies: ${dependencies.join(', ')}`));\n  }\n\n  if (options.repositoryUrl) {\n    console.log(Formatter.info(`Repository: ${options.repositoryUrl}`));\n  }\n\n  console.log('');\n  console.log(Formatter.success(`PR added to issue \"${issue.title}\"`));\n}\n","/**\n * PR Dependencies Management Command\n * Handles PR blocking relationships and dependency management\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { PRData } from '../../types/ai-trackdown.js';\nimport { colors } from '../../utils/colors.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { PRStatusManager } from '../../utils/pr-status-manager.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\nexport type DependencyType = 'blocks' | 'blocked_by' | 'depends_on' | 'required_by';\n\nexport interface DependencyRelation {\n  prId: string;\n  dependentPrId: string;\n  type: DependencyType;\n  reason?: string;\n  created: string;\n  createdBy: string;\n  resolved?: string;\n  resolvedBy?: string;\n}\n\nexport interface DependencyGraph {\n  prId: string;\n  blocks: string[];\n  blockedBy: string[];\n  dependsOn: string[];\n  requiredBy: string[];\n  canMerge: boolean;\n  blockingReasons: string[];\n}\n\nexport interface DependencyValidationResult {\n  valid: boolean;\n  errors: string[];\n  warnings: string[];\n  circularDependencies: string[][];\n  unresolvedDependencies: string[];\n}\n\nexport function createPRDependenciesCommand(): Command {\n  const cmd = new Command('deps');\n\n  cmd.description('Manage PR dependencies and blocking relationships');\n\n  // Add dependency\n  cmd\n    .command('add')\n    .description('Add a dependency relationship between PRs')\n    .argument('<pr-id>', 'PR ID that has the dependency')\n    .argument('<dependent-pr-id>', 'PR ID that this PR depends on')\n    .option(\n      '-t, --type <type>',\n      'Dependency type (blocks|blocked_by|depends_on|required_by)',\n      'depends_on'\n    )\n    .option('-r, --reason <reason>', 'Reason for the dependency')\n    .action(async (prId: string, dependentPrId: string, options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n\n      try {\n        const result = await addDependency(\n          prId,\n          dependentPrId,\n          options.type as DependencyType,\n          options.reason,\n          statusManager,\n          relationshipManager,\n          configManager\n        );\n\n        if (result.success) {\n          console.log(\n            colors.green(`✅ Added dependency: ${prId} ${options.type} ${dependentPrId}`)\n          );\n          if (options.reason) {\n            console.log(`📝 Reason: ${options.reason}`);\n          }\n          if (result.warnings.length > 0) {\n            console.log(colors.yellow('⚠️  Warnings:'));\n            result.warnings.forEach((warning) => console.log(colors.yellow(`  - ${warning}`)));\n          }\n        } else {\n          console.error(colors.red(`❌ Failed to add dependency`));\n          result.errors.forEach((error) => console.error(colors.red(`  • ${error}`)));\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error adding dependency: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  // Remove dependency\n  cmd\n    .command('remove')\n    .description('Remove a dependency relationship between PRs')\n    .argument('<pr-id>', 'PR ID')\n    .argument('<dependent-pr-id>', 'Dependent PR ID')\n    .option(\n      '-t, --type <type>',\n      'Dependency type to remove (blocks|blocked_by|depends_on|required_by)'\n    )\n    .action(async (prId: string, dependentPrId: string, options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n\n      try {\n        const result = await removeDependency(\n          prId,\n          dependentPrId,\n          options.type as DependencyType,\n          statusManager,\n          relationshipManager,\n          configManager\n        );\n\n        if (result.success) {\n          console.log(\n            colors.green(`✅ Removed dependency: ${prId} ${options.type || 'all'} ${dependentPrId}`)\n          );\n        } else {\n          console.error(colors.red(`❌ Failed to remove dependency`));\n          result.errors.forEach((error) => console.error(colors.red(`  • ${error}`)));\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error removing dependency: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  // List dependencies\n  cmd\n    .command('list')\n    .description('List PR dependencies')\n    .argument('<pr-id>', 'PR ID to show dependencies for')\n    .option('-a, --all', 'Show all dependencies in the project', false)\n    .option('-f, --format <format>', 'Output format (table|json|graph)', 'table')\n    .action(async (prId: string, options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n      const formatter = new Formatter();\n\n      try {\n        if (options.all) {\n          const allDependencies = await getAllDependencies(\n            statusManager,\n            relationshipManager,\n            configManager\n          );\n          displayDependencies(allDependencies, options.format, formatter);\n        } else {\n          const dependencies = await getPRDependencies(\n            prId,\n            statusManager,\n            relationshipManager,\n            configManager\n          );\n          displayPRDependencies(dependencies, options.format, formatter);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error listing dependencies: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  // Validate dependencies\n  cmd\n    .command('validate')\n    .description('Validate PR dependencies for circular references and conflicts')\n    .option('-f, --fix', 'Attempt to fix validation issues', false)\n    .action(async (options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n\n      try {\n        const result = await validateDependencies(\n          statusManager,\n          relationshipManager,\n          configManager\n        );\n\n        if (result.valid) {\n          console.log(colors.green('✅ All PR dependencies are valid'));\n        } else {\n          console.log(colors.red('❌ PR dependency validation failed'));\n\n          if (result.errors.length > 0) {\n            console.log(colors.red('\\nErrors:'));\n            result.errors.forEach((error) => console.log(colors.red(`  • ${error}`)));\n          }\n\n          if (result.circularDependencies.length > 0) {\n            console.log(colors.red('\\nCircular Dependencies:'));\n            result.circularDependencies.forEach((cycle) => {\n              console.log(colors.red(`  • ${cycle.join(' → ')}`));\n            });\n          }\n\n          if (result.unresolvedDependencies.length > 0) {\n            console.log(colors.yellow('\\nUnresolved Dependencies:'));\n            result.unresolvedDependencies.forEach((dep) => {\n              console.log(colors.yellow(`  • ${dep}`));\n            });\n          }\n\n          if (result.warnings.length > 0) {\n            console.log(colors.yellow('\\nWarnings:'));\n            result.warnings.forEach((warning) => console.log(colors.yellow(`  • ${warning}`)));\n          }\n\n          if (options.fix) {\n            console.log(colors.blue('\\n🔧 Attempting to fix issues...'));\n            const fixResult = await fixDependencyIssues(\n              result,\n              statusManager,\n              relationshipManager,\n              configManager\n            );\n            if (fixResult.success) {\n              console.log(colors.green('✅ Issues fixed successfully'));\n            } else {\n              console.log(colors.red('❌ Failed to fix some issues'));\n              fixResult.errors.forEach((error) => console.log(colors.red(`  • ${error}`)));\n            }\n          }\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error validating dependencies: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  // Check if PR can be merged\n  cmd\n    .command('check-merge')\n    .description('Check if a PR can be merged based on dependencies')\n    .argument('<pr-id>', 'PR ID to check')\n    .action(async (prId: string) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n\n      try {\n        const result = await checkMergeability(\n          prId,\n          statusManager,\n          relationshipManager,\n          configManager\n        );\n\n        if (result.canMerge) {\n          console.log(colors.green(`✅ PR ${prId} can be merged`));\n        } else {\n          console.log(colors.red(`❌ PR ${prId} cannot be merged`));\n          console.log(colors.red('Blocking reasons:'));\n          result.blockingReasons.forEach((reason) => {\n            console.log(colors.red(`  • ${reason}`));\n          });\n        }\n\n        if (result.blocks.length > 0) {\n          console.log(colors.blue(`\\n🔒 This PR blocks: ${result.blocks.join(', ')}`));\n        }\n\n        if (result.blockedBy.length > 0) {\n          console.log(colors.yellow(`\\n⏳ This PR is blocked by: ${result.blockedBy.join(', ')}`));\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error checking merge status: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function addDependency(\n  prId: string,\n  dependentPrId: string,\n  type: DependencyType,\n  reason: string | undefined,\n  statusManager: PRStatusManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<{ success: boolean; errors: string[]; warnings: string[] }> {\n  const result = {\n    success: false,\n    errors: [] as string[],\n    warnings: [] as string[],\n  };\n\n  try {\n    // Validate both PRs exist\n    const pr1 = await statusManager.loadPRData(prId);\n    const pr2 = await statusManager.loadPRData(dependentPrId);\n\n    if (!pr1) {\n      result.errors.push(`PR ${prId} not found`);\n      return result;\n    }\n\n    if (!pr2) {\n      result.errors.push(`PR ${dependentPrId} not found`);\n      return result;\n    }\n\n    // Check for circular dependencies\n    const wouldCreateCircle = await wouldCreateCircularDependency(\n      prId,\n      dependentPrId,\n      type,\n      statusManager,\n      relationshipManager,\n      configManager\n    );\n\n    if (wouldCreateCircle) {\n      result.errors.push(`Adding this dependency would create a circular dependency`);\n      return result;\n    }\n\n    // Add the dependency\n    const dependency: DependencyRelation = {\n      prId,\n      dependentPrId,\n      type,\n      reason,\n      created: new Date().toISOString(),\n      createdBy: 'system', // This would be the current user\n    };\n\n    await saveDependency(dependency, configManager);\n\n    // Update PR files with dependency information\n    await updatePRWithDependency(pr1, dependency, 'outgoing', configManager);\n    await updatePRWithDependency(pr2, dependency, 'incoming', configManager);\n\n    result.success = true;\n\n    // Add warnings for potential issues\n    if (pr1.pr_status === 'merged' || pr2.pr_status === 'merged') {\n      result.warnings.push('One or both PRs are already merged - this dependency may be obsolete');\n    }\n\n    return result;\n  } catch (error) {\n    result.errors.push(\n      `Failed to add dependency: ${error instanceof Error ? error.message : String(error)}`\n    );\n    return result;\n  }\n}\n\nasync function removeDependency(\n  prId: string,\n  dependentPrId: string,\n  type: DependencyType | undefined,\n  _statusManager: PRStatusManager,\n  _relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<{ success: boolean; errors: string[] }> {\n  const result = {\n    success: false,\n    errors: [] as string[],\n  };\n\n  try {\n    const dependencies = await loadDependencies(configManager);\n    const toRemove = dependencies.filter(\n      (dep) =>\n        dep.prId === prId && dep.dependentPrId === dependentPrId && (!type || dep.type === type)\n    );\n\n    if (toRemove.length === 0) {\n      result.errors.push('No matching dependency found');\n      return result;\n    }\n\n    const remaining = dependencies.filter((dep) => !toRemove.includes(dep));\n    await saveDependencies(remaining, configManager);\n\n    result.success = true;\n    return result;\n  } catch (error) {\n    result.errors.push(\n      `Failed to remove dependency: ${error instanceof Error ? error.message : String(error)}`\n    );\n    return result;\n  }\n}\n\nasync function getPRDependencies(\n  prId: string,\n  _statusManager: PRStatusManager,\n  _relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<DependencyGraph> {\n  const dependencies = await loadDependencies(configManager);\n\n  const graph: DependencyGraph = {\n    prId,\n    blocks: [],\n    blockedBy: [],\n    dependsOn: [],\n    requiredBy: [],\n    canMerge: true,\n    blockingReasons: [],\n  };\n\n  dependencies.forEach((dep) => {\n    if (dep.prId === prId) {\n      switch (dep.type) {\n        case 'blocks':\n          graph.blocks.push(dep.dependentPrId);\n          break;\n        case 'depends_on':\n          graph.dependsOn.push(dep.dependentPrId);\n          break;\n        case 'required_by':\n          graph.requiredBy.push(dep.dependentPrId);\n          break;\n      }\n    }\n\n    if (dep.dependentPrId === prId) {\n      switch (dep.type) {\n        case 'blocked_by':\n          graph.blockedBy.push(dep.prId);\n          break;\n        case 'depends_on':\n          graph.blockedBy.push(dep.prId);\n          break;\n        case 'required_by':\n          graph.blocks.push(dep.prId);\n          break;\n      }\n    }\n  });\n\n  // Check if PR can be merged\n  if (graph.blockedBy.length > 0) {\n    graph.canMerge = false;\n    graph.blockingReasons.push(`Blocked by PRs: ${graph.blockedBy.join(', ')}`);\n  }\n\n  return graph;\n}\n\nasync function getAllDependencies(\n  _statusManager: PRStatusManager,\n  _relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<DependencyRelation[]> {\n  return await loadDependencies(configManager);\n}\n\nasync function validateDependencies(\n  statusManager: PRStatusManager,\n  _relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<DependencyValidationResult> {\n  const result: DependencyValidationResult = {\n    valid: true,\n    errors: [],\n    warnings: [],\n    circularDependencies: [],\n    unresolvedDependencies: [],\n  };\n\n  try {\n    const dependencies = await loadDependencies(configManager);\n\n    // Check for circular dependencies\n    const cycles = findCircularDependencies(dependencies);\n    if (cycles.length > 0) {\n      result.valid = false;\n      result.circularDependencies = cycles;\n      result.errors.push(`Found ${cycles.length} circular dependencies`);\n    }\n\n    // Check for unresolved dependencies (PRs that don't exist)\n    const allPRs = await statusManager.listPRs();\n    const prIds = new Set(allPRs.map((pr) => pr.pr_id));\n\n    dependencies.forEach((dep) => {\n      if (!prIds.has(dep.prId)) {\n        result.unresolvedDependencies.push(`${dep.prId} (referenced in dependency)`);\n      }\n      if (!prIds.has(dep.dependentPrId)) {\n        result.unresolvedDependencies.push(`${dep.dependentPrId} (referenced in dependency)`);\n      }\n    });\n\n    if (result.unresolvedDependencies.length > 0) {\n      result.valid = false;\n      result.errors.push(`Found ${result.unresolvedDependencies.length} unresolved dependencies`);\n    }\n\n    return result;\n  } catch (error) {\n    result.valid = false;\n    result.errors.push(\n      `Validation failed: ${error instanceof Error ? error.message : String(error)}`\n    );\n    return result;\n  }\n}\n\nasync function checkMergeability(\n  prId: string,\n  statusManager: PRStatusManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<DependencyGraph> {\n  return await getPRDependencies(prId, statusManager, relationshipManager, configManager);\n}\n\nasync function wouldCreateCircularDependency(\n  prId: string,\n  dependentPrId: string,\n  type: DependencyType,\n  _statusManager: PRStatusManager,\n  _relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<boolean> {\n  const dependencies = await loadDependencies(configManager);\n\n  // Add the proposed dependency temporarily\n  const proposedDep: DependencyRelation = {\n    prId,\n    dependentPrId,\n    type,\n    created: new Date().toISOString(),\n    createdBy: 'system',\n  };\n\n  const allDeps = [...dependencies, proposedDep];\n  const cycles = findCircularDependencies(allDeps);\n\n  return cycles.length > 0;\n}\n\nfunction findCircularDependencies(dependencies: DependencyRelation[]): string[][] {\n  const graph = new Map<string, Set<string>>();\n\n  // Build dependency graph\n  dependencies.forEach((dep) => {\n    if (!graph.has(dep.prId)) {\n      graph.set(dep.prId, new Set());\n    }\n    graph.get(dep.prId)?.add(dep.dependentPrId);\n  });\n\n  const cycles: string[][] = [];\n  const visited = new Set<string>();\n  const recursionStack = new Set<string>();\n\n  function dfs(node: string, path: string[]): void {\n    if (recursionStack.has(node)) {\n      // Found a cycle\n      const cycleStart = path.indexOf(node);\n      if (cycleStart !== -1) {\n        cycles.push([...path.slice(cycleStart), node]);\n      }\n      return;\n    }\n\n    if (visited.has(node)) {\n      return;\n    }\n\n    visited.add(node);\n    recursionStack.add(node);\n    path.push(node);\n\n    const neighbors = graph.get(node);\n    if (neighbors) {\n      for (const neighbor of neighbors) {\n        dfs(neighbor, path);\n      }\n    }\n\n    path.pop();\n    recursionStack.delete(node);\n  }\n\n  for (const node of graph.keys()) {\n    if (!visited.has(node)) {\n      dfs(node, []);\n    }\n  }\n\n  return cycles;\n}\n\nasync function loadDependencies(configManager: ConfigManager): Promise<DependencyRelation[]> {\n  const depsPath = path.join(configManager.getPRsDirectory(), 'dependencies.json');\n\n  if (!fs.existsSync(depsPath)) {\n    return [];\n  }\n\n  const content = fs.readFileSync(depsPath, 'utf8');\n  return JSON.parse(content);\n}\n\nasync function saveDependencies(\n  dependencies: DependencyRelation[],\n  configManager: ConfigManager\n): Promise<void> {\n  const depsPath = path.join(configManager.getPRsDirectory(), 'dependencies.json');\n  fs.writeFileSync(depsPath, JSON.stringify(dependencies, null, 2), 'utf8');\n}\n\nasync function saveDependency(\n  dependency: DependencyRelation,\n  configManager: ConfigManager\n): Promise<void> {\n  const dependencies = await loadDependencies(configManager);\n  dependencies.push(dependency);\n  await saveDependencies(dependencies, configManager);\n}\n\nasync function updatePRWithDependency(\n  pr: PRData,\n  dependency: DependencyRelation,\n  direction: 'incoming' | 'outgoing',\n  _configManager: ConfigManager\n): Promise<void> {\n  try {\n    const prContent = fs.readFileSync(pr.file_path, 'utf8');\n\n    // Update PR frontmatter with dependency information\n    const dependencyNote =\n      direction === 'outgoing'\n        ? `${dependency.type} ${dependency.dependentPrId}`\n        : `${dependency.type} ${dependency.prId}`;\n\n    const updatedContent = prContent.replace(\n      /updated_date:\\s*[^\\n]+/,\n      `updated_date: ${new Date().toISOString()}`\n    );\n\n    // Add dependency section\n    const dependencySection = `\\n\\n## Dependencies\\n\\n- ${dependencyNote}${dependency.reason ? ` (${dependency.reason})` : ''}\\n`;\n    const finalContent = updatedContent + dependencySection;\n\n    fs.writeFileSync(pr.file_path, finalContent, 'utf8');\n  } catch (error) {\n    console.error(`Failed to update PR ${pr.pr_id} with dependency info: ${error}`);\n  }\n}\n\nasync function fixDependencyIssues(\n  validationResult: DependencyValidationResult,\n  statusManager: PRStatusManager,\n  _relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<{ success: boolean; errors: string[] }> {\n  const result = {\n    success: false,\n    errors: [] as string[],\n  };\n\n  try {\n    const dependencies = await loadDependencies(configManager);\n    let fixedDependencies = [...dependencies];\n\n    // Remove unresolved dependencies\n    if (validationResult.unresolvedDependencies.length > 0) {\n      const allPRs = await statusManager.listPRs();\n      const prIds = new Set(allPRs.map((pr) => pr.pr_id));\n\n      fixedDependencies = fixedDependencies.filter(\n        (dep) => prIds.has(dep.prId) && prIds.has(dep.dependentPrId)\n      );\n    }\n\n    // Handle circular dependencies by removing them\n    if (validationResult.circularDependencies.length > 0) {\n      // This is a simplified approach - in practice, you'd want more sophisticated resolution\n      for (const cycle of validationResult.circularDependencies) {\n        // Remove the last dependency in the cycle\n        if (cycle.length > 1) {\n          const lastPr = cycle[cycle.length - 1];\n          const firstPr = cycle[0];\n\n          fixedDependencies = fixedDependencies.filter(\n            (dep) => !(dep.prId === lastPr && dep.dependentPrId === firstPr)\n          );\n        }\n      }\n    }\n\n    await saveDependencies(fixedDependencies, configManager);\n    result.success = true;\n\n    return result;\n  } catch (error) {\n    result.errors.push(\n      `Failed to fix dependency issues: ${error instanceof Error ? error.message : String(error)}`\n    );\n    return result;\n  }\n}\n\nfunction displayDependencies(\n  dependencies: DependencyRelation[],\n  format: string,\n  _formatter: Formatter\n): void {\n  if (format === 'json') {\n    console.log(JSON.stringify(dependencies, null, 2));\n  } else if (format === 'table') {\n    console.table(\n      dependencies.map((dep) => ({\n        'PR ID': dep.prId,\n        'Dependent PR': dep.dependentPrId,\n        Type: dep.type,\n        Reason: dep.reason || 'N/A',\n        Created: dep.created.split('T')[0],\n      }))\n    );\n  } else {\n    // Graph format - simplified representation\n    console.log(colors.blue('PR Dependency Graph:'));\n    dependencies.forEach((dep) => {\n      console.log(`${dep.prId} --${dep.type}--> ${dep.dependentPrId}`);\n    });\n  }\n}\n\nfunction displayPRDependencies(\n  dependencies: DependencyGraph,\n  format: string,\n  _formatter: Formatter\n): void {\n  if (format === 'json') {\n    console.log(JSON.stringify(dependencies, null, 2));\n  } else {\n    console.log(colors.blue(`Dependencies for PR ${dependencies.prId}:`));\n\n    if (dependencies.blocks.length > 0) {\n      console.log(colors.red(`🔒 Blocks: ${dependencies.blocks.join(', ')}`));\n    }\n\n    if (dependencies.blockedBy.length > 0) {\n      console.log(colors.yellow(`⏳ Blocked by: ${dependencies.blockedBy.join(', ')}`));\n    }\n\n    if (dependencies.dependsOn.length > 0) {\n      console.log(colors.cyan(`📎 Depends on: ${dependencies.dependsOn.join(', ')}`));\n    }\n\n    if (dependencies.requiredBy.length > 0) {\n      console.log(colors.green(`🔗 Required by: ${dependencies.requiredBy.join(', ')}`));\n    }\n\n    const canMergeColor = dependencies.canMerge ? colors.green : colors.red;\n    const canMergeIcon = dependencies.canMerge ? '✅' : '❌';\n    console.log(canMergeColor(`${canMergeIcon} Can merge: ${dependencies.canMerge}`));\n\n    if (dependencies.blockingReasons.length > 0) {\n      console.log(colors.red('Blocking reasons:'));\n      dependencies.blockingReasons.forEach((reason) => {\n        console.log(colors.red(`  • ${reason}`));\n      });\n    }\n  }\n}\n\nexport type { DependencyRelation, DependencyGraph, DependencyValidationResult };\n","/**\n * PR List Command\n * Lists PRs with filtering and sorting options\n */\n\nimport { Command } from 'commander';\nimport type { PRStatus, Priority } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface ListOptions {\n  status?: string;\n  prStatus?: string;\n  priority?: string;\n  assignee?: string;\n  issue?: string;\n  epic?: string;\n  tags?: string;\n  reviewer?: string;\n  branch?: string;\n  repository?: string;\n  limit?: string;\n  sortBy?: string;\n  sortOrder?: 'asc' | 'desc';\n  showDetails?: boolean;\n  format?: 'table' | 'json' | 'csv';\n}\n\nexport function createPRListCommand(): Command {\n  const cmd = new Command('list');\n\n  cmd\n    .description('List PRs with filtering options')\n    .option('-s, --status <status>', 'filter by base status (planning|active|completed|archived)')\n    .option(\n      '--pr-status <status>',\n      'filter by PR status (draft|open|review|approved|merged|closed)'\n    )\n    .option('-p, --priority <level>', 'filter by priority (low|medium|high|critical)')\n    .option('-a, --assignee <username>', 'filter by assignee')\n    .option('-i, --issue <issue-id>', 'filter by issue ID')\n    .option('-e, --epic <epic-id>', 'filter by epic ID')\n    .option('-t, --tags <tags>', 'filter by tags (comma-separated)')\n    .option('-r, --reviewer <username>', 'filter by reviewer')\n    .option('-b, --branch <name>', 'filter by branch name')\n    .option('--repository <url>', 'filter by repository URL')\n    .option('-l, --limit <number>', 'limit number of results (default: 50)')\n    .option(\n      '--sort-by <field>',\n      'sort by field (created_date|updated_date|priority|pr_status|title)',\n      'updated_date'\n    )\n    .option('--sort-order <order>', 'sort order (asc|desc)', 'desc')\n    .option('--show-details', 'show detailed information')\n    .option('--format <format>', 'output format (table|json|csv)', 'table')\n    .action(async (options: ListOptions) => {\n      try {\n        await listPRs(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to list PRs: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function listPRs(options: ListOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n\n  // Get all PRs\n  const allPRs = relationshipManager.getAllPRs();\n\n  if (allPRs.length === 0) {\n    console.log(Formatter.info('No PRs found.'));\n    return;\n  }\n\n  // Apply filters\n  let filteredPRs = allPRs;\n\n  if (options.status) {\n    filteredPRs = filteredPRs.filter((pr) => pr.status === options.status);\n  }\n\n  if (options.prStatus) {\n    filteredPRs = filteredPRs.filter((pr) => pr.pr_status === options.prStatus);\n  }\n\n  if (options.priority) {\n    filteredPRs = filteredPRs.filter((pr) => pr.priority === options.priority);\n  }\n\n  if (options.assignee) {\n    filteredPRs = filteredPRs.filter((pr) => pr.assignee === options.assignee);\n  }\n\n  if (options.issue) {\n    filteredPRs = filteredPRs.filter((pr) => pr.issue_id === options.issue);\n  }\n\n  if (options.epic) {\n    filteredPRs = filteredPRs.filter((pr) => pr.epic_id === options.epic);\n  }\n\n  if (options.tags) {\n    const filterTags = options.tags.split(',').map((tag) => tag.trim());\n    filteredPRs = filteredPRs.filter((pr) => pr.tags?.some((tag) => filterTags.includes(tag)));\n  }\n\n  if (options.reviewer) {\n    filteredPRs = filteredPRs.filter((pr) => pr.reviewers?.includes(options.reviewer));\n  }\n\n  if (options.branch) {\n    filteredPRs = filteredPRs.filter(\n      (pr) =>\n        pr.branch_name?.includes(options.branch) ||\n        pr.source_branch?.includes(options.branch) ||\n        pr.target_branch?.includes(options.branch)\n    );\n  }\n\n  if (options.repository) {\n    filteredPRs = filteredPRs.filter((pr) => pr.repository_url?.includes(options.repository));\n  }\n\n  // Sort PRs\n  const sortField = options.sortBy || 'updated_date';\n  const sortOrder = options.sortOrder || 'desc';\n\n  filteredPRs.sort((a, b) => {\n    let aValue: any;\n    let bValue: any;\n\n    switch (sortField) {\n      case 'created_date':\n        aValue = new Date(a.created_date);\n        bValue = new Date(b.created_date);\n        break;\n      case 'updated_date':\n        aValue = new Date(a.updated_date);\n        bValue = new Date(b.updated_date);\n        break;\n      case 'priority': {\n        const priorityOrder = { critical: 4, high: 3, medium: 2, low: 1 };\n        aValue = priorityOrder[a.priority as Priority];\n        bValue = priorityOrder[b.priority as Priority];\n        break;\n      }\n      case 'pr_status': {\n        const statusOrder = { merged: 6, closed: 5, approved: 4, review: 3, open: 2, draft: 1 };\n        aValue = statusOrder[a.pr_status as PRStatus];\n        bValue = statusOrder[b.pr_status as PRStatus];\n        break;\n      }\n      case 'title':\n        aValue = a.title.toLowerCase();\n        bValue = b.title.toLowerCase();\n        break;\n      default:\n        aValue = a.updated_date;\n        bValue = b.updated_date;\n    }\n\n    if (aValue < bValue) return sortOrder === 'asc' ? -1 : 1;\n    if (aValue > bValue) return sortOrder === 'asc' ? 1 : -1;\n    return 0;\n  });\n\n  // Apply limit\n  const limit = parseInt(options.limit || '50', 10);\n  const displayPRs = filteredPRs.slice(0, limit);\n\n  // Display results\n  if (options.format === 'json') {\n    console.log(JSON.stringify(displayPRs, null, 2));\n    return;\n  }\n\n  if (options.format === 'csv') {\n    console.log(\n      'PR_ID,Title,PR_Status,Priority,Assignee,Issue_ID,Epic_ID,Branch_Name,Target_Branch,Created_Date,Updated_Date'\n    );\n    displayPRs.forEach((pr) => {\n      console.log(\n        [\n          pr.pr_id,\n          `\"${pr.title.replace(/\"/g, '\"\"')}\"`,\n          pr.pr_status,\n          pr.priority,\n          pr.assignee,\n          pr.issue_id,\n          pr.epic_id,\n          pr.branch_name || '',\n          pr.target_branch || '',\n          pr.created_date,\n          pr.updated_date,\n        ].join(',')\n      );\n    });\n    return;\n  }\n\n  // Table format (default)\n  console.log(\n    Formatter.header(\n      `\\n📋 PRs (${displayPRs.length}${filteredPRs.length > limit ? ` of ${filteredPRs.length}` : ''})`\n    )\n  );\n\n  if (displayPRs.length === 0) {\n    console.log(Formatter.info('No PRs match the specified filters.'));\n    return;\n  }\n\n  displayPRs.forEach((pr) => {\n    const statusColor = getPRStatusColor(pr.pr_status);\n    const priorityColor = getPriorityColor(pr.priority);\n\n    console.log(`\\n${Formatter.info(`${pr.pr_id}`)} ${pr.title}`);\n    console.log(\n      `  Status: ${statusColor(pr.pr_status)} | Priority: ${priorityColor(pr.priority)} | Assignee: ${pr.assignee}`\n    );\n    console.log(`  Issue: ${pr.issue_id} | Epic: ${pr.epic_id}`);\n\n    if (pr.branch_name) {\n      console.log(`  Branch: ${pr.branch_name} → ${pr.target_branch || 'main'}`);\n    }\n\n    if (pr.reviewers && pr.reviewers.length > 0) {\n      console.log(`  Reviewers: ${pr.reviewers.join(', ')}`);\n    }\n\n    if (pr.tags && pr.tags.length > 0) {\n      console.log(`  Tags: ${pr.tags.join(', ')}`);\n    }\n\n    if (options.showDetails) {\n      console.log(`  Description: ${pr.description || 'No description'}`);\n      console.log(\n        `  Created: ${formatDate(pr.created_date)} | Updated: ${formatDate(pr.updated_date)}`\n      );\n      console.log(`  File: ${pr.file_path}`);\n\n      if (pr.repository_url) {\n        console.log(`  Repository: ${pr.repository_url}`);\n      }\n\n      if (pr.pr_number) {\n        console.log(`  PR Number: #${pr.pr_number}`);\n      }\n    }\n  });\n\n  // Summary\n  console.log(`\\n${Formatter.info('Summary:')}`);\n  console.log(`  Total PRs: ${allPRs.length}`);\n  console.log(`  Filtered: ${filteredPRs.length}`);\n  console.log(`  Displayed: ${displayPRs.length}`);\n\n  // Status breakdown\n  const statusBreakdown: Record<string, number> = {};\n  filteredPRs.forEach((pr) => {\n    statusBreakdown[pr.pr_status] = (statusBreakdown[pr.pr_status] || 0) + 1;\n  });\n\n  console.log(\n    `  Status breakdown: ${Object.entries(statusBreakdown)\n      .map(([status, count]) => `${status}: ${count}`)\n      .join(', ')}`\n  );\n}\n\nfunction getPRStatusColor(status: PRStatus): (text: string) => string {\n  switch (status) {\n    case 'draft':\n      return Formatter.debug;\n    case 'open':\n      return Formatter.info;\n    case 'review':\n      return Formatter.warning;\n    case 'approved':\n      return Formatter.success;\n    case 'merged':\n      return Formatter.success;\n    case 'closed':\n      return Formatter.error;\n    default:\n      return Formatter.info;\n  }\n}\n\nfunction getPriorityColor(priority: Priority): (text: string) => string {\n  switch (priority) {\n    case 'critical':\n      return Formatter.error;\n    case 'high':\n      return Formatter.warning;\n    case 'medium':\n      return Formatter.info;\n    case 'low':\n      return Formatter.debug;\n    default:\n      return Formatter.info;\n  }\n}\n\nfunction formatDate(dateString: string): string {\n  const date = new Date(dateString);\n  return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;\n}\n","/**\n * PR Review Command\n * Creates and manages PR reviews with structured feedback\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { PRData, PRStatus } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface ReviewOptions {\n  comments?: string;\n  approve?: boolean;\n  requestChanges?: boolean;\n  status?: PRStatus;\n  reviewer?: string;\n  template?: string;\n  addReviewer?: string;\n  removeReviewer?: string;\n  dryRun?: boolean;\n}\n\ninterface ReviewFrontmatter {\n  review_id: string;\n  pr_id: string;\n  reviewer: string;\n  review_type: 'approve' | 'request_changes' | 'comment';\n  created_date: string;\n  updated_date: string;\n  status: 'pending' | 'submitted' | 'dismissed';\n  comments?: string;\n}\n\nexport function createPRReviewCommand(): Command {\n  const cmd = new Command('review');\n\n  cmd\n    .description('Create or update a PR review')\n    .argument('<pr-id>', 'PR ID to review')\n    .option('-c, --comments <text>', 'review comments')\n    .option('-a, --approve', 'approve the PR')\n    .option('-r, --request-changes', 'request changes to the PR')\n    .option('-s, --status <status>', 'update PR status (draft|open|review|approved|merged|closed)')\n    .option('--reviewer <username>', 'reviewer username (defaults to current user)')\n    .option('-t, --template <name>', 'review template to use')\n    .option('--add-reviewer <username>', 'add a reviewer to the PR')\n    .option('--remove-reviewer <username>', 'remove a reviewer from the PR')\n    .option('--dry-run', 'show what would be done without making changes')\n    .action(async (prId: string, options: ReviewOptions) => {\n      try {\n        await reviewPR(prId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to review PR: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function reviewPR(prId: string, options: ReviewOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n  const parser = new FrontmatterParser();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Find the PR\n  const prHierarchy = relationshipManager.getPRHierarchy(prId);\n  if (!prHierarchy) {\n    throw new Error(`PR not found: ${prId}`);\n  }\n\n  const pr = prHierarchy.pr;\n\n  // Validate review options\n  if (options.approve && options.requestChanges) {\n    throw new Error('Cannot both approve and request changes in the same review');\n  }\n\n  // Determine review type\n  let reviewType: 'approve' | 'request_changes' | 'comment' = 'comment';\n  if (options.approve) {\n    reviewType = 'approve';\n  } else if (options.requestChanges) {\n    reviewType = 'request_changes';\n  }\n\n  // Get reviewer\n  const reviewer = options.reviewer || config.default_assignee || 'current-user';\n\n  // Create review ID\n  const reviewId = `${prId}-review-${Date.now()}`;\n\n  // Get review template if specified\n  let reviewTemplate = '';\n  if (options.template) {\n    const template = configManager.getTemplateWithFallback('pr-review', options.template);\n    if (template) {\n      reviewTemplate = template.content_template || '';\n    }\n  }\n\n  // Create review frontmatter\n  const now = new Date().toISOString();\n  const reviewFrontmatter: ReviewFrontmatter = {\n    review_id: reviewId,\n    pr_id: prId,\n    reviewer,\n    review_type: reviewType,\n    created_date: now,\n    updated_date: now,\n    status: 'submitted',\n    comments: options.comments,\n  };\n\n  // Generate review content\n  const reviewContent = `# PR Review: ${pr.title}\n\n**PR**: ${prId}  \n**Reviewer**: ${reviewer}  \n**Review Type**: ${reviewType.toUpperCase()}  \n**Date**: ${now}\n\n## Review Comments\n\n${options.comments || ''}\n\n${reviewTemplate}\n\n## Files Reviewed\n\n- Review pending\n\n## Review Checklist\n\n- [ ] Code quality and standards\n- [ ] Functionality and logic\n- [ ] Test coverage\n- [ ] Documentation\n- [ ] Performance considerations\n- [ ] Security considerations\n\n## Decision\n\n${reviewType === 'approve' ? '✅ **APPROVED** - Ready to merge' : ''}\n${reviewType === 'request_changes' ? '❌ **CHANGES REQUESTED** - Please address comments' : ''}\n${reviewType === 'comment' ? '💬 **COMMENTED** - General feedback provided' : ''}\n`;\n\n  // Handle reviewer management\n  let updatedReviewers = [...(pr.reviewers || [])];\n\n  if (options.addReviewer) {\n    if (!updatedReviewers.includes(options.addReviewer)) {\n      updatedReviewers.push(options.addReviewer);\n    }\n  }\n\n  if (options.removeReviewer) {\n    updatedReviewers = updatedReviewers.filter((r) => r !== options.removeReviewer);\n  }\n\n  // Add current reviewer if not already present\n  if (!updatedReviewers.includes(reviewer)) {\n    updatedReviewers.push(reviewer);\n  }\n\n  // Handle approvals\n  let updatedApprovals = [...(pr.approvals || [])];\n  if (reviewType === 'approve' && !updatedApprovals.includes(reviewer)) {\n    updatedApprovals.push(reviewer);\n  } else if (reviewType === 'request_changes') {\n    // Remove approval if requesting changes\n    updatedApprovals = updatedApprovals.filter((a) => a !== reviewer);\n  }\n\n  // Determine new PR status\n  let newPRStatus = pr.pr_status;\n  if (options.status) {\n    newPRStatus = options.status;\n  } else if (reviewType === 'approve') {\n    // Auto-transition to approved if all reviewers have approved\n    if (updatedReviewers.length > 0 && updatedApprovals.length >= updatedReviewers.length) {\n      newPRStatus = 'approved';\n    } else if (pr.pr_status === 'draft' || pr.pr_status === 'open') {\n      newPRStatus = 'review';\n    }\n  } else if (reviewType === 'request_changes') {\n    newPRStatus = 'open'; // Back to open for changes\n  }\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - Review would be created with:'));\n    console.log(Formatter.debug(`PR ID: ${prId}`));\n    console.log(Formatter.debug(`Review ID: ${reviewId}`));\n    console.log(Formatter.debug(`Reviewer: ${reviewer}`));\n    console.log(Formatter.debug(`Review Type: ${reviewType}`));\n    console.log(Formatter.debug(`Current PR Status: ${pr.pr_status}`));\n    console.log(Formatter.debug(`New PR Status: ${newPRStatus}`));\n    console.log(Formatter.debug(`Reviewers: ${updatedReviewers.join(', ')}`));\n    console.log(Formatter.debug(`Approvals: ${updatedApprovals.join(', ')}`));\n    if (options.comments) {\n      console.log(Formatter.debug(`Comments: ${options.comments}`));\n    }\n    return;\n  }\n\n  // Create reviews directory if it doesn't exist\n  const reviewsDir = path.join(paths.prsDir, 'reviews');\n  if (!fs.existsSync(reviewsDir)) {\n    fs.mkdirSync(reviewsDir, { recursive: true });\n  }\n\n  // Write review file\n  const reviewFileName = `${reviewId}.md`;\n  const reviewFilePath = path.join(reviewsDir, reviewFileName);\n  parser.writeFile(reviewFilePath, reviewFrontmatter, reviewContent);\n\n  // Update PR with review information\n  const prUpdates: Partial<PRData> = {\n    reviewers: updatedReviewers.length > 0 ? updatedReviewers : undefined,\n    approvals: updatedApprovals.length > 0 ? updatedApprovals : undefined,\n    pr_status: newPRStatus,\n    updated_date: now,\n  };\n\n  parser.updateFile(pr.file_path, prUpdates);\n\n  // Handle status-based file movement if status changed\n  if (newPRStatus !== pr.pr_status) {\n    await handleStatusTransition(pr, newPRStatus, paths, configManager);\n  }\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`PR review created successfully!`));\n  console.log(Formatter.info(`Review ID: ${reviewId}`));\n  console.log(Formatter.info(`PR: ${prId} - ${pr.title}`));\n  console.log(Formatter.info(`Reviewer: ${reviewer}`));\n  console.log(Formatter.info(`Review Type: ${reviewType.toUpperCase()}`));\n  console.log(Formatter.info(`Review File: ${reviewFilePath}`));\n\n  if (newPRStatus !== pr.pr_status) {\n    console.log(Formatter.info(`PR Status Changed: ${pr.pr_status} → ${newPRStatus}`));\n  }\n\n  console.log(Formatter.info(`Reviewers: ${updatedReviewers.join(', ')}`));\n  console.log(Formatter.info(`Approvals: ${updatedApprovals.length}/${updatedReviewers.length}`));\n\n  if (options.comments) {\n    console.log(Formatter.info(`Comments: ${options.comments}`));\n  }\n\n  // Show next steps\n  if (reviewType === 'approve' && newPRStatus === 'approved') {\n    console.log('');\n    console.log(Formatter.success('✅ PR is now approved and ready to merge!'));\n    console.log(Formatter.info('Use `aitrackdown pr merge` to merge the PR'));\n  } else if (reviewType === 'request_changes') {\n    console.log('');\n    console.log(Formatter.warning('⚠️  Changes requested - PR returned to open status'));\n    console.log(Formatter.info('Author should address comments and update the PR'));\n  }\n}\n\nasync function handleStatusTransition(\n  pr: PRData,\n  newStatus: PRStatus,\n  paths: any,\n  _configManager: ConfigManager\n): Promise<void> {\n  const _parser = new FrontmatterParser();\n\n  // Define status-based directories\n  const statusDirs = {\n    draft: path.join(paths.prsDir, 'draft'),\n    open: path.join(paths.prsDir, 'active'),\n    review: path.join(paths.prsDir, 'active'),\n    approved: path.join(paths.prsDir, 'active'),\n    merged: path.join(paths.prsDir, 'merged'),\n    closed: path.join(paths.prsDir, 'closed'),\n  };\n\n  // Get current and target directories\n  const currentDir = path.dirname(pr.file_path);\n  const targetDir = statusDirs[newStatus];\n\n  // Only move if different directory\n  if (currentDir !== targetDir) {\n    // Ensure target directory exists\n    if (!fs.existsSync(targetDir)) {\n      fs.mkdirSync(targetDir, { recursive: true });\n    }\n\n    // Generate new file path\n    const fileName = path.basename(pr.file_path);\n    const newFilePath = path.join(targetDir, fileName);\n\n    // Move the file\n    fs.renameSync(pr.file_path, newFilePath);\n\n    console.log(Formatter.info(`Moved PR file: ${currentDir} → ${targetDir}`));\n  }\n}\n","/**\n * PR Show Command\n * Displays detailed information about a specific PR\n */\n\nimport { Command } from 'commander';\nimport type { PRStatus, Priority } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface ShowOptions {\n  format?: 'detailed' | 'json' | 'yaml';\n  showContent?: boolean;\n  showRelationships?: boolean;\n  showHistory?: boolean;\n}\n\nexport function createPRShowCommand(): Command {\n  const cmd = new Command('show');\n\n  cmd\n    .description('Show detailed information about a specific PR')\n    .argument('<pr-id>', 'PR ID to display')\n    .option('-f, --format <format>', 'output format (detailed|json|yaml)', 'detailed')\n    .option('-c, --show-content', 'include PR content/description')\n    .option('-r, --show-relationships', 'show related items (issue, epic, dependencies)')\n    .option('-h, --show-history', 'show change history (if available)')\n    .action(async (prId: string, options: ShowOptions) => {\n      try {\n        await showPR(prId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to show PR: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function showPR(prId: string, options: ShowOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n\n  // Find the PR\n  const prHierarchy = relationshipManager.getPRHierarchy(prId);\n  if (!prHierarchy) {\n    console.error(Formatter.error(`PR not found: ${prId}`));\n    process.exit(1);\n  }\n\n  const pr = prHierarchy.pr;\n\n  // Display based on format\n  if (options.format === 'json') {\n    const output = {\n      pr,\n      ...(options.showRelationships && {\n        relationships: {\n          issue: prHierarchy.issue,\n          epic: prHierarchy.epic,\n        },\n      }),\n    };\n    console.log(JSON.stringify(output, null, 2));\n    return;\n  }\n\n  if (options.format === 'yaml') {\n    // For YAML, we'll output the frontmatter format\n    const yamlOutput = {\n      pr_id: pr.pr_id,\n      title: pr.title,\n      description: pr.description,\n      status: pr.status,\n      pr_status: pr.pr_status,\n      priority: pr.priority,\n      assignee: pr.assignee,\n      issue_id: pr.issue_id,\n      epic_id: pr.epic_id,\n      created_date: pr.created_date,\n      updated_date: pr.updated_date,\n      estimated_tokens: pr.estimated_tokens,\n      actual_tokens: pr.actual_tokens,\n      branch_name: pr.branch_name,\n      source_branch: pr.source_branch,\n      target_branch: pr.target_branch,\n      repository_url: pr.repository_url,\n      pr_number: pr.pr_number,\n      reviewers: pr.reviewers,\n      approvals: pr.approvals,\n      merge_commit: pr.merge_commit,\n      tags: pr.tags,\n      dependencies: pr.dependencies,\n      blocked_by: pr.blocked_by,\n      blocks: pr.blocks,\n      related_prs: pr.related_prs,\n      template_used: pr.template_used,\n      ai_context: pr.ai_context,\n      sync_status: pr.sync_status,\n    };\n\n    console.log('---');\n    Object.entries(yamlOutput).forEach(([key, value]) => {\n      if (value !== undefined && value !== null) {\n        if (Array.isArray(value)) {\n          if (value.length > 0) {\n            console.log(`${key}:`);\n            value.forEach((item) => console.log(`  - ${item}`));\n          }\n        } else {\n          console.log(`${key}: ${value}`);\n        }\n      }\n    });\n    console.log('---');\n    return;\n  }\n\n  // Detailed format (default)\n  const statusColor = getPRStatusColor(pr.pr_status);\n  const priorityColor = getPriorityColor(pr.priority);\n\n  console.log(Formatter.header(`\\n📋 PR Details: ${pr.pr_id}`));\n  console.log(`\\n${Formatter.info('Title:')} ${pr.title}`);\n  console.log(\n    `${Formatter.info('Status:')} ${statusColor(pr.pr_status)} | ${Formatter.info('Priority:')} ${priorityColor(pr.priority)}`\n  );\n  console.log(`${Formatter.info('Assignee:')} ${pr.assignee}`);\n\n  console.log(`\\n${Formatter.info('Hierarchy:')}`);\n  console.log(`  Epic: ${pr.epic_id} (${prHierarchy.epic?.title || 'Unknown'})`);\n  console.log(`  Issue: ${pr.issue_id} (${prHierarchy.issue.title})`);\n  console.log(`  PR: ${pr.pr_id}`);\n\n  console.log(`\\n${Formatter.info('Branch Information:')}`);\n  if (pr.branch_name) {\n    console.log(`  Branch: ${pr.branch_name}`);\n  }\n  if (pr.source_branch) {\n    console.log(`  Source: ${pr.source_branch}`);\n  }\n  console.log(`  Target: ${pr.target_branch || 'main'}`);\n\n  if (pr.repository_url) {\n    console.log(`  Repository: ${pr.repository_url}`);\n  }\n\n  if (pr.pr_number) {\n    console.log(`  PR Number: #${pr.pr_number}`);\n  }\n\n  console.log(`\\n${Formatter.info('Dates:')}`);\n  console.log(`  Created: ${formatDate(pr.created_date)}`);\n  console.log(`  Updated: ${formatDate(pr.updated_date)}`);\n\n  if (pr.reviewers && pr.reviewers.length > 0) {\n    console.log(`\\n${Formatter.info('Reviewers:')}`);\n    pr.reviewers.forEach((reviewer) => {\n      const isApproved = pr.approvals?.includes(reviewer);\n      console.log(`  ${reviewer} ${isApproved ? '✅' : '⏳'}`);\n    });\n  }\n\n  if (pr.approvals && pr.approvals.length > 0) {\n    console.log(`\\n${Formatter.info('Approvals:')}`);\n    pr.approvals.forEach((approval) => {\n      console.log(`  ✅ ${approval}`);\n    });\n  }\n\n  if (pr.merge_commit) {\n    console.log(`\\n${Formatter.info('Merge Commit:')} ${pr.merge_commit}`);\n  }\n\n  if (pr.tags && pr.tags.length > 0) {\n    console.log(`\\n${Formatter.info('Tags:')} ${pr.tags.join(', ')}`);\n  }\n\n  if (pr.estimated_tokens > 0 || pr.actual_tokens > 0) {\n    console.log(`\\n${Formatter.info('Token Usage:')}`);\n    console.log(`  Estimated: ${pr.estimated_tokens}`);\n    console.log(`  Actual: ${pr.actual_tokens}`);\n    if (pr.estimated_tokens > 0) {\n      const efficiency = ((pr.actual_tokens / pr.estimated_tokens) * 100).toFixed(1);\n      console.log(`  Efficiency: ${efficiency}%`);\n    }\n  }\n\n  if (pr.dependencies && pr.dependencies.length > 0) {\n    console.log(`\\n${Formatter.info('Dependencies:')}`);\n    pr.dependencies.forEach((dep) => {\n      console.log(`  📎 ${dep}`);\n    });\n  }\n\n  if (pr.blocked_by && pr.blocked_by.length > 0) {\n    console.log(`\\n${Formatter.warning('Blocked By:')}`);\n    pr.blocked_by.forEach((blocker) => {\n      console.log(`  🚫 ${blocker}`);\n    });\n  }\n\n  if (pr.blocks && pr.blocks.length > 0) {\n    console.log(`\\n${Formatter.warning('Blocks:')}`);\n    pr.blocks.forEach((blocked) => {\n      console.log(`  🚫 ${blocked}`);\n    });\n  }\n\n  if (pr.related_prs && pr.related_prs.length > 0) {\n    console.log(`\\n${Formatter.info('Related PRs:')}`);\n    pr.related_prs.forEach((relatedPR) => {\n      console.log(`  🔗 ${relatedPR}`);\n    });\n  }\n\n  if (pr.ai_context && pr.ai_context.length > 0) {\n    console.log(`\\n${Formatter.info('AI Context:')}`);\n    pr.ai_context.forEach((context) => {\n      console.log(`  🤖 ${context}`);\n    });\n  }\n\n  if (pr.template_used) {\n    console.log(`\\n${Formatter.info('Template Used:')} ${pr.template_used}`);\n  }\n\n  console.log(`\\n${Formatter.info('Sync Status:')} ${pr.sync_status}`);\n  console.log(`${Formatter.info('File Path:')} ${pr.file_path}`);\n\n  if (options.showContent && pr.description) {\n    console.log(`\\n${Formatter.info('Description:')}`);\n    console.log(pr.description);\n  }\n\n  if (options.showContent && pr.content) {\n    console.log(`\\n${Formatter.info('Content:')}`);\n    console.log(pr.content);\n  }\n\n  if (options.showRelationships) {\n    console.log(`\\n${Formatter.header('Related Items:')}`);\n\n    // Show issue details\n    const issue = prHierarchy.issue;\n    console.log(`\\n${Formatter.info('Parent Issue:')} ${issue.issue_id}`);\n    console.log(`  Title: ${issue.title}`);\n    console.log(`  Status: ${issue.status}`);\n    console.log(`  Priority: ${issue.priority}`);\n    console.log(`  Assignee: ${issue.assignee}`);\n\n    // Show epic details if available\n    if (prHierarchy.epic) {\n      const epic = prHierarchy.epic;\n      console.log(`\\n${Formatter.info('Parent Epic:')} ${epic.epic_id}`);\n      console.log(`  Title: ${epic.title}`);\n      console.log(`  Status: ${epic.status}`);\n      console.log(`  Priority: ${epic.priority}`);\n      console.log(`  Assignee: ${epic.assignee}`);\n\n      if (epic.completion_percentage !== undefined) {\n        console.log(`  Completion: ${epic.completion_percentage}%`);\n      }\n    }\n  }\n\n  // Show change summary\n  console.log(`\\n${Formatter.success('PR Summary:')}`);\n  console.log(`  PR ${pr.pr_id} \"${pr.title}\"`);\n  console.log(`  Status: ${pr.pr_status} | Priority: ${pr.priority} | Assignee: ${pr.assignee}`);\n  console.log(`  Branch: ${pr.branch_name || 'N/A'} → ${pr.target_branch || 'main'}`);\n  console.log(`  Created: ${formatDate(pr.created_date)}`);\n  console.log(`  Last Updated: ${formatDate(pr.updated_date)}`);\n}\n\nfunction getPRStatusColor(status: PRStatus): (text: string) => string {\n  switch (status) {\n    case 'draft':\n      return Formatter.debug;\n    case 'open':\n      return Formatter.info;\n    case 'review':\n      return Formatter.warning;\n    case 'approved':\n      return Formatter.success;\n    case 'merged':\n      return Formatter.success;\n    case 'closed':\n      return Formatter.error;\n    default:\n      return Formatter.info;\n  }\n}\n\nfunction getPriorityColor(priority: Priority): (text: string) => string {\n  switch (priority) {\n    case 'critical':\n      return Formatter.error;\n    case 'high':\n      return Formatter.warning;\n    case 'medium':\n      return Formatter.info;\n    case 'low':\n      return Formatter.debug;\n    default:\n      return Formatter.info;\n  }\n}\n\nfunction formatDate(dateString: string): string {\n  const date = new Date(dateString);\n  return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;\n}\n","/**\n * PR-Task Synchronization Command\n * Handles bidirectional synchronization between PRs and tasks\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { ItemStatus, PRData, PRStatus, TaskData } from '../../types/ai-trackdown.js';\nimport { colors } from '../../utils/colors.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { PRStatusManager } from '../../utils/pr-status-manager.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\nexport interface SyncOptions {\n  direction: 'pr-to-task' | 'task-to-pr' | 'bidirectional';\n  autoCreate: boolean;\n  autoComplete: boolean;\n  updateDescriptions: boolean;\n  syncTimestamps: boolean;\n  syncAssignees: boolean;\n  dryRun: boolean;\n  force: boolean;\n}\n\nexport interface SyncResult {\n  success: boolean;\n  direction: string;\n  totalPRs: number;\n  totalTasks: number;\n  syncedPRs: number;\n  syncedTasks: number;\n  createdPRs: number;\n  createdTasks: number;\n  updatedPRs: number;\n  updatedTasks: number;\n  completedTasks: number;\n  errors: string[];\n  warnings: string[];\n  details: SyncDetail[];\n}\n\nexport interface SyncDetail {\n  prId: string;\n  taskId: string;\n  action: string;\n  success: boolean;\n  message: string;\n  error?: string;\n  changes?: string[];\n}\n\nexport interface SyncMapping {\n  prId: string;\n  taskId: string;\n  issueId: string;\n  prStatus: PRStatus;\n  taskStatus: ItemStatus;\n  prAssignee: string;\n  taskAssignee: string;\n  prUpdated: string;\n  taskUpdated: string;\n  syncRequired: boolean;\n  syncDirection: 'pr-to-task' | 'task-to-pr' | 'conflict';\n  conflictReasons: string[];\n}\n\nexport function createPRSyncCommand(): Command {\n  const cmd = new Command('sync');\n\n  cmd.description('Synchronize PR and task statuses');\n\n  // Main sync command\n  cmd\n    .option(\n      '-d, --direction <direction>',\n      'Sync direction (pr-to-task|task-to-pr|bidirectional)',\n      'bidirectional'\n    )\n    .option('--auto-create', 'Automatically create missing PRs or tasks', false)\n    .option('--auto-complete', 'Automatically complete tasks when PRs are merged', false)\n    .option('--update-descriptions', 'Update descriptions during sync', false)\n    .option('--sync-timestamps', 'Sync timestamps between PRs and tasks', false)\n    .option('--sync-assignees', 'Sync assignees between PRs and tasks', false)\n    .option('--force', 'Force sync even when conflicts exist', false)\n    .option('--dry-run', 'Show what would be synced without executing', false)\n    .action(async (options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n      const _formatter = new Formatter();\n\n      const syncOptions: SyncOptions = {\n        direction: options.direction,\n        autoCreate: options.autoCreate,\n        autoComplete: options.autoComplete,\n        updateDescriptions: options.updateDescriptions,\n        syncTimestamps: options.syncTimestamps,\n        syncAssignees: options.syncAssignees,\n        dryRun: options.dryRun,\n        force: options.force,\n      };\n\n      try {\n        const result = await performSync(\n          syncOptions,\n          statusManager,\n          relationshipManager,\n          configManager\n        );\n\n        if (options.dryRun) {\n          console.log(colors.yellow('🔍 Sync dry run - showing what would be done:'));\n          console.log('');\n        }\n\n        displaySyncResult(result);\n\n        if (!result.success) {\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(`❌ Sync failed: ${error instanceof Error ? error.message : String(error)}`)\n        );\n        process.exit(1);\n      }\n    });\n\n  // Status mapping command\n  cmd\n    .command('status')\n    .description('Show current sync status between PRs and tasks')\n    .option('-f, --format <format>', 'Output format (table|json)', 'table')\n    .option('--conflicts-only', 'Show only conflicts', false)\n    .action(async (options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n      const formatter = new Formatter();\n\n      try {\n        const mappings = await getSyncMappings(statusManager, relationshipManager, configManager);\n\n        if (options.conflictsOnly) {\n          const conflicts = mappings.filter((m) => m.syncDirection === 'conflict');\n          displaySyncMappings(conflicts, options.format, formatter);\n        } else {\n          displaySyncMappings(mappings, options.format, formatter);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error getting sync status: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  // Force sync specific PR-task pair\n  cmd\n    .command('force')\n    .description('Force synchronization of a specific PR-task pair')\n    .argument('<pr-id>', 'PR ID')\n    .argument('<task-id>', 'Task ID')\n    .option('-d, --direction <direction>', 'Sync direction (pr-to-task|task-to-pr)', 'pr-to-task')\n    .action(async (prId: string, taskId: string, options: any) => {\n      const configManager = new ConfigManager();\n      const statusManager = new PRStatusManager(configManager);\n      const relationshipManager = new RelationshipManager(configManager);\n\n      try {\n        const result = await forceSyncPRTask(\n          prId,\n          taskId,\n          options.direction,\n          statusManager,\n          relationshipManager,\n          configManager\n        );\n\n        if (result.success) {\n          console.log(colors.green(`✅ Successfully synced ${prId} ↔ ${taskId}`));\n          console.log(`📋 Direction: ${options.direction}`);\n          if (result.changes && result.changes.length > 0) {\n            console.log('📝 Changes:');\n            result.changes.forEach((change) => console.log(`  - ${change}`));\n          }\n        } else {\n          console.error(colors.red(`❌ Failed to sync ${prId} ↔ ${taskId}`));\n          if (result.error) {\n            console.error(colors.red(`  Error: ${result.error}`));\n          }\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          colors.red(\n            `❌ Error during force sync: ${error instanceof Error ? error.message : String(error)}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function performSync(\n  options: SyncOptions,\n  statusManager: PRStatusManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<SyncResult> {\n  const result: SyncResult = {\n    success: false,\n    direction: options.direction,\n    totalPRs: 0,\n    totalTasks: 0,\n    syncedPRs: 0,\n    syncedTasks: 0,\n    createdPRs: 0,\n    createdTasks: 0,\n    updatedPRs: 0,\n    updatedTasks: 0,\n    completedTasks: 0,\n    errors: [],\n    warnings: [],\n    details: [],\n  };\n\n  try {\n    // Get all sync mappings\n    const mappings = await getSyncMappings(statusManager, relationshipManager, configManager);\n\n    result.totalPRs = new Set(mappings.map((m) => m.prId)).size;\n    result.totalTasks = new Set(mappings.map((m) => m.taskId)).size;\n\n    console.log(colors.blue(`🔄 Starting sync operation: ${options.direction}`));\n    console.log(`📊 Found ${mappings.length} PR-task relationships`);\n\n    // Filter mappings that need sync\n    const needsSync = mappings.filter((m) => m.syncRequired || options.force);\n\n    if (needsSync.length === 0) {\n      console.log(colors.green('✅ All PRs and tasks are already synchronized'));\n      result.success = true;\n      return result;\n    }\n\n    console.log(colors.yellow(`⚠️  ${needsSync.length} relationships need synchronization`));\n\n    // Perform sync based on direction\n    for (const mapping of needsSync) {\n      const detail = await syncPRTask(\n        mapping,\n        options,\n        statusManager,\n        relationshipManager,\n        configManager\n      );\n      result.details.push(detail);\n\n      if (detail.success) {\n        if (detail.action.includes('updated PR')) result.updatedPRs++;\n        if (detail.action.includes('updated task')) result.updatedTasks++;\n        if (detail.action.includes('completed task')) result.completedTasks++;\n        if (detail.action.includes('created PR')) result.createdPRs++;\n        if (detail.action.includes('created task')) result.createdTasks++;\n      } else {\n        result.errors.push(`${mapping.prId} ↔ ${mapping.taskId}: ${detail.error}`);\n      }\n    }\n\n    result.syncedPRs = result.updatedPRs + result.createdPRs;\n    result.syncedTasks = result.updatedTasks + result.createdTasks;\n    result.success = result.errors.length === 0;\n\n    return result;\n  } catch (error) {\n    result.errors.push(\n      `Sync operation failed: ${error instanceof Error ? error.message : String(error)}`\n    );\n    return result;\n  }\n}\n\nasync function getSyncMappings(\n  statusManager: PRStatusManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<SyncMapping[]> {\n  const mappings: SyncMapping[] = [];\n\n  // Get all PRs\n  const allPRs = await statusManager.listPRs();\n\n  for (const pr of allPRs) {\n    // Get linked tasks for this PR\n    const linkedTasks = await relationshipManager.getLinkedTasks(pr.pr_id);\n\n    for (const taskId of linkedTasks) {\n      const task = await loadTaskData(taskId, configManager);\n\n      if (task) {\n        const mapping = createSyncMapping(pr, task);\n        mappings.push(mapping);\n      }\n    }\n  }\n\n  return mappings;\n}\n\nfunction createSyncMapping(pr: PRData, task: TaskData): SyncMapping {\n  const mapping: SyncMapping = {\n    prId: pr.pr_id,\n    taskId: task.task_id,\n    issueId: task.issue_id,\n    prStatus: pr.pr_status,\n    taskStatus: task.status,\n    prAssignee: pr.assignee,\n    taskAssignee: task.assignee,\n    prUpdated: pr.updated_date,\n    taskUpdated: task.updated_date,\n    syncRequired: false,\n    syncDirection: 'pr-to-task',\n    conflictReasons: [],\n  };\n\n  // Determine if sync is required and direction\n  const prNewer = new Date(pr.updated_date) > new Date(task.updated_date);\n  const taskNewer = new Date(task.updated_date) > new Date(pr.updated_date);\n\n  const statusMismatch = !isStatusSynced(pr.pr_status, task.status);\n  const assigneeMismatch = pr.assignee !== task.assignee;\n\n  if (statusMismatch || assigneeMismatch) {\n    mapping.syncRequired = true;\n\n    if (prNewer) {\n      mapping.syncDirection = 'pr-to-task';\n    } else if (taskNewer) {\n      mapping.syncDirection = 'task-to-pr';\n    } else {\n      mapping.syncDirection = 'conflict';\n      mapping.conflictReasons.push('Same timestamp but different status/assignee');\n    }\n  }\n\n  // Check for conflicts\n  if (statusMismatch && !canSyncStatus(pr.pr_status, task.status)) {\n    mapping.syncDirection = 'conflict';\n    mapping.conflictReasons.push(`Cannot sync status: ${pr.pr_status} ↔ ${task.status}`);\n  }\n\n  return mapping;\n}\n\nfunction isStatusSynced(prStatus: PRStatus, taskStatus: ItemStatus): boolean {\n  const syncMap: Record<PRStatus, ItemStatus> = {\n    draft: 'planning',\n    open: 'active',\n    review: 'active',\n    approved: 'active',\n    merged: 'completed',\n    closed: 'archived',\n  };\n\n  return syncMap[prStatus] === taskStatus;\n}\n\nfunction canSyncStatus(prStatus: PRStatus, taskStatus: ItemStatus): boolean {\n  // Define which status transitions are allowed\n  const allowedTransitions: Record<PRStatus, ItemStatus[]> = {\n    draft: ['planning', 'active'],\n    open: ['active'],\n    review: ['active'],\n    approved: ['active', 'completed'],\n    merged: ['completed'],\n    closed: ['archived'],\n  };\n\n  return allowedTransitions[prStatus]?.includes(taskStatus) || false;\n}\n\nasync function syncPRTask(\n  mapping: SyncMapping,\n  options: SyncOptions,\n  statusManager: PRStatusManager,\n  _relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<SyncDetail> {\n  const detail: SyncDetail = {\n    prId: mapping.prId,\n    taskId: mapping.taskId,\n    action: 'sync',\n    success: false,\n    message: '',\n    changes: [],\n  };\n\n  try {\n    // Handle conflicts\n    if (mapping.syncDirection === 'conflict' && !options.force) {\n      detail.message = `Conflict detected: ${mapping.conflictReasons.join(', ')}`;\n      detail.error = 'Use --force to override conflicts';\n      return detail;\n    }\n\n    // Load current data\n    const pr = await statusManager.loadPRData(mapping.prId);\n    const task = await loadTaskData(mapping.taskId, configManager);\n\n    if (!pr || !task) {\n      detail.error = `Could not load PR ${mapping.prId} or task ${mapping.taskId}`;\n      return detail;\n    }\n\n    // Determine sync direction\n    let syncDirection = mapping.syncDirection;\n    if (options.direction !== 'bidirectional') {\n      syncDirection = options.direction;\n    }\n\n    const changes: string[] = [];\n\n    // Perform sync based on direction\n    if (syncDirection === 'pr-to-task' || syncDirection === 'conflict') {\n      // Update task based on PR\n      if (pr.pr_status !== mapping.prStatus || options.force) {\n        const newTaskStatus = getTaskStatusFromPR(pr.pr_status);\n\n        if (!options.dryRun) {\n          await updateTaskStatus(task, newTaskStatus, configManager);\n        }\n\n        changes.push(`Updated task status: ${task.status} → ${newTaskStatus}`);\n\n        // Auto-complete task if PR is merged\n        if (options.autoComplete && pr.pr_status === 'merged') {\n          if (!options.dryRun) {\n            await updateTaskStatus(task, 'completed', configManager);\n          }\n          changes.push('Auto-completed task (PR merged)');\n        }\n      }\n\n      // Sync assignee if requested\n      if (options.syncAssignees && pr.assignee !== task.assignee) {\n        if (!options.dryRun) {\n          await updateTaskAssignee(task, pr.assignee, configManager);\n        }\n        changes.push(`Updated task assignee: ${task.assignee} → ${pr.assignee}`);\n      }\n    }\n\n    if (syncDirection === 'task-to-pr' || syncDirection === 'conflict') {\n      // Update PR based on task\n      if (task.status !== mapping.taskStatus || options.force) {\n        const newPRStatus = getPRStatusFromTask(task.status);\n\n        if (!options.dryRun) {\n          await statusManager.updatePRStatus(pr.pr_id, newPRStatus);\n        }\n\n        changes.push(`Updated PR status: ${pr.pr_status} → ${newPRStatus}`);\n      }\n\n      // Sync assignee if requested\n      if (options.syncAssignees && task.assignee !== pr.assignee) {\n        if (!options.dryRun) {\n          await updatePRAssignee(pr, task.assignee, configManager);\n        }\n        changes.push(`Updated PR assignee: ${pr.assignee} → ${task.assignee}`);\n      }\n    }\n\n    // Sync timestamps if requested\n    if (options.syncTimestamps) {\n      const latestDate = new Date(\n        Math.max(new Date(pr.updated_date).getTime(), new Date(task.updated_date).getTime())\n      ).toISOString();\n\n      if (!options.dryRun) {\n        await updateTimestamps(pr, task, latestDate, configManager);\n      }\n\n      changes.push(`Synced timestamps to: ${latestDate}`);\n    }\n\n    detail.success = true;\n    detail.changes = changes;\n    detail.message =\n      changes.length > 0 ? `Synced successfully (${changes.length} changes)` : 'Already in sync';\n    detail.action = `synced ${syncDirection}`;\n\n    return detail;\n  } catch (error) {\n    detail.error = error instanceof Error ? error.message : String(error);\n    detail.message = 'Sync failed';\n    return detail;\n  }\n}\n\nfunction getTaskStatusFromPR(prStatus: PRStatus): ItemStatus {\n  const statusMap: Record<PRStatus, ItemStatus> = {\n    draft: 'planning',\n    open: 'active',\n    review: 'active',\n    approved: 'active',\n    merged: 'completed',\n    closed: 'archived',\n  };\n\n  return statusMap[prStatus] || 'active';\n}\n\nfunction getPRStatusFromTask(taskStatus: ItemStatus): PRStatus {\n  const statusMap: Record<ItemStatus, PRStatus> = {\n    planning: 'draft',\n    active: 'open',\n    completed: 'merged',\n    archived: 'closed',\n  };\n\n  return statusMap[taskStatus] || 'open';\n}\n\nasync function loadTaskData(\n  taskId: string,\n  configManager: ConfigManager\n): Promise<TaskData | null> {\n  try {\n    const tasksDir = configManager.getTasksDirectory();\n    const taskFiles = fs.readdirSync(tasksDir).filter((file) => file.includes(taskId));\n\n    if (taskFiles.length === 0) {\n      return null;\n    }\n\n    const taskFile = taskFiles[0];\n    const taskPath = path.join(tasksDir, taskFile);\n\n    // This is a simplified loader - in practice, you'd use the frontmatter parser\n    const content = fs.readFileSync(taskPath, 'utf8');\n\n    // Mock task data for demonstration\n    return {\n      task_id: taskId,\n      issue_id: 'ISSUE-001',\n      epic_id: 'EPIC-001',\n      title: 'Task Title',\n      description: 'Task Description',\n      status: 'active',\n      priority: 'medium',\n      assignee: 'system',\n      created_date: new Date().toISOString(),\n      updated_date: new Date().toISOString(),\n      estimated_tokens: 0,\n      actual_tokens: 0,\n      ai_context: [],\n      sync_status: 'local',\n      content: content,\n      file_path: taskPath,\n    };\n  } catch (error) {\n    console.error(`Error loading task ${taskId}:`, error);\n    return null;\n  }\n}\n\nasync function updateTaskStatus(\n  task: TaskData,\n  newStatus: ItemStatus,\n  _configManager: ConfigManager\n): Promise<void> {\n  try {\n    const content = fs.readFileSync(task.file_path, 'utf8');\n    const updatedContent = content\n      .replace(/status:\\s*\\w+/, `status: ${newStatus}`)\n      .replace(/updated_date:\\s*[^\\n]+/, `updated_date: ${new Date().toISOString()}`);\n\n    fs.writeFileSync(task.file_path, updatedContent, 'utf8');\n  } catch (error) {\n    console.error(`Error updating task ${task.task_id}:`, error);\n  }\n}\n\nasync function updateTaskAssignee(\n  task: TaskData,\n  newAssignee: string,\n  _configManager: ConfigManager\n): Promise<void> {\n  try {\n    const content = fs.readFileSync(task.file_path, 'utf8');\n    const updatedContent = content\n      .replace(/assignee:\\s*[^\\n]+/, `assignee: ${newAssignee}`)\n      .replace(/updated_date:\\s*[^\\n]+/, `updated_date: ${new Date().toISOString()}`);\n\n    fs.writeFileSync(task.file_path, updatedContent, 'utf8');\n  } catch (error) {\n    console.error(`Error updating task assignee ${task.task_id}:`, error);\n  }\n}\n\nasync function updatePRAssignee(\n  pr: PRData,\n  newAssignee: string,\n  _configManager: ConfigManager\n): Promise<void> {\n  try {\n    const content = fs.readFileSync(pr.file_path, 'utf8');\n    const updatedContent = content\n      .replace(/assignee:\\s*[^\\n]+/, `assignee: ${newAssignee}`)\n      .replace(/updated_date:\\s*[^\\n]+/, `updated_date: ${new Date().toISOString()}`);\n\n    fs.writeFileSync(pr.file_path, updatedContent, 'utf8');\n  } catch (error) {\n    console.error(`Error updating PR assignee ${pr.pr_id}:`, error);\n  }\n}\n\nasync function updateTimestamps(\n  pr: PRData,\n  task: TaskData,\n  timestamp: string,\n  _configManager: ConfigManager\n): Promise<void> {\n  try {\n    // Update PR timestamp\n    const prContent = fs.readFileSync(pr.file_path, 'utf8');\n    const updatedPRContent = prContent.replace(\n      /updated_date:\\s*[^\\n]+/,\n      `updated_date: ${timestamp}`\n    );\n    fs.writeFileSync(pr.file_path, updatedPRContent, 'utf8');\n\n    // Update task timestamp\n    const taskContent = fs.readFileSync(task.file_path, 'utf8');\n    const updatedTaskContent = taskContent.replace(\n      /updated_date:\\s*[^\\n]+/,\n      `updated_date: ${timestamp}`\n    );\n    fs.writeFileSync(task.file_path, updatedTaskContent, 'utf8');\n  } catch (error) {\n    console.error(`Error updating timestamps for ${pr.pr_id} ↔ ${task.task_id}:`, error);\n  }\n}\n\nasync function forceSyncPRTask(\n  prId: string,\n  taskId: string,\n  direction: string,\n  statusManager: PRStatusManager,\n  relationshipManager: RelationshipManager,\n  configManager: ConfigManager\n): Promise<SyncDetail> {\n  const pr = await statusManager.loadPRData(prId);\n  const task = await loadTaskData(taskId, configManager);\n\n  if (!pr || !task) {\n    return {\n      prId,\n      taskId,\n      action: 'force-sync',\n      success: false,\n      message: 'PR or task not found',\n      error: `Could not load PR ${prId} or task ${taskId}`,\n    };\n  }\n\n  const mapping = createSyncMapping(pr, task);\n\n  const syncOptions: SyncOptions = {\n    direction: direction as any,\n    autoCreate: false,\n    autoComplete: true,\n    updateDescriptions: false,\n    syncTimestamps: true,\n    syncAssignees: true,\n    dryRun: false,\n    force: true,\n  };\n\n  return await syncPRTask(mapping, syncOptions, statusManager, relationshipManager, configManager);\n}\n\nfunction displaySyncResult(result: SyncResult): void {\n  console.log(colors.cyan(`\\n📊 Sync operation completed`));\n  console.log(`🎯 Direction: ${result.direction}`);\n  console.log(`📋 Total PRs: ${result.totalPRs}`);\n  console.log(`📝 Total Tasks: ${result.totalTasks}`);\n  console.log(`🔄 Synced PRs: ${result.syncedPRs}`);\n  console.log(`🔄 Synced Tasks: ${result.syncedTasks}`);\n\n  if (result.createdPRs > 0) {\n    console.log(`➕ Created PRs: ${result.createdPRs}`);\n  }\n\n  if (result.createdTasks > 0) {\n    console.log(`➕ Created Tasks: ${result.createdTasks}`);\n  }\n\n  if (result.completedTasks > 0) {\n    console.log(`✅ Completed Tasks: ${result.completedTasks}`);\n  }\n\n  if (result.details.length > 0) {\n    console.log('\\n📋 Sync Details:');\n    result.details.forEach((detail) => {\n      const icon = detail.success ? '✅' : '❌';\n      const color = detail.success ? colors.green : colors.red;\n      console.log(color(`${icon} ${detail.prId} ↔ ${detail.taskId}: ${detail.message}`));\n\n      if (detail.changes && detail.changes.length > 0) {\n        detail.changes.forEach((change) => {\n          console.log(colors.blue(`    - ${change}`));\n        });\n      }\n    });\n  }\n\n  if (result.warnings.length > 0) {\n    console.log(colors.yellow('\\n⚠️  Warnings:'));\n    result.warnings.forEach((warning) => {\n      console.log(colors.yellow(`  - ${warning}`));\n    });\n  }\n\n  if (result.errors.length > 0) {\n    console.log(colors.red('\\n❌ Errors:'));\n    result.errors.forEach((error) => {\n      console.log(colors.red(`  - ${error}`));\n    });\n  }\n\n  const successColor = result.success ? colors.green : colors.red;\n  const successIcon = result.success ? '✅' : '❌';\n  console.log(\n    successColor(`\\n${successIcon} Sync ${result.success ? 'completed successfully' : 'failed'}`)\n  );\n}\n\nfunction displaySyncMappings(mappings: SyncMapping[], format: string, _formatter: Formatter): void {\n  if (format === 'json') {\n    console.log(JSON.stringify(mappings, null, 2));\n  } else {\n    console.log(colors.blue(`\\n📊 PR-Task Sync Status (${mappings.length} relationships)`));\n\n    console.table(\n      mappings.map((mapping) => ({\n        'PR ID': mapping.prId,\n        'Task ID': mapping.taskId,\n        'PR Status': mapping.prStatus,\n        'Task Status': mapping.taskStatus,\n        'Sync Required': mapping.syncRequired ? 'Yes' : 'No',\n        Direction: mapping.syncDirection,\n        Conflicts: mapping.conflictReasons.length > 0 ? mapping.conflictReasons.join(', ') : 'None',\n      }))\n    );\n\n    const needsSync = mappings.filter((m) => m.syncRequired).length;\n    const conflicts = mappings.filter((m) => m.syncDirection === 'conflict').length;\n\n    console.log(colors.cyan(`\\n📈 Summary:`));\n    console.log(`🔄 Needs Sync: ${needsSync}`);\n    console.log(`⚠️  Conflicts: ${conflicts}`);\n    console.log(`✅ In Sync: ${mappings.length - needsSync}`);\n  }\n}\n\nexport type { SyncOptions, SyncResult, SyncMapping };\n","/**\n * PR Update Command\n * Updates PR status, metadata, and handles state transitions\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { PRData, PRStatus, Priority } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface UpdateOptions {\n  status?: PRStatus;\n  priority?: Priority;\n  assignee?: string;\n  title?: string;\n  description?: string;\n  branchName?: string;\n  sourceBranch?: string;\n  targetBranch?: string;\n  repositoryUrl?: string;\n  addReviewer?: string;\n  removeReviewer?: string;\n  addTag?: string;\n  removeTag?: string;\n  addDependency?: string;\n  removeDependency?: string;\n  milestone?: string;\n  estimatedTokens?: number;\n  dryRun?: boolean;\n}\n\nexport function createPRUpdateCommand(): Command {\n  const cmd = new Command('update');\n\n  cmd\n    .description('Update PR status, metadata, and properties')\n    .argument('<pr-id>', 'PR ID to update')\n    .option('-s, --status <status>', 'update PR status (draft|open|review|approved|merged|closed)')\n    .option('-p, --priority <priority>', 'update priority (low|medium|high|critical)')\n    .option('-a, --assignee <username>', 'update assignee')\n    .option('-t, --title <title>', 'update title')\n    .option('-d, --description <text>', 'update description')\n    .option('--branch-name <name>', 'update branch name')\n    .option('--source-branch <name>', 'update source branch')\n    .option('--target-branch <name>', 'update target branch')\n    .option('--repository-url <url>', 'update repository URL')\n    .option('--add-reviewer <username>', 'add a reviewer')\n    .option('--remove-reviewer <username>', 'remove a reviewer')\n    .option('--add-tag <tag>', 'add a tag')\n    .option('--remove-tag <tag>', 'remove a tag')\n    .option('--add-dependency <id>', 'add a dependency')\n    .option('--remove-dependency <id>', 'remove a dependency')\n    .option('--milestone <milestone>', 'update milestone')\n    .option('--estimated-tokens <number>', 'update estimated tokens')\n    .option('--dry-run', 'show what would be updated without making changes')\n    .action(async (prId: string, options: UpdateOptions) => {\n      try {\n        await updatePR(prId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to update PR: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function updatePR(prId: string, options: UpdateOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n  const parser = new FrontmatterParser();\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n\n  // Find the PR\n  const prHierarchy = relationshipManager.getPRHierarchy(prId);\n  if (!prHierarchy) {\n    throw new Error(`PR not found: ${prId}`);\n  }\n\n  const pr = prHierarchy.pr;\n  const originalStatus = pr.pr_status;\n\n  // Validate status transition if status is being updated\n  if (options.status && !isValidStatusTransition(originalStatus, options.status)) {\n    throw new Error(`Invalid status transition: ${originalStatus} → ${options.status}`);\n  }\n\n  // Validate priority\n  if (options.priority && !['low', 'medium', 'high', 'critical'].includes(options.priority)) {\n    throw new Error(\n      `Invalid priority: ${options.priority}. Must be one of: low, medium, high, critical`\n    );\n  }\n\n  // Validate PR status\n  if (\n    options.status &&\n    !['draft', 'open', 'review', 'approved', 'merged', 'closed'].includes(options.status)\n  ) {\n    throw new Error(\n      `Invalid PR status: ${options.status}. Must be one of: draft, open, review, approved, merged, closed`\n    );\n  }\n\n  // Handle reviewer updates\n  let updatedReviewers = [...(pr.reviewers || [])];\n  if (options.addReviewer) {\n    if (!updatedReviewers.includes(options.addReviewer)) {\n      updatedReviewers.push(options.addReviewer);\n    }\n  }\n  if (options.removeReviewer) {\n    updatedReviewers = updatedReviewers.filter((r) => r !== options.removeReviewer);\n  }\n\n  // Handle tag updates\n  let updatedTags = [...(pr.tags || [])];\n  if (options.addTag) {\n    if (!updatedTags.includes(options.addTag)) {\n      updatedTags.push(options.addTag);\n    }\n  }\n  if (options.removeTag) {\n    updatedTags = updatedTags.filter((t) => t !== options.removeTag);\n  }\n\n  // Handle dependency updates\n  let updatedDependencies = [...(pr.dependencies || [])];\n  if (options.addDependency) {\n    if (!updatedDependencies.includes(options.addDependency)) {\n      updatedDependencies.push(options.addDependency);\n    }\n  }\n  if (options.removeDependency) {\n    updatedDependencies = updatedDependencies.filter((d) => d !== options.removeDependency);\n  }\n\n  // Handle approvals - clear if moving back to draft or open\n  let updatedApprovals = [...(pr.approvals || [])];\n  if (options.status && (options.status === 'draft' || options.status === 'open')) {\n    updatedApprovals = [];\n  }\n\n  const now = new Date().toISOString();\n\n  // Build update object\n  const updates: Partial<PRData> = {\n    updated_date: now,\n  };\n\n  // Add all specified updates\n  if (options.status) updates.pr_status = options.status;\n  if (options.priority) updates.priority = options.priority;\n  if (options.assignee) updates.assignee = options.assignee;\n  if (options.title) updates.title = options.title;\n  if (options.description) updates.description = options.description;\n  if (options.branchName) updates.branch_name = options.branchName;\n  if (options.sourceBranch) updates.source_branch = options.sourceBranch;\n  if (options.targetBranch) updates.target_branch = options.targetBranch;\n  if (options.repositoryUrl) updates.repository_url = options.repositoryUrl;\n  if (options.milestone) updates.milestone = options.milestone;\n  if (options.estimatedTokens !== undefined) updates.estimated_tokens = options.estimatedTokens;\n\n  // Update arrays only if they changed\n  if (options.addReviewer || options.removeReviewer) {\n    updates.reviewers = updatedReviewers.length > 0 ? updatedReviewers : undefined;\n  }\n  if (options.addTag || options.removeTag) {\n    updates.tags = updatedTags.length > 0 ? updatedTags : undefined;\n  }\n  if (options.addDependency || options.removeDependency) {\n    updates.dependencies = updatedDependencies.length > 0 ? updatedDependencies : undefined;\n  }\n  if (options.status && (options.status === 'draft' || options.status === 'open')) {\n    updates.approvals = updatedApprovals.length > 0 ? updatedApprovals : undefined;\n  }\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - PR would be updated with:'));\n    console.log(Formatter.debug(`PR ID: ${prId}`));\n    console.log(Formatter.debug(`Current Title: ${pr.title}`));\n    console.log(Formatter.debug(`Current Status: ${pr.pr_status}`));\n    console.log(Formatter.debug(`Current Priority: ${pr.priority}`));\n    console.log(Formatter.debug(`Current Assignee: ${pr.assignee}`));\n\n    console.log('');\n    console.log(Formatter.info('Proposed Changes:'));\n    Object.entries(updates).forEach(([key, value]) => {\n      if (key !== 'updated_date') {\n        console.log(Formatter.debug(`  ${key}: ${JSON.stringify(value)}`));\n      }\n    });\n\n    if (options.status && options.status !== originalStatus) {\n      console.log(Formatter.debug(`Status Change: ${originalStatus} → ${options.status}`));\n    }\n\n    return;\n  }\n\n  // Check if there are any actual changes\n  const hasChanges = Object.keys(updates).length > 1; // More than just updated_date\n  if (!hasChanges) {\n    console.log(Formatter.warning('No changes specified. Use --help to see available options.'));\n    return;\n  }\n\n  // Apply updates\n  parser.updateFile(pr.file_path, updates);\n\n  // Handle status-based file movement if status changed\n  if (options.status && options.status !== originalStatus) {\n    await handleStatusTransition(pr, options.status, paths);\n  }\n\n  // Create update log entry\n  const updateLogEntry = {\n    timestamp: now,\n    pr_id: prId,\n    changes: updates,\n    previous_status: originalStatus,\n    new_status: options.status || originalStatus,\n  };\n\n  // Log the update\n  await logPRUpdate(updateLogEntry, paths);\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`PR updated successfully!`));\n  console.log(Formatter.info(`PR: ${prId} - ${updates.title || pr.title}`));\n  console.log(Formatter.info(`File: ${pr.file_path}`));\n\n  if (options.status && options.status !== originalStatus) {\n    console.log(Formatter.info(`Status: ${originalStatus} → ${options.status}`));\n  }\n\n  // Show key changes\n  console.log('');\n  console.log(Formatter.info('Updated Fields:'));\n  Object.entries(updates).forEach(([key, value]) => {\n    if (key !== 'updated_date') {\n      console.log(Formatter.info(`  ${key}: ${JSON.stringify(value)}`));\n    }\n  });\n\n  // Show status-specific information\n  if (options.status) {\n    console.log('');\n    switch (options.status) {\n      case 'draft':\n        console.log(Formatter.info('📝 PR is now in draft status'));\n        console.log(\n          Formatter.info('Use `aitrackdown pr update --status open` when ready for review')\n        );\n        break;\n      case 'open':\n        console.log(Formatter.info('🔓 PR is now open for review'));\n        console.log(Formatter.info('Use `aitrackdown pr review` to add reviews'));\n        break;\n      case 'review':\n        console.log(Formatter.info('👀 PR is under review'));\n        console.log(Formatter.info('Use `aitrackdown pr approve` to approve'));\n        break;\n      case 'approved':\n        console.log(Formatter.info('✅ PR is approved'));\n        console.log(Formatter.info('Use `aitrackdown pr merge` to merge'));\n        break;\n      case 'merged':\n        console.log(Formatter.success('🎉 PR is merged'));\n        console.log(Formatter.info('Linked tasks updated if applicable'));\n        break;\n      case 'closed':\n        console.log(Formatter.info('🔒 PR is closed'));\n        console.log(Formatter.info('Use `aitrackdown pr update --status open` to reopen'));\n        break;\n    }\n  }\n}\n\nfunction isValidStatusTransition(currentStatus: PRStatus, newStatus: PRStatus): boolean {\n  // Define valid status transitions\n  const validTransitions: Record<PRStatus, PRStatus[]> = {\n    draft: ['open', 'closed'],\n    open: ['draft', 'review', 'approved', 'merged', 'closed'],\n    review: ['open', 'approved', 'closed'],\n    approved: ['review', 'merged', 'closed'],\n    merged: [], // Merged PRs cannot transition to other states\n    closed: ['draft', 'open'], // Closed PRs can be reopened\n  };\n\n  return validTransitions[currentStatus].includes(newStatus);\n}\n\nasync function handleStatusTransition(pr: PRData, newStatus: PRStatus, paths: any): Promise<void> {\n  // Define status-based directories\n  const statusDirs = {\n    draft: path.join(paths.prsDir, 'draft'),\n    open: path.join(paths.prsDir, 'active'),\n    review: path.join(paths.prsDir, 'active'),\n    approved: path.join(paths.prsDir, 'active'),\n    merged: path.join(paths.prsDir, 'merged'),\n    closed: path.join(paths.prsDir, 'closed'),\n  };\n\n  // Get current and target directories\n  const currentDir = path.dirname(pr.file_path);\n  const targetDir = statusDirs[newStatus];\n\n  // Only move if different directory\n  if (currentDir !== targetDir) {\n    // Ensure target directory exists\n    if (!fs.existsSync(targetDir)) {\n      fs.mkdirSync(targetDir, { recursive: true });\n    }\n\n    // Generate new file path\n    const fileName = path.basename(pr.file_path);\n    const newFilePath = path.join(targetDir, fileName);\n\n    // Move the file\n    fs.renameSync(pr.file_path, newFilePath);\n\n    console.log(Formatter.info(`Moved PR file: ${currentDir} → ${targetDir}`));\n  }\n}\n\nasync function logPRUpdate(updateLogEntry: any, paths: any): Promise<void> {\n  try {\n    const logDir = path.join(paths.prsDir, 'logs');\n    if (!fs.existsSync(logDir)) {\n      fs.mkdirSync(logDir, { recursive: true });\n    }\n\n    const logFile = path.join(logDir, 'pr-updates.log');\n    const logLine = `${JSON.stringify(updateLogEntry)}\\n`;\n\n    fs.appendFileSync(logFile, logLine);\n  } catch (error) {\n    console.warn(\n      Formatter.warning(\n        `Failed to log update: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n  }\n}\n","/**\n * PR Command Group for AI-Trackdown\n * Pull request tracking within issues\n */\n\nimport { Command } from 'commander';\nimport { createPRApproveCommand } from './pr/approve.js';\nimport { createPRArchiveCommand } from './pr/archive.js';\nimport { createPRBatchCommand } from './pr/batch.js';\nimport { createPRCloseCommand } from './pr/close.js';\nimport { createPRCreateCommand } from './pr/create.js';\nimport { createPRDependenciesCommand } from './pr/dependencies.js';\nimport { createPRListCommand } from './pr/list.js';\nimport { createPRMergeCommand } from './pr/merge.js';\nimport { createPRReviewCommand } from './pr/review.js';\nimport { createPRShowCommand } from './pr/show.js';\nimport { createPRSyncCommand } from './pr/sync.js';\nimport { createPRUpdateCommand } from './pr/update.js';\n\nexport function createPRCommand(): Command {\n  const cmd = new Command('pr');\n\n  cmd\n    .description('Manage PRs (pull request tracking within issues)')\n    .alias('prs')\n    .addCommand(createPRCreateCommand())\n    .addCommand(createPRListCommand())\n    .addCommand(createPRShowCommand())\n    .addCommand(createPRReviewCommand())\n    .addCommand(createPRApproveCommand())\n    .addCommand(createPRUpdateCommand())\n    .addCommand(createPRMergeCommand())\n    .addCommand(createPRCloseCommand())\n    .addCommand(createPRBatchCommand())\n    .addCommand(createPRDependenciesCommand())\n    .addCommand(createPRSyncCommand())\n    .addCommand(createPRArchiveCommand());\n\n  return cmd;\n}\n","import { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport class GitManager {\n  /**\n   * Get the project root directory\n   */\n  private static getProjectRoot(): string {\n    let current = process.cwd();\n    while (current !== path.dirname(current)) {\n      if (fs.existsSync(path.join(current, '.git'))) {\n        return current;\n      }\n      current = path.dirname(current);\n    }\n    throw new Error('Not in a git repository');\n  }\n\n  /**\n   * Check if we're in a git repository\n   */\n  static isGitRepository(): boolean {\n    try {\n      execSync('git rev-parse --git-dir', { stdio: 'ignore' });\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Check if there are uncommitted changes\n   */\n  static hasUncommittedChanges(): boolean {\n    try {\n      const output = execSync('git status --porcelain', { encoding: 'utf8' });\n      return output.trim().length > 0;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Get the current branch name\n   */\n  static getCurrentBranch(): string {\n    try {\n      return execSync('git branch --show-current', { encoding: 'utf8' }).trim();\n    } catch {\n      throw new Error('Could not determine current branch');\n    }\n  }\n\n  /**\n   * Create a git tag\n   */\n  static createTag(version: string, message?: string): void {\n    if (!GitManager.isGitRepository()) {\n      throw new Error('Not in a git repository');\n    }\n\n    const tagName = `v${version}`;\n    const tagMessage = message || `Release version ${version}`;\n\n    try {\n      // Check if tag already exists\n      execSync(`git tag -l ${tagName}`, { stdio: 'ignore' });\n      throw new Error(`Tag ${tagName} already exists`);\n    } catch (_error) {\n      // Tag doesn't exist, which is what we want\n    }\n\n    try {\n      execSync(`git tag -a ${tagName} -m \"${tagMessage}\"`);\n    } catch (error) {\n      throw new Error(`Failed to create tag: ${error}`);\n    }\n  }\n\n  /**\n   * Push tags to remote\n   */\n  static pushTags(): void {\n    if (!GitManager.isGitRepository()) {\n      throw new Error('Not in a git repository');\n    }\n\n    try {\n      execSync('git push --tags');\n    } catch (error) {\n      throw new Error(`Failed to push tags: ${error}`);\n    }\n  }\n\n  /**\n   * Get list of existing tags\n   */\n  static getTags(): string[] {\n    if (!GitManager.isGitRepository()) {\n      return [];\n    }\n\n    try {\n      const output = execSync('git tag -l', { encoding: 'utf8' });\n      return output\n        .trim()\n        .split('\\n')\n        .filter((tag) => tag.trim());\n    } catch {\n      return [];\n    }\n  }\n\n  /**\n   * Get the last tag\n   */\n  static getLastTag(): string | null {\n    if (!GitManager.isGitRepository()) {\n      return null;\n    }\n\n    try {\n      const output = execSync('git describe --tags --abbrev=0', { encoding: 'utf8' });\n      return output.trim();\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Commit changes with a message\n   */\n  static commit(message: string, files?: string[]): void {\n    if (!GitManager.isGitRepository()) {\n      throw new Error('Not in a git repository');\n    }\n\n    try {\n      // Add files if specified\n      if (files && files.length > 0) {\n        for (const file of files) {\n          execSync(`git add \"${file}\"`);\n        }\n      }\n\n      // Commit with message\n      execSync(`git commit -m \"${message}\"`);\n    } catch (error) {\n      throw new Error(`Failed to commit changes: ${error}`);\n    }\n  }\n\n  /**\n   * Get commits since a specific tag or commit\n   */\n  static getCommitsSince(since: string): string[] {\n    if (!GitManager.isGitRepository()) {\n      return [];\n    }\n\n    try {\n      const output = execSync(`git log ${since}..HEAD --oneline`, { encoding: 'utf8' });\n      return output\n        .trim()\n        .split('\\n')\n        .filter((line) => line.trim());\n    } catch {\n      return [];\n    }\n  }\n\n  /**\n   * Check if a tag exists\n   */\n  static tagExists(tag: string): boolean {\n    if (!GitManager.isGitRepository()) {\n      return false;\n    }\n\n    try {\n      execSync(`git tag -l ${tag}`, { stdio: 'ignore' });\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Get repository URL\n   */\n  static getRepositoryUrl(): string | null {\n    if (!GitManager.isGitRepository()) {\n      return null;\n    }\n\n    try {\n      const output = execSync('git config --get remote.origin.url', { encoding: 'utf8' });\n      return output.trim();\n    } catch {\n      return null;\n    }\n  }\n}\n","/**\n * Git Metadata Extraction Service\n * Comprehensive Git repository metadata extraction for AI-Trackdown CLI project creation\n */\n\nimport { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { ProjectFrontmatter } from '../types/ai-trackdown.js';\nimport { GitManager } from './git.js';\n\nexport interface GitMetadata {\n  // Repository information\n  repository_url?: string;\n  clone_url?: string;\n  git_origin?: string;\n  default_branch?: string;\n  current_branch?: string;\n\n  // Project analysis\n  languages?: string[];\n  framework?: string;\n  license?: string;\n\n  // Team information\n  team_members?: string[];\n  contributors?: GitContributor[];\n\n  // Repository health\n  is_git_repo: boolean;\n  has_uncommitted_changes: boolean;\n  commit_count: number;\n  last_commit_date?: string;\n\n  // Additional metadata\n  repository_size?: string;\n  total_files?: number;\n  readme_exists: boolean;\n  package_manager?: string;\n}\n\nexport interface GitContributor {\n  name: string;\n  email: string;\n  commits: number;\n  first_commit: string;\n  last_commit: string;\n}\n\nexport interface LanguageStats {\n  language: string;\n  files: number;\n  lines?: number;\n  percentage?: number;\n}\n\nexport interface FrameworkDetection {\n  name: string;\n  version?: string;\n  config_files: string[];\n  confidence: number;\n}\n\nexport class GitMetadataExtractor {\n  private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n  private static cache = new Map<string, { data: GitMetadata; timestamp: number }>();\n\n  private readonly projectPath: string;\n  private readonly enableCache: boolean;\n\n  constructor(projectPath: string = process.cwd(), enableCache: boolean = true) {\n    this.projectPath = path.resolve(projectPath);\n    this.enableCache = enableCache;\n  }\n\n  /**\n   * Extract comprehensive Git metadata from repository\n   */\n  async extractMetadata(): Promise<GitMetadata> {\n    const cacheKey = this.projectPath;\n\n    // Check cache first\n    if (this.enableCache && GitMetadataExtractor.cache.has(cacheKey)) {\n      const cached = GitMetadataExtractor.cache.get(cacheKey)!;\n      if (Date.now() - cached.timestamp < GitMetadataExtractor.CACHE_TTL) {\n        return cached.data;\n      }\n    }\n\n    const metadata: GitMetadata = {\n      is_git_repo: false,\n      has_uncommitted_changes: false,\n      commit_count: 0,\n      readme_exists: false,\n    };\n\n    const originalCwd = process.cwd();\n\n    try {\n      // Check if this is a Git repository in the specific path\n      if (fs.existsSync(this.projectPath)) {\n        process.chdir(this.projectPath);\n        metadata.is_git_repo = GitManager.isGitRepository();\n      } else {\n        metadata.is_git_repo = false;\n      }\n\n      if (!metadata.is_git_repo) {\n        return metadata;\n      }\n\n      // Extract basic Git information\n      await this.extractBasicGitInfo(metadata);\n\n      // Extract repository URLs\n      await this.extractRepositoryUrls(metadata);\n\n      // Analyze programming languages\n      await this.extractLanguageInfo(metadata);\n\n      // Detect framework\n      await this.extractFrameworkInfo(metadata);\n\n      // Extract team members\n      await this.extractTeamMembers(metadata);\n\n      // Extract license information\n      await this.extractLicenseInfo(metadata);\n\n      // Extract additional repository metadata\n      await this.extractAdditionalMetadata(metadata);\n\n      // Cache the result\n      if (this.enableCache) {\n        GitMetadataExtractor.cache.set(cacheKey, {\n          data: metadata,\n          timestamp: Date.now(),\n        });\n      }\n\n      return metadata;\n    } catch (error) {\n      console.warn(`Git metadata extraction failed: ${error}`);\n      return metadata;\n    } finally {\n      // Restore original working directory\n      try {\n        process.chdir(originalCwd);\n      } catch {\n        // Ignore restore errors\n      }\n    }\n  }\n\n  /**\n   * Extract basic Git repository information\n   */\n  private async extractBasicGitInfo(metadata: GitMetadata): Promise<void> {\n    try {\n      // Current branch\n      metadata.current_branch = GitManager.getCurrentBranch();\n\n      // Default branch (try multiple methods)\n      metadata.default_branch = await this.getDefaultBranch();\n\n      // Uncommitted changes\n      metadata.has_uncommitted_changes = GitManager.hasUncommittedChanges();\n\n      // Commit count\n      metadata.commit_count = await this.getCommitCount();\n\n      // Last commit date\n      metadata.last_commit_date = await this.getLastCommitDate();\n    } catch (error) {\n      console.warn(`Basic Git info extraction failed: ${error}`);\n    }\n  }\n\n  /**\n   * Extract repository URLs and clone information\n   */\n  private async extractRepositoryUrls(metadata: GitMetadata): Promise<void> {\n    try {\n      // Origin URL\n      metadata.git_origin = GitManager.getRepositoryUrl();\n\n      if (metadata.git_origin) {\n        // Convert to standardized formats\n        metadata.repository_url = this.normalizeRepositoryUrl(metadata.git_origin);\n        metadata.clone_url = this.getCloneUrl(metadata.git_origin);\n      }\n    } catch (error) {\n      console.warn(`Repository URL extraction failed: ${error}`);\n    }\n  }\n\n  /**\n   * Analyze programming languages in the repository\n   */\n  private async extractLanguageInfo(metadata: GitMetadata): Promise<void> {\n    try {\n      const languageStats = await this.analyzeLanguages();\n      metadata.languages = languageStats\n        .sort((a, b) => b.files - a.files)\n        .slice(0, 5) // Top 5 languages\n        .map((stat) => stat.language);\n    } catch (error) {\n      console.warn(`Language analysis failed: ${error}`);\n    }\n  }\n\n  /**\n   * Detect framework and package manager\n   */\n  private async extractFrameworkInfo(metadata: GitMetadata): Promise<void> {\n    try {\n      const frameworks = await this.detectFrameworks();\n      if (frameworks.length > 0) {\n        // Get highest confidence framework\n        const topFramework = frameworks.sort((a, b) => b.confidence - a.confidence)[0];\n        metadata.framework = topFramework.name;\n        if (topFramework.version) {\n          metadata.framework += ` ${topFramework.version}`;\n        }\n      }\n\n      // Detect package manager\n      metadata.package_manager = await this.detectPackageManager();\n    } catch (error) {\n      console.warn(`Framework detection failed: ${error}`);\n    }\n  }\n\n  /**\n   * Extract team members from Git contributors\n   */\n  private async extractTeamMembers(metadata: GitMetadata): Promise<void> {\n    try {\n      metadata.contributors = await this.getContributors();\n      metadata.team_members = metadata.contributors\n        .slice(0, 10) // Top 10 contributors\n        .map((contributor) => contributor.name);\n    } catch (error) {\n      console.warn(`Team member extraction failed: ${error}`);\n    }\n  }\n\n  /**\n   * Extract license information\n   */\n  private async extractLicenseInfo(metadata: GitMetadata): Promise<void> {\n    try {\n      metadata.license = await this.detectLicense();\n    } catch (error) {\n      console.warn(`License detection failed: ${error}`);\n    }\n  }\n\n  /**\n   * Extract additional repository metadata\n   */\n  private async extractAdditionalMetadata(metadata: GitMetadata): Promise<void> {\n    try {\n      // README existence\n      metadata.readme_exists = await this.hasReadme();\n\n      // Repository size\n      metadata.repository_size = await this.getRepositorySize();\n\n      // Total files\n      metadata.total_files = await this.getTotalFiles();\n    } catch (error) {\n      console.warn(`Additional metadata extraction failed: ${error}`);\n    }\n  }\n\n  /**\n   * Get default branch name\n   */\n  private async getDefaultBranch(): Promise<string> {\n    try {\n      // Try remote HEAD\n      const remoteHead = execSync(\n        'git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo \"\"',\n        { encoding: 'utf8', cwd: this.projectPath }\n      ).trim();\n\n      if (remoteHead) {\n        return remoteHead.replace('refs/remotes/origin/', '');\n      }\n\n      // Try common default branches\n      const commonBranches = ['main', 'master', 'develop'];\n      for (const branch of commonBranches) {\n        try {\n          execSync(`git show-ref --verify refs/heads/${branch}`, {\n            stdio: 'ignore',\n            cwd: this.projectPath,\n          });\n          return branch;\n        } catch {}\n      }\n\n      // Fallback to current branch\n      return GitManager.getCurrentBranch();\n    } catch {\n      return 'main'; // Default fallback\n    }\n  }\n\n  /**\n   * Get total commit count\n   */\n  private async getCommitCount(): Promise<number> {\n    try {\n      const count = execSync('git rev-list --count HEAD', {\n        encoding: 'utf8',\n        cwd: this.projectPath,\n      }).trim();\n      return parseInt(count, 10) || 0;\n    } catch {\n      return 0;\n    }\n  }\n\n  /**\n   * Get last commit date\n   */\n  private async getLastCommitDate(): Promise<string | undefined> {\n    try {\n      const date = execSync('git log -1 --format=%ci', {\n        encoding: 'utf8',\n        cwd: this.projectPath,\n      }).trim();\n      return date || undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  /**\n   * Normalize repository URL to HTTPS format\n   */\n  private normalizeRepositoryUrl(url: string): string {\n    if (url.startsWith('git@')) {\n      // Convert SSH to HTTPS\n      // git@github.com:user/repo.git -> https://github.com/user/repo\n      const parts = url.split(':');\n      if (parts.length >= 2) {\n        const host = parts[0].replace('git@', '');\n        const path = parts[1].replace(/\\.git$/, '');\n        return `https://${host}/${path}`;\n      }\n    }\n\n    return url.replace(/\\.git$/, '');\n  }\n\n  /**\n   * Get clone URL (prefer HTTPS)\n   */\n  private getCloneUrl(originUrl: string): string {\n    if (originUrl.startsWith('https://')) {\n      return originUrl;\n    }\n\n    return `${this.normalizeRepositoryUrl(originUrl)}.git`;\n  }\n\n  /**\n   * Analyze programming languages in the repository\n   */\n  private async analyzeLanguages(): Promise<LanguageStats[]> {\n    const languageMap = new Map<string, number>();\n\n    // Language extension mappings\n    const extensionMap: Record<string, string> = {\n      '.js': 'JavaScript',\n      '.ts': 'TypeScript',\n      '.jsx': 'JavaScript',\n      '.tsx': 'TypeScript',\n      '.py': 'Python',\n      '.java': 'Java',\n      '.cpp': 'C++',\n      '.c': 'C',\n      '.cs': 'C#',\n      '.php': 'PHP',\n      '.rb': 'Ruby',\n      '.go': 'Go',\n      '.rs': 'Rust',\n      '.swift': 'Swift',\n      '.kt': 'Kotlin',\n      '.scala': 'Scala',\n      '.clj': 'Clojure',\n      '.hs': 'Haskell',\n      '.elm': 'Elm',\n      '.dart': 'Dart',\n      '.vue': 'Vue',\n      '.svelte': 'Svelte',\n      '.html': 'HTML',\n      '.css': 'CSS',\n      '.scss': 'SCSS',\n      '.sass': 'Sass',\n      '.less': 'Less',\n      '.json': 'JSON',\n      '.yaml': 'YAML',\n      '.yml': 'YAML',\n      '.xml': 'XML',\n      '.md': 'Markdown',\n      '.sh': 'Shell',\n      '.bash': 'Shell',\n      '.zsh': 'Shell',\n      '.fish': 'Shell',\n      '.sql': 'SQL',\n      '.r': 'R',\n      '.R': 'R',\n      '.m': 'Objective-C',\n      '.mm': 'Objective-C++',\n      '.pl': 'Perl',\n      '.lua': 'Lua',\n      '.vim': 'Vim script',\n      '.dockerfile': 'Dockerfile',\n      '.tf': 'Terraform',\n    };\n\n    try {\n      // Get all tracked files\n      const files = execSync('git ls-files', { encoding: 'utf8', cwd: this.projectPath })\n        .split('\\n')\n        .filter((file) => file.trim());\n\n      for (const file of files) {\n        const ext = path.extname(file).toLowerCase();\n        const language = extensionMap[ext];\n\n        if (language) {\n          languageMap.set(language, (languageMap.get(language) || 0) + 1);\n        }\n      }\n\n      return Array.from(languageMap.entries())\n        .map(([language, files]) => ({ language, files }))\n        .sort((a, b) => b.files - a.files);\n    } catch {\n      return [];\n    }\n  }\n\n  /**\n   * Detect frameworks based on configuration files\n   */\n  private async detectFrameworks(): Promise<FrameworkDetection[]> {\n    const frameworks: FrameworkDetection[] = [];\n\n    const detectors = [\n      this.detectNodeJsFramework.bind(this),\n      this.detectPythonFramework.bind(this),\n      this.detectJavaFramework.bind(this),\n      this.detectRustFramework.bind(this),\n      this.detectGoFramework.bind(this),\n      this.detectPhpFramework.bind(this),\n      this.detectRubyFramework.bind(this),\n    ];\n\n    for (const detector of detectors) {\n      try {\n        const detected = await detector();\n        if (detected) {\n          frameworks.push(detected);\n        }\n      } catch (_error) {\n        // Continue with other detectors\n      }\n    }\n\n    return frameworks;\n  }\n\n  /**\n   * Detect Node.js frameworks\n   */\n  private async detectNodeJsFramework(): Promise<FrameworkDetection | null> {\n    const packageJsonPath = path.join(this.projectPath, 'package.json');\n\n    if (!fs.existsSync(packageJsonPath)) {\n      return null;\n    }\n\n    try {\n      const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n      const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };\n\n      // Framework detection patterns\n      const patterns = [\n        { name: 'Next.js', packages: ['next'], confidence: 0.9 },\n        { name: 'React', packages: ['react'], confidence: 0.8 },\n        { name: 'Vue.js', packages: ['vue'], confidence: 0.8 },\n        { name: 'Angular', packages: ['@angular/core'], confidence: 0.9 },\n        { name: 'Svelte', packages: ['svelte'], confidence: 0.8 },\n        { name: 'Express', packages: ['express'], confidence: 0.7 },\n        { name: 'Fastify', packages: ['fastify'], confidence: 0.8 },\n        { name: 'NestJS', packages: ['@nestjs/core'], confidence: 0.9 },\n        { name: 'Nuxt.js', packages: ['nuxt'], confidence: 0.9 },\n        { name: 'Gatsby', packages: ['gatsby'], confidence: 0.9 },\n        { name: 'Electron', packages: ['electron'], confidence: 0.8 },\n      ];\n\n      for (const pattern of patterns) {\n        const hasFramework = pattern.packages.some((pkg) => deps[pkg]);\n        if (hasFramework) {\n          const version = deps[pattern.packages[0]];\n          return {\n            name: pattern.name,\n            version: version?.replace(/^[\\^~]/, ''),\n            config_files: [packageJsonPath],\n            confidence: pattern.confidence,\n          };\n        }\n      }\n    } catch {\n      // Continue\n    }\n\n    return null;\n  }\n\n  /**\n   * Detect Python frameworks\n   */\n  private async detectPythonFramework(): Promise<FrameworkDetection | null> {\n    const configFiles = [\n      'requirements.txt',\n      'Pipfile',\n      'pyproject.toml',\n      'setup.py',\n      'poetry.lock',\n    ];\n\n    const foundConfigs = configFiles.filter((file) =>\n      fs.existsSync(path.join(this.projectPath, file))\n    );\n\n    if (foundConfigs.length === 0) {\n      return null;\n    }\n\n    // Check for Django\n    if (fs.existsSync(path.join(this.projectPath, 'manage.py'))) {\n      return {\n        name: 'Django',\n        config_files: foundConfigs,\n        confidence: 0.9,\n      };\n    }\n\n    // Check for Flask (look in requirements.txt)\n    try {\n      const requirementsPath = path.join(this.projectPath, 'requirements.txt');\n      if (fs.existsSync(requirementsPath)) {\n        const requirements = fs.readFileSync(requirementsPath, 'utf8');\n        if (requirements.includes('Flask')) {\n          return {\n            name: 'Flask',\n            config_files: foundConfigs,\n            confidence: 0.8,\n          };\n        }\n      }\n    } catch {\n      // Continue\n    }\n\n    return {\n      name: 'Python',\n      config_files: foundConfigs,\n      confidence: 0.6,\n    };\n  }\n\n  /**\n   * Detect Java frameworks\n   */\n  private async detectJavaFramework(): Promise<FrameworkDetection | null> {\n    const configFiles = ['pom.xml', 'build.gradle', 'build.gradle.kts'];\n    const foundConfigs = configFiles.filter((file) =>\n      fs.existsSync(path.join(this.projectPath, file))\n    );\n\n    if (foundConfigs.length === 0) {\n      return null;\n    }\n\n    // Check for Spring Boot\n    try {\n      const pomPath = path.join(this.projectPath, 'pom.xml');\n      if (fs.existsSync(pomPath)) {\n        const pom = fs.readFileSync(pomPath, 'utf8');\n        if (pom.includes('spring-boot')) {\n          return {\n            name: 'Spring Boot',\n            config_files: foundConfigs,\n            confidence: 0.9,\n          };\n        }\n      }\n    } catch {\n      // Continue\n    }\n\n    return {\n      name: 'Java',\n      config_files: foundConfigs,\n      confidence: 0.6,\n    };\n  }\n\n  /**\n   * Detect Rust frameworks\n   */\n  private async detectRustFramework(): Promise<FrameworkDetection | null> {\n    const cargoPath = path.join(this.projectPath, 'Cargo.toml');\n\n    if (!fs.existsSync(cargoPath)) {\n      return null;\n    }\n\n    try {\n      const cargo = fs.readFileSync(cargoPath, 'utf8');\n\n      if (cargo.includes('actix-web')) {\n        return {\n          name: 'Actix Web',\n          config_files: ['Cargo.toml'],\n          confidence: 0.9,\n        };\n      }\n\n      if (cargo.includes('rocket')) {\n        return {\n          name: 'Rocket',\n          config_files: ['Cargo.toml'],\n          confidence: 0.9,\n        };\n      }\n\n      if (cargo.includes('warp')) {\n        return {\n          name: 'Warp',\n          config_files: ['Cargo.toml'],\n          confidence: 0.8,\n        };\n      }\n    } catch {\n      // Continue\n    }\n\n    return {\n      name: 'Rust',\n      config_files: ['Cargo.toml'],\n      confidence: 0.7,\n    };\n  }\n\n  /**\n   * Detect Go frameworks\n   */\n  private async detectGoFramework(): Promise<FrameworkDetection | null> {\n    const goModPath = path.join(this.projectPath, 'go.mod');\n\n    if (!fs.existsSync(goModPath)) {\n      return null;\n    }\n\n    try {\n      const goMod = fs.readFileSync(goModPath, 'utf8');\n\n      if (goMod.includes('gin-gonic/gin')) {\n        return {\n          name: 'Gin',\n          config_files: ['go.mod'],\n          confidence: 0.9,\n        };\n      }\n\n      if (goMod.includes('echo')) {\n        return {\n          name: 'Echo',\n          config_files: ['go.mod'],\n          confidence: 0.9,\n        };\n      }\n\n      if (goMod.includes('fiber')) {\n        return {\n          name: 'Fiber',\n          config_files: ['go.mod'],\n          confidence: 0.9,\n        };\n      }\n    } catch {\n      // Continue\n    }\n\n    return {\n      name: 'Go',\n      config_files: ['go.mod'],\n      confidence: 0.7,\n    };\n  }\n\n  /**\n   * Detect PHP frameworks\n   */\n  private async detectPhpFramework(): Promise<FrameworkDetection | null> {\n    const composerPath = path.join(this.projectPath, 'composer.json');\n\n    if (!fs.existsSync(composerPath)) {\n      return null;\n    }\n\n    try {\n      const composer = JSON.parse(fs.readFileSync(composerPath, 'utf8'));\n      const deps = { ...composer.require, ...composer['require-dev'] };\n\n      if (deps['laravel/framework']) {\n        return {\n          name: 'Laravel',\n          config_files: ['composer.json'],\n          confidence: 0.9,\n        };\n      }\n\n      if (deps['symfony/framework-bundle']) {\n        return {\n          name: 'Symfony',\n          config_files: ['composer.json'],\n          confidence: 0.9,\n        };\n      }\n    } catch {\n      // Continue\n    }\n\n    return {\n      name: 'PHP',\n      config_files: ['composer.json'],\n      confidence: 0.6,\n    };\n  }\n\n  /**\n   * Detect Ruby frameworks\n   */\n  private async detectRubyFramework(): Promise<FrameworkDetection | null> {\n    const gemfilePath = path.join(this.projectPath, 'Gemfile');\n\n    if (!fs.existsSync(gemfilePath)) {\n      return null;\n    }\n\n    try {\n      const gemfile = fs.readFileSync(gemfilePath, 'utf8');\n\n      if (gemfile.includes('rails')) {\n        return {\n          name: 'Ruby on Rails',\n          config_files: ['Gemfile'],\n          confidence: 0.9,\n        };\n      }\n\n      if (gemfile.includes('sinatra')) {\n        return {\n          name: 'Sinatra',\n          config_files: ['Gemfile'],\n          confidence: 0.8,\n        };\n      }\n    } catch {\n      // Continue\n    }\n\n    return {\n      name: 'Ruby',\n      config_files: ['Gemfile'],\n      confidence: 0.6,\n    };\n  }\n\n  /**\n   * Detect package manager\n   */\n  private async detectPackageManager(): Promise<string | undefined> {\n    const packageManagers = [\n      { name: 'npm', files: ['package-lock.json', 'package.json'] },\n      { name: 'yarn', files: ['yarn.lock'] },\n      { name: 'pnpm', files: ['pnpm-lock.yaml'] },\n      { name: 'bun', files: ['bun.lockb'] },\n      { name: 'pip', files: ['requirements.txt'] },\n      { name: 'pipenv', files: ['Pipfile'] },\n      { name: 'poetry', files: ['poetry.lock'] },\n      { name: 'composer', files: ['composer.json'] },\n      { name: 'cargo', files: ['Cargo.toml'] },\n      { name: 'go mod', files: ['go.mod'] },\n      { name: 'maven', files: ['pom.xml'] },\n      { name: 'gradle', files: ['build.gradle'] },\n      { name: 'bundler', files: ['Gemfile'] },\n    ];\n\n    // Check for lockfiles first (more specific)\n    for (const pm of packageManagers) {\n      if (pm.name === 'npm') continue; // Handle npm last\n      const hasFiles = pm.files.some((file) => fs.existsSync(path.join(this.projectPath, file)));\n      if (hasFiles) {\n        return pm.name;\n      }\n    }\n\n    // Check for npm (package.json exists)\n    if (fs.existsSync(path.join(this.projectPath, 'package.json'))) {\n      return 'npm';\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Get Git contributors\n   */\n  private async getContributors(): Promise<GitContributor[]> {\n    try {\n      const output = execSync('git log --format=\"%an|%ae|%ci\" --no-merges', {\n        encoding: 'utf8',\n        cwd: this.projectPath,\n      });\n\n      const contributorMap = new Map<string, GitContributor>();\n\n      for (const line of output.split('\\n')) {\n        if (!line.trim()) continue;\n\n        const [name, email, date] = line.split('|');\n        if (!name || !email || !date) continue;\n\n        const key = `${name}|${email}`;\n\n        if (contributorMap.has(key)) {\n          const contributor = contributorMap.get(key)!;\n          contributor.commits++;\n          contributor.last_commit = date;\n        } else {\n          contributorMap.set(key, {\n            name,\n            email,\n            commits: 1,\n            first_commit: date,\n            last_commit: date,\n          });\n        }\n      }\n\n      return Array.from(contributorMap.values()).sort((a, b) => b.commits - a.commits);\n    } catch {\n      return [];\n    }\n  }\n\n  /**\n   * Detect license\n   */\n  private async detectLicense(): Promise<string | undefined> {\n    const licenseFiles = [\n      'LICENSE',\n      'LICENSE.txt',\n      'LICENSE.md',\n      'LICENCE',\n      'LICENCE.txt',\n      'LICENCE.md',\n    ];\n\n    for (const file of licenseFiles) {\n      const licensePath = path.join(this.projectPath, file);\n      if (fs.existsSync(licensePath)) {\n        try {\n          const content = fs.readFileSync(licensePath, 'utf8');\n          return this.parseLicense(content);\n        } catch {}\n      }\n    }\n\n    // Check package.json\n    const packageJsonPath = path.join(this.projectPath, 'package.json');\n    if (fs.existsSync(packageJsonPath)) {\n      try {\n        const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n        if (packageJson.license) {\n          return packageJson.license;\n        }\n      } catch {\n        // Continue\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Parse license type from content\n   */\n  private parseLicense(content: string): string {\n    const upperContent = content.toUpperCase();\n\n    const licenses = [\n      { name: 'MIT', keywords: ['MIT LICENSE', 'MIT'] },\n      { name: 'Apache 2.0', keywords: ['APACHE LICENSE', 'APACHE 2.0'] },\n      { name: 'GPL-3.0', keywords: ['GNU GENERAL PUBLIC LICENSE', 'GPL-3.0'] },\n      { name: 'GPL-2.0', keywords: ['GNU GENERAL PUBLIC LICENSE', 'GPL-2.0'] },\n      { name: 'BSD-3-Clause', keywords: ['BSD 3-CLAUSE', 'BSD-3-CLAUSE'] },\n      { name: 'BSD-2-Clause', keywords: ['BSD 2-CLAUSE', 'BSD-2-CLAUSE'] },\n      { name: 'ISC', keywords: ['ISC LICENSE', 'ISC'] },\n      { name: 'LGPL-3.0', keywords: ['LESSER GENERAL PUBLIC LICENSE', 'LGPL-3.0'] },\n      { name: 'LGPL-2.1', keywords: ['LESSER GENERAL PUBLIC LICENSE', 'LGPL-2.1'] },\n      { name: 'MPL-2.0', keywords: ['MOZILLA PUBLIC LICENSE', 'MPL-2.0'] },\n      { name: 'CC0-1.0', keywords: ['CREATIVE COMMONS', 'CC0'] },\n      { name: 'Unlicense', keywords: ['UNLICENSE'] },\n    ];\n\n    for (const license of licenses) {\n      const hasKeywords = license.keywords.some((keyword) => upperContent.includes(keyword));\n      if (hasKeywords) {\n        return license.name;\n      }\n    }\n\n    return 'Custom';\n  }\n\n  /**\n   * Check if README exists\n   */\n  private async hasReadme(): Promise<boolean> {\n    const readmeFiles = [\n      'README.md',\n      'README.txt',\n      'README.rst',\n      'README',\n      'readme.md',\n      'readme.txt',\n      'readme',\n    ];\n\n    return readmeFiles.some((file) => fs.existsSync(path.join(this.projectPath, file)));\n  }\n\n  /**\n   * Get repository size\n   */\n  private async getRepositorySize(): Promise<string | undefined> {\n    try {\n      const output = execSync('git count-objects -vH', { encoding: 'utf8', cwd: this.projectPath });\n\n      const sizeMatch = output.match(/size-pack:\\s*(\\S+)/);\n      if (sizeMatch) {\n        return sizeMatch[1];\n      }\n    } catch {\n      // Fallback to directory size\n      try {\n        const output = execSync(`du -sh \"${this.projectPath}\" 2>/dev/null || echo \"Unknown\"`, {\n          encoding: 'utf8',\n        });\n        return output.split('\\t')[0];\n      } catch {\n        return undefined;\n      }\n    }\n  }\n\n  /**\n   * Get total file count\n   */\n  private async getTotalFiles(): Promise<number | undefined> {\n    try {\n      const output = execSync('git ls-files | wc -l', { encoding: 'utf8', cwd: this.projectPath });\n      return parseInt(output.trim(), 10);\n    } catch {\n      return undefined;\n    }\n  }\n\n  /**\n   * Populate ProjectFrontmatter with Git metadata\n   */\n  async populateProjectFrontmatter(\n    frontmatter: Partial<ProjectFrontmatter>\n  ): Promise<ProjectFrontmatter> {\n    const metadata = await this.extractMetadata();\n\n    return {\n      // Required fields with defaults\n      title: frontmatter.title || 'Untitled Project',\n      description: frontmatter.description || 'Project description',\n      status: frontmatter.status || 'planning',\n      priority: frontmatter.priority || 'medium',\n      assignee: frontmatter.assignee || 'unassigned',\n      created_date: frontmatter.created_date || new Date().toISOString(),\n      updated_date: frontmatter.updated_date || new Date().toISOString(),\n      estimated_tokens: frontmatter.estimated_tokens || 0,\n      actual_tokens: frontmatter.actual_tokens || 0,\n      ai_context: frontmatter.ai_context || [],\n      sync_status: frontmatter.sync_status || 'local',\n      project_id: frontmatter.project_id || 'PROJECT-001',\n      type: 'project' as const,\n      name: frontmatter.name || frontmatter.title || 'Untitled Project',\n\n      // Git metadata\n      git_origin: metadata.git_origin,\n      git_branch: metadata.current_branch,\n      repository_url: metadata.repository_url,\n      clone_url: metadata.clone_url,\n      default_branch: metadata.default_branch,\n      languages: metadata.languages,\n      framework: metadata.framework,\n      team_members: metadata.team_members,\n      license: metadata.license,\n\n      // Optional fields\n      deployment_url: frontmatter.deployment_url,\n      documentation_url: frontmatter.documentation_url,\n      completion_percentage: frontmatter.completion_percentage,\n      related_projects: frontmatter.related_projects,\n      tags: frontmatter.tags,\n      dependencies: frontmatter.dependencies,\n      milestone: frontmatter.milestone,\n\n      // GitHub sync metadata\n      github_id: frontmatter.github_id,\n      github_number: frontmatter.github_number,\n      github_url: frontmatter.github_url,\n      github_updated_at: frontmatter.github_updated_at,\n      github_labels: frontmatter.github_labels,\n      github_milestone: frontmatter.github_milestone,\n      github_assignee: frontmatter.github_assignee,\n    };\n  }\n\n  /**\n   * Clear cache\n   */\n  static clearCache(): void {\n    GitMetadataExtractor.cache.clear();\n  }\n\n  /**\n   * Get cache stats\n   */\n  static getCacheStats(): { size: number; entries: string[] } {\n    return {\n      size: GitMetadataExtractor.cache.size,\n      entries: Array.from(GitMetadataExtractor.cache.keys()),\n    };\n  }\n}\n\n/**\n * Utility function to extract Git metadata for a project\n */\nexport async function extractGitMetadata(\n  projectPath?: string,\n  enableCache: boolean = true\n): Promise<GitMetadata> {\n  const extractor = new GitMetadataExtractor(projectPath, enableCache);\n  return await extractor.extractMetadata();\n}\n\n/**\n * Utility function to create a project with Git metadata\n */\nexport async function createProjectWithGitMetadata(\n  projectPath: string,\n  baseProject: Partial<ProjectFrontmatter>\n): Promise<ProjectFrontmatter> {\n  const extractor = new GitMetadataExtractor(projectPath);\n  return await extractor.populateProjectFrontmatter(baseProject);\n}\n","/**\n * Project Create Command\n * Creates new projects with Git metadata integration\n */\n\nimport { Command } from 'commander';\nimport type { ProjectConfig } from '../../types/ai-trackdown.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { GitMetadataExtractor } from '../../utils/git-metadata-extractor.js';\nimport { ProjectContextManager } from '../../utils/project-context-manager.js';\n\ninterface CreateOptions {\n  name?: string;\n  description?: string;\n  gitOrigin?: string;\n  gitBranch?: string;\n  framework?: string;\n  languages?: string;\n  teamMembers?: string;\n  dryRun?: boolean;\n  template?: string;\n  extractGitMetadata?: boolean;\n}\n\nexport function createProjectCreateCommand(): Command {\n  const cmd = new Command('create');\n\n  cmd\n    .description('Create a new project with Git metadata integration')\n    .argument('[name]', 'project name (optional if using --name flag)')\n    .option('--name <text>', 'project name (alternative to positional argument)')\n    .option('-d, --description <text>', 'project description')\n    .option('--git-origin <url>', 'Git origin URL')\n    .option('--git-branch <branch>', 'Git branch name')\n    .option('--framework <name>', 'project framework')\n    .option('--languages <list>', 'comma-separated list of languages')\n    .option('--team-members <list>', 'comma-separated list of team members')\n    .option('-t, --template <name>', 'project template to use', 'default')\n    .option('--extract-git-metadata', 'extract Git metadata from current directory', true)\n    .option('--dry-run', 'show what would be created without creating')\n    .action(async (nameArg: string | undefined, options: CreateOptions) => {\n      try {\n        // Support both positional argument and --name flag\n        const name = nameArg || options.name;\n        if (!name) {\n          throw new Error(\n            'Project name is required. Provide it as a positional argument or use --name flag.'\n          );\n        }\n        await createProject(name, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to create project: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function createProject(name: string, options: CreateOptions): Promise<void> {\n  const contextManager = new ProjectContextManager();\n\n  // Initialize context to detect mode\n  await contextManager.initializeContext();\n\n  // Check if we're in multi-project mode\n  const mode = contextManager.getProjectMode();\n  if (mode === 'single') {\n    throw new Error(\n      'Cannot create projects in single-project mode. Use multi-project mode or initialize a new project structure.'\n    );\n  }\n\n  // Extract Git metadata if requested\n  let gitMetadata: any = {};\n  if (options.extractGitMetadata) {\n    try {\n      const gitExtractor = new GitMetadataExtractor();\n      gitMetadata = await gitExtractor.extractGitMetadata();\n      console.log(\n        Formatter.info(`Extracted Git metadata for ${gitMetadata.repository_url || 'repository'}`)\n      );\n    } catch (error) {\n      console.warn(\n        Formatter.warning(\n          `Failed to extract Git metadata: ${error instanceof Error ? error.message : 'Unknown error'}`\n        )\n      );\n    }\n  }\n\n  // Parse arrays\n  const languages = options.languages\n    ? options.languages.split(',').map((lang) => lang.trim())\n    : gitMetadata.languages || [];\n  const teamMembers = options.teamMembers\n    ? options.teamMembers.split(',').map((member) => member.trim())\n    : [];\n\n  // Create project configuration\n  const projectConfig: Partial<ProjectConfig> = {\n    name,\n    description: options.description || gitMetadata.description || `Project ${name}`,\n    version: '1.0.0',\n    project_mode: 'multi',\n    structure: {\n      epics_dir: 'epics',\n      issues_dir: 'issues',\n      tasks_dir: 'tasks',\n      templates_dir: 'templates',\n      prs_dir: 'prs',\n    },\n    naming_conventions: {\n      project_prefix: 'PROJ',\n      epic_prefix: 'EP',\n      issue_prefix: 'ISS',\n      task_prefix: 'TSK',\n      pr_prefix: 'PR',\n      file_extension: '.md',\n    },\n  };\n\n  // Create project frontmatter data\n  const projectData = {\n    name,\n    description: options.description || gitMetadata.description || `Project ${name}`,\n    git_origin: options.gitOrigin || gitMetadata.git_origin,\n    git_branch: options.gitBranch || gitMetadata.git_branch || gitMetadata.default_branch,\n    repository_url: gitMetadata.repository_url,\n    clone_url: gitMetadata.clone_url,\n    default_branch: gitMetadata.default_branch,\n    languages,\n    framework: options.framework || gitMetadata.framework,\n    team_members: teamMembers,\n    completion_percentage: 0,\n  };\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - Project would be created with:'));\n    console.log(Formatter.debug(`Name: ${name}`));\n    console.log(Formatter.debug(`Description: ${projectData.description}`));\n    console.log(Formatter.debug(`Git Origin: ${projectData.git_origin || 'Not set'}`));\n    console.log(Formatter.debug(`Git Branch: ${projectData.git_branch || 'Not set'}`));\n    console.log(Formatter.debug(`Repository URL: ${projectData.repository_url || 'Not set'}`));\n    console.log(Formatter.debug(`Framework: ${projectData.framework || 'Not set'}`));\n    console.log(Formatter.debug(`Languages: ${languages.join(', ') || 'Not set'}`));\n    console.log(Formatter.debug(`Team Members: ${teamMembers.join(', ') || 'Not set'}`));\n    console.log(Formatter.debug(`Template: ${options.template || 'default'}`));\n    return;\n  }\n\n  // Create the project\n  try {\n    const projectContext = await contextManager.createProject(name, projectConfig);\n\n    // Ensure project structure exists\n    await contextManager.ensureProjectStructure();\n\n    console.log(Formatter.success(`Project '${name}' created successfully!`));\n    console.log(Formatter.info(`Project Path: ${projectContext.paths.projectRoot}`));\n    console.log(Formatter.info(`Config Dir: ${projectContext.paths.configDir}`));\n    console.log(Formatter.info(`Tasks Root: ${projectContext.paths.tasksRoot}`));\n\n    if (projectData.git_origin) {\n      console.log(Formatter.info(`Git Origin: ${projectData.git_origin}`));\n    }\n\n    if (projectData.repository_url) {\n      console.log(Formatter.info(`Repository: ${projectData.repository_url}`));\n    }\n\n    if (languages.length > 0) {\n      console.log(Formatter.info(`Languages: ${languages.join(', ')}`));\n    }\n\n    if (projectData.framework) {\n      console.log(Formatter.info(`Framework: ${projectData.framework}`));\n    }\n\n    console.log(\n      Formatter.info(\n        `\\nProject '${name}' is now active. You can start creating epics, issues, and tasks.`\n      )\n    );\n  } catch (error) {\n    throw new Error(\n      `Failed to create project: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n","/**\n * Project List Command\n * Lists all available projects in multi-project mode\n */\n\nimport { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\nimport { ProjectContextManager } from '../../utils/project-context-manager.js';\n\ninterface ListOptions {\n  format?: 'table' | 'json' | 'simple';\n  showInactive?: boolean;\n  showDetails?: boolean;\n}\n\nexport function createProjectListCommand(): Command {\n  const cmd = new Command('list');\n\n  cmd\n    .description('List all available projects')\n    .alias('ls')\n    .option('-f, --format <type>', 'output format (table|json|simple)', 'table')\n    .option('-i, --show-inactive', 'show inactive projects', false)\n    .option('-d, --show-details', 'show detailed project information', false)\n    .action(async (options: ListOptions) => {\n      try {\n        await listProjects(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to list projects: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function listProjects(options: ListOptions): Promise<void> {\n  const contextManager = new ProjectContextManager();\n\n  // Initialize context to detect mode\n  await contextManager.initializeContext();\n\n  // Check if we're in multi-project mode\n  const mode = contextManager.getProjectMode();\n  if (mode === 'single') {\n    console.log(Formatter.info('Single-project mode detected. No project listing available.'));\n    console.log(\n      Formatter.info('Use \"aitrackdown project create\" to initialize multi-project mode.')\n    );\n    return;\n  }\n\n  // Get available projects\n  const projects = contextManager.listProjects();\n  const currentContext = contextManager.getCurrentContext();\n  const currentProject = currentContext?.context.currentProject;\n\n  if (projects.length === 0) {\n    console.log(Formatter.info('No projects found.'));\n    console.log(\n      Formatter.info('Use \"aitrackdown project create <name>\" to create your first project.')\n    );\n    return;\n  }\n\n  // Format output based on requested format\n  switch (options.format) {\n    case 'json':\n      console.log(\n        JSON.stringify(\n          {\n            current_project: currentProject,\n            projects: projects.map((name) => ({\n              name,\n              is_current: name === currentProject,\n            })),\n          },\n          null,\n          2\n        )\n      );\n      break;\n\n    case 'simple':\n      projects.forEach((project) => {\n        const marker = project === currentProject ? '*' : ' ';\n        console.log(`${marker} ${project}`);\n      });\n      break;\n    default:\n      console.log(Formatter.info(`\\n📋 Available Projects (${projects.length})`));\n      console.log(Formatter.info(`Current project: ${currentProject || 'None selected'}`));\n      console.log();\n\n      projects.forEach((project, index) => {\n        const marker = project === currentProject ? '👉' : '  ';\n        const status = project === currentProject ? Formatter.success('[CURRENT]') : '';\n        console.log(`${marker} ${index + 1}. ${project} ${status}`);\n      });\n\n      console.log();\n      console.log(\n        Formatter.info('Use \"aitrackdown project switch <name>\" to switch to a different project.')\n      );\n      console.log(Formatter.info('Use \"aitrackdown project show <name>\" to view project details.'));\n      break;\n  }\n\n  // Show additional details if requested\n  if (options.showDetails) {\n    console.log(Formatter.info('\\n📊 Project Details:'));\n    console.log(Formatter.info(`Mode: ${mode.toUpperCase()}`));\n    console.log(\n      Formatter.info(`Projects Directory: ${currentContext?.context.projectsDir || 'Not set'}`)\n    );\n    console.log(Formatter.info(`Root Directory: ${currentContext?.context.projectRoot}`));\n  }\n}\n","/**\n * Project Show Command\n * Displays detailed information about a specific project\n */\n\nimport { existsSync, readdirSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\nimport { ProjectContextManager } from '../../utils/project-context-manager.js';\n\ninterface ShowOptions {\n  format?: 'table' | 'json';\n  showStats?: boolean;\n  showConfig?: boolean;\n  showStructure?: boolean;\n}\n\nexport function createProjectShowCommand(): Command {\n  const cmd = new Command('show');\n\n  cmd\n    .description('Show detailed information about a project')\n    .argument('[name]', 'project name (defaults to current project)')\n    .option('-f, --format <type>', 'output format (table|json)', 'table')\n    .option('-s, --show-stats', 'show project statistics', false)\n    .option('-c, --show-config', 'show project configuration', false)\n    .option('--show-structure', 'show directory structure', false)\n    .action(async (nameArg: string | undefined, options: ShowOptions) => {\n      try {\n        await showProject(nameArg, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to show project: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function showProject(name: string | undefined, options: ShowOptions): Promise<void> {\n  const contextManager = new ProjectContextManager();\n\n  // Initialize context to detect mode\n  await contextManager.initializeContext();\n\n  // Check if we're in multi-project mode\n  const mode = contextManager.getProjectMode();\n  if (mode === 'single') {\n    console.log(Formatter.info('Single-project mode detected.'));\n    await showSingleProjectInfo(contextManager, options);\n    return;\n  }\n\n  // Get project name\n  const currentContext = contextManager.getCurrentContext();\n  const targetProject = name || currentContext?.context.currentProject;\n\n  if (!targetProject) {\n    throw new Error('No project specified and no current project selected.');\n  }\n\n  // Get available projects\n  const projects = contextManager.listProjects();\n  if (!projects.includes(targetProject)) {\n    throw new Error(\n      `Project '${targetProject}' not found. Available projects: ${projects.join(', ')}`\n    );\n  }\n\n  // Switch to target project if not current\n  if (targetProject !== currentContext?.context.currentProject) {\n    await contextManager.switchProject(targetProject);\n  }\n\n  const projectContext = contextManager.getCurrentContext();\n  if (!projectContext) {\n    throw new Error('Failed to get project context');\n  }\n\n  // Get project configuration\n  const configManager = projectContext.configManager;\n  const config = configManager.getConfig();\n  const paths = projectContext.paths;\n\n  // Collect project information\n  const projectInfo = {\n    name: targetProject,\n    mode: mode,\n    project_root: paths.projectRoot,\n    config_dir: paths.configDir,\n    tasks_root: paths.tasksRoot,\n    status: existsSync(paths.projectRoot) ? 'active' : 'inactive',\n    config: config,\n  };\n\n  // Get project statistics if requested\n  let stats: any = {};\n  if (options.showStats) {\n    stats = await getProjectStats(paths);\n  }\n\n  // Format output\n  switch (options.format) {\n    case 'json': {\n      const jsonOutput: any = {\n        project: projectInfo,\n        paths: paths,\n      };\n\n      if (options.showStats) {\n        jsonOutput.statistics = stats;\n      }\n\n      if (options.showConfig) {\n        jsonOutput.configuration = config;\n      }\n\n      console.log(JSON.stringify(jsonOutput, null, 2));\n      break;\n    }\n    default:\n      console.log(Formatter.info(`\\n📋 Project: ${targetProject}`));\n      console.log(Formatter.info(`Mode: ${mode.toUpperCase()}`));\n      console.log(\n        Formatter.info(`Status: ${projectInfo.status === 'active' ? '✅ Active' : '❌ Inactive'}`)\n      );\n      console.log(Formatter.info(`Root: ${paths.projectRoot}`));\n      console.log(Formatter.info(`Config: ${paths.configDir}`));\n      console.log(Formatter.info(`Tasks: ${paths.tasksRoot}`));\n\n      if (options.showStructure) {\n        console.log(Formatter.info('\\n📁 Directory Structure:'));\n        console.log(Formatter.info(`   ├── Epics: ${paths.epicsDir}`));\n        console.log(Formatter.info(`   ├── Issues: ${paths.issuesDir}`));\n        console.log(Formatter.info(`   ├── Tasks: ${paths.tasksDir}`));\n        console.log(Formatter.info(`   ├── PRs: ${paths.prsDir}`));\n        console.log(Formatter.info(`   └── Templates: ${paths.templatesDir}`));\n      }\n\n      if (options.showStats && stats) {\n        console.log(Formatter.info('\\n📊 Project Statistics:'));\n        console.log(Formatter.info(`   Epics: ${stats.epics || 0}`));\n        console.log(Formatter.info(`   Issues: ${stats.issues || 0}`));\n        console.log(Formatter.info(`   Tasks: ${stats.tasks || 0}`));\n        console.log(Formatter.info(`   PRs: ${stats.prs || 0}`));\n        console.log(Formatter.info(`   Total Items: ${stats.total || 0}`));\n      }\n\n      if (options.showConfig) {\n        console.log(Formatter.info('\\n⚙️  Configuration:'));\n        console.log(Formatter.info(`   Version: ${config.version}`));\n        console.log(Formatter.info(`   Default Assignee: ${config.default_assignee || 'Not set'}`));\n        console.log(\n          Formatter.info(`   File Extension: ${config.naming_conventions.file_extension}`)\n        );\n        console.log(Formatter.info(`   Epic Prefix: ${config.naming_conventions.epic_prefix}`));\n        console.log(Formatter.info(`   Issue Prefix: ${config.naming_conventions.issue_prefix}`));\n        console.log(Formatter.info(`   Task Prefix: ${config.naming_conventions.task_prefix}`));\n        if (config.naming_conventions.pr_prefix) {\n          console.log(Formatter.info(`   PR Prefix: ${config.naming_conventions.pr_prefix}`));\n        }\n      }\n\n      console.log(Formatter.info('\\nUse \"aitrackdown project switch\" to switch to this project.'));\n      console.log(Formatter.info('Use \"aitrackdown status\" to see project status.'));\n      break;\n  }\n}\n\nasync function showSingleProjectInfo(\n  contextManager: ProjectContextManager,\n  options: ShowOptions\n): Promise<void> {\n  const currentContext = contextManager.getCurrentContext();\n  if (!currentContext) {\n    throw new Error('No project context available');\n  }\n\n  const paths = currentContext.paths;\n  const config = currentContext.configManager.getConfig();\n\n  console.log(Formatter.info(`\\n📋 Single Project Mode`));\n  console.log(Formatter.info(`Root: ${paths.projectRoot}`));\n  console.log(Formatter.info(`Config: ${paths.configDir}`));\n  console.log(Formatter.info(`Tasks: ${paths.tasksRoot}`));\n\n  if (options.showStats) {\n    const stats = await getProjectStats(paths);\n    console.log(Formatter.info('\\n📊 Project Statistics:'));\n    console.log(Formatter.info(`   Epics: ${stats.epics || 0}`));\n    console.log(Formatter.info(`   Issues: ${stats.issues || 0}`));\n    console.log(Formatter.info(`   Tasks: ${stats.tasks || 0}`));\n    console.log(Formatter.info(`   PRs: ${stats.prs || 0}`));\n    console.log(Formatter.info(`   Total Items: ${stats.total || 0}`));\n  }\n\n  if (options.showConfig) {\n    console.log(Formatter.info('\\n⚙️  Configuration:'));\n    console.log(Formatter.info(`   Version: ${config.version}`));\n    console.log(Formatter.info(`   Default Assignee: ${config.default_assignee || 'Not set'}`));\n    console.log(Formatter.info(`   File Extension: ${config.naming_conventions.file_extension}`));\n  }\n}\n\nasync function getProjectStats(paths: any): Promise<any> {\n  const stats = {\n    epics: 0,\n    issues: 0,\n    tasks: 0,\n    prs: 0,\n    total: 0,\n  };\n\n  try {\n    if (existsSync(paths.epicsDir)) {\n      stats.epics = readdirSync(paths.epicsDir).filter((file) => file.endsWith('.md')).length;\n    }\n\n    if (existsSync(paths.issuesDir)) {\n      stats.issues = readdirSync(paths.issuesDir).filter((file) => file.endsWith('.md')).length;\n    }\n\n    if (existsSync(paths.tasksDir)) {\n      stats.tasks = readdirSync(paths.tasksDir).filter((file) => file.endsWith('.md')).length;\n    }\n\n    if (existsSync(paths.prsDir)) {\n      stats.prs = readdirSync(paths.prsDir).filter((file) => file.endsWith('.md')).length;\n    }\n\n    stats.total = stats.epics + stats.issues + stats.tasks + stats.prs;\n  } catch (error) {\n    console.warn(\n      Formatter.warning(\n        `Failed to collect statistics: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    );\n  }\n\n  return stats;\n}\n","/**\n * Project Switch Command\n * Switches the current project context in multi-project mode\n */\n\nimport { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\nimport { ProjectContextManager } from '../../utils/project-context-manager.js';\n\ninterface SwitchOptions {\n  create?: boolean;\n  force?: boolean;\n}\n\nexport function createProjectSwitchCommand(): Command {\n  const cmd = new Command('switch');\n\n  cmd\n    .description('Switch to a different project')\n    .argument('<name>', 'project name to switch to')\n    .option('-c, --create', 'create project if it does not exist', false)\n    .option('-f, --force', 'force switch even if project appears inactive', false)\n    .action(async (name: string, options: SwitchOptions) => {\n      try {\n        await switchProject(name, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to switch project: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function switchProject(name: string, options: SwitchOptions): Promise<void> {\n  const contextManager = new ProjectContextManager();\n\n  // Initialize context to detect mode\n  await contextManager.initializeContext();\n\n  // Check if we're in multi-project mode\n  const mode = contextManager.getProjectMode();\n  if (mode === 'single') {\n    throw new Error(\n      'Cannot switch projects in single-project mode. Use multi-project mode to manage multiple projects.'\n    );\n  }\n\n  // Get available projects\n  const projects = contextManager.listProjects();\n  const currentContext = contextManager.getCurrentContext();\n  const currentProject = currentContext?.context.currentProject;\n\n  // Check if already on the target project\n  if (currentProject === name) {\n    console.log(Formatter.info(`Already on project '${name}'.`));\n    return;\n  }\n\n  // Check if project exists\n  if (!projects.includes(name)) {\n    if (options.create) {\n      console.log(Formatter.info(`Project '${name}' does not exist. Creating it...`));\n      await contextManager.createProject(name);\n      console.log(Formatter.success(`Project '${name}' created and switched to.`));\n      return;\n    } else {\n      throw new Error(\n        `Project '${name}' not found. Available projects: ${projects.join(', ')}\\nUse --create to create it.`\n      );\n    }\n  }\n\n  // Switch to the project\n  try {\n    const projectContext = await contextManager.switchProject(name);\n\n    // Ensure project structure exists\n    await contextManager.ensureProjectStructure();\n\n    // Validate the project context\n    const validation = contextManager.validateContext();\n    if (!validation.valid && !options.force) {\n      console.error(Formatter.error(`Project '${name}' has validation issues:`));\n      validation.issues.forEach((issue) => console.error(Formatter.error(`  • ${issue}`)));\n      console.error(Formatter.error('Use --force to switch anyway.'));\n      process.exit(1);\n    }\n\n    // Show warnings if any\n    if (validation.warnings.length > 0) {\n      console.log(Formatter.warning('Project has warnings:'));\n      validation.warnings.forEach((warning) => console.log(Formatter.warning(`  • ${warning}`)));\n    }\n\n    // Success message\n    console.log(Formatter.success(`Switched to project '${name}'.`));\n\n    // Show project information\n    const paths = projectContext.paths;\n    console.log(Formatter.info(`Project Root: ${paths.projectRoot}`));\n    console.log(Formatter.info(`Tasks Root: ${paths.tasksRoot}`));\n    console.log(Formatter.info(`Config Dir: ${paths.configDir}`));\n\n    // Show quick stats if directories exist\n    const stats = await getQuickStats(paths);\n    if (stats.total > 0) {\n      console.log(Formatter.info(`\\n📊 Quick Stats:`));\n      console.log(\n        Formatter.info(\n          `   Epics: ${stats.epics}, Issues: ${stats.issues}, Tasks: ${stats.tasks}, PRs: ${stats.prs}`\n        )\n      );\n    }\n\n    console.log(Formatter.info('\\nUse \"aitrackdown status\" to see detailed project status.'));\n  } catch (error) {\n    throw new Error(\n      `Failed to switch to project '${name}': ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\nasync function getQuickStats(paths: any): Promise<any> {\n  const stats = {\n    epics: 0,\n    issues: 0,\n    tasks: 0,\n    prs: 0,\n    total: 0,\n  };\n\n  try {\n    const fs = await import('node:fs');\n\n    if (fs.existsSync(paths.epicsDir)) {\n      stats.epics = fs.readdirSync(paths.epicsDir).filter((file) => file.endsWith('.md')).length;\n    }\n\n    if (fs.existsSync(paths.issuesDir)) {\n      stats.issues = fs.readdirSync(paths.issuesDir).filter((file) => file.endsWith('.md')).length;\n    }\n\n    if (fs.existsSync(paths.tasksDir)) {\n      stats.tasks = fs.readdirSync(paths.tasksDir).filter((file) => file.endsWith('.md')).length;\n    }\n\n    if (fs.existsSync(paths.prsDir)) {\n      stats.prs = fs.readdirSync(paths.prsDir).filter((file) => file.endsWith('.md')).length;\n    }\n\n    stats.total = stats.epics + stats.issues + stats.tasks + stats.prs;\n  } catch (_error) {\n    // Silently ignore stats collection errors\n  }\n\n  return stats;\n}\n","/**\n * Project Command Suite\n * Manages project context and multi-project workflows\n */\n\nimport { Command } from 'commander';\nimport { createProjectCreateCommand } from './project/create.js';\nimport { createProjectListCommand } from './project/list.js';\nimport { createProjectShowCommand } from './project/show.js';\nimport { createProjectSwitchCommand } from './project/switch.js';\n\nexport function createProjectCommand(): Command {\n  const cmd = new Command('project');\n\n  cmd.description('Manage projects and project context').alias('proj');\n\n  // Add subcommands\n  cmd.addCommand(createProjectCreateCommand());\n  cmd.addCommand(createProjectListCommand());\n  cmd.addCommand(createProjectShowCommand());\n  cmd.addCommand(createProjectSwitchCommand());\n\n  return cmd;\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport type { StatusFilter, TrackdownItem } from '../types/index.js';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { PathResolver } from '../utils/path-resolver.js';\nimport { RelationshipManager } from '../utils/relationship-manager.js';\nimport {\n  ValidationError,\n  validateAssignee,\n  validateId,\n  validatePriority,\n  validateStatus,\n} from '../utils/validation.js';\n\nexport function createStatusCommand(): Command {\n  const command = new Command('status');\n\n  command\n    .description('Display comprehensive project status with advanced filtering and analytics')\n    .option('-v, --verbose', 'show detailed item information with descriptions')\n    .option('-c, --compact', 'compact output format for quick overview')\n    .option('--table', 'display results in table format')\n    .option('--stats', 'show detailed project statistics and analytics')\n    .option('--summary', 'show concise project summary with key metrics')\n    .option('--current-sprint', 'show current sprint items (active and in-progress)')\n    .option('--filter <expr>', 'advanced filter expression (e.g., \"status=todo,priority=high\")')\n    .option('-s, --status <status>', 'filter by status (todo, in-progress, done, blocked)')\n    .option('-p, --priority <priority>', 'filter by priority (low, medium, high, critical)')\n    .option('-a, --assignee <name>', 'filter by assignee name or email')\n    .option('-t, --tags <tags>', 'filter by tags (comma-separated)')\n    .option('-i, --id <id>', 'filter by specific item ID')\n    .option('--created-after <date>', 'show items created after date (YYYY-MM-DD)')\n    .option('--created-before <date>', 'show items created before date (YYYY-MM-DD)')\n    .option('--updated-after <date>', 'show items updated after date (YYYY-MM-DD)')\n    .option('--updated-before <date>', 'show items updated before date (YYYY-MM-DD)')\n    .option('--estimate-min <points>', 'minimum story points')\n    .option('--estimate-max <points>', 'maximum story points')\n    .option(\n      '--sort <field>',\n      'sort by field (created, updated, priority, status, title)',\n      'updated'\n    )\n    .option('--order <direction>', 'sort order (asc, desc)', 'desc')\n    .option('--limit <count>', 'limit number of results shown')\n    .option('--offset <count>', 'skip number of results (for pagination)')\n    .option('--interactive', 'interactive filtering and display mode')\n    .option('--watch', 'continuously monitor and refresh status')\n    .option('--export <file>', 'export filtered results to file')\n    .option('--full', 'comprehensive project status with enhanced details')\n    .option('--project <name>', 'specify project (for multi-project mode)')\n    .option('--all-projects', 'show status across all projects (multi-project mode)')\n    .addHelpText(\n      'after',\n      `\nExamples:\n  $ aitrackdown status\n  $ aitrackdown status --summary\n  $ aitrackdown status --current-sprint\n  $ aitrackdown status --verbose --stats\n  $ aitrackdown status --filter \"status=todo,priority=high\"\n  $ aitrackdown status --assignee john.doe --created-after 2024-01-01\n  $ aitrackdown status --tags backend,security --table\n  $ aitrackdown status --interactive\n  $ aitrackdown status --stats --export project-status.json\n\nFilter Expressions:\n  status=todo,blocked        - Multiple status values\n  priority=high              - Single priority\n  assignee=john.doe          - Specific assignee\n  tags=backend,api           - Items with any of these tags\n  estimate=5-13              - Story points range\n\nStatus Values:\n  todo          - Not started\n  in-progress   - Currently being worked on\n  blocked       - Blocked by dependencies or issues\n  done          - Completed tasks\n\nPriority Levels:\n  low           - Nice to have, non-urgent\n  medium        - Standard priority (default)\n  high          - Important, should be done soon\n  critical      - Urgent, blocking other work\n\nSort Fields:\n  created       - Creation date\n  updated       - Last modified date\n  priority      - Priority level (critical > high > medium > low)\n  status        - Status progression (todo > in-progress > blocked > done)\n  title         - Alphabetical by title\n\nCurrent Sprint Filter:\n  --current-sprint shows items that are actively being worked on:\n  • All in-progress items (currently being worked on)\n  • High and critical priority todo items (ready to be picked up)\n  • All blocked items (requiring attention)\n`\n    )\n    .action(\n      async (options?: {\n        verbose?: boolean;\n        compact?: boolean;\n        table?: boolean;\n        stats?: boolean;\n        summary?: boolean;\n        currentSprint?: boolean;\n        filter?: string;\n        status?: string;\n        priority?: string;\n        assignee?: string;\n        tags?: string;\n        id?: string;\n        createdAfter?: string;\n        createdBefore?: string;\n        updatedAfter?: string;\n        updatedBefore?: string;\n        estimateMin?: string;\n        estimateMax?: string;\n        sort?: string;\n        order?: string;\n        limit?: string;\n        offset?: string;\n        interactive?: boolean;\n        watch?: boolean;\n        export?: string;\n      }) => {\n        try {\n          // Get CLI root directory option\n          const parentCommand = command.parent;\n          const rootDirOption = parentCommand?.opts()?.rootDir || parentCommand?.opts()?.tasksDir;\n\n          // Load configuration first\n          const configManager = new ConfigManager();\n          const config = configManager.getConfig();\n\n          // Initialize path resolver with CLI override\n          const pathResolver = new PathResolver(configManager, rootDirOption);\n\n          const trackdownDir = join(process.cwd(), pathResolver.getRootDirectory());\n\n          if (!existsSync(trackdownDir)) {\n            // Check for migration scenario\n            if (pathResolver.shouldMigrate()) {\n              pathResolver.showMigrationWarning();\n              console.log('\\nMigration commands:');\n              pathResolver.getMigrationCommands().forEach((cmd) => {\n                console.log(Formatter.highlight(cmd));\n              });\n              process.exit(1);\n            }\n\n            console.error(\n              Formatter.error(\n                `No ${pathResolver.getRootDirectory()} project found in current directory`\n              )\n            );\n            console.log(Formatter.info('Run \"aitrackdown init\" to initialize a new project'));\n            console.log(\n              Formatter.info(\n                `Or navigate to a directory with an existing ${pathResolver.getRootDirectory()} project`\n              )\n            );\n            process.exit(1);\n          }\n\n          // Interactive mode\n          if (options?.interactive) {\n            const interactiveOptions = await runInteractiveStatusMode(options);\n            options = { ...options, ...interactiveOptions };\n          }\n\n          // Watch mode\n          if (options?.watch) {\n            return runWatchMode(trackdownDir, options, config, pathResolver);\n          }\n\n          // Show progress indicator\n          const spinner = ora('Analyzing project status...').start();\n\n          try {\n            // Get and parse all items using RelationshipManager (same as individual commands)\n            const items = await getAllItemsWithRelationshipManager(config, pathResolver);\n\n            spinner.text = 'Applying filters...';\n\n            // Parse and validate filters\n            const filters = parseFilters(options);\n\n            // Apply all filters\n            let filteredItems = applyAdvancedFilters(items, filters);\n\n            // Apply current sprint filter if requested\n            if (options?.currentSprint) {\n              filteredItems = applyCurrentSprintFilter(filteredItems);\n            }\n\n            spinner.text = 'Processing results...';\n\n            // Apply sorting and pagination\n            const sortedItems = applySorting(\n              filteredItems,\n              options?.sort || 'updated',\n              options?.order || 'desc'\n            );\n            const paginatedItems = applyPagination(sortedItems, options?.limit, options?.offset);\n\n            spinner.succeed(\n              `Found ${filteredItems.length} items${filteredItems.length !== items.length ? ` (${items.length} total)` : ''}`\n            );\n\n            // Display banner\n            const headerText = options?.currentSprint\n              ? `🏃 ${config.projectName || 'Trackdown'} Current Sprint`\n              : `📊 ${config.projectName || 'Trackdown'} Project Status`;\n            console.log(Formatter.header(headerText));\n\n            // Show current sprint explanation if in current sprint mode\n            if (options?.currentSprint) {\n              console.log(\n                Formatter.info(\n                  '🎯 Current Sprint: In-progress items + High/Critical priority todos + Blocked items'\n                )\n              );\n              console.log('');\n            }\n\n            // Show project summary and statistics\n            if (options?.stats !== false) {\n              displayProjectOverview(trackdownDir, items, config, pathResolver);\n            }\n\n            // Handle summary mode - show concise summary and exit\n            if (options?.summary) {\n              displaySummaryView(trackdownDir, items, filteredItems, config, pathResolver);\n              return;\n            }\n\n            if (filteredItems.length === 0) {\n              console.log(Formatter.box('No items match the current filters', 'info'));\n              console.log(\n                Formatter.info(\n                  'Try adjusting your filter criteria or use --help for filter examples'\n                )\n              );\n              return;\n            }\n\n            // Display results based on format\n            if (options?.table) {\n              console.log(Formatter.header('📋 Items Table'));\n              console.log(Formatter.formatTable(paginatedItems));\n            } else if (options?.compact) {\n              console.log(Formatter.header('📝 Compact View'));\n              displayCompactView(paginatedItems);\n            } else if (options?.verbose) {\n              console.log(Formatter.header('📖 Detailed View'));\n              displayDetailedView(paginatedItems);\n            } else {\n              console.log(Formatter.header('📋 Status Overview'));\n              displayGroupedView(paginatedItems);\n            }\n\n            // Show detailed statistics\n            if (options?.stats) {\n              console.log(Formatter.header('📈 Project Analytics'));\n              displayAdvancedStatistics(filteredItems, items);\n            }\n\n            // Show active filters\n            if (hasActiveFilters(filters)) {\n              displayActiveFilters(filters);\n            }\n\n            // Show pagination info\n            if (options?.limit || options?.offset) {\n              displayPaginationInfo(sortedItems.length, paginatedItems.length, options);\n            }\n\n            // Export if requested\n            if (options?.export) {\n              await exportResults(filteredItems, options.export, config);\n            }\n\n            // Show helpful next steps\n            if (!options?.compact && !options?.table) {\n              displayNextSteps(filteredItems, config);\n            }\n          } catch (error) {\n            spinner.fail('Status analysis failed');\n            throw error;\n          }\n        } catch (error) {\n          if (error instanceof ValidationError) {\n            console.error(Formatter.error(error.message));\n            if (error.suggestion) {\n              console.log(Formatter.info(`💡 ${error.suggestion}`));\n            }\n            if (error.validOptions?.length) {\n              console.log(Formatter.info('Valid options:'));\n              error.validOptions.forEach((option) => {\n                console.log(Formatter.highlight(`  ${option}`));\n              });\n            }\n          } else {\n            console.error(\n              Formatter.error(\n                `Failed to get status: ${error instanceof Error ? error.message : 'Unknown error'}`\n              )\n            );\n          }\n          process.exit(1);\n        }\n      }\n    );\n\n  return command;\n}\n\n// Enhanced functions for Phase 2 implementation\nasync function runInteractiveStatusMode(_currentOptions: any): Promise<any> {\n  console.log(Formatter.header('🔍 Interactive Status Filtering'));\n\n  const answers = await inquirer.prompt([\n    {\n      type: 'list',\n      name: 'outputFormat',\n      message: 'Output format:',\n      choices: [\n        { name: '📋 Default - Grouped by status', value: 'default' },\n        { name: '📖 Verbose - Detailed item view', value: 'verbose' },\n        { name: '📝 Compact - Quick overview', value: 'compact' },\n        { name: '📊 Table - Tabular format', value: 'table' },\n      ],\n      default: 'default',\n    },\n    {\n      type: 'checkbox',\n      name: 'statusFilter',\n      message: 'Filter by status (select multiple):',\n      choices: [\n        { name: '📝 Todo - Not started', value: 'todo' },\n        { name: '🔄 In Progress - Currently working', value: 'in-progress' },\n        { name: '🚫 Blocked - Dependencies or issues', value: 'blocked' },\n        { name: '✅ Done - Completed tasks', value: 'done' },\n      ],\n    },\n    {\n      type: 'checkbox',\n      name: 'priorityFilter',\n      message: 'Filter by priority (select multiple):',\n      choices: [\n        { name: '🔴 Critical - Urgent, blocking', value: 'critical' },\n        { name: '🟠 High - Important, urgent', value: 'high' },\n        { name: '🟡 Medium - Standard priority', value: 'medium' },\n        { name: '🟢 Low - Nice to have', value: 'low' },\n      ],\n    },\n    {\n      type: 'input',\n      name: 'assigneeFilter',\n      message: 'Filter by assignee (username/email):',\n    },\n    {\n      type: 'input',\n      name: 'tagsFilter',\n      message: 'Filter by tags (comma-separated):',\n    },\n    {\n      type: 'list',\n      name: 'sortBy',\n      message: 'Sort results by:',\n      choices: [\n        { name: '🕒 Last Updated (newest first)', value: 'updated:desc' },\n        { name: '🕒 Last Updated (oldest first)', value: 'updated:asc' },\n        { name: '📅 Created Date (newest first)', value: 'created:desc' },\n        { name: '📅 Created Date (oldest first)', value: 'created:asc' },\n        { name: '🏷️ Priority (high to low)', value: 'priority:desc' },\n        { name: '📝 Title (A-Z)', value: 'title:asc' },\n      ],\n      default: 'updated:desc',\n    },\n    {\n      type: 'confirm',\n      name: 'showStats',\n      message: 'Show detailed statistics?',\n      default: true,\n    },\n    {\n      type: 'input',\n      name: 'limitResults',\n      message: 'Limit number of results (leave blank for all):',\n      validate: (input: string) => {\n        if (!input) return true;\n        const num = parseInt(input);\n        if (Number.isNaN(num) || num < 1) return 'Please enter a valid positive number';\n        return true;\n      },\n    },\n  ]);\n\n  // Convert answers to options format\n  const [sortField, sortOrder] = answers.sortBy.split(':');\n\n  return {\n    verbose: answers.outputFormat === 'verbose',\n    compact: answers.outputFormat === 'compact',\n    table: answers.outputFormat === 'table',\n    stats: answers.showStats,\n    status: answers.statusFilter.length === 1 ? answers.statusFilter[0] : undefined,\n    priority: answers.priorityFilter.length === 1 ? answers.priorityFilter[0] : undefined,\n    assignee: answers.assigneeFilter || undefined,\n    tags: answers.tagsFilter || undefined,\n    sort: sortField,\n    order: sortOrder,\n    limit: answers.limitResults ? answers.limitResults : undefined,\n    filter: buildFilterExpression(answers),\n  };\n}\n\nfunction buildFilterExpression(answers: any): string {\n  const filters = [];\n\n  if (answers.statusFilter.length > 1) {\n    filters.push(`status=${answers.statusFilter.join(',')}`);\n  }\n  if (answers.priorityFilter.length > 1) {\n    filters.push(`priority=${answers.priorityFilter.join(',')}`);\n  }\n  if (answers.assigneeFilter) {\n    filters.push(`assignee=${answers.assigneeFilter}`);\n  }\n  if (answers.tagsFilter) {\n    filters.push(`tags=${answers.tagsFilter}`);\n  }\n\n  return filters.join(',');\n}\n\nasync function runWatchMode(\n  trackdownDir: string,\n  options: any,\n  config: any,\n  pathResolver: PathResolver\n): Promise<void> {\n  console.log(Formatter.info('👁️ Watch mode enabled - monitoring for changes...'));\n  console.log(Formatter.info('Press Ctrl+C to exit'));\n\n  let lastHash = '';\n\n  const displayStatus = async () => {\n    try {\n      // Clear console\n      console.clear();\n\n      // Show current time\n      console.log(\n        Formatter.header(\n          `📊 ${config.projectName || 'Trackdown'} Live Status - ${new Date().toLocaleTimeString()}`\n        )\n      );\n\n      // Get items and generate hash for change detection\n      const items = await getAllItemsWithRelationshipManager(config, pathResolver);\n      const currentHash = JSON.stringify(\n        items.map((i) => `${i.id}-${i.updatedAt.getTime()}`)\n      ).substring(0, 20);\n\n      if (currentHash !== lastHash) {\n        const filters = parseFilters(options);\n        const filteredItems = applyAdvancedFilters(items, filters);\n        const sortedItems = applySorting(\n          filteredItems,\n          options?.sort || 'updated',\n          options?.order || 'desc'\n        );\n        const paginatedItems = applyPagination(sortedItems, options?.limit, options?.offset);\n\n        displayProjectOverview(trackdownDir, items, config, pathResolver);\n\n        if (paginatedItems.length > 0) {\n          if (options?.table) {\n            console.log(Formatter.formatTable(paginatedItems));\n          } else {\n            displayGroupedView(paginatedItems);\n          }\n        } else {\n          console.log(Formatter.box('No items match current filters', 'info'));\n        }\n\n        lastHash = currentHash;\n        console.log(Formatter.info(`🔄 Last updated: ${new Date().toLocaleTimeString()}`));\n      } else {\n        console.log(Formatter.info('No changes detected'));\n      }\n    } catch (error) {\n      console.error(\n        Formatter.error(\n          `Watch mode error: ${error instanceof Error ? error.message : 'Unknown error'}`\n        )\n      );\n    }\n  };\n\n  // Initial display\n  await displayStatus();\n\n  // Set up file watching interval\n  const interval = setInterval(displayStatus, 2000);\n\n  // Handle graceful shutdown\n  process.on('SIGINT', () => {\n    clearInterval(interval);\n    console.log(Formatter.info('\\n👋 Watch mode stopped'));\n    process.exit(0);\n  });\n}\n\nasync function getAllItemsWithRelationshipManager(\n  config: any,\n  _pathResolver: PathResolver\n): Promise<TrackdownItem[]> {\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR;\n\n  // Get absolute paths with CLI override (same as individual commands)\n  const configManager = new ConfigManager();\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n\n  // Initialize relationship manager (same as individual commands)\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Get all items from the relationship manager\n  const epics = relationshipManager.getAllEpics();\n  const issues = relationshipManager.getAllIssues();\n  const tasks = relationshipManager.getAllTasks();\n\n  // Convert to TrackdownItem format for compatibility with existing status command logic\n  const items: TrackdownItem[] = [];\n\n  // Add epics\n  for (const epic of epics) {\n    items.push({\n      id: epic.epic_id,\n      title: epic.title,\n      description: epic.description,\n      status: mapStatus(epic.status),\n      priority: mapPriority(epic.priority),\n      assignee: epic.assignee !== 'unassigned' ? epic.assignee : undefined,\n      createdAt: new Date(epic.created_date),\n      updatedAt: new Date(epic.updated_date),\n      tags: epic.tags,\n      estimate: epic.estimated_tokens || undefined,\n    });\n  }\n\n  // Add issues\n  for (const issue of issues) {\n    items.push({\n      id: issue.issue_id,\n      title: issue.title,\n      description: issue.description,\n      status: mapStatus(issue.status),\n      priority: mapPriority(issue.priority),\n      assignee: issue.assignee !== 'unassigned' ? issue.assignee : undefined,\n      createdAt: new Date(issue.created_date),\n      updatedAt: new Date(issue.updated_date),\n      tags: issue.tags,\n      estimate: issue.estimated_tokens || undefined,\n    });\n  }\n\n  // Add tasks\n  for (const task of tasks) {\n    items.push({\n      id: task.task_id,\n      title: task.title,\n      description: task.description,\n      status: mapStatus(task.status),\n      priority: mapPriority(task.priority),\n      assignee: task.assignee !== 'unassigned' ? task.assignee : undefined,\n      createdAt: new Date(task.created_date),\n      updatedAt: new Date(task.updated_date),\n      tags: task.tags,\n      estimate: task.estimated_tokens || undefined,\n    });\n  }\n\n  return items.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n}\n\n// Helper functions to map status and priority values\nfunction mapStatus(status: string): 'todo' | 'in-progress' | 'done' | 'blocked' {\n  switch (status) {\n    case 'planning':\n      return 'todo';\n    case 'active':\n      return 'in-progress';\n    case 'completed':\n      return 'done';\n    case 'blocked':\n      return 'blocked';\n    default:\n      return 'todo';\n  }\n}\n\nfunction mapPriority(priority: string): 'low' | 'medium' | 'high' | 'critical' {\n  switch (priority) {\n    case 'low':\n      return 'low';\n    case 'medium':\n      return 'medium';\n    case 'high':\n      return 'high';\n    case 'critical':\n      return 'critical';\n    default:\n      return 'medium';\n  }\n}\n\nfunction parseFilters(options: any): StatusFilter {\n  const filters: StatusFilter = {};\n\n  // Basic filters\n  if (options?.status) {\n    filters.status = validateStatus(options.status);\n  }\n\n  if (options?.priority) {\n    filters.priority = validatePriority(options.priority);\n  }\n\n  if (options?.assignee) {\n    filters.assignee = validateAssignee(options.assignee);\n  }\n\n  if (options?.id) {\n    filters.id = validateId(options.id);\n  }\n\n  if (options?.tags) {\n    filters.tags = validateTags(options.tags);\n  }\n\n  // Date filters\n  if (options?.createdAfter) {\n    filters.createdAfter = new Date(options.createdAfter);\n  }\n\n  if (options?.createdBefore) {\n    filters.createdBefore = new Date(options.createdBefore);\n  }\n\n  if (options?.updatedAfter) {\n    filters.updatedAfter = new Date(options.updatedAfter);\n  }\n\n  if (options?.updatedBefore) {\n    filters.updatedBefore = new Date(options.updatedBefore);\n  }\n\n  // Story point filters\n  if (options?.estimateMin) {\n    filters.estimateMin = parseFloat(options.estimateMin);\n  }\n\n  if (options?.estimateMax) {\n    filters.estimateMax = parseFloat(options.estimateMax);\n  }\n\n  // Advanced filter expression\n  if (options?.filter) {\n    parseAdvancedFilter(options.filter, filters);\n  }\n\n  return filters;\n}\n\nfunction parseAdvancedFilter(filterExpr: string, filters: StatusFilter): void {\n  const parts = filterExpr.split(',');\n\n  for (const part of parts) {\n    const [key, value] = part.split('=');\n    if (!key || !value) continue;\n\n    const trimmedKey = key.trim();\n    const trimmedValue = value.trim();\n\n    switch (trimmedKey) {\n      case 'status':\n        if (trimmedValue.includes(',')) {\n          filters.statusIn = trimmedValue.split(',').map((s) => s.trim());\n        } else {\n          filters.status = trimmedValue;\n        }\n        break;\n      case 'priority':\n        if (trimmedValue.includes(',')) {\n          filters.priorityIn = trimmedValue.split(',').map((p) => p.trim());\n        } else {\n          filters.priority = trimmedValue;\n        }\n        break;\n      case 'assignee':\n        filters.assignee = trimmedValue;\n        break;\n      case 'tags':\n        filters.tags = trimmedValue.split(',').map((t) => t.trim());\n        break;\n      case 'estimate':\n        if (trimmedValue.includes('-')) {\n          const [min, max] = trimmedValue.split('-');\n          filters.estimateMin = parseFloat(min);\n          filters.estimateMax = parseFloat(max);\n        }\n        break;\n    }\n  }\n}\n\nfunction applyAdvancedFilters(items: TrackdownItem[], filters: StatusFilter): TrackdownItem[] {\n  return items.filter((item) => {\n    // Status filters\n    if (filters.status && item.status !== filters.status) return false;\n    if (filters.statusIn && !filters.statusIn.includes(item.status)) return false;\n\n    // Priority filters\n    if (filters.priority && item.priority !== filters.priority) return false;\n    if (filters.priorityIn && !filters.priorityIn.includes(item.priority)) return false;\n\n    // Assignee filter\n    if (filters.assignee && item.assignee !== filters.assignee) return false;\n\n    // ID filter\n    if (filters.id && item.id !== filters.id) return false;\n\n    // Tags filter - item must have at least one matching tag\n    if (filters.tags && filters.tags.length > 0) {\n      if (!item.tags || !filters.tags.some((tag) => item.tags?.includes(tag))) return false;\n    }\n\n    // Date filters\n    if (filters.createdAfter && item.createdAt < filters.createdAfter) return false;\n    if (filters.createdBefore && item.createdAt > filters.createdBefore) return false;\n    if (filters.updatedAfter && item.updatedAt < filters.updatedAfter) return false;\n    if (filters.updatedBefore && item.updatedAt > filters.updatedBefore) return false;\n\n    // Story point filters\n    if (filters.estimateMin && (!item.estimate || item.estimate < filters.estimateMin))\n      return false;\n    if (filters.estimateMax && (!item.estimate || item.estimate > filters.estimateMax))\n      return false;\n\n    return true;\n  });\n}\n\nfunction applySorting(\n  items: TrackdownItem[],\n  sortField: string,\n  sortOrder: string\n): TrackdownItem[] {\n  const direction = sortOrder === 'desc' ? -1 : 1;\n\n  return [...items].sort((a, b) => {\n    let comparison = 0;\n\n    switch (sortField) {\n      case 'created':\n        comparison = a.createdAt.getTime() - b.createdAt.getTime();\n        break;\n      case 'updated':\n        comparison = a.updatedAt.getTime() - b.updatedAt.getTime();\n        break;\n      case 'title':\n        comparison = a.title.localeCompare(b.title);\n        break;\n      case 'priority': {\n        const priorityOrder = { critical: 4, high: 3, medium: 2, low: 1 };\n        comparison = priorityOrder[a.priority] - priorityOrder[b.priority];\n        break;\n      }\n      case 'status': {\n        const statusOrder = { todo: 1, 'in-progress': 2, blocked: 3, done: 4 };\n        comparison = statusOrder[a.status] - statusOrder[b.status];\n        break;\n      }\n      default:\n        comparison = a.updatedAt.getTime() - b.updatedAt.getTime();\n    }\n\n    return comparison * direction;\n  });\n}\n\nfunction applyPagination(items: TrackdownItem[], limit?: string, offset?: string): TrackdownItem[] {\n  let start = 0;\n  let end = items.length;\n\n  if (offset) {\n    start = parseInt(offset);\n    if (Number.isNaN(start) || start < 0) start = 0;\n  }\n\n  if (limit) {\n    const limitNum = parseInt(limit);\n    if (!Number.isNaN(limitNum) && limitNum > 0) {\n      end = start + limitNum;\n    }\n  }\n\n  return items.slice(start, end);\n}\n\nfunction displayProjectOverview(\n  trackdownDir: string,\n  items: TrackdownItem[],\n  _config: any,\n  pathResolver: PathResolver\n): void {\n  const summary = getProjectSummaryEnhanced(trackdownDir, items, pathResolver);\n  console.log(summary);\n}\n\nfunction getProjectSummaryEnhanced(\n  _trackdownDir: string,\n  items: TrackdownItem[],\n  _pathResolver: PathResolver\n): string {\n  const activeItems = items.filter((item) => item.status !== 'done');\n  const completedItems = items.filter((item) => item.status === 'done');\n  const total = items.length;\n  const completionRate = total > 0 ? Math.round((completedItems.length / total) * 100) : 0;\n\n  // Calculate velocity metrics\n  const lastWeek = new Date();\n  lastWeek.setDate(lastWeek.getDate() - 7);\n  const recentlyCompleted = completedItems.filter((item) => item.updatedAt >= lastWeek).length;\n  const recentlyCreated = items.filter((item) => item.createdAt >= lastWeek).length;\n\n  // Priority breakdown\n  const byPriority = items.reduce(\n    (acc, item) => {\n      acc[item.priority] = (acc[item.priority] || 0) + 1;\n      return acc;\n    },\n    {} as Record<string, number>\n  );\n\n  return [\n    `📊 Project Overview`,\n    `   Active Items: ${Formatter.highlight(activeItems.length.toString())}`,\n    `   Completed Items: ${Formatter.highlight(completedItems.length.toString())}`,\n    `   Total Items: ${Formatter.highlight(total.toString())}`,\n    `   Completion Rate: ${Formatter.highlight(`${completionRate}%`)}`,\n    `   Weekly Velocity: ${Formatter.highlight(`${recentlyCompleted} completed, ${recentlyCreated} created`)}`,\n    `   Priority Breakdown: ${Object.entries(byPriority)\n      .map(([p, c]) => `${p}: ${c}`)\n      .join(', ')}`,\n    '',\n  ].join('\\n');\n}\n\nfunction displayCompactView(items: TrackdownItem[]): void {\n  items.forEach((item, index) => {\n    const statusBadge = getStatusIcon(item.status);\n    const priorityColor = getPriorityColor(item.priority);\n    console.log(\n      `${(index + 1).toString().padStart(3, ' ')}. ${statusBadge} ${priorityColor(item.priority.charAt(0).toUpperCase())} ${item.title} ${Formatter.dim(`(${item.id})`)}`\n    );\n  });\n}\n\nfunction displayDetailedView(items: TrackdownItem[]): void {\n  items.forEach((item, index) => {\n    console.log(Formatter.formatItem(item, 'detailed'));\n    if (index < items.length - 1) {\n      console.log(Formatter.dim('─'.repeat(80)));\n    }\n  });\n}\n\nfunction displayGroupedView(items: TrackdownItem[]): void {\n  const groupedItems = groupItemsByStatus(items);\n\n  for (const [status, statusItems] of Object.entries(groupedItems)) {\n    if (statusItems.length > 0) {\n      console.log(\n        Formatter.subheader(\n          `${getStatusIcon(status)} ${status.toUpperCase()} (${statusItems.length})`\n        )\n      );\n\n      statusItems.forEach((item, index) => {\n        const priorityColor = getPriorityColor(item.priority);\n        const assigneeInfo = item.assignee ? ` @${item.assignee}` : '';\n        const tagsInfo = item.tags?.length ? ` [${item.tags.join(', ')}]` : '';\n        console.log(\n          `  ${index + 1}. ${priorityColor(item.priority.toUpperCase())} ${item.title}${assigneeInfo}${tagsInfo} ${Formatter.dim(`(${item.id})`)}`\n        );\n      });\n      console.log('');\n    }\n  }\n}\n\nfunction displayAdvancedStatistics(\n  filteredItems: TrackdownItem[],\n  allItems: TrackdownItem[]\n): void {\n  const stats = Formatter.generateStats(filteredItems);\n  console.log(stats);\n\n  // Additional analytics\n  if (allItems.length > filteredItems.length) {\n    console.log(\n      Formatter.info(`📊 Showing ${filteredItems.length} of ${allItems.length} total items`)\n    );\n  }\n\n  // Estimate statistics\n  const withEstimates = filteredItems.filter((item) => item.estimate);\n  if (withEstimates.length > 0) {\n    const totalPoints = withEstimates.reduce((sum, item) => sum + (item.estimate || 0), 0);\n    const avgPoints = Math.round((totalPoints / withEstimates.length) * 10) / 10;\n    console.log(\n      Formatter.info(\n        `📊 Story Points: ${totalPoints} total, ${avgPoints} average (${withEstimates.length} estimated)`\n      )\n    );\n  }\n\n  // Recent activity\n  const lastWeek = new Date();\n  lastWeek.setDate(lastWeek.getDate() - 7);\n  const recentActivity = filteredItems.filter((item) => item.updatedAt >= lastWeek).length;\n  console.log(\n    Formatter.info(`🔄 Recent Activity: ${recentActivity} items updated in the last 7 days`)\n  );\n}\n\nfunction hasActiveFilters(filters: StatusFilter): boolean {\n  return Object.keys(filters).length > 0;\n}\n\nfunction displayActiveFilters(filters: StatusFilter): void {\n  console.log(Formatter.header('🔍 Active Filters'));\n\n  const filterDescriptions = [];\n\n  if (filters.status) filterDescriptions.push(`Status: ${filters.status}`);\n  if (filters.statusIn) filterDescriptions.push(`Status in: ${filters.statusIn.join(', ')}`);\n  if (filters.priority) filterDescriptions.push(`Priority: ${filters.priority}`);\n  if (filters.priorityIn) filterDescriptions.push(`Priority in: ${filters.priorityIn.join(', ')}`);\n  if (filters.assignee) filterDescriptions.push(`Assignee: ${filters.assignee}`);\n  if (filters.id) filterDescriptions.push(`ID: ${filters.id}`);\n  if (filters.tags) filterDescriptions.push(`Tags: ${filters.tags.join(', ')}`);\n  if (filters.createdAfter)\n    filterDescriptions.push(`Created after: ${filters.createdAfter.toDateString()}`);\n  if (filters.createdBefore)\n    filterDescriptions.push(`Created before: ${filters.createdBefore.toDateString()}`);\n  if (filters.updatedAfter)\n    filterDescriptions.push(`Updated after: ${filters.updatedAfter.toDateString()}`);\n  if (filters.updatedBefore)\n    filterDescriptions.push(`Updated before: ${filters.updatedBefore.toDateString()}`);\n  if (filters.estimateMin) filterDescriptions.push(`Min estimate: ${filters.estimateMin}`);\n  if (filters.estimateMax) filterDescriptions.push(`Max estimate: ${filters.estimateMax}`);\n\n  filterDescriptions.forEach((desc) => {\n    console.log(Formatter.info(`  • ${desc}`));\n  });\n\n  console.log('');\n}\n\nfunction displayPaginationInfo(totalCount: number, displayedCount: number, options: any): void {\n  const offset = options?.offset ? parseInt(options.offset) : 0;\n  const limit = options?.limit ? parseInt(options.limit) : displayedCount;\n\n  console.log(\n    Formatter.info(\n      `📄 Pagination: Showing ${displayedCount} items (${offset + 1}-${offset + displayedCount} of ${totalCount})`\n    )\n  );\n\n  if (offset + displayedCount < totalCount) {\n    console.log(Formatter.info(`   Next page: --offset ${offset + limit} --limit ${limit}`));\n  }\n\n  console.log('');\n}\n\nasync function exportResults(\n  items: TrackdownItem[],\n  exportFile: string,\n  _config: any\n): Promise<void> {\n  const spinner = ora('Exporting filtered results...').start();\n\n  try {\n    const format = exportFile.split('.').pop() || 'json';\n    const exportData = Formatter.formatExport(items, format);\n\n    writeFileSync(exportFile, exportData);\n\n    spinner.succeed(`Exported ${items.length} items to ${exportFile}`);\n    console.log(Formatter.info(`📄 Export completed: ${exportFile}`));\n  } catch (error) {\n    spinner.fail('Export failed');\n    throw error;\n  }\n}\n\nfunction displayNextSteps(items: TrackdownItem[], _config: any): void {\n  console.log(Formatter.header('💡 Quick Actions'));\n\n  const todoItems = items.filter((item) => item.status === 'todo');\n  const inProgressItems = items.filter((item) => item.status === 'in-progress');\n  const blockedItems = items.filter((item) => item.status === 'blocked');\n\n  if (todoItems.length > 0) {\n    console.log(Formatter.info('📝 Create a new task:'));\n    console.log(Formatter.highlight('  trackdown track \"New task title\"'));\n  }\n\n  if (inProgressItems.length > 0) {\n    console.log(Formatter.info('🔄 Update task status:'));\n    console.log(Formatter.highlight(`  # Edit file: ${inProgressItems[0].id}*.md`));\n  }\n\n  if (blockedItems.length > 0) {\n    console.log(Formatter.warning('🚫 Review blocked items for resolution'));\n  }\n\n  console.log(Formatter.info('📊 View detailed item:'));\n  console.log(Formatter.highlight('  trackdown status --id <item-id> --verbose'));\n\n  console.log('');\n}\n\nfunction getStatusIcon(status: string): string {\n  switch (status) {\n    case 'todo':\n      return '📝';\n    case 'in-progress':\n      return '🔄';\n    case 'blocked':\n      return '🚫';\n    case 'done':\n      return '✅';\n    default:\n      return '📄';\n  }\n}\n\nfunction groupItemsByStatus(items: TrackdownItem[]): Record<string, TrackdownItem[]> {\n  const groups: Record<string, TrackdownItem[]> = {\n    todo: [],\n    'in-progress': [],\n    blocked: [],\n    done: [],\n  };\n\n  for (const item of items) {\n    if (groups[item.status]) {\n      groups[item.status].push(item);\n    }\n  }\n\n  return groups;\n}\n\nfunction getPriorityColor(priority: string): (text: string) => string {\n  switch (priority) {\n    case 'low':\n      return Formatter.dim;\n    case 'medium':\n      return (text: string) => text; // no color\n    case 'high':\n      return (text: string) => Formatter.highlight(text);\n    case 'critical':\n      return (text: string) => Formatter.error(text);\n    default:\n      return (text: string) => text;\n  }\n}\n\nfunction applyCurrentSprintFilter(items: TrackdownItem[]): TrackdownItem[] {\n  // Current sprint includes:\n  // 1. All items with status 'in-progress' (actively being worked on)\n  // 2. High priority 'todo' items that are ready to be picked up\n  // 3. All 'blocked' items that need attention\n  return items.filter((item) => {\n    // Include all in-progress items\n    if (item.status === 'in-progress') {\n      return true;\n    }\n\n    // Include high priority todo items\n    if (item.status === 'todo' && (item.priority === 'high' || item.priority === 'critical')) {\n      return true;\n    }\n\n    // Include blocked items that need attention\n    if (item.status === 'blocked') {\n      return true;\n    }\n\n    return false;\n  });\n}\n\nfunction displaySummaryView(\n  _trackdownDir: string,\n  allItems: TrackdownItem[],\n  filteredItems: TrackdownItem[],\n  _config: any,\n  _pathResolver: PathResolver\n): void {\n  const total = allItems.length;\n  const filtered = filteredItems.length;\n\n  // Basic counts\n  const activeItems = allItems.filter((item) => item.status !== 'done');\n  const completedItems = allItems.filter((item) => item.status === 'done');\n  const blockedItems = allItems.filter((item) => item.status === 'blocked');\n  const inProgressItems = allItems.filter((item) => item.status === 'in-progress');\n\n  // Priority breakdown\n  const priorityBreakdown = allItems.reduce(\n    (acc, item) => {\n      acc[item.priority] = (acc[item.priority] || 0) + 1;\n      return acc;\n    },\n    {} as Record<string, number>\n  );\n\n  // Calculate completion rate\n  const completionRate = total > 0 ? Math.round((completedItems.length / total) * 100) : 0;\n\n  // Recent activity (last 7 days)\n  const lastWeek = new Date();\n  lastWeek.setDate(lastWeek.getDate() - 7);\n  const recentlyUpdated = allItems.filter((item) => item.updatedAt >= lastWeek).length;\n\n  // Display summary\n  console.log(Formatter.subheader('📋 Project Summary'));\n  console.log(`   Total Items: ${Formatter.highlight(total.toString())}`);\n  console.log(\n    `   Active: ${Formatter.highlight(activeItems.length.toString())} | Completed: ${Formatter.highlight(completedItems.length.toString())} | Blocked: ${Formatter.highlight(blockedItems.length.toString())}`\n  );\n  console.log(`   Progress: ${Formatter.highlight(`${completionRate}%`)} complete`);\n  console.log('');\n\n  console.log(Formatter.subheader('🎯 Status Breakdown'));\n  console.log(`   📝 Todo: ${allItems.filter((item) => item.status === 'todo').length}`);\n  console.log(`   🔄 In Progress: ${inProgressItems.length}`);\n  console.log(`   🚫 Blocked: ${blockedItems.length}`);\n  console.log(`   ✅ Done: ${completedItems.length}`);\n  console.log('');\n\n  console.log(Formatter.subheader('⚡ Priority Distribution'));\n  console.log(`   🔴 Critical: ${priorityBreakdown.critical || 0}`);\n  console.log(`   🟠 High: ${priorityBreakdown.high || 0}`);\n  console.log(`   🟡 Medium: ${priorityBreakdown.medium || 0}`);\n  console.log(`   🟢 Low: ${priorityBreakdown.low || 0}`);\n  console.log('');\n\n  console.log(Formatter.subheader('🔄 Recent Activity'));\n  console.log(\n    `   Items updated in last 7 days: ${Formatter.highlight(recentlyUpdated.toString())}`\n  );\n\n  // Show filter info if filters are applied\n  if (filtered !== total) {\n    console.log('');\n    console.log(Formatter.info(`📊 ${filtered} of ${total} items match current filters`));\n  }\n\n  // Show key actionable items\n  const highPriorityActive = activeItems.filter(\n    (item) => item.priority === 'high' || item.priority === 'critical'\n  );\n  if (highPriorityActive.length > 0) {\n    console.log('');\n    console.log(Formatter.subheader('⚠️ High Priority Active Items'));\n    highPriorityActive.slice(0, 3).forEach((item, index) => {\n      const priorityColor = getPriorityColor(item.priority);\n      console.log(\n        `   ${index + 1}. ${priorityColor(item.priority.toUpperCase())} ${item.title} ${Formatter.dim(`(${item.id})`)}`\n      );\n    });\n    if (highPriorityActive.length > 3) {\n      console.log(`   ... and ${highPriorityActive.length - 3} more high priority items`);\n    }\n  }\n}\n\nfunction validateTags(tags: string): string[] {\n  return tags\n    .split(',')\n    .map((tag) => tag.trim())\n    .filter(Boolean);\n}\n\nfunction _validateStatus(status: string): string {\n  const validStatuses = ['todo', 'in-progress', 'blocked', 'done'];\n  const normalizedStatus = status.toLowerCase().trim();\n\n  if (!validStatuses.includes(normalizedStatus)) {\n    throw new ValidationError(\n      `Invalid status: ${status}`,\n      `Valid statuses are: ${validStatuses.join(', ')}`,\n      1,\n      'status',\n      validStatuses.map((s) => `--status ${s}`)\n    );\n  }\n\n  return normalizedStatus;\n}\n","/**\n * Enhanced Status Command with TrackdownIndexManager\n * High-performance status reporting using the .ai-trackdown-index file system\n *\n * Performance Improvements:\n * - >90% faster than filesystem scanning\n * - <10ms response time for large projects\n * - Pre-calculated aggregations and relationships\n * - Real-time index updates\n */\n\nimport { Command } from 'commander';\nimport type { ItemType } from '../types/ai-trackdown.js';\nimport { ConfigManager } from '../utils/config-manager.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { TrackdownIndexManager } from '../utils/trackdown-index-manager.js';\n\ninterface StatusOptions {\n  verbose?: boolean;\n  compact?: boolean;\n  table?: boolean;\n  stats?: boolean;\n  filter?: string;\n  status?: string;\n  priority?: string;\n  assignee?: string;\n  tags?: string;\n  type?: string;\n  limit?: string;\n  rebuildIndex?: boolean;\n  indexStats?: boolean;\n}\n\nexport function createStatusEnhancedCommand(): Command {\n  const command = new Command('status-enhanced');\n\n  command\n    .description('Display comprehensive project status using high-performance index system')\n    .option('-v, --verbose', 'show detailed item information')\n    .option('-c, --compact', 'compact output format')\n    .option('--table', 'display results in table format')\n    .option('--stats', 'show detailed project statistics')\n    .option('-s, --status <status>', 'filter by status (planning|active|completed|archived)')\n    .option('-p, --priority <priority>', 'filter by priority (low|medium|high|critical)')\n    .option('-a, --assignee <name>', 'filter by assignee')\n    .option('-t, --tags <tags>', 'filter by tags (comma-separated)')\n    .option('--type <type>', 'filter by item type (epic|issue|task|pr)')\n    .option('--limit <count>', 'limit number of results')\n    .option('--rebuild-index', 'force rebuild of index before displaying status')\n    .option('--index-stats', 'show index performance and health statistics')\n    .addHelpText(\n      'after',\n      `\nExamples:\n  $ aitrackdown status-enhanced\n  $ aitrackdown status-enhanced --verbose --stats\n  $ aitrackdown status-enhanced --status active --priority high\n  $ aitrackdown status-enhanced --type epic --table\n  $ aitrackdown status-enhanced --rebuild-index\n  $ aitrackdown status-enhanced --index-stats\n\nPerformance Benefits:\n  - 🚀 >90% faster than traditional filesystem scanning\n  - ⚡ <10ms response time for projects with 1000+ items  \n  - 📊 Pre-calculated metrics and relationships\n  - 🔄 Real-time incremental updates\n  - 💾 <5MB memory usage for large projects\n\nFilter Options:\n  Status: planning, active, completed, archived\n  Priority: low, medium, high, critical\n  Type: epic, issue, task, pr\n`\n    )\n    .action(async (options: StatusOptions) => {\n      try {\n        await displayEnhancedStatus(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to get status: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n\nasync function displayEnhancedStatus(options: StatusOptions): Promise<void> {\n  const startTime = Date.now();\n\n  // Initialize configuration and index manager\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const parentCommand = (process as any).command?.parent;\n  const cliTasksDir = parentCommand?.opts()?.rootDir || parentCommand?.opts()?.tasksDir;\n\n  const projectRoot = configManager.findProjectRoot();\n  const indexManager = new TrackdownIndexManager(config, projectRoot, cliTasksDir);\n\n  // Force rebuild index if requested\n  if (options.rebuildIndex) {\n    console.log(Formatter.info('🔄 Rebuilding index...'));\n    await indexManager.rebuildIndex();\n  }\n\n  // Show index statistics if requested\n  if (options.indexStats) {\n    await displayIndexStatistics(indexManager);\n    return;\n  }\n\n  console.log(Formatter.header(`📊 ${config.name || 'AI-Trackdown'} Project Status (Enhanced)`));\n\n  // Get project overview with pre-calculated metrics\n  const overview = await indexManager.getProjectOverview();\n\n  // Display project summary\n  displayProjectSummary(overview, startTime);\n\n  // Apply filters and get filtered results\n  const filteredItems = await applyFilters(indexManager, options);\n\n  // Apply limit if specified\n  const limitedItems = options.limit\n    ? filteredItems.slice(0, parseInt(options.limit))\n    : filteredItems;\n\n  if (limitedItems.length === 0) {\n    console.log(Formatter.box('No items match the current filters', 'info'));\n    return;\n  }\n\n  // Display results based on format\n  if (options.table) {\n    displayTableView(limitedItems);\n  } else if (options.compact) {\n    displayCompactView(limitedItems);\n  } else if (options.verbose) {\n    displayVerboseView(limitedItems);\n  } else {\n    displayGroupedView(limitedItems);\n  }\n\n  // Show detailed statistics if requested\n  if (options.stats) {\n    await displayDetailedStatistics(indexManager, overview);\n  }\n\n  // Show performance metrics\n  const totalTime = Date.now() - startTime;\n  console.log(Formatter.dim(`\\n⚡ Retrieved in ${totalTime}ms using index system`));\n\n  if (filteredItems.length !== overview.totalItems) {\n    console.log(\n      Formatter.info(\n        `📊 Showing ${limitedItems.length} of ${filteredItems.length} filtered items (${overview.totalItems} total)`\n      )\n    );\n  }\n}\n\nasync function displayIndexStatistics(indexManager: TrackdownIndexManager): Promise<void> {\n  const stats = await indexManager.getIndexStats();\n\n  console.log(Formatter.header('📈 Index System Statistics'));\n  console.log(Formatter.info(`Health Status: ${stats.healthy ? '✅ Healthy' : '❌ Unhealthy'}`));\n  console.log(Formatter.info(`Index File Exists: ${stats.indexFileExists ? '✅ Yes' : '❌ No'}`));\n  console.log(Formatter.info(`Cache Hit: ${stats.cacheHit ? '✅ Yes' : '❌ No'}`));\n\n  if (stats.lastModified) {\n    console.log(Formatter.info(`Last Modified: ${stats.lastModified.toLocaleString()}`));\n  }\n\n  console.log(Formatter.subheader('\\n📊 Content Statistics'));\n  console.log(Formatter.info(`Total Epics: ${stats.totalEpics}`));\n  console.log(Formatter.info(`Total Issues: ${stats.totalIssues}`));\n  console.log(Formatter.info(`Total Tasks: ${stats.totalTasks}`));\n  console.log(Formatter.info(`Total PRs: ${stats.totalPRs}`));\n  console.log(Formatter.info(`Index Size: ${Math.round(stats.indexSize / 1024)}KB`));\n  console.log(Formatter.info(`Last Full Scan: ${stats.lastFullScan}`));\n\n  console.log(Formatter.subheader('\\n⚡ Performance Metrics'));\n  console.log(Formatter.info(`Last Load Time: ${stats.performanceMetrics.lastLoadTime}ms`));\n  console.log(Formatter.info(`Last Update Time: ${stats.performanceMetrics.lastUpdateTime}ms`));\n  console.log(Formatter.info(`Last Rebuild Time: ${stats.performanceMetrics.lastRebuildTime}ms`));\n\n  // Performance assessment\n  const isPerformant =\n    stats.performanceMetrics.lastLoadTime < 50 && stats.performanceMetrics.lastUpdateTime < 20;\n\n  console.log(Formatter.subheader('\\n🎯 Performance Assessment'));\n  console.log(\n    Formatter.info(`Overall Performance: ${isPerformant ? '🚀 Excellent' : '⚠️ Needs Optimization'}`)\n  );\n\n  if (!isPerformant) {\n    console.log(Formatter.warning('Consider rebuilding the index if performance is slow'));\n    console.log(Formatter.info('Run: aitrackdown status-enhanced --rebuild-index'));\n  }\n}\n\nfunction displayProjectSummary(overview: any, _startTime: number): void {\n  const activeItems = overview.totalItems - (overview.byStatus.completed || 0);\n\n  console.log(Formatter.subheader('📋 Project Overview'));\n  console.log(Formatter.info(`Active Items: ${Formatter.highlight(activeItems.toString())}`));\n  console.log(\n    Formatter.info(\n      `Completed Items: ${Formatter.highlight((overview.byStatus.completed || 0).toString())}`\n    )\n  );\n  console.log(\n    Formatter.info(`Total Items: ${Formatter.highlight(overview.totalItems.toString())}`)\n  );\n  console.log(\n    Formatter.info(`Completion Rate: ${Formatter.highlight(`${overview.completionRate}%`)}`)\n  );\n\n  // Type breakdown\n  console.log(\n    Formatter.info(\n      `Type Breakdown: Epics: ${overview.byType.epic}, Issues: ${overview.byType.issue}, Tasks: ${overview.byType.task}, PRs: ${overview.byType.pr}`\n    )\n  );\n\n  // Priority breakdown\n  const priorityBreakdown = Object.entries(overview.byPriority)\n    .map(([priority, count]) => `${priority}: ${count}`)\n    .join(', ');\n  console.log(Formatter.info(`Priority Breakdown: ${priorityBreakdown}`));\n\n  console.log('');\n}\n\nasync function applyFilters(\n  indexManager: TrackdownIndexManager,\n  options: StatusOptions\n): Promise<any[]> {\n  let items: any[] = [];\n\n  // Get items by type if specified, otherwise get all\n  if (options.type) {\n    items = await indexManager.getItemsByType(options.type as ItemType);\n  } else {\n    // Get all items\n    const [epics, issues, tasks, prs] = await Promise.all([\n      indexManager.getItemsByType('epic'),\n      indexManager.getItemsByType('issue'),\n      indexManager.getItemsByType('task'),\n      indexManager.getItemsByType('pr'),\n    ]);\n    items = [...epics, ...issues, ...tasks, ...prs];\n  }\n\n  // Apply status filter\n  if (options.status) {\n    items = items.filter((item) => item.status === options.status);\n  }\n\n  // Apply priority filter\n  if (options.priority) {\n    items = items.filter((item) => item.priority === options.priority);\n  }\n\n  // Apply assignee filter\n  if (options.assignee) {\n    items = items.filter((item) => item.assignee === options.assignee);\n  }\n\n  // Apply tags filter\n  if (options.tags) {\n    const filterTags = options.tags.split(',').map((tag) => tag.trim());\n    items = items.filter((item) => item.tags?.some((tag: string) => filterTags.includes(tag)));\n  }\n\n  // Sort by last modified (newest first)\n  items.sort((a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime());\n\n  return items;\n}\n\nfunction displayTableView(items: any[]): void {\n  console.log(Formatter.subheader('📊 Items Table'));\n\n  // Create table headers\n  const headers = ['ID', 'Type', 'Title', 'Status', 'Priority', 'Assignee', 'Modified'];\n\n  // Create table rows\n  const rows = items.map((item) => [\n    item.id,\n    getItemType(item),\n    item.title.length > 30 ? `${item.title.substring(0, 27)}...` : item.title,\n    item.status,\n    item.priority,\n    item.assignee || 'unassigned',\n    new Date(item.lastModified).toLocaleDateString(),\n  ]);\n\n  // Simple table formatting\n  console.log(headers.join('\\t'));\n  console.log('-'.repeat(100));\n  rows.forEach((row) => console.log(row.join('\\t')));\n}\n\nfunction displayCompactView(items: any[]): void {\n  console.log(Formatter.subheader('📝 Compact View'));\n\n  items.forEach((item, index) => {\n    const typeEmoji = getTypeEmoji(getItemType(item));\n    const statusEmoji = getStatusEmoji(item.status);\n    const priorityColor = getPriorityColor(item.priority);\n\n    console.log(\n      `${(index + 1).toString().padStart(3, ' ')}. ${typeEmoji} ${statusEmoji} ${priorityColor(item.priority[0].toUpperCase())} ${item.title} ${Formatter.dim(`(${item.id})`)}`\n    );\n  });\n}\n\nfunction displayVerboseView(items: any[]): void {\n  console.log(Formatter.subheader('📖 Detailed View'));\n\n  items.forEach((item, index) => {\n    const typeEmoji = getTypeEmoji(getItemType(item));\n    const statusEmoji = getStatusEmoji(item.status);\n\n    console.log(`${typeEmoji} ${statusEmoji} ${Formatter.highlight(item.title)}`);\n    console.log(`   ID: ${item.id}`);\n    console.log(`   Status: ${item.status} | Priority: ${item.priority}`);\n    if (item.assignee) console.log(`   Assignee: ${item.assignee}`);\n    if (item.tags?.length) console.log(`   Tags: ${item.tags.join(', ')}`);\n    console.log(`   Modified: ${new Date(item.lastModified).toLocaleString()}`);\n    console.log(`   File: ${item.filePath}`);\n\n    if (index < items.length - 1) {\n      console.log(Formatter.dim('─'.repeat(60)));\n    }\n  });\n}\n\nfunction displayGroupedView(items: any[]): void {\n  console.log(Formatter.subheader('📋 Status Overview'));\n\n  // Group by status\n  const grouped = items.reduce(\n    (acc, item) => {\n      if (!acc[item.status]) acc[item.status] = [];\n      acc[item.status].push(item);\n      return acc;\n    },\n    {} as Record<string, any[]>\n  );\n\n  // Display each status group\n  for (const [status, statusItems] of Object.entries(grouped)) {\n    if (statusItems.length > 0) {\n      const statusEmoji = getStatusEmoji(status);\n      console.log(\n        Formatter.subheader(`${statusEmoji} ${status.toUpperCase()} (${statusItems.length})`)\n      );\n\n      statusItems.forEach((item, index) => {\n        const typeEmoji = getTypeEmoji(getItemType(item));\n        const priorityColor = getPriorityColor(item.priority);\n        const assigneeInfo = item.assignee ? ` @${item.assignee}` : '';\n        const tagsInfo = item.tags?.length ? ` [${item.tags.join(', ')}]` : '';\n\n        console.log(\n          `  ${index + 1}. ${typeEmoji} ${priorityColor(item.priority.toUpperCase())} ${item.title}${assigneeInfo}${tagsInfo} ${Formatter.dim(`(${item.id})`)}`\n        );\n      });\n      console.log('');\n    }\n  }\n}\n\nasync function displayDetailedStatistics(\n  indexManager: TrackdownIndexManager,\n  overview: any\n): Promise<void> {\n  console.log(Formatter.header('📈 Detailed Analytics'));\n\n  // Show recent activity\n  if (overview.recentActivity.length > 0) {\n    console.log(Formatter.subheader('🔄 Recent Activity (Last 7 Days)'));\n    overview.recentActivity.forEach((item: any) => {\n      const typeEmoji = getTypeEmoji(getItemType(item));\n      console.log(\n        `${typeEmoji} ${item.title} - ${new Date(item.lastModified).toLocaleDateString()}`\n      );\n    });\n    console.log('');\n  }\n\n  // Index performance metrics\n  const stats = await indexManager.getIndexStats();\n  console.log(Formatter.subheader('⚡ Performance Metrics'));\n  console.log(Formatter.info(`Index Load Time: ${stats.performanceMetrics.lastLoadTime}ms`));\n  console.log(Formatter.info(`Index Size: ${Math.round(stats.indexSize / 1024)}KB`));\n  console.log(Formatter.info(`Cache Status: ${stats.cacheHit ? 'Hit' : 'Miss'}`));\n}\n\n// Helper functions\nfunction getItemType(item: any): string {\n  if (item.id.startsWith('EP-')) return 'epic';\n  if (item.id.startsWith('ISS-')) return 'issue';\n  if (item.id.startsWith('TSK-')) return 'task';\n  if (item.id.startsWith('PR-')) return 'pr';\n  return 'unknown';\n}\n\nfunction getTypeEmoji(type: string): string {\n  switch (type) {\n    case 'epic':\n      return '🎯';\n    case 'issue':\n      return '📋';\n    case 'task':\n      return '✅';\n    case 'pr':\n      return '🔄';\n    default:\n      return '📄';\n  }\n}\n\nfunction getStatusEmoji(status: string): string {\n  switch (status) {\n    case 'planning':\n      return '📝';\n    case 'active':\n      return '🔄';\n    case 'completed':\n      return '✅';\n    case 'archived':\n      return '📦';\n    default:\n      return '📄';\n  }\n}\n\nfunction getPriorityColor(priority: string): (text: string) => string {\n  switch (priority) {\n    case 'low':\n      return Formatter.dim;\n    case 'medium':\n      return (text: string) => text;\n    case 'high':\n      return Formatter.highlight;\n    case 'critical':\n      return Formatter.error;\n    default:\n      return (text: string) => text;\n  }\n}\n","/**\n * GitHub Sync Auto Command\n * Enable/disable automatic sync\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\n\nexport function createSyncAutoCommand(): Command {\n  const command = new Command('auto');\n\n  command\n    .description('Enable/disable automatic sync')\n    .option('--enable', 'Enable automatic sync')\n    .option('--disable', 'Disable automatic sync')\n    .option('--interval <minutes>', 'Set auto-sync interval in minutes (default: 30)')\n    .option('--status', 'Show auto-sync status')\n    .action(async (options) => {\n      try {\n        const configManager = new ConfigManager();\n        const config = configManager.getConfig();\n\n        // Check if GitHub sync is configured\n        if (!config.github_sync?.enabled) {\n          console.log(\n            Formatter.error('GitHub sync is not configured. Run \"aitrackdown sync setup\" first.')\n          );\n          process.exit(1);\n        }\n\n        console.log(Formatter.header('🔄 GitHub Auto-Sync Configuration'));\n        console.log(Formatter.info(`Repository: ${config.github_sync.repository}`));\n        console.log('');\n\n        if (options.status) {\n          // Show current auto-sync status\n          console.log(Formatter.info('Current Auto-Sync Status:'));\n          console.log(`  Enabled: ${config.github_sync.auto_sync ? 'Yes' : 'No'}`);\n          console.log(`  Conflict resolution: ${config.github_sync.conflict_resolution}`);\n          console.log(`  Batch size: ${config.github_sync.batch_size}`);\n          console.log(`  Rate limit delay: ${config.github_sync.rate_limit_delay}ms`);\n\n          if (config.github_sync.auto_sync) {\n            console.log('');\n            console.log(Formatter.info('Auto-sync is currently enabled.'));\n            console.log(\n              Formatter.warning(\n                'Note: Auto-sync implementation requires a scheduler (cron, systemd timer, etc.)'\n              )\n            );\n            console.log('');\n            console.log(Formatter.info('Suggested cron job (every 30 minutes):'));\n            console.log('  0,30 * * * * cd /path/to/project && aitrackdown sync bidirectional');\n            console.log('');\n            console.log(Formatter.info('Suggested systemd timer:'));\n            console.log('  # Create /etc/systemd/system/aitrackdown-sync.service');\n            console.log('  # Create /etc/systemd/system/aitrackdown-sync.timer');\n            console.log('  # Enable with: systemctl enable --now aitrackdown-sync.timer');\n          } else {\n            console.log('');\n            console.log(Formatter.info('Auto-sync is currently disabled.'));\n            console.log('Use \"aitrackdown sync auto --enable\" to enable it.');\n          }\n\n          return;\n        }\n\n        if (options.enable) {\n          // Enable auto-sync\n          const updatedConfig = {\n            ...config,\n            github_sync: {\n              ...config.github_sync,\n              auto_sync: true,\n            },\n          };\n\n          configManager.saveConfig(updatedConfig);\n\n          console.log(Formatter.success('Auto-sync enabled successfully!'));\n          console.log('');\n          console.log(Formatter.info('Auto-sync configuration:'));\n          console.log(`  Repository: ${updatedConfig.github_sync.repository}`);\n          console.log(`  Conflict resolution: ${updatedConfig.github_sync.conflict_resolution}`);\n          console.log(`  Batch size: ${updatedConfig.github_sync.batch_size}`);\n          console.log(`  Rate limit delay: ${updatedConfig.github_sync.rate_limit_delay}ms`);\n          console.log('');\n          console.log(Formatter.warning('Important: Auto-sync requires external scheduling!'));\n          console.log('');\n          console.log(Formatter.info('Setup options:'));\n          console.log('');\n          console.log(Formatter.info('1. Cron job (recommended):'));\n          console.log('   Edit crontab: crontab -e');\n          console.log(\n            '   Add line: 0,30 * * * * cd /path/to/your/project && aitrackdown sync bidirectional'\n          );\n          console.log('');\n          console.log(Formatter.info('2. Systemd timer:'));\n          console.log('   Create service file: /etc/systemd/system/aitrackdown-sync.service');\n          console.log('   Create timer file: /etc/systemd/system/aitrackdown-sync.timer');\n          console.log('   Enable: systemctl enable --now aitrackdown-sync.timer');\n          console.log('');\n          console.log(Formatter.info('3. Manual periodic execution:'));\n          console.log('   Run: aitrackdown sync bidirectional');\n          console.log('   Schedule as needed for your workflow');\n        } else if (options.disable) {\n          // Disable auto-sync\n          const updatedConfig = {\n            ...config,\n            github_sync: {\n              ...config.github_sync,\n              auto_sync: false,\n            },\n          };\n\n          configManager.saveConfig(updatedConfig);\n\n          console.log(Formatter.success('Auto-sync disabled successfully!'));\n          console.log('');\n          console.log(Formatter.info('Manual sync commands are still available:'));\n          console.log('  • aitrackdown sync push - Push local changes to GitHub');\n          console.log('  • aitrackdown sync pull - Pull GitHub changes to local');\n          console.log('  • aitrackdown sync bidirectional - Full bidirectional sync');\n          console.log('  • aitrackdown sync status - Check sync status');\n        } else {\n          // Show help if no action specified\n          console.log(Formatter.info('Auto-sync management options:'));\n          console.log('  --enable     Enable automatic sync');\n          console.log('  --disable    Disable automatic sync');\n          console.log('  --status     Show current auto-sync status');\n          console.log('');\n          console.log(Formatter.info('Examples:'));\n          console.log('  aitrackdown sync auto --enable');\n          console.log('  aitrackdown sync auto --disable');\n          console.log('  aitrackdown sync auto --status');\n        }\n      } catch (error) {\n        console.error(Formatter.error('Auto-sync configuration failed:'));\n        console.error(Formatter.error(error instanceof Error ? error.message : 'Unknown error'));\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","class RequestError extends Error {\n  name;\n  /**\n   * http status code\n   */\n  status;\n  /**\n   * Request options that lead to the error.\n   */\n  request;\n  /**\n   * Response object if a response was received\n   */\n  response;\n  constructor(message, statusCode, options) {\n    super(message);\n    this.name = \"HttpError\";\n    this.status = Number.parseInt(statusCode);\n    if (Number.isNaN(this.status)) {\n      this.status = 0;\n    }\n    if (\"response\" in options) {\n      this.response = options.response;\n    }\n    const requestCopy = Object.assign({}, options.request);\n    if (options.request.headers.authorization) {\n      requestCopy.headers = Object.assign({}, options.request.headers, {\n        authorization: options.request.headers.authorization.replace(\n          /(?<! ) .*$/,\n          \" [REDACTED]\"\n        )\n      });\n    }\n    requestCopy.url = requestCopy.url.replace(/\\bclient_secret=\\w+/g, \"client_secret=[REDACTED]\").replace(/\\baccess_token=\\w+/g, \"access_token=[REDACTED]\");\n    this.request = requestCopy;\n  }\n}\nexport {\n  RequestError\n};\n","/**\n * GitHub API Client\n * Handles GitHub Issues API interactions with authentication, rate limiting, and pagination\n */\n\nimport { RequestError } from '@octokit/request-error';\nimport { Octokit } from '@octokit/rest';\nimport type { GitHubIssue, GitHubSyncConfig } from '../types/ai-trackdown.js';\n\nexport class GitHubClient {\n  private octokit: Octokit;\n  private owner: string;\n  private repo: string;\n  private config: GitHubSyncConfig;\n\n  constructor(config: GitHubSyncConfig) {\n    this.config = config;\n\n    // Parse repository format (owner/repo)\n    const [owner, repo] = config.repository.split('/');\n    if (!owner || !repo) {\n      throw new Error(\n        `Invalid repository format: ${config.repository}. Expected format: owner/repo`\n      );\n    }\n\n    this.owner = owner;\n    this.repo = repo;\n\n    // Initialize Octokit with authentication\n    this.octokit = new Octokit({\n      auth: config.token,\n      request: {\n        timeout: 30000, // 30 second timeout\n      },\n    });\n  }\n\n  /**\n   * Test GitHub connection and permissions\n   */\n  async testConnection(): Promise<{ success: boolean; message: string }> {\n    try {\n      // Test repository access\n      const { data: repoData } = await this.octokit.rest.repos.get({\n        owner: this.owner,\n        repo: this.repo,\n      });\n\n      // Check if we have issues permission\n      if (!repoData.permissions?.push && !repoData.permissions?.admin) {\n        return {\n          success: false,\n          message: 'Token does not have write permissions to the repository',\n        };\n      }\n\n      return {\n        success: true,\n        message: `Connected to ${this.owner}/${this.repo} successfully`,\n      };\n    } catch (error) {\n      if (error instanceof RequestError) {\n        switch (error.status) {\n          case 401:\n            return {\n              success: false,\n              message: 'Authentication failed. Please check your GitHub token.',\n            };\n          case 403:\n            return {\n              success: false,\n              message: 'Access forbidden. Token may not have required permissions.',\n            };\n          case 404:\n            return {\n              success: false,\n              message: `Repository ${this.owner}/${this.repo} not found or not accessible.`,\n            };\n          default:\n            return {\n              success: false,\n              message: `GitHub API error: ${error.message}`,\n            };\n        }\n      }\n      return {\n        success: false,\n        message: `Connection failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n      };\n    }\n  }\n\n  /**\n   * Get all issues from GitHub repository with pagination\n   */\n  async getAllIssues(\n    options: {\n      state?: 'open' | 'closed' | 'all';\n      sort?: 'created' | 'updated' | 'comments';\n      direction?: 'asc' | 'desc';\n      since?: string;\n    } = {}\n  ): Promise<GitHubIssue[]> {\n    const issues: GitHubIssue[] = [];\n    let page = 1;\n    const per_page = Math.min(this.config.batch_size || 100, 100);\n\n    try {\n      while (true) {\n        // Rate limiting delay\n        if (page > 1) {\n          await this.delay(this.config.rate_limit_delay || 100);\n        }\n\n        const response = await this.octokit.rest.issues.listForRepo({\n          owner: this.owner,\n          repo: this.repo,\n          state: options.state || 'all',\n          sort: options.sort || 'updated',\n          direction: options.direction || 'desc',\n          since: options.since,\n          per_page,\n          page,\n        });\n\n        if (response.data.length === 0) {\n          break;\n        }\n\n        // Convert to our GitHubIssue format\n        const convertedIssues = response.data.map(this.convertGitHubIssue);\n        issues.push(...convertedIssues);\n\n        // Check if we have more pages\n        if (response.data.length < per_page) {\n          break;\n        }\n\n        page++;\n      }\n\n      return issues;\n    } catch (error) {\n      throw new Error(\n        `Failed to fetch issues: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Get a specific issue by number\n   */\n  async getIssue(issueNumber: number): Promise<GitHubIssue | null> {\n    try {\n      const response = await this.octokit.rest.issues.get({\n        owner: this.owner,\n        repo: this.repo,\n        issue_number: issueNumber,\n      });\n\n      return this.convertGitHubIssue(response.data);\n    } catch (error) {\n      if (error instanceof RequestError && error.status === 404) {\n        return null;\n      }\n      throw new Error(\n        `Failed to fetch issue #${issueNumber}: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Create a new issue in GitHub\n   */\n  async createIssue(data: {\n    title: string;\n    body: string;\n    assignee?: string;\n    milestone?: number;\n    labels?: string[];\n  }): Promise<GitHubIssue> {\n    try {\n      await this.delay(this.config.rate_limit_delay || 100);\n\n      const response = await this.octokit.rest.issues.create({\n        owner: this.owner,\n        repo: this.repo,\n        title: data.title,\n        body: data.body,\n        assignee: data.assignee,\n        milestone: data.milestone,\n        labels: data.labels,\n      });\n\n      return this.convertGitHubIssue(response.data);\n    } catch (error) {\n      throw new Error(\n        `Failed to create issue: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Update an existing issue in GitHub\n   */\n  async updateIssue(\n    issueNumber: number,\n    data: {\n      title?: string;\n      body?: string;\n      state?: 'open' | 'closed';\n      assignee?: string;\n      milestone?: number;\n      labels?: string[];\n    }\n  ): Promise<GitHubIssue> {\n    try {\n      await this.delay(this.config.rate_limit_delay || 100);\n\n      const response = await this.octokit.rest.issues.update({\n        owner: this.owner,\n        repo: this.repo,\n        issue_number: issueNumber,\n        title: data.title,\n        body: data.body,\n        state: data.state,\n        assignee: data.assignee,\n        milestone: data.milestone,\n        labels: data.labels,\n      });\n\n      return this.convertGitHubIssue(response.data);\n    } catch (error) {\n      throw new Error(\n        `Failed to update issue #${issueNumber}: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Close an issue in GitHub\n   */\n  async closeIssue(issueNumber: number): Promise<GitHubIssue> {\n    return this.updateIssue(issueNumber, { state: 'closed' });\n  }\n\n  /**\n   * Reopen an issue in GitHub\n   */\n  async reopenIssue(issueNumber: number): Promise<GitHubIssue> {\n    return this.updateIssue(issueNumber, { state: 'open' });\n  }\n\n  /**\n   * Get repository labels\n   */\n  async getLabels(): Promise<Array<{ name: string; color: string; description?: string }>> {\n    try {\n      const response = await this.octokit.rest.issues.listLabelsForRepo({\n        owner: this.owner,\n        repo: this.repo,\n      });\n\n      return response.data.map((label) => ({\n        name: label.name,\n        color: label.color,\n        description: label.description || undefined,\n      }));\n    } catch (error) {\n      throw new Error(\n        `Failed to fetch labels: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Get repository milestones\n   */\n  async getMilestones(): Promise<Array<{ title: string; number: number; state: string }>> {\n    try {\n      const response = await this.octokit.rest.issues.listMilestones({\n        owner: this.owner,\n        repo: this.repo,\n      });\n\n      return response.data.map((milestone) => ({\n        title: milestone.title,\n        number: milestone.number,\n        state: milestone.state,\n      }));\n    } catch (error) {\n      throw new Error(\n        `Failed to fetch milestones: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Get repository collaborators\n   */\n  async getCollaborators(): Promise<Array<{ login: string; id: number }>> {\n    try {\n      const response = await this.octokit.rest.repos.listCollaborators({\n        owner: this.owner,\n        repo: this.repo,\n      });\n\n      return response.data.map((collaborator) => ({\n        login: collaborator.login,\n        id: collaborator.id,\n      }));\n    } catch (error) {\n      throw new Error(\n        `Failed to fetch collaborators: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Get rate limit information\n   */\n  async getRateLimit(): Promise<{\n    limit: number;\n    remaining: number;\n    reset: Date;\n    used: number;\n  }> {\n    try {\n      const response = await this.octokit.rest.rateLimit.get();\n      const core = response.data.rate;\n\n      return {\n        limit: core.limit,\n        remaining: core.remaining,\n        reset: new Date(core.reset * 1000),\n        used: core.used,\n      };\n    } catch (error) {\n      throw new Error(\n        `Failed to fetch rate limit: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Convert GitHub API issue to our GitHubIssue format\n   */\n  private convertGitHubIssue(issue: any): GitHubIssue {\n    return {\n      id: issue.id,\n      number: issue.number,\n      title: issue.title,\n      body: issue.body || '',\n      state: issue.state,\n      created_at: issue.created_at,\n      updated_at: issue.updated_at,\n      assignee: issue.assignee\n        ? {\n            login: issue.assignee.login,\n            id: issue.assignee.id,\n          }\n        : undefined,\n      labels: issue.labels.map((label: any) => ({\n        name: label.name,\n        color: label.color,\n      })),\n      milestone: issue.milestone\n        ? {\n            title: issue.milestone.title,\n            number: issue.milestone.number,\n          }\n        : undefined,\n      html_url: issue.html_url,\n    };\n  }\n\n  /**\n   * Helper method to add delay for rate limiting\n   */\n  private delay(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n","/**\n * GitHub Sync Engine\n * Handles bidirectional sync between local issues and GitHub Issues\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type {\n  GitHubIssue,\n  GitHubSyncConfig,\n  IssueData,\n  IssueFrontmatter,\n  ItemStatus,\n  ProjectConfig,\n  SyncOperation,\n  SyncResult,\n  SyncStatus,\n} from '../types/ai-trackdown.js';\nimport type { ConfigManager } from '../utils/config-manager.js';\nimport { FrontmatterParser } from '../utils/frontmatter-parser.js';\nimport { GitHubClient } from '../utils/github-client.js';\n\nexport class GitHubSyncEngine {\n  private client: GitHubClient;\n  private configManager: ConfigManager;\n  private config: ProjectConfig;\n  private syncConfig: GitHubSyncConfig;\n  private frontmatterParser: FrontmatterParser;\n\n  constructor(configManager: ConfigManager) {\n    this.configManager = configManager;\n    this.config = configManager.getConfig();\n    this.frontmatterParser = new FrontmatterParser();\n\n    if (!this.config.github_sync?.enabled) {\n      throw new Error('GitHub sync is not enabled in project configuration');\n    }\n\n    this.syncConfig = this.config.github_sync;\n    this.client = new GitHubClient(this.syncConfig);\n  }\n\n  /**\n   * Test GitHub connection\n   */\n  async testConnection(): Promise<{ success: boolean; message: string }> {\n    return await this.client.testConnection();\n  }\n\n  /**\n   * Get sync status\n   */\n  async getSyncStatus(): Promise<SyncStatus> {\n    try {\n      const rateLimit = await this.client.getRateLimit();\n      const localIssues = await this.getLocalIssues();\n      const syncMetaFile = this.getSyncMetaPath();\n\n      let lastSync = '';\n      let conflicts = 0;\n\n      if (fs.existsSync(syncMetaFile)) {\n        const syncMeta = JSON.parse(fs.readFileSync(syncMetaFile, 'utf8'));\n        lastSync = syncMeta.last_sync || '';\n        conflicts = syncMeta.conflicts || 0;\n      }\n\n      return {\n        enabled: this.syncConfig.enabled,\n        repository: this.syncConfig.repository,\n        last_sync: lastSync,\n        auto_sync: this.syncConfig.auto_sync,\n        pending_operations: localIssues.filter(\n          (issue) => issue.sync_status === 'local' || issue.sync_status === 'conflict'\n        ).length,\n        conflicts,\n        sync_health: rateLimit.remaining > 100 ? 'healthy' : 'degraded',\n      };\n    } catch (_error) {\n      return {\n        enabled: this.syncConfig.enabled,\n        repository: this.syncConfig.repository,\n        last_sync: '',\n        auto_sync: this.syncConfig.auto_sync,\n        pending_operations: 0,\n        conflicts: 0,\n        sync_health: 'failed',\n      };\n    }\n  }\n\n  /**\n   * Push local changes to GitHub\n   */\n  async pushToGitHub(): Promise<SyncResult> {\n    const result: SyncResult = {\n      success: false,\n      operations: [],\n      errors: [],\n      conflicts: [],\n      pushed_count: 0,\n      pulled_count: 0,\n      skipped_count: 0,\n      conflict_count: 0,\n    };\n\n    try {\n      const localIssues = await this.getLocalIssues();\n      const githubIssues = await this.client.getAllIssues();\n\n      // Create ID mappings\n      const githubIssuesMap = new Map(githubIssues.map((issue) => [issue.number, issue]));\n\n      for (const localIssue of localIssues) {\n        const operation = await this.processPushOperation(localIssue, githubIssuesMap);\n        result.operations.push(operation);\n\n        if (operation.type === 'push') {\n          result.pushed_count++;\n        } else if (operation.type === 'conflict') {\n          result.conflicts.push(operation);\n          result.conflict_count++;\n        } else {\n          result.skipped_count++;\n        }\n      }\n\n      // Update sync metadata\n      await this.updateSyncMetadata(result);\n\n      result.success = result.errors.length === 0;\n      return result;\n    } catch (error) {\n      result.errors.push(error instanceof Error ? error.message : 'Unknown error during push');\n      return result;\n    }\n  }\n\n  /**\n   * Pull changes from GitHub\n   */\n  async pullFromGitHub(): Promise<SyncResult> {\n    const result: SyncResult = {\n      success: false,\n      operations: [],\n      errors: [],\n      conflicts: [],\n      pushed_count: 0,\n      pulled_count: 0,\n      skipped_count: 0,\n      conflict_count: 0,\n    };\n\n    try {\n      const githubIssues = await this.client.getAllIssues();\n      const localIssues = await this.getLocalIssues();\n\n      // Create ID mappings\n      const localIssuesMap = new Map(\n        localIssues\n          .filter((issue) => issue.github_number)\n          .map((issue) => [issue.github_number!, issue])\n      );\n\n      for (const githubIssue of githubIssues) {\n        const operation = await this.processPullOperation(githubIssue, localIssuesMap);\n        result.operations.push(operation);\n\n        if (operation.type === 'pull') {\n          result.pulled_count++;\n        } else if (operation.type === 'conflict') {\n          result.conflicts.push(operation);\n          result.conflict_count++;\n        } else {\n          result.skipped_count++;\n        }\n      }\n\n      // Update sync metadata\n      await this.updateSyncMetadata(result);\n\n      result.success = result.errors.length === 0;\n      return result;\n    } catch (error) {\n      result.errors.push(error instanceof Error ? error.message : 'Unknown error during pull');\n      return result;\n    }\n  }\n\n  /**\n   * Bidirectional sync with conflict resolution\n   */\n  async bidirectionalSync(): Promise<SyncResult> {\n    const result: SyncResult = {\n      success: false,\n      operations: [],\n      errors: [],\n      conflicts: [],\n      pushed_count: 0,\n      pulled_count: 0,\n      skipped_count: 0,\n      conflict_count: 0,\n    };\n\n    try {\n      const localIssues = await this.getLocalIssues();\n      const githubIssues = await this.client.getAllIssues();\n\n      // Create ID mappings\n      const githubIssuesMap = new Map(githubIssues.map((issue) => [issue.number, issue]));\n      const localIssuesMap = new Map(\n        localIssues\n          .filter((issue) => issue.github_number)\n          .map((issue) => [issue.github_number!, issue])\n      );\n\n      // Process local issues (push operations)\n      for (const localIssue of localIssues) {\n        const operation = await this.processBidirectionalOperation(\n          localIssue,\n          githubIssuesMap,\n          'push'\n        );\n        result.operations.push(operation);\n        this.updateResultCounters(result, operation);\n      }\n\n      // Process GitHub issues not in local (pull operations)\n      for (const githubIssue of githubIssues) {\n        if (!localIssuesMap.has(githubIssue.number)) {\n          const operation = await this.processBidirectionalOperation(\n            null,\n            githubIssuesMap,\n            'pull',\n            githubIssue\n          );\n          result.operations.push(operation);\n          this.updateResultCounters(result, operation);\n        }\n      }\n\n      // Update sync metadata\n      await this.updateSyncMetadata(result);\n\n      result.success = result.errors.length === 0;\n      return result;\n    } catch (error) {\n      result.errors.push(\n        error instanceof Error ? error.message : 'Unknown error during bidirectional sync'\n      );\n      return result;\n    }\n  }\n\n  /**\n   * Process push operation for a local issue\n   */\n  private async processPushOperation(\n    localIssue: IssueData,\n    githubIssuesMap: Map<number, GitHubIssue>\n  ): Promise<SyncOperation> {\n    const operation: SyncOperation = {\n      type: 'push',\n      local_issue: localIssue,\n      action: 'skip',\n      reason: 'No changes needed',\n    };\n\n    try {\n      if (localIssue.github_number) {\n        // Update existing GitHub issue\n        const githubIssue = githubIssuesMap.get(localIssue.github_number);\n        if (githubIssue) {\n          operation.github_issue = githubIssue;\n\n          // Check for conflicts\n          if (await this.hasConflict(localIssue, githubIssue)) {\n            operation.type = 'conflict';\n            operation.reason = 'Conflict detected - both local and GitHub have changes';\n            return operation;\n          }\n\n          // Update GitHub issue\n          const updatedGitHubIssue = await this.client.updateIssue(localIssue.github_number, {\n            title: localIssue.title,\n            body: this.createGitHubIssueBody(localIssue),\n            state: this.mapStatusToGitHubState(localIssue.status),\n            assignee: this.syncConfig.sync_assignees ? localIssue.assignee : undefined,\n            labels: this.syncConfig.sync_labels ? localIssue.tags : undefined,\n          });\n\n          operation.action = 'update';\n          operation.github_issue = updatedGitHubIssue;\n\n          // Update local issue with GitHub metadata\n          await this.updateLocalIssueWithGitHubMetadata(localIssue, updatedGitHubIssue);\n        }\n      } else {\n        // Create new GitHub issue\n        const newGitHubIssue = await this.client.createIssue({\n          title: localIssue.title,\n          body: this.createGitHubIssueBody(localIssue),\n          assignee: this.syncConfig.sync_assignees ? localIssue.assignee : undefined,\n          labels: this.syncConfig.sync_labels ? localIssue.tags : undefined,\n        });\n\n        operation.action = 'create';\n        operation.github_issue = newGitHubIssue;\n\n        // Update local issue with GitHub metadata\n        await this.updateLocalIssueWithGitHubMetadata(localIssue, newGitHubIssue);\n      }\n    } catch (error) {\n      operation.reason = `Error: ${error instanceof Error ? error.message : 'Unknown error'}`;\n    }\n\n    return operation;\n  }\n\n  /**\n   * Process pull operation for a GitHub issue\n   */\n  private async processPullOperation(\n    githubIssue: GitHubIssue,\n    localIssuesMap: Map<number, IssueData>\n  ): Promise<SyncOperation> {\n    const operation: SyncOperation = {\n      type: 'pull',\n      local_issue: {} as IssueData,\n      github_issue: githubIssue,\n      action: 'skip',\n      reason: 'No changes needed',\n    };\n\n    try {\n      const localIssue = localIssuesMap.get(githubIssue.number);\n\n      if (localIssue) {\n        // Update existing local issue\n        operation.local_issue = localIssue;\n\n        // Check for conflicts\n        if (await this.hasConflict(localIssue, githubIssue)) {\n          operation.type = 'conflict';\n          operation.reason = 'Conflict detected - both local and GitHub have changes';\n          return operation;\n        }\n\n        // Update local issue\n        await this.updateLocalIssueFromGitHub(localIssue, githubIssue);\n        operation.action = 'update';\n      } else {\n        // Create new local issue\n        const newLocalIssue = await this.createLocalIssueFromGitHub(githubIssue);\n        operation.local_issue = newLocalIssue;\n        operation.action = 'create';\n      }\n    } catch (error) {\n      operation.reason = `Error: ${error instanceof Error ? error.message : 'Unknown error'}`;\n    }\n\n    return operation;\n  }\n\n  /**\n   * Process bidirectional operation\n   */\n  private async processBidirectionalOperation(\n    localIssue: IssueData | null,\n    githubIssuesMap: Map<number, GitHubIssue>,\n    direction: 'push' | 'pull',\n    githubIssue?: GitHubIssue\n  ): Promise<SyncOperation> {\n    if (direction === 'push' && localIssue) {\n      return this.processPushOperation(localIssue, githubIssuesMap);\n    } else if (direction === 'pull' && githubIssue) {\n      const localIssuesMap = new Map<number, IssueData>();\n      return this.processPullOperation(githubIssue, localIssuesMap);\n    }\n\n    return {\n      type: direction,\n      local_issue: localIssue || ({} as IssueData),\n      github_issue: githubIssue,\n      action: 'skip',\n      reason: 'Invalid operation parameters',\n    };\n  }\n\n  /**\n   * Check if there's a conflict between local and GitHub issues\n   */\n  private async hasConflict(localIssue: IssueData, githubIssue: GitHubIssue): Promise<boolean> {\n    if (\n      this.syncConfig.conflict_resolution === 'local_wins' ||\n      this.syncConfig.conflict_resolution === 'remote_wins'\n    ) {\n      return false;\n    }\n\n    // Check if both have been updated since last sync\n    const localUpdated = new Date(localIssue.updated_date);\n    const githubUpdated = new Date(githubIssue.updated_at);\n    const lastSync = await this.getLastSyncTime();\n\n    return localUpdated > lastSync && githubUpdated > lastSync;\n  }\n\n  /**\n   * Get local issues from the file system\n   */\n  private async getLocalIssues(): Promise<IssueData[]> {\n    const paths = this.configManager.getAbsolutePaths();\n    const issuesDir = paths.issuesDir;\n\n    if (!fs.existsSync(issuesDir)) {\n      return [];\n    }\n\n    const issues: IssueData[] = [];\n    const files = fs.readdirSync(issuesDir).filter((file) => file.endsWith('.md'));\n\n    for (const file of files) {\n      try {\n        const filePath = path.join(issuesDir, file);\n        const content = fs.readFileSync(filePath, 'utf8');\n        const parsed = this.frontmatterParser.parse(content);\n\n        const issueData: IssueData = {\n          ...(parsed.frontmatter as IssueFrontmatter),\n          content: parsed.content,\n          file_path: filePath,\n        };\n\n        issues.push(issueData);\n      } catch (error) {\n        console.warn(\n          `Failed to parse issue file ${file}: ${error instanceof Error ? error.message : 'Unknown error'}`\n        );\n      }\n    }\n\n    return issues;\n  }\n\n  /**\n   * Create GitHub issue body from local issue\n   */\n  private createGitHubIssueBody(localIssue: IssueData): string {\n    const aiMetadata = {\n      ai_context: localIssue.ai_context,\n      estimated_tokens: localIssue.estimated_tokens,\n      actual_tokens: localIssue.actual_tokens,\n      epic_id: localIssue.epic_id,\n      issue_id: localIssue.issue_id,\n      local_created_date: localIssue.created_date,\n      local_updated_date: localIssue.updated_date,\n    };\n\n    return `${localIssue.content}\n\n<!-- AI-Trackdown Metadata -->\n\\`\\`\\`json\n${JSON.stringify(aiMetadata, null, 2)}\n\\`\\`\\``;\n  }\n\n  /**\n   * Map local status to GitHub state\n   */\n  private mapStatusToGitHubState(status: ItemStatus): 'open' | 'closed' {\n    switch (status) {\n      case 'completed':\n      case 'archived':\n        return 'closed';\n      default:\n        return 'open';\n    }\n  }\n\n  /**\n   * Map GitHub state to local status\n   */\n  private mapGitHubStateToStatus(state: 'open' | 'closed'): ItemStatus {\n    return state === 'closed' ? 'completed' : 'active';\n  }\n\n  /**\n   * Update local issue with GitHub metadata\n   */\n  private async updateLocalIssueWithGitHubMetadata(\n    localIssue: IssueData,\n    githubIssue: GitHubIssue\n  ): Promise<void> {\n    const updatedFrontmatter: IssueFrontmatter = {\n      ...localIssue,\n      github_id: githubIssue.id,\n      github_number: githubIssue.number,\n      github_url: githubIssue.html_url,\n      github_updated_at: githubIssue.updated_at,\n      sync_status: 'synced',\n      updated_date: new Date().toISOString(),\n    };\n\n    if (this.syncConfig.sync_labels && githubIssue.labels.length > 0) {\n      updatedFrontmatter.github_labels = githubIssue.labels.map((label) => label.name);\n    }\n\n    if (this.syncConfig.sync_assignees && githubIssue.assignee) {\n      updatedFrontmatter.github_assignee = githubIssue.assignee.login;\n    }\n\n    if (this.syncConfig.sync_milestones && githubIssue.milestone) {\n      updatedFrontmatter.github_milestone = githubIssue.milestone.title;\n    }\n\n    // Write updated issue back to file\n    const updatedContent = this.frontmatterParser.stringify(updatedFrontmatter, localIssue.content);\n    fs.writeFileSync(localIssue.file_path, updatedContent, 'utf8');\n  }\n\n  /**\n   * Update local issue from GitHub\n   */\n  private async updateLocalIssueFromGitHub(\n    localIssue: IssueData,\n    githubIssue: GitHubIssue\n  ): Promise<void> {\n    const updatedFrontmatter: IssueFrontmatter = {\n      ...localIssue,\n      title: githubIssue.title,\n      status: this.mapGitHubStateToStatus(githubIssue.state),\n      github_id: githubIssue.id,\n      github_number: githubIssue.number,\n      github_url: githubIssue.html_url,\n      github_updated_at: githubIssue.updated_at,\n      sync_status: 'synced',\n      updated_date: new Date().toISOString(),\n    };\n\n    if (this.syncConfig.sync_labels && githubIssue.labels.length > 0) {\n      updatedFrontmatter.tags = githubIssue.labels.map((label) => label.name);\n      updatedFrontmatter.github_labels = githubIssue.labels.map((label) => label.name);\n    }\n\n    if (this.syncConfig.sync_assignees && githubIssue.assignee) {\n      updatedFrontmatter.assignee = githubIssue.assignee.login;\n      updatedFrontmatter.github_assignee = githubIssue.assignee.login;\n    }\n\n    if (this.syncConfig.sync_milestones && githubIssue.milestone) {\n      updatedFrontmatter.milestone = githubIssue.milestone.title;\n      updatedFrontmatter.github_milestone = githubIssue.milestone.title;\n    }\n\n    // Extract original content from GitHub body (remove AI metadata)\n    const content = this.extractContentFromGitHubBody(githubIssue.body);\n\n    // Write updated issue back to file\n    const updatedContent = this.frontmatterParser.stringify(updatedFrontmatter, content);\n    fs.writeFileSync(localIssue.file_path, updatedContent, 'utf8');\n  }\n\n  /**\n   * Create local issue from GitHub\n   */\n  private async createLocalIssueFromGitHub(githubIssue: GitHubIssue): Promise<IssueData> {\n    const paths = this.configManager.getAbsolutePaths();\n    const issuesDir = paths.issuesDir;\n\n    // Generate new issue ID\n    const issueId = `${this.config.naming_conventions.issue_prefix}-${String(githubIssue.number).padStart(4, '0')}`;\n    const filename = `${issueId}.md`;\n    const filePath = path.join(issuesDir, filename);\n\n    const newIssue: IssueFrontmatter = {\n      issue_id: issueId,\n      epic_id: '', // Will need to be assigned manually\n      title: githubIssue.title,\n      description: githubIssue.body,\n      status: this.mapGitHubStateToStatus(githubIssue.state),\n      priority: 'medium',\n      assignee: githubIssue.assignee?.login || this.config.default_assignee || 'unassigned',\n      created_date: githubIssue.created_at,\n      updated_date: new Date().toISOString(),\n      estimated_tokens: 0,\n      actual_tokens: 0,\n      ai_context: [],\n      sync_status: 'synced',\n      related_tasks: [],\n      github_id: githubIssue.id,\n      github_number: githubIssue.number,\n      github_url: githubIssue.html_url,\n      github_updated_at: githubIssue.updated_at,\n      tags: this.syncConfig.sync_labels ? githubIssue.labels.map((label) => label.name) : [],\n      github_labels: githubIssue.labels.map((label) => label.name),\n      github_assignee: githubIssue.assignee?.login,\n      github_milestone: githubIssue.milestone?.title,\n      milestone: this.syncConfig.sync_milestones ? githubIssue.milestone?.title : undefined,\n    };\n\n    // Extract content from GitHub body\n    const content = this.extractContentFromGitHubBody(githubIssue.body);\n\n    // Create the issue file\n    const issueContent = this.frontmatterParser.stringify(newIssue, content);\n    fs.writeFileSync(filePath, issueContent, 'utf8');\n\n    return {\n      ...newIssue,\n      content,\n      file_path: filePath,\n    };\n  }\n\n  /**\n   * Extract content from GitHub issue body, removing AI metadata\n   */\n  private extractContentFromGitHubBody(body: string): string {\n    // Remove AI metadata section\n    const metadataRegex = /<!-- AI-Trackdown Metadata -->\\s*```json[\\s\\S]*?```/;\n    return body.replace(metadataRegex, '').trim();\n  }\n\n  /**\n   * Get last sync time\n   */\n  private async getLastSyncTime(): Promise<Date> {\n    const syncMetaFile = this.getSyncMetaPath();\n    if (fs.existsSync(syncMetaFile)) {\n      const syncMeta = JSON.parse(fs.readFileSync(syncMetaFile, 'utf8'));\n      return new Date(syncMeta.last_sync || 0);\n    }\n    return new Date(0);\n  }\n\n  /**\n   * Update sync metadata\n   */\n  private async updateSyncMetadata(result: SyncResult): Promise<void> {\n    const syncMetaFile = this.getSyncMetaPath();\n    const syncMeta = {\n      last_sync: new Date().toISOString(),\n      last_result: result,\n      conflicts: result.conflict_count,\n    };\n\n    fs.writeFileSync(syncMetaFile, JSON.stringify(syncMeta, null, 2), 'utf8');\n  }\n\n  /**\n   * Get sync metadata file path\n   */\n  private getSyncMetaPath(): string {\n    const paths = this.configManager.getAbsolutePaths();\n    return path.join(paths.configDir, 'sync-metadata.json');\n  }\n\n  /**\n   * Update result counters\n   */\n  private updateResultCounters(result: SyncResult, operation: SyncOperation): void {\n    if (operation.type === 'push') {\n      result.pushed_count++;\n    } else if (operation.type === 'pull') {\n      result.pulled_count++;\n    } else if (operation.type === 'conflict') {\n      result.conflicts.push(operation);\n      result.conflict_count++;\n    } else {\n      result.skipped_count++;\n    }\n  }\n}\n","/**\n * GitHub Sync Bidirectional Command\n * Perform full bidirectional sync between local and GitHub\n */\n\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { GitHubSyncEngine } from '../../integrations/github-sync.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\n\nexport function createSyncBidirectionalCommand(): Command {\n  const command = new Command('bidirectional');\n\n  command\n    .description('Perform full bidirectional sync between local and GitHub')\n    .option('--dry-run', 'Show what would be synced without making changes')\n    .option('--force', 'Force sync even with conflicts')\n    .option('--verbose', 'Show detailed progress information')\n    .option('--conflict-resolution <strategy>', 'Override conflict resolution strategy', 'config')\n    .action(async (options) => {\n      try {\n        const configManager = new ConfigManager();\n        const config = configManager.getConfig();\n\n        // Check if GitHub sync is configured\n        if (!config.github_sync?.enabled) {\n          console.log(\n            Formatter.error('GitHub sync is not configured. Run \"aitrackdown sync setup\" first.')\n          );\n          process.exit(1);\n        }\n\n        console.log(Formatter.header('🔄 Bidirectional GitHub Sync'));\n        console.log(Formatter.info(`Repository: ${config.github_sync.repository}`));\n        console.log(\n          Formatter.info(\n            `Conflict resolution: ${options.conflictResolution === 'config' ? config.github_sync.conflict_resolution : options.conflictResolution}`\n          )\n        );\n        console.log('');\n\n        const syncEngine = new GitHubSyncEngine(configManager);\n\n        // Test connection first\n        const spinner = ora('Testing GitHub connection...').start();\n        const testResult = await syncEngine.testConnection();\n\n        if (!testResult.success) {\n          spinner.fail('GitHub connection failed');\n          console.log(Formatter.error(testResult.message));\n          process.exit(1);\n        }\n\n        spinner.succeed('GitHub connection verified');\n\n        // Perform bidirectional sync\n        const syncSpinner = ora('Performing bidirectional sync...').start();\n\n        try {\n          const result = await syncEngine.bidirectionalSync();\n\n          if (options.dryRun) {\n            syncSpinner.succeed('Dry run completed');\n            console.log(Formatter.info('Operations that would be performed:'));\n          } else {\n            syncSpinner.succeed('Bidirectional sync completed');\n          }\n\n          console.log('');\n          console.log(Formatter.info('Sync Summary:'));\n          console.log(`  Pushed: ${result.pushed_count} issues`);\n          console.log(`  Pulled: ${result.pulled_count} issues`);\n          console.log(`  Skipped: ${result.skipped_count} issues`);\n          console.log(`  Conflicts: ${result.conflict_count} issues`);\n          console.log(`  Errors: ${result.errors.length}`);\n\n          // Show success/warning based on results\n          if (result.success && result.conflict_count === 0) {\n            console.log('');\n            console.log(Formatter.success('✅ Bidirectional sync completed successfully!'));\n          } else if (result.success && result.conflict_count > 0) {\n            console.log('');\n            console.log(Formatter.warning('⚠️ Sync completed with conflicts'));\n          } else {\n            console.log('');\n            console.log(Formatter.error('❌ Sync completed with errors'));\n          }\n\n          // Show errors if any\n          if (result.errors.length > 0) {\n            console.log('');\n            console.log(Formatter.error('Errors encountered:'));\n            result.errors.forEach((error) => {\n              console.log(`  • ${error}`);\n            });\n          }\n\n          // Show conflicts if any\n          if (result.conflicts.length > 0) {\n            console.log('');\n            console.log(Formatter.warning('Conflicts detected:'));\n            result.conflicts.forEach((conflict) => {\n              console.log(`  • ${conflict.local_issue.title} (${conflict.local_issue.issue_id})`);\n              console.log(`    Type: ${conflict.type}`);\n              console.log(`    Reason: ${conflict.reason}`);\n              if (conflict.github_issue) {\n                console.log(\n                  `    GitHub: #${conflict.github_issue.number} - ${conflict.github_issue.html_url}`\n                );\n              }\n            });\n\n            if (!options.force) {\n              console.log('');\n              console.log(Formatter.info('Conflict resolution options:'));\n              console.log(\n                '  • Use \"aitrackdown sync bidirectional --force\" to apply configured resolution strategy'\n              );\n              console.log('  • Use \"aitrackdown sync push --force\" to force push local changes');\n              console.log('  • Use \"aitrackdown sync pull --force\" to force pull remote changes');\n              console.log('  • Manually resolve conflicts and sync again');\n            }\n          }\n\n          // Show detailed operations if verbose\n          if (options.verbose) {\n            console.log('');\n            console.log(Formatter.info('Detailed Operations:'));\n            result.operations.forEach((op, index) => {\n              const title = op.local_issue.title || op.github_issue?.title || 'Unknown';\n              const issueId = op.local_issue.issue_id || `#${op.github_issue?.number}`;\n\n              console.log(`  ${index + 1}. ${title} (${issueId})`);\n              console.log(`     Type: ${op.type}`);\n              console.log(`     Action: ${op.action}`);\n              if (op.reason) {\n                console.log(`     Reason: ${op.reason}`);\n              }\n              if (op.github_issue) {\n                console.log(\n                  `     GitHub: #${op.github_issue.number} - ${op.github_issue.html_url}`\n                );\n              }\n              if (op.local_issue.file_path) {\n                console.log(`     Local: ${op.local_issue.file_path}`);\n              }\n              console.log('');\n            });\n          }\n\n          // Show recommendations\n          if (result.success) {\n            console.log('');\n            console.log(Formatter.info('Next steps:'));\n\n            if (result.pulled_count > 0) {\n              console.log('  • Review pulled issues and assign to appropriate epics');\n              console.log('  • Update AI context and token estimates for new issues');\n            }\n\n            if (result.pushed_count > 0) {\n              console.log('  • Verify pushed issues appear correctly in GitHub');\n              console.log('  • Check that labels, milestones, and assignees synced properly');\n            }\n\n            if (result.conflict_count > 0) {\n              console.log('  • Review and resolve conflicts manually');\n              console.log('  • Consider adjusting conflict resolution strategy');\n            }\n\n            if (config.github_sync.auto_sync) {\n              console.log('  • Auto-sync is enabled - future changes will sync automatically');\n            } else {\n              console.log('  • Consider enabling auto-sync with \"aitrackdown sync auto --enable\"');\n            }\n          }\n        } catch (error) {\n          syncSpinner.fail('Bidirectional sync failed');\n          throw error;\n        }\n      } catch (error) {\n        console.error(Formatter.error('Bidirectional sync failed:'));\n        console.error(Formatter.error(error instanceof Error ? error.message : 'Unknown error'));\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","/**\n * GitHub Sync Pull Command\n * Pull changes from GitHub to local\n */\n\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { GitHubSyncEngine } from '../../integrations/github-sync.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\n\nexport function createSyncPullCommand(): Command {\n  const command = new Command('pull');\n\n  command\n    .description('Pull changes from GitHub to local')\n    .option('--dry-run', 'Show what would be pulled without making changes')\n    .option('--force', 'Force pull even with conflicts')\n    .option('--verbose', 'Show detailed progress information')\n    .action(async (options) => {\n      try {\n        const configManager = new ConfigManager();\n        const config = configManager.getConfig();\n\n        // Check if GitHub sync is configured\n        if (!config.github_sync?.enabled) {\n          console.log(\n            Formatter.error('GitHub sync is not configured. Run \"aitrackdown sync setup\" first.')\n          );\n          process.exit(1);\n        }\n\n        console.log(Formatter.header('📥 Pulling Changes from GitHub'));\n        console.log(Formatter.info(`Repository: ${config.github_sync.repository}`));\n        console.log('');\n\n        const syncEngine = new GitHubSyncEngine(configManager);\n\n        // Test connection first\n        const spinner = ora('Testing GitHub connection...').start();\n        const testResult = await syncEngine.testConnection();\n\n        if (!testResult.success) {\n          spinner.fail('GitHub connection failed');\n          console.log(Formatter.error(testResult.message));\n          process.exit(1);\n        }\n\n        spinner.succeed('GitHub connection verified');\n\n        // Perform pull operation\n        const pullSpinner = ora('Pulling changes from GitHub...').start();\n\n        try {\n          const result = await syncEngine.pullFromGitHub();\n\n          if (options.dryRun) {\n            pullSpinner.succeed('Dry run completed');\n            console.log(Formatter.info('Operations that would be performed:'));\n          } else {\n            pullSpinner.succeed('Pull completed');\n          }\n\n          console.log('');\n          console.log(Formatter.info('Pull Summary:'));\n          console.log(`  Pulled: ${result.pulled_count} issues`);\n          console.log(`  Skipped: ${result.skipped_count} issues`);\n          console.log(`  Conflicts: ${result.conflict_count} issues`);\n          console.log(`  Errors: ${result.errors.length}`);\n\n          if (result.errors.length > 0) {\n            console.log('');\n            console.log(Formatter.error('Errors encountered:'));\n            result.errors.forEach((error) => {\n              console.log(`  • ${error}`);\n            });\n          }\n\n          if (result.conflicts.length > 0) {\n            console.log('');\n            console.log(Formatter.warning('Conflicts detected:'));\n            result.conflicts.forEach((conflict) => {\n              console.log(`  • ${conflict.local_issue.title} (${conflict.local_issue.issue_id})`);\n              console.log(`    Reason: ${conflict.reason}`);\n              if (conflict.github_issue) {\n                console.log(\n                  `    GitHub: #${conflict.github_issue.number} - ${conflict.github_issue.html_url}`\n                );\n              }\n            });\n\n            if (!options.force) {\n              console.log('');\n              console.log(Formatter.info('To resolve conflicts:'));\n              console.log('  • Use \"aitrackdown sync status\" to see detailed conflict information');\n              console.log('  • Use \"aitrackdown sync pull --force\" to force pull remote changes');\n              console.log('  • Use \"aitrackdown sync push\" to push local changes');\n            }\n          }\n\n          if (options.verbose) {\n            console.log('');\n            console.log(Formatter.info('Detailed Operations:'));\n            result.operations.forEach((op, index) => {\n              console.log(\n                `  ${index + 1}. ${op.github_issue?.title || 'Unknown'} (#${op.github_issue?.number})`\n              );\n              console.log(`     Type: ${op.type}`);\n              console.log(`     Action: ${op.action}`);\n              if (op.reason) {\n                console.log(`     Reason: ${op.reason}`);\n              }\n              if (op.github_issue) {\n                console.log(`     GitHub: ${op.github_issue.html_url}`);\n              }\n              if (op.local_issue.issue_id) {\n                console.log(`     Local: ${op.local_issue.issue_id}`);\n              }\n            });\n          }\n\n          if (result.success) {\n            console.log('');\n            console.log(Formatter.success('Pull operation completed successfully!'));\n\n            if (result.pulled_count > 0) {\n              console.log('');\n              console.log(Formatter.info('Next steps:'));\n              console.log('  • Review the pulled issues in your local files');\n              console.log('  • Assign issues to appropriate epics if needed');\n              console.log('  • Update AI context and token estimates as needed');\n            }\n          } else {\n            console.log('');\n            console.log(\n              Formatter.warning('Pull operation completed with issues. Review the errors above.')\n            );\n          }\n        } catch (error) {\n          pullSpinner.fail('Pull failed');\n          throw error;\n        }\n      } catch (error) {\n        console.error(Formatter.error('Pull failed:'));\n        console.error(Formatter.error(error instanceof Error ? error.message : 'Unknown error'));\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","/**\n * GitHub Sync Push Command\n * Push local changes to GitHub\n */\n\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { GitHubSyncEngine } from '../../integrations/github-sync.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\n\nexport function createSyncPushCommand(): Command {\n  const command = new Command('push');\n\n  command\n    .description('Push local changes to GitHub')\n    .option('--dry-run', 'Show what would be pushed without making changes')\n    .option('--force', 'Force push even with conflicts')\n    .option('--verbose', 'Show detailed progress information')\n    .action(async (options) => {\n      try {\n        const configManager = new ConfigManager();\n        const config = configManager.getConfig();\n\n        // Check if GitHub sync is configured\n        if (!config.github_sync?.enabled) {\n          console.log(\n            Formatter.error('GitHub sync is not configured. Run \"aitrackdown sync setup\" first.')\n          );\n          process.exit(1);\n        }\n\n        console.log(Formatter.header('📤 Pushing Local Changes to GitHub'));\n        console.log(Formatter.info(`Repository: ${config.github_sync.repository}`));\n        console.log('');\n\n        const syncEngine = new GitHubSyncEngine(configManager);\n\n        // Test connection first\n        const spinner = ora('Testing GitHub connection...').start();\n        const testResult = await syncEngine.testConnection();\n\n        if (!testResult.success) {\n          spinner.fail('GitHub connection failed');\n          console.log(Formatter.error(testResult.message));\n          process.exit(1);\n        }\n\n        spinner.succeed('GitHub connection verified');\n\n        // Perform push operation\n        const pushSpinner = ora('Pushing local changes to GitHub...').start();\n\n        try {\n          const result = await syncEngine.pushToGitHub();\n\n          if (options.dryRun) {\n            pushSpinner.succeed('Dry run completed');\n            console.log(Formatter.info('Operations that would be performed:'));\n          } else {\n            pushSpinner.succeed('Push completed');\n          }\n\n          console.log('');\n          console.log(Formatter.info('Push Summary:'));\n          console.log(`  Pushed: ${result.pushed_count} issues`);\n          console.log(`  Skipped: ${result.skipped_count} issues`);\n          console.log(`  Conflicts: ${result.conflict_count} issues`);\n          console.log(`  Errors: ${result.errors.length}`);\n\n          if (result.errors.length > 0) {\n            console.log('');\n            console.log(Formatter.error('Errors encountered:'));\n            result.errors.forEach((error) => {\n              console.log(`  • ${error}`);\n            });\n          }\n\n          if (result.conflicts.length > 0) {\n            console.log('');\n            console.log(Formatter.warning('Conflicts detected:'));\n            result.conflicts.forEach((conflict) => {\n              console.log(`  • ${conflict.local_issue.title} (${conflict.local_issue.issue_id})`);\n              console.log(`    Reason: ${conflict.reason}`);\n            });\n\n            if (!options.force) {\n              console.log('');\n              console.log(Formatter.info('To resolve conflicts:'));\n              console.log('  • Use \"aitrackdown sync status\" to see detailed conflict information');\n              console.log('  • Use \"aitrackdown sync push --force\" to force push local changes');\n              console.log('  • Use \"aitrackdown sync pull\" to pull remote changes');\n            }\n          }\n\n          if (options.verbose) {\n            console.log('');\n            console.log(Formatter.info('Detailed Operations:'));\n            result.operations.forEach((op, index) => {\n              console.log(`  ${index + 1}. ${op.local_issue.title} (${op.local_issue.issue_id})`);\n              console.log(`     Type: ${op.type}`);\n              console.log(`     Action: ${op.action}`);\n              if (op.reason) {\n                console.log(`     Reason: ${op.reason}`);\n              }\n              if (op.github_issue) {\n                console.log(\n                  `     GitHub: #${op.github_issue.number} - ${op.github_issue.html_url}`\n                );\n              }\n            });\n          }\n\n          if (result.success) {\n            console.log('');\n            console.log(Formatter.success('Push operation completed successfully!'));\n          } else {\n            console.log('');\n            console.log(\n              Formatter.warning('Push operation completed with issues. Review the errors above.')\n            );\n          }\n        } catch (error) {\n          pushSpinner.fail('Push failed');\n          throw error;\n        }\n      } catch (error) {\n        console.error(Formatter.error('Push failed:'));\n        console.error(Formatter.error(error instanceof Error ? error.message : 'Unknown error'));\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","/**\n * GitHub Sync Setup Command\n * Configure GitHub sync for the project\n */\n\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport type { GitHubSyncConfig } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { GitHubClient } from '../../utils/github-client.js';\n\nexport function createSyncSetupCommand(): Command {\n  const command = new Command('setup');\n\n  command\n    .description('Configure GitHub sync for the project')\n    .option('--repository <repo>', 'GitHub repository (owner/repo format)')\n    .option('--token <token>', 'GitHub personal access token')\n    .option('--auto-sync', 'Enable automatic sync')\n    .option('--no-auto-sync', 'Disable automatic sync')\n    .option(\n      '--conflict-resolution <strategy>',\n      'Conflict resolution strategy (most_recent|local_wins|remote_wins)',\n      'most_recent'\n    )\n    .option('--sync-labels', 'Enable label synchronization')\n    .option('--no-sync-labels', 'Disable label synchronization')\n    .option('--sync-milestones', 'Enable milestone synchronization')\n    .option('--no-sync-milestones', 'Disable milestone synchronization')\n    .option('--sync-assignees', 'Enable assignee synchronization')\n    .option('--no-sync-assignees', 'Disable assignee synchronization')\n    .option('--batch-size <size>', 'Batch size for sync operations', '50')\n    .option('--rate-limit-delay <ms>', 'Delay between API calls in milliseconds', '100')\n    .option('--dry-run', 'Show what would be configured without making changes')\n    .option('--force', 'Force setup even if already configured')\n    .action(async (options) => {\n      try {\n        const configManager = new ConfigManager();\n        const config = configManager.getConfig();\n\n        // Check if already configured\n        if (config.github_sync?.enabled && !options.force) {\n          console.log(\n            Formatter.warning('GitHub sync is already configured. Use --force to reconfigure.')\n          );\n          console.log(Formatter.info(`Current repository: ${config.github_sync.repository}`));\n          console.log(\n            Formatter.info(`Auto sync: ${config.github_sync.auto_sync ? 'enabled' : 'disabled'}`)\n          );\n          console.log(\n            Formatter.info(`Conflict resolution: ${config.github_sync.conflict_resolution}`)\n          );\n          return;\n        }\n\n        console.log(Formatter.header('🔧 GitHub Sync Setup'));\n        console.log(\n          Formatter.info('Configure bidirectional sync between local issues and GitHub Issues')\n        );\n        console.log('');\n\n        let syncConfig: GitHubSyncConfig;\n\n        if (options.repository && options.token) {\n          // Non-interactive setup\n          syncConfig = {\n            enabled: true,\n            repository: options.repository,\n            token: options.token,\n            auto_sync: options.autoSync ?? false,\n            conflict_resolution: options.conflictResolution || 'most_recent',\n            sync_labels: options.syncLabels ?? true,\n            sync_milestones: options.syncMilestones ?? true,\n            sync_assignees: options.syncAssignees ?? true,\n            batch_size: parseInt(options.batchSize) || 50,\n            rate_limit_delay: parseInt(options.rateLimitDelay) || 100,\n          };\n        } else {\n          // Interactive setup\n          const answers = await inquirer.prompt([\n            {\n              type: 'input',\n              name: 'repository',\n              message: 'GitHub repository (owner/repo format):',\n              validate: (input: string) => {\n                if (!input.includes('/')) {\n                  return 'Repository must be in owner/repo format';\n                }\n                return true;\n              },\n              default: options.repository,\n            },\n            {\n              type: 'password',\n              name: 'token',\n              message: 'GitHub personal access token:',\n              validate: (input: string) => {\n                if (input.length < 10) {\n                  return 'Token appears to be too short';\n                }\n                return true;\n              },\n              default: options.token,\n            },\n            {\n              type: 'confirm',\n              name: 'auto_sync',\n              message: 'Enable automatic sync?',\n              default: options.autoSync ?? false,\n            },\n            {\n              type: 'list',\n              name: 'conflict_resolution',\n              message: 'Conflict resolution strategy:',\n              choices: [\n                { name: 'Most recent wins (recommended)', value: 'most_recent' },\n                { name: 'Local always wins', value: 'local_wins' },\n                { name: 'Remote always wins', value: 'remote_wins' },\n              ],\n              default: options.conflictResolution || 'most_recent',\n            },\n            {\n              type: 'confirm',\n              name: 'sync_labels',\n              message: 'Sync labels between local tags and GitHub labels?',\n              default: options.syncLabels ?? true,\n            },\n            {\n              type: 'confirm',\n              name: 'sync_milestones',\n              message: 'Sync milestones between local and GitHub?',\n              default: options.syncMilestones ?? true,\n            },\n            {\n              type: 'confirm',\n              name: 'sync_assignees',\n              message: 'Sync assignees between local and GitHub?',\n              default: options.syncAssignees ?? true,\n            },\n            {\n              type: 'number',\n              name: 'batch_size',\n              message: 'Batch size for sync operations:',\n              default: parseInt(options.batchSize) || 50,\n              validate: (input: number) => input > 0 && input <= 100,\n            },\n            {\n              type: 'number',\n              name: 'rate_limit_delay',\n              message: 'Rate limit delay (ms) between API calls:',\n              default: parseInt(options.rateLimitDelay) || 100,\n              validate: (input: number) => input >= 0,\n            },\n          ]);\n\n          syncConfig = {\n            enabled: true,\n            ...answers,\n          };\n        }\n\n        if (options.dryRun) {\n          console.log(Formatter.info('Dry run - configuration that would be applied:'));\n          console.log(JSON.stringify(syncConfig, null, 2));\n          return;\n        }\n\n        // Test connection before saving\n        console.log(Formatter.info('Testing GitHub connection...'));\n        const testClient = new GitHubClient(syncConfig);\n        const testResult = await testClient.testConnection();\n\n        if (!testResult.success) {\n          console.log(Formatter.error('GitHub connection test failed:'));\n          console.log(Formatter.error(testResult.message));\n          return;\n        }\n\n        console.log(Formatter.success('GitHub connection test passed!'));\n\n        // Save configuration\n        const updatedConfig = {\n          ...config,\n          github_sync: syncConfig,\n        };\n\n        configManager.saveConfig(updatedConfig);\n\n        console.log(Formatter.success('GitHub sync configuration saved successfully!'));\n        console.log('');\n        console.log(Formatter.info('Configuration summary:'));\n        console.log(`  Repository: ${syncConfig.repository}`);\n        console.log(`  Auto sync: ${syncConfig.auto_sync ? 'enabled' : 'disabled'}`);\n        console.log(`  Conflict resolution: ${syncConfig.conflict_resolution}`);\n        console.log(`  Sync labels: ${syncConfig.sync_labels ? 'enabled' : 'disabled'}`);\n        console.log(`  Sync milestones: ${syncConfig.sync_milestones ? 'enabled' : 'disabled'}`);\n        console.log(`  Sync assignees: ${syncConfig.sync_assignees ? 'enabled' : 'disabled'}`);\n        console.log(`  Batch size: ${syncConfig.batch_size}`);\n        console.log(`  Rate limit delay: ${syncConfig.rate_limit_delay}ms`);\n        console.log('');\n        console.log(Formatter.info('Next steps:'));\n        console.log('  • Run \"aitrackdown sync status\" to check sync status');\n        console.log('  • Run \"aitrackdown sync pull\" to pull existing GitHub issues');\n        console.log('  • Run \"aitrackdown sync push\" to push local issues to GitHub');\n        console.log('  • Run \"aitrackdown sync auto\" to enable automatic sync');\n      } catch (error) {\n        console.error(Formatter.error('Setup failed:'));\n        console.error(Formatter.error(error instanceof Error ? error.message : 'Unknown error'));\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","/**\n * GitHub Sync Status Command\n * Show sync status and conflicts\n */\n\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { GitHubSyncEngine } from '../../integrations/github-sync.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\n\nexport function createSyncStatusCommand(): Command {\n  const command = new Command('status');\n\n  command\n    .description('Show sync status and conflicts')\n    .option('--verbose', 'Show detailed status information')\n    .option('--conflicts-only', 'Show only conflicts')\n    .action(async (options) => {\n      try {\n        const configManager = new ConfigManager();\n        const config = configManager.getConfig();\n\n        // Check if GitHub sync is configured\n        if (!config.github_sync?.enabled) {\n          console.log(\n            Formatter.error('GitHub sync is not configured. Run \"aitrackdown sync setup\" first.')\n          );\n          process.exit(1);\n        }\n\n        console.log(Formatter.header('🔄 GitHub Sync Status'));\n        console.log(Formatter.info(`Repository: ${config.github_sync.repository}`));\n        console.log('');\n\n        const syncEngine = new GitHubSyncEngine(configManager);\n\n        // Test connection first\n        const spinner = ora('Checking GitHub connection...').start();\n        const testResult = await syncEngine.testConnection();\n\n        if (!testResult.success) {\n          spinner.fail('GitHub connection failed');\n          console.log(Formatter.error(testResult.message));\n          process.exit(1);\n        }\n\n        spinner.succeed('GitHub connection verified');\n\n        // Get sync status\n        const statusSpinner = ora('Fetching sync status...').start();\n\n        try {\n          const status = await syncEngine.getSyncStatus();\n          statusSpinner.succeed('Sync status retrieved');\n\n          // Display general status\n          if (!options.conflictsOnly) {\n            console.log('');\n            console.log(Formatter.info('Sync Configuration:'));\n            console.log(`  Repository: ${status.repository}`);\n            console.log(`  Auto sync: ${status.auto_sync ? 'enabled' : 'disabled'}`);\n            console.log(`  Conflict resolution: ${config.github_sync.conflict_resolution}`);\n            console.log(\n              `  Sync labels: ${config.github_sync.sync_labels ? 'enabled' : 'disabled'}`\n            );\n            console.log(\n              `  Sync milestones: ${config.github_sync.sync_milestones ? 'enabled' : 'disabled'}`\n            );\n            console.log(\n              `  Sync assignees: ${config.github_sync.sync_assignees ? 'enabled' : 'disabled'}`\n            );\n\n            console.log('');\n            console.log(Formatter.info('Sync Status:'));\n            console.log(`  Last sync: ${status.last_sync || 'Never'}`);\n            console.log(`  Pending operations: ${status.pending_operations}`);\n            console.log(`  Conflicts: ${status.conflicts}`);\n            console.log(`  Health: ${status.sync_health}`);\n\n            // Health indicator\n            const healthIcon =\n              status.sync_health === 'healthy'\n                ? '✅'\n                : status.sync_health === 'degraded'\n                  ? '⚠️'\n                  : '❌';\n            console.log(`  Status: ${healthIcon} ${status.sync_health}`);\n          }\n\n          // Show conflicts if any\n          if (status.conflicts > 0) {\n            console.log('');\n            console.log(Formatter.warning(`⚠️ ${status.conflicts} conflicts detected`));\n\n            if (options.verbose) {\n              // Get detailed conflict information\n              const conflictSpinner = ora('Analyzing conflicts...').start();\n\n              try {\n                // Perform a dry run to get conflict details\n                const dryRunResult = await syncEngine.bidirectionalSync();\n                conflictSpinner.succeed('Conflict analysis completed');\n\n                if (dryRunResult.conflicts.length > 0) {\n                  console.log('');\n                  console.log(Formatter.warning('Conflict Details:'));\n                  dryRunResult.conflicts.forEach((conflict, index) => {\n                    console.log(\n                      `  ${index + 1}. ${conflict.local_issue.title} (${conflict.local_issue.issue_id})`\n                    );\n                    console.log(`     Reason: ${conflict.reason}`);\n                    if (conflict.github_issue) {\n                      console.log(\n                        `     GitHub: #${conflict.github_issue.number} - ${conflict.github_issue.html_url}`\n                      );\n                      console.log(`     Local updated: ${conflict.local_issue.updated_date}`);\n                      console.log(`     GitHub updated: ${conflict.github_issue.updated_at}`);\n                    }\n                    console.log('');\n                  });\n                }\n              } catch (error) {\n                conflictSpinner.fail('Failed to analyze conflicts');\n                console.log(\n                  Formatter.error(\n                    `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n                  )\n                );\n              }\n            }\n\n            console.log(Formatter.info('Conflict Resolution Options:'));\n            console.log('  • Use \"aitrackdown sync push --force\" to push local changes');\n            console.log('  • Use \"aitrackdown sync pull --force\" to pull remote changes');\n            console.log('  • Manually resolve conflicts and sync again');\n          }\n\n          if (options.verbose && !options.conflictsOnly) {\n            // Get rate limit information\n            const rateLimitSpinner = ora('Checking rate limit...').start();\n\n            try {\n              const client = new (await import('../../utils/github-client.js')).GitHubClient(\n                config.github_sync\n              );\n              const rateLimit = await client.getRateLimit();\n              rateLimitSpinner.succeed('Rate limit information retrieved');\n\n              console.log('');\n              console.log(Formatter.info('GitHub API Rate Limit:'));\n              console.log(`  Limit: ${rateLimit.limit} requests/hour`);\n              console.log(`  Remaining: ${rateLimit.remaining} requests`);\n              console.log(`  Used: ${rateLimit.used} requests`);\n              console.log(`  Reset: ${rateLimit.reset.toLocaleString()}`);\n\n              // Rate limit health indicator\n              const rateLimitPercentage = (rateLimit.remaining / rateLimit.limit) * 100;\n              const rateLimitIcon =\n                rateLimitPercentage > 50 ? '✅' : rateLimitPercentage > 20 ? '⚠️' : '❌';\n              console.log(\n                `  Health: ${rateLimitIcon} ${rateLimitPercentage.toFixed(1)}% remaining`\n              );\n            } catch (error) {\n              rateLimitSpinner.fail('Failed to check rate limit');\n              console.log(\n                Formatter.error(\n                  `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n                )\n              );\n            }\n          }\n\n          // Show recommendations\n          if (!options.conflictsOnly) {\n            console.log('');\n            console.log(Formatter.info('Recommendations:'));\n\n            if (status.pending_operations > 0) {\n              console.log('  • Run \"aitrackdown sync push\" to push local changes');\n              console.log('  • Run \"aitrackdown sync pull\" to pull remote changes');\n            }\n\n            if (status.conflicts > 0) {\n              console.log('  • Review conflicts and resolve them manually');\n              console.log('  • Use --force flags to override conflicts');\n            }\n\n            if (!status.auto_sync) {\n              console.log('  • Consider enabling auto-sync with \"aitrackdown sync auto --enable\"');\n            }\n\n            if (status.sync_health === 'degraded') {\n              console.log('  • Check rate limit usage and consider increasing delays');\n            }\n\n            if (status.sync_health === 'failed') {\n              console.log('  • Check GitHub connection and permissions');\n              console.log('  • Verify token is valid and has correct permissions');\n            }\n          }\n        } catch (error) {\n          statusSpinner.fail('Failed to retrieve sync status');\n          throw error;\n        }\n      } catch (error) {\n        console.error(Formatter.error('Status check failed:'));\n        console.error(Formatter.error(error instanceof Error ? error.message : 'Unknown error'));\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","/**\n * Main GitHub Sync Command\n * Combines all sync subcommands\n */\n\nimport { Command } from 'commander';\nimport { createSyncAutoCommand } from './sync/auto.js';\nimport { createSyncBidirectionalCommand } from './sync/bidirectional.js';\nimport { createSyncPullCommand } from './sync/pull.js';\nimport { createSyncPushCommand } from './sync/push.js';\nimport { createSyncSetupCommand } from './sync/setup.js';\nimport { createSyncStatusCommand } from './sync/status.js';\n\nexport function createSyncCommand(): Command {\n  const command = new Command('sync');\n\n  command\n    .description('GitHub Issues sync management')\n    .addCommand(createSyncSetupCommand())\n    .addCommand(createSyncPushCommand())\n    .addCommand(createSyncPullCommand())\n    .addCommand(createSyncStatusCommand())\n    .addCommand(createSyncAutoCommand())\n    .addCommand(createSyncBidirectionalCommand());\n\n  // Add help action for when no subcommand is provided\n  command.action(() => {\n    console.log('🔄 GitHub Issues Sync Management');\n    console.log('');\n    console.log('Available commands:');\n    console.log('  setup         Configure GitHub sync for the project');\n    console.log('  push          Push local changes to GitHub');\n    console.log('  pull          Pull GitHub changes to local');\n    console.log('  bidirectional Perform full bidirectional sync');\n    console.log('  status        Show sync status and conflicts');\n    console.log('  auto          Enable/disable automatic sync');\n    console.log('');\n    console.log('Examples:');\n    console.log('  aitrackdown sync setup --repository owner/repo --token ghp_xxx');\n    console.log('  aitrackdown sync push --verbose');\n    console.log('  aitrackdown sync pull --dry-run');\n    console.log('  aitrackdown sync bidirectional');\n    console.log('  aitrackdown sync status --verbose');\n    console.log('  aitrackdown sync auto --enable');\n    console.log('');\n    console.log('Use \"aitrackdown sync <command> --help\" for more information about a command.');\n  });\n\n  return command;\n}\n","/**\n * Task Complete Command\n * Mark tasks as completed with time tracking\n */\n\nimport { Command } from 'commander';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface CompleteOptions {\n  actualTokens?: number;\n  timeSpent?: string;\n  completionNotes?: string;\n  dryRun?: boolean;\n}\n\nexport function createTaskCompleteCommand(): Command {\n  const cmd = new Command('complete');\n\n  cmd\n    .description('Mark a task as completed')\n    .argument('<task-id>', 'task ID to complete')\n    .option('--actual-tokens <number>', 'set actual token usage')\n    .option('--time-spent <duration>', 'time spent on task (e.g., 2h, 30m, 1d)')\n    .option('--completion-notes <text>', 'add completion notes')\n    .option('--dry-run', 'show what would be completed without completing')\n    .action(async (taskId: string, options: CompleteOptions) => {\n      try {\n        await completeTask(taskId, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to complete task: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function completeTask(taskId: string, options: CompleteOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n  const parser = new FrontmatterParser();\n\n  // Find the task\n  const allTasks = relationshipManager\n    .search({ content_search: taskId })\n    .items.filter((item) => 'task_id' in item && item.task_id === taskId);\n\n  if (allTasks.length === 0) {\n    throw new Error(`Task not found: ${taskId}`);\n  }\n\n  const task = allTasks[0];\n\n  // Check if already completed\n  if (task.status === 'completed') {\n    console.log(Formatter.warning(`Task ${taskId} is already completed.`));\n    return;\n  }\n\n  // Show status\n  console.log(Formatter.info(`Task: ${task.title}`));\n  console.log(Formatter.info(`Current Status: ${task.status}`));\n  console.log('');\n\n  // Prepare updates\n  const updates = {\n    status: 'completed' as const,\n    updated_date: new Date().toISOString(),\n  };\n\n  if (options.actualTokens !== undefined) {\n    (updates as any).actual_tokens = parseInt(options.actualTokens.toString(), 10);\n  }\n\n  if (options.timeSpent) {\n    (updates as any).time_spent = options.timeSpent;\n  }\n\n  // Show what would be updated\n  console.log(Formatter.info(`${options.dryRun ? 'Dry run - ' : ''}Would complete:`));\n  console.log(`  Task: ${task.task_id} - ${task.title}`);\n  console.log(`    Status: ${task.status} → completed`);\n\n  if (options.actualTokens !== undefined) {\n    console.log(`    Actual Tokens: ${task.actual_tokens || 0} → ${options.actualTokens}`);\n  }\n\n  if (options.timeSpent) {\n    console.log(`    Time Spent: ${task.time_spent || 'none'} → ${options.timeSpent}`);\n  }\n\n  if (options.dryRun) {\n    return;\n  }\n\n  // Perform update\n  try {\n    const updatedTask = parser.updateFile(task.file_path, updates);\n\n    // Refresh cache\n    relationshipManager.rebuildCache();\n\n    console.log(Formatter.success(`Task completed successfully!`));\n    console.log(Formatter.info(`Task ID: ${taskId}`));\n    console.log(Formatter.info(`Title: ${updatedTask.title}`));\n    console.log(Formatter.info(`Status: ${updatedTask.status}`));\n\n    if (updatedTask.actual_tokens) {\n      console.log(Formatter.info(`Actual Tokens: ${updatedTask.actual_tokens}`));\n\n      if (updatedTask.estimated_tokens > 0) {\n        const efficiency = updatedTask.actual_tokens / updatedTask.estimated_tokens;\n        const efficiencyDisplay =\n          efficiency <= 1\n            ? Formatter.success(`${(efficiency * 100).toFixed(1)}%`)\n            : Formatter.warning(`${(efficiency * 100).toFixed(1)}%`);\n        console.log(Formatter.info(`Token Efficiency: ${efficiencyDisplay}`));\n      }\n    }\n\n    if (updatedTask.time_spent) {\n      console.log(Formatter.info(`Time Spent: ${updatedTask.time_spent}`));\n    }\n\n    console.log('');\n    console.log(Formatter.success('✅ Task completed!'));\n    console.log(`  • Completed on ${new Date().toLocaleDateString()}`);\n\n    if (options.completionNotes) {\n      console.log(`  • Notes: ${options.completionNotes}`);\n    }\n\n    // Show time tracking summary if applicable\n    if (updatedTask.time_estimate && updatedTask.time_spent) {\n      console.log(`  • Time: ${updatedTask.time_spent} (estimated: ${updatedTask.time_estimate})`);\n    }\n  } catch (error) {\n    throw new Error(\n      `Failed to update task: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n","/**\n * Task Create Command\n * Creates new tasks using YAML frontmatter system\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport type { ItemStatus, Priority, TaskFrontmatter } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { FrontmatterParser } from '../../utils/frontmatter-parser.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\nimport { IdGenerator } from '../../utils/simple-id-generator.js';\n\ninterface CreateOptions {\n  title?: string;\n  issue: string;\n  description?: string;\n  assignee?: string;\n  priority?: Priority;\n  status?: ItemStatus;\n  template?: string;\n  estimatedTokens?: number;\n  timeEstimate?: string;\n  tags?: string;\n  dependencies?: string;\n  dryRun?: boolean;\n}\n\nexport function createTaskCreateCommand(): Command {\n  const cmd = new Command('create');\n\n  cmd\n    .description('Create a new task within an issue')\n    .argument('[title]', 'task title (optional if using --title flag)')\n    .option('--title <text>', 'task title (alternative to positional argument)')\n    .requiredOption('-i, --issue <issue-id>', 'parent issue ID')\n    .option('-d, --description <text>', 'task description')\n    .option('-a, --assignee <username>', 'assignee username')\n    .option('-p, --priority <level>', 'priority level (low|medium|high|critical)', 'medium')\n    .option(\n      '-s, --status <status>',\n      'initial status (planning|active|completed|archived)',\n      'planning'\n    )\n    .option('-t, --template <name>', 'template to use', 'default')\n    .option('--estimated-tokens <number>', 'estimated token usage', '0')\n    .option('--time-estimate <duration>', 'estimated time (e.g., 2h, 30m, 1d)')\n    .option('--tags <tags>', 'comma-separated tags')\n    .option('--dependencies <ids>', 'comma-separated dependency IDs')\n    .option('--dry-run', 'show what would be created without creating')\n    .action(async (titleArg: string | undefined, options: CreateOptions) => {\n      try {\n        // Support both positional argument and --title flag\n        const title = titleArg || options.title;\n        if (!title) {\n          throw new Error(\n            'Task title is required. Provide it as a positional argument or use --title flag.'\n          );\n        }\n        await createTask(title, options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to create task: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function createTask(title: string, options: CreateOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n  const parser = new FrontmatterParser();\n  const idGenerator = new IdGenerator();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Validate that the issue exists\n  const issueHierarchy = relationshipManager.getIssueHierarchy(options.issue);\n  if (!issueHierarchy) {\n    throw new Error(`Issue not found: ${options.issue}`);\n  }\n\n  const issue = issueHierarchy.issue;\n  const epicId = issue.epic_id;\n\n  // Generate task ID\n  const taskId = idGenerator.generateTaskId(options.issue, title);\n\n  // Get template\n  const template = configManager.getTemplateWithFallback('task', options.template || 'default');\n  if (!template) {\n    throw new Error(`Task template '${options.template || 'default'}' not found`);\n  }\n\n  // Parse tags and dependencies\n  const tags = options.tags ? options.tags.split(',').map((tag) => tag.trim()) : [];\n  const dependencies = options.dependencies\n    ? options.dependencies.split(',').map((dep) => dep.trim())\n    : [];\n\n  // Create task frontmatter\n  const now = new Date().toISOString();\n  const taskFrontmatter: TaskFrontmatter = {\n    task_id: taskId,\n    issue_id: options.issue,\n    epic_id: epicId,\n    title,\n    description: options.description || template.frontmatter_template.description || '',\n    status: options.status || 'planning',\n    priority: options.priority || 'medium',\n    assignee: options.assignee || config.default_assignee || 'unassigned',\n    created_date: now,\n    updated_date: now,\n    estimated_tokens: parseInt(options.estimatedTokens || '0', 10),\n    actual_tokens: 0,\n    ai_context: template.ai_context_defaults || config.ai_context_templates || [],\n    sync_status: 'local',\n    subtasks: [],\n    parent_task: undefined,\n    tags: tags.length > 0 ? tags : undefined,\n    dependencies: dependencies.length > 0 ? dependencies : undefined,\n    time_estimate: options.timeEstimate,\n    time_spent: undefined,\n    blocked_by: [],\n    blocks: [],\n  };\n\n  // Generate content from template\n  const content = template.content_template\n    .replace(/\\{\\{title\\}\\}/g, title)\n    .replace(/\\{\\{description\\}\\}/g, taskFrontmatter.description);\n\n  // Create filename\n  const filename = `${taskId}-${title.toLowerCase().replace(/[^a-z0-9]+/g, '-')}${config.naming_conventions.file_extension}`;\n  const filePath = path.join(paths.tasksDir, filename);\n\n  if (options.dryRun) {\n    console.log(Formatter.info('Dry run - Task would be created with:'));\n    console.log(Formatter.debug(`File: ${filePath}`));\n    console.log(Formatter.debug(`Task ID: ${taskId}`));\n    console.log(Formatter.debug(`Issue ID: ${options.issue}`));\n    console.log(Formatter.debug(`Epic ID: ${epicId}`));\n    console.log(Formatter.debug(`Title: ${title}`));\n    console.log(Formatter.debug(`Status: ${taskFrontmatter.status}`));\n    console.log(Formatter.debug(`Priority: ${taskFrontmatter.priority}`));\n    console.log(Formatter.debug(`Assignee: ${taskFrontmatter.assignee}`));\n    if (options.timeEstimate) {\n      console.log(Formatter.debug(`Time Estimate: ${options.timeEstimate}`));\n    }\n    if (tags.length > 0) {\n      console.log(Formatter.debug(`Tags: ${tags.join(', ')}`));\n    }\n    if (dependencies.length > 0) {\n      console.log(Formatter.debug(`Dependencies: ${dependencies.join(', ')}`));\n    }\n    return;\n  }\n\n  // Check if file already exists\n  if (fs.existsSync(filePath)) {\n    throw new Error(`Task file already exists: ${filePath}`);\n  }\n\n  // Write the task file\n  parser.writeTask(filePath, taskFrontmatter, content);\n\n  // Update the issue's related tasks\n  const updatedRelatedTasks = [...(issue.related_tasks || []), taskId];\n  parser.updateFile(issue.file_path, { related_tasks: updatedRelatedTasks });\n\n  // Refresh cache\n  relationshipManager.rebuildCache();\n\n  console.log(Formatter.success(`Task created successfully!`));\n  console.log(Formatter.info(`Task ID: ${taskId}`));\n  console.log(Formatter.info(`Issue ID: ${options.issue}`));\n  console.log(Formatter.info(`Epic ID: ${epicId}`));\n  console.log(Formatter.info(`File: ${filePath}`));\n  console.log(Formatter.info(`Title: ${title}`));\n  console.log(Formatter.info(`Status: ${taskFrontmatter.status}`));\n  console.log(Formatter.info(`Priority: ${taskFrontmatter.priority}`));\n  console.log(Formatter.info(`Assignee: ${taskFrontmatter.assignee}`));\n\n  if (options.timeEstimate) {\n    console.log(Formatter.info(`Time Estimate: ${options.timeEstimate}`));\n  }\n\n  if (tags.length > 0) {\n    console.log(Formatter.info(`Tags: ${tags.join(', ')}`));\n  }\n\n  if (dependencies.length > 0) {\n    console.log(Formatter.info(`Dependencies: ${dependencies.join(', ')}`));\n  }\n\n  console.log('');\n  console.log(Formatter.success(`Task added to issue \"${issue.title}\"`));\n}\n","/**\n * Task Delete Command - Placeholder\n * Delete tasks with safety checks\n */\n\nimport { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\n\nexport function createTaskDeleteCommand(): Command {\n  const cmd = new Command('delete');\n\n  cmd\n    .description('Delete a task')\n    .argument('<task-id>', 'task ID to delete')\n    .action(async (taskId: string) => {\n      console.log(Formatter.info(`Task delete command not yet implemented for ${taskId}`));\n      console.log(\n        Formatter.info(\n          'This command will safely delete tasks with appropriate confirmations and relationship cleanup.'\n        )\n      );\n    });\n\n  return cmd;\n}\n","/**\n * Task List Command\n * Lists tasks with filtering and sorting options\n */\n\nimport { Command } from 'commander';\nimport type { ItemStatus, Priority, SearchFilters } from '../../types/ai-trackdown.js';\nimport { isTaskData } from '../../types/ai-trackdown.js';\nimport { ConfigManager } from '../../utils/config-manager.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { RelationshipManager } from '../../utils/relationship-manager.js';\n\ninterface ListOptions {\n  status?: string;\n  priority?: string;\n  assignee?: string;\n  issue?: string;\n  epic?: string;\n  tags?: string;\n  search?: string;\n  format?: 'table' | 'json' | 'yaml';\n  sortBy?: 'created' | 'updated' | 'title' | 'priority' | 'status';\n  sortOrder?: 'asc' | 'desc';\n  limit?: number;\n  showTime?: boolean;\n}\n\nexport function createTaskListCommand(): Command {\n  const cmd = new Command('list');\n\n  cmd\n    .description('List tasks with filtering options')\n    .option('-s, --status <statuses>', 'filter by status (comma-separated)')\n    .option('-p, --priority <priorities>', 'filter by priority (comma-separated)')\n    .option('-a, --assignee <username>', 'filter by assignee')\n    .option('-i, --issue <issue-id>', 'filter by issue ID')\n    .option('-e, --epic <epic-id>', 'filter by epic ID')\n    .option('-t, --tags <tags>', 'filter by tags (comma-separated)')\n    .option('--search <term>', 'search in title, description, and content')\n    .option('-f, --format <type>', 'output format (table|json|yaml)', 'table')\n    .option('--sort-by <field>', 'sort by field (created|updated|title|priority|status)', 'created')\n    .option('--sort-order <order>', 'sort order (asc|desc)', 'desc')\n    .option('-l, --limit <number>', 'limit number of results')\n    .option('--show-time', 'show time estimates and spent')\n    .action(async (options: ListOptions) => {\n      try {\n        await listTasks(options);\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to list tasks: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return cmd;\n}\n\nasync function listTasks(options: ListOptions): Promise<void> {\n  const configManager = new ConfigManager();\n  const config = configManager.getConfig();\n\n  // Get CLI tasks directory from parent command options\n  const cliTasksDir = process.env.CLI_TASKS_DIR; // Set by parent command\n\n  // Get absolute paths with CLI override\n  const paths = configManager.getAbsolutePaths(cliTasksDir);\n  const relationshipManager = new RelationshipManager(config, paths.projectRoot, cliTasksDir);\n\n  // Build search filters\n  const filters: SearchFilters = {};\n\n  if (options.status) {\n    const statuses = options.status.split(',').map((s) => s.trim()) as ItemStatus[];\n    filters.status = statuses.length === 1 ? statuses[0] : statuses;\n  }\n\n  if (options.priority) {\n    const priorities = options.priority.split(',').map((p) => p.trim()) as Priority[];\n    filters.priority = priorities.length === 1 ? priorities[0] : priorities;\n  }\n\n  if (options.assignee) {\n    filters.assignee = options.assignee;\n  }\n\n  if (options.tags) {\n    const tags = options.tags.split(',').map((t) => t.trim());\n    filters.tags = tags.length === 1 ? tags[0] : tags;\n  }\n\n  if (options.search) {\n    filters.content_search = options.search;\n  }\n\n  // Search for items\n  const searchResult = relationshipManager.search(filters);\n\n  // Filter to only tasks\n  let tasks = searchResult.items.filter(isTaskData);\n\n  // Additional filtering for issue/epic\n  if (options.issue) {\n    tasks = tasks.filter((task) => task.issue_id === options.issue);\n  }\n\n  if (options.epic) {\n    tasks = tasks.filter((task) => task.epic_id === options.epic);\n  }\n\n  // Sort tasks\n  sortTasks(tasks, options.sortBy || 'created', options.sortOrder || 'desc');\n\n  // Apply limit\n  if (options.limit) {\n    const limit = parseInt(options.limit.toString(), 10);\n    tasks = tasks.slice(0, limit);\n  }\n\n  // Output results\n  switch (options.format) {\n    case 'json':\n      console.log(JSON.stringify(tasks, null, 2));\n      break;\n    case 'yaml': {\n      const YAML = await import('yaml');\n      console.log(YAML.stringify(tasks));\n      break;\n    }\n    default:\n      await displayTasksTable(tasks, options);\n  }\n}\n\nfunction sortTasks(tasks: any[], sortBy: string, sortOrder: string): void {\n  tasks.sort((a, b) => {\n    let aVal: any, bVal: any;\n\n    switch (sortBy) {\n      case 'created':\n        aVal = new Date(a.created_date);\n        bVal = new Date(b.created_date);\n        break;\n      case 'updated':\n        aVal = new Date(a.updated_date);\n        bVal = new Date(b.updated_date);\n        break;\n      case 'title':\n        aVal = a.title.toLowerCase();\n        bVal = b.title.toLowerCase();\n        break;\n      case 'priority': {\n        const priorityOrder = { critical: 4, high: 3, medium: 2, low: 1 };\n        aVal = priorityOrder[a.priority as keyof typeof priorityOrder] || 0;\n        bVal = priorityOrder[b.priority as keyof typeof priorityOrder] || 0;\n        break;\n      }\n      case 'status': {\n        const statusOrder = { active: 4, planning: 3, completed: 2, archived: 1 };\n        aVal = statusOrder[a.status as keyof typeof statusOrder] || 0;\n        bVal = statusOrder[b.status as keyof typeof statusOrder] || 0;\n        break;\n      }\n      default:\n        aVal = a.created_date;\n        bVal = b.created_date;\n    }\n\n    if (sortOrder === 'asc') {\n      return aVal < bVal ? -1 : aVal > bVal ? 1 : 0;\n    } else {\n      return aVal > bVal ? -1 : aVal < bVal ? 1 : 0;\n    }\n  });\n}\n\nasync function displayTasksTable(tasks: any[], options: ListOptions): Promise<void> {\n  if (tasks.length === 0) {\n    console.log(Formatter.info('No tasks found matching the criteria.'));\n    return;\n  }\n\n  console.log(Formatter.success(`Found ${tasks.length} task(s):`));\n  console.log('');\n\n  // Table headers\n  const headers = ['ID', 'Title', 'Status', 'Priority', 'Issue', 'Assignee'];\n  if (options.showTime) {\n    headers.push('Time Est.');\n    headers.push('Time Spent');\n  }\n  headers.push('Created');\n\n  // Calculate column widths\n  const colWidths = headers.map(() => 0);\n\n  // Prepare rows data\n  const rows: string[][] = [];\n\n  for (const task of tasks) {\n    const row = [\n      task.task_id,\n      truncateText(task.title, 30),\n      getStatusDisplay(task.status),\n      getPriorityDisplay(task.priority),\n      task.issue_id,\n      truncateText(task.assignee, 15),\n    ];\n\n    if (options.showTime) {\n      row.push(task.time_estimate || '-');\n      row.push(task.time_spent || '-');\n    }\n\n    row.push(formatDate(task.created_date));\n    rows.push(row);\n  }\n\n  // Calculate column widths\n  for (let i = 0; i < headers.length; i++) {\n    colWidths[i] = Math.max(headers[i].length, ...rows.map((row) => row[i].length));\n  }\n\n  // Print table\n  printTableRow(headers, colWidths, true);\n  printSeparator(colWidths);\n\n  for (const row of rows) {\n    printTableRow(row, colWidths, false);\n  }\n\n  console.log('');\n  console.log(Formatter.info(`Total: ${tasks.length} task(s)`));\n}\n\nfunction printTableRow(row: string[], widths: number[], isHeader: boolean): void {\n  const paddedRow = row.map((cell, i) => cell.padEnd(widths[i]));\n  const rowText = paddedRow.join(' | ');\n\n  if (isHeader) {\n    console.log(Formatter.info(rowText));\n  } else {\n    console.log(rowText);\n  }\n}\n\nfunction printSeparator(widths: number[]): void {\n  const separator = widths.map((width) => '-'.repeat(width)).join('-+-');\n  console.log(separator);\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n  if (text.length <= maxLength) return text;\n  return `${text.substring(0, maxLength - 3)}...`;\n}\n\nfunction getStatusDisplay(status: string): string {\n  const statusColors: Record<string, (text: string) => string> = {\n    planning: (text) => Formatter.info(text),\n    active: (text) => Formatter.success(text),\n    completed: (text) => Formatter.success(text),\n    archived: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = statusColors[status] || ((text) => text);\n  return colorFn(status.toUpperCase());\n}\n\nfunction getPriorityDisplay(priority: string): string {\n  const priorityColors: Record<string, (text: string) => string> = {\n    critical: (text) => Formatter.error(text),\n    high: (text) => Formatter.warning(text),\n    medium: (text) => Formatter.info(text),\n    low: (text) => Formatter.debug(text),\n  };\n\n  const colorFn = priorityColors[priority] || ((text) => text);\n  return colorFn(priority.toUpperCase());\n}\n\nfunction formatDate(dateString: string): string {\n  const date = new Date(dateString);\n  return date.toLocaleDateString();\n}\n","/**\n * Task Show Command - Placeholder\n * Display detailed information about a specific task\n */\n\nimport { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\n\nexport function createTaskShowCommand(): Command {\n  const cmd = new Command('show');\n\n  cmd\n    .description('Show detailed information about a task')\n    .argument('<task-id>', 'task ID to show')\n    .action(async (taskId: string) => {\n      console.log(Formatter.info(`Task show command not yet implemented for ${taskId}`));\n      console.log(\n        Formatter.info(\n          'This command will display detailed task information including content, time tracking, and related items.'\n        )\n      );\n    });\n\n  return cmd;\n}\n","/**\n * Task Update Command - Placeholder\n * Update task fields using YAML frontmatter system\n */\n\nimport { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\n\nexport function createTaskUpdateCommand(): Command {\n  const cmd = new Command('update');\n\n  cmd\n    .description('Update an existing task')\n    .argument('<task-id>', 'task ID to update')\n    .action(async (taskId: string) => {\n      console.log(Formatter.info(`Task update command not yet implemented for ${taskId}`));\n      console.log(\n        Formatter.info(\n          'This command will allow updating task fields like title, description, status, priority, time estimates, etc.'\n        )\n      );\n    });\n\n  return cmd;\n}\n","/**\n * Task Command Group for AI-Trackdown\n * Granular work items within issues\n */\n\nimport { Command } from 'commander';\nimport { createTaskCompleteCommand } from './task/complete.js';\nimport { createTaskCreateCommand } from './task/create.js';\nimport { createTaskDeleteCommand } from './task/delete.js';\nimport { createTaskListCommand } from './task/list.js';\nimport { createTaskShowCommand } from './task/show.js';\nimport { createTaskUpdateCommand } from './task/update.js';\n\nexport function createTaskCommand(): Command {\n  const cmd = new Command('task');\n\n  cmd\n    .description('Manage tasks (granular work items within issues)')\n    .alias('tasks')\n    .addCommand(createTaskCreateCommand())\n    .addCommand(createTaskListCommand())\n    .addCommand(createTaskShowCommand())\n    .addCommand(createTaskUpdateCommand())\n    .addCommand(createTaskDeleteCommand())\n    .addCommand(createTaskCompleteCommand());\n\n  return cmd;\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport type { TrackdownItem } from '../types/index.js';\nimport { ConfigManager } from '../utils/config.js';\nimport { Formatter } from '../utils/formatter.js';\nimport { PathResolver } from '../utils/path-resolver.js';\nimport {\n  ValidationError,\n  validateAssignee,\n  validateId,\n  validatePriority,\n  validateRequired,\n  validateStoryPoints,\n  validateTags,\n} from '../utils/validation.js';\n\nexport function createTrackCommand(): Command {\n  const command = new Command('track');\n\n  command\n    .description('Track a new task or issue with advanced features')\n    .argument('<title>', 'title of the task or issue')\n    .option('--priority <level>', 'priority level (low, medium, high, critical)')\n    .option('--assignee <name>', 'assign to team member')\n    .option('--tags <tags>', 'comma-separated tags')\n    .option('--estimate <points>', 'story point estimate')\n    .option('--description <text>', 'detailed description')\n    .option('--id <id>', 'custom ID for the item')\n    .option('--template <name>', 'use specific template')\n    .option('--interactive', 'interactive task creation mode')\n    .option('--duplicate-from <id>', 'duplicate from existing task')\n    .option('--labels <labels>', 'comma-separated labels')\n    .option('--due-date <date>', 'due date (YYYY-MM-DD format)')\n    .addHelpText(\n      'after',\n      `\nExamples:\n  $ aitrackdown track \"Implement user login\"\n  $ aitrackdown track \"Fix critical bug\" --priority critical --assignee john.doe\n  $ aitrackdown track \"Add API endpoint\" --tags backend,api --estimate 5\n  $ aitrackdown track \"Design homepage\" --interactive\n  $ aitrackdown track \"Update docs\" --duplicate-from TD-123\n\nPriority Levels:\n  low       - Nice to have, non-urgent\n  medium    - Standard priority (default)\n  high      - Important, should be done soon\n  critical  - Urgent, blocking other work\n\nStory Points:\n  1-2       - Quick fixes or small tasks\n  3-5       - Standard features or moderate complexity\n  8-13      - Large features or complex tasks\n  21+       - Epic-sized work (consider breaking down)\n`\n    )\n    .action(\n      async (\n        title: string,\n        options?: {\n          priority?: string;\n          assignee?: string;\n          tags?: string;\n          estimate?: string;\n          description?: string;\n          id?: string;\n          template?: string;\n          interactive?: boolean;\n          duplicateFrom?: string;\n          labels?: string;\n          dueDate?: string;\n        }\n      ) => {\n        try {\n          // Get CLI root directory option\n          const parentCommand = command.parent;\n          const rootDirOption = parentCommand?.opts()?.rootDir || parentCommand?.opts()?.tasksDir;\n\n          // Load configuration first\n          const configManager = new ConfigManager();\n          const config = configManager.getConfig();\n\n          // Initialize path resolver with CLI override\n          const pathResolver = new PathResolver(configManager, rootDirOption);\n\n          let taskData = {\n            title: title,\n            priority: options?.priority || config.defaultPriority || 'medium',\n            assignee: options?.assignee,\n            tags: options?.tags,\n            estimate: options?.estimate,\n            description: options?.description,\n            id: options?.id,\n            template: options?.template || config.defaultTemplate || 'standard',\n            labels: options?.labels,\n            dueDate: options?.dueDate,\n          };\n\n          // Interactive mode\n          if (options?.interactive) {\n            taskData = await runInteractiveTaskCreation(taskData, config);\n          }\n\n          // Duplicate from existing task\n          if (options?.duplicateFrom) {\n            taskData = await duplicateTask(options.duplicateFrom, taskData);\n          }\n\n          // Validate all inputs\n          const validatedTitle = validateRequired(taskData.title, 'Title');\n          const priority = validatePriority(taskData.priority);\n          const tags = taskData.tags ? validateTags(taskData.tags) : undefined;\n          const labels = taskData.labels ? validateTags(taskData.labels) : undefined;\n          const assignee = taskData.assignee\n            ? validateAssignee(taskData.assignee)\n            : config.autoAssign\n              ? config.defaultAssignee\n              : undefined;\n          const estimate = taskData.estimate ? validateStoryPoints(taskData.estimate) : undefined;\n          const itemId = taskData.id ? validateId(taskData.id) : generateId();\n\n          // Show creation progress\n          const spinner = ora('Creating trackdown task...').start();\n\n          try {\n            // Create trackdown item\n            const item: TrackdownItem = {\n              id: itemId,\n              title: validatedTitle,\n              description: taskData.description,\n              status: 'todo',\n              priority,\n              assignee,\n              createdAt: new Date(),\n              updatedAt: new Date(),\n              tags,\n              estimate,\n              labels,\n              metadata: {\n                template: taskData.template,\n                dueDate: taskData.dueDate,\n                source: options?.duplicateFrom ? 'duplicate' : 'new',\n                createdBy: process.env.USER || 'unknown',\n              },\n            };\n\n            spinner.text = 'Setting up task structure...';\n\n            // Ensure active directory exists (using configurable path)\n            const activeDir = join(process.cwd(), pathResolver.getActiveDir());\n            if (!existsSync(activeDir)) {\n              // Check for migration scenario before creating new directories\n              if (pathResolver.shouldMigrate()) {\n                pathResolver.showMigrationWarning();\n                console.log('\\nMigration commands:');\n                pathResolver.getMigrationCommands().forEach((cmd) => {\n                  console.log(Formatter.highlight(cmd));\n                });\n                process.exit(1);\n              }\n              mkdirSync(activeDir, { recursive: true });\n            }\n\n            // Create the tracking file\n            const filename = `${itemId}-${sanitizeFilename(validatedTitle)}.md`;\n            const filePath = join(activeDir, filename);\n\n            if (existsSync(filePath)) {\n              throw new ValidationError(\n                `Item with ID \"${itemId}\" already exists`,\n                'Use a different ID with --id option',\n                1,\n                'track',\n                ['--id TD-NEW-001', '--id feature-auth', '--id bug-fix-123']\n              );\n            }\n\n            spinner.text = 'Generating task content...';\n\n            // Generate markdown content\n            const content = generateMarkdownContent(item, config);\n            writeFileSync(filePath, content);\n\n            spinner.succeed('Task created successfully!');\n\n            // Show success message with details\n            console.log(\n              Formatter.box(\n                `\n🎯 Task \"${validatedTitle}\" tracked successfully!\n\nID: ${itemId}\nPriority: ${priority.toUpperCase()}\n${assignee ? `Assignee: ${assignee}` : ''}\n${estimate ? `Estimate: ${estimate} story points` : ''}\n${tags?.length ? `Tags: ${tags.join(', ')}` : ''}\nLocation: ${filePath}\n`,\n                'success'\n              )\n            );\n\n            // Show helpful next steps\n            console.log(Formatter.header('Next Steps'));\n            console.log(Formatter.info('• View task details:'));\n            console.log(Formatter.highlight(`  trackdown status --filter id=${itemId}`));\n            console.log(Formatter.info('• Edit the task file:'));\n            console.log(Formatter.highlight(`  ${process.env.EDITOR || 'nano'} \"${filePath}\"`));\n            console.log(Formatter.info('• Check project status:'));\n            console.log(Formatter.highlight('  trackdown status'));\n\n            // Auto-assign suggestions\n            if (!assignee && !config.autoAssign) {\n              console.log(Formatter.warning('💡 Consider assigning this task to someone'));\n              console.log(\n                Formatter.info('  Use: trackdown track --assignee <name> for future tasks')\n              );\n            }\n\n            // Story point suggestions\n            if (!estimate) {\n              console.log(Formatter.info('💡 Add story points to help with planning'));\n              console.log(Formatter.info('  Use: --estimate <points> (1-100 scale)'));\n            }\n          } catch (error) {\n            spinner.fail('Task creation failed');\n            throw error;\n          }\n        } catch (error) {\n          if (error instanceof ValidationError) {\n            console.error(Formatter.error(error.message));\n            if (error.suggestion) {\n              console.log(Formatter.info(`💡 ${error.suggestion}`));\n            }\n            if (error.validOptions?.length) {\n              console.log(Formatter.info('Valid options:'));\n              error.validOptions.forEach((option) => {\n                console.log(Formatter.highlight(`  ${option}`));\n              });\n            }\n          } else {\n            console.error(\n              Formatter.error(\n                `Failed to track task: ${error instanceof Error ? error.message : 'Unknown error'}`\n              )\n            );\n          }\n          process.exit(1);\n        }\n      }\n    );\n\n  return command;\n}\n\nasync function runInteractiveTaskCreation(taskData: any, config: any) {\n  console.log(Formatter.header('📝 Interactive Task Creation'));\n\n  const answers = await inquirer.prompt([\n    {\n      type: 'input',\n      name: 'title',\n      message: 'Task title:',\n      default: taskData.title,\n      validate: (input: string) => {\n        try {\n          validateRequired(input, 'Title');\n          return true;\n        } catch (error) {\n          return error instanceof Error ? error.message : 'Invalid title';\n        }\n      },\n    },\n    {\n      type: 'editor',\n      name: 'description',\n      message: 'Task description (opens in editor):',\n      default: taskData.description || 'Add a detailed description of this task...',\n      when: () => process.env.EDITOR !== undefined,\n    },\n    {\n      type: 'input',\n      name: 'description',\n      message: 'Task description:',\n      default: taskData.description,\n      when: () => process.env.EDITOR === undefined,\n    },\n    {\n      type: 'list',\n      name: 'priority',\n      message: 'Priority level:',\n      choices: [\n        { name: '🟢 Low - Nice to have', value: 'low' },\n        { name: '🟡 Medium - Standard priority', value: 'medium' },\n        { name: '🟠 High - Important, urgent', value: 'high' },\n        { name: '🔴 Critical - Blocking, emergency', value: 'critical' },\n      ],\n      default: taskData.priority,\n    },\n    {\n      type: 'input',\n      name: 'assignee',\n      message: 'Assignee (username or email):',\n      default: taskData.assignee || config.defaultAssignee,\n      validate: (input: string) => {\n        if (!input) return true;\n        try {\n          validateAssignee(input);\n          return true;\n        } catch (error) {\n          return error instanceof Error ? error.message : 'Invalid assignee';\n        }\n      },\n    },\n    {\n      type: 'input',\n      name: 'estimate',\n      message: 'Story points (1-100):',\n      default: taskData.estimate,\n      validate: (input: string) => {\n        if (!input) return true;\n        try {\n          validateStoryPoints(input);\n          return true;\n        } catch (error) {\n          return error instanceof Error ? error.message : 'Invalid story points';\n        }\n      },\n    },\n    {\n      type: 'input',\n      name: 'tags',\n      message: 'Tags (comma-separated):',\n      default: taskData.tags,\n      validate: (input: string) => {\n        if (!input) return true;\n        try {\n          validateTags(input);\n          return true;\n        } catch (error) {\n          return error instanceof Error ? error.message : 'Invalid tags';\n        }\n      },\n    },\n    {\n      type: 'input',\n      name: 'id',\n      message: 'Custom ID (leave blank for auto-generated):',\n      default: taskData.id,\n      validate: (input: string) => {\n        if (!input) return true;\n        try {\n          validateId(input);\n          return true;\n        } catch (error) {\n          return error instanceof Error ? error.message : 'Invalid ID';\n        }\n      },\n    },\n  ]);\n\n  return { ...taskData, ...answers };\n}\n\nasync function duplicateTask(sourceId: string, taskData: any): Promise<any> {\n  // This would load an existing task and use it as a template\n  // For now, we'll just return the task data with a note\n  console.log(Formatter.info(`🔄 Duplicating from task: ${sourceId}`));\n  return {\n    ...taskData,\n    description: `${taskData.description || ''}\\n\\n*Duplicated from task: ${sourceId}*`,\n  };\n}\n\nfunction generateId(): string {\n  const timestamp = Date.now().toString(36);\n  const random = Math.random().toString(36).substring(2, 7);\n  return `TD-${timestamp}-${random}`.toUpperCase();\n}\n\nfunction sanitizeFilename(title: string): string {\n  return title\n    .toLowerCase()\n    .replace(/[^a-z0-9\\s-]/g, '')\n    .replace(/\\s+/g, '-')\n    .substring(0, 50);\n}\n\nfunction generateMarkdownContent(item: TrackdownItem, _config: any): string {\n  const tagsSection = item.tags?.length\n    ? `\\n**Tags**: ${item.tags.map((tag) => `\\`${tag}\\``).join(', ')}`\n    : '';\n\n  const labelsSection = item.labels?.length\n    ? `\\n**Labels**: ${item.labels.map((label) => `\\`${label}\\``).join(', ')}`\n    : '';\n\n  const estimateSection = item.estimate ? `\\n**Story Points**: ${item.estimate}` : '';\n\n  const dueDateSection = item.metadata?.dueDate ? `\\n**Due Date**: ${item.metadata.dueDate}` : '';\n\n  const metadataSection = `\n## Metadata\n\n- **Template**: ${item.metadata?.template || 'standard'}\n- **Created By**: ${item.metadata?.createdBy || 'unknown'}\n- **Source**: ${item.metadata?.source || 'new'}\n${item.metadata?.dueDate ? `- **Due Date**: ${item.metadata.dueDate}` : ''}\n`;\n\n  return `# ${item.title}\n\n**ID**: ${item.id}\n**Status**: ${item.status}\n**Priority**: ${item.priority}\n**Assignee**: ${item.assignee || 'Unassigned'}\n**Created**: ${item.createdAt.toISOString()}\n**Updated**: ${item.updatedAt.toISOString()}${estimateSection}${tagsSection}${labelsSection}${dueDateSection}\n\n## Description\n\n${item.description || 'No description provided.'}\n\n## Acceptance Criteria\n\n- [ ] Define specific and measurable acceptance criteria\n- [ ] Ensure criteria are testable and verifiable\n- [ ] Add more criteria as needed\n\n## Implementation Notes\n\n<!-- Add technical details, approach, or constraints here -->\n\n## Dependencies\n\n<!-- List any dependencies on other tasks or external factors -->\n\n## Progress Log\n\n- ${item.createdAt.toISOString().split('T')[0]}: Task created\n\n## Resources\n\n<!-- Add links, references, documentation, or related materials here -->\n\n${metadataSection}\n\n---\n\n*Generated by ai-trackdown-tools v1.0.0*\n`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport semver from 'semver';\n\nexport interface VersionInfo {\n  version: string;\n  major: number;\n  minor: number;\n  patch: number;\n}\n\nexport class VersionManager {\n  private static readonly VERSION_FILE = 'VERSION';\n  private static readonly PACKAGE_JSON = 'package.json';\n\n  /**\n   * Get the project root directory\n   */\n  private static getProjectRoot(): string {\n    // Get the current file's directory using ES module approach\n    const currentFile = fileURLToPath(import.meta.url);\n    const currentDir = path.dirname(currentFile);\n\n    // First try to find the CLI package root from current file location\n    let cliRoot = currentDir;\n    while (cliRoot !== path.dirname(cliRoot)) {\n      const packageJsonPath = path.join(cliRoot, 'package.json');\n      if (fs.existsSync(packageJsonPath)) {\n        try {\n          const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n          if (packageJson.name === '@bobmatnyc/ai-trackdown-tools') {\n            return cliRoot;\n          }\n        } catch (_error) {\n          // Continue searching\n        }\n      }\n      cliRoot = path.dirname(cliRoot);\n    }\n\n    // Fallback to current working directory search\n    let current = process.cwd();\n    while (current !== path.dirname(current)) {\n      if (fs.existsSync(path.join(current, 'package.json'))) {\n        return current;\n      }\n      current = path.dirname(current);\n    }\n    throw new Error('Could not find project root (no package.json found)');\n  }\n\n  /**\n   * Read version from VERSION file, with package.json fallback\n   */\n  static getVersion(): VersionInfo {\n    const projectRoot = VersionManager.getProjectRoot();\n    const versionFile = path.join(projectRoot, VersionManager.VERSION_FILE);\n\n    let versionString: string;\n\n    if (fs.existsSync(versionFile)) {\n      versionString = fs.readFileSync(versionFile, 'utf8').trim();\n    } else {\n      // Fallback to package.json\n      const packageJsonPath = path.join(projectRoot, VersionManager.PACKAGE_JSON);\n      if (fs.existsSync(packageJsonPath)) {\n        const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n        versionString = packageJson.version;\n      } else {\n        throw new Error('Neither VERSION file nor package.json found');\n      }\n    }\n\n    if (!semver.valid(versionString)) {\n      throw new Error(`Invalid version format: ${versionString}`);\n    }\n\n    const parsed = semver.parse(versionString);\n    if (!parsed) {\n      throw new Error(`Could not parse version: ${versionString}`);\n    }\n\n    return {\n      version: versionString,\n      major: parsed.major,\n      minor: parsed.minor,\n      patch: parsed.patch,\n    };\n  }\n\n  /**\n   * Set version in VERSION file\n   */\n  static setVersion(version: string): void {\n    if (!semver.valid(version)) {\n      throw new Error(`Invalid version format: ${version}`);\n    }\n\n    const projectRoot = VersionManager.getProjectRoot();\n    const versionFile = path.join(projectRoot, VersionManager.VERSION_FILE);\n\n    fs.writeFileSync(versionFile, version);\n  }\n\n  /**\n   * Bump version according to semver rules\n   */\n  static bumpVersion(type: 'major' | 'minor' | 'patch'): VersionInfo {\n    const currentVersion = VersionManager.getVersion();\n    const newVersion = semver.inc(currentVersion.version, type);\n\n    if (!newVersion) {\n      throw new Error(`Could not increment version: ${currentVersion.version}`);\n    }\n\n    VersionManager.setVersion(newVersion);\n    return VersionManager.getVersion();\n  }\n\n  /**\n   * Sync version across all files\n   */\n  static syncVersion(): void {\n    const versionInfo = VersionManager.getVersion();\n    const projectRoot = VersionManager.getProjectRoot();\n\n    // Update package.json\n    VersionManager.updatePackageJsonVersion(projectRoot, versionInfo.version);\n  }\n\n  /**\n   * Update package.json version\n   */\n  private static updatePackageJsonVersion(projectRoot: string, version: string): void {\n    const packageJsonPath = path.join(projectRoot, VersionManager.PACKAGE_JSON);\n\n    if (!fs.existsSync(packageJsonPath)) {\n      throw new Error('package.json not found');\n    }\n\n    const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n    packageJson.version = version;\n\n    fs.writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`);\n  }\n\n  /**\n   * Validate version consistency across files\n   */\n  static validateVersionConsistency(): { consistent: boolean; versions: Record<string, string> } {\n    const projectRoot = VersionManager.getProjectRoot();\n    const versionInfo = VersionManager.getVersion();\n    const versions: Record<string, string> = {\n      VERSION: versionInfo.version,\n    };\n\n    // Check package.json\n    const packageJsonPath = path.join(projectRoot, VersionManager.PACKAGE_JSON);\n    if (fs.existsSync(packageJsonPath)) {\n      const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n      versions['package.json'] = packageJson.version;\n    }\n\n    // Check if all versions match\n    const allVersions = Object.values(versions);\n    const consistent = allVersions.every((v) => v === versionInfo.version);\n\n    return { consistent, versions };\n  }\n}\n","import { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { VersionManager } from './version.js';\n\nexport interface ChangelogEntry {\n  version: string;\n  date: string;\n  sections: {\n    added: string[];\n    changed: string[];\n    deprecated: string[];\n    removed: string[];\n    fixed: string[];\n    security: string[];\n  };\n}\n\nexport interface ConventionalCommit {\n  type: string;\n  scope?: string;\n  description: string;\n  body?: string;\n  breaking: boolean;\n  hash: string;\n}\n\nexport class ChangelogManager {\n  private static readonly CHANGELOG_FILE = 'CHANGELOG.md';\n\n  /**\n   * Get the project root directory\n   */\n  private static getProjectRoot(): string {\n    let current = process.cwd();\n    while (current !== path.dirname(current)) {\n      if (fs.existsSync(path.join(current, 'package.json'))) {\n        return current;\n      }\n      current = path.dirname(current);\n    }\n    throw new Error('Could not find project root (no package.json found)');\n  }\n\n  /**\n   * Parse conventional commits from git log\n   */\n  static parseCommits(since?: string): ConventionalCommit[] {\n    const projectRoot = ChangelogManager.getProjectRoot();\n\n    try {\n      const sinceFlag = since ? `--since=\"${since}\"` : '';\n      const gitLog = execSync(`git log --pretty=format:\"%H|%s|%b\" --no-merges ${sinceFlag}`, {\n        cwd: projectRoot,\n        encoding: 'utf8',\n      });\n\n      if (!gitLog.trim()) {\n        return [];\n      }\n\n      return gitLog\n        .split('\\n')\n        .filter((line) => line.trim())\n        .map((line) => {\n          const [hash, subject, body] = line.split('|');\n          return ChangelogManager.parseConventionalCommit(hash, subject, body || '');\n        })\n        .filter((commit) => commit !== null) as ConventionalCommit[];\n    } catch (_error) {\n      console.warn('Warning: Could not parse git commits. Make sure you are in a git repository.');\n      return [];\n    }\n  }\n\n  /**\n   * Parse a single conventional commit\n   */\n  private static parseConventionalCommit(\n    hash: string,\n    subject: string,\n    body: string\n  ): ConventionalCommit | null {\n    // Conventional commit pattern: type(scope): description\n    const conventionalPattern = /^(\\w+)(\\([^)]+\\))?!?:\\s*(.+)$/;\n    const match = subject.match(conventionalPattern);\n\n    if (!match) {\n      // Return as a generic commit if it doesn't match conventional format\n      return {\n        type: 'other',\n        description: subject,\n        body,\n        breaking: subject.includes('BREAKING') || body.includes('BREAKING CHANGE'),\n        hash: hash.substring(0, 7),\n      };\n    }\n\n    const [, type, scopeMatch, description] = match;\n    const scope = scopeMatch ? scopeMatch.slice(1, -1) : undefined;\n    const breaking = subject.includes('!') || body.includes('BREAKING CHANGE');\n\n    return {\n      type,\n      scope,\n      description,\n      body,\n      breaking,\n      hash: hash.substring(0, 7),\n    };\n  }\n\n  /**\n   * Categorize commits into changelog sections\n   */\n  static categorizeCommits(commits: ConventionalCommit[]): ChangelogEntry['sections'] {\n    const sections: ChangelogEntry['sections'] = {\n      added: [],\n      changed: [],\n      deprecated: [],\n      removed: [],\n      fixed: [],\n      security: [],\n    };\n\n    for (const commit of commits) {\n      const entry = commit.scope\n        ? `**${commit.scope}**: ${commit.description} (${commit.hash})`\n        : `${commit.description} (${commit.hash})`;\n\n      switch (commit.type) {\n        case 'feat':\n          sections.added.push(entry);\n          break;\n        case 'fix':\n          sections.fixed.push(entry);\n          break;\n        case 'perf':\n          sections.changed.push(entry);\n          break;\n        case 'refactor':\n          sections.changed.push(entry);\n          break;\n        case 'docs':\n          sections.changed.push(entry);\n          break;\n        case 'style':\n          sections.changed.push(entry);\n          break;\n        case 'test':\n          sections.changed.push(entry);\n          break;\n        case 'chore':\n          sections.changed.push(entry);\n          break;\n        case 'security':\n          sections.security.push(entry);\n          break;\n        default:\n          if (commit.breaking) {\n            sections.changed.push(entry);\n          } else {\n            sections.changed.push(entry);\n          }\n      }\n\n      // Handle breaking changes\n      if (commit.breaking) {\n        const breakingEntry = `**BREAKING**: ${commit.description} (${commit.hash})`;\n        if (!sections.changed.includes(breakingEntry)) {\n          sections.changed.unshift(breakingEntry);\n        }\n      }\n    }\n\n    return sections;\n  }\n\n  /**\n   * Generate changelog entry for current version\n   */\n  static generateChangelogEntry(version?: string, since?: string): ChangelogEntry {\n    const currentVersion = version || VersionManager.getVersion().version;\n    const commits = ChangelogManager.parseCommits(since);\n    const sections = ChangelogManager.categorizeCommits(commits);\n\n    return {\n      version: currentVersion,\n      date: new Date().toISOString().split('T')[0],\n      sections,\n    };\n  }\n\n  /**\n   * Format changelog entry as markdown\n   */\n  static formatChangelogEntry(entry: ChangelogEntry): string {\n    const lines: string[] = [];\n\n    lines.push(`## [${entry.version}] - ${entry.date}`);\n    lines.push('');\n\n    // Add each section if it has content\n    const sectionNames = {\n      added: 'Added',\n      changed: 'Changed',\n      deprecated: 'Deprecated',\n      removed: 'Removed',\n      fixed: 'Fixed',\n      security: 'Security',\n    };\n\n    for (const [key, title] of Object.entries(sectionNames)) {\n      const items = entry.sections[key as keyof typeof entry.sections];\n      if (items.length > 0) {\n        lines.push(`### ${title}`);\n        for (const item of items) {\n          lines.push(`- ${item}`);\n        }\n        lines.push('');\n      }\n    }\n\n    return lines.join('\\n');\n  }\n\n  /**\n   * Generate or update CHANGELOG.md\n   */\n  static generateChangelog(version?: string, since?: string): void {\n    const projectRoot = ChangelogManager.getProjectRoot();\n    const changelogPath = path.join(projectRoot, ChangelogManager.CHANGELOG_FILE);\n\n    const entry = ChangelogManager.generateChangelogEntry(version, since);\n    const entryMarkdown = ChangelogManager.formatChangelogEntry(entry);\n\n    let changelogContent = '';\n\n    if (fs.existsSync(changelogPath)) {\n      // Read existing changelog\n      const existingContent = fs.readFileSync(changelogPath, 'utf8');\n\n      // Find where to insert the new entry\n      const headerEndIndex = existingContent.indexOf('\\n## ');\n      if (headerEndIndex !== -1) {\n        const header = existingContent.substring(0, headerEndIndex + 1);\n        const rest = existingContent.substring(headerEndIndex + 1);\n        changelogContent = `${header + entryMarkdown}\\n${rest}`;\n      } else {\n        changelogContent = `${existingContent}\\n${entryMarkdown}`;\n      }\n    } else {\n      // Create new changelog\n      changelogContent = ChangelogManager.createChangelogHeader() + entryMarkdown;\n    }\n\n    fs.writeFileSync(changelogPath, changelogContent);\n  }\n\n  /**\n   * Create changelog header\n   */\n  private static createChangelogHeader(): string {\n    return `# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n`;\n  }\n\n  /**\n   * Get the latest version from CHANGELOG.md\n   */\n  static getLatestChangelogVersion(): string | null {\n    const projectRoot = ChangelogManager.getProjectRoot();\n    const changelogPath = path.join(projectRoot, ChangelogManager.CHANGELOG_FILE);\n\n    if (!fs.existsSync(changelogPath)) {\n      return null;\n    }\n\n    const content = fs.readFileSync(changelogPath, 'utf8');\n    const versionMatch = content.match(/## \\[([^\\]]+)\\]/);\n\n    return versionMatch ? versionMatch[1] : null;\n  }\n}\n","import { Command } from 'commander';\nimport { ChangelogManager } from '../../utils/changelog.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { GitManager } from '../../utils/git.js';\nimport { VersionManager } from '../../utils/version.js';\n\nexport function createBumpCommand(): Command {\n  const command = new Command('bump');\n\n  command\n    .description('Bump version following semantic versioning')\n    .argument('<type>', 'version bump type (major, minor, patch)')\n    .option('--no-changelog', 'skip changelog generation')\n    .option('--no-commit', 'skip git commit')\n    .option('--dry-run', 'show what would be done without making changes')\n    .option('--message <msg>', 'custom commit message')\n    .action(async (type: string, options) => {\n      try {\n        // Validate bump type\n        if (!['major', 'minor', 'patch'].includes(type)) {\n          console.error(Formatter.error('Invalid bump type. Must be: major, minor, or patch'));\n          process.exit(1);\n        }\n\n        const currentVersion = VersionManager.getVersion();\n\n        // Check for uncommitted changes\n        if (\n          GitManager.isGitRepository() &&\n          GitManager.hasUncommittedChanges() &&\n          !options.noCommit\n        ) {\n          console.error(\n            Formatter.error('Uncommitted changes detected. Please commit or stash changes first.')\n          );\n          process.exit(1);\n        }\n\n        if (options.dryRun) {\n          console.log(Formatter.info('🔍 Dry run mode - no changes will be made'));\n\n          // Simulate version bump\n          const semver = await import('semver');\n          const newVersion = semver.inc(currentVersion.version, type as any);\n\n          console.log(Formatter.info(`📦 Current version: ${currentVersion.version}`));\n          console.log(Formatter.info(`🚀 New version: ${newVersion}`));\n\n          if (!options.noChangelog) {\n            console.log(Formatter.info('📝 Would generate changelog entry'));\n          }\n\n          if (!options.noCommit && GitManager.isGitRepository()) {\n            console.log(Formatter.info('📝 Would commit changes to git'));\n          }\n\n          return;\n        }\n\n        console.log(Formatter.info(`📦 Bumping version from ${currentVersion.version}...`));\n\n        // Get last tag for changelog generation\n        const lastTag = GitManager.getLastTag();\n\n        // Bump version\n        const newVersion = VersionManager.bumpVersion(type as 'major' | 'minor' | 'patch');\n        console.log(Formatter.success(`🚀 Version bumped to ${newVersion.version}`));\n\n        // Sync version across files\n        VersionManager.syncVersion();\n        console.log(Formatter.success('🔄 Version synchronized across all files'));\n\n        // Generate changelog\n        if (!options.noChangelog) {\n          const since = lastTag || undefined;\n          ChangelogManager.generateChangelog(newVersion.version, since);\n          console.log(Formatter.success('📝 Changelog updated'));\n        }\n\n        // Commit changes\n        if (!options.noCommit && GitManager.isGitRepository()) {\n          const commitMessage = options.message || `chore: bump version to ${newVersion.version}`;\n\n          const filesToCommit = ['VERSION', 'package.json'];\n          if (!options.noChangelog) {\n            filesToCommit.push('CHANGELOG.md');\n          }\n\n          GitManager.commit(commitMessage, filesToCommit);\n          console.log(Formatter.success(`📝 Changes committed: ${commitMessage}`));\n        }\n\n        console.log('');\n        console.log(Formatter.success(`✅ Version bump complete!`));\n        console.log(Formatter.info(`   Previous: ${currentVersion.version}`));\n        console.log(Formatter.info(`   Current:  ${newVersion.version}`));\n\n        if (GitManager.isGitRepository()) {\n          console.log('');\n          console.log(Formatter.info('💡 Next steps:'));\n          console.log(Formatter.info('   - Review the changes'));\n          console.log(Formatter.info(`   - Create a release tag: trackdown version tag`));\n          console.log(\n            Formatter.info(`   - Push changes: git push origin ${GitManager.getCurrentBranch()}`)\n          );\n        }\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to bump version: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","import { Command } from 'commander';\nimport { ChangelogManager } from '../../utils/changelog.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { GitManager } from '../../utils/git.js';\nimport { VersionManager } from '../../utils/version.js';\n\nexport function createChangelogCommand(): Command {\n  const command = new Command('changelog');\n\n  command\n    .description('Generate or update CHANGELOG.md')\n    .option(\n      '--since <ref>',\n      'generate changelog since a specific git reference (tag, commit, etc.)'\n    )\n    .option('--version <version>', 'specify version for the changelog entry')\n    .option('--dry-run', 'show what would be generated without writing to file')\n    .option('--format <format>', 'output format (markdown, json)', 'markdown')\n    .action(async (options) => {\n      try {\n        if (!GitManager.isGitRepository()) {\n          console.warn(\n            Formatter.warning('Not in a git repository. Changelog generation may be limited.')\n          );\n        }\n\n        const version = options.version || VersionManager.getVersion().version;\n        const since = options.since || GitManager.getLastTag() || undefined;\n\n        console.log(Formatter.info(`📝 Generating changelog for version ${version}...`));\n\n        if (since) {\n          console.log(Formatter.info(`📅 Including changes since: ${since}`));\n        }\n\n        // Generate changelog entry\n        const entry = ChangelogManager.generateChangelogEntry(version, since);\n\n        if (options.format === 'json') {\n          if (options.dryRun) {\n            console.log('📄 Generated changelog entry (JSON):');\n            console.log(JSON.stringify(entry, null, 2));\n          } else {\n            console.log(JSON.stringify(entry, null, 2));\n          }\n          return;\n        }\n\n        // Format as markdown\n        const markdown = ChangelogManager.formatChangelogEntry(entry);\n\n        if (options.dryRun) {\n          console.log('📄 Generated changelog entry:');\n          console.log('');\n          console.log(markdown);\n          return;\n        }\n\n        // Write to CHANGELOG.md\n        ChangelogManager.generateChangelog(version, since);\n\n        console.log(Formatter.success('✅ CHANGELOG.md updated successfully!'));\n\n        // Show summary\n        const totalChanges = Object.values(entry.sections).reduce(\n          (sum, items) => sum + items.length,\n          0\n        );\n        console.log(Formatter.info(`📊 Summary:`));\n        console.log(Formatter.info(`   - Version: ${entry.version}`));\n        console.log(Formatter.info(`   - Date: ${entry.date}`));\n        console.log(Formatter.info(`   - Total changes: ${totalChanges}`));\n\n        // Show section breakdown\n        const sectionNames = {\n          added: 'Added',\n          changed: 'Changed',\n          deprecated: 'Deprecated',\n          removed: 'Removed',\n          fixed: 'Fixed',\n          security: 'Security',\n        };\n\n        for (const [key, name] of Object.entries(sectionNames)) {\n          const count = entry.sections[key as keyof typeof entry.sections].length;\n          if (count > 0) {\n            console.log(Formatter.info(`   - ${name}: ${count} items`));\n          }\n        }\n\n        console.log('');\n        console.log(Formatter.info('💡 Tip: Review CHANGELOG.md and edit manually if needed'));\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to generate changelog: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","import { Command } from 'commander';\nimport { ChangelogManager } from '../../utils/changelog.js';\nimport { Formatter } from '../../utils/formatter.js';\nimport { GitManager } from '../../utils/git.js';\nimport { VersionManager } from '../../utils/version.js';\n\nexport function createReleaseCommand(): Command {\n  const command = new Command('release');\n\n  command\n    .description('Create a complete release with version bump, changelog, and git tag')\n    .argument('[type]', 'version bump type (major, minor, patch)', 'patch')\n    .option('--no-changelog', 'skip changelog generation')\n    .option('--no-commit', 'skip git commit')\n    .option('--no-tag', 'skip git tag creation')\n    .option('--push', 'push changes and tags to remote')\n    .option('--dry-run', 'show what would be done without making changes')\n    .option('--message <msg>', 'custom release message')\n    .action(async (type: string, options) => {\n      try {\n        // Validate bump type\n        if (!['major', 'minor', 'patch'].includes(type)) {\n          console.error(Formatter.error('Invalid release type. Must be: major, minor, or patch'));\n          process.exit(1);\n        }\n\n        const currentVersion = VersionManager.getVersion();\n\n        // Pre-flight checks\n        if (GitManager.isGitRepository()) {\n          if (GitManager.hasUncommittedChanges() && !options.noCommit) {\n            console.error(\n              Formatter.error('Uncommitted changes detected. Please commit or stash changes first.')\n            );\n            process.exit(1);\n          }\n        } else {\n          console.warn(\n            Formatter.warning('Not in a git repository. Git operations will be skipped.')\n          );\n          options.noCommit = true;\n          options.noTag = true;\n        }\n\n        // Calculate new version\n        const semver = await import('semver');\n        const newVersion = semver.inc(currentVersion.version, type as any);\n\n        if (!newVersion) {\n          throw new Error(`Could not calculate new version from ${currentVersion.version}`);\n        }\n\n        console.log(Formatter.info('🚀 Starting release process...'));\n        console.log('');\n\n        if (options.dryRun) {\n          console.log(Formatter.info('🔍 Dry run mode - no changes will be made'));\n          console.log('');\n          console.log(Formatter.info('📋 Release plan:'));\n          console.log(Formatter.info(`   📦 Current version: ${currentVersion.version}`));\n          console.log(Formatter.info(`   🎯 New version: ${newVersion}`));\n\n          if (!options.noChangelog) {\n            console.log(Formatter.info('   📝 Generate changelog'));\n          }\n\n          if (!options.noCommit && GitManager.isGitRepository()) {\n            console.log(Formatter.info('   📝 Commit changes'));\n          }\n\n          if (!options.noTag && GitManager.isGitRepository()) {\n            console.log(Formatter.info(`   🏷️  Create tag v${newVersion}`));\n          }\n\n          if (options.push && GitManager.isGitRepository()) {\n            console.log(Formatter.info('   📤 Push to remote'));\n          }\n\n          return;\n        }\n\n        // Step 1: Bump version\n        console.log(\n          Formatter.info(`📦 Bumping version from ${currentVersion.version} to ${newVersion}...`)\n        );\n        VersionManager.bumpVersion(type as 'major' | 'minor' | 'patch');\n        VersionManager.syncVersion();\n        console.log(Formatter.success('✅ Version updated'));\n\n        // Step 2: Generate changelog\n        if (!options.noChangelog) {\n          console.log(Formatter.info('📝 Generating changelog...'));\n          const lastTag = GitManager.getLastTag();\n          const since = lastTag || undefined;\n          ChangelogManager.generateChangelog(newVersion, since);\n          console.log(Formatter.success('✅ Changelog updated'));\n        }\n\n        // Step 3: Commit changes\n        if (!options.noCommit && GitManager.isGitRepository()) {\n          console.log(Formatter.info('📝 Committing changes...'));\n\n          const commitMessage = options.message || `chore: release version ${newVersion}`;\n          const filesToCommit = ['VERSION', 'package.json'];\n\n          if (!options.noChangelog) {\n            filesToCommit.push('CHANGELOG.md');\n          }\n\n          GitManager.commit(commitMessage, filesToCommit);\n          console.log(Formatter.success('✅ Changes committed'));\n        }\n\n        // Step 4: Create tag\n        if (!options.noTag && GitManager.isGitRepository()) {\n          console.log(Formatter.info(`🏷️  Creating tag v${newVersion}...`));\n\n          const tagMessage = `Release version ${newVersion}`;\n          GitManager.createTag(newVersion, tagMessage);\n          console.log(Formatter.success('✅ Tag created'));\n        }\n\n        // Step 5: Push to remote\n        if (options.push && GitManager.isGitRepository()) {\n          console.log(Formatter.info('📤 Pushing to remote...'));\n\n          try {\n            const { execSync } = await import('node:child_process');\n            const currentBranch = GitManager.getCurrentBranch();\n\n            // Push commits\n            execSync(`git push origin ${currentBranch}`);\n            console.log(Formatter.success('✅ Commits pushed'));\n\n            // Push tags\n            if (!options.noTag) {\n              GitManager.pushTags();\n              console.log(Formatter.success('✅ Tags pushed'));\n            }\n          } catch (error) {\n            console.error(Formatter.error(`Failed to push to remote: ${error}`));\n            console.log(Formatter.info('💡 You can push manually later'));\n          }\n        }\n\n        // Success summary\n        console.log('');\n        console.log(Formatter.success('🎉 Release completed successfully!'));\n        console.log('');\n        console.log(Formatter.info('📋 Release summary:'));\n        console.log(Formatter.info(`   📦 Version: ${currentVersion.version} → ${newVersion}`));\n        console.log(Formatter.info(`   📅 Date: ${new Date().toISOString().split('T')[0]}`));\n\n        if (!options.noChangelog) {\n          console.log(Formatter.info('   📝 Changelog: Updated'));\n        }\n\n        if (!options.noCommit && GitManager.isGitRepository()) {\n          console.log(Formatter.info('   📝 Git: Changes committed'));\n        }\n\n        if (!options.noTag && GitManager.isGitRepository()) {\n          console.log(Formatter.info(`   🏷️  Tag: v${newVersion} created`));\n        }\n\n        // Next steps\n        if (!options.push && GitManager.isGitRepository()) {\n          console.log('');\n          console.log(Formatter.info('💡 Next steps:'));\n          console.log(\n            Formatter.info(`   - Push changes: git push origin ${GitManager.getCurrentBranch()}`)\n          );\n\n          if (!options.noTag) {\n            console.log(Formatter.info(`   - Push tags: git push origin v${newVersion}`));\n          }\n\n          console.log(Formatter.info('   - Create GitHub release from the tag'));\n        }\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Release failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","import { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\nimport { VersionManager } from '../../utils/version.js';\n\nexport function createShowCommand(): Command {\n  const command = new Command('show');\n\n  command\n    .description('Display current version information')\n    .option('--json', 'output as JSON')\n    .option('--check-consistency', 'check version consistency across files')\n    .action(async (options) => {\n      try {\n        const versionInfo = VersionManager.getVersion();\n\n        if (options.json) {\n          if (options.checkConsistency) {\n            const consistency = VersionManager.validateVersionConsistency();\n            console.log(\n              JSON.stringify(\n                {\n                  ...versionInfo,\n                  consistency,\n                },\n                null,\n                2\n              )\n            );\n          } else {\n            console.log(JSON.stringify(versionInfo, null, 2));\n          }\n          return;\n        }\n\n        // Pretty output\n        console.log(Formatter.success(`📦 AI Trackdown CLI v${versionInfo.version}`));\n        console.log(Formatter.info(`   Major: ${versionInfo.major}`));\n        console.log(Formatter.info(`   Minor: ${versionInfo.minor}`));\n        console.log(Formatter.info(`   Patch: ${versionInfo.patch}`));\n\n        if (options.checkConsistency) {\n          console.log('');\n          const consistency = VersionManager.validateVersionConsistency();\n\n          if (consistency.consistent) {\n            console.log(Formatter.success('✅ Version consistency check passed'));\n          } else {\n            console.log(Formatter.error('❌ Version inconsistency detected:'));\n            for (const [file, version] of Object.entries(consistency.versions)) {\n              const status = version === versionInfo.version ? '✅' : '❌';\n              console.log(Formatter.info(`   ${file}: ${version} ${status}`));\n            }\n          }\n        }\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to get version: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","import { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\nimport { VersionManager } from '../../utils/version.js';\n\nexport function createSyncCommand(): Command {\n  const command = new Command('sync');\n\n  command\n    .description('Synchronize version across all files')\n    .option('--check-only', 'only check consistency without making changes')\n    .option('--verbose', 'show detailed information about each file')\n    .action(async (options) => {\n      try {\n        console.log(Formatter.info('🔄 Checking version consistency...'));\n\n        // Check current consistency\n        const consistency = VersionManager.validateVersionConsistency();\n        const versionInfo = VersionManager.getVersion();\n\n        if (options.verbose || options.checkOnly) {\n          console.log(Formatter.info(`📦 Source version (VERSION file): ${versionInfo.version}`));\n          console.log('');\n\n          for (const [file, version] of Object.entries(consistency.versions)) {\n            const status = version === versionInfo.version ? '✅' : '❌';\n            const message = version === versionInfo.version ? 'synchronized' : 'needs update';\n            console.log(Formatter.info(`   ${file}: ${version} ${status} (${message})`));\n          }\n        }\n\n        if (consistency.consistent) {\n          console.log(Formatter.success('✅ All files are already synchronized!'));\n          return;\n        }\n\n        if (options.checkOnly) {\n          console.log('');\n          console.log(Formatter.error('❌ Version inconsistency detected.'));\n          console.log(Formatter.info('Run without --check-only to fix the inconsistencies.'));\n          process.exit(1);\n        }\n\n        console.log('');\n        console.log(Formatter.warning('⚠️  Version inconsistency detected. Synchronizing...'));\n\n        // Perform synchronization\n        VersionManager.syncVersion();\n\n        // Verify synchronization\n        const newConsistency = VersionManager.validateVersionConsistency();\n\n        if (newConsistency.consistent) {\n          console.log(Formatter.success('✅ Version synchronization completed successfully!'));\n\n          if (options.verbose) {\n            console.log('');\n            console.log(Formatter.info('📋 Updated files:'));\n            for (const [file, version] of Object.entries(newConsistency.versions)) {\n              console.log(Formatter.info(`   ${file}: ${version} ✅`));\n            }\n          }\n\n          console.log('');\n          console.log(Formatter.info(`🎯 All files now use version: ${versionInfo.version}`));\n        } else {\n          console.log(\n            Formatter.error('❌ Synchronization failed. Some files could not be updated.')\n          );\n\n          console.log('');\n          console.log(Formatter.info('📋 Current status:'));\n          for (const [file, version] of Object.entries(newConsistency.versions)) {\n            const status = version === versionInfo.version ? '✅' : '❌';\n            console.log(Formatter.info(`   ${file}: ${version} ${status}`));\n          }\n\n          process.exit(1);\n        }\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to synchronize versions: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","import { execSync } from 'node:child_process';\nimport { Command } from 'commander';\nimport { Formatter } from '../../utils/formatter.js';\nimport { GitManager } from '../../utils/git.js';\nimport { VersionManager } from '../../utils/version.js';\n\nexport function createTagCommand(): Command {\n  const command = new Command('tag');\n\n  command\n    .description('Create a git tag for the current version')\n    .option('--push', 'push the tag to remote repository')\n    .option('--message <msg>', 'custom tag message')\n    .option('--dry-run', 'show what would be done without creating the tag')\n    .option('--force', 'force create tag even if it exists')\n    .action(async (options) => {\n      try {\n        if (!GitManager.isGitRepository()) {\n          console.error(Formatter.error('Not in a git repository. Cannot create tags.'));\n          process.exit(1);\n        }\n\n        const versionInfo = VersionManager.getVersion();\n        const tagName = `v${versionInfo.version}`;\n        const tagMessage = options.message || `Release version ${versionInfo.version}`;\n\n        console.log(Formatter.info(`🏷️  Creating tag ${tagName}...`));\n\n        // Check if tag already exists\n        if (GitManager.tagExists(tagName) && !options.force) {\n          console.error(\n            Formatter.error(`Tag ${tagName} already exists. Use --force to recreate it.`)\n          );\n          process.exit(1);\n        }\n\n        // Check for uncommitted changes\n        if (GitManager.hasUncommittedChanges()) {\n          console.warn(Formatter.warning('⚠️  Warning: You have uncommitted changes.'));\n          console.log(Formatter.info('Consider committing changes before creating a release tag.'));\n        }\n\n        if (options.dryRun) {\n          console.log(Formatter.info('🔍 Dry run mode - no tag will be created'));\n          console.log(Formatter.info(`Tag name: ${tagName}`));\n          console.log(Formatter.info(`Tag message: ${tagMessage}`));\n\n          if (options.push) {\n            console.log(Formatter.info('Would push tag to remote repository'));\n          }\n\n          return;\n        }\n\n        // Create the tag\n        try {\n          GitManager.createTag(versionInfo.version, tagMessage);\n          console.log(Formatter.success(`✅ Tag ${tagName} created successfully!`));\n        } catch (error) {\n          if (options.force && error instanceof Error && error.message.includes('already exists')) {\n            // Delete existing tag and recreate\n            console.log(Formatter.warning(`🔄 Recreating existing tag ${tagName}...`));\n            try {\n              // Delete local tag\n              execSync(`git tag -d ${tagName}`, { stdio: 'ignore' });\n              GitManager.createTag(versionInfo.version, tagMessage);\n              console.log(Formatter.success(`✅ Tag ${tagName} recreated successfully!`));\n            } catch (recreateError) {\n              throw new Error(`Failed to recreate tag: ${recreateError}`);\n            }\n          } else {\n            throw error;\n          }\n        }\n\n        // Push tag if requested\n        if (options.push) {\n          console.log(Formatter.info('📤 Pushing tag to remote repository...'));\n          try {\n            GitManager.pushTags();\n            console.log(Formatter.success('✅ Tag pushed successfully!'));\n          } catch (error) {\n            console.error(\n              Formatter.error(\n                `Failed to push tag: ${error instanceof Error ? error.message : 'Unknown error'}`\n              )\n            );\n            console.log(\n              Formatter.info(`💡 You can push manually later with: git push origin ${tagName}`)\n            );\n          }\n        }\n\n        // Show tag info\n        console.log('');\n        console.log(Formatter.success('🎉 Tag created successfully!'));\n        console.log(Formatter.info(`   Tag: ${tagName}`));\n        console.log(Formatter.info(`   Message: ${tagMessage}`));\n        console.log(Formatter.info(`   Branch: ${GitManager.getCurrentBranch()}`));\n\n        if (!options.push) {\n          console.log('');\n          console.log(Formatter.info('💡 Next steps:'));\n          console.log(Formatter.info(`   - Push the tag: git push origin ${tagName}`));\n          console.log(Formatter.info('   - Create a GitHub release from this tag'));\n        }\n\n        // Show all tags for reference\n        const allTags = GitManager.getTags();\n        if (allTags.length > 1) {\n          console.log('');\n          console.log(Formatter.info('📋 All tags:'));\n          allTags.slice(-5).forEach((tag) => {\n            const indicator = tag === tagName ? ' ← current' : '';\n            console.log(Formatter.info(`   ${tag}${indicator}`));\n          });\n\n          if (allTags.length > 5) {\n            console.log(Formatter.info(`   ... and ${allTags.length - 5} more`));\n          }\n        }\n      } catch (error) {\n        console.error(\n          Formatter.error(\n            `Failed to create tag: ${error instanceof Error ? error.message : 'Unknown error'}`\n          )\n        );\n        process.exit(1);\n      }\n    });\n\n  return command;\n}\n","import { Command } from 'commander';\nimport { createBumpCommand } from './version/bump.js';\nimport { createChangelogCommand } from './version/changelog.js';\nimport { createReleaseCommand } from './version/release.js';\nimport { createShowCommand } from './version/show.js';\nimport { createSyncCommand } from './version/sync.js';\nimport { createTagCommand } from './version/tag.js';\n\nexport function createVersionCommand(): Command {\n  const command = new Command('version');\n\n  command.description('Version management commands').addHelpText(\n    'after',\n    `\nExamples:\n  $ aitrackdown version show                    # Display current version\n  $ aitrackdown version bump patch             # Bump patch version (0.1.0 → 0.1.1)\n  $ aitrackdown version bump minor             # Bump minor version (0.1.0 → 0.2.0)\n  $ aitrackdown version bump major             # Bump major version (0.1.0 → 1.0.0)\n  $ aitrackdown version changelog generate     # Generate/update CHANGELOG.md\n  $ aitrackdown version tag --push             # Create and push git tag\n  $ aitrackdown version sync                   # Sync version across all files\n  $ aitrackdown version release minor --push   # Complete release process\n\nVersion Management:\n  This tool follows semantic versioning (semver.org) and conventional commits.\n  The VERSION file is the source of truth for the project version.\n    `\n  );\n\n  // Add subcommands\n  command.addCommand(createShowCommand());\n  command.addCommand(createBumpCommand());\n  command.addCommand(createChangelogCommand());\n  command.addCommand(createTagCommand());\n  command.addCommand(createSyncCommand());\n  command.addCommand(createReleaseCommand());\n\n  return command;\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { createAiCommand } from './commands/ai.js';\nimport { createBacklogCommand } from './commands/backlog.js';\nimport { createBacklogEnhancedCommand } from './commands/backlog-enhanced.js';\nimport { createEpicCommand } from './commands/epic.js';\nimport { createExportCommand } from './commands/export.js';\nimport { createHealthCommand } from './commands/health.js';\nimport { createIndexHealthCommand } from './commands/index-health.js';\nimport { createInitCommand } from './commands/init.js';\nimport { createIssueCommand } from './commands/issue.js';\nimport { createMigrateCommand } from './commands/migrate.js';\nimport { createMigrateStructureCommand } from './commands/migrate-structure.js';\nimport { createResolveCommand } from './commands/resolve.js';\nimport { createStateCommand } from './commands/state.js';\nimport { createMigrateStateCommand } from './commands/migrate-state.js';\nimport { createPortfolioCommand } from './commands/portfolio.js';\nimport { createPRCommand } from './commands/pr.js';\nimport { createProjectCommand } from './commands/project.js';\nimport { createStatusCommand } from './commands/status.js';\nimport { createStatusEnhancedCommand } from './commands/status-enhanced.js';\nimport { createSyncCommand } from './commands/sync.js';\nimport { createTaskCommand } from './commands/task.js';\nimport { createTrackCommand } from './commands/track.js';\nimport { createVersionCommand } from './commands/version.js';\nimport { Formatter } from './utils/formatter.js';\nimport { VersionManager } from './utils/version.js';\n\n// Get version from VERSION file\nfunction getVersion(): string {\n  try {\n    return VersionManager.getVersion().version;\n  } catch (_error) {\n    console.warn('Warning: Could not read VERSION file, using fallback version');\n    return '1.0.1'; // fallback that matches package.json\n  }\n}\n\n// Package info\nconst packageInfo = {\n  name: 'ai-trackdown-tools',\n  version: getVersion(),\n  description: 'Professional CLI tool for ai-trackdown functionality',\n};\n\nasync function main(): Promise<void> {\n  const program = new Command();\n\n  // Configure main program\n  program\n    .name('aitrackdown')\n    .description(packageInfo.description)\n    .version(packageInfo.version, '-v, --version', 'display version number')\n    .helpOption('-h, --help', 'display help for command');\n\n  // Add global options\n  program\n    .option('--verbose', 'enable verbose output')\n    .option('--config <path>', 'path to config file')\n    .option('--no-color', 'disable colored output')\n    .option('--root-dir <path>', 'root directory for trackdown files (default: tasks/)')\n    .option('--tasks-dir <path>', 'alias for --root-dir')\n    .option('--project-dir <path>', 'target project directory for anywhere-submit functionality');\n\n  // Handle global options\n  program.hook('preAction', (thisCommand) => {\n    const opts = program.opts();\n\n    // Handle no-color option\n    if (opts.noColor) {\n      process.env.FORCE_COLOR = '0';\n    }\n\n    // Handle project directory option (--project-dir)\n    if (opts.projectDir) {\n      process.env.CLI_PROJECT_DIR = opts.projectDir;\n      // Change working directory to target project\n      try {\n        process.chdir(opts.projectDir);\n      } catch (error) {\n        console.error(Formatter.error(`Failed to change to project directory: ${opts.projectDir}`));\n        console.error(Formatter.error(error instanceof Error ? error.message : 'Unknown error'));\n        process.exit(1);\n      }\n    }\n\n    // Handle tasks directory options (--root-dir or --tasks-dir)\n    const tasksDir = opts.tasksDir || opts.rootDir;\n    if (tasksDir) {\n      process.env.CLI_TASKS_DIR = tasksDir;\n    }\n\n    // Handle verbose option\n    if (opts.verbose) {\n      console.log(Formatter.debug(`Running command: ${thisCommand.name()}`));\n      console.log(Formatter.debug(`Arguments: ${JSON.stringify(thisCommand.args)}`));\n      console.log(Formatter.debug(`Options: ${JSON.stringify(thisCommand.opts())}`));\n      if (opts.projectDir) {\n        console.log(Formatter.debug(`Project directory: ${opts.projectDir}`));\n      }\n      if (tasksDir) {\n        console.log(Formatter.debug(`Tasks directory override: ${tasksDir}`));\n      }\n    }\n  });\n\n  // Add core commands\n  program.addCommand(createInitCommand());\n  program.addCommand(createTrackCommand());\n  program.addCommand(createStatusCommand());\n  program.addCommand(createStatusEnhancedCommand());\n  program.addCommand(createBacklogCommand());\n  program.addCommand(createBacklogEnhancedCommand());\n  program.addCommand(createPortfolioCommand());\n  program.addCommand(createExportCommand());\n  program.addCommand(createVersionCommand());\n  program.addCommand(createHealthCommand());\n  program.addCommand(createIndexHealthCommand());\n\n  // AI-Trackdown hierarchical commands\n  program.addCommand(createProjectCommand());\n  program.addCommand(createEpicCommand());\n  program.addCommand(createIssueCommand());\n  program.addCommand(createTaskCommand());\n  program.addCommand(createPRCommand());\n  program.addCommand(createAiCommand());\n  program.addCommand(createSyncCommand());\n\n  // Migration commands\n  program.addCommand(createMigrateCommand());\n  program.addCommand(createMigrateStructureCommand());\n  program.addCommand(createMigrateStateCommand());\n\n  // State management commands\n  program.addCommand(createResolveCommand());\n  program.addCommand(createStateCommand());\n\n  // Add helpful aliases\n  program\n    .command('atd')\n    .alias('aitrackdown')\n    .description('alias for aitrackdown command')\n    .action(() => {\n      console.log(Formatter.info('Use \"aitrackdown --help\" to see available commands'));\n    });\n\n  // Handle unknown commands\n  program.on('command:*', (operands) => {\n    console.error(Formatter.error(`Unknown command: ${operands[0]}`));\n    console.log(Formatter.info('Run \"aitrackdown --help\" to see available commands'));\n    process.exit(1);\n  });\n\n  // Custom help\n  program.on('--help', () => {\n    console.log('');\n    console.log(chalk.bold.cyan('🚀 AI-Trackdown CLI - Comprehensive Project Management Tool'));\n    console.log('');\n    console.log(chalk.bold.yellow('📋 HIERARCHICAL STRUCTURE:'));\n    console.log('  Epics → Issues → Tasks → PRs (Pull Requests)');\n    console.log('  Each level tracks tokens, progress, and relationships');\n    console.log('');\n    console.log(chalk.bold.cyan('🏗️ HIERARCHICAL COMMANDS:'));\n    console.log('  Epic Management:');\n    console.log('    $ aitrackdown epic create \"User Authentication System\"');\n    console.log('    $ aitrackdown epic list --status active --show-progress');\n    console.log('    $ aitrackdown epic show EP-0001 --with-issues');\n    console.log('    $ aitrackdown epic complete EP-0001 --actual-tokens 1500');\n    console.log('');\n    console.log('  Issue Management:');\n    console.log('    $ aitrackdown issue create \"Implement login form\" --epic EP-0001');\n    console.log('    $ aitrackdown issue list --epic EP-0001 --status active');\n    console.log('    $ aitrackdown issue complete ISS-0001 --actual-tokens 500');\n    console.log('    $ aitrackdown issue assign ISS-0001 --assignee john');\n    console.log('');\n    console.log('  Task Management:');\n    console.log('    $ aitrackdown task create \"Create login UI\" --issue ISS-0001');\n    console.log('    $ aitrackdown task list --issue ISS-0001 --assignee john');\n    console.log('    $ aitrackdown task complete TSK-0001 --time-spent 2h');\n    console.log('    $ aitrackdown task update TSK-0001 --status active');\n    console.log('');\n    console.log('  PR Management:');\n    console.log('    $ aitrackdown pr create \"Add login functionality\" --issue ISS-0001');\n    console.log('    $ aitrackdown pr list --status open --assignee john');\n    console.log('    $ aitrackdown pr merge PR-0001 --delete-branch');\n    console.log('    $ aitrackdown pr review PR-0001 --approve --comment \"LGTM\"');\n    console.log('');\n    console.log('  GitHub Sync:');\n    console.log('    $ aitrackdown sync setup --repository owner/repo --token ghp_xxx');\n    console.log('    $ aitrackdown sync push --verbose');\n    console.log('    $ aitrackdown sync pull --dry-run');\n    console.log('    $ aitrackdown sync bidirectional');\n    console.log('    $ aitrackdown sync status --verbose');\n    console.log('    $ aitrackdown sync auto --enable');\n    console.log('');\n    console.log(chalk.bold.cyan('🤖 AI-SPECIFIC COMMANDS:'));\n    console.log('  Token Tracking:');\n    console.log('    $ aitrackdown ai track-tokens --report');\n    console.log('    $ aitrackdown ai generate-llms-txt --format detailed');\n    console.log('    $ aitrackdown ai context --item-id EP-0001 --add \"context/requirements\"');\n    console.log('');\n    console.log(chalk.bold.cyan('🎯 ANYWHERE-SUBMIT FUNCTIONALITY:'));\n    console.log('  Work with any project from anywhere:');\n    console.log('    $ aitrackdown issue create \"Fix bug\" --project-dir ~/Projects/my-app');\n    console.log('    $ aitrackdown task list --project-dir ~/Projects/managed/ai-power-rankings');\n    console.log('    $ aitrackdown status --project-dir ~/Projects/another-project');\n    console.log('');\n    console.log(chalk.bold.cyan('⚙️ CORE PROJECT COMMANDS:'));\n    console.log('  Project Setup:');\n    console.log('    $ aitrackdown init my-project');\n    console.log('    $ aitrackdown status --verbose');\n    console.log('    $ aitrackdown status --full');\n    console.log('');\n    console.log('  Data Management:');\n    console.log('    $ aitrackdown backlog --with-issues');\n    console.log('    $ aitrackdown portfolio --health');\n    console.log('    $ aitrackdown export --format json');\n    console.log('');\n    console.log(chalk.bold.cyan('🔄 STATE MANAGEMENT COMMANDS:'));\n    console.log('  Resolve items to completion states:');\n    console.log('    $ aitrackdown resolve engineering ISS-0001 --reason \"Development complete\"');\n    console.log('    $ aitrackdown resolve qa ISS-0001 --assignee \"john@example.com\"');\n    console.log('    $ aitrackdown resolve deployment ISS-0001 --reviewer \"jane@example.com\"');\n    console.log('    $ aitrackdown resolve done ISS-0001');\n    console.log('    $ aitrackdown resolve reject ISS-0001 --reason \"Out of scope\"');\n    console.log('');\n    console.log('  Query and update states:');\n    console.log('    $ aitrackdown state list --state ready_for_qa --show-state');\n    console.log('    $ aitrackdown state show ISS-0001 --show-transitions');\n    console.log('    $ aitrackdown state update ISS-0001 ready_for_deployment --reason \"QA passed\"');\n    console.log('    $ aitrackdown state analytics --verbose');\n    console.log('    $ aitrackdown state workflow --from active');\n    console.log('');\n    console.log('  Batch operations:');\n    console.log('    $ aitrackdown resolve batch-qa ISS-0001 ISS-0002 ISS-0003');\n    console.log('    $ aitrackdown state batch-update done ISS-0001 ISS-0002');\n    console.log('');\n    console.log(chalk.bold.cyan('🔄 MIGRATION COMMANDS:'));\n    console.log('  Legacy to Modern Structure:');\n    console.log('    $ aitrackdown migrate --dry-run --verbose');\n    console.log('    $ aitrackdown migrate --backup');\n    console.log('    $ aitrackdown migrate-structure --dry-run');\n    console.log('    $ aitrackdown migrate-structure --tasks-dir work');\n    console.log('');\n    console.log('  State Migration:');\n    console.log('    $ aitrackdown migrate-state preview --verbose');\n    console.log('    $ aitrackdown migrate-state --dry-run --backup');\n    console.log('    $ aitrackdown migrate-state validate');\n    console.log('    $ aitrackdown migrate-state status');\n    console.log('');\n    console.log(chalk.bold.cyan('⚡ ALIASES & SHORTCUTS:'));\n    console.log('  atd = aitrackdown (shorter command)');\n    console.log('  issue = issues, task = tasks, pr = prs');\n    console.log('');\n    console.log(chalk.bold.cyan('🔧 GLOBAL OPTIONS:'));\n    console.log('  --project-dir <path>    Target project directory (anywhere-submit)');\n    console.log('  --root-dir <path>       Root directory for trackdown files');\n    console.log('  --tasks-dir <path>      Alias for --root-dir');\n    console.log('  --verbose               Enable verbose output');\n    console.log('  --no-color              Disable colored output');\n    console.log('  --config <path>         Path to config file');\n    console.log('');\n    console.log(chalk.bold.cyan('📖 LEARN MORE:'));\n    console.log('  Documentation: https://github.com/bobmatnyc/ai-trackdown-tools');\n    console.log('  Issues: https://github.com/bobmatnyc/ai-trackdown-tools/issues');\n    console.log(`  Version: ${packageInfo.version}`);\n  });\n\n  // Error handling - only register in non-test environments to prevent accumulation\n  if (process.env.NODE_ENV !== 'test') {\n    // Remove any existing listeners to prevent accumulation\n    process.removeAllListeners('uncaughtException');\n    process.removeAllListeners('unhandledRejection');\n\n    process.on('uncaughtException', (error) => {\n      console.error(Formatter.error(`Uncaught exception: ${error.message}`));\n      if (program.opts().verbose) {\n        console.error(error.stack);\n      }\n      process.exit(1);\n    });\n\n    process.on('unhandledRejection', (reason) => {\n      console.error(Formatter.error(`Unhandled rejection: ${reason}`));\n      if (program.opts().verbose && reason instanceof Error) {\n        console.error(reason.stack);\n      }\n      process.exit(1);\n    });\n  }\n\n  // Parse arguments\n  try {\n    await program.parseAsync(process.argv);\n  } catch (error) {\n    console.error(\n      Formatter.error(`Command failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n    );\n\n    if (error instanceof Error) {\n      // Check for common error types and provide helpful suggestions\n      if (error.message.includes('EACCES')) {\n        console.log(Formatter.info('Permission denied. Try running with appropriate permissions.'));\n      } else if (error.message.includes('ENOENT')) {\n        console.log(Formatter.info('File or directory not found. Check the path and try again.'));\n      } else if (error.message.includes('EEXIST')) {\n        console.log(Formatter.info('File or directory already exists. Use --force to overwrite.'));\n      } else if (program.opts().verbose) {\n        console.error(error.stack);\n      }\n    }\n\n    process.exit(1);\n  }\n}\n\n// Export main function for CLI entry point\nexport { main };\n","// CLI entry point - direct execution\nasync function runCLI() {\n  try {\n    // Import main function dynamically to ensure all modules load correctly\n    const { main } = await import('./index.js');\n    await main();\n  } catch (error) {\n    console.error('CLI Error:', error instanceof Error ? error.message : String(error));\n    if (process.env.DEBUG) {\n      console.error(error instanceof Error ? error.stack : error);\n    }\n    process.exit(1);\n  }\n}\n\n// Execute CLI immediately\nrunCLI();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAKM,kBAMO;AAXb;AAAA;AAAA;AAKA,IAAM,mBAAmB,6BACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,OAClD,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE,MAJlB;AAMlB,IAAM,gBAAgC,iCAAiB;AAAA;AAAA;;;ACX9D,IAMA,gBACA,kBAkBa;AAzBb;AAAA;AAAA;AAAA;AAMA,qBAA2B;AAC3B,uBAAqB;AAkBd,IAAM,uBAAN,MAAM,qBAAoB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAER,YAAY,QAAuB,aAAqB,aAAsB;AAC5E,aAAK,SAAS;AACd,aAAK,cAAc;AACnB,aAAK,cAAc;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,wBAAgC;AAE9B,YAAI,KAAK,aAAa;AACpB,iBAAO,KAAK;AAAA,QACd;AAGA,cAAM,cAAc,QAAQ,IAAI,yBAAyB,QAAQ,IAAI;AACrE,YAAI,aAAa;AACf,iBAAO;AAAA,QACT;AAGA,YAAI,KAAK,OAAO,iBAAiB;AAC/B,iBAAO,KAAK,OAAO;AAAA,QACrB;AAGA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAgC;AAC9B,cAAM,YAAY,KAAK,sBAAsB;AAE7C,eAAO;AAAA,UACL,aAAa,KAAK;AAAA,UAClB,eAAW,uBAAK,KAAK,aAAa,eAAe;AAAA,UACjD,eAAW,uBAAK,KAAK,aAAa,SAAS;AAAA,UAC3C,cAAU,uBAAK,KAAK,aAAa,WAAW,KAAK,OAAO,UAAU,SAAS;AAAA,UAC3E,eAAW,uBAAK,KAAK,aAAa,WAAW,KAAK,OAAO,UAAU,UAAU;AAAA,UAC7E,cAAU,uBAAK,KAAK,aAAa,WAAW,KAAK,OAAO,UAAU,SAAS;AAAA,UAC3E,YAAQ,uBAAK,KAAK,aAAa,WAAW,KAAK,OAAO,UAAU,WAAW,KAAK;AAAA,UAChF,kBAAc,uBAAK,KAAK,aAAa,WAAW,KAAK,OAAO,UAAU,aAAa;AAAA,QACrF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,qBAAqB,MAA4D;AAC/E,cAAM,QAAQ,KAAK,gBAAgB;AAEnC,gBAAQ,MAAM;AAAA,UACZ,KAAK;AACH,uBAAO,uBAAK,MAAM,WAAW,UAAU;AAAA,UACzC,KAAK;AACH,mBAAO,MAAM;AAAA,UACf,KAAK;AACH,mBAAO,MAAM;AAAA,UACf,KAAK;AACH,mBAAO,MAAM;AAAA,UACf,KAAK;AACH,mBAAO,MAAM;AAAA,UACf;AACE,kBAAM,IAAI,MAAM,sBAAsB,IAAI,EAAE;AAAA,QAChD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,yBAAmC;AACjC,cAAM,QAAQ,KAAK,gBAAgB;AAEnC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,wBAIE;AACA,cAAM,aAAuB,CAAC;AAC9B,cAAM,cAAwB,CAAC;AAG/B,cAAM,sBAAsB;AAAA,cAC1B,uBAAK,KAAK,aAAa,OAAO;AAAA,cAC9B,uBAAK,KAAK,aAAa,QAAQ;AAAA,cAC/B,uBAAK,KAAK,aAAa,OAAO;AAAA,cAC9B,uBAAK,KAAK,aAAa,KAAK;AAAA,cAC5B,uBAAK,KAAK,aAAa,WAAW;AAAA;AAAA,QACpC;AAEA,mBAAW,OAAO,qBAAqB;AACrC,kBAAI,2BAAW,GAAG,GAAG;AACnB,uBAAW,KAAK,GAAG;AAAA,UACrB;AAAA,QACF;AAEA,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,YAAY,KAAK,sBAAsB;AAE7C,sBAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,SAAS;AAAA,YACrB,GAAG,WAAW,IAAI,CAAC,QAAQ;AACzB,oBAAM,UAAU,IAAI,MAAM,GAAG,EAAE,IAAI;AACnC,qBAAO,MAAM,OAAO,IAAI,SAAS,IAAI,OAAO;AAAA,YAC9C,CAAC;AAAA,YACD;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,WAAW,WAAW,SAAS;AAAA,UAC/B;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,uBAAiC;AAC/B,cAAM,SAAS,KAAK,sBAAsB;AAE1C,YAAI,CAAC,OAAO,WAAW;AACrB,iBAAO,CAAC;AAAA,QACV;AAEA,eAAO,OAAO;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,oBAIE;AACA,cAAM,SAAS,KAAK,gBAAgB;AACpC,cAAM,SAAmB,CAAC;AAC1B,cAAM,cAAwB,CAAC;AAG/B,cAAM,eAAe,KAAK,uBAAuB;AAEjD,mBAAW,OAAO,cAAc;AAC9B,cAAI,KAAC,2BAAW,GAAG,GAAG;AACpB,wBAAY,KAAK,GAAG;AAAA,UACtB;AAAA,QACF;AAGA,cAAM,SAAS,KAAK,sBAAsB;AAC1C,YAAI,OAAO,WAAW;AACpB,iBAAO,KAAK,wCAAwC,OAAO,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,QACpF;AAEA,eAAO;AAAA,UACL,OAAO,OAAO,WAAW,KAAK,YAAY,WAAW;AAAA,UACrD;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,UAAwB;AACrC,aAAK,cAAc;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAyB;AACvB,aAAK,cAAc;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,oBAA0B;AACxB,cAAM,QAAQ,KAAK,gBAAgB;AACnC,cAAM,aAAa,KAAK,kBAAkB;AAE1C,gBAAQ,IAAI;AAAA,kDAAyC;AACrD,gBAAQ,IAAI,yBAAkB,MAAM,SAAS,EAAE;AAC/C,gBAAQ,IAAI,qDAA0B,MAAM,QAAQ,EAAE;AACtD,gBAAQ,IAAI,qDAA0B,MAAM,SAAS,EAAE;AACvD,gBAAQ,IAAI,qDAA0B,MAAM,QAAQ,EAAE;AACtD,gBAAQ,IAAI,qDAA0B,MAAM,MAAM,EAAE;AACpD,gBAAQ,IAAI,qDAA0B,MAAM,YAAY,EAAE;AAE1D,YAAI,WAAW,YAAY,SAAS,GAAG;AACrC,kBAAQ,IAAI;AAAA,mCAA4B;AACxC,qBAAW,YAAY,QAAQ,CAAC,QAAQ,QAAQ,IAAI,aAAQ,GAAG,EAAE,CAAC;AAAA,QACpE;AAEA,YAAI,WAAW,OAAO,SAAS,GAAG;AAChC,kBAAQ,IAAI;AAAA,2BAAuB;AACnC,qBAAW,OAAO,QAAQ,CAAC,UAAU,QAAQ,IAAI,aAAQ,KAAK,EAAE,CAAC;AAAA,QACnE;AAEA,cAAM,SAAS,KAAK,sBAAsB;AAC1C,YAAI,OAAO,WAAW;AACpB,kBAAQ,IAAI;AAAA,iCAA6B;AACzC,iBAAO,YAAY,QAAQ,CAAC,eAAe,QAAQ,IAAI,MAAM,UAAU,EAAE,CAAC;AAAA,QAC5E;AAAA,MACF;AAAA,IACF;AAnPiC;AAA1B,IAAM,sBAAN;AAAA;AAAA;;;ACzBP;AAAA;AAAA;AAAA;AAAA,IAKA,IACA,MACA,iBACA,MAGMA,aACA,WAKO;AAjBb;AAAA;AAAA;AAAA;AAKA,SAAoB;AACpB,WAAsB;AACtB,sBAA8B;AAC9B,WAAsB;AAGtB,IAAMA,kBAAa,+BAAc,aAAe;AAChD,IAAM,YAAiB,aAAQA,WAAU;AAKlC,IAAM,mBAAN,MAAM,iBAAgB;AAAA,MACnB;AAAA,MAER,cAAc;AAGZ,cAAM,gBAAgB;AAAA,UACf,UAAK,WAAW,iBAAiB;AAAA;AAAA,UACjC,UAAK,WAAW,cAAc;AAAA;AAAA,UAC9B,UAAK,WAAW,WAAW;AAAA;AAAA,UAC3B,aAAQ,WAAW,MAAM,WAAW;AAAA;AAAA,QAC3C;AAGA,aAAK,sBACH,cAAc,KAAK,CAAC,QAAQ;AAC1B,cAAI;AACF,mBAAU,cAAW,GAAG;AAAA,UAC1B,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF,CAAC,KAAU,UAAK,WAAW,iBAAiB;AAAA,MAChD;AAAA;AAAA;AAAA;AAAA,MAKO,yBAAiC;AACtC,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKO,sBAA+B;AACpC,eAAU,cAAW,KAAK,mBAAmB;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKO,uBAAiC;AACtC,YAAI,CAAC,KAAK,oBAAoB,GAAG;AAC/B,iBAAO,CAAC;AAAA,QACV;AAEA,YAAI;AACF,iBACG,eAAY,KAAK,mBAAmB,EACpC,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,CAAC,EACvC,KAAK;AAAA,QACV,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC/F;AACA,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,gBAAgB,qBAA6B,QAAiB,OAAa;AAChF,YAAI,CAAC,KAAK,oBAAoB,GAAG;AAC/B,kBAAQ,KAAK,0EAA0E;AACvF,eAAK,uBAAuB,qBAAqB,KAAK;AACtD;AAAA,QACF;AAGA,YAAI,CAAI,cAAW,mBAAmB,GAAG;AACvC,UAAG,aAAU,qBAAqB,EAAE,WAAW,KAAK,CAAC;AAAA,QACvD;AAEA,cAAM,eAAe,KAAK,qBAAqB;AAC/C,YAAI,gBAAgB;AAEpB,mBAAW,gBAAgB,cAAc;AACvC,gBAAM,aAAkB,UAAK,KAAK,qBAAqB,YAAY;AACnE,gBAAM,WAAgB,UAAK,qBAAqB,YAAY;AAE5D,cAAI;AAEF,gBAAO,cAAW,QAAQ,KAAK,CAAC,OAAO;AACrC,sBAAQ,IAAI,0BAAgB,YAAY,mBAAmB;AAC3D;AAAA,YACF;AAGA,YAAG,gBAAa,YAAY,QAAQ;AACpC,oBAAQ,IAAI,mBAAc,YAAY,EAAE;AACxC;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ;AAAA,cACN,2BAAsB,YAAY,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACjG;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,IAAI,sBAAe,aAAa,mBAAmB,mBAAmB,EAAE;AAAA,MAClF;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAAuB,qBAA6B,QAAiB,OAAa;AACxF,YAAI,CAAI,cAAW,mBAAmB,GAAG;AACvC,UAAG,aAAU,qBAAqB,EAAE,WAAW,KAAK,CAAC;AAAA,QACvD;AAEA,cAAM,mBAAmC;AAAA,UACvC;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,sBAAsB;AAAA,cACpB,OAAO;AAAA,cACP,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU;AAAA,cACV,cAAc;AAAA,cACd,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,eAAe;AAAA,cACf,YAAY;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cACA,aAAa;AAAA,YACf;AAAA,YACA,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAqBpB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,sBAAsB;AAAA,cACpB,OAAO;AAAA,cACP,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU;AAAA,cACV,cAAc;AAAA,cACd,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,eAAe;AAAA,cACf,YAAY;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cACA,aAAa;AAAA,YACf;AAAA,YACA,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgBpB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,sBAAsB;AAAA,cACpB,OAAO;AAAA,cACP,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU;AAAA,cACV,cAAc;AAAA,cACd,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,eAAe;AAAA,cACf,YAAY;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cACA,aAAa;AAAA,YACf;AAAA,YACA,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgBpB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,sBAAsB;AAAA,cACpB,OAAO;AAAA,cACP,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU;AAAA,cACV,cAAc;AAAA,cACd,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,eAAe;AAAA,cACf,YAAY;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cACA,aAAa;AAAA,YACf;AAAA,YACA,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UA4BpB;AAAA,QACF;AAEA,YAAI,gBAAgB;AAEpB,mBAAW,YAAY,kBAAkB;AACvC,gBAAM,eAAoB,UAAK,qBAAqB,GAAG,SAAS,IAAI,IAAI,SAAS,IAAI,OAAO;AAE5F,cAAI;AAEF,gBAAO,cAAW,YAAY,KAAK,CAAC,OAAO;AACzC,sBAAQ,IAAI,0BAAgB,SAAS,IAAI,IAAI,SAAS,IAAI,wBAAwB;AAClF;AAAA,YACF;AAEA,kBAAM,kBAAuB,eAAU,UAAU;AAAA,cAC/C,QAAQ;AAAA,cACR,WAAW;AAAA,YACb,CAAC;AAED,YAAG,iBAAc,cAAc,iBAAiB,MAAM;AACtD,oBAAQ,IAAI,kBAAa,SAAS,IAAI,IAAI,SAAS,IAAI,OAAO;AAC9D;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ;AAAA,cACN,2BAAsB,SAAS,IAAI,IAAI,SAAS,IAAI,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACxH;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,IAAI,qBAAc,aAAa,2BAA2B,mBAAmB,EAAE;AAAA,MACzF;AAAA;AAAA;AAAA;AAAA,MAKO,YACL,qBACA,MACA,OAAe,WACM;AACrB,cAAM,mBAAmB,GAAG,IAAI,IAAI,IAAI;AAGxC,cAAM,sBAA2B,UAAK,qBAAqB,gBAAgB;AAC3E,YAAO,cAAW,mBAAmB,GAAG;AACtC,cAAI;AACF,kBAAM,kBAAqB,gBAAa,qBAAqB,MAAM;AACnE,mBAAY,WAAM,eAAe;AAAA,UACnC,SAAS,OAAO;AACd,oBAAQ;AAAA,cACN,mCAAmC,mBAAmB,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACrH;AAAA,UACF;AAAA,QACF;AAGA,YAAI,KAAK,oBAAoB,GAAG;AAC9B,gBAAM,sBAA2B,UAAK,KAAK,qBAAqB,gBAAgB;AAChF,cAAO,cAAW,mBAAmB,GAAG;AACtC,gBAAI;AACF,oBAAM,kBAAqB,gBAAa,qBAAqB,MAAM;AACnE,qBAAY,WAAM,eAAe;AAAA,YACnC,SAAS,OAAO;AACd,sBAAQ;AAAA,gBACN,mCAAmC,mBAAmB,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,cACrH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,iBAAiB,cAA+B;AACrD,YAAI;AACF,gBAAM,UAAa,gBAAa,cAAc,MAAM;AACpD,gBAAM,WAAgB,WAAM,OAAO;AAGnC,gBAAM,iBAAiB;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,qBAAW,SAAS,gBAAgB;AAClC,gBAAI,CAAC,SAAS,KAA2B,GAAG;AAC1C,sBAAQ,MAAM,YAAY,YAAY,4BAA4B,KAAK,EAAE;AACzE,qBAAO;AAAA,YACT;AAAA,UACF;AAGA,gBAAM,aAAa,CAAC,QAAQ,SAAS,QAAQ,IAAI;AACjD,cAAI,CAAC,WAAW,SAAS,SAAS,IAAI,GAAG;AACvC,oBAAQ,MAAM,YAAY,YAAY,sBAAsB,SAAS,IAAI,EAAE;AAC3E,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,+BAA+B,YAAY,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC1G;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AA3Y6B;AAAtB,IAAM,kBAAN;AAAA;AAAA;;;ACjBP;AAAA;AAAA;AAAA;AAAA,IAKAC,KACAC,OACAC,OAIM,oBACA,qBAGO;AAfb;AAAA;AAAA;AAAA;AAKA,IAAAF,MAAoB;AACpB,IAAAC,QAAsB;AACtB,IAAAC,QAAsB;AAEtB;AAEA,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAGrB,IAAM,iBAAN,MAAM,eAAc;AAAA,MACjB;AAAA,MACA,SAA+B;AAAA,MAEvC,YAAY,aAAsB;AAChC,cAAM,OAAO,eAAe,KAAK,gBAAgB;AACjD,aAAK,aAAkB,WAAK,MAAM,oBAAoB,mBAAmB;AAAA,MAC3E;AAAA;AAAA;AAAA;AAAA,MAKO,aAA4B;AA3BrC;AA4BI,YAAI,KAAK,QAAQ;AACf,iBAAO,KAAK;AAAA,QACd;AAEA,YAAI,CAAI,eAAW,KAAK,UAAU,GAAG;AACnC,gBAAM,IAAI;AAAA,YACR,2CAA2C,KAAK,UAAU;AAAA,UAC5D;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,gBAAmB,iBAAa,KAAK,YAAY,MAAM;AAC7D,gBAAM,YAAiB,YAAM,aAAa;AAG1C,gBAAI,eAAU,YAAV,mBAAmB,SAAQ,CAAC,UAAU,MAAM;AAE9C,iBAAK,SAAS;AAAA,cACZ,MAAM,UAAU,QAAQ;AAAA,cACxB,aAAa,UAAU,QAAQ;AAAA,cAC/B,SAAS,UAAU,WAAW;AAAA,cAC9B,iBAAiB,UAAU,mBAAmB;AAAA,cAC9C,WAAW,UAAU,aAAa;AAAA,gBAChC,WAAW;AAAA,gBACX,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,eAAe;AAAA,gBACf,SAAS;AAAA,cACX;AAAA,cACA,oBAAoB,UAAU,sBAAsB;AAAA,gBAClD,aAAa;AAAA,gBACb,cAAc;AAAA,gBACd,aAAa;AAAA,gBACb,WAAW;AAAA,gBACX,gBAAgB;AAAA,cAClB;AAAA,cACA,kBAAkB,UAAU,oBAAoB;AAAA,cAChD,sBAAsB,UAAU,wBAAwB,CAAC;AAAA,cACzD,YAAY,UAAU,cAAc;AAAA,gBAClC,wBAAwB;AAAA,gBACxB,uBAAuB;AAAA,gBACvB,kBAAkB;AAAA,cACpB;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK,SAAS;AAAA,UAChB;AAGA,eAAK,eAAe,KAAK,MAAM;AAC/B,eAAK,gBAAgB,KAAK,MAAM;AAEhC,iBAAO,KAAK;AAAA,QACd,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,8CAA8C,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACxG;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,WAAW,QAA6B;AAC7C,aAAK,eAAe,MAAM;AAE1B,cAAM,YAAiB,cAAQ,KAAK,UAAU;AAC9C,YAAI,CAAI,eAAW,SAAS,GAAG;AAC7B,UAAG,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,QAC7C;AAEA,cAAM,cAAmB,gBAAU,QAAQ;AAAA,UACzC,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,iBAAiB;AAAA,QACnB,CAAC;AAED,QAAG,kBAAc,KAAK,YAAY,aAAa,MAAM;AACrD,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKO,oBACL,aACA,UAAkC,CAAC,GACpB;AACf,cAAM,gBAA+B;AAAA,UACnC,MAAM;AAAA,UACN,aAAa,QAAQ,eAAe,yBAAyB,WAAW;AAAA,UACxE,SAAS;AAAA;AAAA,UAET,iBAAiB,QAAQ,mBAAmB;AAAA,UAC5C,WAAW;AAAA,YACT,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,eAAe;AAAA,YACf,SAAS;AAAA;AAAA,UACX;AAAA,UACA,oBAAoB;AAAA,YAClB,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,WAAW;AAAA;AAAA,YACX,gBAAgB;AAAA,UAClB;AAAA,UACA,kBAAkB,QAAQ,oBAAoB;AAAA,UAC9C,sBAAsB;AAAA,YACpB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,YAAY;AAAA,YACV,wBAAwB;AAAA,YACxB,uBAAuB;AAAA,YACvB,kBAAkB;AAAA,UACpB;AAAA,UACA,GAAG;AAAA,QACL;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,kBACL,aACA,UAAkC,CAAC,GACpB;AACf,cAAM,SAAS,KAAK,oBAAoB,aAAa,OAAO;AAG5D,aAAK,uBAAuB,MAAM;AAGlC,aAAK,uBAAuB,MAAM;AAGlC,aAAK,WAAW,MAAM;AAEtB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,2BACL,aACA,UAAkC,CAAC,GACpB;AACf,cAAM,SAAS,KAAK,oBAAoB,aAAa,OAAO;AAG5D,aAAK,uBAAuB,MAAM;AAGlC,aAAK,WAAW,MAAM;AAEtB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,aAAa,SAAgD;AAClE,cAAM,gBAAgB,KAAK,WAAW;AACtC,cAAM,gBAAgB,KAAK,UAAU,eAAe,OAAO;AAE3D,aAAK,WAAW,aAAa;AAC7B,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,YAA2B;AAChC,cAAM,SAAS,KAAK,WAAW;AAG/B,YAAI,QAAQ,IAAI,sBAAsB;AACpC,iBAAO,mBAAmB,QAAQ,IAAI;AAAA,QACxC;AAEA,YAAI,QAAQ,IAAI,wBAAwB,SAAS;AAC/C,iBAAO,WAAY,yBAAyB;AAAA,QAC9C;AAEA,YAAI,QAAQ,IAAI,8BAA8B,QAAQ;AACpD,iBAAO,WAAY,wBAAwB;AAAA,QAC7C;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,iBAAiB,aAStB;AACA,cAAM,SAAS,KAAK,UAAU;AAC9B,cAAM,cAAmB,cAAa,cAAQ,KAAK,UAAU,CAAC;AAI9D,cAAM,eAAe,IAAI,oBAAoB,QAAQ,aAAa,WAAW;AAC7E,cAAM,eAAe,aAAa,gBAAgB;AAElD,eAAO;AAAA,UACL,aAAa,aAAa;AAAA,UAC1B,WAAW,aAAa;AAAA,UACxB,WAAW,aAAa;AAAA,UACxB,UAAU,aAAa;AAAA,UACvB,WAAW,aAAa;AAAA,UACxB,UAAU,aAAa;AAAA,UACvB,QAAQ,aAAa;AAAA,UACrB,cAAc,aAAa;AAAA,QAC7B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,mBAAmB,KAAuB;AAC/C,cAAM,WAAW,OAAO,QAAQ,IAAI;AACpC,cAAM,aAAkB,WAAK,UAAU,oBAAoB,mBAAmB;AAC9E,eAAU,eAAW,UAAU;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKO,gBAAgB,UAA2B;AAChD,YAAI,aAAa,YAAY,QAAQ,IAAI;AAEzC,eAAO,eAAoB,cAAQ,UAAU,GAAG;AAC9C,gBAAM,aAAkB,WAAK,YAAY,oBAAoB,mBAAmB;AAChF,cAAO,eAAW,UAAU,GAAG;AAC7B,mBAAO;AAAA,UACT;AACA,uBAAkB,cAAQ,UAAU;AAAA,QACtC;AAGA,eAAO,YAAY,QAAQ,IAAI;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,QAA6B;AAClD,cAAM,WAAW,CAAC,QAAQ,WAAW,aAAa,oBAAoB;AAEtE,mBAAW,SAAS,UAAU;AAC5B,cAAI,CAAC,OAAO,KAA4B,GAAG;AACzC,kBAAM,IAAI,MAAM,yCAAyC,KAAK,EAAE;AAAA,UAClE;AAAA,QACF;AAGA,cAAM,kBAAkB,CAAC,aAAa,cAAc,aAAa,eAAe;AAChF,mBAAW,SAAS,iBAAiB;AACnC,cAAI,CAAC,OAAO,UAAU,KAAsC,GAAG;AAC7D,kBAAM,IAAI,MAAM,mDAAmD,KAAK,EAAE;AAAA,UAC5E;AAAA,QACF;AAGA,cAAM,eAAe,CAAC,eAAe,gBAAgB,eAAe,gBAAgB;AACpF,mBAAW,SAAS,cAAc;AAChC,cAAI,CAAC,OAAO,mBAAmB,KAA+C,GAAG;AAC/E,kBAAM,IAAI,MAAM,4DAA4D,KAAK,EAAE;AAAA,UACrF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,gBAAgB,QAA6B;AAEnD,YAAI,CAAC,OAAO,YAAY;AACtB,iBAAO,aAAa;AAAA,YAClB,wBAAwB;AAAA,YACxB,uBAAuB;AAAA,YACvB,kBAAkB;AAAA,UACpB;AAAA,QACF;AAGA,YAAI,CAAC,OAAO,sBAAsB;AAChC,iBAAO,uBAAuB,CAAC;AAAA,QACjC;AAGA,eAAO,UAAU,YAAY,OAAO,UAAU,UAAU,QAAQ,YAAY,EAAE;AAC9E,eAAO,UAAU,aAAa,OAAO,UAAU,WAAW,QAAQ,YAAY,EAAE;AAChF,eAAO,UAAU,YAAY,OAAO,UAAU,UAAU,QAAQ,YAAY,EAAE;AAC9E,eAAO,UAAU,gBAAgB,OAAO,UAAU,cAAc,QAAQ,YAAY,EAAE;AAGtF,YAAI,CAAC,OAAO,mBAAmB,eAAe,WAAW,GAAG,GAAG;AAC7D,iBAAO,mBAAmB,iBAAiB,IAAI,OAAO,mBAAmB,cAAc;AAAA,QACzF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,uBAAuB,QAA6B;AACzD,cAAM,cAAmB,cAAa,cAAQ,KAAK,UAAU,CAAC;AAI9D,cAAM,eAAe,IAAI,oBAAoB,QAAQ,WAAW;AAChE,cAAM,eAAe,aAAa,uBAAuB;AAEzD,mBAAW,OAAO,cAAc;AAC9B,cAAI,CAAI,eAAW,GAAG,GAAG;AACvB,YAAG,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAAuB,QAA6B;AAC1D,cAAM,cAAmB,cAAa,cAAQ,KAAK,UAAU,CAAC;AAI9D,cAAM,eAAe,IAAI,oBAAoB,QAAQ,WAAW;AAChE,cAAM,QAAQ,aAAa,gBAAgB;AAC3C,cAAM,eAAe,MAAM;AAE3B,cAAM,YAA4B;AAAA,UAChC;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,sBAAsB;AAAA,cACpB,OAAO;AAAA,cACP,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU,OAAO,oBAAoB;AAAA,cACrC,cAAc;AAAA,cACd,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,eAAe;AAAA,cACf,YAAY,OAAO,wBAAwB,CAAC;AAAA,cAC5C,aAAa;AAAA,YACf;AAAA,YACA,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAqBpB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,sBAAsB;AAAA,cACpB,OAAO;AAAA,cACP,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU,OAAO,oBAAoB;AAAA,cACrC,cAAc;AAAA,cACd,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,eAAe;AAAA,cACf,YAAY,OAAO,wBAAwB,CAAC;AAAA,cAC5C,aAAa;AAAA,YACf;AAAA,YACA,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgBpB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,sBAAsB;AAAA,cACpB,OAAO;AAAA,cACP,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU,OAAO,oBAAoB;AAAA,cACrC,cAAc;AAAA,cACd,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,eAAe;AAAA,cACf,YAAY,OAAO,wBAAwB,CAAC;AAAA,cAC5C,aAAa;AAAA,YACf;AAAA,YACA,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgBpB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,sBAAsB;AAAA,cACpB,OAAO;AAAA,cACP,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU,OAAO,oBAAoB;AAAA,cACrC,cAAc;AAAA,cACd,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,eAAe;AAAA,cACf,YAAY,OAAO,wBAAwB,CAAC;AAAA,cAC5C,aAAa;AAAA,YACf;AAAA,YACA,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UA4BpB;AAAA,QACF;AAEA,mBAAW,YAAY,WAAW;AAChC,gBAAM,eAAoB,WAAK,cAAc,GAAG,SAAS,IAAI,IAAI,SAAS,IAAI,OAAO;AACrF,cAAI,CAAI,eAAW,YAAY,GAAG;AAChC,kBAAM,kBAAuB,gBAAU,UAAU;AAAA,cAC/C,QAAQ;AAAA,cACR,WAAW;AAAA,YACb,CAAC;AACD,YAAG,kBAAc,cAAc,iBAAiB,MAAM;AAAA,UACxD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,UAAU,QAAa,QAAkB;AAC/C,cAAM,SAAS,EAAE,GAAG,OAAO;AAE3B,mBAAW,OAAO,QAAQ;AACxB,cAAI,OAAO,GAAG,KAAK,OAAO,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG,CAAC,GAAG;AACjF,mBAAO,GAAG,IAAI,KAAK,UAAU,OAAO,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,CAAC;AAAA,UAC7D,OAAO;AACL,mBAAO,GAAG,IAAI,OAAO,GAAG;AAAA,UAC1B;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,YACL,MACA,OAAe,WACM;AACrB,cAAM,SAAS,KAAK,UAAU;AAC9B,cAAM,cAAmB,cAAa,cAAQ,KAAK,UAAU,CAAC;AAI9D,cAAM,eAAe,IAAI,oBAAoB,QAAQ,WAAW;AAChE,cAAM,QAAQ,aAAa,gBAAgB;AAC3C,cAAM,eAAe,MAAM;AAE3B,cAAM,eAAoB,WAAK,cAAc,GAAG,IAAI,IAAI,IAAI,OAAO;AAEnE,YAAI,CAAI,eAAW,YAAY,GAAG;AAChC,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,kBAAqB,iBAAa,cAAc,MAAM;AAC5D,iBAAY,YAAM,eAAe;AAAA,QACnC,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,2BAA2B,YAAY,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACtG;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,wBACL,MACA,OAAe,WACM;AACrB,cAAM,SAAS,KAAK,UAAU;AAC9B,cAAM,cAAmB,cAAa,cAAQ,KAAK,UAAU,CAAC;AAI9D,cAAM,eAAe,IAAI,oBAAoB,QAAQ,WAAW;AAChE,cAAM,QAAQ,aAAa,gBAAgB;AAC3C,cAAM,eAAe,MAAM;AAG3B,cAAM,kBAAkB,KAAK,YAAY,MAAM,IAAI;AACnD,YAAI,iBAAiB;AACnB,iBAAO;AAAA,QACT;AAGA,cAAMC,mBAAkB,kEAAiC;AACzD,cAAM,kBAAkB,IAAIA,iBAAgB;AAC5C,eAAO,gBAAgB,YAAY,cAAc,MAAM,IAAI;AAAA,MAC7D;AAAA;AAAA;AAAA;AAAA,MAKO,gBAAuE;AAC5E,cAAM,SAAS,KAAK,UAAU;AAC9B,cAAM,cAAmB,cAAa,cAAQ,KAAK,UAAU,CAAC;AAI9D,cAAM,eAAe,IAAI,oBAAoB,QAAQ,WAAW;AAChE,cAAM,QAAQ,aAAa,gBAAgB;AAC3C,cAAM,eAAe,MAAM;AAE3B,YAAI,CAAI,eAAW,YAAY,GAAG;AAChC,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,YAAmE,CAAC;AAC1E,cAAM,QAAW,gBAAY,YAAY,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,CAAC;AAElF,mBAAW,QAAQ,OAAO;AACxB,cAAI;AACF,kBAAM,kBAAqB,iBAAkB,WAAK,cAAc,IAAI,GAAG,MAAM;AAC7E,kBAAM,WAAgB,YAAM,eAAe;AAC3C,sBAAU,KAAK;AAAA,cACb,MAAM,SAAS;AAAA,cACf,MAAM,SAAS;AAAA,cACf,aAAa,SAAS;AAAA,YACxB,CAAC;AAAA,UACH,SAAS,OAAO;AACd,oBAAQ;AAAA,cACN,4BAA4B,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC/F;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AApoB2B;AAApB,IAAM,gBAAN;AAAA;AAAA;;;ACfP,kBAOa,QA0BA;AAjCb;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAOX,IAAM,SAAiB;AAAA;AAAA,MAE5B,SAAS,aAAAC,QAAM;AAAA;AAAA,MAGf,SAAS,aAAAA,QAAM;AAAA;AAAA,MAGf,SAAS,aAAAA,QAAM;AAAA;AAAA,MAGf,OAAO,aAAAA,QAAM;AAAA;AAAA,MAGb,MAAM,aAAAA,QAAM;AAAA;AAAA,MAGZ,OAAO,aAAAA,QAAM;AAAA;AAAA,MAGb,WAAW,aAAAA,QAAM,KAAK;AAAA,IACxB;AAKO,IAAM,cAAN,MAAM,YAAW;AAAA;AAAA,MAEtB,OAAO,SAAS,OAAyC;AACvD,gBAAQ,MAAM,YAAY,GAAG;AAAA,UAC3B,KAAK;AACH,mBAAO,aAAAA,QAAM;AAAA,UACf,KAAK;AACH,mBAAO,aAAAA,QAAM;AAAA,UACf,KAAK;AACH,mBAAO,aAAAA,QAAM;AAAA,UACf,KAAK;AACH,mBAAO,aAAAA,QAAM,IAAI;AAAA,UACnB;AACE,mBAAO,aAAAA,QAAM;AAAA,QACjB;AAAA,MACF;AAAA;AAAA,MAGA,OAAO,OAAO,QAA0C;AACtD,gBAAQ,OAAO,YAAY,GAAG;AAAA,UAC5B,KAAK;AACH,mBAAO,aAAAA,QAAM;AAAA,UACf,KAAK;AACH,mBAAO,aAAAA,QAAM;AAAA,UACf,KAAK;AACH,mBAAO,aAAAA,QAAM;AAAA,UACf,KAAK;AACH,mBAAO,aAAAA,QAAM;AAAA,UACf;AACE,mBAAO,aAAAA,QAAM;AAAA,QACjB;AAAA,MACF;AAAA;AAAA,MAGA,OAAO,QAAQ,SAAyB;AACtC,eAAO,aAAAA,QAAM,KAAK,KAAK,OAAO;AAAA,MAChC;AAAA;AAAA,MAGA,OAAO,OAAO,QAAwB;AACpC,eAAO,aAAAA,QAAM,OAAO,MAAM;AAAA,MAC5B;AAAA;AAAA,MAGA,OAAO,SAAS,KAAqB;AACnC,eAAO,aAAAA,QAAM,MAAM,GAAG;AAAA,MACxB;AAAA;AAAA,MAGA,OAAO,OAAO,MAAsB;AAClC,eAAO,aAAAA,QAAM,KAAK,KAAK;AAAA,EAAK,IAAI;AAAA,EAAK,IAAI,OAAO,KAAK,MAAM,CAAC,EAAE;AAAA,MAChE;AAAA;AAAA,MAGA,OAAO,UAAU,MAAsB;AACrC,eAAO,aAAAA,QAAM,KAAK,MAAM;AAAA,EAAK,IAAI;AAAA,EAAK,IAAI,OAAO,KAAK,MAAM,CAAC,EAAE;AAAA,MACjE;AAAA;AAAA,MAGA,OAAO,MAAM,MAAc,UAAoD,QAAgB;AAC7F,cAAM,UAAU,OAAO,OAAO;AAC9B,eAAO,QAAQ,IAAI,IAAI,GAAG;AAAA,MAC5B;AAAA;AAAA,MAGA,OAAO,IAAI,MAAc,UAAoD,QAAgB;AAC3F,cAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,cAAM,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AAC9D,cAAM,UAAU,OAAO,OAAO;AAE9B,cAAM,SAAS,SAAI,OAAO,YAAY,CAAC;AACvC,cAAM,MAAM,SAAI,MAAM;AACtB,cAAM,SAAS,SAAI,MAAM;AAEzB,cAAM,UAAU,MAAM,IAAI,CAAC,SAAS,UAAK,KAAK,OAAO,SAAS,CAAC,SAAI,EAAE,KAAK,IAAI;AAE9E,eAAO,QAAQ,GAAG,GAAG;AAAA,EAAK,OAAO;AAAA,EAAK,MAAM,EAAE;AAAA,MAChD;AAAA;AAAA,MAGA,OAAO,SAAS,SAAiB,OAAuB;AACtD,cAAM,aAAa,KAAK,MAAO,UAAU,QAAS,GAAG;AACrD,cAAM,SAAS,KAAK,MAAO,UAAU,QAAS,EAAE;AAChD,cAAM,QAAQ,KAAK;AAEnB,cAAM,MAAM,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,KAAK;AAEjD,YAAI,aAAa,IAAI;AACnB,iBAAO,aAAAA,QAAM,IAAI,IAAI,GAAG,KAAK,UAAU,GAAG;AAAA,QAC5C,WAAW,aAAa,IAAI;AAC1B,iBAAO,aAAAA,QAAM,OAAO,IAAI,GAAG,KAAK,UAAU,GAAG;AAAA,QAC/C,OAAO;AACL,iBAAO,aAAAA,QAAM,MAAM,IAAI,GAAG,KAAK,UAAU,GAAG;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA,MAGA,OAAO,UAAU,OAAO,UAAK,SAAS,IAAY;AAChD,eAAO,aAAAA,QAAM,KAAK,KAAK,OAAO,MAAM,CAAC;AAAA,MACvC;AAAA;AAAA,MAGA,OAAO,UAAU,MAAoB;AACnC,eAAO,aAAAA,QAAM,IAAI,KAAK,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,UAAU,GAAG,EAAE,CAAC;AAAA,MACxE;AAAA;AAAA,MAGA,OAAO,KAAKC,QAAsB;AAChC,eAAO,aAAAD,QAAM,KAAK,UAAUC,MAAI;AAAA,MAClC;AAAA;AAAA,MAGA,OAAO,KAAK,MAAsB;AAChC,eAAO,aAAAD,QAAM,KAAK,QAAQ,IAAI,IAAI,GAAG;AAAA,MACvC;AAAA;AAAA,MAGA,OAAO,IAAI,KAAqB;AAC9B,eAAO,aAAAA,QAAM,KAAK,UAAU,GAAG;AAAA,MACjC;AAAA;AAAA,MAGA,OAAO,IAAI,KAAqB;AAC9B,eAAO,aAAAA,QAAM,QAAQ,IAAI,GAAG,GAAG;AAAA,MACjC;AAAA,IACF;AA7HwB;AAAjB,IAAM,aAAN;AAAA;AAAA;;;ACjCP,kBACA,eAIa;AALb;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAClB,oBAAmB;AAEnB;AAEO,IAAM,aAAN,MAAM,WAAU;AAAA,MACrB,OAAO,QAAQ,SAAyB;AACtC,eAAO,OAAO,QAAQ,UAAK,OAAO,EAAE;AAAA,MACtC;AAAA,MAEA,OAAO,MAAM,SAAyB;AACpC,eAAO,OAAO,MAAM,UAAK,OAAO,EAAE;AAAA,MACpC;AAAA,MAEA,OAAO,QAAQ,SAAyB;AACtC,eAAO,OAAO,QAAQ,iBAAO,OAAO,EAAE;AAAA,MACxC;AAAA,MAEA,OAAO,KAAK,SAAyB;AACnC,eAAO,OAAO,KAAK,iBAAO,OAAO,EAAE;AAAA,MACrC;AAAA,MAEA,OAAO,MAAM,SAAyB;AACpC,eAAO,OAAO,MAAM,aAAM,OAAO,EAAE;AAAA,MACrC;AAAA,MAEA,OAAO,OAAO,MAAsB;AAClC,eAAO,WAAW,OAAO,IAAI;AAAA,MAC/B;AAAA,MAEA,OAAO,UAAU,MAAsB;AACrC,eAAO,WAAW,UAAU,IAAI;AAAA,MAClC;AAAA,MAEA,OAAO,UAAU,MAAsB;AACrC,eAAO,OAAO,UAAU,IAAI;AAAA,MAC9B;AAAA,MAEA,OAAO,IAAI,MAAsB;AAC/B,eAAO,OAAO,MAAM,IAAI;AAAA,MAC1B;AAAA;AAAA,MAGA,OAAO,OAAO,MAAsB;AAClC,YAAI;AACF,gBAAM,QAAQ,cAAAE,QAAO,SAAS,MAAM;AAAA,YAClC,MAAM;AAAA,YACN,kBAAkB;AAAA,YAClB,gBAAgB;AAAA,YAChB,OAAO;AAAA,YACP,iBAAiB;AAAA,UACnB,CAAC;AACD,iBAAO,OAAO,QAAQ,KAAK;AAAA,QAC7B,QAAQ;AAEN,iBAAO,WAAW,OAAO,IAAI;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA,MAGA,OAAO,IAAI,SAAiB,UAAoD,QAAgB;AAC9F,cAAM,eAAe;AAAA,UACnB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAEA,mBAAO,aAAAC,SAAM,SAAS;AAAA,UACpB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,aAAa,aAAa,OAAO;AAAA,UACjC,iBAAiB;AAAA,QACnB,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,OAAO,WAAW,MAAqB,SAAiC,YAAoB;AA9E9F;AA+EI,cAAM,cAAc,WAAW;AAAA,UAC7B,KAAK,OAAO,YAAY;AAAA,UACxB,WAAU,iBAAiB,KAAK,MAAM;AAAA,QACxC;AACA,cAAM,gBAAgB,WAAW;AAAA,UAC/B,KAAK,SAAS,YAAY;AAAA,UAC1B,WAAU,mBAAmB,KAAK,QAAQ;AAAA,QAC5C;AAEA,YAAI,WAAW,WAAW;AACxB,iBAAO;AAAA,YACL,GAAG,WAAW,IAAI,aAAa,IAAI,OAAO,UAAU,KAAK,KAAK,CAAC;AAAA,YAC/D,OAAO,MAAM,OAAO,KAAK,EAAE,EAAE;AAAA,YAC7B,KAAK,WAAW,OAAO,KAAK,IAAI,KAAK,QAAQ,EAAE,IAAI;AAAA,cACnD,UAAK,SAAL,mBAAW,UAAS,OAAO,MAAM,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI;AAAA,UAClE,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACb;AAEA,cAAM,WAAW;AAAA,UACf,GAAG,WAAW,IAAI,aAAa;AAAA,UAC/B,OAAO,UAAU,KAAK,KAAK;AAAA,UAC3B,OAAO,MAAM,OAAO,KAAK,EAAE,EAAE;AAAA,UAC7B,KAAK,WAAW,OAAO,KAAK,uBAAgB,KAAK,QAAQ,EAAE,IAAI;AAAA,UAC/D,KAAK,cAAc,OAAO,MAAM,aAAM,KAAK,WAAW,EAAE,IAAI;AAAA,UAC5D,KAAK,WAAW,OAAO,QAAQ,aAAM,KAAK,QAAQ,eAAe,IAAI;AAAA,YACrE,UAAK,SAAL,mBAAW,UAAS,OAAO,QAAQ,0BAAc,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,UAC3E,WAAW,UAAU,KAAK,SAAS;AAAA,QACrC;AAEA,eAAO,SAAS,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,MAC3C;AAAA;AAAA,MAGA,OAAO,WAAW,OAAwB,YAAY,MAAc;AAClE,YAAI,MAAM,WAAW,GAAG;AACtB,iBAAO,WAAU,IAAI,kBAAkB,MAAM;AAAA,QAC/C;AAEA,cAAM,YAAY,MACf,IAAI,CAAC,MAAM,UAAU;AACpB,gBAAM,SAAS,OAAO,MAAM,IAAI,QAAQ,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI;AAC1E,iBAAO,GAAG,MAAM,GAAG,WAAU,WAAW,MAAM,SAAS,CAAC;AAAA,QAC1D,CAAC,EACA,KAAK,IAAI;AAEZ,YAAI,CAAC,WAAW;AACd,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,WAAU,cAAc,KAAK;AAC3C,eAAO,GAAG,SAAS;AAAA;AAAA,EAAO,KAAK;AAAA,MACjC;AAAA;AAAA,MAGA,OAAO,cAAc,OAAgC;AACnD,cAAM,QAAQ,MAAM;AACpB,cAAM,WAAW,WAAU,QAAQ,OAAO,QAAQ;AAClD,cAAM,aAAa,WAAU,QAAQ,OAAO,UAAU;AAEtD,cAAM,gBAAgB,OAAO,QAAQ,QAAQ,EAC1C,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM;AACxB,gBAAM,QAAQ,WAAW,OAAO,MAAM;AACtC,iBAAO,MAAM,GAAG,MAAM,KAAK,KAAK,EAAE;AAAA,QACpC,CAAC,EACA,KAAK,KAAK;AAEb,cAAM,kBAAkB,OAAO,QAAQ,UAAU,EAC9C,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM;AAC1B,gBAAM,QAAQ,WAAW,SAAS,QAAQ;AAC1C,iBAAO,MAAM,GAAG,QAAQ,KAAK,KAAK,EAAE;AAAA,QACtC,CAAC,EACA,KAAK,KAAK;AAEb,eAAO;AAAA,UACL,WAAW,UAAU;AAAA,UACrB,OAAO,UAAU,yBAAkB,KAAK,SAAS;AAAA,UACjD,WAAW,aAAa;AAAA,UACxB,aAAa,eAAe;AAAA,UAC5B,WAAW,UAAU;AAAA,QACvB,EAAE,KAAK,IAAI;AAAA,MACb;AAAA;AAAA,MAGA,OAAO,YAAY,OAAgC;AACjD,YAAI,MAAM,WAAW,GAAG;AACtB,iBAAO,WAAU,IAAI,kBAAkB,MAAM;AAAA,QAC/C;AAEA,cAAM,UAAU,CAAC,MAAM,SAAS,UAAU,YAAY,YAAY,MAAM;AACxE,cAAM,YAAY,WAAU,sBAAsB,OAAO,OAAO;AAEhE,cAAM,YAAY,QACf,IAAI,CAAC,QAAQ,MAAM,OAAO,UAAU,OAAO,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,EAChE,KAAK,KAAK;AAEb,cAAM,YAAY,WAAW,UAAU,UAAK,UAAU,MAAM;AAE5D,cAAM,OAAO,MAAM,IAAI,CAAC,SAAS;AAlLrC;AAmLM,gBAAM,QAAQ;AAAA,YACZ,KAAK;AAAA,YACL,KAAK,MAAM,SAAS,KAAK,GAAG,KAAK,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,KAAK;AAAA,YACpE,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK,YAAY;AAAA,cACjB,UAAK,SAAL,mBAAW,KAAK,UAAS;AAAA,UAC3B;AAEA,iBAAO,MACJ,IAAI,CAAC,MAAM,MAAM;AAChB,kBAAM,UACJ,MAAM,IACF,WAAW,OAAO,IAAI,EAAE,IAAI,IAC5B,MAAM,IACJ,WAAW,SAAS,IAAI,EAAE,IAAI,IAC9B;AACR,mBAAO,QAAQ,OAAO,UAAU,CAAC,CAAC;AAAA,UACpC,CAAC,EACA,KAAK,KAAK;AAAA,QACf,CAAC;AAED,eAAO,CAAC,WAAW,WAAW,GAAG,IAAI,EAAE,KAAK,IAAI;AAAA,MAClD;AAAA;AAAA,MAGA,OAAO,aAAa,OAAwB,QAAwB;AAClE,gBAAQ,QAAQ;AAAA,UACd,KAAK;AACH,mBAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,UACtC,KAAK;AACH,mBAAO,WAAU,UAAU,KAAK;AAAA,UAClC,KAAK;AAEH,mBAAO,WAAU,WAAW,KAAK;AAAA,UACnC,KAAK;AACH,mBAAO,WAAU,eAAe,KAAK;AAAA,UACvC;AACE,mBAAO,WAAU,YAAY,KAAK;AAAA,QACtC;AAAA,MACF;AAAA;AAAA,MAGA,OAAO,WACL,SACA,aACA,OACA,SACA,UACQ;AACR,cAAM,WAAW;AAAA,UACf,WAAW,OAAO,GAAG,QAAQ,YAAY,CAAC,UAAU;AAAA,UACpD,GAAG,OAAO,KAAK,cAAc,CAAC,IAAI,WAAW;AAAA,UAC7C;AAAA,UACA,GAAG,OAAO,KAAK,QAAQ,CAAC,IAAI,WAAW,QAAQ,KAAK,CAAC;AAAA,UACrD;AAAA,UACA,OAAO,KAAK,UAAU;AAAA,UACtB,GAAG,QAAQ,IAAI,CAAC,QAAQ,KAAK,WAAW,OAAO,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,IAAI,IAAI,WAAW,EAAE;AAAA,UACxF;AAAA,UACA,OAAO,KAAK,WAAW;AAAA,UACvB,GAAG,SAAS,IAAI,CAAC,OAAO,KAAK,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE;AAAA,QACxD;AAEA,eAAO,SAAS,KAAK,IAAI;AAAA,MAC3B;AAAA;AAAA,MAGA,OAAO,IAAI,OAAiB,SAAiB,SAAqC;AAChF,cAAM,YAAY,WAAW,UAAU,oBAAI,KAAK,CAAC;AACjD,cAAM,aAAa,UAAU,IAAI,OAAO,MAAM,KAAK,UAAU,OAAO,CAAC,CAAC,KAAK;AAE3E,gBAAQ,OAAO;AAAA,UACb,KAAK;AACH,oBAAQ,IAAI,GAAG,SAAS,IAAI,WAAU,MAAM,OAAO,CAAC,GAAG,UAAU,EAAE;AACnE;AAAA,UACF,KAAK;AACH,oBAAQ,IAAI,GAAG,SAAS,IAAI,WAAU,KAAK,OAAO,CAAC,GAAG,UAAU,EAAE;AAClE;AAAA,UACF,KAAK;AACH,oBAAQ,KAAK,GAAG,SAAS,IAAI,WAAU,QAAQ,OAAO,CAAC,GAAG,UAAU,EAAE;AACtE;AAAA,UACF,KAAK;AACH,oBAAQ,MAAM,GAAG,SAAS,IAAI,WAAU,MAAM,OAAO,CAAC,GAAG,UAAU,EAAE;AACrE;AAAA,QACJ;AAAA,MACF;AAAA;AAAA,MAGA,OAAe,iBAAiB,QAA0D;AACxF,gBAAQ,QAAQ;AAAA,UACd,KAAK;AACH,mBAAO;AAAA,UACT,KAAK;AACH,mBAAO;AAAA,UACT,KAAK;AACH,mBAAO;AAAA,UACT;AACE,mBAAO;AAAA,QACX;AAAA,MACF;AAAA,MAEA,OAAe,mBAAmB,UAA4D;AAC5F,gBAAQ,UAAU;AAAA,UAChB,KAAK;AACH,mBAAO;AAAA,UACT,KAAK;AACH,mBAAO;AAAA,UACT,KAAK;AACH,mBAAO;AAAA,UACT;AACE,mBAAO;AAAA,QACX;AAAA,MACF;AAAA,MAEA,OAAe,QAAW,OAAY,KAAsC;AAC1E,eAAO,MAAM;AAAA,UACX,CAAC,KAAK,SAAS;AACb,kBAAM,QAAQ,OAAO,KAAK,GAAG,CAAC;AAC9B,gBAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK;AACjC,mBAAO;AAAA,UACT;AAAA,UACA,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,OAAe,sBAAsB,OAAwB,SAA6B;AACxF,cAAM,OAAO,MAAM,IAAI,CAAC,SAAM;AAjTlC;AAiTqC;AAAA,YAC/B,KAAK;AAAA,YACL,KAAK,MAAM,SAAS,KAAK,GAAG,KAAK,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,KAAK;AAAA,YACpE,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK,YAAY;AAAA,cACjB,UAAK,SAAL,mBAAW,KAAK,UAAS;AAAA,UAC3B;AAAA,SAAC;AAED,eAAO,QAAQ,IAAI,CAAC,QAAQ,MAAM;AAChC,gBAAM,eAAe,CAAC,QAAQ,GAAG,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAC1D,iBAAO,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,MAEA,OAAe,UAAU,OAAgC;AACvD,cAAM,UAAU;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,UAC/B,KAAK;AAAA,UACL,IAAI,KAAK,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,UAClC,KAAK,KAAK,eAAe,IAAI,QAAQ,MAAM,IAAI,CAAC;AAAA,UAChD,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK,YAAY;AAAA,UACjB,KAAK,UAAU,YAAY;AAAA,UAC3B,KAAK,UAAU,YAAY;AAAA,UAC3B,KAAK,KAAK,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC;AAAA,QAClC,CAAC;AAED,eAAO,CAAC,QAAQ,KAAK,GAAG,GAAG,GAAG,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,MAC3E;AAAA,MAEA,OAAe,WAAW,OAAgC;AAExD,eAAO,MACJ,IAAI,CAAC,SAAS;AACb,iBAAO;AAAA,YACL,SAAS,KAAK,EAAE;AAAA,YAChB,aAAa,KAAK,KAAK;AAAA,YACvB,mBAAmB,KAAK,eAAe,EAAE;AAAA,YACzC,aAAa,KAAK,MAAM;AAAA,YACxB,eAAe,KAAK,QAAQ;AAAA,YAC5B,eAAe,KAAK,YAAY,EAAE;AAAA,YAClC,cAAc,KAAK,UAAU,YAAY,CAAC;AAAA,YAC1C,cAAc,KAAK,UAAU,YAAY,CAAC;AAAA,YAC1C,aAAa,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,UAC/D,EAAE,KAAK,IAAI;AAAA,QACb,CAAC,EACA,KAAK,IAAI;AAAA,MACd;AAAA,MAEA,OAAe,eAAe,OAAgC;AAC5D,cAAM,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,UACA,GAAG,MAAM;AAAA,YACP,CAAC,SACC,KAAK,KAAK,EAAE,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,MAAM,KAAK,QAAQ,MAAM,KAAK,YAAY,EAAE,OAAO,KAAK,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC;AAAA,UAC/H;AAAA,QACF,EAAE,KAAK,IAAI;AAEX,eAAO;AAAA;AAAA,EAAwB,KAAK;AAAA;AAAA,iBAAqB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,MACnF;AAAA,IACF;AArXuB;AAAhB,IAAM,YAAN;AAAA;AAAA;;;ACLP,IAKAC,KACAC,OACAC,OAiBM,uBACA,mBAEO;AA3Bb;AAAA;AAAA;AAAA;AAKA,IAAAF,MAAoB;AACpB,IAAAC,QAAsB;AACtB,IAAAC,QAAsB;AAiBtB,IAAM,wBAAwB;AAC9B,IAAM,oBAAoB;AAEnB,IAAM,qBAAN,MAAM,mBAAkB;AAAA;AAAA;AAAA;AAAA,MAItB,UAAU,UAA4B;AAC3C,cAAM,EAAE,aAAa,QAAQ,IAAI,KAAK,UAAU,QAAQ;AAGxD,YAAI,CAAC,YAAY,SAAS;AACxB,gBAAM,IAAI,MAAM,QAAQ,QAAQ,2BAA2B;AAAA,QAC7D;AAEA,cAAM,kBAAkB;AACxB,aAAK,wBAAwB,eAAe;AAE5C,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,WAAW,UAA6B;AAC7C,cAAM,EAAE,aAAa,QAAQ,IAAI,KAAK,UAAU,QAAQ;AAGxD,YAAI,CAAC,YAAY,UAAU;AACzB,gBAAM,IAAI,MAAM,QAAQ,QAAQ,qCAAqC;AAAA,QACvE;AAEA,cAAM,mBAAmB;AACzB,aAAK,yBAAyB,gBAAgB;AAE9C,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,UAAU,UAA4B;AAC3C,cAAM,EAAE,aAAa,QAAQ,IAAI,KAAK,UAAU,QAAQ;AAGxD,YAAI,CAAC,YAAY,WAAW,CAAC,YAAY,UAAU;AACjD,gBAAM,IAAI,MAAM,QAAQ,QAAQ,gDAAgD;AAAA,QAClF;AAEA,cAAM,kBAAkB;AACxB,aAAK,wBAAwB,eAAe;AAE5C,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,QAAQ,UAA0B;AACvC,cAAM,EAAE,aAAa,QAAQ,IAAI,KAAK,UAAU,QAAQ;AAGxD,YAAI,CAAC,YAAY,SAAS,CAAC,YAAY,UAAU;AAC/C,gBAAM,IAAI,MAAM,QAAQ,QAAQ,8CAA8C;AAAA,QAChF;AAEA,cAAM,gBAAgB;AACtB,aAAK,sBAAsB,aAAa;AAExC,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,aAAa,UAA+B;AACjD,cAAM,EAAE,YAAY,IAAI,KAAK,UAAU,QAAQ;AAE/C,YACE,YAAY,WACZ,CAAC,YAAY,YACb,CAAC,YAAY,WACb,CAAC,YAAY,OACb;AACA,iBAAO,KAAK,UAAU,QAAQ;AAAA,QAChC,WACE,YAAY,YACZ,CAAC,YAAY,WACb,CAAC,YAAY,OACb;AACA,iBAAO,KAAK,WAAW,QAAQ;AAAA,QACjC,WACE,YAAY,WACZ,YAAY,YACZ,CAAC,YAAY,OACb;AACA,iBAAO,KAAK,UAAU,QAAQ;AAAA,QAChC,WACE,YAAY,SACZ,YAAY,YACZ,CAAC,YAAY,SACb;AACA,iBAAO,KAAK,QAAQ,QAAQ;AAAA,QAC9B,OAAO;AACL,gBAAM,IAAI,MAAM,QAAQ,QAAQ,4CAA4C;AAAA,QAC9E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,cAAc,MAAuB,SAAyB;AACnE,cAAM,cAAc,KAAK,iBAAiB,IAAI;AAC9C,eAAO,KAAK,yBAAyB,aAAa,OAAO;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKO,eAAe,MAAwB,SAAyB;AACrE,cAAM,cAAc,KAAK,iBAAiB,IAAI;AAC9C,eAAO,KAAK,yBAAyB,aAAa,OAAO;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKO,cAAc,MAAuB,SAAyB;AACnE,cAAM,cAAc,KAAK,iBAAiB,IAAI;AAC9C,eAAO,KAAK,yBAAyB,aAAa,OAAO;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKO,YAAY,MAAqB,SAAyB;AAC/D,cAAM,cAAc,KAAK,iBAAiB,IAAI;AAC9C,eAAO,KAAK,yBAAyB,aAAa,OAAO;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKO,UAAU,UAAkB,MAAuB,SAAuB;AAC/E,cAAM,aAAa,KAAK,cAAc,MAAM,OAAO;AACnD,aAAK,sBAA2B,cAAQ,QAAQ,CAAC;AACjD,QAAG,kBAAc,UAAU,YAAY,MAAM;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKO,WAAW,UAAkB,MAAwB,SAAuB;AACjF,cAAM,aAAa,KAAK,eAAe,MAAM,OAAO;AACpD,aAAK,sBAA2B,cAAQ,QAAQ,CAAC;AACjD,QAAG,kBAAc,UAAU,YAAY,MAAM;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKO,UAAU,UAAkB,MAAuB,SAAuB;AAC/E,cAAM,aAAa,KAAK,cAAc,MAAM,OAAO;AACnD,aAAK,sBAA2B,cAAQ,QAAQ,CAAC;AACjD,QAAG,kBAAc,UAAU,YAAY,MAAM;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKO,QAAQ,UAAkB,MAAqB,SAAuB;AAC3E,cAAM,aAAa,KAAK,YAAY,MAAM,OAAO;AACjD,aAAK,sBAA2B,cAAQ,QAAQ,CAAC;AACjD,QAAG,kBAAc,UAAU,YAAY,MAAM;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKO,WAAW,UAAkB,SAA+C;AACjF,cAAM,WAAW,KAAK,aAAa,QAAQ;AAG3C,cAAM,UAAU;AAAA,UACd,GAAG;AAAA,UACH,GAAG;AAAA,UACH,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,QACvC;AAGA,YAAI,aAAa,WAAW,EAAE,cAAc,UAAU;AACpD,eAAK,UAAU,UAAU,SAA4B,SAAS,OAAO;AAAA,QACvE,WAAW,cAAc,WAAW,EAAE,aAAa,YAAY,EAAE,WAAW,UAAU;AACpF,eAAK,WAAW,UAAU,SAA6B,SAAS,OAAO;AAAA,QACzE,WAAW,aAAa,SAAS;AAC/B,eAAK,UAAU,UAAU,SAA4B,SAAS,OAAO;AAAA,QACvE,WAAW,WAAW,SAAS;AAC7B,eAAK,QAAQ,UAAU,SAA0B,SAAS,OAAO;AAAA,QACnE;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,aAAa,UAAoC;AACtD,cAAM,SAA4B,CAAC;AACnC,cAAM,WAA8B,CAAC;AAErC,YAAI;AACF,cAAI,CAAI,eAAW,QAAQ,GAAG;AAC5B,mBAAO,KAAK;AAAA,cACV,OAAO;AAAA,cACP,SAAS,wBAAwB,QAAQ;AAAA,cACzC,UAAU;AAAA,YACZ,CAAC;AACD,mBAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,UAC1C;AAEA,gBAAM,OAAO,KAAK,aAAa,QAAQ;AAGvC,cAAI,aAAa,QAAQ,EAAE,cAAc,OAAO;AAC9C,mBAAO,KAAK,iBAAiB,IAAgB;AAAA,UAC/C,WAAW,cAAc,QAAQ,EAAE,aAAa,SAAS,EAAE,WAAW,OAAO;AAC3E,mBAAO,KAAK,kBAAkB,IAAiB;AAAA,UACjD,WAAW,aAAa,MAAM;AAC5B,mBAAO,KAAK,iBAAiB,IAAgB;AAAA,UAC/C,WAAW,WAAW,MAAM;AAC1B,mBAAO,KAAK,eAAe,IAAc;AAAA,UAC3C;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,YACV,OAAO;AAAA,YACP,SAAS,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1F,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAEA,eAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA,MAKQ,UAAU,UAAoE;AACpF,YAAI,CAAI,eAAW,QAAQ,GAAG;AAC5B,gBAAM,IAAI,MAAM,mBAAmB,QAAQ,EAAE;AAAA,QAC/C;AAEA,cAAM,cAAiB,iBAAa,UAAU,MAAM;AACpD,cAAM,QAAQ,YAAY,MAAM,iBAAiB;AAEjD,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI,MAAM,4CAA4C,QAAQ,EAAE;AAAA,QACxE;AAEA,cAAM,CAAC,EAAE,aAAa,eAAe,IAAI;AAEzC,YAAI;AACF,gBAAM,cAAmB,YAAM,WAAW;AAC1C,iBAAO;AAAA,YACL;AAAA,YACA,SAAS,gBAAgB,KAAK;AAAA,UAChC;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,uCAAuC,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC9G;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,yBAAyB,aAA6B,SAAyB;AACrF,cAAM,aAAkB,gBAAU,aAAa;AAAA,UAC7C,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,iBAAiB;AAAA,QACnB,CAAC;AAED,eAAO,GAAG,qBAAqB;AAAA,EAAK,UAAU,GAAG,qBAAqB;AAAA;AAAA,EAAO,OAAO;AAAA;AAAA,MACtF;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAiB,MAAsC;AAC7D,cAAM,UAA+B,CAAC;AAEtC,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,cAAI,UAAU,UAAa,UAAU,MAAM;AACzC,oBAAQ,GAAG,IAAI;AAAA,UACjB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,sBAAsB,SAAuB;AACnD,YAAI,CAAI,eAAW,OAAO,GAAG;AAC3B,UAAG,cAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,wBAAwB,MAA6B;AAC3D,cAAM,WAAW,CAAC,WAAW,SAAS,UAAU,YAAY,YAAY,cAAc;AACtF,mBAAW,SAAS,UAAU;AAC5B,cAAI,CAAC,KAAK,KAA8B,GAAG;AACzC,kBAAM,IAAI,MAAM,gCAAgC,KAAK,EAAE;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,yBAAyB,MAA8B;AAC7D,cAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,mBAAW,SAAS,UAAU;AAC5B,cAAI,CAAC,KAAK,KAA+B,GAAG;AAC1C,kBAAM,IAAI,MAAM,iCAAiC,KAAK,EAAE;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,wBAAwB,MAA6B;AAC3D,cAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,mBAAW,SAAS,UAAU;AAC5B,cAAI,CAAC,KAAK,KAA8B,GAAG;AACzC,kBAAM,IAAI,MAAM,gCAAgC,KAAK,EAAE;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,sBAAsB,MAA2B;AACvD,cAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,mBAAW,SAAS,UAAU;AAC5B,cAAI,CAAC,KAAK,KAA4B,GAAG;AACvC,kBAAM,IAAI,MAAM,8BAA8B,KAAK,EAAE;AAAA,UACvD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAiB,MAAkC;AACzD,cAAM,SAA4B,CAAC;AACnC,cAAM,WAA8B,CAAC;AAGrC,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,WAAW,SAAS,uBAAuB,UAAU,QAAQ,CAAC;AACrF,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,SAAS,SAAS,qBAAqB,UAAU,QAAQ,CAAC;AACjF,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,UAAU,SAAS,sBAAsB,UAAU,QAAQ,CAAC;AAGnF,YAAI,KAAK,WAAW,CAAC,aAAa,KAAK,KAAK,OAAO,GAAG;AACpD,mBAAS,KAAK;AAAA,YACZ,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAEA,eAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA,MAKQ,kBAAkB,MAAmC;AAC3D,cAAM,SAA4B,CAAC;AACnC,cAAM,WAA8B,CAAC;AAGrC,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,YAAY,SAAS,wBAAwB,UAAU,QAAQ,CAAC;AACvF,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,SAAS,SAAS,qBAAqB,UAAU,QAAQ,CAAC;AAGjF,YAAI,KAAK,YAAY,CAAC,cAAc,KAAK,KAAK,QAAQ,GAAG;AACvD,mBAAS,KAAK;AAAA,YACZ,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAEA,eAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAiB,MAAkC;AACzD,cAAM,SAA4B,CAAC;AACnC,cAAM,WAA8B,CAAC;AAGrC,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,WAAW,SAAS,uBAAuB,UAAU,QAAQ,CAAC;AACrF,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,YAAY,SAAS,wBAAwB,UAAU,QAAQ,CAAC;AAGvF,YAAI,KAAK,WAAW,CAAC,cAAc,KAAK,KAAK,OAAO,GAAG;AACrD,mBAAS,KAAK;AAAA,YACZ,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAEA,eAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,MAAgC;AACrD,cAAM,SAA4B,CAAC;AACnC,cAAM,WAA8B,CAAC;AAGrC,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,SAAS,SAAS,qBAAqB,UAAU,QAAQ,CAAC;AACjF,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,YAAY,SAAS,wBAAwB,UAAU,QAAQ,CAAC;AACvF,YAAI,CAAC,KAAK;AACR,iBAAO,KAAK,EAAE,OAAO,aAAa,SAAS,yBAAyB,UAAU,QAAQ,CAAC;AAGzF,YAAI,KAAK,SAAS,CAAC,aAAa,KAAK,KAAK,KAAK,GAAG;AAChD,mBAAS,KAAK;AAAA,YACZ,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAGA,cAAM,kBAAkB,CAAC,SAAS,QAAQ,UAAU,YAAY,UAAU,QAAQ;AAClF,YAAI,KAAK,aAAa,CAAC,gBAAgB,SAAS,KAAK,SAAS,GAAG;AAC/D,iBAAO,KAAK;AAAA,YACV,OAAO;AAAA,YACP,SAAS,sBAAsB,KAAK,SAAS;AAAA,YAC7C,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAEA,eAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA,MAKO,eACL,SACA,UACe;AACf,YAAI,CAAI,eAAW,OAAO,GAAG;AAC3B,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,QACH,gBAAY,OAAO,EACnB,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EACrC,IAAI,CAAC,SAAc,WAAK,SAAS,IAAI,CAAC;AAEzC,cAAM,UAAyB,CAAC;AAEhC,mBAAW,YAAY,OAAO;AAC5B,cAAI;AACF,gBAAI;AAEJ,oBAAQ,UAAU;AAAA,cAChB,KAAK;AACH,uBAAO,KAAK,UAAU,QAAQ;AAC9B;AAAA,cACF,KAAK;AACH,uBAAO,KAAK,WAAW,QAAQ;AAC/B;AAAA,cACF,KAAK;AACH,uBAAO,KAAK,UAAU,QAAQ;AAC9B;AAAA,cACF,KAAK;AACH,uBAAO,KAAK,QAAQ,QAAQ;AAC5B;AAAA,cACF;AACE;AAAA,YACJ;AAEA,oBAAQ,KAAK,IAAI;AAAA,UACnB,SAAS,OAAO;AACd,oBAAQ;AAAA,cACN,mBAAmB,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1F;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AA9iB+B;AAAxB,IAAM,oBAAN;AAAA;AAAA;;;AC3BP,IAwBa;AAxBb;AAAA;AAAA;AAAA;AAqBA;AACA;AAEO,IAAM,uBAAN,MAAM,qBAAoB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA,YAAmC,oBAAI,IAAI;AAAA,MAC3C,aAAqC,oBAAI,IAAI;AAAA,MAC7C,YAAmC,oBAAI,IAAI;AAAA,MAC3C,UAA+B,oBAAI,IAAI;AAAA,MAEvC,kBAA0B;AAAA,MAC1B,cAAsB;AAAA;AAAA,MAE9B,YAAY,QAAuB,aAAsB,aAAsB;AAC7E,aAAK,SAAS,IAAI,kBAAkB;AACpC,aAAK,SAAS;AACd,aAAK,cAAc,eAAe,QAAQ,IAAI;AAC9C,aAAK,cAAc;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKO,iBAAiB,QAAsC;AAC5D,aAAK,qBAAqB;AAE1B,cAAM,OAAO,KAAK,UAAU,IAAI,MAAM;AACtC,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC,EAC/C,OAAO,CAAC,UAAU,MAAM,YAAY,MAAM,EAC1C,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,cAAc,EAAE,YAAY,CAAC;AAE9D,cAAM,QAAQ,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAC7C,OAAO,CAAC,SAAS,KAAK,YAAY,MAAM,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,cAAc,EAAE,YAAY,CAAC;AAE9D,cAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EACzC,OAAO,CAAC,OAAO,GAAG,YAAY,MAAM,EACpC,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,cAAc,EAAE,YAAY,CAAC;AAE9D,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,kBAAkB,SAAwC;AAC/D,aAAK,qBAAqB;AAE1B,cAAM,QAAQ,KAAK,WAAW,IAAI,OAAO;AACzC,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAC7C,OAAO,CAAC,SAAS,KAAK,aAAa,OAAO,EAC1C,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,cAAc,EAAE,YAAY,CAAC;AAE9D,cAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EACzC,OAAO,CAAC,OAAO,GAAG,aAAa,OAAO,EACtC,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,cAAc,EAAE,YAAY,CAAC;AAE9D,cAAM,OAAO,KAAK,UAAU,IAAI,MAAM,OAAO;AAE7C,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,eAAe,MAAkC;AACtD,aAAK,qBAAqB;AAE1B,cAAM,KAAK,KAAK,QAAQ,IAAI,IAAI;AAChC,YAAI,CAAC,IAAI;AACP,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,KAAK,WAAW,IAAI,GAAG,QAAQ;AAC7C,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AAEA,cAAM,OAAO,KAAK,UAAU,IAAI,GAAG,OAAO;AAE1C,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,iBAAiB,QAAsC;AAC5D,aAAK,qBAAqB;AAE1B,cAAM,OAAO,KAAK,UAAU,IAAI,MAAM;AACtC,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,KAAK,WAAW,IAAI,KAAK,QAAQ;AAC/C,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AAEA,cAAM,OAAO,KAAK,UAAU,KAAK,UAAU,IAAI,KAAK,OAAO,IAAI;AAE/D,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,YAAY,UAAkB,MAAuC;AAC1E,aAAK,qBAAqB;AAE1B,YAAI,SAAS,QAAQ;AACnB,iBAAO,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,YAAY,QAAQ;AAAA,QAC1F,WAAW,SAAS,SAAS;AAC3B,iBAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,aAAa,QAAQ;AAAA,QACxF;AAEA,eAAO,CAAC;AAAA,MACV;AAAA;AAAA;AAAA;AAAA,MAKO,UAAU,SAAiB,WAAwD;AACxF,aAAK,qBAAqB;AAE1B,YAAI,cAAc,SAAS;AACzB,gBAAM,QAAQ,KAAK,WAAW,IAAI,OAAO;AACzC,iBAAO,QAAQ,KAAK,UAAU,IAAI,MAAM,OAAO,KAAK,OAAO;AAAA,QAC7D,WAAW,cAAc,QAAQ;AAC/B,gBAAM,OAAO,KAAK,UAAU,IAAI,OAAO;AACvC,iBAAO,OAAO,KAAK,WAAW,IAAI,KAAK,QAAQ,KAAK,OAAO;AAAA,QAC7D,WAAW,cAAc,MAAM;AAC7B,gBAAM,KAAK,KAAK,QAAQ,IAAI,OAAO;AACnC,iBAAO,KAAK,KAAK,WAAW,IAAI,GAAG,QAAQ,KAAK,OAAO;AAAA,QACzD;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,gBAAgB,QAMrB;AACA,aAAK,qBAAqB;AAE1B,cAAM,OAAO,KAAK,aAAa,MAAM;AACrC,YAAI,CAAC,MAAM;AACT,iBAAO,EAAE,UAAU,CAAC,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,GAAG,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,QACtF;AAGA,YAAI,WAA0B,CAAC;AAC/B,YAAI,aAAa,MAAM;AACrB,qBAAW,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,YAC7C,CAAC,SAAS,KAAK,aAAa,KAAK,YAAY,KAAK,YAAY;AAAA,UAChE;AAAA,QACF,WAAW,WAAW,MAAM;AAC1B,qBAAW,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAAE;AAAA,YAC3C,CAAC,OAAO,GAAG,aAAa,KAAK,YAAY,GAAG,UAAU;AAAA,UACxD;AAAA,QACF,WAAW,cAAc,QAAQ,EAAE,aAAa,SAAS,EAAE,WAAW,OAAO;AAC3E,qBAAW,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC,EAAE;AAAA,YAC9C,CAAC,UAAU,MAAM,YAAY,KAAK,WAAW,MAAM,aAAa;AAAA,UAClE;AAAA,QACF;AAGA,cAAM,eAAe,KAAK,oBAAoB,KAAK,gBAAgB,CAAC,CAAC;AACrE,cAAM,aAAa,KAAK,eAAe,MAAM;AAG7C,cAAM,aAAa,gBAAgB,OAAO,KAAK,oBAAoB,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC;AAC7F,cAAM,SAAS,YAAY,OAAO,KAAK,oBAAoB,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC;AAEjF,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,OAAO,SAAmD;AAC/D,cAAM,YAAY,KAAK,IAAI;AAC3B,aAAK,qBAAqB;AAE1B,YAAI,WAA0B;AAAA,UAC5B,GAAG,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,UACrC,GAAG,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,UACtC,GAAG,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,UACrC,GAAG,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,QACrC;AAGA,YAAI,QAAQ,QAAQ;AAClB,gBAAM,WAAW,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,SAAS,CAAC,QAAQ,MAAM;AACjF,qBAAW,SAAS,OAAO,CAAC,SAAS,SAAS,SAAS,KAAK,MAAM,CAAC;AAAA,QACrE;AAEA,YAAI,QAAQ,UAAU;AACpB,gBAAM,aAAa,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,WAAW,CAAC,QAAQ,QAAQ;AACzF,qBAAW,SAAS,OAAO,CAAC,SAAS,WAAW,SAAS,KAAK,QAAQ,CAAC;AAAA,QACzE;AAEA,YAAI,QAAQ,UAAU;AACpB,gBAAM,YAAY,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,WAAW,CAAC,QAAQ,QAAQ;AACxF,qBAAW,SAAS,OAAO,CAAC,SAAS,UAAU,SAAS,KAAK,QAAQ,CAAC;AAAA,QACxE;AAEA,YAAI,QAAQ,MAAM;AAChB,gBAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ,OAAO,CAAC,QAAQ,IAAI;AACvE,qBAAW,SAAS,OAAO,CAAC,SAAS;AACnC,kBAAM,WAAW,UAAU,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC;AACrD,mBAAO,KAAK,KAAK,CAAC,QAAQ,SAAS,SAAS,GAAG,CAAC;AAAA,UAClD,CAAC;AAAA,QACH;AAEA,YAAI,QAAQ,eAAe;AACzB,qBAAW,SAAS,OAAO,CAAC,SAAS,KAAK,gBAAgB,QAAQ,aAAc;AAAA,QAClF;AAEA,YAAI,QAAQ,gBAAgB;AAC1B,qBAAW,SAAS,OAAO,CAAC,SAAS,KAAK,gBAAgB,QAAQ,cAAe;AAAA,QACnF;AAEA,YAAI,QAAQ,eAAe;AACzB,qBAAW,SAAS,OAAO,CAAC,SAAS,KAAK,gBAAgB,QAAQ,aAAc;AAAA,QAClF;AAEA,YAAI,QAAQ,gBAAgB;AAC1B,qBAAW,SAAS,OAAO,CAAC,SAAS,KAAK,gBAAgB,QAAQ,cAAe;AAAA,QACnF;AAEA,YAAI,QAAQ,gBAAgB;AAC1B,gBAAM,aAAa,QAAQ,eAAe,YAAY;AACtD,qBAAW,SAAS;AAAA,YAClB,CAAC,SACC,KAAK,MAAM,YAAY,EAAE,SAAS,UAAU,KAC5C,KAAK,YAAY,YAAY,EAAE,SAAS,UAAU,KAClD,KAAK,QAAQ,YAAY,EAAE,SAAS,UAAU;AAAA,UAClD;AAAA,QACF;AAEA,YAAI,QAAQ,mBAAmB;AAC7B,gBAAM,aAAa,QAAQ,kBAAkB,YAAY;AACzD,qBAAW,SAAS;AAAA,YAAO,CAAC,SAC1B,KAAK,WAAW,KAAK,CAAC,YAAY,QAAQ,YAAY,EAAE,SAAS,UAAU,CAAC;AAAA,UAC9E;AAAA,QACF;AAEA,cAAM,gBAAgB,KAAK,IAAI,IAAI;AAEnC,eAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa,SAAS;AAAA,UACtB,cAAc;AAAA,UACd,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,wBAA0C;AAC/C,aAAK,qBAAqB;AAE1B,cAAM,SAA4B,CAAC;AACnC,cAAM,WAA8B,CAAC;AAGrC,mBAAW,SAAS,KAAK,WAAW,OAAO,GAAG;AAC5C,cAAI,CAAC,KAAK,UAAU,IAAI,MAAM,OAAO,GAAG;AACtC,mBAAO,KAAK;AAAA,cACV,OAAO;AAAA,cACP,SAAS,SAAS,MAAM,QAAQ,iCAAiC,MAAM,OAAO;AAAA,cAC9E,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAGA,mBAAW,QAAQ,KAAK,UAAU,OAAO,GAAG;AAC1C,cAAI,CAAC,KAAK,WAAW,IAAI,KAAK,QAAQ,GAAG;AACvC,mBAAO,KAAK;AAAA,cACV,OAAO;AAAA,cACP,SAAS,QAAQ,KAAK,OAAO,kCAAkC,KAAK,QAAQ;AAAA,cAC5E,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAEA,cAAI,CAAC,KAAK,UAAU,IAAI,KAAK,OAAO,GAAG;AACrC,mBAAO,KAAK;AAAA,cACV,OAAO;AAAA,cACP,SAAS,QAAQ,KAAK,OAAO,iCAAiC,KAAK,OAAO;AAAA,cAC1E,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAGA,mBAAW,MAAM,KAAK,QAAQ,OAAO,GAAG;AACtC,cAAI,CAAC,KAAK,WAAW,IAAI,GAAG,QAAQ,GAAG;AACrC,mBAAO,KAAK;AAAA,cACV,OAAO;AAAA,cACP,SAAS,MAAM,GAAG,KAAK,kCAAkC,GAAG,QAAQ;AAAA,cACpE,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAEA,cAAI,CAAC,KAAK,UAAU,IAAI,GAAG,OAAO,GAAG;AACnC,mBAAO,KAAK;AAAA,cACV,OAAO;AAAA,cACP,SAAS,MAAM,GAAG,KAAK,iCAAiC,GAAG,OAAO;AAAA,cAClE,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAGA,cAAM,eAAe,KAAK,yBAAyB;AACnD,mBAAW,SAAS,cAAc;AAChC,iBAAO,KAAK;AAAA,YACV,OAAO;AAAA,YACP,SAAS,iCAAiC,MAAM,KAAK,UAAK,CAAC;AAAA,YAC3D,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAGA,mBAAW,QAAQ,KAAK,UAAU,OAAO,GAAG;AAC1C,gBAAM,QAAQ,KAAK,WAAW,IAAI,KAAK,QAAQ;AAC/C,cAAI,SAAS,KAAK,YAAY,MAAM,SAAS;AAC3C,qBAAS,KAAK;AAAA,cACZ,OAAO;AAAA,cACP,SAAS,QAAQ,KAAK,OAAO,aAAa,KAAK,OAAO,oCAAoC,MAAM,OAAO;AAAA,cACvG,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAGA,mBAAW,MAAM,KAAK,QAAQ,OAAO,GAAG;AACtC,gBAAM,QAAQ,KAAK,WAAW,IAAI,GAAG,QAAQ;AAC7C,cAAI,SAAS,GAAG,YAAY,MAAM,SAAS;AACzC,qBAAS,KAAK;AAAA,cACZ,OAAO;AAAA,cACP,SAAS,MAAM,GAAG,KAAK,aAAa,GAAG,OAAO,oCAAoC,MAAM,OAAO;AAAA,cAC/F,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO,OAAO,WAAW;AAAA,UACzB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,eAAqB;AAC1B,aAAK,UAAU,MAAM;AACrB,aAAK,WAAW,MAAM;AACtB,aAAK,UAAU,MAAM;AACrB,aAAK,QAAQ,MAAM;AAGnB,cAAM,eAAe,IAAI,oBAAoB,KAAK,QAAQ,KAAK,aAAa,KAAK,WAAW;AAC5F,cAAM,QAAQ,aAAa,gBAAgB;AAG3C,cAAM,QAAQ,KAAK,OAAO,eAAe,MAAM,UAAU,MAAM;AAC/D,mBAAW,QAAQ,OAAqB;AACtC,eAAK,UAAU,IAAI,KAAK,SAAS,IAAI;AAAA,QACvC;AAGA,cAAM,SAAS,KAAK,OAAO,eAAe,MAAM,WAAW,OAAO;AAClE,mBAAW,SAAS,QAAuB;AACzC,eAAK,WAAW,IAAI,MAAM,UAAU,KAAK;AAAA,QAC3C;AAGA,cAAM,QAAQ,KAAK,OAAO,eAAe,MAAM,UAAU,MAAM;AAC/D,mBAAW,QAAQ,OAAqB;AACtC,eAAK,UAAU,IAAI,KAAK,SAAS,IAAI;AAAA,QACvC;AAGA,cAAM,MAAM,KAAK,OAAO,eAAe,MAAM,QAAQ,IAAI;AACzD,mBAAW,MAAM,KAAiB;AAChC,eAAK,QAAQ,IAAI,GAAG,OAAO,EAAE;AAAA,QAC/B;AAEA,aAAK,kBAAkB,KAAK,IAAI;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKO,gBAOL;AACA,eAAO;AAAA,UACL,OAAO,KAAK,UAAU;AAAA,UACtB,QAAQ,KAAK,WAAW;AAAA,UACxB,OAAO,KAAK,UAAU;AAAA,UACtB,KAAK,KAAK,QAAQ;AAAA,UAClB,YAAY,IAAI,KAAK,KAAK,eAAe;AAAA,UACzC,SAAS,KAAK,IAAI,IAAI,KAAK,kBAAkB,KAAK;AAAA,QACpD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAA6B;AACnC,YAAI,KAAK,IAAI,IAAI,KAAK,kBAAkB,KAAK,aAAa;AACxD,eAAK,aAAa;AAAA,QACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAa,QAAoC;AACvD,eACE,KAAK,UAAU,IAAI,MAAM,KACzB,KAAK,WAAW,IAAI,MAAM,KAC1B,KAAK,UAAU,IAAI,MAAM,KACzB,KAAK,QAAQ,IAAI,MAAM,KACvB;AAAA,MAEJ;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAAoB,eAAwC;AAClE,cAAM,eAA8B,CAAC;AAErC,mBAAW,SAAS,eAAe;AACjC,gBAAM,OAAO,KAAK,aAAa,KAAK;AACpC,cAAI,MAAM;AACR,yBAAa,KAAK,IAAI;AAAA,UACxB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,QAA+B;AA3gBxD;AA4gBI,cAAM,aAA4B,CAAC;AAEnC,cAAM,WAAW;AAAA,UACf,GAAG,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,UACrC,GAAG,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,UACtC,GAAG,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,UACrC,GAAG,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,QACrC;AAEA,mBAAW,QAAQ,UAAU;AAC3B,eAAI,UAAK,iBAAL,mBAAmB,SAAS,SAAS;AACvC,uBAAW,KAAK,IAAI;AAAA,UACtB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,2BAAuC;AAC7C,cAAM,SAAqB,CAAC;AAC5B,cAAM,UAAU,oBAAI,IAAY;AAChC,cAAM,iBAAiB,oBAAI,IAAY;AAEvC,cAAM,WAAW;AAAA,UACf,GAAG,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,UACrC,GAAG,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,UACtC,GAAG,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,UACrC,GAAG,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,QACrC;AAEA,mBAAW,QAAQ,UAAU;AAC3B,gBAAM,SAAS,KAAK,UAAU,IAAI;AAClC,cAAI,CAAC,QAAQ,IAAI,MAAM,GAAG;AACxB,kBAAMC,SAAiB,CAAC;AACxB,iBAAK,aAAa,QAAQ,SAAS,gBAAgBA,QAAM,MAAM;AAAA,UACjE;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,aACN,QACA,SACA,gBACAA,QACA,QACM;AACN,gBAAQ,IAAI,MAAM;AAClB,uBAAe,IAAI,MAAM;AACzB,QAAAA,OAAK,KAAK,MAAM;AAEhB,cAAM,OAAO,KAAK,aAAa,MAAM;AACrC,YAAI,6BAAM,cAAc;AACtB,qBAAW,SAAS,KAAK,cAAc;AACrC,gBAAI,CAAC,QAAQ,IAAI,KAAK,GAAG;AACvB,mBAAK,aAAa,OAAO,SAAS,gBAAgBA,QAAM,MAAM;AAAA,YAChE,WAAW,eAAe,IAAI,KAAK,GAAG;AAEpC,oBAAM,aAAaA,OAAK,QAAQ,KAAK;AACrC,oBAAM,QAAQA,OAAK,MAAM,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC;AACnD,qBAAO,KAAK,KAAK;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAEA,uBAAe,OAAO,MAAM;AAC5B,QAAAA,OAAK,IAAI;AAAA,MACX;AAAA;AAAA;AAAA;AAAA,MAKQ,UAAU,MAA2B;AAC3C,YAAI,aAAa,QAAQ,EAAE,cAAc,OAAO;AAC9C,iBAAO,KAAK;AAAA,QACd,WAAW,cAAc,QAAQ,EAAE,aAAa,SAAS,EAAE,WAAW,OAAO;AAC3E,iBAAO,KAAK;AAAA,QACd,WAAW,aAAa,MAAM;AAC5B,iBAAO,KAAK;AAAA,QACd,WAAW,WAAW,MAAM;AAC1B,iBAAO,KAAK;AAAA,QACd;AACA,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA,MAKO,qBAWL;AACA,aAAK,qBAAqB;AAE1B,cAAM,WAAW;AAAA,UACf,GAAG,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,UACrC,GAAG,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,UACtC,GAAG,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,UACrC,GAAG,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,QACrC;AAEA,cAAM,kBAA0C,CAAC;AACjD,cAAM,oBAA4C,CAAC;AAEnD,mBAAW,QAAQ,UAAU;AAC3B,0BAAgB,KAAK,MAAM,KAAK,gBAAgB,KAAK,MAAM,KAAK,KAAK;AACrE,4BAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,KAAK;AAAA,QAC/E;AAEA,cAAM,iBAAiB,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,UACzD,CAAC,MAAM,EAAE,WAAW;AAAA,QACtB,EAAE;AACF,cAAM,kBAAkB,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC,EAAE;AAAA,UAC3D,CAAC,MAAM,EAAE,WAAW;AAAA,QACtB,EAAE;AACF,cAAM,iBAAiB,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,UACzD,CAAC,MAAM,EAAE,WAAW;AAAA,QACtB,EAAE;AACF,cAAM,eAAe,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAAE;AAAA,UACrD,CAAC,MAAM,EAAE,WAAW,eAAe,EAAE,cAAc;AAAA,QACrD,EAAE;AAEF,cAAM,aAAa,SAAS;AAC5B,cAAM,iBAAiB,iBAAiB,kBAAkB,iBAAiB;AAC3E,cAAM,oBAAoB,aAAa,IAAK,iBAAiB,aAAc,MAAM;AAEjF,eAAO;AAAA,UACL,QAAQ;AAAA,YACN,OAAO,KAAK,UAAU;AAAA,YACtB,QAAQ,KAAK,WAAW;AAAA,YACxB,OAAO,KAAK,UAAU;AAAA,YACtB,KAAK,KAAK,QAAQ;AAAA,UACpB;AAAA,UACA,kBAAkB;AAAA,UAClB,oBAAoB;AAAA,UACpB,oBAAoB;AAAA,YAClB,iBAAiB;AAAA,YACjB,kBAAkB;AAAA,YAClB,iBAAiB;AAAA,YACjB,eAAe;AAAA,YACf,oBAAoB,KAAK,MAAM,oBAAoB,GAAG,IAAI;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,YAAsB;AAC3B,aAAK,qBAAqB;AAC1B,eAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKO,cAA0B;AAC/B,aAAK,qBAAqB;AAC1B,eAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA,MAKO,eAA4B;AACjC,aAAK,qBAAqB;AAC1B,eAAO,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA,MAKO,cAA0B;AAC/B,aAAK,qBAAqB;AAC1B,eAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,MAC3C;AAAA,IACF;AAnrBiC;AAA1B,IAAM,sBAAN;AAAA;AAAA;;;ACFA,SAAS,yBAAkC;AAChD,QAAM,MAAM,IAAI,yBAAQ,SAAS;AAEjC,MACG,YAAY,6BAA6B,EACzC,OAAO,sBAAsB,4BAA4B,EACzD,OAAO,mBAAmB,kDAAkD,EAC5E,OAAO,sBAAsB,qDAAqD,EAClF,OAAO,cAAc,oCAAoC,EACzD,OAAO,WAAW,4BAA4B,EAC9C,OAAO,kBAAkB,kCAAkC,EAC3D,OAAO,uBAAuB,mCAAmC,OAAO,EACxE,OAAO,OAAO,YAA4B;AACzC,QAAI;AACF,YAAM,cAAc,OAAO;AAAA,IAC7B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACvF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,cAAc,SAAwC;AACnE,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,QAAM,SAAS,IAAI,kBAAkB;AAGrC,MAAI,QAAQ,UAAU;AACpB,UAAM,qBAAqB,MAAM;AACjC;AAAA,EACF;AAGA,MAAI,QAAQ,QAAS,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAAO,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAAQ;AAC1F,UAAM,YAAY,qBAAqB,QAAQ,QAAQ,QAAQ,UAAU,OAAO;AAChF;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,QAAM,kBAAkB,qBAAqB,QAAQ,OAAO;AAC9D;AAEA,eAAe,qBAAqB,QAAsC;AACxE,UAAQ,IAAI,UAAU,QAAQ,sBAAsB,CAAC;AACrD,UAAQ,IAAI,EAAE;AAEd,MAAI,OAAO,wBAAwB,OAAO,qBAAqB,SAAS,GAAG;AACzE,YAAQ,IAAI,UAAU,KAAK,sBAAsB,CAAC;AAClD,eAAW,YAAY,OAAO,sBAAsB;AAClD,cAAQ,IAAI,YAAO,QAAQ,EAAE;AAAA,IAC/B;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,UAAU,QAAQ,qCAAqC,CAAC;AACpE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,6BAA6B,CAAC;AACzD,YAAQ,IAAI,+BAA0B;AACtC,YAAQ,IAAI,8BAAyB;AACrC,YAAQ,IAAI,8BAAyB;AACrC,YAAQ,IAAI,+BAA0B;AACtC,YAAQ,IAAI,6BAAwB;AACpC,YAAQ,IAAI,kCAA6B;AACzC,YAAQ,IAAI,sCAAiC;AAAA,EAC/C;AACF;AAEA,eAAe,YACb,qBACA,QACA,SAAiB,SACF;AACf,MAAI,QAAQ;AAEV,UAAM,eAAe,oBAAoB,OAAO,EAAE,gBAAgB,OAAO,CAAC;AAC1E,UAAM,OAAO,aAAa,MAAM,KAAK,CAACC,UAAS;AAC7C,UAAI,OAAO,WAAW,KAAK,KAAK,aAAaA,MAAM,QAAOA,MAAK,YAAY;AAC3E,UAAI,OAAO,WAAW,MAAM,KAAK,cAAcA,MAAM,QAAOA,MAAK,aAAa;AAC9E,UAAI,OAAO,WAAW,MAAM,KAAK,aAAaA,MAAM,QAAOA,MAAK,YAAY;AAC5E,aAAO;AAAA,IACT,CAAC;AAED,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,YAAQ,IAAI,UAAU,QAAQ,kBAAkB,MAAM,KAAK,KAAK,KAAK,EAAE,CAAC;AACxE,YAAQ,IAAI,EAAE;AAEd,QAAI,KAAK,cAAc,KAAK,WAAW,SAAS,GAAG;AACjD,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,kBAAQ,IAAI,KAAK,UAAU,KAAK,YAAY,MAAM,CAAC,CAAC;AACpD;AAAA,QACF,KAAK;AACH,qBAAW,WAAW,KAAK,YAAY;AACrC,oBAAQ,IAAI,OAAO;AAAA,UACrB;AACA;AAAA,QACF;AACE,mBAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,KAAK;AAC/C,oBAAQ,IAAI,GAAG,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,EAAE;AAAA,UAC/C;AAAA,MACJ;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,UAAU,KAAK,yCAAyC,CAAC;AAAA,IACvE;AAAA,EACF,OAAO;AAEL,UAAM,eAAe,oBAAoB,OAAO,CAAC,CAAC;AAClD,UAAM,mBAAmB,aAAa,MAAM;AAAA,MAC1C,CAAC,SAAS,KAAK,cAAc,KAAK,WAAW,SAAS;AAAA,IACxD;AAEA,YAAQ,IAAI,UAAU,QAAQ,qBAAqB,CAAC;AACpD,YAAQ,IAAI,EAAE;AAEd,QAAI,iBAAiB,WAAW,GAAG;AACjC,cAAQ,IAAI,UAAU,KAAK,sCAAsC,CAAC;AAClE;AAAA,IACF;AAEA,YAAQ,QAAQ;AAAA,MACd,KAAK,QAAQ;AACX,cAAM,WAAW,iBAAiB,IAAI,CAAC,UAAU;AAAA,UAC/C,IAAI,UAAU,IAAI;AAAA,UAClB,OAAO,KAAK;AAAA,UACZ,MAAM,YAAY,IAAI;AAAA,UACtB,YAAY,KAAK;AAAA,QACnB,EAAE;AACF,gBAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C;AAAA,MACF;AAAA,MAEA;AAEE,mBAAW,QAAQ,kBAAkB;AACnC,kBAAQ,IAAI,UAAU,KAAK,GAAG,UAAU,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;AAC/D,qBAAW,WAAW,KAAK,YAAY;AACrC,oBAAQ,IAAI,YAAO,OAAO,EAAE;AAAA,UAC9B;AACA,kBAAQ,IAAI,EAAE;AAAA,QAChB;AAAA,IACJ;AAEA,YAAQ,IAAI,UAAU,QAAQ,6BAA6B,iBAAiB,MAAM,EAAE,CAAC;AAAA,EACvF;AACF;AAEA,eAAe,kBACb,qBACA,QACA,SACe;AAEf,MAAI,CAAC,QAAQ,QAAQ;AACnB,YAAQ,MAAM,UAAU,MAAM,qBAAqB,CAAC;AACpD;AAAA,EACF;AACA,QAAM,eAAe,oBAAoB,OAAO,EAAE,gBAAgB,QAAQ,OAAO,CAAC;AAClF,QAAM,OAAO,aAAa,MAAM,KAAK,CAACA,UAAS;AAtMjD;AAuMI,UAAI,aAAQ,WAAR,mBAAgB,WAAW,WAAU,aAAaA;AACpD,aAAOA,MAAK,YAAY,QAAQ;AAClC,UAAI,aAAQ,WAAR,mBAAgB,WAAW,YAAW,cAAcA;AACtD,aAAOA,MAAK,aAAa,QAAQ;AACnC,UAAI,aAAQ,WAAR,mBAAgB,WAAW,YAAW,aAAaA;AACrD,aAAOA,MAAK,YAAY,QAAQ;AAClC,WAAO;AAAA,EACT,CAAC;AAED,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,mBAAmB,QAAQ,MAAM,EAAE;AAAA,EACrD;AAEA,MAAI,iBAAiB,CAAC,GAAI,KAAK,cAAc,CAAC,CAAE;AAChD,MAAI,aAAa;AAGjB,MAAI,QAAQ,OAAO;AACjB,qBAAiB,CAAC;AAClB,iBAAa;AAAA,EACf;AAGA,MAAI,QAAQ,KAAK;AACf,UAAM,QAAQ,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC5D,eAAW,OAAO,OAAO;AACvB,UAAI,CAAC,eAAe,SAAS,GAAG,GAAG;AACjC,uBAAe,KAAK,GAAG;AACvB,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ;AAClB,UAAM,WAAW,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAClE,UAAM,iBAAiB,eAAe;AACtC,qBAAiB,eAAe,OAAO,CAAC,QAAQ,CAAC,SAAS,SAAS,GAAG,CAAC;AACvE,iBAAa,mBAAmB,eAAe;AAAA,EACjD;AAEA,MAAI,CAAC,YAAY;AACf,YAAQ,IAAI,UAAU,QAAQ,qBAAqB,CAAC;AACpD;AAAA,EACF;AAGA,QAAM,UAAU;AAAA,IACd,YAAY,eAAe,SAAS,IAAI,iBAAiB,CAAC;AAAA,IAC1D,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvC;AAEA,QAAM,cAAc,OAAO,WAAW,KAAK,WAAW,OAAO;AAG7D,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,kCAAkC,CAAC;AACjE,UAAQ,IAAI,UAAU,KAAK,SAAS,QAAQ,MAAM,MAAM,KAAK,KAAK,EAAE,CAAC;AACrE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,QAAQ,qBAAqB,CAAC;AAEpD,MAAI,YAAY,cAAc,YAAY,WAAW,SAAS,GAAG;AAC/D,aAAS,IAAI,GAAG,IAAI,YAAY,WAAW,QAAQ,KAAK;AACtD,cAAQ,IAAI,GAAG,IAAI,CAAC,KAAK,YAAY,WAAW,CAAC,CAAC,EAAE;AAAA,IACtD;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,UAAU,KAAK,4BAA4B,CAAC;AAAA,EAC1D;AACF;AAEA,SAAS,UAAU,MAA2B;AAC5C,MAAI,KAAK,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AACjE,MAAI,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AAChD,MAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,SAAO;AACT;AAEA,SAAS,YAAY,MAA2B;AAC9C,MAAI,KAAK,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO;AAC5D,MAAI,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO;AAC3C,MAAI,KAAK,QAAS,QAAO;AACzB,SAAO;AACT;AA1RA,IAKA;AALA;AAAA;AAAA;AAAA;AAKA,uBAAwB;AAExB;AACA;AACA;AACA;AAYgB;AA4BD;AAgCA;AAuBA;AAkFA;AAmFN;AAOA;AAAA;AAAA;;;ACnPF,SAAS,8BAAuC;AACrD,QAAM,MAAM,IAAI,0BAAQ,mBAAmB;AAE3C,MACG,YAAY,+CAA+C,EAC3D,OAAO,uBAAuB,oBAAoB,UAAU,EAC5D,OAAO,qBAAqB,gCAAgC,EAC5D,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,uBAAuB,6CAA6C,UAAU,EACrF,OAAO,aAAa,oDAAoD,EACxE,OAAO,OAAO,YAA6B;AAC1C,QAAI;AACF,YAAM,gBAAgB,OAAO;AAAA,IAC/B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC1F;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,gBAAgB,SAAyC;AACtE,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,WAAW,oBAAoB,mBAAmB;AAGxD,QAAM,eAAe,oBAAoB,OAAO,CAAC,CAAC;AAClD,QAAM,WAAW,aAAa;AAG9B,MAAI,gBAAgB;AACpB,MAAI,CAAC,QAAQ,kBAAkB;AAC7B,oBAAgB,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW;AAAA,EACvE;AAGA,QAAM,QAAQ,cAAc,OAAO,CAAC,SAAS,aAAa,QAAQ,EAAE,cAAc,KAAK;AACvF,QAAM,SAAS,cAAc,OAAO,CAAC,SAAS,cAAc,QAAQ,EAAE,aAAa,KAAK;AACxF,QAAM,QAAQ,cAAc,OAAO,CAAC,SAAS,aAAa,IAAI;AAG9D,MAAI,UAAU;AAEd,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACH,gBAAU,sBAAsB,QAAQ,UAAU,OAAO,QAAQ,KAAK;AACtE;AAAA,IACF,KAAK;AACH,gBAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AACA;AAAA,IACF;AACE,gBAAU,uBAAuB,QAAQ,UAAU,OAAO,QAAQ,KAAK;AAAA,EAC3E;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,uCAAuC,CAAC;AACnE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,OAAO;AACnB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,mBAAmB,QAAQ,MAAM,aAAa,CAAC;AAC1E;AAAA,EACF;AAGA,QAAM,aAAkB,cAAQ,QAAQ,UAAU,UAAU;AAC5D,EAAG,kBAAc,YAAY,SAAS,MAAM;AAE5C,UAAQ,IAAI,UAAU,QAAQ,kCAAkC,CAAC;AACjE,UAAQ,IAAI,UAAU,KAAK,WAAW,UAAU,EAAE,CAAC;AACnD,UAAQ,IAAI,UAAU,KAAK,WAAW,QAAQ,UAAU,UAAU,EAAE,CAAC;AACrE,UAAQ,IAAI,UAAU,KAAK,mBAAmB,QAAQ,MAAM,aAAa,CAAC;AAC1E,UAAQ,IAAI,UAAU,KAAK,mBAAmB,cAAc,MAAM,QAAQ,CAAC;AAC3E,UAAQ,IAAI,mBAAc,MAAM,MAAM,EAAE;AACxC,UAAQ,IAAI,oBAAe,OAAO,MAAM,EAAE;AAC1C,UAAQ,IAAI,mBAAc,MAAM,MAAM,EAAE;AAC1C;AAEA,SAAS,sBACP,QACA,UACA,OACA,QACA,OACQ;AACR,SAAO,KAAK,OAAO,IAAI;AAAA;AAAA;AAAA,qBAGJ,SAAS,OAAO,QAAQ,SAAS,OAAO,SAAS,SAAS,OAAO,KAAK;AAAA,yBAClE,SAAS,mBAAmB,kBAAkB;AAAA,oBACpD,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA;AAAA,EAGzC,OAAO,QAAQ,SAAS,gBAAgB,EACvC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,OAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC,CAAC,OAAO,KAAK,EAAE,EAC9F,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAGX,OAAO,QAAQ,SAAS,kBAAkB,EACzC;AAAA,IACC,CAAC,CAAC,UAAU,KAAK,MAAM,OAAO,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC,CAAC,OAAO,KAAK;AAAA,EAChG,EACC,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,aAIA,MAAM,MAAM;AAAA,EACvB,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,cAEvE,OAAO,MAAM;AAAA,EACzB,OAAO,IAAI,CAAC,UAAU,KAAK,MAAM,QAAQ,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,aAE9E,MAAM,MAAM;AAAA,EACvB,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAErF;AAEA,SAAS,uBACP,QACA,UACA,OACA,QACA,OACQ;AACR,MAAI,UAAU,KAAK,OAAO,IAAI;AAAA;AAAA,kBAEf,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA,eAI1B,MAAM,MAAM;AAAA,gBACX,OAAO,MAAM;AAAA,eACd,MAAM,MAAM;AAAA,4BACC,SAAS,mBAAmB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAOxE,QAAM,eAAe,OAAO;AAAA,IAC1B,CAAC,KAAK,UAAU;AACd,UAAI,CAAC,IAAI,MAAM,OAAO,EAAG,KAAI,MAAM,OAAO,IAAI,CAAC;AAC/C,UAAI,MAAM,OAAO,EAAE,KAAK,KAAK;AAC7B,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAGA,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,KAAK,SAAS;AACb,UAAI,CAAC,IAAI,KAAK,QAAQ,EAAG,KAAI,KAAK,QAAQ,IAAI,CAAC;AAC/C,UAAI,KAAK,QAAQ,EAAE,KAAK,IAAI;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,aAAW,QAAQ,OAAO;AACxB,eAAW,OAAO,KAAK,OAAO,KAAK,KAAK,KAAK;AAAA;AAC7C,eAAW,eAAe,KAAK,MAAM,oBAAoB,KAAK,QAAQ,oBAAoB,KAAK,QAAQ;AAAA;AACvG,QAAI,KAAK,aAAa;AACpB,iBAAW,oBAAoB,KAAK,WAAW;AAAA;AAAA,IACjD;AACA,eAAW;AAEX,UAAM,aAAa,aAAa,KAAK,OAAO,KAAK,CAAC;AAClD,eAAW,SAAS,YAAY;AAC9B,iBAAW,QAAQ,MAAM,QAAQ,KAAK,MAAM,KAAK;AAAA;AACjD,iBAAW,eAAe,MAAM,MAAM,oBAAoB,MAAM,QAAQ,oBAAoB,MAAM,QAAQ;AAAA;AAC1G,UAAI,MAAM,aAAa;AACrB,mBAAW,oBAAoB,MAAM,WAAW;AAAA;AAAA,MAClD;AACA,iBAAW;AAEX,YAAM,aAAa,aAAa,MAAM,QAAQ,KAAK,CAAC;AACpD,UAAI,WAAW,SAAS,GAAG;AACzB,mBAAW;AAAA;AACX,mBAAW,QAAQ,YAAY;AAC7B,qBAAW,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA;AAAA,QAC7D;AACA,mBAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBACP,QACA,UACA,OACA,QACA,OACA,iBAA0B,OAClB;AACR,MAAI,UAAU,uBAAuB,QAAQ,UAAU,OAAO,QAAQ,KAAK;AAE3E,MAAI,gBAAgB;AAClB,eAAW;AAEX,eAAW,QAAQ,OAAO;AACxB,iBAAW,OAAO,KAAK,OAAO;AAAA;AAC9B,iBAAW;AACX,iBAAW,KAAK,WAAW;AAC3B,iBAAW;AAAA,IACb;AAEA,eAAW,SAAS,QAAQ;AAC1B,iBAAW,OAAO,MAAM,QAAQ;AAAA;AAChC,iBAAW;AACX,iBAAW,MAAM,WAAW;AAC5B,iBAAW;AAAA,IACb;AAEA,eAAW,QAAQ,OAAO;AACxB,iBAAW,OAAO,KAAK,OAAO;AAAA;AAC9B,iBAAW;AACX,iBAAW,KAAK,WAAW;AAC3B,iBAAW;AAAA,IACb;AAAA,EACF;AAGA,aAAW;AACX,MAAI,OAAO,wBAAwB,OAAO,qBAAqB,SAAS,GAAG;AACzE,eAAW,YAAY,OAAO,sBAAsB;AAClD,iBAAW,KAAK,QAAQ;AAAA;AAAA,IAC1B;AAAA,EACF,OAAO;AACL,eAAW;AAAA,EACb;AAGA,aAAW;AACX,QAAM,iBAAiB,CAAC,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,EAAE;AAAA,IACrD,CAAC,KAAK,SAAS,OAAO,KAAK,oBAAoB;AAAA,IAC/C;AAAA,EACF;AACA,QAAM,cAAc,CAAC,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,EAAE;AAAA,IAClD,CAAC,KAAK,SAAS,OAAO,KAAK,iBAAiB;AAAA,IAC5C;AAAA,EACF;AAEA,aAAW,iCAAiC,cAAc;AAAA;AAC1D,aAAW,8BAA8B,WAAW;AAAA;AACpD,MAAI,iBAAiB,GAAG;AACtB,eAAW,4BAA6B,cAAc,iBAAkB,KAAK,QAAQ,CAAC,CAAC;AAAA;AAAA,EACzF;AAEA,SAAO;AACT;AApTA,IAKAC,KACAC,OACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,MAAoB;AACpB,IAAAC,QAAsB;AACtB,IAAAC,oBAAwB;AAExB;AACA;AACA;AAuBgB;AA0BD;AAyEN;AAuCA;AAyEA;AAAA;AAAA;;;AChOF,SAAS,6BAAsC;AACpD,QAAM,MAAM,IAAI,0BAAQ,cAAc;AAEtC,MACG,YAAY,2CAA2C,EACvD,OAAO,sBAAsB,4BAA4B,EACzD,OAAO,qBAAqB,oCAAoC,EAChE,OAAO,4BAA4B,sBAAsB,EACzD,OAAO,yBAAyB,mBAAmB,EACnD,OAAO,wBAAwB,uBAAuB,KAAK,EAC3D,OAAO,gBAAgB,yBAAyB,EAChD,OAAO,uBAAuB,sCAAsC,OAAO,EAC3E,OAAO,OAAO,YAA0B;AACvC,QAAI;AACF,YAAM,YAAY,OAAO;AAAA,IAC3B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACrF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YAAY,SAAsC;AAC/D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,QAAM,SAAS,IAAI,kBAAkB;AAGrC,MAAI,QAAQ,UAAW,CAAC,QAAQ,UAAU,CAAC,QAAQ,aAAa,CAAC,QAAQ,QAAS;AAChF,UAAM,gBAAgB,qBAAqB,QAAQ,UAAU,SAAS,QAAQ,IAAI;AAClF;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ;AAClB,UAAM,iBAAiB,qBAAqB,QAAQ,OAAO;AAC3D;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,yEAAyE;AAC3F;AAEA,eAAe,iBACb,qBACA,QACA,SACe;AAEf,QAAM,eAAe,oBAAoB,OAAO,EAAE,gBAAgB,QAAQ,OAAQ,CAAC;AACnF,QAAM,OAAO,aAAa,MAAM,KAAK,CAACC,UAAS;AAnFjD;AAoFI,UAAI,aAAQ,WAAR,mBAAgB,WAAW,WAAU,aAAaA;AACpD,aAAOA,MAAK,YAAY,QAAQ;AAClC,UAAI,aAAQ,WAAR,mBAAgB,WAAW,YAAW,cAAcA;AACtD,aAAOA,MAAK,aAAa,QAAQ;AACnC,UAAI,aAAQ,WAAR,mBAAgB,WAAW,YAAW,aAAaA;AACrD,aAAOA,MAAK,YAAY,QAAQ;AAClC,WAAO;AAAA,EACT,CAAC;AAED,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,mBAAmB,QAAQ,MAAM,EAAE;AAAA,EACrD;AAGA,QAAM,UAAe;AAAA,IACnB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvC;AAEA,MAAI,QAAQ,cAAc,QAAW;AACnC,QAAI,QAAQ,cAAc,OAAO;AAC/B,cAAQ,oBAAoB,KAAK,oBAAoB,KAAK,QAAQ;AAAA,IACpE,OAAO;AACL,cAAQ,mBAAmB,QAAQ;AAAA,IACrC;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,QAAW;AAChC,QAAI,QAAQ,cAAc,OAAO;AAC/B,cAAQ,iBAAiB,KAAK,iBAAiB,KAAK,QAAQ;AAAA,IAC9D,OAAO;AACL,cAAQ,gBAAgB,QAAQ;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,cAAc,OAAO,WAAW,KAAK,WAAW,OAAO;AAG7D,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,mCAAmC,CAAC;AAClE,UAAQ,IAAI,UAAU,KAAK,SAAS,QAAQ,MAAM,MAAM,KAAK,KAAK,EAAE,CAAC;AACrE,UAAQ;AAAA,IACN,UAAU;AAAA,MACR,qBAAqB,KAAK,oBAAoB,CAAC,WAAM,YAAY,oBAAoB,CAAC;AAAA,IACxF;AAAA,EACF;AACA,UAAQ;AAAA,IACN,UAAU,KAAK,kBAAkB,KAAK,iBAAiB,CAAC,WAAM,YAAY,iBAAiB,CAAC,EAAE;AAAA,EAChG;AAEA,MAAI,YAAY,mBAAmB,GAAG;AACpC,UAAM,cAAc,YAAY,iBAAiB,KAAK,YAAY;AAClE,UAAM,oBACJ,cAAc,IACV,UAAU,QAAQ,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG,IACrD,UAAU,QAAQ,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC3D,YAAQ,IAAI,UAAU,KAAK,qBAAqB,iBAAiB,EAAE,CAAC;AAAA,EACtE;AACF;AAEA,eAAe,gBACb,qBACA,QACA,YACe;AAEf,QAAM,eAAe,oBAAoB,OAAO,CAAC,CAAC;AAClD,MAAI,QAAQ,aAAa;AAGzB,MAAI,YAAY;AACd,YAAQ,MAAM,OAAO,CAAC,SAAS;AAC7B,cAAQ,YAAY;AAAA,QAClB,KAAK;AACH,iBAAO,aAAa,QAAQ,EAAE,cAAc;AAAA,QAC9C,KAAK;AACH,iBAAO,cAAc,QAAQ,EAAE,aAAa;AAAA,QAC9C,KAAK;AACH,iBAAO,aAAa;AAAA,QACtB;AACE,iBAAO;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,iBAAiB,MAAM,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,oBAAoB,IAAI,CAAC;AACxF,QAAM,cAAc,MAAM,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,iBAAiB,IAAI,CAAC;AAClF,QAAM,oBAAoB,iBAAiB,IAAK,cAAc,iBAAkB,MAAM;AAGtF,UAAQ,QAAQ;AAAA,IACd,KAAK,QAAQ;AACX,YAAM,aAAa;AAAA,QACjB,SAAS;AAAA,UACP,aAAa,MAAM;AAAA,UACnB,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,uBAAuB;AAAA,QACzB;AAAA,QACA,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,UAC1B,IAAIC,WAAU,IAAI;AAAA,UAClB,OAAO,KAAK;AAAA,UACZ,MAAMC,aAAY,IAAI;AAAA,UACtB,QAAQ,KAAK;AAAA,UACb,kBAAkB,KAAK,oBAAoB;AAAA,UAC3C,eAAe,KAAK,iBAAiB;AAAA,UACrC,YACE,KAAK,mBAAmB,KAClB,KAAK,iBAAiB,KAAK,KAAK,mBAAoB,MACtD;AAAA,QACR,EAAE;AAAA,MACJ;AACA,cAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC/C;AAAA,IACF;AAAA,IAEA,KAAK,WAAW;AACd,cAAQ,IAAI,UAAU,QAAQ,qBAAqB,CAAC;AACpD,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,gBAAgB,MAAM,MAAM,EAAE;AAC1C,cAAQ,IAAI,2BAA2B,cAAc,EAAE;AACvD,cAAQ,IAAI,wBAAwB,WAAW,EAAE;AACjD,cAAQ,IAAI,uBAAuB,kBAAkB,QAAQ,CAAC,CAAC,GAAG;AAClE,cAAQ,IAAI,EAAE;AAGd,YAAM,SAAS,MAAM;AAAA,QACnB,CAAC,KAAK,SAAS;AACb,gBAAM,OAAOA,aAAY,IAAI;AAC7B,cAAI,CAAC,IAAI,IAAI,EAAG,KAAI,IAAI,IAAI,CAAC;AAC7B,cAAI,IAAI,EAAE,KAAK,IAAI;AACnB,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AAEA,iBAAW,CAAC,MAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,GAAG;AACtD,cAAM,gBAAgB,UAAU;AAAA,UAC9B,CAAC,KAAK,SAAS,OAAO,KAAK,oBAAoB;AAAA,UAC/C;AAAA,QACF;AACA,cAAM,aAAa,UAAU,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,iBAAiB,IAAI,CAAC;AACrF,cAAM,iBAAiB,gBAAgB,IAAK,aAAa,gBAAiB,MAAM;AAEhF,gBAAQ,IAAI,GAAG,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,IAAI;AAC/D,gBAAQ,IAAI,YAAY,UAAU,MAAM,EAAE;AAC1C,gBAAQ,IAAI,gBAAgB,aAAa,EAAE;AAC3C,gBAAQ,IAAI,aAAa,UAAU,EAAE;AACrC,gBAAQ,IAAI,iBAAiB,eAAe,QAAQ,CAAC,CAAC,GAAG;AACzD,gBAAQ,IAAI,EAAE;AAAA,MAChB;AACA;AAAA,IACF;AAAA,IAEA,SAAS;AAEP,cAAQ,IAAI,UAAU,QAAQ,oBAAoB,CAAC;AACnD,cAAQ,IAAI,EAAE;AAEd,UAAI,MAAM,WAAW,GAAG;AACtB,gBAAQ,IAAI,UAAU,KAAK,iBAAiB,CAAC;AAC7C;AAAA,MACF;AAGA,YAAM,UAAU,CAAC,MAAM,SAAS,QAAQ,UAAU,aAAa,UAAU,YAAY;AACrF,YAAM,YAAY,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE;AAG5C,oBAAc,SAAS,WAAW,IAAI;AACtC,qBAAe,SAAS;AAGxB,iBAAW,QAAQ,OAAO;AACxB,cAAM,aACJ,KAAK,mBAAmB,IACpB,KAAM,KAAK,iBAAiB,KAAK,KAAK,mBAAoB,KAAK,QAAQ,CAAC,CAAC,MACzE;AAEN,cAAM,MAAM;AAAA,UACVD,WAAU,IAAI;AAAA,UACd,aAAa,KAAK,OAAO,EAAE;AAAA,UAC3BC,aAAY,IAAI,EAAE,YAAY;AAAA,UAC9B,KAAK,OAAO,YAAY;AAAA,WACvB,KAAK,oBAAoB,GAAG,SAAS;AAAA,WACrC,KAAK,iBAAiB,GAAG,SAAS;AAAA,UACnC;AAAA,QACF;AAEA,sBAAc,KAAK,WAAW,KAAK;AAAA,MACrC;AAGA,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,UAAU,CAAC;AACzC,cAAQ,IAAI,gBAAgB,MAAM,MAAM,EAAE;AAC1C,cAAQ,IAAI,oBAAoB,cAAc,EAAE;AAChD,cAAQ,IAAI,iBAAiB,WAAW,EAAE;AAC1C,cAAQ,IAAI,uBAAuB,kBAAkB,QAAQ,CAAC,CAAC,GAAG;AAAA,IACpE;AAAA,EACF;AACF;AAEA,SAASD,WAAU,MAAmB;AACpC,MAAI,KAAK,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AACjE,MAAI,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AAChD,MAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,SAAO;AACT;AAEA,SAASC,aAAY,MAAmB;AACtC,MAAI,KAAK,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO;AAC5D,MAAI,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO;AAC3C,MAAI,KAAK,QAAS,QAAO;AACzB,SAAO;AACT;AAEA,SAAS,cAAc,KAAe,QAAkB,UAAyB;AAC/E,QAAM,YAAY,IAAI,IAAI,CAAC,MAAM,MAAM,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC;AAC7D,QAAM,UAAU,UAAU,KAAK,KAAK;AAEpC,MAAI,UAAU;AACZ,YAAQ,IAAI,UAAU,KAAK,OAAO,CAAC;AAAA,EACrC,OAAO;AACL,YAAQ,IAAI,OAAO;AAAA,EACrB;AACF;AAEA,SAAS,eAAe,QAAwB;AAC9C,QAAM,YAAY,OAAO,IAAI,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,KAAK;AACrE,UAAQ,IAAI,SAAS;AACvB;AAEA,SAAS,aAAa,MAAc,WAA2B;AAC7D,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,GAAG,KAAK,UAAU,GAAG,YAAY,CAAC,CAAC;AAC5C;AAlUA,IAKAC;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,oBAAwB;AACxB;AACA;AACA;AACA;AAYgB;AA4BD;AA2BA;AAqEA;AAgJN,WAAAF,YAAA;AAOA,WAAAC,cAAA;AAOA;AAWA;AAKA;AAAA;AAAA;;;ACrTF,SAAS,kBAA2B;AACzC,QAAM,MAAM,IAAI,0BAAQ,IAAI;AAE5B,MACG,YAAY,qEAAqE,EACjF,WAAW,4BAA4B,CAAC,EACxC,WAAW,2BAA2B,CAAC,EACvC,WAAW,uBAAuB,CAAC;AAEtC,SAAO;AACT;AApBA,IAKAE;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,oBAAwB;AACxB;AACA;AACA;AAEgB;AAAA;AAAA;;;ACWT,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAI,0BAAQ,SAAS;AAEjC,MACG,YAAY,oCAAoC,EAChD,OAAO,oBAAoB,yBAAyB,EACpD,OAAO,qBAAqB,0DAA0D,EACtF,OAAO,qBAAqB,yCAAyC,OAAO,EAC5E,OAAO,UAAU,oCAAoC,EACrD,OAAO,iBAAiB,gCAAgC,EACxD,OAAO,gBAAgB,gCAAgC,EACvD,OAAO,OAAO,YAA4B;AACzC,QAAI;AACF,YAAM,YAAY,OAAO;AAAA,IAC3B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACrF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YAAY,SAAwC;AACjE,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AAExD,UAAQ,IAAI,UAAU,KAAK,2BAAoB,CAAC;AAChD,UAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAE1B,MAAI;AAEF,UAAM,QAAQ,OAAO,eAAe,MAAM,UAAU,MAAM;AAE1D,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,UAAU,QAAQ,2BAA2B,CAAC;AAC1D;AAAA,IACF;AAGA,QAAI,gBAAgB;AAEpB,QAAI,QAAQ,MAAM;AAChB,sBAAgB,MAAM,OAAO,CAAC,SAAS,KAAK,YAAY,QAAQ,IAAI;AAAA,IACtE;AAEA,QAAI,QAAQ,QAAQ;AAClB,sBAAgB,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,QAAQ,MAAM;AAAA,IACvE;AAEA,QAAI,QAAQ,WAAW,QAAQ;AAC7B,cAAQ,IAAI,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AAClD;AAAA,IACF;AAGA,eAAW,QAAQ,eAAe;AAChC,YAAM,YAAY,MAAM,QAAQ,OAAO,OAAO;AAAA,IAChD;AAGA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,sBAAe,cAAc,MAAM,UAAU,CAAC;AACzE,YAAQ,IAAI,UAAU,QAAQ,iCAA4B,CAAC;AAAA,EAC7D,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,YACb,MACA,QACA,OACA,SACe;AACf,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,QAAQ,aAAM,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE,CAAC;AAClE,UAAQ;AAAA,IACN,UAAU;AAAA,MACR,cAAc,KAAK,MAAM,gBAAgB,KAAK,QAAQ,gBAAgB,KAAK,QAAQ;AAAA,IACrF;AAAA,EACF;AACA,UAAQ,IAAI,UAAU,MAAM,eAAe,KAAK,YAAY,eAAe,KAAK,YAAY,EAAE,CAAC;AAE/F,MAAI,KAAK,eAAe,QAAQ,MAAM;AACpC,YAAQ,IAAI,UAAU,MAAM,mBAAmB,KAAK,WAAW,EAAE,CAAC;AAAA,EACpE;AAEA,MAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AACrC,YAAQ,IAAI,UAAU,MAAM,YAAY,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACjE;AAGA,MAAI,QAAQ,YAAY;AACtB,QAAI;AACF,YAAM,YAAY,OAAO,eAAe,MAAM,WAAW,OAAO;AAChE,YAAM,aAAa,UAAU,OAAO,CAAC,UAAU,MAAM,YAAY,KAAK,OAAO;AAE7E,UAAI,WAAW,SAAS,GAAG;AACzB,gBAAQ,IAAI,UAAU,KAAK,wBAAiB,WAAW,MAAM,IAAI,CAAC;AAClE,mBAAW,SAAS,YAAY;AAC9B,kBAAQ;AAAA,YACN,UAAU,MAAM,eAAU,MAAM,QAAQ,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG;AAAA,UAC9E;AAGA,cAAI,QAAQ,WAAW;AACrB,gBAAI;AACF,oBAAM,WAAW,OAAO,eAAe,MAAM,UAAU,MAAM;AAC7D,oBAAM,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,aAAa,MAAM,QAAQ;AAE7E,kBAAI,WAAW,SAAS,GAAG;AACzB,2BAAW,QAAQ,YAAY;AAC7B,0BAAQ;AAAA,oBACN,UAAU,MAAM,YAAY,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,GAAG;AAAA,kBAC5E;AAAA,gBACF;AAAA,cACF;AAAA,YACF,SAAS,WAAW;AAClB,sBAAQ,IAAI,UAAU,QAAQ,+BAA+B,SAAS,EAAE,CAAC;AAAA,YAC3E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,YAAY;AACnB,cAAQ,IAAI,UAAU,QAAQ,4BAA4B,UAAU,EAAE,CAAC;AAAA,IACzE;AAAA,EACF;AACF;AAnKA,IAKAC;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,oBAAwB;AAExB;AACA;AACA;AAYgB;AA2BD;AAwDA;AAAA;AAAA;;;ACxGf,IAMAC,iBACAC,mBA0Ba;AAjCb;AAAA;AAAA;AAAA;AAMA,IAAAD,kBAAwC;AACxC,IAAAC,oBAAqB;AA0Bd,IAAM,mBAAN,MAAM,iBAAgB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MAER,YACE,cAAsB,QAAQ,IAAI,GAClC,eACA,cACA;AACA,aAAK,cAAc;AACnB,aAAK,gBAAgB;AACrB,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,oBAA4C;AAE1C,YAAI,KAAK,cAAc;AACrB,iBAAO,KAAK,qBAAqB,KAAK,YAAY;AAAA,QACpD;AAGA,cAAM,UAAU,KAAK,mBAAmB;AACxC,YAAI,SAAS;AACX,iBAAO,KAAK,qBAAqB,OAAO;AAAA,QAC1C;AAGA,cAAM,aAAa,KAAK,qBAAqB;AAC7C,YAAI,YAAY;AACd,iBAAO,KAAK,qBAAqB,UAAU;AAAA,QAC7C;AAGA,eAAO,KAAK,eAAe;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKQ,qBAAyC;AAC/C,cAAM,UAAU,QAAQ,IAAI;AAC5B,YAAI,YAAY,YAAY,YAAY,SAAS;AAC/C,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAA2C;AACjD,YAAI,CAAC,KAAK,eAAe;AACvB,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,SAAS,KAAK,cAAc,UAAU;AAE5C,cACE,kBAAkB,WACjB,OAAO,iBAAiB,YAAY,OAAO,iBAAiB,UAC7D;AACA,mBAAO,OAAO;AAAA,UAChB;AAAA,QACF,SAAS,QAAQ;AAAA,QAEjB;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAyC;AAC/C,cAAM,aAAa,KAAK,wBAAwB;AAOhD,YAAI,WAAW,sBAAsB;AACnC,iBAAO,KAAK,qBAAqB,SAAS;AAAA,YACxC,iBAAa,wBAAK,KAAK,aAAa,UAAU;AAAA,YAC9C,kBAAkB,WAAW;AAAA,YAC7B,iBAAiB;AAAA,YACjB,iBAAiB,WAAW;AAAA,UAC9B,CAAC;AAAA,QACH;AAEA,YAAI,WAAW,aAAa;AAC1B,iBAAO,KAAK,qBAAqB,SAAS;AAAA,YACxC,kBAAkB,WAAW;AAAA,YAC7B,iBAAiB;AAAA,YACjB,iBAAiB,WAAW;AAAA,UAC9B,CAAC;AAAA,QACH;AAEA,YAAI,WAAW,4BAA4B;AACzC,iBAAO,KAAK,qBAAqB,SAAS;AAAA,YACxC,kBAAkB,WAAW;AAAA,YAC7B,iBAAiB;AAAA,YACjB,iBAAiB,WAAW;AAAA,UAC9B,CAAC;AAAA,QACH;AAGA,eAAO,KAAK,qBAAqB,UAAU;AAAA,UACzC,iBAAiB,WAAW;AAAA,UAC5B,iBAAiB,WAAW;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKQ,0BAA0B;AAChC,cAAM,aAAa;AAAA,UACjB,sBAAsB;AAAA,UACtB,qBAAqB,CAAC;AAAA,UACtB,aAAa;AAAA,UACb,iBAAiB,CAAC;AAAA,UAClB,4BAA4B;AAAA,UAC5B,qBAAqB,CAAC;AAAA,UACtB,oBAAoB;AAAA,UACpB,6BAA6B,CAAC;AAAA,UAC9B,0BAA0B,CAAC;AAAA,UAC3B,8BAA8B,CAAC;AAAA,UAC/B,8BAA8B,CAAC;AAAA,QACjC;AAEA,YAAI;AACF,gBAAM,cAAU,6BAAY,KAAK,aAAa,EAAE,eAAe,KAAK,CAAC;AAGrE,gBAAM,cAAc,QAAQ,KAAK,CAAC,UAAU,MAAM,YAAY,KAAK,MAAM,SAAS,UAAU;AAC5F,cAAI,aAAa;AACf,uBAAW,uBAAuB;AAClC,kBAAM,mBAAe,wBAAK,KAAK,aAAa,UAAU;AACtD,gBAAI;AACF,oBAAM,qBAAiB,6BAAY,cAAc,EAAE,eAAe,KAAK,CAAC;AACxE,yBAAW,sBAAsB,eAC9B,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,EACrC,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,YAC9B,SAAS,QAAQ;AAAA,YAEjB;AAAA,UACF;AAGA,gBAAM,WAAW,QAAQ;AAAA,YACvB,CAAC,UAAU,MAAM,OAAO,KAAK,oBAAoB,KAAK,MAAM,IAAI;AAAA,UAClE;AACA,cAAI,SAAS,SAAS,GAAG;AACvB,uBAAW,cAAc;AACzB,uBAAW,kBAAkB,SAAS,IAAI,CAAC,SAAS,KAAK,IAAI;AAC7D,uBAAW,yBAAyB;AAAA,cAClC;AAAA,cACA;AAAA,cACA;AAAA,cACA,GAAG,SAAS,IAAI,CAAC,SAAS,qBAAqB,KAAK,KAAK,QAAQ,SAAS,EAAE,CAAC,GAAG;AAAA,YAClF;AAAA,UACF;AAGA,gBAAM,UAAU,QAAQ,OAAO,CAAC,UAAU,MAAM,YAAY,KAAK,MAAM,SAAS,UAAU;AAC1F,cAAI,mBAAmB;AAEvB,qBAAW,UAAU,SAAS;AAC5B,kBAAM,sBAAkB,wBAAK,KAAK,aAAa,OAAO,MAAM,eAAe;AAC3E,oBAAI,4BAAW,eAAe,GAAG;AAC/B;AACA,yBAAW,oBAAoB,KAAK,OAAO,IAAI;AAAA,YACjD;AAAA,UACF;AAEA,cAAI,mBAAmB,GAAG;AACxB,uBAAW,6BAA6B;AACxC,uBAAW,6BAA6B;AAAA,cACtC;AAAA,cACA;AAAA,cACA;AAAA,cACA,GAAG,WAAW,oBAAoB,IAAI,CAAC,SAAS,MAAM,IAAI,aAAa,IAAI,GAAG;AAAA,YAChF;AAAA,UACF;AAGA,gBAAM,aAAa,CAAC,aAAa,SAAS,UAAU,OAAO,EAAE;AAAA,YAAO,CAAC,QACnE,QAAQ,KAAK,CAAC,UAAU,MAAM,YAAY,KAAK,MAAM,SAAS,GAAG;AAAA,UACnE;AAEA,cAAI,WAAW,SAAS,GAAG;AACzB,uBAAW,qBAAqB;AAChC,uBAAW,6BAA6B;AAAA,cACtC;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,QAAQ;AAAA,QAEjB;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,qBACN,MACA,UAA2C,CAAC,GACpB;AACxB,eAAO;AAAA,UACL;AAAA,UACA,aAAa,KAAK;AAAA,UAClB,aAAa,QAAQ;AAAA,UACrB,kBAAkB,QAAQ,oBAAoB,CAAC;AAAA,UAC/C,iBAAiB,QAAQ,mBAAmB;AAAA,UAC5C,iBAAiB,QAAQ,mBAAmB,CAAC;AAAA,UAC7C,GAAG;AAAA,QACL;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAkB,aAAsC;AACtD,cAAM,YAAY,KAAK,kBAAkB;AAEzC,cAAM,UAA0B;AAAA,UAC9B,MAAM,UAAU;AAAA,UAChB,aAAa,UAAU;AAAA,UACvB,aAAa,UAAU;AAAA,UACvB,mBAAmB,UAAU,oBAAoB,CAAC;AAAA,QACpD;AAEA,YAAI,UAAU,SAAS,SAAS;AAC9B,cAAI,aAAa;AAEf,gBAAI,QAAQ,kBAAkB,SAAS,WAAW,GAAG;AACnD,sBAAQ,iBAAiB;AAAA,YAC3B,OAAO;AACL,oBAAM,IAAI;AAAA,gBACR,YAAY,WAAW,oCAAoC,QAAQ,kBAAkB,KAAK,IAAI,CAAC;AAAA,cACjG;AAAA,YACF;AAAA,UACF,WAAW,QAAQ,kBAAkB,WAAW,GAAG;AAEjD,oBAAQ,iBAAiB,QAAQ,kBAAkB,CAAC;AAAA,UACtD;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAkC;AAChC,cAAM,YAAY,KAAK,kBAAkB;AAEzC,YAAI,UAAU,SAAS,UAAU;AAC/B,iBAAO,CAAC;AAAA,QACV;AAEA,eAAO,UAAU,oBAAoB,CAAC;AAAA,MACxC;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,aAA8B;AAC1C,cAAM,YAAY,KAAK,kBAAkB;AAEzC,YAAI,UAAU,SAAS,UAAU;AAC/B,iBAAO;AAAA,QACT;AAEA,gBAAQ,UAAU,oBAAoB,CAAC,GAAG,SAAS,WAAW;AAAA,MAChE;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,aAA8B;AAC3C,cAAM,YAAY,KAAK,kBAAkB;AAEzC,YAAI,UAAU,SAAS,UAAU;AAC/B,iBAAO,KAAK;AAAA,QACd;AAEA,YAAI,CAAC,aAAa;AAChB,gBAAM,IAAI,MAAM,6CAA6C;AAAA,QAC/D;AAEA,YAAI,CAAC,KAAK,cAAc,WAAW,GAAG;AACpC,gBAAM,IAAI,MAAM,YAAY,WAAW,aAAa;AAAA,QACtD;AAEA,mBAAO,wBAAK,UAAU,mBAAe,wBAAK,KAAK,aAAa,UAAU,GAAG,WAAW;AAAA,MACtF;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,aAA6B;AACzC,cAAM,YAAY,KAAK,kBAAkB;AAEzC,YAAI,UAAU,SAAS,UAAU;AAC/B,gBAAM,IAAI,MAAM,8CAA8C;AAAA,QAChE;AAEA,cAAM,cAAc,UAAU,mBAAe,wBAAK,KAAK,aAAa,UAAU;AAC9E,cAAM,kBAAc,wBAAK,aAAa,WAAW;AAEjD,gBAAI,4BAAW,WAAW,GAAG;AAC3B,gBAAM,IAAI,MAAM,YAAY,WAAW,kBAAkB;AAAA,QAC3D;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAgB,MAAqC;AACnD,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,oBAA0B;AACxB,cAAM,YAAY,KAAK,kBAAkB;AAEzC,gBAAQ,IAAI;AAAA,yCAAqC;AACjD,gBAAQ,IAAI,SAAS,UAAU,KAAK,YAAY,CAAC,EAAE;AACnD,gBAAQ,IAAI,SAAS,UAAU,WAAW,EAAE;AAE5C,YAAI,UAAU,SAAS,SAAS;AAC9B,kBAAQ,IAAI,uBAAuB,UAAU,eAAe,SAAS,EAAE;AACvE,cAAI,UAAU,oBAAoB,UAAU,iBAAiB,SAAS,GAAG;AACvE,oBAAQ,IAAI,uBAAuB,UAAU,iBAAiB,KAAK,IAAI,CAAC,EAAE;AAAA,UAC5E;AAAA,QACF;AAEA,YAAI,UAAU,iBAAiB;AAC7B,kBAAQ,IAAI;AAAA,+BAAwB;AAAA,QACtC;AAEA,YAAI,UAAU,gBAAgB,SAAS,GAAG;AACxC,kBAAQ,IAAI;AAAA,2BAAuB;AACnC,oBAAU,gBAAgB,QAAQ,CAAC,QAAQ,QAAQ,IAAI,MAAM,GAAG,EAAE,CAAC;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAzW6B;AAAtB,IAAM,kBAAN;AAAA;AAAA;;;ACjCP,IAAAC,iBACAC,mBASa;AAVb;AAAA;AAAA;AAAA;AAAA,IAAAD,kBAA2B;AAC3B,IAAAC,oBAAqB;AAErB;AAOO,IAAM,gBAAN,MAAM,cAAa;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAER,YACE,eACA,YACA,aACA,cACA;AACA,aAAK,gBAAgB;AACrB,aAAK,aAAa;AAClB,aAAK,eAAe;AACpB,aAAK,kBAAkB,IAAI,gBAAgB,QAAQ,IAAI,GAAG,eAAe,YAAY;AAGrF,YAAI;AACF,eAAK,iBAAiB,KAAK,gBAAgB,kBAAkB,WAAW;AAAA,QAC1E,SAAS,QAAQ;AAAA,QAEjB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,mBAA2B;AAEzB,YAAI,KAAK,YAAY;AACnB,iBAAO,KAAK;AAAA,QACd;AAGA,cAAM,aAAa,QAAQ,IAAI,wBAAwB,QAAQ,IAAI;AACnE,YAAI,YAAY;AACd,iBAAO;AAAA,QACT;AAGA,cAAM,SAAS,KAAK,cAAc,UAAU;AAC5C,YAAI,OAAO,eAAe;AACxB,iBAAO,OAAO;AAAA,QAChB;AAGA,cAAM,cAAc,KAAK,mBAAmB;AAC5C,YAAI,gBAAgB,QAAQ,IAAI,GAAG;AAEjC,qBAAO,wBAAK,aAAa,OAAO;AAAA,QAClC;AAGA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,qBAA6B;AAC3B,YAAI,CAAC,KAAK,gBAAgB;AACxB,iBAAO,QAAQ,IAAI;AAAA,QACrB;AAEA,YAAI,KAAK,eAAe,SAAS,UAAU;AACzC,iBAAO,KAAK,eAAe;AAAA,QAC7B;AAGA,YAAI,KAAK,eAAe,gBAAgB;AACtC,iBAAO,KAAK,gBAAgB,eAAe,KAAK,eAAe,cAAc;AAAA,QAC/E;AAGA,eAAO,KAAK,eAAe;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,cAAsB;AACpB,mBAAO,wBAAK,KAAK,iBAAiB,GAAG,OAAO;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA,MAKA,eAAuB;AACrB,mBAAO,wBAAK,KAAK,iBAAiB,GAAG,QAAQ;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKA,cAAsB;AACpB,mBAAO,wBAAK,KAAK,iBAAiB,GAAG,OAAO;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA,MAKA,YAAoB;AAClB,mBAAO,wBAAK,KAAK,iBAAiB,GAAG,KAAK;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA,MAKA,kBAA0B;AACxB,mBAAO,wBAAK,KAAK,iBAAiB,GAAG,WAAW;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAwB;AACtB,mBAAO,wBAAK,KAAK,iBAAiB,GAAG,SAAS;AAAA,MAChD;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB;AACnB,mBAAO,wBAAK,KAAK,iBAAiB,GAAG,MAAM;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAyB;AACvB,mBAAO,wBAAK,KAAK,iBAAiB,GAAG,UAAU;AAAA,MACjD;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,eAAuB;AACrB,eAAO,KAAK,YAAY;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,kBAA0B;AACxB,eAAO,KAAK,eAAe;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAyB;AACvB,cAAM,SAAS,KAAK,cAAc,UAAU;AAC5C,cAAM,mBAAe,gCAAW,wBAAK,QAAQ,IAAI,GAAG,WAAW,CAAC;AAChE,cAAM,mBAAmB,KAAK,iBAAiB,MAAM;AACrD,cAAM,mBAAmB,OAAO,yBAAyB;AAEzD,eAAO,gBAAgB,oBAAoB;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAgC;AAC9B,mBAAO,wBAAK,QAAQ,IAAI,GAAG,WAAW;AAAA,MACxC;AAAA;AAAA;AAAA;AAAA,MAKA,yBAAmC;AACjC,eAAO;AAAA,UACL,KAAK,YAAY;AAAA,UACjB,KAAK,aAAa;AAAA,UAClB,KAAK,YAAY;AAAA,UACjB,KAAK,UAAU;AAAA,UACf,KAAK,gBAAgB;AAAA,UACrB,KAAK,cAAc;AAAA,UACnB,KAAK,WAAW;AAAA,UAChB,KAAK,eAAe;AAAA,QACtB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,qBAAqB,MAAgD;AACnE,gBAAQ,MAAM;AAAA,UACZ,KAAK;AACH,mBAAO,KAAK,YAAY;AAAA,UAC1B,KAAK;AACH,mBAAO,KAAK,aAAa;AAAA,UAC3B,KAAK;AACH,mBAAO,KAAK,YAAY;AAAA,UAC1B,KAAK;AACH,mBAAO,KAAK,UAAU;AAAA,UACxB;AACE,kBAAM,IAAI,MAAM,sBAAsB,IAAI,EAAE;AAAA,QAChD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,uBACE,cACqD;AACrD,cAAM,UAAU,KAAK,iBAAiB;AAEtC,cAAM,YAAiF;AAAA,UACrF,UAAU;AAAA,YACR,EAAE,UAAM,wBAAK,SAAS,QAAQ,GAAG,MAAM,YAAY;AAAA,YACnD,EAAE,UAAM,wBAAK,SAAS,WAAW,GAAG,MAAM,YAAY;AAAA,YACtD,EAAE,UAAM,wBAAK,SAAS,WAAW,GAAG,MAAM,YAAY;AAAA,YACtD,EAAE,UAAM,wBAAK,SAAS,SAAS,GAAG,MAAM,YAAY;AAAA,YACpD,EAAE,UAAM,wBAAK,SAAS,MAAM,GAAG,MAAM,YAAY;AAAA,UACnD;AAAA,UACA,KAAK;AAAA,YACH,EAAE,UAAM,wBAAK,SAAS,UAAU,GAAG,MAAM,YAAY;AAAA,YACrD,EAAE,UAAM,wBAAK,SAAS,MAAM,GAAG,MAAM,YAAY;AAAA,YACjD,EAAE,UAAM,wBAAK,SAAS,UAAU,GAAG,MAAM,YAAY;AAAA,YACrD,EAAE,UAAM,wBAAK,SAAS,eAAe,GAAG,MAAM,YAAY;AAAA,UAC5D;AAAA,UACA,KAAK;AAAA,YACH,EAAE,UAAM,wBAAK,SAAS,UAAU,GAAG,MAAM,YAAY;AAAA,YACrD,EAAE,UAAM,wBAAK,SAAS,SAAS,GAAG,MAAM,YAAY;AAAA,YACpD,EAAE,UAAM,wBAAK,SAAS,SAAS,GAAG,MAAM,YAAY;AAAA,YACpD,EAAE,UAAM,wBAAK,SAAS,YAAY,GAAG,MAAM,YAAY;AAAA,UACzD;AAAA,UACA,KAAK;AAAA,YACH,EAAE,UAAM,wBAAK,SAAS,WAAW,GAAG,MAAM,YAAY;AAAA,YACtD,EAAE,UAAM,wBAAK,SAAS,SAAS,GAAG,MAAM,YAAY;AAAA,YACpD,EAAE,UAAM,wBAAK,SAAS,SAAS,GAAG,MAAM,YAAY;AAAA,YACpD,EAAE,UAAM,wBAAK,SAAS,eAAe,GAAG,MAAM,YAAY;AAAA,UAC5D;AAAA,UACA,QAAQ;AAAA,YACN,EAAE,UAAM,wBAAK,SAAS,UAAU,GAAG,MAAM,YAAY;AAAA,YACrD,EAAE,UAAM,wBAAK,SAAS,OAAO,GAAG,MAAM,YAAY;AAAA,YAClD,EAAE,UAAM,wBAAK,SAAS,SAAS,GAAG,MAAM,YAAY;AAAA,YACpD,EAAE,UAAM,wBAAK,SAAS,UAAU,GAAG,MAAM,YAAY;AAAA,UACvD;AAAA,QACF;AAEA,eAAO,UAAU,YAAY,KAAK,UAAU;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,SAAuB;AACnC,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAwB;AACtB,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAkB,aAA2B;AAC3C,aAAK,iBAAiB,KAAK,gBAAgB,kBAAkB,WAAW;AAAA,MAC1E;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAgD;AAC9C,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,iBAA8B;AAvShC;AAwSI,iBAAO,UAAK,mBAAL,mBAAqB,SAAQ;AAAA,MACtC;AAAA;AAAA;AAAA;AAAA,MAKA,uBAAiC;AAC/B,eAAO,KAAK,gBAAgB,sBAAsB;AAAA,MACpD;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,aAA8B;AAC1C,eAAO,KAAK,gBAAgB,cAAc,WAAW;AAAA,MACvD;AAAA;AAAA;AAAA;AAAA,MAKA,uBAAuB,aAA4B;AACjD,cAAM,eAAe,cACjB,KAAK,gBAAgB,cAAc,WAAW,IAC9C,KAAK,mBAAmB;AAG5B,cAAM,cAAc,KAAK,uBAAuB;AAChD,mBAAW,OAAO,aAAa;AAC7B,cAAI,KAAC,4BAAW,GAAG,GAAG;AACpB,oBAAQ,IAAS,EAAE,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,UACvD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,uBAA6B;AAC3B,YAAI,KAAK,cAAc,GAAG;AACxB,kBAAQ,KAAK;AAAA;AAAA;AAAA,kEAG+C,KAAK,iBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA,2CAI9C,KAAK,iBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAM3D;AAAA,QACH;AAGA,aAAK,gBAAgB,kBAAkB;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKA,uBAAiC;AAC/B,YAAI,CAAC,KAAK,cAAc,GAAG;AACzB,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,UAAU,KAAK,iBAAiB;AACtC,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,iCAAiC,OAAO;AAAA,UACxC,YAAY,OAAO;AAAA,UACnB,uBAAuB,OAAO;AAAA,UAC9B,0BAA0B,OAAO;AAAA,UACjC,0BAA0B,OAAO;AAAA,UACjC,wBAAwB,OAAO;AAAA,UAC/B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAjX0B;AAAnB,IAAM,eAAN;AAAA;AAAA;;;ACVP;AAAA;AAAA;AAAA;AAAA,IAKAC,iBACAC,mBA6Ba;AAnCb;AAAA;AAAA;AAAA;AAKA,IAAAD,kBAAsC;AACtC,IAAAC,oBAAqB;AAErB;AACA;AACA;AAyBO,IAAM,yBAAN,MAAM,uBAAsB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAER,YACE,cAAsB,QAAQ,IAAI,GAClC,cACA,YACA;AACA,aAAK,cAAc;AACnB,aAAK,eAAe;AACpB,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,kBAAkB,aAAoD;AAE1E,cAAM,kBAAkB,IAAI,gBAAgB,KAAK,aAAa,QAAW,KAAK,YAAY;AAG1F,cAAM,UAAU,gBAAgB,kBAAkB,WAAW;AAG7D,cAAM,oBAAoB,KAAK,qBAAqB,OAAO;AAG3D,cAAM,gBAAgB,IAAI,cAAc,iBAAiB;AAGzD,cAAM,eAAe,IAAI;AAAA,UACvB;AAAA,UACA,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,KAAK;AAAA,QACP;AAGA,cAAM,QAAQ,KAAK,yBAAyB,SAAS,cAAc,iBAAiB;AAGpF,aAAK,iBAAiB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAqD;AACnD,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,cAAc,aAAmD;AACrE,YAAI,CAAC,KAAK,gBAAgB;AACxB,gBAAM,IAAI,MAAM,iEAAiE;AAAA,QACnF;AAEA,YAAI,KAAK,eAAe,QAAQ,SAAS,UAAU;AACjD,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AAGA,eAAO,MAAM,KAAK,kBAAkB,WAAW;AAAA,MACjD;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,cACJ,aACA,QAC8B;AAC9B,YAAI,CAAC,KAAK,gBAAgB;AAExB,gBAAM,KAAK,kBAAkB;AAAA,QAC/B;AAEA,YAAI,CAAC,KAAK,gBAAgB;AACxB,gBAAM,IAAI,MAAM,sCAAsC;AAAA,QACxD;AAEA,YAAI,KAAK,eAAe,QAAQ,SAAS,UAAU;AACjD,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AAGA,cAAM,cAAc,KAAK,eAAe,gBAAgB,cAAc,WAAW;AAGjF,uCAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAG1C,cAAM,uBAAuB,IAAI,cAAc,WAAW;AAC1D,cAAM,iBAAiB,qBAAqB,kBAAkB,aAAa,MAAM;AAGjF,eAAO,MAAM,KAAK,cAAc,WAAW;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKA,eAAyB;AACvB,YAAI,CAAC,KAAK,gBAAgB;AACxB,gBAAM,IAAI,MAAM,iEAAiE;AAAA,QACnF;AAEA,eAAO,KAAK,eAAe,QAAQ;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA,MAKA,iBAA8B;AAC5B,YAAI,CAAC,KAAK,gBAAgB;AACxB,gBAAM,IAAI,MAAM,iEAAiE;AAAA,QACnF;AAEA,eAAO,KAAK,eAAe,QAAQ;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA,MAKA,WAAgC;AAC9B,YAAI,CAAC,KAAK,gBAAgB;AACxB,gBAAM,IAAI,MAAM,iEAAiE;AAAA,QACnF;AAEA,eAAO,KAAK,eAAe;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAgC;AAC9B,YAAI,CAAC,KAAK,gBAAgB;AACxB,gBAAM,IAAI,MAAM,iEAAiE;AAAA,QACnF;AAEA,eAAO,KAAK,eAAe;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAkC;AAChC,YAAI,CAAC,KAAK,gBAAgB;AACxB,gBAAM,IAAI,MAAM,iEAAiE;AAAA,QACnF;AAEA,eAAO,KAAK,eAAe;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,yBAAwC;AAC5C,YAAI,CAAC,KAAK,gBAAgB;AACxB,gBAAM,IAAI,MAAM,iEAAiE;AAAA,QACnF;AAEA,cAAM,EAAE,OAAO,cAAc,IAAI,KAAK;AAGtC,cAAM,cAAc;AAAA,UAClB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAEA,mBAAW,OAAO,aAAa;AAC7B,cAAI,KAAC,4BAAW,GAAG,GAAG;AACpB,2CAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,UACpC;AAAA,QACF;AAGA,YAAI,CAAC,cAAc,mBAAmB,MAAM,WAAW,GAAG;AACxD,gBAAM,cAAc;AAAA,YAClB,KAAK,eAAe,QAAQ,kBAAkB;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,kBAIE;AACA,YAAI,CAAC,KAAK,gBAAgB;AACxB,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,CAAC,gCAAgC;AAAA,YACzC,UAAU,CAAC;AAAA,UACb;AAAA,QACF;AAEA,cAAM,SAAmB,CAAC;AAC1B,cAAM,WAAqB,CAAC;AAG5B,YAAI,KAAK,eAAe,QAAQ,SAAS,SAAS;AAChD,cAAI,CAAC,KAAK,eAAe,QAAQ,gBAAgB;AAC/C,mBAAO,KAAK,2CAA2C;AAAA,UACzD,WACE,CAAC,KAAK,eAAe,gBAAgB;AAAA,YACnC,KAAK,eAAe,QAAQ;AAAA,UAC9B,GACA;AACA,mBAAO,KAAK,YAAY,KAAK,eAAe,QAAQ,cAAc,kBAAkB;AAAA,UACtF;AAAA,QACF;AAGA,cAAM,eAAe,CAAC,KAAK,eAAe,MAAM,WAAW,KAAK,eAAe,MAAM,SAAS;AAE9F,mBAAW,OAAO,cAAc;AAC9B,cAAI,KAAC,4BAAW,GAAG,GAAG;AACpB,qBAAS,KAAK,sCAAsC,GAAG,EAAE;AAAA,UAC3D;AAAA,QACF;AAGA,YAAI;AACF,gBAAM,UAAU,KAAK,eAAe,cAAc,UAAU;AAC5D,gBAAM,aAAa,KAAK,eAAe,cAAc,eAAe;AACpE,cAAI,CAAC,WAAW,OAAO;AACrB,mBAAO,KAAK,GAAG,WAAW,MAAM;AAAA,UAClC;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAClF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO,OAAO,WAAW;AAAA,UACzB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAwB;AACtB,YAAI,CAAC,KAAK,gBAAgB;AACxB,kBAAQ,IAAI,uCAAkC;AAC9C;AAAA,QACF;AAEA,cAAM,EAAE,SAAS,MAAM,IAAI,KAAK;AAEhC,gBAAQ,IAAI;AAAA,sCAAkC;AAC9C,gBAAQ,IAAI,SAAS,QAAQ,KAAK,YAAY,CAAC,EAAE;AACjD,gBAAQ,IAAI,SAAS,QAAQ,WAAW,EAAE;AAE1C,YAAI,QAAQ,SAAS,SAAS;AAC5B,kBAAQ,IAAI,uBAAuB,QAAQ,eAAe,SAAS,EAAE;AACrE,kBAAQ,IAAI,oBAAoB,QAAQ,kBAAkB,eAAe,EAAE;AAC3E,kBAAQ,IAAI,uBAAuB,QAAQ,kBAAkB,KAAK,IAAI,KAAK,MAAM,EAAE;AAAA,QACrF;AAEA,gBAAQ,IAAI;AAAA,+BAA2B;AACvC,gBAAQ,IAAI,cAAc,MAAM,SAAS,EAAE;AAC3C,gBAAQ,IAAI,kBAAkB,MAAM,SAAS,EAAE;AAC/C,gBAAQ,IAAI,gCAAiB,MAAM,QAAQ,EAAE;AAC7C,gBAAQ,IAAI,iCAAkB,MAAM,SAAS,EAAE;AAC/C,gBAAQ,IAAI,gCAAiB,MAAM,QAAQ,EAAE;AAC7C,gBAAQ,IAAI,8BAAe,MAAM,MAAM,EAAE;AACzC,gBAAQ,IAAI,oCAAqB,MAAM,YAAY,EAAE;AAGrD,cAAM,aAAa,KAAK,gBAAgB;AACxC,YAAI,CAAC,WAAW,OAAO;AACrB,kBAAQ,IAAI;AAAA,uBAAqB;AACjC,qBAAW,OAAO,QAAQ,CAAC,UAAU,QAAQ,IAAI,aAAQ,KAAK,EAAE,CAAC;AAAA,QACnE;AAEA,YAAI,WAAW,SAAS,SAAS,GAAG;AAClC,kBAAQ,IAAI;AAAA,wBAAiB;AAC7B,qBAAW,SAAS,QAAQ,CAAC,YAAY,QAAQ,IAAI,aAAQ,OAAO,EAAE,CAAC;AAAA,QACzE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,qBAAqB,SAAiC;AAC5D,YAAI,QAAQ,SAAS,UAAU;AAC7B,iBAAO,QAAQ;AAAA,QACjB;AAGA,YAAI,QAAQ,gBAAgB;AAC1B,qBAAO;AAAA,YACL,QAAQ,mBAAe,wBAAK,QAAQ,aAAa,UAAU;AAAA,YAC3D,QAAQ;AAAA,UACV;AAAA,QACF;AAGA,eAAO,QAAQ;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA,MAKQ,yBACN,UACA,cACA,mBACqB;AACrB,eAAO;AAAA,UACL,aAAa;AAAA,UACb,eAAW,wBAAK,mBAAmB,eAAe;AAAA,UAClD,WAAW,aAAa,iBAAiB;AAAA,UACzC,UAAU,aAAa,YAAY;AAAA,UACnC,WAAW,aAAa,aAAa;AAAA,UACrC,UAAU,aAAa,YAAY;AAAA,UACnC,QAAQ,aAAa,UAAU;AAAA,UAC/B,cAAc,aAAa,gBAAgB;AAAA,QAC7C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,QAAc;AACZ,aAAK,iBAAiB;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAgB,MAAqC;AACnD,aAAK,eAAe;AAEpB,aAAK,iBAAiB;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,SAAmC;AAC/C,aAAK,aAAa;AAElB,aAAK,iBAAiB;AAAA,MACxB;AAAA,IACF;AAlXmC;AAA5B,IAAM,wBAAN;AAAA;AAAA;;;ACnCP,IAWAC,KACAC,OACA,kBAiBMC,WACAC,YACAC,OACAC,UACAC,SAGA,iBACA,eACA,sBAyFO;AAhIb;AAAA;AAAA;AAAA;AAWA,IAAAN,MAAoB;AACpB,IAAAC,QAAsB;AACtB,uBAA0B;AAY1B;AACA;AACA;AAGA,IAAMC,gBAAW,4BAAa,YAAQ;AACtC,IAAMC,iBAAY,4BAAa,aAAS;AACxC,IAAMC,YAAO,4BAAa,QAAI;AAC9B,IAAMC,eAAU,4BAAa,WAAO;AACpC,IAAMC,cAAS,4BAAa,UAAM;AAGlC,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,uBAAuB;AAyFtB,IAAM,yBAAN,MAAM,uBAAsB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA,cAAqC;AAAA,MACrC,iBAAyB;AAAA,MAChB,YAAY;AAAA;AAAA;AAAA,MAGrB,uBAAsD;AAAA;AAAA,MAG7C;AAAA,MACA;AAAA,MACA;AAAA,MAEjB,YAAY,QAAuB,aAAqB,aAAsB;AAC5E,aAAK,SAAS;AACd,aAAK,cAAc;AACnB,aAAK,eAAe,IAAI,oBAAoB,QAAQ,aAAa,WAAW;AAC5E,aAAK,oBAAoB,IAAI,kBAAkB;AAC/C,aAAK,kBAAkB,IAAI,gBAAgB,WAAW;AAGtD,aAAK,aACH,QAAQ,IAAI,aAAa,UAAU,QAAQ,IAAI,2BAA2B;AAC5E,aAAK,kBAAkB,QAAQ,IAAI,+BAA+B;AAClE,aAAK,eAAe,QAAQ,IAAI,4BAA4B;AAE5D,cAAM,QAAQ,KAAK,aAAa,gBAAgB;AAChD,aAAK,WAAW,MAAM;AACtB,aAAK,YAAiB,WAAK,KAAK,UAAU,eAAe;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,YAAqC;AAChD,cAAM,UAAU,KAAK,yBAAyB,WAAW;AAEzD,YAAI;AAEF,cAAI,KAAK,eAAe,KAAK,IAAI,IAAI,KAAK,iBAAiB,KAAK,WAAW;AACzE,iBAAK,uBAAuB,OAAO;AACnC,mBAAO,KAAK;AAAA,UACd;AAGA,cAAI,CAAE,MAAM,KAAK,YAAY,GAAI;AAE/B,gBAAI,KAAK,cAAc,KAAK,iBAAiB;AAC3C,qBAAO,KAAK,uBAAuB;AAAA,YACrC;AAEA,gBAAI,CAAC,KAAK,YAAY;AACpB,sBAAQ,KAAK,2BAA2B,KAAK,SAAS,iBAAiB;AAAA,YACzE;AACA,mBAAO,MAAM,KAAK,aAAa;AAAA,UACjC;AAGA,gBAAM,eAAe,MAAMJ,UAAS,KAAK,WAAW,MAAM;AAC1D,gBAAM,QAAQ,KAAK,MAAM,YAAY;AAGrC,cAAI,CAAC,KAAK,uBAAuB,KAAK,GAAG;AAEvC,gBAAI,KAAK,cAAc,KAAK,iBAAiB;AAC3C,qBAAO,KAAK,uBAAuB;AAAA,YACrC;AAEA,gBAAI,CAAC,KAAK,YAAY;AACpB,sBAAQ,KAAK,qCAAqC;AAAA,YACpD;AACA,mBAAO,MAAM,KAAK,aAAa;AAAA,UACjC;AAGA,eAAK,cAAc;AACnB,eAAK,iBAAiB,KAAK,IAAI;AAG/B,gBAAM,WAAW,KAAK,uBAAuB,OAAO;AACpD,gBAAM,MAAM,mBAAmB,eAAe;AAE9C,iBAAO;AAAA,QACT,SAAS,OAAO;AAEd,cAAI,KAAK,cAAc,KAAK,iBAAiB;AAC3C,mBAAO,KAAK,uBAAuB;AAAA,UACrC;AAEA,cAAI,CAAC,KAAK,YAAY;AACpB,oBAAQ;AAAA,cACN,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACnF;AAAA,UACF;AACA,iBAAO,MAAM,KAAK,aAAa;AAAA,QACjC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,UAAU,OAAsC;AAC3D,cAAM,UAAU,KAAK,yBAAyB,WAAW;AAEzD,YAAI;AAEF,gBAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,gBAAM,cAAc,KAAK;AAGzB,gBAAM,MAAM,gBAAgB,OAAO,KAAK,MAAM,QAAQ,EAAE;AACxD,gBAAM,MAAM,aAAa,OAAO,KAAK,MAAM,KAAK,EAAE;AAClD,gBAAM,MAAM,cAAc,OAAO,KAAK,MAAM,MAAM,EAAE;AACpD,gBAAM,MAAM,aAAa,OAAO,KAAK,MAAM,KAAK,EAAE;AAClD,gBAAM,MAAM,WAAW,OAAO,KAAK,MAAM,GAAG,EAAE;AAG9C,gBAAM,eAAe,KAAK,UAAU,OAAO,MAAM,CAAC;AAClD,gBAAM,MAAM,YAAY,OAAO,WAAW,cAAc,MAAM;AAG9D,gBAAM,KAAK,2BAA2B;AAGtC,gBAAM,WAAW,GAAG,KAAK,SAAS;AAClC,gBAAMC,WAAU,UAAU,cAAc,MAAM;AAG9C,UAAG,eAAW,UAAU,KAAK,SAAS;AAGtC,eAAK,cAAc;AACnB,eAAK,iBAAiB,KAAK,IAAI;AAG/B,gBAAM,WAAW,KAAK,uBAAuB,OAAO;AACpD,gBAAM,MAAM,mBAAmB,iBAAiB;AAAA,QAClD,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,eAAwC;AACnD,cAAM,UAAU,KAAK,yBAAyB,cAAc;AAG5D,YAAI,KAAK,cAAc,KAAK,iBAAiB;AAC3C,iBAAO,KAAK,uBAAuB;AAAA,QACrC;AAEA,YAAI,CAAC,KAAK,YAAY;AACpB,kBAAQ,IAAI,4CAAqC;AAAA,QACnD;AAEA,cAAM,WAA2B;AAAA,UAC/B,SAAS;AAAA,UACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,aAAa,KAAK;AAAA,UAClB,UAAU,CAAC;AAAA,UACX,OAAO,CAAC;AAAA,UACR,QAAQ,CAAC;AAAA,UACT,OAAO,CAAC;AAAA,UACR,KAAK,CAAC;AAAA,UACN,OAAO;AAAA,YACL,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,YACrC,WAAW;AAAA,YACX,oBAAoB;AAAA,cAClB,cAAc;AAAA,cACd,gBAAgB;AAAA,cAChB,iBAAiB;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AAEF,cAAI,CAAC,KAAK,YAAY;AACpB,oBAAQ,IAAI,0CAAmC;AAAA,UACjD;AACA,gBAAM,mBAAmB,KAAK,gBAAgB,kBAAkB;AAChE,eAAK,uBAAuB;AAG5B,cAAI,CAAC,KAAK,YAAY;AACpB,oBAAQ,IAAI,2BAAoB,iBAAiB,KAAK,YAAY,CAAC,EAAE;AACrE,gBAAI,iBAAiB,SAAS,SAAS;AACrC,kBAAI,iBAAiB,oBAAoB,iBAAiB,iBAAiB,SAAS,GAAG;AACrF,wBAAQ,IAAI,gCAAyB,iBAAiB,iBAAiB,KAAK,IAAI,CAAC,EAAE;AAAA,cACrF;AACA,kBAAI,iBAAiB,aAAa;AAChC,wBAAQ,IAAI,iCAA0B,iBAAiB,WAAW,EAAE;AAAA,cACtE;AAAA,YACF;AAEA,gBAAI,iBAAiB,iBAAiB;AACpC,sBAAQ,IAAI,6DAAmD;AAAA,YACjE;AAEA,gBAAI,iBAAiB,gBAAgB,SAAS,GAAG;AAC/C,sBAAQ,IAAI,mFAA4E;AAAA,YAC1F;AAAA,UACF;AAGA,gBAAM,KAAK,mBAAmB,gBAAgB;AAE9C,gBAAM,QAAQ,KAAK,aAAa,gBAAgB;AAGhD,gBAAM,YAAY;AAAA,YAChB,KAAK,cAAc,MAAM,UAAU,MAAM;AAAA,YACzC,KAAK,cAAc,MAAM,WAAW,OAAO;AAAA,YAC3C,KAAK,cAAc,MAAM,UAAU,MAAM;AAAA,YACzC,KAAK,cAAc,MAAM,QAAQ,IAAI;AAAA,UACvC;AAEA,gBAAM,CAAC,OAAO,QAAQ,OAAO,GAAG,IAAI,MAAM,QAAQ,IAAI,SAAS;AAG/D,qBAAW,QAAQ,OAAO;AACxB,kBAAM,WAAW;AACjB,qBAAS,MAAM,SAAS,OAAO,IAAI,MAAM,KAAK,qBAAqB,QAAQ;AAAA,UAC7E;AAEA,qBAAW,SAAS,QAAQ;AAC1B,kBAAM,YAAY;AAClB,qBAAS,OAAO,UAAU,QAAQ,IAAI,MAAM,KAAK,sBAAsB,SAAS;AAAA,UAClF;AAEA,qBAAW,QAAQ,OAAO;AACxB,kBAAM,WAAW;AACjB,qBAAS,MAAM,SAAS,OAAO,IAAI,MAAM,KAAK,qBAAqB,QAAQ;AAAA,UAC7E;AAEA,qBAAW,MAAM,KAAK;AACpB,kBAAM,SAAS;AACf,qBAAS,IAAI,OAAO,KAAK,IAAI,MAAM,KAAK,mBAAmB,MAAM;AAAA,UACnE;AAGA,eAAK,mBAAmB,QAAQ;AAGhC,gBAAM,KAAK,UAAU,QAAQ;AAE7B,gBAAM,cAAc,KAAK,uBAAuB,OAAO;AACvD,mBAAS,MAAM,mBAAmB,kBAAkB;AAEpD,cAAI,CAAC,KAAK,YAAY;AACpB,oBAAQ,IAAI,wCAAmC,WAAW,IAAI;AAC9D,oBAAQ;AAAA,cACN,sBAAe,SAAS,MAAM,aAAa,cAAc,SAAS,MAAM,UAAU,WAAW,SAAS,MAAM,WAAW,YAAY,SAAS,MAAM,UAAU,WAAW,SAAS,MAAM,QAAQ;AAAA,YAChM;AAAA,UACF;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACtF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,WAAW,MAAgB,IAA2B;AACjE,cAAM,UAAU,KAAK,yBAAyB,YAAY;AAE1D,YAAI;AACF,gBAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,gBAAM,WAAW,MAAM,KAAK,aAAa,MAAM,EAAE;AAEjD,cAAI,CAAC,YAAY,CAAI,eAAW,QAAQ,GAAG;AAEzC,kBAAM,KAAK,WAAW,MAAM,EAAE;AAC9B;AAAA,UACF;AAGA,gBAAM,WAAW,KAAK,kBAAkB,aAAa,QAAQ;AAG7D,kBAAQ,MAAM;AAAA,YACZ,KAAK;AACH,oBAAM,MAAM,EAAE,IAAI,MAAM,KAAK,qBAAqB,QAAoB;AACtE;AAAA,YACF,KAAK;AACH,oBAAM,OAAO,EAAE,IAAI,MAAM,KAAK,sBAAsB,QAAqB;AACzE;AAAA,YACF,KAAK;AACH,oBAAM,MAAM,EAAE,IAAI,MAAM,KAAK,qBAAqB,QAAoB;AACtE;AAAA,YACF,KAAK;AACH,oBAAM,IAAI,EAAE,IAAI,MAAM,KAAK,mBAAmB,QAAkB;AAChE;AAAA,UACJ;AAGA,eAAK,oBAAoB,OAAO,MAAM,EAAE;AAGxC,gBAAM,KAAK,UAAU,KAAK;AAE1B,eAAK,uBAAuB,OAAO;AAAA,QACrC,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,yBAAyB,IAAI,IAAI,EAAE,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAClG;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,WAAW,MAAgB,IAA2B;AACjE,cAAM,UAAU,KAAK,yBAAyB,YAAY;AAE1D,YAAI;AACF,gBAAM,QAAQ,MAAM,KAAK,UAAU;AAGnC,kBAAQ,MAAM;AAAA,YACZ,KAAK;AACH,qBAAO,MAAM,MAAM,EAAE;AAErB,yBAAW,WAAW,OAAO,KAAK,MAAM,MAAM,GAAG;AAC/C,oBAAI,MAAM,OAAO,OAAO,EAAE,WAAW,IAAI;AACvC,yBAAO,MAAM,OAAO,OAAO;AAAA,gBAC7B;AAAA,cACF;AACA,yBAAW,UAAU,OAAO,KAAK,MAAM,KAAK,GAAG;AAC7C,oBAAI,MAAM,MAAM,MAAM,EAAE,WAAW,IAAI;AACrC,yBAAO,MAAM,MAAM,MAAM;AAAA,gBAC3B;AAAA,cACF;AACA;AAAA,YACF,KAAK;AACH,qBAAO,MAAM,OAAO,EAAE;AAEtB,yBAAW,UAAU,OAAO,KAAK,MAAM,KAAK,GAAG;AAC7C,oBAAI,MAAM,MAAM,MAAM,EAAE,YAAY,IAAI;AACtC,yBAAO,MAAM,MAAM,MAAM;AAAA,gBAC3B;AAAA,cACF;AACA,yBAAW,QAAQ,OAAO,KAAK,MAAM,GAAG,GAAG;AACzC,oBAAI,MAAM,IAAI,IAAI,EAAE,YAAY,IAAI;AAClC,yBAAO,MAAM,IAAI,IAAI;AAAA,gBACvB;AAAA,cACF;AACA;AAAA,YACF,KAAK;AACH,qBAAO,MAAM,MAAM,EAAE;AACrB;AAAA,YACF,KAAK;AACH,qBAAO,MAAM,IAAI,EAAE;AACnB;AAAA,UACJ;AAGA,eAAK,qBAAqB,OAAO,MAAM,EAAE;AAGzC,gBAAM,KAAK,UAAU,KAAK;AAE1B,eAAK,uBAAuB,OAAO;AAAA,QACrC,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,yBAAyB,IAAI,IAAI,EAAE,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAClG;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,gBAAkC;AAC7C,YAAI;AACF,gBAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,iBAAO,KAAK,uBAAuB,KAAK;AAAA,QAC1C,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,sBAUV;AACD,cAAM,SAAmB,CAAC;AAC1B,cAAM,cAAwB,CAAC;AAC/B,YAAI,UAAU;AAEd,YAAI;AAEF,gBAAM,cAAc,MAAM,KAAK,YAAY;AAC3C,cAAI,CAAC,aAAa;AAChB,mBAAO,KAAK,2BAA2B;AACvC,wBAAY,KAAK,mDAAmD;AACpE,mBAAO;AAAA,cACL,SAAS;AAAA,cACT;AAAA,cACA;AAAA,cACA,OAAO,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,EAAE;AAAA,YAC5E;AAAA,UACF;AAGA,gBAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,cAAI,CAAC,KAAK,uBAAuB,KAAK,GAAG;AACvC,mBAAO,KAAK,8BAA8B;AAC1C,sBAAU;AAAA,UACZ;AAGA,gBAAM,QAAQ,KAAK,aAAa,gBAAgB;AAChD,gBAAM,eAAe,MAAM,KAAK,iBAAiB,KAAK;AACtD,gBAAM,gBAAgB;AAAA,YACpB,OAAO,OAAO,KAAK,MAAM,KAAK,EAAE;AAAA,YAChC,QAAQ,OAAO,KAAK,MAAM,MAAM,EAAE;AAAA,YAClC,OAAO,OAAO,KAAK,MAAM,KAAK,EAAE;AAAA,YAChC,KAAK,OAAO,KAAK,MAAM,GAAG,EAAE;AAAA,UAC9B;AAEA,gBAAM,cAAc,aAAa,QAAQ,aAAa,SAAS,aAAa,QAAQ,aAAa;AACjG,gBAAM,eAAe,cAAc,QAAQ,cAAc,SAAS,cAAc,QAAQ,cAAc;AAGtG,cAAI,cAAc,eAAe,KAAK;AACpC,mBAAO,KAAK,2BAA2B,WAAW,yBAAyB,YAAY,UAAU;AACjG,wBAAY,KAAK,mDAAmD;AACpE,sBAAU;AAAA,UACZ;AAGA,gBAAM,gBAAgB,MAAM,KAAK,qBAAqB,KAAK;AAC3D,cAAI,gBAAgB,GAAG;AACrB,mBAAO,KAAK,GAAG,aAAa,kCAAkC;AAC9D,wBAAY,KAAK,gDAAgD;AAAA,UACnE;AAGA,gBAAM,WAAW,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,WAAW,EAAE,QAAQ;AAClE,cAAI,WAAW,KAAK,KAAK,KAAK,KAAM;AAClC,mBAAO,KAAK,iCAAiC;AAC7C,wBAAY,KAAK,wCAAwC;AAAA,UAC3D;AAEA,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO;AAAA,cACL,WAAW;AAAA,cACX,cAAc;AAAA,cACd,cAAc,KAAK,IAAI,GAAG,cAAc,YAAY;AAAA,cACpD;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,KAAK,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAClG,sBAAY,KAAK,qCAAqC;AACtD,iBAAO;AAAA,YACL,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA,OAAO,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,EAAE;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,kBAIV;AACD,cAAM,UAAoB,CAAC;AAC3B,cAAM,SAAmB,CAAC;AAE1B,YAAI;AACF,gBAAM,cAAc,MAAM,KAAK,oBAAoB;AAEnD,cAAI,YAAY,SAAS;AACvB,mBAAO,EAAE,UAAU,OAAO,SAAS,CAAC,0BAA0B,GAAG,QAAQ,CAAC,EAAE;AAAA,UAC9E;AAEA,kBAAQ,KAAK,iCAAiC;AAG9C,cAAI,YAAY,OAAO;AAAA,YAAK,WAC1B,MAAM,SAAS,gBAAgB,KAC/B,MAAM,SAAS,WAAW,KAC1B,MAAM,SAAS,UAAU;AAAA,UAC3B,GAAG;AACD,oBAAQ,KAAK,6DAA6D;AAC1E,kBAAM,KAAK,aAAa;AACxB,oBAAQ,KAAK,4BAA4B;AACzC,mBAAO,EAAE,UAAU,MAAM,SAAS,OAAO;AAAA,UAC3C;AAGA,cAAI,YAAY,MAAM,gBAAgB,GAAG;AACvC,oBAAQ,KAAK,eAAe,YAAY,MAAM,aAAa,mBAAmB;AAC9E,kBAAM,KAAK,qBAAqB;AAChC,oBAAQ,KAAK,6BAA6B;AAAA,UAC5C;AAEA,cAAI,YAAY,MAAM,eAAe,GAAG;AACtC,oBAAQ,KAAK,UAAU,YAAY,MAAM,YAAY,kBAAkB;AACvE,kBAAM,KAAK,aAAa;AACxB,oBAAQ,KAAK,uBAAuB;AAAA,UACtC;AAEA,iBAAO,EAAE,UAAU,MAAM,SAAS,OAAO;AAAA,QAC3C,SAAS,OAAO;AACd,gBAAM,WAAW,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAChG,iBAAO,KAAK,QAAQ;AACpB,iBAAO,EAAE,UAAU,OAAO,SAAS,OAAO;AAAA,QAC5C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,gBAOX;AACA,YAAI;AACF,gBAAM,cAAc,MAAM,KAAK,YAAY;AAC3C,cAAI;AAEJ,cAAI,aAAa;AACf,kBAAM,QAAQ,MAAMC,MAAK,KAAK,SAAS;AACvC,2BAAe,MAAM;AAAA,UACvB;AAEA,gBAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,gBAAM,WAAW,KAAK,IAAI,IAAI,KAAK,iBAAiB,KAAK;AAEzD,iBAAO;AAAA,YACL,GAAG,MAAM;AAAA,YACT,SAAS,KAAK,uBAAuB,KAAK;AAAA,YAC1C;AAAA,YACA,iBAAiB;AAAA,YACjB;AAAA,UACF;AAAA,QACF,SAAS,QAAQ;AACf,iBAAO;AAAA,YACL,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,cAAc;AAAA,YACd,WAAW;AAAA,YACX,oBAAoB;AAAA,cAClB,cAAc;AAAA,cACd,gBAAgB;AAAA,cAChB,iBAAiB;AAAA,YACnB;AAAA,YACA,SAAS;AAAA,YACT,UAAU;AAAA,YACV,iBAAiB;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,aAAmB;AACxB,aAAK,cAAc;AACnB,aAAK,iBAAiB;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKO,0BAAyD;AAC9D,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKO,qBAAsC;AAC3C,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAAmB,WAAkD;AACjF,YAAI;AAEF,cAAI,UAAU,SAAS,UAAU;AAC/B,kBAAM,KAAK,wBAAwB,SAAS;AAAA,UAC9C,WAAW,UAAU,SAAS,SAAS;AACrC,kBAAM,KAAK,wBAAwB,SAAS;AAAA,UAC9C;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,gDAAsC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAChG;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,wBAAwB,WAAkD;AAEtF,cAAM,EAAE,uBAAAG,uBAAsB,IAAI,MAAM;AAGxC,cAAM,mBAAmB,MAAM,KAAK,sBAAsB;AAC1D,YAAI,iBAAiB,SAAS,GAAG;AAC/B,kBAAQ,IAAI,sCAA+B,iBAAiB,KAAK,IAAI,CAAC,EAAE;AACxE;AAAA,QACF;AAEA,gBAAQ,IAAI,yEAAkE;AAE9E,YAAI;AACF,gBAAM,iBAAiB,IAAIA,uBAAsB,UAAU,WAAW;AACtE,gBAAM,eAAe,kBAAkB;AAGvC,gBAAM,qBAAqB;AAI3B,kBAAQ,IAAI,uCAAgC,kBAAkB,EAAE;AAGhE,gBAAM,eAAe,uBAAuB;AAE5C,kBAAQ,IAAI,kEAA6D;AAAA,QAC3E,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,yCAAyC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACnG;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,wBAAwB,WAAkD;AAEtF,cAAM,EAAE,uBAAAA,uBAAsB,IAAI,MAAM;AAExC,YAAI,CAAC,UAAU,oBAAoB,UAAU,iBAAiB,WAAW,GAAG;AAC1E,kBAAQ,IAAI,wEAAiE;AAC7E;AAAA,QACF;AAEA,gBAAQ,IAAI,iEAA0D;AACtE,gBAAQ;AAAA,UACN,sBAAe,UAAU,iBAAiB,MAAM,cAAc,UAAU,iBAAiB,KAAK,IAAI,CAAC;AAAA,QACrG;AAEA,cAAM,iBAAiB,IAAIA,uBAAsB,UAAU,WAAW;AACtE,cAAM,eAAe,kBAAkB;AAGvC,cAAM,mBAAmB,MAAM,KAAK,sBAAsB;AAE1D,YAAI,eAAe;AAEnB,mBAAW,eAAe,UAAU,kBAAkB;AACpD,cAAI,iBAAiB,SAAS,WAAW,GAAG;AAC1C,oBAAQ,IAAI,sBAAe,WAAW,+BAA+B;AACrE;AAAA,UACF;AAEA,cAAI;AACF,oBAAQ,IAAI,oCAA6B,WAAW,EAAE;AAItD,gBAAI,UAAU,aAAa;AACzB,oBAAM,cAAmB,WAAK,UAAU,aAAa,WAAW;AAChE,kBAAO,eAAW,WAAW,GAAG;AAE9B,sBAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,sBAAM,uBAAuB,IAAIA,eAAc,WAAW;AAG1D,oBAAI,CAAC,qBAAqB,mBAAmB,WAAW,GAAG;AACzD,wBAAM,gBAAgB;AAAA,oBACpB,MAAM;AAAA,oBACN,aAAa,4BAA4B,WAAW;AAAA,oBACpD,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,WAAW;AAAA,sBACT,WAAW;AAAA,sBACX,YAAY;AAAA,sBACZ,WAAW;AAAA,sBACX,eAAe;AAAA,sBACf,SAAS;AAAA,oBACX;AAAA,oBACA,oBAAoB;AAAA,sBAClB,gBAAgB;AAAA,sBAChB,aAAa;AAAA,sBACb,cAAc;AAAA,sBACd,aAAa;AAAA,sBACb,WAAW;AAAA,sBACX,gBAAgB;AAAA,oBAClB;AAAA,kBACF;AAEA,uCAAqB,kBAAkB,aAAa,aAAa;AACjE;AACA,0BAAQ,IAAI,gCAA2B,WAAW,EAAE;AAAA,gBACtD,OAAO;AACL,0BAAQ,IAAI,sBAAe,WAAW,mCAAmC;AAAA,gBAC3E;AAAA,cACF;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ;AAAA,cACN,gDAAsC,WAAW,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACjH;AAAA,UACF;AAAA,QACF;AAEA,YAAI,eAAe,GAAG;AACpB,kBAAQ,IAAI,uBAAkB,YAAY,uCAAuC;AAAA,QACnF,OAAO;AACL,kBAAQ,IAAI,iEAA0D;AAAA,QACxE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,wBAA2C;AACvD,YAAI;AACF,gBAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,iBAAO,OAAO,KAAK,MAAM,QAAQ;AAAA,QACnC,SAAS,QAAQ;AAEf,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,eAAe,MAAgD;AAC1E,cAAM,QAAQ,MAAM,KAAK,UAAU;AAEnC,gBAAQ,MAAM;AAAA,UACZ,KAAK;AACH,mBAAO,OAAO,OAAO,MAAM,KAAK;AAAA,UAClC,KAAK;AACH,mBAAO,OAAO,OAAO,MAAM,MAAM;AAAA,UACnC,KAAK;AACH,mBAAO,OAAO,OAAO,MAAM,KAAK;AAAA,UAClC,KAAK;AACH,mBAAO,OAAO,OAAO,MAAM,GAAG;AAAA,UAChC;AACE,mBAAO,CAAC;AAAA,QACZ;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,YAAY,MAAgB,IAAiD;AACxF,cAAM,QAAQ,MAAM,KAAK,UAAU;AAEnC,gBAAQ,MAAM;AAAA,UACZ,KAAK;AACH,mBAAO,MAAM,MAAM,EAAE,KAAK;AAAA,UAC5B,KAAK;AACH,mBAAO,MAAM,OAAO,EAAE,KAAK;AAAA,UAC7B,KAAK;AACH,mBAAO,MAAM,MAAM,EAAE,KAAK;AAAA,UAC5B,KAAK;AACH,mBAAO,MAAM,IAAI,EAAE,KAAK;AAAA,UAC1B;AACE,mBAAO;AAAA,QACX;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,iBAAiB,QAAoD;AAChF,cAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,cAAM,WAAkC;AAAA,UACtC,GAAG,OAAO,OAAO,MAAM,KAAK;AAAA,UAC5B,GAAG,OAAO,OAAO,MAAM,MAAM;AAAA,UAC7B,GAAG,OAAO,OAAO,MAAM,KAAK;AAAA,UAC5B,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,QAC5B;AAEA,eAAO,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM;AAAA,MACzD;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,qBAOV;AACD,cAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,cAAM,WAAkC;AAAA,UACtC,GAAG,OAAO,OAAO,MAAM,KAAK;AAAA,UAC5B,GAAG,OAAO,OAAO,MAAM,MAAM;AAAA,UAC7B,GAAG,OAAO,OAAO,MAAM,KAAK;AAAA,UAC5B,GAAG,OAAO,OAAO,MAAM,GAAG;AAAA,QAC5B;AAGA,cAAM,WAAW,SAAS;AAAA,UACxB,CAAC,KAAK,SAAS;AACb,gBAAI,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK;AAC7C,mBAAO;AAAA,UACT;AAAA,UACA,CAAC;AAAA,QACH;AAEA,cAAM,aAAa,SAAS;AAAA,UAC1B,CAAC,KAAK,SAAS;AACb,gBAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,KAAK;AACjD,mBAAO;AAAA,UACT;AAAA,UACA,CAAC;AAAA,QACH;AAEA,cAAM,SAAmC;AAAA,UACvC,SAAS,MAAM,MAAM,iBAAiB;AAAA,UACtC,MAAM,MAAM,MAAM;AAAA,UAClB,OAAO,MAAM,MAAM;AAAA,UACnB,MAAM,MAAM,MAAM;AAAA,UAClB,IAAI,MAAM,MAAM;AAAA,QAClB;AAEA,cAAM,iBAAiB,SAAS,aAAa;AAC7C,cAAM,iBACJ,SAAS,SAAS,IAAI,KAAK,MAAO,iBAAiB,SAAS,SAAU,GAAG,IAAI;AAG/E,cAAM,WAAW,oBAAI,KAAK;AAC1B,iBAAS,QAAQ,SAAS,QAAQ,IAAI,CAAC;AACvC,cAAM,iBAAiB,SACpB,OAAO,CAAC,SAAS,IAAI,KAAK,KAAK,YAAY,KAAK,QAAQ,EACxD,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,EACtF,MAAM,GAAG,EAAE;AAEd,eAAO;AAAA,UACL,YAAY,SAAS;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAIA,MAAc,cAAgC;AAC5C,YAAI;AACF,gBAAMF,QAAO,KAAK,SAAS;AAC3B,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEQ,uBAAuB,OAAgC;AAC7D,eAAO,CAAC,EACN,MAAM,WACN,MAAM,eACN,MAAM,eACN,MAAM,SACN,MAAM,UACN,MAAM,SACN,MAAM,OACN,MAAM;AAAA,MAEV;AAAA,MAEA,MAAc,6BAA4C;AACxD,YAAI;AACF,gBAAMA,QAAO,KAAK,QAAQ;AAAA,QAC5B,QAAQ;AACN,UAAG,cAAU,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,QACjD;AAAA,MACF;AAAA,MAEA,MAAc,cAAc,SAAiB,WAA6C;AACxF,YAAI;AACF,gBAAMA,QAAO,OAAO;AAAA,QACtB,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,QAAQ,MAAMD,SAAQ,OAAO;AACnC,cAAM,UAAU,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC;AAG3D,cAAM,UAAyB,CAAC;AAChC,cAAM,YAAY,KAAK,IAAI,sBAAsB,QAAQ,MAAM;AAE/D,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,WAAW;AAClD,gBAAM,QAAQ,QAAQ,MAAM,GAAG,IAAI,SAAS;AAC5C,gBAAM,gBAAgB,MAAM,IAAI,OAAO,SAAS;AAC9C,gBAAI;AACF,oBAAM,WAAgB,WAAK,SAAS,IAAI;AACxC,qBAAO,KAAK,kBAAkB,aAAa,QAAQ;AAAA,YACrD,SAAS,OAAO;AACd,sBAAQ;AAAA,gBACN,mBAAmB,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,cACtF;AACA,qBAAO;AAAA,YACT;AAAA,UACF,CAAC;AAED,gBAAM,eAAe,MAAM,QAAQ,IAAI,aAAa;AACpD,kBAAQ,KAAK,GAAI,aAAa,OAAO,OAAO,CAAmB;AAAA,QACjE;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,qBAAqB,MAAyC;AAC1E,cAAM,QAAQ,MAAMD,MAAK,KAAK,SAAS;AACvC,eAAO;AAAA,UACL,IAAI,KAAK;AAAA,UACT,OAAO,KAAK;AAAA,UACZ,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,UACf,cAAc,KAAK;AAAA,UACnB,UAAU,MAAM;AAAA,UAChB,UAAU,KAAK,aAAa,eAAe,KAAK,WAAW;AAAA,UAC3D,MAAM,KAAK;AAAA,UACX,UAAU,KAAK,kBAAkB,CAAC;AAAA,UAClC,WAAW,KAAK;AAAA,UAChB,uBAAuB,KAAK;AAAA,QAC9B;AAAA,MACF;AAAA,MAEA,MAAc,sBAAsB,OAA4C;AAC9E,cAAM,QAAQ,MAAMA,MAAK,MAAM,SAAS;AACxC,eAAO;AAAA,UACL,IAAI,MAAM;AAAA,UACV,OAAO,MAAM;AAAA,UACb,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,UACd,UAAU,MAAM;AAAA,UAChB,cAAc,MAAM;AAAA,UACpB,UAAU,MAAM;AAAA,UAChB,UAAU,MAAM,aAAa,eAAe,MAAM,WAAW;AAAA,UAC7D,MAAM,MAAM;AAAA,UACZ,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM,iBAAiB,CAAC;AAAA,UACjC,OAAO,MAAM,eAAe,CAAC;AAAA,UAC7B,YAAY,MAAM;AAAA,UAClB,QAAQ,MAAM;AAAA,QAChB;AAAA,MACF;AAAA,MAEA,MAAc,qBAAqB,MAAyC;AAC1E,cAAM,QAAQ,MAAMA,MAAK,KAAK,SAAS;AACvC,eAAO;AAAA,UACL,IAAI,KAAK;AAAA,UACT,OAAO,KAAK;AAAA,UACZ,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,UACf,cAAc,KAAK;AAAA,UACnB,UAAU,MAAM;AAAA,UAChB,UAAU,KAAK,aAAa,eAAe,KAAK,WAAW;AAAA,UAC3D,MAAM,KAAK;AAAA,UACX,SAAS,KAAK;AAAA,UACd,QAAQ,KAAK;AAAA,UACb,eAAe,KAAK;AAAA,UACpB,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,QACjB;AAAA,MACF;AAAA,MAEA,MAAc,mBAAmB,IAAmC;AAClE,cAAM,QAAQ,MAAMA,MAAK,GAAG,SAAS;AACrC,eAAO;AAAA,UACL,IAAI,GAAG;AAAA,UACP,OAAO,GAAG;AAAA,UACV,UAAU,GAAG;AAAA,UACb,QAAQ,GAAG;AAAA,UACX,UAAU,GAAG;AAAA,UACb,cAAc,GAAG;AAAA,UACjB,UAAU,MAAM;AAAA,UAChB,UAAU,GAAG,aAAa,eAAe,GAAG,WAAW;AAAA,UACvD,MAAM,GAAG;AAAA,UACT,SAAS,GAAG;AAAA,UACZ,QAAQ,GAAG;AAAA,UACX,WAAW,GAAG;AAAA,UACd,aAAa,GAAG;AAAA,UAChB,WAAW,GAAG;AAAA,UACd,WAAW,GAAG;AAAA,QAChB;AAAA,MACF;AAAA,MAEQ,mBAAmB,OAA6B;AAEtD,mBAAW,QAAQ,OAAO,OAAO,MAAM,KAAK,GAAG;AAC7C,eAAK,WAAW,OAAO,OAAO,MAAM,MAAM,EACvC,OAAO,CAAC,UAAU,MAAM,WAAW,KAAK,EAAE,EAC1C,IAAI,CAAC,UAAU,MAAM,EAAE;AAAA,QAC5B;AAGA,mBAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,gBAAM,UAAU,OAAO,OAAO,MAAM,KAAK,EACtC,OAAO,CAAC,SAAS,KAAK,YAAY,MAAM,EAAE,EAC1C,IAAI,CAAC,SAAS,KAAK,EAAE;AAExB,gBAAM,QAAQ,OAAO,OAAO,MAAM,GAAG,EAClC,OAAO,CAAC,OAAO,GAAG,YAAY,MAAM,EAAE,EACtC,IAAI,CAAC,OAAO,GAAG,EAAE;AAAA,QACtB;AAAA,MACF;AAAA,MAEQ,oBAAoB,OAAuB,OAAiB,KAAmB;AAErF,aAAK,mBAAmB,KAAK;AAAA,MAC/B;AAAA,MAEQ,qBAAqB,OAAuB,MAAgB,IAAkB;AAEpF,gBAAQ,MAAM;AAAA,UACZ,KAAK;AAGH;AAAA,UACF,KAAK;AACH,uBAAW,QAAQ,OAAO,OAAO,MAAM,KAAK,GAAG;AAC7C,mBAAK,WAAW,KAAK,SAAS,OAAO,CAAC,YAAY,YAAY,EAAE;AAAA,YAClE;AACA;AAAA,UACF,KAAK;AACH,uBAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,oBAAM,UAAU,MAAM,QAAQ,OAAO,CAAC,WAAW,WAAW,EAAE;AAC9D,oBAAM,QAAQ,MAAM,MAAM,OAAO,CAAC,SAAS,SAAS,EAAE;AAAA,YACxD;AACA;AAAA,UACF,KAAK;AAEH;AAAA,UACF,KAAK;AAEH;AAAA,QACJ;AAAA,MACF;AAAA,MAEA,MAAc,aAAa,MAAgB,IAAoC;AAC7E,cAAM,SAAS,KAAK,aAAa,gBAAgB;AACjD,cAAM,UAAU,KAAK,aAAa,qBAAqB,IAAI;AAE3D,YAAI;AACF,gBAAM,QAAQ,MAAMC,SAAQ,OAAO;AACnC,gBAAM,UAAU,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC;AAE3D,qBAAW,QAAQ,SAAS;AAC1B,gBAAI,KAAK,SAAS,EAAE,GAAG;AACrB,qBAAY,WAAK,SAAS,IAAI;AAAA,YAChC;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,eAAO;AAAA,MACT;AAAA,MAEQ,yBAAyB,WAAuC;AACtE,eAAO;AAAA,UACL,WAAW,KAAK,IAAI;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,uBAAuB,SAAqC;AAClE,cAAM,WAAW,KAAK,IAAI,IAAI,QAAQ;AAGtC,YAAI,WAAW,OAAO,CAAC,KAAK,YAAY;AACtC,kBAAQ,KAAK,qBAAW,QAAQ,SAAS,KAAK,QAAQ,IAAI;AAAA,QAC5D;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,yBAAyC;AAC/C,eAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,aAAa,KAAK;AAAA,UAClB,UAAU,CAAC;AAAA,UACX,OAAO,CAAC;AAAA,UACR,QAAQ,CAAC;AAAA,UACT,OAAO,CAAC;AAAA,UACR,KAAK,CAAC;AAAA,UACN,OAAO;AAAA,YACL,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,YACrC,WAAW;AAAA,YACX,oBAAoB;AAAA,cAClB,cAAc;AAAA,cACd,gBAAgB;AAAA,cAChB,iBAAiB;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,iBAAiB,OAK5B;AACD,cAAM,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,EAAE;AAEvD,YAAI;AAEF,cAAI,MAAM,KAAK,gBAAgB,MAAM,QAAQ,GAAG;AAC9C,kBAAM,YAAY,MAAMA,SAAQ,MAAM,QAAQ;AAC9C,mBAAO,QAAQ,UAAU,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,EAAE;AAAA,UAC1D;AAGA,cAAI,MAAM,KAAK,gBAAgB,MAAM,SAAS,GAAG;AAC/C,kBAAM,aAAa,MAAMA,SAAQ,MAAM,SAAS;AAChD,mBAAO,SAAS,WAAW,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,EAAE;AAAA,UAC5D;AAGA,cAAI,MAAM,KAAK,gBAAgB,MAAM,QAAQ,GAAG;AAC9C,kBAAM,YAAY,MAAMA,SAAQ,MAAM,QAAQ;AAC9C,mBAAO,QAAQ,UAAU,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,EAAE;AAAA,UAC1D;AAGA,cAAI,MAAM,KAAK,gBAAgB,MAAM,MAAM,GAAG;AAC5C,kBAAM,UAAU,MAAMA,SAAQ,MAAM,MAAM;AAC1C,mBAAO,MAAM,QAAQ,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,EAAE;AAAA,UACtD;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,KAAK,0CAA0C,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,QACnH;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,qBAAqB,OAAwC;AACzE,YAAI,gBAAgB;AAEpB,YAAI;AAEF,qBAAW,QAAQ,OAAO,OAAO,MAAM,KAAK,GAAG;AAC7C,gBAAI,CAAE,MAAM,KAAK,WAAW,KAAK,QAAQ,GAAI;AAC3C;AAAA,YACF;AAAA,UACF;AAGA,qBAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,gBAAI,CAAE,MAAM,KAAK,WAAW,MAAM,QAAQ,GAAI;AAC5C;AAAA,YACF;AAAA,UACF;AAGA,qBAAW,QAAQ,OAAO,OAAO,MAAM,KAAK,GAAG;AAC7C,gBAAI,CAAE,MAAM,KAAK,WAAW,KAAK,QAAQ,GAAI;AAC3C;AAAA,YACF;AAAA,UACF;AAGA,qBAAW,MAAM,OAAO,OAAO,MAAM,GAAG,GAAG;AACzC,gBAAI,CAAE,MAAM,KAAK,WAAW,GAAG,QAAQ,GAAI;AACzC;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,KAAK,8CAA8C,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,QACvH;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,uBAAsC;AAClD,cAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,YAAI,eAAe;AAGnB,mBAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AACpD,cAAI,CAAE,MAAM,KAAK,WAAW,KAAK,QAAQ,GAAI;AAC3C,mBAAO,MAAM,MAAM,EAAE;AACrB;AAAA,UACF;AAAA,QACF;AAGA,mBAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,MAAM,MAAM,GAAG;AACtD,cAAI,CAAE,MAAM,KAAK,WAAW,MAAM,QAAQ,GAAI;AAC5C,mBAAO,MAAM,OAAO,EAAE;AACtB;AAAA,UACF;AAAA,QACF;AAGA,mBAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAG;AACpD,cAAI,CAAE,MAAM,KAAK,WAAW,KAAK,QAAQ,GAAI;AAC3C,mBAAO,MAAM,MAAM,EAAE;AACrB;AAAA,UACF;AAAA,QACF;AAGA,mBAAW,CAAC,IAAI,EAAE,KAAK,OAAO,QAAQ,MAAM,GAAG,GAAG;AAChD,cAAI,CAAE,MAAM,KAAK,WAAW,GAAG,QAAQ,GAAI;AACzC,mBAAO,MAAM,IAAI,EAAE;AACnB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,eAAe,GAAG;AAEpB,eAAK,mBAAmB,KAAK;AAC7B,gBAAM,KAAK,UAAU,KAAK;AAE1B,cAAI,CAAC,KAAK,YAAY;AACpB,oBAAQ,IAAI,kBAAa,YAAY,8BAA8B;AAAA,UACrE;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,gBAAgB,SAAmC;AAC/D,YAAI;AACF,gBAAM,QAAQ,MAAMD,MAAK,OAAO;AAChC,iBAAO,MAAM,YAAY;AAAA,QAC3B,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,WAAW,UAAoC;AAC3D,YAAI;AACF,gBAAME,QAAO,QAAQ;AACrB,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AA/yCmC;AAA5B,IAAM,wBAAN;AAAA;AAAA;;;ACrGA,SAAS,+BAAwC;AACtD,QAAM,UAAU,IAAI,0BAAQ,kBAAkB;AAE9C,UACG,YAAY,6EAA6E,EACzF,OAAO,wBAAwB,yBAAyB,EACxD,OAAO,yBAAyB,uDAAuD,EACvF,OAAO,6BAA6B,+CAA+C,EACnF,OAAO,yBAAyB,oBAAoB,EACpD,OAAO,kBAAkB,yCAAyC,EAClE,OAAO,eAAe,sCAAsC,EAC5D,OAAO,cAAc,gCAAgC,EACrD,OAAO,mBAAmB,6BAA6B,EACvD,OAAO,mBAAmB,kDAAkD,EAC5E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcF,EACC,OAAO,OAAO,YAA4B;AACzC,QAAI;AACF,YAAM,uBAAuB,OAAO;AAAA,IACtC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACxF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,uBAAuB,SAAwC;AA1E9E;AA2EE,QAAM,YAAY,KAAK,IAAI;AAG3B,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,iBAAiB,aAAgB,YAAhB,mBAAyB;AAChD,QAAM,gBAAc,oDAAe,WAAf,mBAAuB,cAAW,oDAAe,WAAf,mBAAuB;AAE7E,QAAM,cAAc,cAAc,gBAAgB;AAClD,QAAM,eAAe,IAAI,sBAAsB,QAAQ,aAAa,WAAW;AAG/E,MAAI,QAAQ,cAAc;AACxB,YAAQ,IAAI,UAAU,KAAK,+BAAwB,CAAC;AACpD,UAAM,aAAa,aAAa;AAAA,EAClC;AAEA,UAAQ,IAAI,UAAU,OAAO,aAAM,OAAO,QAAQ,cAAc,6BAA6B,CAAC;AAG9F,QAAM,cAAc,MAAM,aAAa,oBAAoB;AAC3D,MAAI,CAAC,YAAY,SAAS;AACxB,YAAQ,IAAI,UAAU,QAAQ,6CAAmC,CAAC;AAClE,eAAW,SAAS,YAAY,QAAQ;AACtC,cAAQ,IAAI,UAAU,QAAQ,aAAQ,KAAK,EAAE,CAAC;AAAA,IAChD;AAEA,YAAQ,IAAI,UAAU,KAAK,mCAA4B,CAAC;AACxD,UAAM,eAAe,MAAM,aAAa,gBAAgB;AAExD,QAAI,aAAa,UAAU;AACzB,cAAQ,IAAI,UAAU,QAAQ,oCAA+B,CAAC;AAC9D,iBAAW,UAAU,aAAa,SAAS;AACzC,gBAAQ,IAAI,UAAU,IAAI,aAAQ,MAAM,EAAE,CAAC;AAAA,MAC7C;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,UAAU,QAAQ,iEAAuD,CAAC;AACtF,iBAAW,SAAS,aAAa,QAAQ;AACvC,gBAAQ,IAAI,UAAU,QAAQ,aAAQ,KAAK,EAAE,CAAC;AAAA,MAChD;AAAA,IACF;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,QAAM,CAAC,OAAO,QAAQ,OAAO,GAAG,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpD,aAAa,eAAe,MAAM;AAAA,IAClC,aAAa,eAAe,OAAO;AAAA,IACnC,aAAa,eAAe,MAAM;AAAA,IAClC,aAAa,eAAe,IAAI;AAAA,EAClC,CAAC;AAGD,QAAM,eAAe,oBAAoB,EAAE,OAAO,QAAQ,OAAO,IAAI,GAAG,OAAO;AAG/E,MAAI,QAAQ,UAAU;AACpB,2BAAuB,YAAY;AAAA,EACrC;AAGA,MAAI,QAAQ,WAAW;AACrB,4BAAwB,cAAc,OAAO;AAAA,EAC/C,OAAO;AACL,uBAAmB,cAAc,OAAO;AAAA,EAC1C;AAGA,MAAI,QAAQ,QAAQ;AAClB,UAAM,cAAc,cAAc,QAAQ,MAAM;AAAA,EAClD;AAGA,QAAM,YAAY,KAAK,IAAI,IAAI;AAC/B,UAAQ,IAAI,UAAU,IAAI;AAAA,sBAAoB,SAAS,uBAAuB,CAAC;AACjF;AAEA,SAAS,oBAAoB,MAAW,SAA8B;AACpE,MAAI,EAAE,OAAO,QAAQ,OAAO,IAAI,IAAI;AAGpC,MAAI,QAAQ,MAAM;AAChB,YAAQ,MAAM,OAAO,CAAC,SAAc,KAAK,OAAO,QAAQ,IAAI;AAC5D,aAAS,OAAO,OAAO,CAAC,UAAe,MAAM,WAAW,QAAQ,IAAI;AACpE,YAAQ,MAAM,OAAO,CAAC,SAAc,KAAK,WAAW,QAAQ,IAAI;AAChE,UAAM,IAAI,OAAO,CAAC,OAAY,GAAG,WAAW,QAAQ,IAAI;AAAA,EAC1D;AAGA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,MAAM,OAAO,CAAC,SAAc,KAAK,WAAW,QAAQ,MAAM;AAClE,aAAS,OAAO,OAAO,CAAC,UAAe,MAAM,WAAW,QAAQ,MAAM;AACtE,YAAQ,MAAM,OAAO,CAAC,SAAc,KAAK,WAAW,QAAQ,MAAM;AAClE,UAAM,IAAI,OAAO,CAAC,OAAY,GAAG,WAAW,QAAQ,MAAM;AAAA,EAC5D;AAGA,MAAI,QAAQ,UAAU;AACpB,YAAQ,MAAM,OAAO,CAAC,SAAc,KAAK,aAAa,QAAQ,QAAQ;AACtE,aAAS,OAAO,OAAO,CAAC,UAAe,MAAM,aAAa,QAAQ,QAAQ;AAC1E,YAAQ,MAAM,OAAO,CAAC,SAAc,KAAK,aAAa,QAAQ,QAAQ;AACtE,UAAM,IAAI,OAAO,CAAC,OAAY,GAAG,aAAa,QAAQ,QAAQ;AAAA,EAChE;AAGA,MAAI,QAAQ,UAAU;AACpB,YAAQ,MAAM,OAAO,CAAC,SAAc,KAAK,aAAa,QAAQ,QAAQ;AACtE,aAAS,OAAO,OAAO,CAAC,UAAe,MAAM,aAAa,QAAQ,QAAQ;AAC1E,YAAQ,MAAM,OAAO,CAAC,SAAc,KAAK,aAAa,QAAQ,QAAQ;AACtE,UAAM,IAAI,OAAO,CAAC,OAAY,GAAG,aAAa,QAAQ,QAAQ;AAAA,EAChE;AAEA,SAAO,EAAE,OAAO,QAAQ,OAAO,IAAI;AACrC;AAEA,SAAS,uBAAuB,MAAiB;AAC/C,QAAM,EAAE,OAAO,QAAQ,OAAO,IAAI,IAAI;AACtC,QAAM,QAAQ,MAAM,SAAS,OAAO,SAAS,MAAM,SAAS,IAAI;AAEhE,MAAI,UAAU,GAAG;AACf,YAAQ,IAAI,UAAU,IAAI,sCAAsC,MAAM,CAAC;AACvE;AAAA,EACF;AAEA,UAAQ,IAAI,UAAU,UAAU,4BAAqB,CAAC;AAGtD,QAAM,iBAAiB;AAAA,IACrB,GAAG,MAAM,OAAO,CAAC,MAAW,EAAE,WAAW,WAAW;AAAA,IACpD,GAAG,OAAO,OAAO,CAAC,MAAW,EAAE,WAAW,WAAW;AAAA,IACrD,GAAG,MAAM,OAAO,CAAC,MAAW,EAAE,WAAW,WAAW;AAAA,IACpD,GAAG,IAAI,OAAO,CAAC,MAAW,EAAE,WAAW,WAAW;AAAA,EACpD,EAAE;AAEF,QAAM,iBAAiB,QAAQ,IAAI,KAAK,MAAO,iBAAiB,QAAS,GAAG,IAAI;AAEhF,UAAQ,IAAI,UAAU,KAAK,gBAAgB,KAAK,EAAE,CAAC;AACnD,UAAQ,IAAI,UAAU,KAAK,cAAc,cAAc,KAAK,cAAc,IAAI,CAAC;AAC/E,UAAQ;AAAA,IACN,UAAU;AAAA,MACR,gBAAgB,CAAC,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG,EAAE,OAAO,CAAC,SAAc,KAAK,WAAW,QAAQ,EAAE,MAAM;AAAA,IAChH;AAAA,EACF;AACA,UAAQ;AAAA,IACN,UAAU;AAAA,MACR,YAAY,CAAC,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG,EAAE,OAAO,CAAC,SAAc,KAAK,WAAW,UAAU,EAAE,MAAM;AAAA,IAC9G;AAAA,EACF;AAGA,UAAQ,IAAI,UAAU,UAAU,8BAAuB,CAAC;AACxD,sBAAoB,SAAS,KAAK;AAClC,sBAAoB,UAAU,MAAM;AACpC,sBAAoB,SAAS,KAAK;AAClC,sBAAoB,OAAO,GAAG;AAE9B,UAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,oBAAoB,UAAkB,OAAoB;AACjE,MAAI,MAAM,WAAW,EAAG;AAExB,QAAM,YAAY,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW,EAAE;AACtE,QAAM,OAAO,KAAK,MAAO,YAAY,MAAM,SAAU,GAAG;AACxD,QAAM,cAAc,kBAAkB,IAAI;AAE1C,UAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,KAAK,SAAS,IAAI,MAAM,MAAM,IAAI,WAAW,IAAI,IAAI,GAAG,CAAC;AACjG;AAEA,SAAS,kBAAkB,YAAoB,QAAgB,IAAY;AACzE,QAAM,SAAS,KAAK,MAAO,aAAa,MAAO,KAAK;AACpD,QAAM,QAAQ,QAAQ;AACtB,SAAO,IAAI,SAAI,OAAO,MAAM,CAAC,GAAG,IAAI,OAAO,KAAK,CAAC;AACnD;AAEA,SAAS,wBAAwB,MAAW,SAA+B;AACzE,QAAM,EAAE,OAAO,QAAQ,OAAO,IAAI,IAAI;AAEtC,UAAQ,IAAI,UAAU,UAAU,qCAA8B,CAAC;AAE/D,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,UAAU,IAAI,sCAAsC,MAAM,CAAC;AACvE;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,SAAc;AAC3B,IAAAG,aAAY,MAAM,OAAO;AAGzB,UAAM,aAAa,OAAO,OAAO,CAAC,UAAe,MAAM,WAAW,KAAK,EAAE;AAEzE,eAAW,QAAQ,CAAC,OAAY,eAAuB;AACrD,YAAM,cAAc,eAAe,WAAW,SAAS;AACvD,mBAAa,OAAO,aAAa,OAAO;AAGxC,YAAM,aAAa,MAAM,OAAO,CAAC,SAAc,KAAK,YAAY,MAAM,EAAE;AACxE,YAAM,WAAW,IAAI,OAAO,CAAC,OAAY,GAAG,YAAY,MAAM,EAAE;AAEhE,iBAAW,QAAQ,CAAC,MAAW,cAAsB;AACnD,cAAM,aAAa,cAAc,WAAW,SAAS,KAAK,SAAS,WAAW;AAC9E,oBAAY,MAAM,aAAa,YAAY,OAAO;AAAA,MACpD,CAAC;AAED,eAAS,QAAQ,CAAC,IAAS,YAAoB;AAC7C,cAAM,WAAW,YAAY,SAAS,SAAS;AAC/C,kBAAU,IAAI,aAAa,UAAU,OAAO;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAED,YAAQ,IAAI,EAAE;AAAA,EAChB,CAAC;AACH;AAEA,SAAS,mBAAmB,MAAW,SAA+B;AACpE,QAAM,EAAE,OAAO,QAAQ,OAAO,IAAI,IAAI;AAEtC,UAAQ,IAAI,UAAU,UAAU,4BAAqB,CAAC;AAGtD,QAAM,WAAW,CAAC,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG,EACpD,IAAI,CAAC,UAAU;AAAA,IACd,GAAG;AAAA,IACH,MAAMC,aAAY,KAAK,EAAE;AAAA,EAC3B,EAAE,EACD,KAAK,CAAC,GAAG,MAAM;AAEd,UAAM,gBAAgB,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAChE,UAAM,eACJ,cAAc,EAAE,QAAsC,IACtD,cAAc,EAAE,QAAsC;AACxD,QAAI,iBAAiB,EAAG,QAAO;AAE/B,WAAO,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ;AAAA,EAC/E,CAAC;AAEH,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,UAAU,IAAI,sCAAsC,MAAM,CAAC;AACvE;AAAA,EACF;AAGA,QAAM,UAAU,SAAS;AAAA,IACvB,CAAC,KAAK,SAAS;AACb,UAAI,CAAC,IAAI,KAAK,MAAM,EAAG,KAAI,KAAK,MAAM,IAAI,CAAC;AAC3C,UAAI,KAAK,MAAM,EAAE,KAAK,IAAI;AAC1B,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAGA,aAAW,CAAC,QAAQ,WAAW,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC3D,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,cAAc,eAAe,MAAM;AACzC,cAAQ;AAAA,QACN,UAAU,UAAU,GAAG,WAAW,IAAI,OAAO,YAAY,CAAC,KAAK,YAAY,MAAM,GAAG;AAAA,MACtF;AAEA,kBAAY,QAAQ,CAAC,MAAW,UAAkB;AAChD,2BAAmB,MAAM,OAAO,OAAO;AAAA,MACzC,CAAC;AACD,cAAQ,IAAI,EAAE;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAASD,aAAY,MAAW,SAA+B;AAxV/D;AAyVE,QAAM,cAAc,eAAe,KAAK,MAAM;AAC9C,QAAM,gBAAgB,iBAAiB,KAAK,QAAQ;AACpD,QAAM,iBACJ,KAAK,0BAA0B,SAAY,KAAK,KAAK,qBAAqB,OAAO;AAEnF,UAAQ;AAAA,IACN,aAAM,WAAW,IAAI,cAAc,KAAK,SAAS,YAAY,CAAC,CAAC,IAAI,UAAU,UAAU,KAAK,KAAK,CAAC,GAAG,cAAc,IAAI,UAAU,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC;AAAA,EACtJ;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,IAAI,gBAAgB,KAAK,YAAY,YAAY,EAAE;AAC3D,QAAI,KAAK,UAAW,SAAQ,IAAI,iBAAiB,KAAK,SAAS,EAAE;AACjE,SAAI,UAAK,SAAL,mBAAW,OAAQ,SAAQ,IAAI,YAAY,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AACrE,YAAQ,IAAI,gBAAgB,IAAI,KAAK,KAAK,YAAY,EAAE,eAAe,CAAC,EAAE;AAAA,EAC5E;AACF;AAEA,SAAS,aAAa,OAAY,QAAiB,SAA+B;AA1WlF;AA2WE,QAAM,SAAS,SAAS,wBAAS;AACjC,QAAM,cAAc,eAAe,MAAM,MAAM;AAC/C,QAAM,gBAAgB,iBAAiB,MAAM,QAAQ;AAErD,UAAQ;AAAA,IACN,GAAG,MAAM,aAAM,WAAW,IAAI,cAAc,MAAM,SAAS,YAAY,CAAC,CAAC,IAAI,MAAM,KAAK,IAAI,UAAU,IAAI,IAAI,MAAM,EAAE,GAAG,CAAC;AAAA,EAC5H;AAEA,MAAI,QAAQ,UAAU;AACpB,UAAM,SAAS,SAAS,SAAS;AACjC,YAAQ,IAAI,GAAG,MAAM,aAAa,MAAM,YAAY,YAAY,EAAE;AAClE,SAAI,WAAM,SAAN,mBAAY,OAAQ,SAAQ,IAAI,GAAG,MAAM,SAAS,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE;AAC7E,YAAQ,IAAI,GAAG,MAAM,aAAa,IAAI,KAAK,MAAM,YAAY,EAAE,eAAe,CAAC,EAAE;AAAA,EACnF;AACF;AAEA,SAAS,YACP,MACA,aACA,QACA,SACM;AAhYR;AAiYE,QAAM,cAAc,cAAc,SAAS;AAC3C,QAAM,aAAa,SAAS,wBAAS;AACrC,QAAM,cAAc,eAAe,KAAK,MAAM;AAC9C,QAAM,gBAAgB,iBAAiB,KAAK,QAAQ;AAEpD,UAAQ;AAAA,IACN,GAAG,WAAW,GAAG,UAAU,UAAK,WAAW,IAAI,cAAc,KAAK,SAAS,YAAY,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,UAAU,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC;AAAA,EAC1I;AAEA,MAAI,QAAQ,UAAU;AACpB,UAAM,SAAS,eAAe,SAAS,SAAS;AAChD,YAAQ,IAAI,GAAG,MAAM,aAAa,KAAK,YAAY,YAAY,EAAE;AACjE,QAAI,KAAK,cAAe,SAAQ,IAAI,GAAG,MAAM,aAAa,KAAK,aAAa,EAAE;AAC9E,SAAI,UAAK,SAAL,mBAAW,OAAQ,SAAQ,IAAI,GAAG,MAAM,SAAS,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,EAC7E;AACF;AAEA,SAAS,UAAU,IAAS,aAAsB,QAAiB,SAA+B;AAlZlG;AAmZE,QAAM,cAAc,cAAc,SAAS;AAC3C,QAAM,WAAW,SAAS,wBAAS;AACnC,QAAM,cAAc,eAAe,GAAG,MAAM;AAC5C,QAAM,gBAAgB,iBAAiB,GAAG,QAAQ;AAElD,UAAQ;AAAA,IACN,GAAG,WAAW,GAAG,QAAQ,aAAM,WAAW,IAAI,cAAc,GAAG,SAAS,YAAY,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,UAAU,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC;AAAA,EACnI;AAEA,MAAI,QAAQ,UAAU;AACpB,UAAM,SAAS,eAAe,SAAS,SAAS;AAChD,YAAQ,IAAI,GAAG,MAAM,cAAc,GAAG,SAAS,EAAE;AACjD,QAAI,GAAG,YAAa,SAAQ,IAAI,GAAG,MAAM,WAAW,GAAG,WAAW,EAAE;AACpE,SAAI,QAAG,cAAH,mBAAc,OAAQ,SAAQ,IAAI,GAAG,MAAM,cAAc,GAAG,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,EACxF;AACF;AAEA,SAAS,mBAAmB,MAAW,OAAe,SAA+B;AAparF;AAqaE,QAAM,YAAY,aAAa,KAAK,IAAI;AACxC,QAAM,cAAc,eAAe,KAAK,MAAM;AAC9C,QAAM,gBAAgB,iBAAiB,KAAK,QAAQ;AACpD,QAAM,eAAe,KAAK,WAAW,KAAK,KAAK,QAAQ,KAAK;AAC5D,QAAM,aAAW,UAAK,SAAL,mBAAW,UAAS,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM;AAEpE,UAAQ;AAAA,IACN,MAAM,QAAQ,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,KAAK,SAAS,IAAI,WAAW,IAAI,cAAc,KAAK,SAAS,YAAY,CAAC,CAAC,IAAI,KAAK,KAAK,GAAG,YAAY,GAAG,QAAQ,IAAI,UAAU,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC;AAAA,EAClM;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,IAAI,mBAAmB,IAAI,KAAK,KAAK,YAAY,EAAE,eAAe,CAAC,EAAE;AAC7E,QAAI,KAAK,SAAS,UAAU,KAAK,0BAA0B,QAAW;AACpE,cAAQ,IAAI,qBAAqB,KAAK,qBAAqB,GAAG;AAAA,IAChE;AACA,QAAI,KAAK,SAAS,QAAQ,KAAK,WAAW;AACxC,cAAQ,IAAI,oBAAoB,KAAK,SAAS,EAAE;AAAA,IAClD;AAAA,EACF;AACF;AAEA,eAAe,cAAc,MAAW,UAAiC;AACvE,QAAM,aAAa;AAAA,IACjB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,SAAS;AAAA,MACP,YAAY,KAAK,MAAM;AAAA,MACvB,aAAa,KAAK,OAAO;AAAA,MACzB,YAAY,KAAK,MAAM;AAAA,MACvB,UAAU,KAAK,IAAI;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AAEA,QAAME,OAAK,MAAM,OAAO,IAAS;AACjC,EAAAA,KAAG,cAAc,UAAU,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC9D,UAAQ,IAAI,UAAU,QAAQ,uBAAuB,QAAQ,EAAE,CAAC;AAClE;AAGA,SAASD,aAAY,IAAoB;AACvC,MAAI,GAAG,WAAW,KAAK,EAAG,QAAO;AACjC,MAAI,GAAG,WAAW,MAAM,EAAG,QAAO;AAClC,MAAI,GAAG,WAAW,MAAM,EAAG,QAAO;AAClC,MAAI,GAAG,WAAW,KAAK,EAAG,QAAO;AACjC,SAAO;AACT;AAEA,SAAS,aAAa,MAAsB;AAC1C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,QAAwB;AAC9C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,iBAAiB,UAA4C;AACpE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,CAAC,SAAiB;AAAA,IAC3B,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,CAAC,SAAiB;AAAA,EAC7B;AACF;AA/fA,IAUAE;AAVA;AAAA;AAAA;AAAA;AAUA,IAAAA,oBAAwB;AACxB;AACA;AACA;AAcgB;AA+CD;AAgFN;AAsCA;AA4CA;AAUA;AAMA;AAuCA;AAqDA,WAAAH,cAAA;AAkBA;AAiBA;AAuBA;AAkBA;AAsBM;AAkBN,WAAAC,cAAA;AAQA;AAeA;AAeA;AAAA;AAAA;;;AC/dF,SAAS,4BAAqC;AACnD,QAAM,MAAM,IAAI,0BAAQ,UAAU;AAElC,MACG,YAAY,2BAA2B,EACvC,SAAS,aAAa,qBAAqB,EAC3C,OAAO,eAAe,iDAAiD,EACvE,OAAO,4BAA4B,wBAAwB,EAC3D,OAAO,6BAA6B,sBAAsB,EAC1D,OAAO,4BAA4B,mDAAmD,EACtF,OAAO,aAAa,iDAAiD,EACrE,OAAO,OAAO,QAAgB,YAA6B;AAC1D,QAAI;AACF,YAAM,aAAa,QAAQ,OAAO;AAAA,IACpC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACtF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,aAAa,QAAgB,SAAyC;AACnF,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,QAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAM,YAAY,oBAAoB,iBAAiB,MAAM;AAC7D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,EAC7C;AAEA,QAAM,EAAE,MAAM,QAAQ,MAAM,IAAI;AAGhC,MAAI,KAAK,WAAW,aAAa;AAC/B,YAAQ,IAAI,UAAU,QAAQ,QAAQ,MAAM,wBAAwB,CAAC;AACrE;AAAA,EACF;AAGA,QAAM,mBAAmB,OAAO,OAAO,CAAC,UAAU,MAAM,WAAW,WAAW;AAC9E,QAAM,kBAAkB,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW;AAG1E,UAAQ,IAAI,UAAU,KAAK,SAAS,KAAK,KAAK,EAAE,CAAC;AACjD,UAAQ,IAAI,UAAU,KAAK,mBAAmB,KAAK,MAAM,EAAE,CAAC;AAC5D,UAAQ,IAAI,EAAE;AAGd,QAAM,sBACJ,OAAO,SAAS,KAAM,OAAO,SAAS,iBAAiB,UAAU,OAAO,SAAU,MAAM;AAC1F,QAAM,qBACJ,MAAM,SAAS,KAAM,MAAM,SAAS,gBAAgB,UAAU,MAAM,SAAU,MAAM;AAEtF,UAAQ,IAAI,UAAU,QAAQ,oBAAoB,CAAC;AACnD,UAAQ;AAAA,IACN,aAAa,OAAO,SAAS,iBAAiB,MAAM,IAAI,OAAO,MAAM,eAAe,oBAAoB,QAAQ,CAAC,CAAC;AAAA,EACpH;AACA,UAAQ;AAAA,IACN,YAAY,MAAM,SAAS,gBAAgB,MAAM,IAAI,MAAM,MAAM,eAAe,mBAAmB,QAAQ,CAAC,CAAC;AAAA,EAC/G;AACA,UAAQ,IAAI,EAAE;AAGd,OACG,iBAAiB,SAAS,KAAK,gBAAgB,SAAS,MACzD,CAAC,QAAQ,SACT,CAAC,QAAQ,sBACT;AACA,YAAQ,IAAI,UAAU,QAAQ,4BAA4B,CAAC;AAE3D,QAAI,iBAAiB,SAAS,GAAG;AAC/B,cAAQ,IAAI,UAAU,KAAK,wBAAwB,iBAAiB,MAAM,IAAI,CAAC;AAC/E,iBAAW,SAAS,iBAAiB,MAAM,GAAG,CAAC,GAAG;AAChD,gBAAQ,IAAI,cAAS,MAAM,QAAQ,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG;AAAA,MACzE;AACA,UAAI,iBAAiB,SAAS,GAAG;AAC/B,gBAAQ,IAAI,eAAe,iBAAiB,SAAS,CAAC,OAAO;AAAA,MAC/D;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAQ,IAAI,UAAU,KAAK,uBAAuB,gBAAgB,MAAM,IAAI,CAAC;AAC7E,iBAAW,QAAQ,gBAAgB,MAAM,GAAG,CAAC,GAAG;AAC9C,gBAAQ,IAAI,cAAS,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,GAAG;AAAA,MACrE;AACA,UAAI,gBAAgB,SAAS,GAAG;AAC9B,gBAAQ,IAAI,eAAe,gBAAgB,SAAS,CAAC,OAAO;AAAA,MAC9D;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,UAAU,CAAC;AACtC,YAAQ,IAAI,oCAAoC;AAChD,YAAQ,IAAI,8DAA8D;AAC1E,YAAQ,IAAI,yCAAyC;AAErD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAmC;AAAA,IACvC,QAAQ;AAAA,IACR,uBAAuB;AAAA,IACvB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvC;AAEA,MAAI,QAAQ,iBAAiB,QAAW;AACtC,YAAQ,gBAAgB,SAAS,QAAQ,aAAa,SAAS,GAAG,EAAE;AAAA,EACtE;AAGA,QAAM,eAAe,CAAC;AAEtB,MAAI,QAAQ,sBAAsB;AAChC,eAAW,SAAS,kBAAkB;AACpC,mBAAa,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,IAAI,MAAM;AAAA,QACV,UAAU,MAAM;AAAA,QAChB,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,uBAAuB;AAAA,UACvB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,iBAAiB;AAClC,mBAAa,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,UAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,SAAS,eAAe,EAAE,iBAAiB,CAAC;AAClF,UAAQ,IAAI,WAAW,KAAK,OAAO,MAAM,KAAK,KAAK,EAAE;AACrD,UAAQ,IAAI,eAAe,KAAK,MAAM,mBAAc;AACpD,UAAQ,IAAI,iBAAiB,KAAK,yBAAyB,CAAC,eAAU;AAEtE,MAAI,QAAQ,iBAAiB,QAAW;AACtC,YAAQ,IAAI,sBAAsB,KAAK,iBAAiB,CAAC,WAAM,QAAQ,YAAY,EAAE;AAAA,EACvF;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI,kBAAkB,aAAa,MAAM,IAAI;AACrD,eAAW,SAAS,cAAc;AAChC,cAAQ,IAAI,cAAS,MAAM,EAAE,KAAK,MAAM,IAAI,mBAAc;AAAA,IAC5D;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB;AAAA,EACF;AAGA,MAAI;AAEF,UAAM,cAAc,OAAO,WAAW,KAAK,WAAW,OAAO;AAG7D,eAAW,SAAS,cAAc;AAChC,aAAO,WAAW,MAAM,UAAU,MAAM,OAAO;AAAA,IACjD;AAGA,wBAAoB,aAAa;AAEjC,YAAQ,IAAI,UAAU,QAAQ,8BAA8B,CAAC;AAC7D,YAAQ,IAAI,UAAU,KAAK,YAAY,MAAM,EAAE,CAAC;AAChD,YAAQ,IAAI,UAAU,KAAK,UAAU,YAAY,KAAK,EAAE,CAAC;AACzD,YAAQ,IAAI,UAAU,KAAK,WAAW,YAAY,MAAM,EAAE,CAAC;AAC3D,YAAQ,IAAI,UAAU,KAAK,aAAa,YAAY,qBAAqB,GAAG,CAAC;AAE7E,QAAI,YAAY,eAAe;AAC7B,cAAQ,IAAI,UAAU,KAAK,kBAAkB,YAAY,aAAa,EAAE,CAAC;AAEzE,UAAI,YAAY,mBAAmB,GAAG;AACpC,cAAM,aAAa,YAAY,gBAAgB,YAAY;AAC3D,cAAM,oBACJ,cAAc,IACV,UAAU,QAAQ,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG,IACrD,UAAU,QAAQ,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC3D,gBAAQ,IAAI,UAAU,KAAK,qBAAqB,iBAAiB,EAAE,CAAC;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ,IAAI,UAAU,KAAK,kBAAkB,aAAa,MAAM,eAAe,CAAC;AAAA,IAClF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,oCAA6B,CAAC;AAC5D,YAAQ,IAAI,YAAO,OAAO,MAAM,eAAe;AAC/C,YAAQ,IAAI,YAAO,MAAM,MAAM,cAAc;AAC7C,YAAQ,IAAI,0BAAoB,oBAAI,KAAK,GAAE,mBAAmB,CAAC,EAAE;AAEjE,QAAI,QAAQ,iBAAiB;AAC3B,cAAQ,IAAI,mBAAc,QAAQ,eAAe,EAAE;AAAA,IACrD;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IACrF;AAAA,EACF;AACF;AAvPA,IAKAG;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,oBAAwB;AACxB;AACA;AACA;AACA;AAUgB;AA2BD;AAAA;AAAA;;;AC9Cf,IAKAC,KACAC,OAEa;AARb;AAAA;AAAA;AAAA;AAKA,IAAAD,MAAoB;AACpB,IAAAC,QAAsB;AAEf,IAAM,eAAN,MAAM,aAAY;AAAA,MACf;AAAA,MACA,WAKJ;AAAA,QACF,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MAEA,cAAc;AAEZ,aAAK,eAAoB,WAAK,QAAQ,IAAI,GAAG,iBAAiB,eAAe;AAC7E,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKO,eAAe,QAAwB;AAC5C,cAAM,KAAK,MAAM,KAAK,SAAS,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAC/D,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,gBAAgB,UAAkB,QAAwB;AAC/D,cAAM,KAAK,OAAO,KAAK,SAAS,MAAM,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AACjE,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,eAAe,WAAmB,QAAwB;AAC/D,cAAM,KAAK,OAAO,KAAK,SAAS,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAChE,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,aAAa,WAAmB,QAAwB;AAC7D,cAAM,KAAK,MAAM,KAAK,SAAS,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAC7D,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAqB;AAC3B,YAAI;AACF,cAAO,eAAW,KAAK,YAAY,GAAG;AACpC,kBAAM,OAAU,iBAAa,KAAK,cAAc,MAAM;AACtD,kBAAM,SAAS,KAAK,MAAM,IAAI;AAE9B,iBAAK,SAAS,OAAO,KAAK,IAAI,GAAG,OAAO,QAAQ,CAAC;AACjD,iBAAK,SAAS,QAAQ,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;AACnD,iBAAK,SAAS,OAAO,KAAK,IAAI,GAAG,OAAO,QAAQ,CAAC;AACjD,iBAAK,SAAS,KAAK,KAAK,IAAI,GAAG,OAAO,MAAM,CAAC;AAAA,UAC/C;AAAA,QACF,SAAS,QAAQ;AAAA,QAEjB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAqB;AAC3B,YAAI;AACF,gBAAM,MAAW,cAAQ,KAAK,YAAY;AAC1C,cAAI,CAAI,eAAW,GAAG,GAAG;AACvB,YAAG,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,UACvC;AAEA,gBAAM,OAAO,KAAK,UAAU,KAAK,UAAU,MAAM,CAAC;AAClD,UAAG,kBAAc,KAAK,cAAc,MAAM,MAAM;AAAA,QAClD,SAAS,QAAQ;AAAA,QAEjB;AAAA,MACF;AAAA,IACF;AA/FyB;AAAlB,IAAM,cAAN;AAAA;AAAA;;;ACqBA,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAI,0BAAQ,QAAQ;AAEhC,MACG,YAAY,mBAAmB,EAC/B,SAAS,WAAW,6CAA6C,EACjE,OAAO,kBAAkB,iDAAiD,EAC1E,OAAO,4BAA4B,kBAAkB,EACrD,OAAO,6BAA6B,mBAAmB,EACvD,OAAO,0BAA0B,6CAA6C,QAAQ,EACtF;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,yBAAyB,mBAAmB,SAAS,EAC5D,OAAO,mCAAmC,yBAAyB,GAAG,EACtE,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,0BAA0B,gBAAgB,EACjD,OAAO,oBAAoB,uCAAuC,EAClE,OAAO,aAAa,6CAA6C,EACjE,OAAO,OAAO,UAA8B,YAA2B;AACtE,QAAI;AAEF,YAAM,QAAQ,YAAY,QAAQ;AAClC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,WAAW,OAAO,OAAO;AAAA,IACjC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACpF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,WAAW,OAAe,SAAuC;AAE9E,QAAM,iBAAiB,IAAI,sBAAsB;AAGjD,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,iBAAiB,MAAM,eAAe,kBAAkB,QAAQ,OAAO;AAG7E,QAAM,eAAe,uBAAuB;AAG5C,QAAM,gBAAgB,eAAe;AACrC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,QAAQ,eAAe;AAC7B,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,cAAc,IAAI,YAAY;AAGpC,QAAM,SAAS,YAAY,eAAe,KAAK;AAG/C,QAAM,WAAW,cAAc,wBAAwB,QAAQ,QAAQ,YAAY,SAAS;AAC5F,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,kBAAkB,QAAQ,YAAY,SAAS,aAAa;AAAA,EAC9E;AAGA,QAAM,OAAO,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC;AAGhF,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,kBAAmC;AAAA,IACvC,SAAS;AAAA,IACT,YAAY,eAAe,QAAQ,kBAAkB;AAAA,IACrD;AAAA,IACA,aAAa,QAAQ,eAAe,SAAS,qBAAqB,eAAe;AAAA,IACjF,QAAQ,QAAQ,UAAU;AAAA,IAC1B,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ,YAAY,OAAO,oBAAoB;AAAA,IACzD,cAAc;AAAA,IACd,cAAc;AAAA,IACd,kBAAkB,SAAS,QAAQ,mBAAmB,KAAK,EAAE;AAAA,IAC7D,eAAe;AAAA,IACf,YAAY,SAAS,uBAAuB,OAAO,wBAAwB,CAAC;AAAA,IAC5E,aAAa;AAAA,IACb,gBAAgB,CAAC;AAAA,IACjB,MAAM,KAAK,SAAS,IAAI,OAAO;AAAA,IAC/B,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC;AAAA,IACf,uBAAuB;AAAA,EACzB;AAGA,QAAM,UAAU,SAAS,iBACtB,QAAQ,kBAAkB,KAAK,EAC/B,QAAQ,wBAAwB,gBAAgB,WAAW;AAG9D,QAAM,WAAW,GAAG,MAAM,IAAI,MAAM,YAAY,EAAE,QAAQ,eAAe,GAAG,CAAC,GAAG,OAAO,mBAAmB,cAAc;AACxH,QAAM,WAAgB,WAAK,MAAM,UAAU,QAAQ;AAEnD,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,uCAAuC,CAAC;AACnE,YAAQ,IAAI,UAAU,MAAM,SAAS,QAAQ,EAAE,CAAC;AAChD,YAAQ,IAAI,UAAU,MAAM,YAAY,MAAM,EAAE,CAAC;AACjD,YAAQ,IAAI,UAAU,MAAM,UAAU,KAAK,EAAE,CAAC;AAC9C,YAAQ,IAAI,UAAU,MAAM,WAAW,gBAAgB,MAAM,EAAE,CAAC;AAChE,YAAQ,IAAI,UAAU,MAAM,aAAa,gBAAgB,QAAQ,EAAE,CAAC;AACpE,YAAQ,IAAI,UAAU,MAAM,aAAa,gBAAgB,QAAQ,EAAE,CAAC;AACpE,QAAI,gBAAgB,YAAY;AAC9B,cAAQ,IAAI,UAAU,MAAM,YAAY,gBAAgB,UAAU,EAAE,CAAC;AAAA,IACvE;AACA,QAAI,KAAK,SAAS,GAAG;AACnB,cAAQ,IAAI,UAAU,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACzD;AACA,QAAI,QAAQ,WAAW;AACrB,cAAQ,IAAI,UAAU,MAAM,cAAc,QAAQ,SAAS,EAAE,CAAC;AAAA,IAChE;AACA;AAAA,EACF;AAGA,MAAO,eAAW,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,6BAA6B,QAAQ,EAAE;AAAA,EACzD;AAGA,SAAO,UAAU,UAAU,iBAAiB,OAAO;AAGnD,MAAI;AACF,UAAM,eAAe,IAAI,sBAAsB,QAAQ,MAAM,aAAa,WAAW;AACrF,UAAM,aAAa,WAAW,QAAQ,MAAM;AAAA,EAC9C,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,uCAAuC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACjG;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,UAAU,QAAQ,4BAA4B,CAAC;AAC3D,UAAQ,IAAI,UAAU,KAAK,YAAY,MAAM,EAAE,CAAC;AAChD,UAAQ,IAAI,UAAU,KAAK,SAAS,QAAQ,EAAE,CAAC;AAC/C,UAAQ,IAAI,UAAU,KAAK,UAAU,KAAK,EAAE,CAAC;AAC7C,UAAQ,IAAI,UAAU,KAAK,WAAW,gBAAgB,MAAM,EAAE,CAAC;AAC/D,UAAQ,IAAI,UAAU,KAAK,aAAa,gBAAgB,QAAQ,EAAE,CAAC;AACnE,UAAQ,IAAI,UAAU,KAAK,aAAa,gBAAgB,QAAQ,EAAE,CAAC;AAEnE,MAAI,gBAAgB,YAAY;AAC9B,YAAQ,IAAI,UAAU,KAAK,YAAY,gBAAgB,UAAU,EAAE,CAAC;AAAA,EACtE;AAEA,MAAI,KAAK,SAAS,GAAG;AACnB,YAAQ,IAAI,UAAU,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACxD;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,IAAI,UAAU,KAAK,cAAc,QAAQ,SAAS,EAAE,CAAC;AAAA,EAC/D;AACF;AApMA,IAKAC,KACAC,OACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,MAAoB;AACpB,IAAAC,QAAsB;AACtB,IAAAC,oBAAwB;AAExB;AACA;AACA;AACA;AACA;AAgBgB;AA4CD;AAAA;AAAA;;;ACxDR,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAI,0BAAQ,QAAQ;AAEhC,MACG,YAAY,gBAAgB,EAC5B,SAAS,aAAa,mBAAmB,EACzC,OAAO,eAAe,qCAAqC,EAC3D,OAAO,mBAAmB,qCAAqC,EAC/D,OAAO,aAAa,6CAA6C,EACjE,OAAO,OAAO,QAAgB,YAA2B;AACxD,QAAI;AACF,YAAM,WAAW,QAAQ,OAAO;AAAA,IAClC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACpF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,WAAW,QAAgB,SAAuC;AAC/E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,YAAY,oBAAoB,iBAAiB,MAAM;AAC7D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,EAC7C;AAEA,QAAM,EAAE,MAAM,QAAQ,MAAM,IAAI;AAGhC,OAAK,OAAO,SAAS,KAAK,MAAM,SAAS,MAAM,CAAC,QAAQ,WAAW;AACjE,YAAQ,IAAI,UAAU,QAAQ,yBAAyB,CAAC;AACxD,YAAQ,IAAI,aAAa,OAAO,MAAM,EAAE;AACxC,YAAQ,IAAI,YAAY,MAAM,MAAM,EAAE;AACtC,YAAQ,IAAI,EAAE;AACd,YAAQ;AAAA,MACN,UAAU,KAAK,sEAAsE;AAAA,IACvF;AACA,YAAQ,IAAI,UAAU,KAAK,gBAAgB,CAAC;AAE5C,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,IAAI,UAAU,KAAK,WAAW,CAAC;AACvC,iBAAW,SAAS,OAAO,MAAM,GAAG,CAAC,GAAG;AACtC,gBAAQ,IAAI,cAAS,MAAM,QAAQ,KAAK,MAAM,KAAK,EAAE;AAAA,MACvD;AACA,UAAI,OAAO,SAAS,GAAG;AACrB,gBAAQ,IAAI,eAAe,OAAO,SAAS,CAAC,OAAO;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ,IAAI,UAAU,KAAK,UAAU,CAAC;AACtC,iBAAW,QAAQ,MAAM,MAAM,GAAG,CAAC,GAAG;AACpC,gBAAQ,IAAI,cAAS,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE;AAAA,MACpD;AACA,UAAI,MAAM,SAAS,GAAG;AACpB,gBAAQ,IAAI,eAAe,MAAM,SAAS,CAAC,OAAO;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AAGA,QAAM,UAAU,oBAAoB,gBAAgB,MAAM;AAC1D,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,YAAQ,IAAI,UAAU,QAAQ,mCAAmC,CAAC;AAClE,eAAW,aAAa,QAAQ,YAAY;AAC1C,YAAM,QAAQC,WAAU,SAAS;AACjC,cAAQ,IAAI,YAAO,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,IAChD;AAEA,QAAI,CAAC,QAAQ,OAAO;AAClB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,CAAC,KAAK,SAAS;AAErC,MAAI,QAAQ,WAAW;AACrB,kBAAc,KAAK,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,SAAS,CAAC;AAC5D,kBAAc,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;AAAA,EAC3D;AAGA,UAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,SAAS,eAAe,EAAE,eAAe,CAAC;AAChF,UAAQ,IAAI,WAAW,KAAK,OAAO,MAAM,KAAK,KAAK,EAAE;AACrD,UAAQ,IAAI,aAAa,KAAK,SAAS,EAAE;AAEzC,MAAI,QAAQ,aAAa,OAAO,SAAS,GAAG;AAC1C,YAAQ,IAAI,aAAa,OAAO,MAAM,IAAI;AAC1C,eAAW,SAAS,QAAQ;AAC1B,cAAQ,IAAI,cAAS,MAAM,QAAQ,KAAK,MAAM,KAAK,EAAE;AACrD,cAAQ,IAAI,eAAe,MAAM,SAAS,EAAE;AAAA,IAC9C;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa,MAAM,SAAS,GAAG;AACzC,YAAQ,IAAI,YAAY,MAAM,MAAM,IAAI;AACxC,eAAW,QAAQ,OAAO;AACxB,cAAQ,IAAI,cAAS,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE;AAClD,cAAQ,IAAI,eAAe,KAAK,SAAS,EAAE;AAAA,IAC7C;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,KAAK,0BAA0B,cAAc,MAAM,EAAE,CAAC;AAE5E,MAAI,QAAQ,QAAQ;AAClB;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,OAAO;AAClB,UAAM,WAAW,MAAM,OAAO,UAAe;AAC7C,UAAM,KAAK,SAAS,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,SAAS,MAAM,IAAI,QAAgB,CAACC,aAAY;AACpD,SAAG;AAAA,QACD,UAAU;AAAA,UACR;AAAA,QACF;AAAA,QACAA;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,MAAM;AAET,QAAI,OAAO,YAAY,MAAM,SAAS,OAAO,YAAY,MAAM,KAAK;AAClE,cAAQ,IAAI,UAAU,KAAK,qBAAqB,CAAC;AACjD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,eAAe;AACnB,QAAM,SAAmB,CAAC;AAE1B,aAAW,YAAY,eAAe;AACpC,QAAI;AACF,UAAO,eAAW,QAAQ,GAAG;AAC3B,QAAG,eAAW,QAAQ;AACtB;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,UAAU,QAAQ,mBAAmB,QAAQ,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,WAAW,oBAAoB,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAC1G,aAAO,KAAK,QAAQ;AACpB,cAAQ,MAAM,UAAU,MAAM,QAAQ,CAAC;AAAA,IACzC;AAAA,EACF;AAGA,sBAAoB,aAAa;AAGjC,UAAQ,IAAI,UAAU,QAAQ,0BAA0B,CAAC;AACzD,UAAQ,IAAI,UAAU,KAAK,kBAAkB,YAAY,IAAI,cAAc,MAAM,EAAE,CAAC;AAEpF,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,IAAI,UAAU,QAAQ,uBAAuB,OAAO,MAAM,EAAE,CAAC;AACrE,eAAW,SAAS,QAAQ;AAC1B,cAAQ,IAAI,UAAU,MAAM,YAAO,KAAK,EAAE,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,QAAQ,QAAQ,MAAM,oBAAoB,CAAC;AAEjE,MAAI,QAAQ,cAAc,OAAO,SAAS,KAAK,MAAM,SAAS,IAAI;AAChE,YAAQ,IAAI,UAAU,KAAK,gBAAgB,OAAO,MAAM,eAAe,MAAM,MAAM,SAAS,CAAC;AAAA,EAC/F;AAEA,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,YAAQ;AAAA,MACN,UAAU,QAAQ,mEAAmE;AAAA,IACvF;AACA,eAAW,aAAa,QAAQ,YAAY;AAC1C,YAAM,QAAQD,WAAU,SAAS;AACjC,cAAQ,IAAI,YAAO,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAASA,WAAU,MAAmB;AACpC,MAAI,KAAK,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AACjE,MAAI,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AAChD,MAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,SAAO;AACT;AApOA,IAKAE,KACAC;AANA;AAAA;AAAA;AAAA;AAKA,IAAAD,MAAoB;AACpB,IAAAC,oBAAwB;AACxB;AACA;AACA;AAQgB;AAyBD;AAqLN,WAAAH,YAAA;AAAA;AAAA;;;AC/NT,IAiBa,iCA6RA;AA9Sb;AAAA;AAAA;AAAA;AAKA;AAYO,IAAM,kBAAN,MAAM,gBAAe;AAAA;AAAA;AAAA;AAAA,MAI1B,OAAO,YACL,MACA,cAAsB,UACmC;AACzD,YAAI;AAEF,cAAI,KAAK,SAAS,KAAK,gBAAgB;AACrC,mBAAO,EAAE,MAAM,SAAS,KAAK;AAAA,UAC/B;AAGA,gBAAM,YAAY,aAAa,qBAAqB,KAAK,MAAM;AAG/D,gBAAM,iBAAgC;AAAA,YACpC,kBAAiB,oBAAI,KAAK,GAAE,YAAY;AAAA,YACxC,iBAAiB;AAAA,YACjB,gBAAgB;AAAA;AAAA,YAChB,qBAAqB;AAAA;AAAA,YACrB,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,UACrB;AAGA,gBAAM,gBAA6B;AAAA,YACjC,GAAG;AAAA,YACH,OAAO;AAAA,YACP;AAAA;AAAA,YAEA,QAAQ,KAAK;AAAA,UACf;AAEA,iBAAO,EAAE,MAAM,eAAe,SAAS,KAAK;AAAA,QAC9C,SAAS,OAAO;AACd,iBAAO;AAAA,YACL;AAAA,YACA,SAAS;AAAA,YACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,aACL,OACA,cAAsB,UACL;AACjB,cAAM,gBAAqC,CAAC;AAC5C,cAAM,iBAAgC,CAAC;AACvC,YAAI,iBAAiB;AACrB,YAAI,eAAe;AACnB,cAAM,SAAmB,CAAC;AAE1B,mBAAW,QAAQ,OAAO;AACxB,gBAAM,SAAS,KAAK,YAAY,MAAM,WAAW;AAEjD,gBAAM,YAA+B;AAAA,YACnC,SAAS,KAAK,UAAU,IAAI;AAAA,YAC5B,WAAW,KAAK,YAAY,IAAI;AAAA,YAChC,YAAY,KAAK;AAAA,YACjB,WAAW,OAAO,UAAU,OAAO,KAAK,QAAS,KAAK;AAAA,YACtD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YAClC,SAAS,OAAO;AAAA,YAChB,OAAO,OAAO;AAAA,UAChB;AAEA,wBAAc,KAAK,SAAS;AAE5B,cAAI,OAAO,SAAS;AAClB,2BAAe,KAAK,OAAO,IAAI;AAC/B;AAAA,UACF,OAAO;AACL,2BAAe,KAAK,IAAI;AACxB;AACA,gBAAI,OAAO,OAAO;AAChB,qBAAO,KAAK,GAAG,UAAU,OAAO,KAAK,OAAO,KAAK,EAAE;AAAA,YACrD;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS,iBAAiB;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,eAAe,MAAgC;AAEpD,eAAO,CAAC,KAAK,SAAS,CAAC,KAAK;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,iBAAiB,OAWtB;AACA,YAAI,kBAAkB;AACtB,YAAI,mBAAmB;AAEvB,cAAM,oBAAoB,MAAM,IAAI,UAAQ;AAC1C,gBAAM,YAAY,KAAK,eAAe,IAAI;AAC1C,cAAI,WAAW;AACb;AAAA,UACF,OAAO;AACL;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,SAAS,KAAK,UAAU,IAAI;AAAA,YAC5B,WAAW,KAAK,YAAY,IAAI;AAAA,YAChC,gBAAgB,KAAK;AAAA,YACrB,cAAc,aAAa,qBAAqB,KAAK,MAAM;AAAA,YAC3D,iBAAiB;AAAA,UACnB;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,aAAa,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,kBAAkB,OAWvB;AACA,cAAM,SAAmB,CAAC;AAC1B,cAAM,WAAqB,CAAC;AAC5B,cAAM,qBAAqB,CAAC;AAE5B,mBAAW,QAAQ,OAAO;AACxB,gBAAM,YAAY,CAAC,CAAC,KAAK;AACzB,gBAAM,eAAe,CAAC,CAAC,KAAK;AAC5B,gBAAM,sBAAsB,CAAC,CAAC,KAAK;AAEnC,cAAI,iBAAiB;AACrB,cAAI,gBAAgB,KAAK,gBAAgB;AACvC,kBAAM,aAAa,aAAa,sBAAsB,KAAK,cAAc;AACzE,6BAAiB,WAAW;AAE5B,gBAAI,CAAC,gBAAgB;AACnB,qBAAO,KAAK,GAAG,WAAW,OAAO;AAAA,gBAAI,OACnC,GAAG,KAAK,UAAU,IAAI,CAAC,KAAK,EAAE,OAAO;AAAA,cACvC,CAAC;AAAA,YACH;AAEA,qBAAS,KAAK,GAAG,WAAW,SAAS;AAAA,cAAI,OACvC,GAAG,KAAK,UAAU,IAAI,CAAC,KAAK,EAAE,OAAO;AAAA,YACvC,CAAC;AAAA,UACH;AAEA,6BAAmB,KAAK;AAAA,YACtB,SAAS,KAAK,UAAU,IAAI;AAAA,YAC5B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAED,cAAI,CAAC,WAAW;AACd,mBAAO,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,uBAAuB;AAAA,UAC5D;AAEA,cAAI,CAAC,cAAc;AACjB,mBAAO,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,0BAA0B;AAAA,UAC/D;AAEA,cAAI,CAAC,qBAAqB;AACxB,qBAAS,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,iEAAiE;AAAA,UACxG;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO,OAAO,WAAW;AAAA,UACzB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,mBAAmB,eAYxB;AACA,cAAM,sBAAsB,cAAc,IAAI,WAAS;AACrD,cAAI,SAAiE;AAErE,cAAI,MAAM,SAAS;AAEjB,qBAAS;AAAA,UACX,OAAO;AAEL,qBAAS;AAAA,UACX;AAEA,iBAAO;AAAA,YACL,SAAS,MAAM;AAAA,YACf;AAAA,YACA,iBAAiB,MAAM;AAAA,UACzB;AAAA,QACF,CAAC;AAED,cAAM,mBAAmB;AAAA,UACvB,kBAAkB,oBAAoB;AAAA,UACtC,qBAAqB,oBAAoB,OAAO,QAAM,GAAG,WAAW,qBAAqB,EAAE;AAAA,UAC3F,gBAAgB,oBAAoB,OAAO,QAAM,GAAG,WAAW,gBAAgB,EAAE;AAAA,UACjF,WAAW,oBAAoB,OAAO,QAAM,GAAG,WAAW,WAAW,EAAE;AAAA,QACzE;AAEA,eAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,OAAe,UAAU,MAA2B;AAClD,YAAI,gBAAgB,KAAM,QAAO,KAAK;AACtC,YAAI,aAAa,KAAM,QAAO,KAAK;AACnC,YAAI,cAAc,KAAM,QAAO,KAAK;AACpC,YAAI,aAAa,KAAM,QAAO,KAAK;AACnC,YAAI,WAAW,KAAM,QAAO,KAAK;AACjC,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AAAA,MAEA,OAAe,YAAY,MAA6B;AACtD,YAAI,gBAAgB,QAAQ,UAAU,KAAM,QAAO;AACnD,YAAI,aAAa,KAAM,QAAO;AAC9B,YAAI,cAAc,QAAQ,WAAW,KAAM,QAAO;AAClD,YAAI,cAAc,QAAQ,aAAa,KAAM,QAAO;AACpD,YAAI,cAAc,KAAM,QAAO;AAC/B,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACrC;AAAA,IACF;AAxR4B;AAArB,IAAM,iBAAN;AA6RA,IAAM,mBAAN,MAAM,iBAAgB;AAAA;AAAA;AAAA;AAAA,MAI3B,OAAO,gBACL,MACA,UACA,iBACA,mBACA,UACA,WAC+E;AAC/E,cAAM,gBAAgB,aAAa,kBAAkB,IAAI;AAGzD,cAAM,aAAa,aAAa,mBAAmB,eAAe,UAAU,SAAS;AAErF,YAAI,CAAC,WAAW,OAAO;AACrB,iBAAO;AAAA,YACL;AAAA,YACA,SAAS;AAAA,YACT,QAAQ,WAAW;AAAA,YACnB,UAAU,WAAW;AAAA,UACvB;AAAA,QACF;AAGA,cAAM,iBAAiB,aAAa;AAAA,UAClC;AAAA,UACA;AAAA,UACA,WAAW,SAAS,WAAW;AAAA;AAAA,UAC/B;AAAA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAGA,cAAM,eAA4B;AAAA,UAChC,GAAG;AAAA,UACH,OAAO;AAAA,UACP;AAAA,UACA,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,QACvC;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ,CAAC;AAAA,UACT,UAAU,WAAW;AAAA,QACvB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,wBAAwB,MAAmB,WAAoC;AACpF,cAAM,gBAAgB,aAAa,kBAAkB,IAAI;AACzD,cAAM,kBAAkB,aAAa,sBAAsB,aAAa;AAGxE,YAAI,WAAW;AACb,iBAAO,gBAAgB,OAAO,cAAY;AACxC,kBAAM,aAAa,aAAa,mBAAmB,eAAe,UAAU,SAAS;AACrF,mBAAO,WAAW;AAAA,UACpB,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,YAAY,MAAmB,UAAiC;AACrE,cAAM,gBAAgB,aAAa,kBAAkB,IAAI;AACzD,cAAM,aAAa,aAAa,mBAAmB,eAAe,QAAQ;AAE1E,eAAO,WAAW,SAAS,WAAW,SAAS,WAAW;AAAA,MAC5D;AAAA,IACF;AA/E6B;AAAtB,IAAM,kBAAN;AAAA;AAAA;;;AC4FA,SAAS,kBAAkB,MAA+C;AAC/E,SAAO,aAAa,QAAQ,EAAE,cAAc,SAAS,EAAE,aAAa,SAAS,EAAE,WAAW;AAC5F;AAMO,SAAS,kBAAkB,MAA+C;AAC/E,SAAO,aAAa,QAAQ,cAAc,QAAQ,EAAE,WAAW;AACjE;AAUO,SAAS,WAAW,MAAqC;AAC9D,SAAO,kBAAkB,IAAI;AAC/B;AAMO,SAAS,WAAW,MAAqC;AAC9D,SAAO,kBAAkB,IAAI;AAC/B;AAxaA,IAslBa;AAtlBb;AAAA;AAAA;AAAA;AAolBA;AA1MgB;AAQA;AAYA;AAQA;AAgLT,IAAM,gBAAN,MAAM,cAAa;AAAA;AAAA;AAAA;AAAA,MA2DxB,OAAO,mBACL,YACA,UACA,WACuB;AACvB,cAAM,OAAO,KAAK,kBAAkB;AAAA,UAClC,OAAK,EAAE,eAAe,cAAc,EAAE,aAAa;AAAA,QACrD;AAEA,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,CAAC,2BAA2B,UAAU,OAAO,QAAQ,EAAE;AAAA,YAC/D,UAAU,CAAC;AAAA,YACX,qBAAqB,KAAK,sBAAsB,UAAU;AAAA,UAC5D;AAAA,QACF;AAEA,YAAI,KAAK,iBAAiB,cAAc,KAAK,eAAe;AAC1D,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,CAAC,6BAA6B,KAAK,aAAa,EAAE;AAAA,YAC1D,UAAU,CAAC;AAAA,YACX,qBAAqB,KAAK,sBAAsB,UAAU;AAAA,UAC5D;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ,CAAC;AAAA,UACT,UAAU,KAAK,sBAAsB,CAAC,IAAI,CAAC,gDAAgD;AAAA,UAC3F,qBAAqB,KAAK,sBAAsB,UAAU;AAAA,QAC5D;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,sBAAsB,YAA0C;AACrE,eAAO,KAAK,kBACT,OAAO,UAAQ,KAAK,eAAe,UAAU,EAC7C,IAAI,UAAQ,KAAK,QAAQ;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,oBACL,iBACA,gBACA,sBAA+B,OAC/B,mBACA,mBACA,UACe;AACf,eAAO;AAAA,UACL,kBAAiB,oBAAI,KAAK,GAAE,YAAY;AAAA,UACxC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,qBAAqB,eAAyC;AACnE,cAAM,UAAU,KAAK,qBAAqB,KAAK,OAAK,EAAE,kBAAkB,aAAa;AACrF,eAAO,UAAU,QAAQ,gBAAgB;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,kBAAkB,MAAqC;AAE5D,YAAI,KAAK,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAGA,eAAO,KAAK,qBAAqB,KAAK,MAAM;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,kBAAkB,OAA+C;AACtE,cAAM,mBAAsC;AAAA,UAC1C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,eAAO,iBAAiB,SAAS,KAAwB;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,eAAe,OAA0C;AAC9D,cAAM,iBAA+B,CAAC,YAAY,UAAU,aAAa,UAAU;AACnF,eAAO,eAAe,SAAS,KAAmB;AAAA,MACpD;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,sBAAsB,UAA2C;AACtE,cAAM,SAA4B,CAAC;AACnC,cAAM,WAA8B,CAAC;AAErC,YAAI,CAAC,SAAS,iBAAiB;AAC7B,iBAAO,KAAK;AAAA,YACV,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAEA,YAAI,CAAC,SAAS,iBAAiB;AAC7B,iBAAO,KAAK;AAAA,YACV,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAEA,YAAI,SAAS,uBAAuB,CAAC,SAAS,mBAAmB;AAC/D,mBAAS,KAAK;AAAA,YACZ,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,UACL,OAAO,OAAO,WAAW;AAAA,UACzB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AA7M0B;AACxB,kBADW,eACa,qBAA2C;AAAA;AAAA,MAEjE,EAAE,YAAY,YAAY,UAAU,yBAAyB,qBAAqB,KAAK;AAAA,MACvF,EAAE,YAAY,UAAU,UAAU,yBAAyB,qBAAqB,KAAK;AAAA,MACrF,EAAE,YAAY,yBAAyB,UAAU,UAAU,qBAAqB,MAAM;AAAA,MACtF,EAAE,YAAY,yBAAyB,UAAU,gBAAgB,qBAAqB,KAAK;AAAA;AAAA,MAG3F,EAAE,YAAY,gBAAgB,UAAU,UAAU,qBAAqB,MAAM;AAAA,MAC7E,EAAE,YAAY,gBAAgB,UAAU,wBAAwB,qBAAqB,KAAK;AAAA,MAC1F,EAAE,YAAY,gBAAgB,UAAU,yBAAyB,qBAAqB,MAAM;AAAA;AAAA,MAG5F,EAAE,YAAY,wBAAwB,UAAU,QAAQ,qBAAqB,KAAK;AAAA,MAClF,EAAE,YAAY,wBAAwB,UAAU,gBAAgB,qBAAqB,MAAM;AAAA;AAAA,MAG3F,EAAE,YAAY,QAAQ,UAAU,YAAY,qBAAqB,KAAK;AAAA,MACtE,EAAE,YAAY,YAAY,UAAU,YAAY,qBAAqB,KAAK;AAAA;AAAA,MAG1E,EAAE,YAAY,YAAY,UAAU,YAAY,qBAAqB,MAAM;AAAA,MAC3E,EAAE,YAAY,UAAU,UAAU,YAAY,qBAAqB,MAAM;AAAA,MACzE,EAAE,YAAY,yBAAyB,UAAU,YAAY,qBAAqB,MAAM;AAAA,MACxF,EAAE,YAAY,gBAAgB,UAAU,YAAY,qBAAqB,MAAM;AAAA,MAC/E,EAAE,YAAY,wBAAwB,UAAU,YAAY,qBAAqB,MAAM;AAAA,IACzF;AAEA,kBA7BW,eA6Ba,wBAA2C;AAAA,MACjE;AAAA,QACE,eAAe;AAAA,QACf,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,MACrB;AAAA,MACA;AAAA,QACE,eAAe;AAAA,QACf,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,MACrB;AAAA,MACA;AAAA,QACE,eAAe;AAAA,QACf,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,MACrB;AAAA,MACA;AAAA,QACE,eAAe;AAAA,QACf,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,MACrB;AAAA,IACF;AAtDK,IAAM,eAAN;AAAA;AAAA;;;ACxjBA,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,mCAAmC,EAC/C,OAAO,2BAA2B,oCAAoC,EACtE,OAAO,+BAA+B,sCAAsC,EAC5E,OAAO,6BAA6B,oBAAoB,EACxD,OAAO,qBAAqB,kCAAkC,EAC9D,OAAO,0BAA0B,qBAAqB,EACtD,OAAO,mBAAmB,2CAA2C,EACrE,OAAO,uBAAuB,mCAAmC,OAAO,EACxE,OAAO,qBAAqB,yDAAyD,SAAS,EAC9F,OAAO,wBAAwB,yBAAyB,MAAM,EAC9D,OAAO,wBAAwB,yBAAyB,EACxD,OAAO,mBAAmB,0BAA0B,EACpD,OAAO,iBAAiB,2BAA2B,EACnD,OAAO,kBAAkB,0BAA0B,EACnD,OAAO,YAAY,wDAAwD,EAC3E,OAAO,oBAAoB,4CAA4C,EACvE,OAAO,OAAO,YAAyB;AACtC,QAAI;AACF,YAAM,UAAU,OAAO;AAAA,IACzB,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACnF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,UAAU,SAAqC;AAE5D,QAAM,iBAAiB,IAAI,sBAAsB;AAGjD,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,iBAAiB,MAAM,eAAe,kBAAkB,QAAQ,OAAO;AAG7E,QAAM,gBAAgB,eAAe;AACrC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,QAAQ,eAAe;AAC7B,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,UAAyB,CAAC;AAEhC,MAAI,QAAQ,QAAQ;AAClB,YAAQ,SAAS;AAAA,EACnB,WAAW,QAAQ,QAAQ;AACzB,UAAM,WAAW,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC9D,YAAQ,SAAS,SAAS,WAAW,IAAI,SAAS,CAAC,IAAI;AAAA,EACzD;AAEA,MAAI,QAAQ,UAAU;AACpB,UAAM,aAAa,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAClE,YAAQ,WAAW,WAAW,WAAW,IAAI,WAAW,CAAC,IAAI;AAAA,EAC/D;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,WAAW,QAAQ;AAAA,EAC7B;AAEA,MAAI,QAAQ,MAAM;AAChB,UAAM,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACxD,YAAQ,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI;AAAA,EAC/C;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,iBAAiB,QAAQ;AAAA,EACnC;AAGA,QAAM,eAAe,oBAAoB,OAAO,OAAO;AAGvD,QAAM,QAAQ,aAAa,MAAM,OAAO,UAAU;AAGlD,MAAI,gBAAgB;AACpB,MAAI,QAAQ,WAAW;AACrB,oBAAgB,MAAM,OAAO,CAAC,SAAS,KAAK,cAAc,QAAQ,SAAS;AAAA,EAC7E;AAGA,YAAU,eAAe,QAAQ,UAAU,WAAW,QAAQ,aAAa,MAAM;AAGjF,MAAI,QAAQ,OAAO;AACjB,UAAM,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG,EAAE;AACnD,oBAAgB,cAAc,MAAM,GAAG,KAAK;AAAA,EAC9C;AAGA,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACH,cAAQ,IAAI,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AAClD;AAAA,IACF,KAAK,QAAQ;AACX,YAAMI,QAAO,MAAM,OAAO,MAAM;AAChC,cAAQ,IAAIA,MAAK,UAAU,aAAa,CAAC;AACzC;AAAA,IACF;AAAA,IACA;AACE,YAAM,kBAAkB,eAAe,SAAS,qBAAqB,cAAc;AAAA,EACvF;AACF;AAEA,SAAS,UAAU,OAAc,QAAgB,WAAyB;AACxE,QAAM,KAAK,CAAC,GAAG,MAAM;AACnB,QAAI,MAAW;AAEf,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,IAAI,KAAK,EAAE,YAAY;AAC9B,eAAO,IAAI,KAAK,EAAE,YAAY;AAC9B;AAAA,MACF,KAAK;AACH,eAAO,IAAI,KAAK,EAAE,YAAY;AAC9B,eAAO,IAAI,KAAK,EAAE,YAAY;AAC9B;AAAA,MACF,KAAK;AACH,eAAO,EAAE,MAAM,YAAY;AAC3B,eAAO,EAAE,MAAM,YAAY;AAC3B;AAAA,MACF,KAAK,YAAY;AACf,cAAM,gBAAgB,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAChE,eAAO,cAAc,EAAE,QAAsC,KAAK;AAClE,eAAO,cAAc,EAAE,QAAsC,KAAK;AAClE;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,cAAc,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,EAAE;AACxE,eAAO,YAAY,EAAE,MAAkC,KAAK;AAC5D,eAAO,YAAY,EAAE,MAAkC,KAAK;AAC5D;AAAA,MACF;AAAA,MACA;AACE,eAAO,EAAE;AACT,eAAO,EAAE;AAAA,IACb;AAEA,QAAI,cAAc,OAAO;AACvB,aAAO,OAAO,OAAO,KAAK,OAAO,OAAO,IAAI;AAAA,IAC9C,OAAO;AACL,aAAO,OAAO,OAAO,KAAK,OAAO,OAAO,IAAI;AAAA,IAC9C;AAAA,EACF,CAAC;AACH;AAEA,eAAe,kBACb,OACA,SACA,qBACA,gBACe;AACf,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,UAAU,KAAK,uCAAuC,CAAC;AACnE;AAAA,EACF;AAGA,MAAI,eAAe,QAAQ,SAAS,WAAW,eAAe,QAAQ,gBAAgB;AACpF,YAAQ,IAAI,UAAU,KAAK,sBAAe,eAAe,QAAQ,cAAc,EAAE,CAAC;AAAA,EACpF;AAEA,UAAQ,IAAI,UAAU,QAAQ,SAAS,MAAM,MAAM,WAAW,CAAC;AAC/D,UAAQ,IAAI,EAAE;AAGd,QAAM,UAAU,CAAC,MAAM,SAAS,UAAU,YAAY,UAAU;AAChE,MAAI,QAAQ,YAAa,SAAQ,KAAK,SAAS;AAC/C,MAAI,QAAQ,aAAc,SAAQ,KAAK,UAAU;AACjD,MAAI,QAAQ,WAAY,SAAQ,KAAK,QAAQ;AAC7C,UAAQ,KAAK,SAAS;AAGtB,QAAM,YAAY,QAAQ,IAAI,MAAM,CAAC;AAGrC,QAAM,OAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM;AAAA,MACV,KAAK;AAAA,MACLC,cAAa,KAAK,OAAO,EAAE;AAAA,MAC3B,iBAAiB,KAAK,MAAM;AAAA,MAC5B,mBAAmB,KAAK,QAAQ;AAAA,MAChC,KAAK;AAAA,IACP;AAEA,QAAI,QAAQ,aAAa;AACvB,UAAI,KAAK,KAAK,cAAc,GAAG;AAAA,IACjC;AAEA,QAAI,QAAQ,cAAc;AACxB,YAAM,WAAW,KAAK,yBAAyB;AAC/C,UAAI,KAAK,GAAG,QAAQ,GAAG;AAAA,IACzB;AAEA,QAAI,QAAQ,YAAY;AACtB,YAAM,YAAY,oBAAoB,iBAAiB,KAAK,OAAO;AACnE,YAAM,aAAa,YAAY,UAAU,OAAO,SAAS;AACzD,UAAI,KAAK,WAAW,SAAS,CAAC;AAAA,IAChC;AAEA,QAAI,KAAK,WAAW,KAAK,YAAY,CAAC;AACtC,SAAK,KAAK,GAAG;AAAA,EACf;AAGA,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,cAAU,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,MAAM,CAAC;AAAA,EAChF;AAGA,EAAAC,eAAc,SAAS,WAAW,IAAI;AACtC,EAAAC,gBAAe,SAAS;AAExB,aAAW,OAAO,MAAM;AACtB,IAAAD,eAAc,KAAK,WAAW,KAAK;AAAA,EACrC;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,KAAK,UAAU,MAAM,MAAM,UAAU,CAAC;AAC9D;AAEA,SAASA,eAAc,KAAe,QAAkB,UAAyB;AAC/E,QAAM,YAAY,IAAI,IAAI,CAAC,MAAM,MAAM,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC;AAC7D,QAAM,UAAU,UAAU,KAAK,KAAK;AAEpC,MAAI,UAAU;AACZ,YAAQ,IAAI,UAAU,KAAK,OAAO,CAAC;AAAA,EACrC,OAAO;AACL,YAAQ,IAAI,OAAO;AAAA,EACrB;AACF;AAEA,SAASC,gBAAe,QAAwB;AAC9C,QAAM,YAAY,OAAO,IAAI,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,KAAK;AACrE,UAAQ,IAAI,SAAS;AACvB;AAEA,SAASF,cAAa,MAAc,WAA2B;AAC7D,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,GAAG,KAAK,UAAU,GAAG,YAAY,CAAC,CAAC;AAC5C;AAEA,SAAS,iBAAiB,QAAwB;AAChD,QAAM,eAAyD;AAAA,IAC7D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACZ;AAEA,QAAM,UAAU,aAAa,MAAM,MAAM,CAAC,SAAS;AACnD,SAAO,QAAQ,OAAO,YAAY,CAAC;AACrC;AAEA,SAAS,mBAAmB,UAA0B;AACpD,QAAM,iBAA2D;AAAA,IAC/D,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACN,QAAQ,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACR,KAAK,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACP;AAEA,QAAM,UAAU,eAAe,QAAQ,MAAM,CAAC,SAAS;AACvD,SAAO,QAAQ,SAAS,YAAY,CAAC;AACvC;AAEA,SAAS,WAAW,YAA4B;AAC9C,QAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAO,KAAK,mBAAmB;AACjC;AAzTA,IAKAG;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AAExB;AACA;AACA;AACA;AAoBgB;AAoCD;AAgFN;AA0CM;AA6EN,WAAAF,gBAAA;AAWA,WAAAC,iBAAA;AAKA,WAAAF,eAAA;AAKA;AAYA;AAYA;AAAA;AAAA;;;ACnSF,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,yCAAyC,EACrD,SAAS,aAAa,iBAAiB,EACvC,OAAO,uBAAuB,sCAAsC,UAAU,EAC9E,OAAO,gCAAgC,qBAAqB,EAC5D,OAAO,gBAAgB,wBAAwB,EAC/C,OAAO,kBAAkB,+BAA+B,EACxD,OAAO,kBAAkB,qCAAqC,EAC9D,OAAO,oBAAoB,0CAA0C,EACrE,OAAO,OAAO,QAAgB,YAAyB;AACtD,QAAI;AACF,YAAM,SAAS,QAAQ,OAAO;AAAA,IAChC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAClF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,SAAS,QAAgB,SAAqC;AAE3E,QAAM,iBAAiB,IAAI,sBAAsB;AAGjD,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,iBAAiB,MAAM,eAAe,kBAAkB,QAAQ,OAAO;AAG7E,QAAM,gBAAgB,eAAe;AACrC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,QAAQ,eAAe;AAC7B,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,YAAY,oBAAoB,iBAAiB,MAAM;AAC7D,MAAI,CAAC,WAAW;AAEd,UAAM,aAAa,oBAAoB,cAAc;AACrD,QAAI,eAAe,mBAAmB,MAAM;AAAA;AAC5C,oBAAgB;AAAA,eAAkB,MAAM,QAAQ;AAChD,oBAAgB;AAAA,QAAW,WAAW,KAAK;AAE3C,QAAI,WAAW,QAAQ,GAAG;AACxB,sBAAgB;AAAA;AAAA;AAChB,sBAAgB;AAAA;AAChB,sBAAgB;AAAA;AAAA,IAClB,OAAO;AACL,sBAAgB;AAAA;AAAA;AAChB,sBAAgB;AAAA;AAAA,IAClB;AAEA,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAEA,QAAM,EAAE,MAAM,QAAQ,MAAM,IAAI;AAGhC,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK,QAAQ;AACX,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,GAAI,QAAQ,cAAc,EAAE,OAAO;AAAA,QACnC,GAAI,QAAQ,aAAa,EAAE,MAAM;AAAA,MACnC;AACA,cAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC/C;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,YAAMI,QAAO,MAAM,OAAO,MAAM;AAChC,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,GAAI,QAAQ,cAAc,EAAE,OAAO;AAAA,QACnC,GAAI,QAAQ,aAAa,EAAE,MAAM;AAAA,MACnC;AACA,cAAQ,IAAIA,MAAK,UAAU,UAAU,CAAC;AACtC;AAAA,IACF;AAAA,IAEA;AACE,YAAM,oBAAoB,MAAM,QAAQ,OAAO,SAAS,mBAAmB;AAAA,EAC/E;AACF;AAEA,eAAe,oBACb,MACA,QACA,OACA,SACA,qBACe;AAEf,UAAQ,IAAI,UAAU,QAAQ;AAAA,YAAe,KAAK,KAAK,MAAM,CAAC;AAC9D,UAAQ,IAAI,UAAU,KAAK,OAAO,KAAK,OAAO,EAAE,CAAC;AACjD,UAAQ,IAAI,EAAE;AAGd,UAAQ,IAAI,UAAU,QAAQ,oBAAoB,CAAC;AACnD,UAAQ,IAAI,YAAY,KAAK,KAAK,EAAE;AACpC,UAAQ,IAAI,aAAaC,kBAAiB,KAAK,MAAM,CAAC,EAAE;AACxD,UAAQ,IAAI,eAAeC,oBAAmB,KAAK,QAAQ,CAAC,EAAE;AAC9D,UAAQ,IAAI,eAAe,KAAK,QAAQ,EAAE;AAE1C,MAAI,KAAK,WAAW;AAClB,YAAQ,IAAI,gBAAgB,KAAK,SAAS,EAAE;AAAA,EAC9C;AAEA,MAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AACrC,YAAQ,IAAI,WAAW,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,EAC/C;AAEA,MAAI,KAAK,0BAA0B,QAAW;AAC5C,YAAQ,IAAI,eAAe,KAAK,qBAAqB,GAAG;AAAA,EAC1D;AAEA,UAAQ,IAAI,EAAE;AAGd,UAAQ,IAAI,UAAU,QAAQ,uBAAuB,CAAC;AACtD,UAAQ,IAAI,cAAc,eAAe,KAAK,YAAY,CAAC,EAAE;AAC7D,UAAQ,IAAI,cAAc,eAAe,KAAK,YAAY,CAAC,EAAE;AAC7D,UAAQ,IAAI,uBAAuB,KAAK,oBAAoB,CAAC,EAAE;AAC/D,UAAQ,IAAI,oBAAoB,KAAK,iBAAiB,CAAC,EAAE;AAEzD,MAAI,KAAK,mBAAmB,GAAG;AAC7B,UAAM,aAAa,KAAK,gBAAgB,KAAK;AAC7C,YAAQ,IAAI,wBAAwB,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,EACrE;AAEA,UAAQ,IAAI,kBAAkB,KAAK,eAAe,OAAO,EAAE;AAC3D,UAAQ,IAAI,EAAE;AAGd,MAAI,KAAK,aAAa;AACpB,YAAQ,IAAI,UAAU,QAAQ,cAAc,CAAC;AAC7C,YAAQ,IAAI,KAAK,KAAK,WAAW,EAAE;AACnC,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,eAAe,KAAK,SAAS;AACvC,YAAQ,IAAI,UAAU,QAAQ,UAAU,CAAC;AACzC,YAAQ,IAAI,KAAK,OAAO;AACxB,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,KAAK,cAAc,KAAK,WAAW,SAAS,GAAG;AACjD,YAAQ,IAAI,UAAU,QAAQ,aAAa,CAAC;AAC5C,eAAW,WAAW,KAAK,YAAY;AACrC,cAAQ,IAAI,YAAO,OAAO,EAAE;AAAA,IAC9B;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;AACrD,YAAQ,IAAI,UAAU,QAAQ,eAAe,CAAC;AAC9C,eAAW,OAAO,KAAK,cAAc;AACnC,cAAQ,IAAI,YAAO,GAAG,EAAE;AAAA,IAC1B;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,cAAc,OAAO,SAAS,GAAG;AAC3C,YAAQ,IAAI,UAAU,QAAQ,mBAAmB,OAAO,MAAM,IAAI,CAAC;AACnE,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,IAAI,UAAU,MAAM,mBAAmB,CAAC;AAAA,IAClD,OAAO;AACL,iBAAW,SAAS,QAAQ;AAC1B,cAAM,aAAa,cAAc,MAAM,MAAM;AAC7C,cAAM,gBAAgBA,oBAAmB,MAAM,QAAQ;AACvD,gBAAQ,IAAI,KAAK,UAAU,IAAI,MAAM,QAAQ,KAAK,MAAM,KAAK,KAAK,aAAa,GAAG;AAAA,MACpF;AAAA,IACF;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,aAAa,MAAM,SAAS,GAAG;AACzC,YAAQ,IAAI,UAAU,QAAQ,sBAAsB,MAAM,MAAM,IAAI,CAAC;AACrE,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,UAAU,MAAM,kBAAkB,CAAC;AAAA,IACjD,OAAO;AAEL,YAAM,eAAe,MAAM;AAAA,QACzB,CAAC,KAAK,SAAS;AACb,cAAI,CAAC,IAAI,KAAK,QAAQ,EAAG,KAAI,KAAK,QAAQ,IAAI,CAAC;AAC/C,cAAI,KAAK,QAAQ,EAAE,KAAK,IAAI;AAC5B,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AAEA,iBAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,YAAY,GAAG;AAChE,cAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO;AACvD,gBAAQ,IAAI,KAAK,QAAQ,MAAM,QAAQ,OAAO,GAAG;AACjD,mBAAW,QAAQ,YAAY;AAC7B,gBAAM,aAAa,cAAc,KAAK,MAAM;AAC5C,kBAAQ,IAAI,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,aAAa;AACvB,UAAM,UAAU,oBAAoB,gBAAgB,KAAK,OAAO;AAEhE,QAAI,QAAQ,aAAa,SAAS,GAAG;AACnC,cAAQ,IAAI,UAAU,QAAQ,eAAe,CAAC;AAC9C,iBAAW,OAAO,QAAQ,cAAc;AACtC,gBAAQ,IAAI,YAAOC,WAAU,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE;AAAA,MACnD;AACA,cAAQ,IAAI,EAAE;AAAA,IAChB;AAEA,QAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,cAAQ,IAAI,UAAU,QAAQ,aAAa,CAAC;AAC5C,iBAAW,OAAO,QAAQ,YAAY;AACpC,gBAAQ,IAAI,YAAOA,WAAU,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE;AAAA,MACnD;AACA,cAAQ,IAAI,EAAE;AAAA,IAChB;AAAA,EACF;AAGA,UAAQ,IAAI,UAAU,QAAQ,mBAAmB,CAAC;AAClD,UAAQ,IAAI,WAAW,KAAK,SAAS,EAAE;AACvC,UAAQ,IAAI,EAAE;AAGd,QAAM,kBAAkB,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AACvE,QAAM,iBAAiB,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AAErE,UAAQ,IAAI,UAAU,QAAQ,UAAU,CAAC;AACzC,UAAQ,IAAI,aAAa,eAAe,IAAI,OAAO,MAAM,YAAY;AACrE,UAAQ,IAAI,YAAY,cAAc,IAAI,MAAM,MAAM,YAAY;AAElE,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,uBAAwB,kBAAkB,OAAO,SAAU,KAAK,QAAQ,CAAC;AAC/E,YAAQ,IAAI,uBAAuB,mBAAmB,GAAG;AAAA,EAC3D;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,sBAAuB,iBAAiB,MAAM,SAAU,KAAK,QAAQ,CAAC;AAC5E,YAAQ,IAAI,sBAAsB,kBAAkB,GAAG;AAAA,EACzD;AACF;AAEA,SAASF,kBAAiB,QAAwB;AAChD,QAAM,eAAyD;AAAA,IAC7D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACZ;AAEA,QAAM,UAAU,aAAa,MAAM,MAAM,CAAC,SAAS;AACnD,SAAO,QAAQ,OAAO,YAAY,CAAC;AACrC;AAEA,SAASC,oBAAmB,UAA0B;AACpD,QAAM,iBAA2D;AAAA,IAC/D,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACN,QAAQ,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACR,KAAK,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACP;AAEA,QAAM,UAAU,eAAe,QAAQ,MAAM,CAAC,SAAS;AACvD,SAAO,QAAQ,SAAS,YAAY,CAAC;AACvC;AAEA,SAAS,cAAc,QAAwB;AAC7C,QAAM,QAAgC;AAAA,IACpC,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAEA,SAAO,MAAM,MAAM,KAAK;AAC1B;AAEA,SAAS,eAAe,YAA4B;AAClD,QAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAO,KAAK,eAAe;AAC7B;AAEA,SAASC,WAAU,MAAmB;AACpC,MAAI,KAAK,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AACjE,MAAI,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AAChD,MAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,SAAO;AACT;AAzUA,IAKAC;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB;AACA;AACA;AAWgB;AA4BD;AAqEA;AAwKN,WAAAH,mBAAA;AAYA,WAAAC,qBAAA;AAYA;AAWA;AAKA,WAAAC,YAAA;AAAA;AAAA;;;ACtSF,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,yBAAyB,EACrC,SAAS,aAAa,mBAAmB,EACzC,OAAO,sBAAsB,cAAc,EAC3C,OAAO,4BAA4B,oBAAoB,EACvD,OAAO,yBAAyB,oDAAoD,EACpF,OAAO,0BAA0B,4CAA4C,EAC7E,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,qBAAqB,4BAA4B,EACxD,OAAO,wBAAwB,+BAA+B,EAC9D,OAAO,0BAA0B,eAAe,EAChD,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,mCAAmC,yBAAyB,EACnE,OAAO,4BAA4B,sBAAsB,EACzD,OAAO,4BAA4B,wCAAwC,EAC3E,OAAO,+BAA+B,2CAA2C,EACjF,OAAO,2BAA2B,sCAAsC,EACxE,OAAO,aAAa,6CAA6C,EACjE,OAAO,OAAO,QAAgB,YAA2B;AACxD,QAAI;AACF,YAAM,WAAW,QAAQ,OAAO;AAAA,IAClC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACpF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,WAAW,QAAgB,SAAuC;AAC/E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,QAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAM,YAAY,oBAAoB,iBAAiB,MAAM;AAC7D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,EAC7C;AAEA,QAAM,OAAO,UAAU;AACvB,QAAM,WAAW,KAAK;AAGtB,QAAM,UAAoC,CAAC;AAE3C,MAAI,QAAQ,OAAO;AACjB,YAAQ,QAAQ,QAAQ;AAAA,EAC1B;AAEA,MAAI,QAAQ,aAAa;AACvB,YAAQ,cAAc,QAAQ;AAAA,EAChC;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,SAAS,QAAQ;AAAA,EAC3B;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,WAAW,QAAQ;AAAA,EAC7B;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,WAAW,QAAQ;AAAA,EAC7B;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,YAAY,QAAQ;AAAA,EAC9B;AAEA,MAAI,QAAQ,gBAAgB;AAC1B,YAAQ,YAAY;AAAA,EACtB;AAEA,MAAI,QAAQ,oBAAoB,QAAW;AACzC,YAAQ,mBAAmB,SAAS,QAAQ,gBAAgB,SAAS,GAAG,EAAE;AAAA,EAC5E;AAEA,MAAI,QAAQ,iBAAiB,QAAW;AACtC,YAAQ,gBAAgB,SAAS,QAAQ,aAAa,SAAS,GAAG,EAAE;AAAA,EACtE;AAEA,MAAI,QAAQ,aAAa,QAAW;AAClC,UAAM,WAAW,SAAS,QAAQ,SAAS,SAAS,GAAG,EAAE;AACzD,QAAI,WAAW,KAAK,WAAW,KAAK;AAClC,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,YAAQ,wBAAwB;AAAA,EAClC;AAGA,MAAI,QAAQ,WAAW,QAAQ,YAAY;AACzC,UAAM,cAAc,KAAK,QAAQ,CAAC;AAClC,QAAI,UAAU,CAAC,GAAG,WAAW;AAE7B,QAAI,QAAQ,SAAS;AACnB,YAAM,YAAY,QAAQ,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AACpE,iBAAW,OAAO,WAAW;AAC3B,YAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,kBAAQ,KAAK,GAAG;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY;AACtB,YAAM,eAAe,QAAQ,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC1E,gBAAU,QAAQ,OAAO,CAAC,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;AAAA,IAC/D;AAEA,YAAQ,OAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,EAChD;AAGA,MAAI,QAAQ,mBAAmB,QAAQ,oBAAoB;AACzD,UAAM,cAAc,KAAK,gBAAgB,CAAC;AAC1C,QAAI,UAAU,CAAC,GAAG,WAAW;AAE7B,QAAI,QAAQ,iBAAiB;AAC3B,YAAM,YAAY,QAAQ,gBAAgB,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC5E,iBAAW,OAAO,WAAW;AAC3B,YAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,kBAAQ,KAAK,GAAG;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,oBAAoB;AAC9B,YAAM,eAAe,QAAQ,mBAAmB,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAClF,gBAAU,QAAQ,OAAO,CAAC,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;AAAA,IAC/D;AAEA,YAAQ,eAAe,QAAQ,SAAS,IAAI,UAAU;AAAA,EACxD;AAGA,MAAI,QAAQ,UAAU,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACvD,YAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,SAAS,eAAe,EAAE,wBAAwB,CAAC;AACzF,YAAQ,IAAI,UAAU,MAAM,YAAY,MAAM,EAAE,CAAC;AACjD,YAAQ,IAAI,UAAU,MAAM,SAAS,QAAQ,EAAE,CAAC;AAEhD,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,cAAQ,IAAI,UAAU,QAAQ,sBAAsB,CAAC;AACrD;AAAA,IACF;AAEA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,YAAM,eAAe,KAAK,GAAwB;AAClD,cAAQ,IAAI,UAAU,MAAM,GAAG,GAAG,KAAK,YAAY,WAAM,KAAK,EAAE,CAAC;AAAA,IACnE;AAEA,QAAI,QAAQ,QAAQ;AAClB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc,OAAO,WAAW,UAAU,OAAO;AAGvD,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,4BAA4B,CAAC;AAC3D,UAAQ,IAAI,UAAU,KAAK,YAAY,MAAM,EAAE,CAAC;AAChD,UAAQ,IAAI,UAAU,KAAK,SAAS,QAAQ,EAAE,CAAC;AAG/C,QAAM,gBAAgB,OAAO,KAAK,OAAO;AACzC,MAAI,cAAc,SAAS,GAAG;AAC5B,YAAQ,IAAI,UAAU,KAAK,mBAAmB,cAAc,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EAC3E;AAGA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,QAAQ,iBAAiB,CAAC;AAChD,UAAQ,IAAI,YAAY,YAAY,KAAK,EAAE;AAC3C,UAAQ,IAAI,aAAaE,kBAAiB,YAAY,MAAM,CAAC,EAAE;AAC/D,UAAQ,IAAI,eAAeC,oBAAmB,YAAY,QAAQ,CAAC,EAAE;AACrE,UAAQ,IAAI,eAAe,YAAY,QAAQ,EAAE;AAEjD,MAAI,YAAY,WAAW;AACzB,YAAQ,IAAI,gBAAgB,YAAY,SAAS,EAAE;AAAA,EACrD;AAEA,MAAI,YAAY,QAAQ,YAAY,KAAK,SAAS,GAAG;AACnD,YAAQ,IAAI,WAAW,YAAY,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,EACtD;AAEA,MAAI,YAAY,0BAA0B,QAAW;AACnD,YAAQ,IAAI,eAAe,YAAY,qBAAqB,GAAG;AAAA,EACjE;AAEA,MAAI,YAAY,gBAAgB,YAAY,aAAa,SAAS,GAAG;AACnE,YAAQ,IAAI,mBAAmB,YAAY,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,EACtE;AAEA,UAAQ,IAAI,uBAAuB,YAAY,oBAAoB,CAAC,EAAE;AACtE,UAAQ,IAAI,oBAAoB,YAAY,iBAAiB,CAAC,EAAE;AAClE;AAEA,SAASD,kBAAiB,QAAwB;AAChD,QAAM,eAAyD;AAAA,IAC7D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACZ;AAEA,QAAM,UAAU,aAAa,MAAM,MAAM,CAAC,SAAS;AACnD,SAAO,QAAQ,OAAO,YAAY,CAAC;AACrC;AAEA,SAASC,oBAAmB,UAA0B;AACpD,QAAM,iBAA2D;AAAA,IAC/D,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACN,QAAQ,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACR,KAAK,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACP;AAEA,QAAM,UAAU,eAAe,QAAQ,MAAM,CAAC,SAAS;AACvD,SAAO,QAAQ,SAAS,YAAY,CAAC;AACvC;AA1QA,IAKAC;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AAExB;AACA;AACA;AACA;AAoBgB;AAqCD;AAiLN,WAAAF,mBAAA;AAYA,WAAAC,qBAAA;AAAA;AAAA;;;ACnPF,SAAS,oBAA6B;AAC3C,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,+CAA+C,EAC3D,WAAW,wBAAwB,CAAC,EACpC,WAAW,sBAAsB,CAAC,EAClC,WAAW,sBAAsB,CAAC,EAClC,WAAW,wBAAwB,CAAC,EACpC,WAAW,wBAAwB,CAAC,EACpC,WAAW,0BAA0B,CAAC;AAEzC,SAAO;AACT;AA1BA,IAKAE;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AAEgB;AAAA;AAAA;;;ACbhB,IAAAC,iBACA,gBACAC,mBACA,aAGM,gBAwBOC,iBAAAC;AA9Bb;AAAA;AAAA;AAAA;AAAA,IAAAH,kBAAmE;AACnE,qBAAwB;AACxB,IAAAC,oBAA8B;AAC9B,kBAAiB;AAGjB,IAAM,iBAAkC;AAAA,MACtC,aAAa;AAAA,MACb,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,eAAe;AAAA;AAAA,MACf,sBAAsB;AAAA;AAAA,MACtB,cAAc,CAAC;AAAA,MACf,cAAc;AAAA,QACZ,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,gBAAgB;AAAA,QACd,kBAAkB;AAAA,QAClB,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,IACF;AAEO,IAAMC,kBAAN,MAAMA,gBAAc;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MAER,YAAY,YAAqB;AAC/B,aAAK,aAAa,cAAc,KAAK,eAAe;AACpD,aAAK,uBAAmB,4BAAK,wBAAQ,GAAG,cAAc,aAAa;AACnE,aAAK,SAAS,KAAK,WAAW;AAAA,MAChC;AAAA,MAEQ,iBAAyB;AAC/B,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,mBAAW,QAAQ,eAAe;AAChC,gBAAM,eAAW,wBAAK,QAAQ,IAAI,GAAG,IAAI;AACzC,kBAAI,4BAAW,QAAQ,GAAG;AACxB,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,mBAAO,wBAAK,QAAQ,IAAI,GAAG,mBAAmB;AAAA,MAChD;AAAA,MAEQ,aAA8B;AACpC,YAAI,SAAS,EAAE,GAAG,eAAe;AAGjC,iBAAS,EAAE,GAAG,QAAQ,GAAG,KAAK,eAAe,KAAK,gBAAgB,EAAE;AAGpE,iBAAS,EAAE,GAAG,QAAQ,GAAG,KAAK,eAAe,KAAK,UAAU,EAAE;AAG9D,iBAAS,EAAE,GAAG,QAAQ,GAAG,KAAK,sBAAsB,EAAE;AAEtD,eAAO;AAAA,MACT;AAAA,MAEQ,eAAeE,QAAwC;AAC7D,YAAI;AACF,cAAI,KAAC,4BAAWA,MAAI,GAAG;AACrB,mBAAO,CAAC;AAAA,UACV;AAEA,gBAAM,kBAAc,8BAAaA,QAAM,OAAO;AAC9C,gBAAM,UAAM,2BAAQA,MAAI;AAExB,cAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,mBAAO,YAAAC,QAAK,MAAM,WAAW;AAAA,UAC/B,OAAO;AACL,mBAAO,KAAK,MAAM,WAAW;AAAA,UAC/B;AAAA,QACF,SAAS,QAAQ;AACf,kBAAQ,KAAK,uCAAuCD,MAAI,YAAY;AACpE,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,MAEQ,wBAAkD;AACxD,cAAM,YAAsC,CAAC;AAE7C,YAAI,QAAQ,IAAI,wBAAwB;AACtC,oBAAU,cAAc,QAAQ,IAAI;AAAA,QACtC;AAEA,YAAI,QAAQ,IAAI,yBAAyB;AACvC,oBAAU,eAAe,QAAQ,IAAI;AAAA,QACvC;AAEA,YAAI,QAAQ,IAAI,4BAA4B;AAC1C,oBAAU,kBAAkB,QAAQ,IAAI;AAAA,QAC1C;AAEA,YAAI,QAAQ,IAAI,4BAA4B;AAC1C,oBAAU,kBAAkB,QAAQ,IAAI;AAAA,QAC1C;AAEA,YAAI,QAAQ,IAAI,yBAAyB;AACvC,oBAAU,eAAe,QAAQ,IAAI;AAAA,QACvC;AAEA,YAAI,QAAQ,IAAI,wBAAwB;AACtC,oBAAU,cAAc,QAAQ,IAAI,2BAA2B;AAAA,QACjE;AAEA,YAAI,QAAQ,IAAI,uBAAuB;AACrC,oBAAU,aAAa,QAAQ,IAAI,0BAA0B;AAAA,QAC/D;AAGA,YAAI,QAAQ,IAAI,sBAAsB;AACpC,oBAAU,gBAAgB,QAAQ,IAAI;AAAA,QACxC;AAEA,YAAI,QAAQ,IAAI,uBAAuB;AACrC,oBAAU,gBAAgB,QAAQ,IAAI;AAAA,QACxC;AAGA,YAAI,QAAQ,IAAI,0BAA0B;AACxC,gBAAM,OAAO,QAAQ,IAAI;AACzB,cAAI,SAAS,YAAY,SAAS,SAAS;AACzC,YAAC,UAAkB,eAAe;AAAA,UACpC;AAAA,QACF;AAEA,YAAI,QAAQ,IAAI,kCAAkC;AAChD,oBAAU,uBAAuB,QAAQ,IAAI,qCAAqC;AAAA,QACpF;AAEA,eAAO;AAAA,MACT;AAAA,MAEO,YAA6B;AAClC,eAAO,EAAE,GAAG,KAAK,OAAO;AAAA,MAC1B;AAAA,MAEO,aAAa,SAAyC;AAC3D,aAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,QAAQ;AAC3C,aAAK,WAAW;AAAA,MAClB;AAAA,MAEO,WAAW,SAAS,OAAa;AACtC,cAAM,aAAa,SAAS,KAAK,mBAAmB,KAAK;AAEzD,YAAI;AAEF,gBAAM,UAAM,wBAAK,YAAY,IAAI;AACjC,cAAI,KAAC,4BAAW,GAAG,GAAG;AACpB,2CAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,UACpC;AAEA,gBAAM,UAAM,2BAAQ,UAAU;AAC9B,cAAI;AAEJ,cAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,sBAAU,YAAAC,QAAK,UAAU,KAAK,MAAM;AAAA,UACtC,OAAO;AACL,sBAAU,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC;AAAA,UAC/C;AAEA,6CAAc,YAAY,OAAO;AAAA,QACnC,SAAS,OAAO;AACd,gBAAM,IAAI,MAAM,4BAA4B,UAAU,KAAK,KAAK,EAAE;AAAA,QACpE;AAAA,MACF;AAAA,MAEO,cAAoB;AACzB,aAAK,SAAS,EAAE,GAAG,eAAe;AAClC,aAAK,WAAW;AAAA,MAClB;AAAA,MAEO,gBAAwB;AAC7B,eAAO,KAAK;AAAA,MACd;AAAA,MAEO,sBAA8B;AACnC,eAAO,KAAK;AAAA,MACd;AAAA,MAEO,iBAAuD;AAC5D,cAAM,SAAmB,CAAC;AAE1B,YACE,KAAK,OAAO,gBACZ,CAAC,CAAC,QAAQ,QAAQ,MAAM,OAAO,OAAO,EAAE,SAAS,KAAK,OAAO,YAAY,GACzE;AACA,iBAAO,KAAK,0BAA0B,KAAK,OAAO,YAAY,EAAE;AAAA,QAClE;AAEA,YACE,KAAK,OAAO,mBACZ,CAAC,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,SAAS,KAAK,OAAO,eAAe,GAC3E;AACA,iBAAO,KAAK,6BAA6B,KAAK,OAAO,eAAe,EAAE;AAAA,QACxE;AAEA,YAAI,KAAK,OAAO,cAAc;AAC5B,eAAK,OAAO,aAAa,QAAQ,CAAC,OAAO,UAAU;AACjD,gBAAI,CAAC,MAAM,MAAM;AACf,qBAAO,KAAK,yBAAyB,KAAK,oBAAoB;AAAA,YAChE;AACA,gBAAI,CAAC,CAAC,UAAU,UAAU,WAAW,MAAM,EAAE,SAAS,MAAM,IAAI,GAAG;AACjE,qBAAO,KAAK,iBAAiB,MAAM,IAAI,uBAAuB,MAAM,IAAI,EAAE;AAAA,YAC5E;AAAA,UACF,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,UACL,OAAO,OAAO,WAAW;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,MAEO,wBAAwB,SAA0B,QAAgB;AACvE,cAAM,WAAW,WAAW,SAAS,sBAAsB;AAC3D,cAAMD,aAAO,wBAAK,QAAQ,IAAI,GAAG,QAAQ;AAEzC,aAAK,aAAaA;AAClB,aAAK,SAAS,EAAE,GAAG,eAAe;AAClC,aAAK,WAAW;AAEhB,eAAOA;AAAA,MACT;AAAA,IACF;AApN2B,WAAAF,iBAAA;AAApB,IAAMC,iBAAND;AAAA;AAAA;;;ACJA,SAAS,iBAAiB,OAA2B,WAA2B;AACrF,MAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACvC,UAAM,IAAI;AAAA,MACR,GAAG,SAAS;AAAA,MACZ,0BAA0B,UAAU,YAAY,CAAC;AAAA,MACjD;AAAA,MACA;AAAA,MACA,CAAC,6BAA6B,qCAAqC;AAAA,IACrE;AAAA,EACF;AACA,SAAO,MAAM,KAAK;AACpB;AAkDO,SAAS,iBAAiB,UAA0D;AACzF,QAAM,qBAAqB,SAAS,YAAY,EAAE,KAAK;AACvD,QAAM,kBAAkB,CAAC,OAAO,UAAU,QAAQ,UAAU;AAE5D,MAAI,CAAC,gBAAgB,SAAS,kBAAsD,GAAG;AACrF,UAAM,IAAI;AAAA,MACR,qBAAqB,QAAQ;AAAA,MAC7B,yBAAyB,gBAAgB,KAAK,IAAI,CAAC;AAAA,MACnD;AAAA,MACA;AAAA,MACA,gBAAgB,IAAI,CAAC,MAAM,cAAc,CAAC,EAAE;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,QAA6D;AAC1F,QAAM,mBAAmB,OAAO,YAAY,EAAE,KAAK;AACnD,QAAM,gBAAgB,CAAC,QAAQ,eAAe,QAAQ,SAAS;AAE/D,MAAI,CAAC,cAAc,SAAS,gBAAkD,GAAG;AAC/E,UAAM,IAAI;AAAA,MACR,mBAAmB,MAAM;AAAA,MACzB,uBAAuB,cAAc,KAAK,IAAI,CAAC;AAAA,MAC/C;AAAA,MACA;AAAA,MACA,cAAc,IAAI,CAAC,MAAM,mBAAmB,CAAC,EAAE;AAAA,IACjD;AAAA,EACF;AAEA,SAAO;AACT;AAwEO,SAAS,oBAAoB,QAAwB;AAC1D,QAAM,MAAM,OAAO,WAAW,MAAM;AAEpC,MAAI,OAAO,MAAM,GAAG,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,yBAAyB,MAAM;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,KAAK,OAAO,KAAK,KAAK,IAAI;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,MAAM,GAAG;AACX,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,KAAK;AACb,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,YAA8B;AACzD,MAAI,CAAC,cAAc,WAAW,KAAK,EAAE,WAAW,GAAG;AACjD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,OAAO,WACV,MAAM,GAAG,EACT,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO;AAGjB,QAAM,WAAW;AACjB,QAAM,cAAc,KAAK,OAAO,CAAC,QAAQ,CAAC,SAAS,KAAK,GAAG,CAAC;AAE5D,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,iBAAiB,YAAY,KAAK,IAAI,CAAC;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,OAAO,WAAW,UAAU,UAAU;AAAA,IACzC;AAAA,EACF;AAGA,QAAM,aAAa,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AACpC,MAAI,WAAW,WAAW,KAAK,QAAQ;AACrC,UAAM,IAAI,gBAAgB,2BAA2B,6BAA6B,GAAG,OAAO;AAAA,EAC9F;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB,UAA0B;AACzD,QAAM,gBAAgB,iBAAiB,UAAU,UAAU;AAG3D,MAAI,cAAc,SAAS,GAAG,GAAG;AAC/B,UAAM,aAAa;AACnB,QAAI,CAAC,WAAW,KAAK,aAAa,GAAG;AACnC,YAAM,IAAI;AAAA,QACR,yBAAyB,aAAa;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,oBAAoB,sBAAsB;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB;AACtB,MAAI,CAAC,cAAc,KAAK,aAAa,GAAG;AACtC,UAAM,IAAI;AAAA,MACR,4BAA4B,aAAa;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,YAAY,WAAW,WAAW;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,IAAoB;AAC7C,QAAM,UAAU,iBAAiB,IAAI,IAAI;AAGzC,QAAM,UAAU;AAChB,MAAI,CAAC,QAAQ,KAAK,OAAO,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,sBAAsB,OAAO;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,UAAU,iBAAiB,aAAa;AAAA,IAC3C;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,IAAI;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AApUA,IAAAI,iBACAC,mBAGa;AAJb;AAAA;AAAA;AAAA;AAAA,IAAAD,kBAA2B;AAC3B,IAAAC,oBAAwB;AAGjB,IAAM,mBAAN,MAAM,yBAAwB,MAA0B;AAAA,MACtD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEP,YACE,SACA,YACA,WAAW,GACX,SACA,cACA;AACA,cAAM,OAAO;AACb,aAAK,OAAO;AACZ,aAAK,WAAW;AAChB,aAAK,aAAa;AAClB,aAAK,UAAU;AACf,aAAK,eAAe;AAAA,MACtB;AAAA,IACF;AApB+D;AAAxD,IAAM,kBAAN;AAsBS;AA6DA;AAiBA;AAuFA;AAkCA;AAiCA;AAgCA;AAAA;AAAA;;;AClRT,SAAS,sBAA+B;AAC7C,QAAM,UAAU,IAAI,2BAAQ,QAAQ;AAEpC,UACG,YAAY,+EAA+E,EAC3F,OAAO,uBAAuB,8CAA8C,MAAM,EAClF,OAAO,uBAAuB,oDAAoD,EAClF,OAAO,mBAAmB,gEAAgE,EAC1F,OAAO,yBAAyB,qDAAqD,EACrF,OAAO,6BAA6B,kDAAkD,EACtF,OAAO,yBAAyB,kCAAkC,EAClE,OAAO,qBAAqB,kCAAkC,EAC9D,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,0BAA0B,4CAA4C,EAC7E,OAAO,2BAA2B,6CAA6C,EAC/E,OAAO,0BAA0B,4CAA4C,EAC7E,OAAO,2BAA2B,6CAA6C,EAC/E,OAAO,2BAA2B,sBAAsB,EACxD,OAAO,2BAA2B,sBAAsB,EACxD,OAAO,uBAAuB,2BAA2B,KAAK,EAC9D,OAAO,0BAA0B,uCAAuC,IAAI,EAC5E,OAAO,sBAAsB,0CAA0C,IAAI,EAC3E;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,uBAAuB,0BAA0B,MAAM,EAC9D,OAAO,mBAAmB,kCAAkC,EAC5D,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,aAAa,uCAAuC,EAC3D,OAAO,cAAc,mCAAmC,EACxD,OAAO,qBAAqB,kDAAkD,EAC9E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BF,EACC;AAAA,IACC,OAAO,YAyBD;AA5GZ;AA6GQ,UAAI;AAEF,YAAI,iBAAiB;AACrB,YAAI,mCAAS,aAAa;AACxB,2BAAiB,MAAM,yBAAyB,OAAO;AAAA,QACzD;AAGA,cAAM,gBAAgB,QAAQ;AAC9B,cAAM,kBAAgB,oDAAe,WAAf,mBAAuB,cAAW,oDAAe,WAAf,mBAAuB;AAE/E,cAAM,gBAAgB,IAAIC,eAAc;AACxC,cAAM,SAAS,cAAc,UAAU;AAGvC,cAAM,eAAe,IAAI,aAAa,eAAe,aAAa;AAElE,cAAM,mBAAe,wBAAK,QAAQ,IAAI,GAAG,aAAa,iBAAiB,CAAC;AAExE,YAAI,KAAC,4BAAW,YAAY,GAAG;AAE7B,cAAI,aAAa,cAAc,GAAG;AAChC,yBAAa,qBAAqB;AAClC,oBAAQ,IAAI,uBAAuB;AACnC,yBAAa,qBAAqB,EAAE,QAAQ,CAAC,QAAQ;AACnD,sBAAQ,IAAI,UAAU,UAAU,GAAG,CAAC;AAAA,YACtC,CAAC;AACD,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAEA,kBAAQ;AAAA,YACN,UAAU;AAAA,cACR,MAAM,aAAa,iBAAiB,CAAC;AAAA,YACvC;AAAA,UACF;AACA,kBAAQ,IAAI,UAAU,KAAK,oDAAoD,CAAC;AAChF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAGA,cAAM,eAAe,MAAM,gCAAgC,gBAAgB,MAAM;AAEjF,gBAAQ,IAAI,UAAU,OAAO,mCAA4B,CAAC;AAE1D,cAAM,cAAU,WAAAC,SAAI,+BAA+B,EAAE,MAAM;AAE3D,YAAI;AAEF,gBAAM,QAAQ,aAAa,cAAc,aAAa,kBAAkB,YAAY;AACpF,kBAAQ,OAAO,cAAc,MAAM,MAAM;AAGzC,gBAAM,UAAU,qBAAqB,YAAY;AACjD,gBAAM,gBAAgB,qBAAqB,OAAO,OAAO;AAEzD,cAAI,cAAc,WAAW,GAAG;AAC9B,oBAAQ,KAAK,sCAAsC;AACnD,oBAAQ;AAAA,cACN,UAAU,KAAK,8DAA8D;AAAA,YAC/E;AACA;AAAA,UACF;AAGA,gBAAM,cAAc,UAAU,eAAe,aAAa,MAAM,aAAa,KAAK;AAGlF,gBAAM,aAAa,aAAa,QAC5B,YAAY,MAAM,GAAG,SAAS,aAAa,KAAK,CAAC,IACjD;AAEJ,kBAAQ,QAAQ,YAAY,WAAW,MAAM,mBAAmB;AAGhE,cAAI,aAAa,SAAS;AACxB,oBAAQ,IAAI,UAAU,OAAO,0BAAmB,CAAC;AACjD,kBAAM,qBAAqB,YAAY,YAAY;AACnD;AAAA,UACF;AAGA,gBAAM,sBAAkB,WAAAA,SAAI,2BAA2B,EAAE,MAAM;AAC/D,gBAAM,eAAe,MAAM;AAAA,YACzB;AAAA,YACA;AAAA,YACA,OAAO;AAAA,UACT;AAGA,cAAI,aAAa,QAAQ;AACvB,kBAAM,aAAa,kBAAkB,aAAa,QAAQ,cAAc,YAAY;AACpF,kCAAsB,UAAU;AAEhC,4BAAgB,OAAO;AACvB,+CAAc,YAAY,YAAY;AACtC,4BAAgB,QAAQ,mBAAmB,UAAU,EAAE;AAGvD,iCAAqB,YAAY,cAAc,UAAU;AAAA,UAC3D,OAAO;AACL,4BAAgB,QAAQ,uBAAuB;AAC/C,oBAAQ,IAAI,YAAY;AAAA,UAC1B;AAAA,QACF,SAAS,iBAAiB;AACxB,kBAAQ,KAAK,0BAA0B;AACvC,gBAAM;AAAA,QACR;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,UAAU;AAAA,YACR,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC5E;AAAA,QACF;AAEA,YAAI,iBAAiB,iBAAiB;AACpC,kBAAQ;AAAA,YACN,UAAU,KAAK,oEAAoE;AAAA,UACrF;AAAA,QACF;AAEA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;AAIA,eAAe,yBAAyB,gBAAmC;AACzE,UAAQ,IAAI,UAAU,OAAO,4CAAqC,CAAC;AAEnE,QAAM,UAAU,MAAM,gBAAAC,QAAS,OAAO;AAAA,IACpC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,wCAAwC,OAAO,OAAO;AAAA,QAC9D,EAAE,MAAM,gCAAgC,OAAO,MAAM;AAAA,QACrD,EAAE,MAAM,iCAAiC,OAAO,OAAO;AAAA,QACvD,EAAE,MAAM,mCAAmC,OAAO,KAAK;AAAA,QACvD,EAAE,MAAM,0BAA0B,OAAO,QAAQ;AAAA,MACnD;AAAA,MACA,UAAS,iDAAgB,WAAU;AAAA,IACrC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAS,iDAAgB,WAAU;AAAA,IACrC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,iDAAiD,OAAO,WAAW;AAAA,QAC3E,EAAE,MAAM,wCAAwC,OAAO,UAAU;AAAA,QACjE,EAAE,MAAM,oCAAoC,OAAO,UAAU;AAAA,MAC/D;AAAA,MACA,UAAS,iDAAgB,aAAY;AAAA,IACvC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,QAC9B,EAAE,MAAM,eAAe,OAAO,cAAc;AAAA,QAC5C,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,QACpC,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,MAChC;AAAA,MACA,UAAS,iDAAgB,UAAS,CAAC,eAAe,MAAM,IAAI,CAAC;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,YAAY,OAAO,WAAW;AAAA,QACtC,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,QAC9B,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,QAClC,EAAE,MAAM,OAAO,OAAO,MAAM;AAAA,MAC9B;AAAA,MACA,UAAS,iDAAgB,YAAW,CAAC,eAAe,QAAQ,IAAI,CAAC;AAAA,IACnE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAS,iDAAgB,aAAY;AAAA,IACvC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAS,iDAAgB,SAAQ;AAAA,IACnC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAS,iDAAgB,UAAS;AAAA,IACpC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,gBAAgB,OAAO,UAAU;AAAA,QACzC,EAAE,MAAM,gBAAgB,OAAO,UAAU;AAAA,QACzC,EAAE,MAAM,YAAY,OAAO,WAAW;AAAA,QACtC,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,QAClC,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,MAClC;AAAA,MACA,UAAS,iDAAgB,SAAQ;AAAA,IACnC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,6BAA6B,OAAO,OAAO;AAAA,QACnD,EAAE,MAAM,4BAA4B,OAAO,MAAM;AAAA,MACnD;AAAA,MACA,UAAS,iDAAgB,UAAS;AAAA,IACpC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAS,iDAAgB,qBAAoB;AAAA,IAC/C;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAS,iDAAgB,yBAAwB;AAAA,IACnD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAS,iDAAgB,qBAAoB;AAAA,IAC/C;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAS,iDAAgB,YAAW;AAAA,IACtC;AAAA,EACF,CAAC;AAGD,QAAM,mBAAmB;AAAA,IACvB,GAAG;AAAA,IACH,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ,UAAU;AAAA,IAC1B,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ,aAAa,SAAS,IAAI,QAAQ,aAAa,KAAK,GAAG,IAAI;AAAA,IAC3E,UAAU,QAAQ,eAAe,SAAS,IAAI,QAAQ,eAAe,KAAK,GAAG,IAAI;AAAA,IACjF,UAAU,QAAQ,YAAY;AAAA,IAC9B,MAAM,QAAQ,QAAQ;AAAA,IACtB,OAAO,QAAQ,SAAS;AAAA,IACxB,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,kBAAkB,QAAQ;AAAA,IAC1B,qBAAqB,QAAQ;AAAA,IAC7B,iBAAiB,QAAQ;AAAA,IACzB,SAAS,QAAQ;AAAA,EACnB;AAEA,UAAQ,IAAI,UAAU,QAAQ,iCAAiC,CAAC;AAChE,SAAO;AACT;AAEA,eAAe,gCAAgC,SAAc,QAA2B;AACtF,QAAM,eAAe;AAAA,IACnB,SAAQ,mCAAS,WAAU,OAAO,gBAAgB;AAAA,IAClD,QAAQ,mCAAS;AAAA,IACjB,mBAAkB,mCAAS,qBAAoB;AAAA,IAC/C,sBAAqB,mCAAS,yBAAwB;AAAA,IACtD,kBAAiB,mCAAS,qBAAoB;AAAA,IAC9C,OAAM,mCAAS,SAAQ;AAAA,IACvB,QAAO,mCAAS,UAAS;AAAA,IACzB,OAAO,mCAAS;AAAA,IAChB,WAAU,mCAAS,aAAY;AAAA,IAC/B,UAAS,mCAAS,YAAW;AAAA,IAC7B,WAAU,mCAAS,aAAY;AAAA,IAC/B,GAAG;AAAA,EACL;AAGA,QAAM,mBAAmB,CAAC,QAAQ,QAAQ,OAAO,MAAM,OAAO;AAC9D,MAAI,CAAC,iBAAiB,SAAS,aAAa,MAAM,GAAG;AACnD,UAAM,IAAI;AAAA,MACR,uBAAuB,aAAa,MAAM,gBAAgB,iBAAiB,KAAK,IAAI,CAAC;AAAA,IACvF;AAAA,EACF;AAGA,QAAM,qBAAqB,CAAC,WAAW,YAAY,SAAS;AAC5D,MAAI,aAAa,YAAY,CAAC,mBAAmB,SAAS,aAAa,QAAQ,GAAG;AAChF,UAAM,IAAI;AAAA,MACR,yBAAyB,aAAa,QAAQ,gBAAgB,mBAAmB,KAAK,IAAI,CAAC;AAAA,IAC7F;AAAA,EACF;AAGA,MAAI,aAAa,QAAQ;AACvB,UAAM,WAAW,aAAa,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAC3E,eAAW,UAAU,UAAU;AAC7B,qBAAe,MAAM;AAAA,IACvB;AAAA,EACF;AAGA,MAAI,aAAa,UAAU;AACzB,UAAM,aAAa,aAAa,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAC/E,eAAW,YAAY,YAAY;AACjC,uBAAiB,QAAQ;AAAA,IAC3B;AAAA,EACF;AAGA,MAAI,aAAa,UAAU;AACzB,qBAAiB,aAAa,QAAQ;AAAA,EACxC;AAGA,MAAI,aAAa,OAAO;AACtB,UAAM,QAAQ,SAAS,aAAa,KAAK;AACzC,QAAI,OAAO,MAAM,KAAK,KAAK,SAAS,GAAG;AACrC,YAAM,IAAI,gBAAgB,iCAAiC;AAAA,IAC7D;AAAA,EACF;AAGA,QAAM,kBAAkB,CAAC,WAAW,WAAW,YAAY,UAAU,OAAO;AAC5E,MAAI,CAAC,gBAAgB,SAAS,aAAa,IAAI,GAAG;AAChD,UAAM,IAAI;AAAA,MACR,uBAAuB,aAAa,IAAI,YAAY,gBAAgB,KAAK,IAAI,CAAC;AAAA,IAChF;AAAA,EACF;AAGA,MAAI,CAAC,CAAC,OAAO,MAAM,EAAE,SAAS,aAAa,KAAK,GAAG;AACjD,UAAM,IAAI,gBAAgB,oCAAoC;AAAA,EAChE;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAA4B;AACxD,QAAM,UAAwB,CAAC;AAG/B,MAAI,QAAQ,QAAQ;AAClB,UAAM,cAAc,QAAQ,OAAO,MAAM,GAAG;AAC5C,eAAW,QAAQ,aAAa;AAC9B,YAAM,CAAC,KAAK,KAAK,IAAI,KAAK,MAAM,GAAG;AACnC,UAAI,OAAO,OAAO;AAChB,cAAM,aAAa,IAAI,KAAK;AAC5B,cAAM,eAAe,MAAM,KAAK;AAEhC,gBAAQ,YAAY;AAAA,UAClB,KAAK;AACH,oBAAQ,SAAS,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC5D;AAAA,UACF,KAAK;AACH,oBAAQ,WAAW,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC9D;AAAA,UACF,KAAK;AACH,oBAAQ,WAAW;AACnB;AAAA,UACF,KAAK;AACH,oBAAQ,OAAO,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC1D;AAAA,UACF,KAAK;AACH,gBAAI,aAAa,SAAS,GAAG,GAAG;AAC9B,oBAAM,CAAC,KAAK,GAAG,IAAI,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,EAAE,KAAK,CAAC,CAAC;AACxE,sBAAQ,cAAc;AACtB,sBAAQ,cAAc;AAAA,YACxB,OAAO;AACL,sBAAQ,WAAW,SAAS,YAAY;AAAA,YAC1C;AACA;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,SAAS,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAAA,EACxE;AACA,MAAI,QAAQ,UAAU;AACpB,YAAQ,WAAW,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAAA,EAC5E;AACA,MAAI,QAAQ,UAAU;AACpB,YAAQ,WAAW,QAAQ;AAAA,EAC7B;AACA,MAAI,QAAQ,MAAM;AAChB,YAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAAA,EACpE;AACA,MAAI,QAAQ,IAAI;AACd,YAAQ,KAAK,QAAQ;AAAA,EACvB;AACA,MAAI,QAAQ,cAAc;AACxB,YAAQ,eAAe,IAAI,KAAK,QAAQ,YAAY;AAAA,EACtD;AACA,MAAI,QAAQ,eAAe;AACzB,YAAQ,gBAAgB,IAAI,KAAK,QAAQ,aAAa;AAAA,EACxD;AACA,MAAI,QAAQ,cAAc;AACxB,YAAQ,eAAe,IAAI,KAAK,QAAQ,YAAY;AAAA,EACtD;AACA,MAAI,QAAQ,eAAe;AACzB,YAAQ,gBAAgB,IAAI,KAAK,QAAQ,aAAa;AAAA,EACxD;AACA,MAAI,QAAQ,aAAa;AACvB,YAAQ,cAAc,SAAS,QAAQ,WAAW;AAAA,EACpD;AACA,MAAI,QAAQ,aAAa;AACvB,YAAQ,cAAc,SAAS,QAAQ,WAAW;AAAA,EACpD;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAwB,SAAwC;AAC5F,SAAO,MAAM,OAAO,CAAC,SAAS;AAE5B,QAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO,SAAS,KAAK,MAAM,GAAG;AAC3D,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,YAAY,CAAC,QAAQ,SAAS,SAAS,KAAK,QAAQ,GAAG;AACjE,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,YAAY,KAAK,aAAa,QAAQ,UAAU;AAC1D,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,MAAM,KAAK,OAAO,QAAQ,IAAI;AACxC,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,UAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAK;AArjBjD;AAqjBoD,0BAAK,SAAL,mBAAW,SAAS;AAAA,OAAI,GAAG;AACvE,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,QAAQ,gBAAgB,KAAK,YAAY,QAAQ,cAAc;AACjE,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,iBAAiB,KAAK,YAAY,QAAQ,eAAe;AACnE,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,gBAAgB,KAAK,YAAY,QAAQ,cAAc;AACjE,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,iBAAiB,KAAK,YAAY,QAAQ,eAAe;AACnE,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,YAAY,KAAK,aAAa,QAAQ,UAAU;AAC1D,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,gBAAgB,CAAC,KAAK,YAAY,KAAK,WAAW,QAAQ,cAAc;AAClF,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,gBAAgB,CAAC,KAAK,YAAY,KAAK,WAAW,QAAQ,cAAc;AAClF,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,UAAU,OAAwB,WAAmB,OAAgC;AAC5F,QAAM,cAAc,CAAC,GAAG,KAAK;AAE7B,cAAY,KAAK,CAAC,GAAG,MAAM;AACzB,QAAI,aAAa;AAEjB,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,qBAAa,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AACzD;AAAA,MACF,KAAK;AACH,qBAAa,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AACzD;AAAA,MACF,KAAK,YAAY;AACf,cAAM,gBAAgB,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAChE,sBACG,cAAc,EAAE,QAAsC,KAAK,MAC3D,cAAc,EAAE,QAAsC,KAAK;AAC9D;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,cAAc,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,MAAM,EAAE;AACrE,sBACG,YAAY,EAAE,MAAkC,KAAK,MACrD,YAAY,EAAE,MAAkC,KAAK;AACxD;AAAA,MACF;AAAA,MACA,KAAK;AACH,qBAAa,EAAE,MAAM,cAAc,EAAE,KAAK;AAC1C;AAAA,MACF;AACE,qBAAa;AAAA,IACjB;AAEA,WAAO,UAAU,SAAS,CAAC,aAAa;AAAA,EAC1C,CAAC;AAED,SAAO;AACT;AAEA,eAAe,qBAAqB,OAAwB,QAA4B;AACtF,UAAQ;AAAA,IACN,UAAU,UAAU,YAAY,MAAM,MAAM,aAAa,OAAO,OAAO,YAAY,CAAC,SAAS;AAAA,EAC/F;AAEA,MAAI,OAAO,WAAW,WAAW,MAAM,UAAU,IAAI;AAEnD,UAAM,cAAc,MAAM,2BAA2B,OAAO,QAAQ,iBAAiB;AACrF,YAAQ,IAAI,WAAW;AAAA,EACzB,OAAO;AAEL,UAAM,cAAc,MAAM,MAAM,GAAG,CAAC;AACpC,YAAQ,IAAI,UAAU,KAAK,0BAA0B,MAAM,MAAM,UAAU,CAAC;AAC5E,UAAM,aAAa,MAAM,2BAA2B,aAAa,QAAQ,iBAAiB;AAC1F,YAAQ,IAAI,UAAU;AACtB,YAAQ,IAAI,UAAU,IAAI,8CAA8C,CAAC;AAAA,EAC3E;AAEA,UAAQ,IAAI,UAAU,KAAK,6BAA6B,MAAM,MAAM,QAAQ,CAAC;AAC/E;AAEA,SAAS,kBACP,YACA,eACA,cACQ;AACR,MAAI,WAAW,WAAW,GAAG,KAAK,WAAW,SAAS,GAAG,GAAG;AAE1D,WAAO;AAAA,EACT,OAAO;AAEL,eAAO,wBAAK,QAAQ,IAAI,GAAG,aAAa,cAAc,GAAG,UAAU;AAAA,EACrE;AACF;AAEA,SAAS,sBAAsB,UAAwB;AACrD,QAAM,UAAM,wBAAK,UAAU,IAAI;AAC/B,MAAI,KAAC,4BAAW,GAAG,GAAG;AACpB,mCAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACF;AAEA,SAAS,qBAAqB,OAAwB,QAAa,YAA0B;AAC3F,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,OAAO,0BAAmB,CAAC;AAGjD,UAAQ,IAAI,UAAU,QAAQ,gCAA2B,MAAM,MAAM,QAAQ,CAAC;AAC9E,UAAQ,IAAI,UAAU,KAAK,qBAAc,UAAU,EAAE,CAAC;AACtD,UAAQ,IAAI,UAAU,KAAK,qBAAc,OAAO,OAAO,YAAY,CAAC,EAAE,CAAC;AACvE,UAAQ,IAAI,UAAU,KAAK,uBAAgB,OAAO,QAAQ,EAAE,CAAC;AAG7D,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,KAAK,SAAS;AACb,UAAI,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK;AAC7C,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,UAAU,mBAAmB,CAAC;AACpD,SAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,QAAQ,KAAK,MAAM;AACxD,YAAQ,IAAI,KAAK,MAAM,KAAK,KAAK,EAAE;AAAA,EACrC,CAAC;AAGD,QAAM,iBAAiB,MAAM;AAAA,IAC3B,CAAC,KAAK,SAAS;AACb,UAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,KAAK;AACjD,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,UAAU,qBAAqB,CAAC;AACtD,SAAO,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,UAAU,KAAK,MAAM;AAC5D,YAAQ,IAAI,KAAK,QAAQ,KAAK,KAAK,EAAE;AAAA,EACvC,CAAC;AAGD,MAAI;AACF,UAAM,YAAQ,0BAAS,UAAU;AACjC,UAAM,cAAc,MAAM,OAAO,MAAM,QAAQ,CAAC;AAChD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,wBAAiB,UAAU,KAAK,CAAC;AAAA,EAC9D,QAAQ;AAAA,EAER;AACF;AAEA,eAAe,2BACb,OACA,QACA,aACiB;AACjB,QAAM,WAAW;AAAA,IACf,SAAS,eAAe;AAAA,IACxB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,WAAW,MAAM;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,SAAS,sBAAsB,MAAM;AAAA,IACrC,SAAS;AAAA,MACP,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,iBAAiB,cAAc,OAAO,OAAO,UAAU,MAAM;AAEnE,UAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,mBAAmB,gBAAgB,UAAU,MAAM;AAAA,IAE5D,KAAK;AACH,aAAO,mBAAmB,gBAAgB,UAAU,MAAM;AAAA,IAE5D,KAAK;AACH,aAAO,kBAAkB,gBAAgB,UAAU,MAAM;AAAA,IAE3D,KAAK;AACH,aAAO,uBAAuB,gBAAgB,UAAU,MAAM;AAAA,IAEhE,KAAK;AACH,aAAO,oBAAoB,gBAAgB,UAAU,MAAM;AAAA,IAE7D;AACE,YAAM,IAAI,MAAM,uBAAuB,OAAO,MAAM,EAAE;AAAA,EAC1D;AACF;AAEA,SAAS,cAAc,OAAwB,UAAkB,QAAoB;AACnF,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAC1B,IAAI,KAAK;AAAA,QACT,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,MACf,EAAE;AAAA,IAEJ,KAAK;AACH,aAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAC1B,IAAI,KAAK;AAAA,QACT,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,MAAM,KAAK;AAAA,MACb,EAAE;AAAA,IACJ;AACE,aAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAC1B,GAAG;AAAA,QACH,aAAa,OAAO,sBAAsB,KAAK,cAAc;AAAA,MAC/D,EAAE;AAAA,EACN;AACF;AAEA,SAAS,mBAAmB,OAAc,UAAe,QAAqB;AAC5E,QAAM,aAAa;AAAA,IACjB,GAAI,OAAO,kBAAkB,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,YAAY,MAAM,CAAC;AAC3C;AAEA,SAAS,mBAAmB,OAAc,UAAe,QAAqB;AAC5E,QAAM,QAAkB,CAAC;AAEzB,MAAI,OAAO,iBAAiB;AAC1B,UAAM,KAAK,WAAW;AACtB,UAAM,KAAK,eAAe,SAAS,OAAO,GAAG;AAC7C,UAAM,KAAK,kBAAkB,SAAS,UAAU,GAAG;AACnD,UAAM,KAAK,gBAAgB,SAAS,SAAS,EAAE;AAC/C,UAAM,KAAK,cAAc,SAAS,MAAM,GAAG;AAC3C,UAAM,KAAK,gBAAgB,SAAS,QAAQ,GAAG;AAC/C,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,KAAK,QAAQ;AAEnB,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,YAAY,KAAK,EAAE,GAAG;AACjC,UAAM,KAAK,eAAe,KAAK,KAAK,GAAG;AACvC,UAAM,KAAK,gBAAgB,KAAK,MAAM,GAAG;AAEzC,QAAI,KAAK,SAAU,OAAM,KAAK,kBAAkB,KAAK,QAAQ,GAAG;AAChE,QAAI,KAAK,SAAU,OAAM,KAAK,kBAAkB,KAAK,QAAQ,GAAG;AAChE,QAAI,KAAK,YAAa,OAAM,KAAK,qBAAqB,KAAK,YAAY,QAAQ,MAAM,KAAK,CAAC,GAAG;AAC9F,QAAI,KAAK,SAAU,OAAM,KAAK,iBAAiB,KAAK,QAAQ,EAAE;AAC9D,QAAI,KAAK,UAAW,OAAM,KAAK,mBAAmB,KAAK,UAAU,YAAY,CAAC,GAAG;AACjF,QAAI,KAAK,UAAW,OAAM,KAAK,mBAAmB,KAAK,UAAU,YAAY,CAAC,GAAG;AACjF,QAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AACrC,YAAM,KAAK,cAAc,KAAK,KAAK,IAAI,CAAC,QAAgB,IAAI,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,IACnF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,kBAAkB,OAAc,UAAe,QAAqB;AAC3E,QAAM,UAAU,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AAAA,IAC1C,CAAC,QAAS,QAAQ,eAAe,QAAQ,eAAgB,OAAO,aAAa;AAAA,EAC/E;AAGA,MAAI,OAAO,aAAa,YAAY;AAClC,YAAQ,KAAK,aAAa,WAAW;AAAA,EACvC;AAEA,QAAM,YAAY,QAAQ,KAAK,GAAG;AAElC,QAAM,WAAW,MAAM,IAAI,CAAC,SAAS;AACnC,WAAO,QACJ,IAAI,CAAC,WAAW;AACf,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,UAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,IAAI,MAAM,KAAK,IAAI,CAAC;AACrD,UAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,eAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AACtC,UAAI,iBAAiB,KAAM,QAAO,MAAM,YAAY;AACpD,aAAO,OAAO,KAAK;AAAA,IACrB,CAAC,EACA,KAAK,GAAG;AAAA,EACb,CAAC;AAED,QAAM,aAAa,CAAC,WAAW,GAAG,QAAQ,EAAE,KAAK,IAAI;AAErD,MAAI,OAAO,iBAAiB;AAC1B,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA,cAAc,SAAS,OAAO;AAAA,MAC9B,eAAe,SAAS,UAAU;AAAA,MAClC,YAAY,SAAS,SAAS;AAAA,MAC9B,eAAe,SAAS,QAAQ;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AACA,WAAO,cAAc,KAAK,IAAI;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAc,UAAe,QAAqB;AAChF,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,KAAK,SAAS,OAAO,SAAS;AACzC,QAAM,KAAK,EAAE;AAEb,MAAI,OAAO,iBAAiB;AAC1B,UAAM,KAAK,iBAAiB,SAAS,UAAU,EAAE;AACjD,UAAM,KAAK,cAAc,SAAS,SAAS,EAAE;AAC7C,UAAM,KAAK,eAAe,SAAS,MAAM,EAAE;AAC3C,UAAM,KAAK,iBAAiB,SAAS,QAAQ,EAAE;AAC/C,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,KAAK,UAAU;AACrB,QAAM,KAAK,EAAE;AAEb,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,OAAO,KAAK,KAAK,EAAE;AAC9B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAa,KAAK,EAAE,EAAE;AACjC,UAAM,KAAK,iBAAiB,KAAK,MAAM,EAAE;AAEzC,QAAI,KAAK,SAAU,OAAM,KAAK,mBAAmB,KAAK,QAAQ,EAAE;AAChE,QAAI,KAAK,SAAU,OAAM,KAAK,mBAAmB,KAAK,QAAQ,EAAE;AAChE,QAAI,KAAK,SAAU,OAAM,KAAK,mBAAmB,KAAK,QAAQ,eAAe;AAC7E,QAAI,KAAK,UAAW,OAAM,KAAK,kBAAkB,KAAK,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AAC7F,QAAI,KAAK,UAAW,OAAM,KAAK,kBAAkB,KAAK,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AAC7F,QAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AACrC,YAAM,KAAK,eAAe,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,IAClD;AAEA,UAAM,KAAK,EAAE;AAEb,QAAI,KAAK,aAAa;AACpB,YAAM,KAAK,KAAK,WAAW;AAC3B,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,oBAAoB,OAAc,WAAgB,SAAsB;AAE/E,SAAO,UAAU,YAAY,KAAwB;AACvD;AAEA,SAAS,sBAAsB,QAAkC;AAC/D,QAAM,UAA+B,CAAC;AAEtC,MAAI,OAAO,OAAQ,SAAQ,SAAS,OAAO;AAC3C,MAAI,OAAO,SAAU,SAAQ,WAAW,OAAO;AAC/C,MAAI,OAAO,SAAU,SAAQ,WAAW,OAAO;AAC/C,MAAI,OAAO,KAAM,SAAQ,OAAO,OAAO;AACvC,MAAI,OAAO,aAAc,SAAQ,eAAe,OAAO;AACvD,MAAI,OAAO,cAAe,SAAQ,gBAAgB,OAAO;AACzD,MAAI,OAAO,aAAc,SAAQ,eAAe,OAAO;AACvD,MAAI,OAAO,cAAe,SAAQ,gBAAgB,OAAO;AACzD,MAAI,OAAO,YAAa,SAAQ,cAAc,OAAO;AACrD,MAAI,OAAO,YAAa,SAAQ,cAAc,OAAO;AACrD,MAAI,OAAO,MAAO,SAAQ,QAAQ,OAAO;AAEzC,SAAO;AACT;AAGA,SAAS,aACP,eACA,kBACA,cACiB;AACjB,QAAM,QAAyB,CAAC;AAChC,QAAM,cAAc,CAAC,aAAa,aAAa,CAAC;AAEhD,MAAI,kBAAkB;AACpB,gBAAY,KAAK,aAAa,gBAAgB,CAAC;AAAA,EACjD;AAEA,aAAW,OAAO,aAAa;AAC7B,UAAM,eAAW,wBAAK,QAAQ,IAAI,GAAG,GAAG;AACxC,YAAI,4BAAW,QAAQ,GAAG;AACxB,YAAM,YAAQ,6BAAY,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC;AAEzE,iBAAW,QAAQ,OAAO;AACxB,YAAI;AACF,gBAAM,OAAO,uBAAmB,wBAAK,UAAU,IAAI,CAAC;AACpD,cAAI,MAAM;AACR,kBAAM,KAAK,IAAI;AAAA,UACjB;AAAA,QACF,SAAS,QAAQ;AACf,kBAAQ,KAAK,UAAU,QAAQ,yBAAyB,IAAI,EAAE,CAAC;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC;AAC3E;AAEA,SAAS,mBAAmB,UAAwC;AAh+BpE;AAi+BE,MAAI;AACF,UAAM,cAAU,8BAAa,UAAU,OAAO;AAG9C,UAAM,aAAa,QAAQ,MAAM,WAAW;AAC5C,UAAM,UAAU,QAAQ,MAAM,sBAAsB;AACpD,UAAM,cAAc,QAAQ,MAAM,0BAA0B;AAC5D,UAAM,gBAAgB,QAAQ,MAAM,4BAA4B;AAChE,UAAM,gBAAgB,QAAQ,MAAM,4BAA4B;AAChE,UAAM,eAAe,QAAQ,MAAM,2BAA2B;AAC9D,UAAM,eAAe,QAAQ,MAAM,2BAA2B;AAC9D,UAAM,YAAY,QAAQ,MAAM,wBAAwB;AACxD,UAAM,gBAAgB,QAAQ,MAAM,4BAA4B;AAEhE,QAAI,CAAC,cAAc,CAAC,SAAS;AAC3B,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmB,QAAQ,MAAM,gDAAgD;AAGvF,UAAM,OAAO,YACT,UAAU,CAAC,EACR,MAAM,GAAG,EACT,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,QAAQ,MAAM,EAAE,CAAC,EACzC,OAAO,OAAO,IACjB;AAEJ,WAAO;AAAA,MACL,IAAI,QAAQ,CAAC,EAAE,KAAK;AAAA,MACpB,OAAO,WAAW,CAAC,EAAE,KAAK;AAAA,MAC1B,aAAa,mBAAmB,iBAAiB,CAAC,EAAE,KAAK,IAAI;AAAA,MAC7D,UAAS,gDAAc,OAAd,mBAAkB,WAAU;AAAA,MACrC,YAAW,oDAAgB,OAAhB,mBAAoB,WAAU;AAAA,MACzC,YACE,oDAAgB,OAAhB,mBAAoB,YAAW,gBAAe,oDAAgB,OAAhB,mBAAoB,SAAS;AAAA,MAC7E,WAAW,eAAe,IAAI,KAAK,aAAa,CAAC,EAAE,KAAK,CAAC,IAAI,oBAAI,KAAK;AAAA,MACtE,WAAW,eAAe,IAAI,KAAK,aAAa,CAAC,EAAE,KAAK,CAAC,IAAI,oBAAI,KAAK;AAAA,MACtE,UAAU,gBAAgB,SAAS,cAAc,CAAC,EAAE,KAAK,CAAC,IAAI;AAAA,MAC9D;AAAA,IACF;AAAA,EACF,SAAS,QAAQ;AACf,WAAO;AAAA,EACT;AACF;AA9gCA,IAAAC,iBACAC,mBACAC,oBACA,iBACA;AAJA;AAAA;AAAA;AAAA;AAAA,IAAAF,kBAA0F;AAC1F,IAAAC,oBAAqB;AACrB,IAAAC,qBAAwB;AACxB,sBAAqB;AACrB,iBAAgB;AAEhB;AACA;AACA;AACA;AAOgB;AA+ND;AAoJA;AA6EN;AA6EA;AA0DA;AAwCM;AAqBN;AAcA;AAOA;AAmDM;AA0CN;AA4BA;AASA;AAkCA;AA4CA;AA8CA;AAKA;AAmBA;AAiCA;AAAA;AAAA;;;ACh+BT,IA8Ca;AA9Cb;AAAA;AAAA;AAAA;AAOA;AACA;AACA;AAqCO,IAAM,+BAAN,MAAM,6BAA4B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,kBAA0B;AAAA,MAC1B,cAAsB;AAAA;AAAA,MAE9B,YAAY,QAAwB,aAAsB,aAAsB;AAC9E,YAAI,CAAC,QAAQ;AACX,gBAAM,gBAAgB,IAAI,cAAc,WAAW;AACnD,eAAK,SAAS,cAAc,UAAU;AAAA,QACxC,OAAO;AACL,eAAK,SAAS;AAAA,QAChB;AAEA,aAAK,sBAAsB,IAAI,oBAAoB,KAAK,QAAQ,aAAa,WAAW;AAAA,MAC1F;AAAA;AAAA;AAAA;AAAA,MAKO,kBAAgC;AACrC,cAAM,QAAQ,KAAK,oBAAoB,YAAY;AACnD,cAAM,SAAS,KAAK,oBAAoB,aAAa;AACrD,cAAM,QAAQ,KAAK,oBAAoB,YAAY;AAEnD,eAAO;AAAA,UACL,OAAO,MAAM;AAAA,UACb,QAAQ,OAAO;AAAA,UACf,OAAO,MAAM;AAAA,UACb,OAAO,MAAM,SAAS,OAAO,SAAS,MAAM;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,mBAA+B;AACpC,eAAO;AAAA,UACL,OAAO,KAAK,oBAAoB,YAAY;AAAA,UAC5C,QAAQ,KAAK,oBAAoB,aAAa;AAAA,UAC9C,OAAO,KAAK,oBAAoB,YAAY;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,mBAAwC;AAC7C,cAAM,OAAO,KAAK,iBAAiB;AACnC,cAAM,WAAW,CAAC,GAAG,KAAK,OAAO,GAAG,KAAK,QAAQ,GAAG,KAAK,KAAK;AAG9D,cAAM,kBAAkB;AAAA,UACtB,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,SAAS;AAAA,QACX;AAGA,cAAM,oBAAoB;AAAA,UACxB,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,UAAU;AAAA,QACZ;AAGA,cAAM,WAAW,oBAAI,KAAK;AAC1B,iBAAS,QAAQ,SAAS,QAAQ,IAAI,CAAC;AACvC,YAAI,kBAAkB;AACtB,YAAI,kBAAkB;AAEtB,mBAAW,QAAQ,UAAU;AAE3B,kBAAQ,KAAK,QAAQ;AAAA,YACnB,KAAK;AACH,8BAAgB;AAChB;AAAA,YACF,KAAK;AACH,8BAAgB;AAChB;AAAA,YACF,KAAK;AACH,8BAAgB;AAChB;AAAA,YACF,KAAK;AACH,8BAAgB;AAChB;AAAA,UACJ;AAGA,kBAAQ,KAAK,UAAU;AAAA,YACrB,KAAK;AACH,gCAAkB;AAClB;AAAA,YACF,KAAK;AACH,gCAAkB;AAClB;AAAA,YACF,KAAK;AACH,gCAAkB;AAClB;AAAA,YACF,KAAK;AACH,gCAAkB;AAClB;AAAA,UACJ;AAGA,gBAAM,cAAc,IAAI,KAAK,KAAK,YAAY;AAC9C,gBAAM,cAAc,IAAI,KAAK,KAAK,YAAY;AAE9C,cAAI,eAAe,UAAU;AAC3B;AAAA,UACF;AACA,cAAI,eAAe,UAAU;AAC3B;AAAA,UACF;AAAA,QACF;AAEA,cAAM,iBACJ,SAAS,SAAS,IAAI,KAAK,MAAO,gBAAgB,YAAY,SAAS,SAAU,GAAG,IAAI;AAE1F,eAAO;AAAA,UACL,QAAQ,KAAK,gBAAgB;AAAA,UAC7B;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,YACd;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,UACA,aAAa,oBAAI,KAAK;AAAA,QACxB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,uBAA6B;AAClC,cAAM,UAAU,KAAK,iBAAiB;AAEtC,gBAAQ,IAAI,UAAU,OAAO,6DAAsD,CAAC;AACpF,gBAAQ,IAAI,EAAE;AAGd,gBAAQ,IAAI,UAAU,UAAU,yBAAkB,CAAC;AACnD,gBAAQ,IAAI,uBAAgB,UAAU,UAAU,QAAQ,OAAO,MAAM,SAAS,CAAC,CAAC,EAAE;AAClF,gBAAQ,IAAI,wBAAiB,UAAU,UAAU,QAAQ,OAAO,OAAO,SAAS,CAAC,CAAC,EAAE;AACpF,gBAAQ,IAAI,oBAAe,UAAU,UAAU,QAAQ,OAAO,MAAM,SAAS,CAAC,CAAC,EAAE;AACjF,gBAAQ,IAAI,uBAAgB,UAAU,UAAU,QAAQ,OAAO,MAAM,SAAS,CAAC,CAAC,EAAE;AAClF,gBAAQ,IAAI,EAAE;AAGd,gBAAQ,IAAI,UAAU,UAAU,4BAAqB,CAAC;AACtD,gBAAQ,IAAI,0BAAmB,QAAQ,gBAAgB,QAAQ,EAAE;AACjE,gBAAQ,IAAI,wBAAiB,QAAQ,gBAAgB,MAAM,EAAE;AAC7D,gBAAQ,IAAI,wBAAmB,QAAQ,gBAAgB,SAAS,EAAE;AAClE,gBAAQ,IAAI,yBAAkB,QAAQ,gBAAgB,OAAO,EAAE;AAC/D,gBAAQ,IAAI,EAAE;AAGd,gBAAQ,IAAI,UAAU,UAAU,8BAAyB,CAAC;AAC1D,gBAAQ,IAAI,0BAAmB,QAAQ,kBAAkB,QAAQ,EAAE;AACnE,gBAAQ,IAAI,sBAAe,QAAQ,kBAAkB,IAAI,EAAE;AAC3D,gBAAQ,IAAI,wBAAiB,QAAQ,kBAAkB,MAAM,EAAE;AAC/D,gBAAQ,IAAI,qBAAc,QAAQ,kBAAkB,GAAG,EAAE;AACzD,gBAAQ,IAAI,EAAE;AAGd,gBAAQ,IAAI,UAAU,UAAU,6BAAsB,CAAC;AACvD,gBAAQ,IAAI,iCAA0B,UAAU,UAAU,GAAG,QAAQ,cAAc,GAAG,CAAC,EAAE;AACzF,gBAAQ;AAAA,UACN,iCAA0B,QAAQ,eAAe,eAAe,aAAa,QAAQ,eAAe,eAAe;AAAA,QACrH;AACA,gBAAQ,IAAI,2BAAsB,QAAQ,YAAY,eAAe,CAAC,EAAE;AACxE,gBAAQ,IAAI,EAAE;AAGd,aAAK,oBAAoB,OAAO;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAAoB,SAAoC;AAC9D,cAAM,SAAS,CAAC;AAGhB,YAAI,QAAQ,gBAAgB,UAAU,GAAG;AACvC,iBAAO,KAAK,8CAAoC,QAAQ,gBAAgB,OAAO,EAAE;AAAA,QACnF;AAGA,YAAI,QAAQ,iBAAiB,MAAM,QAAQ,OAAO,QAAQ,IAAI;AAC5D,iBAAO,KAAK,qCAA2B,QAAQ,cAAc,GAAG;AAAA,QAClE;AAGA,YAAI,QAAQ,kBAAkB,WAAW,GAAG;AAC1C,iBAAO,KAAK,4CAAqC,QAAQ,kBAAkB,QAAQ,EAAE;AAAA,QACvF;AAGA,YAAI,QAAQ,eAAe,kBAAkB,KAAK,KAAK,QAAQ,OAAO,QAAQ,GAAG,GAAG;AAClF,iBAAO;AAAA,YACL,oCAA+B,QAAQ,eAAe,eAAe;AAAA,UACvE;AAAA,QACF;AAEA,YAAI,OAAO,SAAS,GAAG;AACrB,kBAAQ,IAAI,UAAU,UAAU,yBAAkB,CAAC;AACnD,iBAAO,QAAQ,CAAC,UAAU;AACxB,oBAAQ,IAAI,MAAM,KAAK,EAAE;AAAA,UAC3B,CAAC;AACD,kBAAQ,IAAI,EAAE;AAAA,QAChB,OAAO;AACL,kBAAQ,IAAI,UAAU,QAAQ,uDAAkD,CAAC;AACjF,kBAAQ,IAAI,EAAE;AAAA,QAChB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,oBAAyC;AAC9C,cAAM,MAAM,KAAK,IAAI;AACrB,YAAI,MAAM,KAAK,kBAAkB,KAAK,aAAa;AACjD,eAAK,oBAAoB,aAAa;AACtC,eAAK,kBAAkB;AAAA,QACzB;AAEA,eAAO,KAAK,iBAAiB;AAAA,MAC/B;AAAA;AAAA;AAAA;AAAA,MAKO,cAAoB;AACzB,aAAK,oBAAoB,aAAa;AACtC,aAAK,kBAAkB,KAAK,IAAI;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKO,iBAKL;AACA,cAAM,QAAQ,KAAK,oBAAoB,YAAY;AACnD,cAAM,SAAS,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,QAAQ,EAAE;AAChE,cAAM,YAAY,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW,EAAE;AACtE,cAAM,oBACJ,MAAM,SAAS,IACX,KAAK;AAAA,UACH,MAAM,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,yBAAyB,IAAI,CAAC,IAAI,MAAM;AAAA,QAClF,IACA;AAEN,eAAO;AAAA,UACL,OAAO,MAAM;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,kBAKL;AACA,cAAM,SAAS,KAAK,oBAAoB,aAAa;AACrD,cAAM,SAAiC,CAAC;AACxC,YAAI,aAAa;AACjB,YAAI,eAAe;AAEnB,mBAAW,SAAS,QAAQ;AAE1B,cAAI,MAAM,SAAS;AACjB,mBAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,KAAK;AAAA,UACzD;AAGA,cAAI,CAAC,MAAM,YAAY,MAAM,aAAa,cAAc;AACtD;AAAA,UACF;AAGA,cAAI,MAAM,aAAa,UAAU,MAAM,aAAa,YAAY;AAC9D;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO,OAAO;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,iBAKL;AACA,cAAM,QAAQ,KAAK,oBAAoB,YAAY;AACnD,cAAM,UAAkC,CAAC;AACzC,YAAI,aAAa;AACjB,YAAI,iBAAiB;AACrB,YAAI,cAAc;AAElB,mBAAW,QAAQ,OAAO;AAExB,cAAI,KAAK,UAAU;AACjB,oBAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,KAAK;AAAA,UAC3D,OAAO;AACL;AAAA,UACF;AAGA,cAAI,KAAK,kBAAkB;AACzB,8BAAkB,KAAK;AAAA,UACzB;AACA,cAAI,KAAK,eAAe;AACtB,2BAAe,KAAK;AAAA,UACtB;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO,MAAM;AAAA,UACb;AAAA,UACA;AAAA,UACA,mBAAmB;AAAA,YACjB,WAAW;AAAA,YACX,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AA7VyC;AAAlC,IAAM,8BAAN;AAAA;AAAA;;;ACrCA,SAAS,sBAA+B;AAC7C,QAAM,UAAU,IAAI,2BAAQ,QAAQ;AAEpC,UACG,YAAY,kFAAkF,EAC9F,OAAO,iBAAiB,yBAAyB,EACjD,OAAO,kBAAkB,0BAA0B,EACnD,OAAO,UAAU,uBAAuB,EACxC,OAAO,aAAa,2BAA2B,EAC/C,OAAO,WAAW,qCAAqC,EACvD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,mBAAmB,6BAA6B,EACvD,OAAO,kBAAkB,4BAA4B,EACrD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeF,EACC,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,YAAM,qBAAqB,OAAO;AAAA,IACpC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAClF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,qBAAqB,SASlB;AAEhB,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,qBAAqB,IAAI,4BAA4B,QAAW,QAAQ,IAAI,GAAG,WAAW;AAGhG,MAAI,QAAQ,SAAS;AACnB,YAAQ,IAAI,qCAA8B;AAC1C,uBAAmB,YAAY;AAC/B,YAAQ,IAAI,oCAA+B;AAC3C,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,OAAO;AACjB,WAAO,aAAa,kBAAkB;AAAA,EACxC;AAGA,QAAM,gBAAgB,mBAAmB,iBAAiB;AAC1D,QAAM,SAAS,mBAAmB,gBAAgB;AAGlD,MAAI,QAAQ,MAAM;AAChB,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAGA,MAAI,QAAQ,YAAY;AACtB,YAAQ,IAAI,UAAU,OAAO,yDAAkD,CAAC;AAChF,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,oBAAa,UAAU,UAAU,OAAO,MAAM,SAAS,CAAC,CAAC,EAAE;AACvE,YAAQ,IAAI,qBAAc,UAAU,UAAU,OAAO,OAAO,SAAS,CAAC,CAAC,EAAE;AACzE,YAAQ,IAAI,iBAAY,UAAU,UAAU,OAAO,MAAM,SAAS,CAAC,CAAC,EAAE;AACtE,YAAQ,IAAI,oBAAa,UAAU,UAAU,OAAO,MAAM,SAAS,CAAC,CAAC,EAAE;AACvE,YAAQ,IAAI,EAAE;AAGd,YAAQ;AAAA,MACN,UAAU,KAAK,wEAAmE;AAAA,IACpF;AACA;AAAA,EACF;AAGA,MAAI,QAAQ,aAAa;AACvB,uBAAmB,qBAAqB;AACxC;AAAA,EACF;AAGA,UAAQ,IAAI,UAAU,OAAO,iCAA0B,CAAC;AACxD,UAAQ,IAAI,UAAU,KAAK,oEAAoE,CAAC;AAChG,UAAQ,IAAI,EAAE;AAGd,qBAAmB,qBAAqB;AAGxC,MAAI,QAAQ,aAAa;AACvB,uBAAmB,kBAAkB;AAAA,EACvC;AAEA,MAAI,QAAQ,cAAc;AACxB,wBAAoB,kBAAkB;AAAA,EACxC;AAEA,MAAI,QAAQ,aAAa;AACvB,uBAAmB,kBAAkB;AAAA,EACvC;AAGA,yBAAuB,aAAa;AACtC;AAEA,SAAS,mBAAmB,oBAAuD;AACjF,QAAM,cAAc,mBAAmB,eAAe;AAEtD,UAAQ,IAAI,UAAU,UAAU,wBAAiB,CAAC;AAClD,UAAQ,IAAI,mBAAmB,YAAY,KAAK,EAAE;AAClD,UAAQ,IAAI,oBAAoB,YAAY,MAAM,EAAE;AACpD,UAAQ,IAAI,uBAAuB,YAAY,SAAS,EAAE;AAC1D,UAAQ,IAAI,0BAA0B,YAAY,iBAAiB,GAAG;AACtE,UAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,oBAAoB,oBAAuD;AAClF,QAAM,eAAe,mBAAmB,gBAAgB;AAExD,UAAQ,IAAI,UAAU,UAAU,yBAAkB,CAAC;AACnD,UAAQ,IAAI,oBAAoB,aAAa,KAAK,EAAE;AACpD,UAAQ,IAAI,yBAAyB,aAAa,UAAU,EAAE;AAC9D,UAAQ,IAAI,4BAA4B,aAAa,YAAY,EAAE;AACnE,UAAQ,IAAI,EAAE;AAEd,MAAI,OAAO,KAAK,aAAa,MAAM,EAAE,SAAS,GAAG;AAC/C,YAAQ,IAAI,UAAU,UAAU,0BAAmB,CAAC;AACpD,WAAO,QAAQ,aAAa,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAC7D,cAAQ,IAAI,MAAM,IAAI,KAAK,KAAK,SAAS;AAAA,IAC3C,CAAC;AACD,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF;AAEA,SAAS,mBAAmB,oBAAuD;AACjF,QAAM,cAAc,mBAAmB,eAAe;AAEtD,UAAQ,IAAI,UAAU,UAAU,qBAAgB,CAAC;AACjD,UAAQ,IAAI,mBAAmB,YAAY,KAAK,EAAE;AAClD,UAAQ,IAAI,wBAAwB,YAAY,UAAU,EAAE;AAC5D,UAAQ,IAAI,wBAAwB,YAAY,kBAAkB,SAAS,EAAE;AAC7E,UAAQ,IAAI,qBAAqB,YAAY,kBAAkB,MAAM,EAAE;AACvE,UAAQ,IAAI,EAAE;AAEd,MAAI,OAAO,KAAK,YAAY,OAAO,EAAE,SAAS,GAAG;AAC/C,YAAQ,IAAI,UAAU,UAAU,0BAAmB,CAAC;AACpD,WAAO,QAAQ,YAAY,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,KAAK,MAAM;AAC9D,cAAQ,IAAI,MAAM,KAAK,KAAK,KAAK,QAAQ;AAAA,IAC3C,CAAC;AACD,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF;AAEA,SAAS,uBAAuB,eAA0B;AACxD,UAAQ,IAAI,UAAU,UAAU,kCAA2B,CAAC;AAE5D,QAAM,kBAAkB,CAAC;AAGzB,MAAI,cAAc,iBAAiB,IAAI;AACrC,oBAAgB;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,kBAAkB,WAAW,GAAG;AAChD,oBAAgB,KAAK,uEAAuE;AAAA,EAC9F;AAGA,MAAI,cAAc,eAAe,kBAAkB,cAAc,OAAO,QAAQ,KAAK;AACnF,oBAAgB,KAAK,iEAAiE;AAAA,EACxF;AAGA,MAAI,cAAc,gBAAgB,UAAU,GAAG;AAC7C,oBAAgB;AAAA,MACd,UAAU,cAAc,gBAAgB,OAAO;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,oBAAgB,QAAQ,CAAC,QAAQ;AAC/B,cAAQ,IAAI,aAAQ,GAAG,EAAE;AAAA,IAC3B,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,IAAI,8DAAyD;AAAA,EACvE;AAEA,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAe,aAAa,oBAAgE;AAC1F,UAAQ,IAAI,UAAU,KAAK,4EAAgE,CAAC;AAC5F,UAAQ,IAAI,UAAU,KAAK,sBAAsB,CAAC;AAClD,UAAQ,IAAI,EAAE;AAEd,QAAM,oBAAoB,6BAAM;AAC9B,YAAQ,MAAM;AACd,YAAQ,IAAI,UAAU,OAAO,uCAA+B,oBAAI,KAAK,GAAE,mBAAmB,CAAC,EAAE,CAAC;AAC9F,YAAQ,IAAI,EAAE;AAEd,UAAM,UAAU,mBAAmB,kBAAkB;AAGrD,YAAQ,IAAI,UAAU,UAAU,0BAAmB,CAAC;AACpD,YAAQ,IAAI,qBAAqB,QAAQ,OAAO,KAAK,EAAE;AACvD,YAAQ,IAAI,uBAAuB,QAAQ,cAAc,GAAG;AAC5D,YAAQ,IAAI,oBAAoB,QAAQ,gBAAgB,MAAM,EAAE;AAChE,YAAQ,IAAI,qBAAqB,QAAQ,gBAAgB,OAAO,EAAE;AAClE,YAAQ,IAAI,uBAAuB,QAAQ,eAAe,eAAe,mBAAmB;AAC5F,YAAQ,IAAI,EAAE;AAGd,UAAM,YACJ,QAAQ,gBAAgB,YAAY,KACpC,QAAQ,kBAAkB,WAAW,KACrC,QAAQ,iBAAiB;AAE3B,QAAI,WAAW;AACb,cAAQ,IAAI,UAAU,QAAQ,6BAAwB,CAAC;AAAA,IACzD,OAAO;AACL,cAAQ,IAAI,UAAU,QAAQ,8CAAoC,CAAC;AAAA,IACrE;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,IAAI,kBAAiB,oBAAI,KAAK,GAAE,mBAAmB,CAAC,EAAE,CAAC;AAAA,EAC/E,GA9B0B;AAiC1B,oBAAkB;AAGlB,QAAM,WAAW,YAAY,mBAAmB,GAAK;AAGrD,UAAQ,GAAG,UAAU,MAAM;AACzB,kBAAc,QAAQ;AACtB,YAAQ,IAAI,UAAU,KAAK,uCAAgC,CAAC;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;AA7RA,IAKAC;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB;AACA;AAEgB;AA+CD;AA4FN;AAWA;AAkBA;AAmBA;AAwCM;AAAA;AAAA;;;AC3NR,SAAS,2BAAoC;AAClD,QAAM,UAAU,IAAI,2BAAQ,cAAc;AAE1C,UACG,YAAY,oDAAoD,EAChE,OAAO,gBAAgB,sCAAsC,EAC7D,OAAO,iBAAiB,2BAA2B,EACnD,OAAO,eAAe,4CAA4C,EAClE,OAAO,mBAAmB,+CAA+C,EACzE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaF,EACC,OAAO,OAAO,YAAgC;AAC7C,QAAI;AACF,YAAM,WAAW,MAAM,oBAAoB,OAAO;AAClD,cAAQ,KAAK,QAAQ;AAAA,IACvB,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACxF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,oBAAoB,SAA8C;AA3DjF;AA4DE,QAAM,YAAY,KAAK,IAAI;AAG3B,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,iBAAiB,aAAgB,YAAhB,mBAAyB;AAChD,QAAM,gBAAc,oDAAe,WAAf,mBAAuB,cAAW,oDAAe,WAAf,mBAAuB;AAE7E,QAAM,cAAc,cAAc,gBAAgB;AAClD,QAAM,eAAe,IAAI,sBAAsB,QAAQ,aAAa,WAAW;AAE/E,UAAQ,IAAI,UAAU,OAAO,2CAAoC,CAAC;AAClE,UAAQ,IAAI,UAAU,KAAK,YAAY,OAAO,QAAQ,cAAc,EAAE,CAAC;AACvE,UAAQ,IAAI,UAAU,KAAK,SAAS,WAAW,EAAE,CAAC;AAClD,UAAQ,IAAI,EAAE;AAGd,MAAI,QAAQ,cAAc;AACxB,YAAQ,IAAI,UAAU,QAAQ,sDAA+C,CAAC;AAC9E,UAAM,aAAa,aAAa;AAChC,YAAQ,IAAI,UAAU,QAAQ,mCAA8B,CAAC;AAC7D,YAAQ,IAAI,UAAU,IAAI;AAAA,sBAAoB,KAAK,IAAI,IAAI,SAAS,IAAI,CAAC;AACzE,WAAO;AAAA,EACT;AAGA,UAAQ,IAAI,UAAU,KAAK,yCAAkC,CAAC;AAC9D,QAAM,cAAc,MAAM,aAAa,oBAAoB;AAG3D,MAAI,YAAY,SAAS;AACvB,YAAQ,IAAI,UAAU,QAAQ,yBAAoB,CAAC;AAAA,EACrD,OAAO;AACL,YAAQ,IAAI,UAAU,MAAM,yBAAoB,CAAC;AAAA,EACnD;AAEA,UAAQ,IAAI,EAAE;AAGd,UAAQ,IAAI,UAAU,UAAU,4BAAqB,CAAC;AACtD,UAAQ,IAAI,UAAU,KAAK,gBAAgB,YAAY,MAAM,SAAS,EAAE,CAAC;AACzE,UAAQ,IAAI,UAAU,KAAK,kBAAkB,YAAY,MAAM,YAAY,EAAE,CAAC;AAE9E,MAAI,YAAY,MAAM,eAAe,GAAG;AACtC,YAAQ,IAAI,UAAU,QAAQ,uBAAuB,YAAY,MAAM,YAAY,EAAE,CAAC;AAAA,EACxF;AAEA,MAAI,YAAY,MAAM,gBAAgB,GAAG;AACvC,YAAQ,IAAI,UAAU,QAAQ,qBAAqB,YAAY,MAAM,aAAa,EAAE,CAAC;AAAA,EACvF;AAEA,MAAI,YAAY,MAAM,iBAAiB,KAAK,YAAY,MAAM,kBAAkB,GAAG;AACjF,YAAQ,IAAI,UAAU,QAAQ,yCAAyC,CAAC;AAAA,EAC1E;AAEA,UAAQ,IAAI,EAAE;AAGd,MAAI,YAAY,OAAO,SAAS,GAAG;AACjC,YAAQ,IAAI,UAAU,UAAU,+BAAqB,CAAC;AACtD,eAAW,SAAS,YAAY,QAAQ;AACtC,cAAQ,IAAI,UAAU,QAAQ,UAAK,KAAK,EAAE,CAAC;AAAA,IAC7C;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,YAAY,YAAY,SAAS,GAAG;AACtC,YAAQ,IAAI,UAAU,UAAU,uBAAgB,CAAC;AACjD,eAAW,cAAc,YAAY,aAAa;AAChD,cAAQ,IAAI,UAAU,KAAK,UAAK,UAAU,EAAE,CAAC;AAAA,IAC/C;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,SAAS;AACnB,UAAM,0BAA0B,YAAY;AAAA,EAC9C;AAGA,MAAI,QAAQ,UAAU,QAAQ,OAAO;AACnC,QAAI,YAAY,WAAW,CAAC,QAAQ,OAAO;AACzC,cAAQ,IAAI,UAAU,KAAK,8CAAuC,CAAC;AAAA,IACrE,OAAO;AACL,cAAQ,IAAI,UAAU,KAAK,2CAAoC,CAAC;AAEhE,YAAM,eAAe,MAAM,aAAa,gBAAgB;AAExD,UAAI,aAAa,UAAU;AACzB,gBAAQ,IAAI,UAAU,QAAQ,4CAAuC,CAAC;AAEtE,YAAI,aAAa,QAAQ,SAAS,GAAG;AACnC,kBAAQ,IAAI,UAAU,UAAU,uCAA2B,CAAC;AAC5D,qBAAW,UAAU,aAAa,SAAS;AACzC,oBAAQ,IAAI,UAAU,KAAK,UAAK,MAAM,EAAE,CAAC;AAAA,UAC3C;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,UAAU,MAAM,4BAAuB,CAAC;AAEpD,YAAI,aAAa,OAAO,SAAS,GAAG;AAClC,kBAAQ,IAAI,UAAU,UAAU,sBAAiB,CAAC;AAClD,qBAAW,SAAS,aAAa,QAAQ;AACvC,oBAAQ,IAAI,UAAU,MAAM,UAAK,KAAK,EAAE,CAAC;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,IAAI,EAAE;AAAA,IAChB;AAAA,EACF;AAEA,UAAQ,IAAI,UAAU,IAAI;AAAA,mCAAiC,KAAK,IAAI,IAAI,SAAS,IAAI,CAAC;AAGtF,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,EACT,WAAW,QAAQ,UAAU,QAAQ,OAAO;AAC1C,UAAM,eAAe,MAAM,aAAa,gBAAgB;AACxD,WAAO,aAAa,WAAW,IAAI;AAAA,EACrC,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEA,eAAe,0BAA0B,cAAoD;AAC3F,UAAQ,IAAI,UAAU,UAAU,+BAAwB,CAAC;AAEzD,MAAI;AACF,UAAM,QAAQ,MAAM,aAAa,cAAc;AAE/C,YAAQ,IAAI,UAAU,KAAK,cAAc,MAAM,WAAW,QAAQ,IAAI,EAAE,CAAC;AACzE,YAAQ,IAAI,UAAU,KAAK,sBAAsB,MAAM,kBAAkB,QAAQ,IAAI,EAAE,CAAC;AAExF,QAAI,MAAM,cAAc;AACtB,YAAM,WAAW,KAAK,OAAO,KAAK,IAAI,IAAI,MAAM,aAAa,QAAQ,MAAM,MAAO,KAAK,GAAG;AAC1F,cAAQ,IAAI,UAAU,KAAK,cAAc,QAAQ,QAAQ,CAAC;AAAA,IAC5D;AAEA,YAAQ,IAAI,UAAU,KAAK,mBAAmB,MAAM,gBAAgB,OAAO,EAAE,CAAC;AAC9E,YAAQ,IAAI,UAAU,KAAK,gBAAgB,MAAM,YAAY,MAAM,QAAQ,CAAC,CAAC,KAAK,CAAC;AAGnF,YAAQ,IAAI,UAAU,UAAU,4BAAuB,CAAC;AACxD,YAAQ,IAAI,UAAU,KAAK,mBAAmB,MAAM,mBAAmB,YAAY,IAAI,CAAC;AACxF,YAAQ,IAAI,UAAU,KAAK,qBAAqB,MAAM,mBAAmB,cAAc,IAAI,CAAC;AAC5F,YAAQ,IAAI,UAAU,KAAK,sBAAsB,MAAM,mBAAmB,eAAe,IAAI,CAAC;AAG9F,YAAQ,IAAI,UAAU,UAAU,0BAAmB,CAAC;AACpD,YAAQ,IAAI,UAAU,KAAK,aAAa,MAAM,iBAAiB,CAAC,EAAE,CAAC;AACnE,YAAQ,IAAI,UAAU,KAAK,UAAU,MAAM,UAAU,EAAE,CAAC;AACxD,YAAQ,IAAI,UAAU,KAAK,WAAW,MAAM,WAAW,EAAE,CAAC;AAC1D,YAAQ,IAAI,UAAU,KAAK,UAAU,MAAM,UAAU,EAAE,CAAC;AACxD,YAAQ,IAAI,UAAU,KAAK,QAAQ,MAAM,QAAQ,EAAE,CAAC;AAAA,EAEtD,SAAS,OAAO;AACd,YAAQ,IAAI,UAAU,QAAQ,yCAAyC,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE,CAAC;AAAA,EACpI;AAEA,UAAQ,IAAI,EAAE;AAChB;AAhOA,IAKAC;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB;AACA;AACA;AASgB;AA0CD;AAiIA;AAAA;AAAA;;;AC5Lf,IAKAC,KACAC,OAGa;AATb;AAAA;AAAA;AAAA;AAKA,IAAAD,MAAoB;AACpB,IAAAC,QAAsB;AAGf,IAAM,0BAAN,MAAM,wBAA8C;AAAA,MACjD;AAAA;AAAA,MAGA,WAMJ;AAAA,QACF,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MAEQ;AAAA,MAER,YAAY,QAAuB,aAAqB;AACtD,aAAK,SAAS;AACd,aAAK,eAAoB,WAAK,aAAa,iBAAiB,eAAe;AAC3E,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKO,kBAAkB,QAAwB;AAC/C,cAAM,SAAS,KAAK,OAAO,mBAAmB,kBAAkB;AAChE,cAAM,KAAK,GAAG,MAAM,IAAI,KAAK,SAAS,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AACzE,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,eAAe,QAAwB;AAC5C,cAAM,KAAK,GAAG,KAAK,OAAO,mBAAmB,WAAW,IAAI,KAAK,SAAS,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAC1G,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,gBAAgB,UAAkB,QAAwB;AAC/D,cAAM,KAAK,GAAG,KAAK,OAAO,mBAAmB,YAAY,IAAI,KAAK,SAAS,MAAM,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAC5G,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,eAAe,WAAmB,QAAwB;AAC/D,cAAM,KAAK,GAAG,KAAK,OAAO,mBAAmB,WAAW,IAAI,KAAK,SAAS,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAC1G,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,aAAa,WAAmB,QAAwB;AAC7D,cAAM,SAAS,KAAK,OAAO,mBAAmB,aAAa;AAC3D,cAAM,KAAK,GAAG,MAAM,IAAI,KAAK,SAAS,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AACpE,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKO,iBAAiB,QAAgB,OAAuB;AAE7D,cAAM,iBAAiB,MACpB,YAAY,EACZ,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,GAAG,EAClB,MAAM,GAAG,EAAE,EACX,QAAQ,UAAU,EAAE;AAEvB,eAAO,GAAG,MAAM,IAAI,cAAc,GAAG,KAAK,OAAO,mBAAmB,cAAc;AAAA,MACpF;AAAA;AAAA;AAAA;AAAA,MAKO,WAAW,MAA4D;AAC5E,cAAM,SACJ,KAAK,OAAO,mBAAmB,GAAG,IAAI,SAAS,MAC9C,SAAS,YAAY,QAAQ,SAAS,OAAO,OAAO;AACvD,cAAM,UAAU,KAAK,SAAS,IAAI;AAClC,eAAO,GAAG,MAAM,IAAI,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,MACzD;AAAA;AAAA;AAAA;AAAA,MAKO,gBAAsB;AAC3B,aAAK,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE;AAChE,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKO,cAAoC;AACzC,eAAO,EAAE,GAAG,KAAK,SAAS;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKO,WAAW,MAAoD,OAAqB;AACzF,aAAK,SAAS,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK;AACvC,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKO,mBAAmB,aAA2B;AACnD,cAAM,WAAgB,WAAK,aAAa,KAAK,OAAO,UAAU,SAAS;AACvE,cAAM,YAAiB,WAAK,aAAa,KAAK,OAAO,UAAU,UAAU;AACzE,cAAM,WAAgB,WAAK,aAAa,KAAK,OAAO,UAAU,SAAS;AAGvE,cAAM,aAAa,KAAK,OAAO,mBAAmB;AAClD,cAAM,cAAc,IAAI,OAAO,GAAG,UAAU,SAAS;AACrD,YAAI,UAAU;AAEd,YAAO,eAAW,QAAQ,GAAG;AAC3B,gBAAM,YAAe,gBAAY,QAAQ;AACzC,qBAAW,QAAQ,WAAW;AAC5B,kBAAM,QAAQ,KAAK,MAAM,WAAW;AACpC,gBAAI,OAAO;AACT,wBAAU,KAAK,IAAI,SAAS,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC;AAAA,YACpD;AAAA,UACF;AAAA,QACF;AAGA,cAAM,cAAc,KAAK,OAAO,mBAAmB;AACnD,cAAM,eAAe,IAAI,OAAO,GAAG,WAAW,SAAS;AACvD,YAAI,WAAW;AAEf,YAAO,eAAW,SAAS,GAAG;AAC5B,gBAAM,aAAgB,gBAAY,SAAS;AAC3C,qBAAW,QAAQ,YAAY;AAC7B,kBAAM,QAAQ,KAAK,MAAM,YAAY;AACrC,gBAAI,OAAO;AACT,yBAAW,KAAK,IAAI,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,QACF;AAGA,cAAM,aAAa,KAAK,OAAO,mBAAmB;AAClD,cAAM,cAAc,IAAI,OAAO,GAAG,UAAU,SAAS;AACrD,YAAI,UAAU;AAEd,YAAO,eAAW,QAAQ,GAAG;AAC3B,gBAAM,YAAe,gBAAY,QAAQ;AACzC,qBAAW,QAAQ,WAAW;AAC5B,kBAAM,QAAQ,KAAK,MAAM,WAAW;AACpC,gBAAI,OAAO;AACT,wBAAU,KAAK,IAAI,SAAS,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC;AAAA,YACpD;AAAA,UACF;AAAA,QACF;AAGA,aAAK,SAAS,OAAO,UAAU;AAC/B,aAAK,SAAS,QAAQ,WAAW;AACjC,aAAK,SAAS,OAAO,UAAU;AAE/B,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAqB;AAC3B,YAAI;AACF,cAAO,eAAW,KAAK,YAAY,GAAG;AACpC,kBAAM,OAAU,iBAAa,KAAK,cAAc,MAAM;AACtD,kBAAM,SAAS,KAAK,MAAM,IAAI;AAG9B,iBAAK,SAAS,UAAU,KAAK,IAAI,GAAG,OAAO,WAAW,CAAC;AACvD,iBAAK,SAAS,OAAO,KAAK,IAAI,GAAG,OAAO,QAAQ,CAAC;AACjD,iBAAK,SAAS,QAAQ,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;AACnD,iBAAK,SAAS,OAAO,KAAK,IAAI,GAAG,OAAO,QAAQ,CAAC;AACjD,iBAAK,SAAS,KAAK,KAAK,IAAI,GAAG,OAAO,MAAM,CAAC;AAAA,UAC/C;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,4CAA4C,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACtG;AAAA,QAEF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAqB;AAC3B,YAAI;AACF,gBAAM,MAAW,cAAQ,KAAK,YAAY;AAC1C,cAAI,CAAI,eAAW,GAAG,GAAG;AACvB,YAAG,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,UACvC;AAEA,gBAAM,OAAO,KAAK,UAAU,KAAK,UAAU,MAAM,CAAC;AAClD,UAAG,kBAAc,KAAK,cAAc,MAAM,MAAM;AAAA,QAClD,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACtF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKO,WAAW,IAAY,MAA6D;AACzF,cAAM,SACJ,KAAK,OAAO,mBAAmB,GAAG,IAAI,SAAS,MAC9C,SAAS,YAAY,QAAQ,SAAS,OAAO,OAAO;AACvD,cAAM,UAAU,IAAI,OAAO,IAAI,MAAM,UAAU;AAC/C,eAAO,QAAQ,KAAK,EAAE;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKO,gBACL,IACA,MACe;AACf,cAAM,SACJ,KAAK,OAAO,mBAAmB,GAAG,IAAI,SAAS,MAC9C,SAAS,YAAY,QAAQ,SAAS,OAAO,OAAO;AACvD,cAAM,UAAU,IAAI,OAAO,IAAI,MAAM,YAAY;AACjD,cAAM,QAAQ,GAAG,MAAM,OAAO;AAC9B,eAAO,QAAQ,SAAS,MAAM,CAAC,GAAG,EAAE,IAAI;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA,MAKO,iBACL,MACA,OACU;AACV,cAAM,MAAgB,CAAC;AACvB,cAAM,SACJ,KAAK,OAAO,mBAAmB,GAAG,IAAI,SAAS,MAC9C,SAAS,YAAY,QAAQ,SAAS,OAAO,OAAO;AAEvD,iBAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,gBAAM,KAAK,GAAG,MAAM,IAAI,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AACvE,cAAI,KAAK,EAAE;AACX,eAAK,SAAS,IAAI;AAAA,QACpB;AAEA,aAAK,aAAa;AAClB,eAAO;AAAA,MACT;AAAA,IACF;AAvR2D;AAApD,IAAM,yBAAN;AAAA;AAAA;;;ACmBA,SAAS,oBAA6B;AAC3C,QAAM,UAAU,IAAI,2BAAQ,MAAM;AAElC,UACG,YAAY,mEAAmE,EAC/E,SAAS,kBAAkB,qBAAqB,EAChD,OAAO,yBAAyB,mDAAmD,EACnF,OAAO,iBAAiB,wDAAwD,SAAS,EACzF,OAAO,yBAAyB,4BAA4B,EAC5D;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,WAAW,4BAA4B,EAC9C,OAAO,iBAAiB,wBAAwB,EAChD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBF,EACC,OAAO,OAAO,aAAsB,UAAuB,CAAC,MAAM;AACjE,QAAI;AAEF,UAAI,mBAAmB,eAAe,QAAQ;AAG9C,UAAI,CAAC,kBAAkB;AACrB,cAAM,YAAY,MAAM,yBAAyB;AACjD,YAAI,WAAW;AACb,6BAAmB;AAAA,QACrB;AAAA,MACF;AAEA,UAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,MAAM,QAAQ,QAAQ;AAAA,QACtB,UAAU,QAAQ,YAAY,QAAQ,IAAI,QAAQ;AAAA,QAClD,gBAAgB,QAAQ,kBAAkB,QAAQ,IAAI,iBAAiB;AAAA,QACvE,OAAO,QAAQ,SAAS;AAAA,MAC1B;AAGA,YAAM,uBACJ,QAAQ,eACP,CAAC,QAAQ,mBAAmB,CAAC,oBAAoB,CAAC,iBAAiB;AAGtE,UAAI,sBAAsB;AACxB,YAAI,iBAAiB,GAAG;AACtB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,iBAAS,MAAM,oBAAoB,MAAM;AAAA,MAC3C,WAAW,QAAQ,mBAAmB,CAAC,OAAO,MAAM;AAClD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAGA,YAAM,mBAAmB,OAAO,QAAQ;AACxC,UAAI,CAAC,8BAA8B,KAAK,gBAAgB,GAAG;AACzD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,cAAmB,cAAQ,QAAQ,IAAI,GAAG,gBAAgB;AAGhE,UAAO,gBAAW,WAAW,KAAK,CAAC,OAAO,OAAO;AAC/C,gBAAQ,MAAM,mBAAc,gBAAgB,kBAAkB;AAC9D,gBAAQ,IAAI,qDAA8C;AAC1D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,cAAU,YAAAC,SAAI,sCAAsC,EAAE,MAAM;AAElE,UAAI;AAEF,YAAI,CAAI,gBAAW,WAAW,GAAG;AAC/B,UAAG,eAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,QAC/C;AAGA,cAAM,gBAAgB,IAAI,cAAc,WAAW;AACnD,cAAM,gBAAgB,cAAc,oBAAoB,kBAAkB;AAAA,UACxE,aAAa,gBAAgB,OAAO,IAAI,aAAa,gBAAgB;AAAA,UACrE,kBAAkB,OAAO;AAAA,UACzB,iBAAiB,OAAO;AAAA,QAC1B,CAAC;AAED,gBAAQ,OAAO;AAGf,sBAAc,uBAAuB,aAAa;AAClD,sBAAc,WAAW,aAAa;AAEtC,gBAAQ,OAAO;AAGf,cAAM,kBAAkB,IAAI,gBAAgB;AAC5C,cAAM,eAAe,IAAI,oBAAoB,eAAe,WAAW;AACvE,cAAM,QAAQ,aAAa,gBAAgB;AAE3C,wBAAgB,gBAAgB,MAAM,cAAc,OAAO,KAAK;AAEhE,gBAAQ,OAAO;AAGf,cAAM,cAAc,IAAI,uBAAuB,eAAe,WAAW;AAEzE,gBAAQ,OAAO;AAGf,cAAM,mBAAmB,aAAa,eAAe,WAAW;AAEhE,gBAAQ,OAAO;AAGf,4BAAoB,aAAa,kBAAkB,OAAO,MAAM,aAAa;AAG7E,wBAAgB,WAAW;AAE3B,gBAAQ,QAAQ,gDAAgD;AAGhE,gBAAQ,IAAI;AAAA,kCACK,gBAAgB;AAAA;AAAA,gBAE3B,OAAO,IAAI;AAAA,YACf,WAAW;AAAA;AAAA,mBAEJ,OAAO,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAOlC,OAAO,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWnB,gBAAgB;AAAA;AAAA;AAAA,QAGhB,OAAO,cAAc,WAAW,OAAO,cAAc,YAAY,OAAO,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAgB7F;AAAA,MACO,SAAS,OAAO;AACd,gBAAQ,KAAK,+BAA+B;AAC5C,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,wCAAmC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC7F;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAKA,SAAS,mBAA4B;AACnC,SAAO,CAAC,QAAQ,OAAO,SAAS,CAAC,QAAQ,MAAM,SAAS,QAAQ,IAAI,OAAO;AAC7E;AAKA,eAAe,2BAAmD;AAChE,SAAO,IAAI,QAAQ,CAACC,aAAY;AAE9B,QAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,UAAI,QAAQ;AACZ,UAAI,WAAW;AAEf,YAAM,UAAU,WAAW,MAAM;AAC/B,YAAI,CAAC,UAAU;AACb,qBAAW;AACX,UAAAA,SAAQ,IAAI;AAAA,QACd;AAAA,MACF,GAAG,GAAG;AAEN,cAAQ,MAAM,YAAY,MAAM;AAGhC,cAAQ,MAAM,GAAG,QAAQ,CAAC,UAAU;AAClC,iBAAS,MAAM,SAAS;AAAA,MAC1B,CAAC;AAED,cAAQ,MAAM,GAAG,OAAO,MAAM;AAC5B,YAAI,CAAC,UAAU;AACb,qBAAW;AACX,uBAAa,OAAO;AACpB,gBAAM,cAAc,MAAM,KAAK;AAC/B,UAAAA,SAAQ,eAAe,IAAI;AAAA,QAC7B;AAAA,MACF,CAAC;AAGD,cAAQ,MAAM,GAAG,SAAS,MAAM;AAC9B,YAAI,CAAC,UAAU;AACb,qBAAW;AACX,uBAAa,OAAO;AACpB,UAAAA,SAAQ,IAAI;AAAA,QACd;AAAA,MACF,CAAC;AAGD,mBAAa,MAAM;AACjB,YAAI,CAAC,YAAY,QAAQ,MAAM,UAAU;AACvC,gBAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,cAAI,UAAU,MAAM;AAClB,qBAAS,MAAM,SAAS;AAAA,UAC1B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,MAAAA,SAAQ,IAAI;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAEA,eAAe,oBAAoB,eAAoB;AACrD,UAAQ,IAAI;AAAA;AAAA,CAEb;AAGC,MAAI,iBAAiB,GAAG;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,iBAAAC,QAAS,OAAO;AAAA,MACpC;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,cAAc,QAAQ;AAAA,QAC/B,UAAU,wBAAC,UAAkB;AAC3B,cAAI,CAAC,8BAA8B,KAAK,KAAK,GAAG;AAC9C,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT,GALU;AAAA,MAMZ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,MAAM,sDAA+C,OAAO,WAAW;AAAA,UACzE,EAAE,MAAM,uDAAgD,OAAO,WAAW;AAAA,UAC1E,EAAE,MAAM,sDAA+C,OAAO,WAAW;AAAA,UACzE,EAAE,MAAM,gDAAyC,OAAO,UAAU;AAAA,QACpE;AAAA,QACA,SAAS,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,cAAc,kBAAkB;AAAA,QACzC,UAAU,wBAAC,UAAkB;AAC3B,cAAI,CAAC,+BAA+B,KAAK,KAAK,GAAG;AAC/C,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT,GALU;AAAA,MAMZ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,cAAc;AAAA,QACvB,MAAM,wBAACC,aAAe,gBAAgB,cAAQ,QAAQ,IAAI,GAAGA,SAAQ,IAAI,CAAC,GAApE;AAAA,MACR;AAAA,IACF,CAAC;AAED,WAAO,EAAE,GAAG,eAAe,GAAG,QAAQ;AAAA,EACxC,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,UACE,MAAM,QAAQ,SAAS,8BAA8B,KACrD,MAAM,QAAQ,SAAS,gBAAgB,KACvC,MAAM,QAAQ,SAAS,UAAU,GACjC;AACA,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,IACR;AACA,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AACF;AAEA,eAAe,mBACb,aACA,QACA,aACe;AACf,QAAM,SAAS,IAAI,kBAAkB;AAIrC,QAAM,eAAe,IAAI,oBAAoB,QAAQ,WAAW;AAChE,QAAM,QAAQ,aAAa,gBAAgB;AAG3C,QAAM,SAAS,YAAY,eAAe,uCAAuC;AACjF,QAAM,WAAgB;AAAA,IACpB,MAAM;AAAA,IACN,YAAY,iBAAiB,QAAQ,uCAAuC;AAAA,EAC9E;AAEA,QAAM,WAAW;AAAA,IACf,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU,OAAO,oBAAoB;AAAA,IACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,YAAY,CAAC,iBAAiB,uBAAuB,YAAY;AAAA,IACjE,gBAAgB,CAAC,UAAU;AAAA,IAC3B,aAAa;AAAA,IACb,MAAM,CAAC,SAAS,YAAY;AAAA,IAC5B,WAAW;AAAA,EACb;AAEA,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBpB,SAAO,UAAU,UAAU,UAAU,WAAW;AAGhD,QAAM,UAAU,YAAY,gBAAgB,QAAQ,+BAA+B;AACnF,QAAM,YAAiB;AAAA,IACrB,MAAM;AAAA,IACN,YAAY,iBAAiB,SAAS,+BAA+B;AAAA,EACvE;AAEA,QAAM,YAAY;AAAA,IAChB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU,OAAO,oBAAoB;AAAA,IACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,YAAY,CAAC,qBAAqB,WAAW,eAAe;AAAA,IAC5D,eAAe,CAAC,YAAY,UAAU;AAAA,IACtC,aAAa;AAAA,IACb,MAAM,CAAC,SAAS,aAAa;AAAA,IAC7B,cAAc,CAAC;AAAA,EACjB;AAEA,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBrB,SAAO,WAAW,WAAW,WAAW,YAAY;AAGpD,QAAM,UAAU,YAAY,eAAe,SAAS,yCAAyC;AAC7F,QAAM,YAAiB;AAAA,IACrB,MAAM;AAAA,IACN,YAAY,iBAAiB,SAAS,yCAAyC;AAAA,EACjF;AAEA,QAAM,YAAY;AAAA,IAChB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU,OAAO,oBAAoB;AAAA,IACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,YAAY,CAAC,qBAAqB,iBAAiB,OAAO;AAAA,IAC1D,aAAa;AAAA,IACb,MAAM,CAAC,SAAS,OAAO;AAAA,IACvB,eAAe;AAAA,IACf,cAAc,CAAC;AAAA,EACjB;AAEA,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BrB,SAAO,UAAU,WAAW,WAAW,YAAY;AAGnD,QAAM,UAAU,YAAY,eAAe,SAAS,wCAAwC;AAC5F,QAAM,YAAiB;AAAA,IACrB,MAAM;AAAA,IACN,YAAY,iBAAiB,SAAS,wCAAwC;AAAA,EAChF;AAEA,QAAM,YAAY;AAAA,IAChB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU,OAAO,oBAAoB;AAAA,IACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,YAAY,CAAC,iBAAiB,eAAe,YAAY;AAAA,IACzD,aAAa;AAAA,IACb,MAAM,CAAC,iBAAiB,OAAO;AAAA,IAC/B,eAAe;AAAA,IACf,cAAc,CAAC,UAAU;AAAA,EAC3B;AAEA,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BrB,SAAO,UAAU,WAAW,WAAW,YAAY;AACrD;AAEA,SAAS,oBACP,aACA,aACA,aACA,QACM;AACN,QAAM,WAAW,OAAO,mBAAmB;AAC3C,QAAM,gBAAgB,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA,oBAIpB,WAAW;AAAA,gBAChB,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,uBAC9B,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7B,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKP,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAYC,OAAO,mBAAmB,WAAW;AAAA,gBACpC,OAAO,mBAAmB,YAAY;AAAA,eACvC,OAAO,mBAAmB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAO/C,QAAQ;AAAA;AAAA;AAAA,KAGR,QAAQ;AAAA;AAAA;AAAA,KAGR,QAAQ;AAAA;AAAA;AAAA,KAGR,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAmDD,OAAO,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCA8CG,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA;AAG1E,EAAG,mBAAmB,WAAK,aAAa,WAAW,GAAG,eAAe,MAAM;AAC7E;AAEA,SAAS,gBAAgB,aAA2B;AAClD,QAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuDzB,EAAG,mBAAmB,WAAK,aAAa,YAAY,GAAG,kBAAkB,MAAM;AACjF;AAh0BA,IAKAC,MACAC,OACAC,oBACAC,kBACAC;AATA;AAAA;AAAA;AAAA;AAKA,IAAAJ,OAAoB;AACpB,IAAAC,QAAsB;AACtB,IAAAC,qBAAwB;AACxB,IAAAC,mBAAqB;AACrB,IAAAC,cAAgB;AAEhB;AACA;AACA;AACA;AACA;AAagB;AAwNP;AAOM;AAsDA;AAmFA;AAmON;AAgKA;AAAA;AAAA;;;ACxvBF,SAAS,2BAAoC;AAClD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,2BAA2B,EACvC,SAAS,cAAc,oBAAoB,EAC3C,SAAS,cAAc,uBAAuB,EAC9C,OAAO,aAAa,+CAA+C,EACnE,OAAO,OAAO,SAAiB,UAAkB,YAA2B;AAC3E,QAAI;AACF,YAAM,YAAY,SAAS,UAAU,OAAO;AAAA,IAC9C,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACrF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YACb,SACA,UACA,SACe;AACf,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,QAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAM,YAAY,oBAAoB,kBAAkB,OAAO;AAC/D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,EAC/C;AAEA,QAAM,QAAQ,UAAU;AACxB,QAAM,kBAAkB,MAAM;AAE9B,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,oCAAoC,CAAC;AAChE,YAAQ,IAAI,UAAU,MAAM,aAAa,OAAO,EAAE,CAAC;AACnD,YAAQ,IAAI,UAAU,MAAM,UAAU,MAAM,KAAK,EAAE,CAAC;AACpD,YAAQ,IAAI,UAAU,MAAM,qBAAqB,eAAe,EAAE,CAAC;AACnE,YAAQ,IAAI,UAAU,MAAM,iBAAiB,QAAQ,EAAE,CAAC;AACxD;AAAA,EACF;AAEA,MAAI,oBAAoB,UAAU;AAChC,YAAQ,IAAI,UAAU,QAAQ,SAAS,OAAO,2BAA2B,QAAQ,EAAE,CAAC;AACpF;AAAA,EACF;AAGA,QAAM,gBAAgB,OAAO,WAAW,MAAM,WAAW;AAAA,IACvD;AAAA,IACA,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvC,CAAC;AAGD,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,8BAA8B,CAAC;AAC7D,UAAQ,IAAI,UAAU,KAAK,aAAa,OAAO,EAAE,CAAC;AAClD,UAAQ,IAAI,UAAU,KAAK,UAAU,MAAM,KAAK,EAAE,CAAC;AACnD,UAAQ,IAAI,UAAU,KAAK,sBAAsB,eAAe,EAAE,CAAC;AACnE,UAAQ,IAAI,UAAU,KAAK,iBAAiB,QAAQ,EAAE,CAAC;AACzD;AA5FA,IAKAC;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB;AACA;AACA;AACA;AAMgB;AAwBD;AAAA;AAAA;;;ACtBR,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAI,2BAAQ,OAAO;AAE/B,MACG,YAAY,2CAA2C,EACvD,SAAS,cAAc,2BAA2B,EAClD,OAAO,wBAAwB,wBAAwB,EACvD,OAAO,eAAe,+CAA+C,EACrE,OAAO,aAAa,2CAA2C,EAC/D,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,OAAO,SAAiB,YAA+B;AAC7D,QAAI;AACF,YAAM,iBAAiB,SAAS,OAAO;AAAA,IACzC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACpF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,iBAAiB,SAAiB,SAA2C;AAC1F,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,QAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAM,YAAY,oBAAoB,kBAAkB,OAAO;AAC/D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,EAC/C;AAEA,QAAM,EAAE,OAAO,MAAM,IAAI;AAGzB,MAAI,MAAM,WAAW,aAAa;AAChC,YAAQ,IAAI,UAAU,QAAQ,SAAS,OAAO,qBAAqB,CAAC;AACpE;AAAA,EACF;AAGA,QAAM,kBAAkB,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW;AAG1E,MAAI,QAAQ,SAAS;AACnB,YAAQ,IAAI,UAAU,KAAK,UAAU,MAAM,KAAK,EAAE,CAAC;AACnD,YAAQ,IAAI,UAAU,KAAK,mBAAmB,MAAM,MAAM,EAAE,CAAC;AAC7D,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,gBAAgB,SAAS,KAAK,CAAC,QAAQ,OAAO;AAChD,YAAQ,IAAI,UAAU,QAAQ,6BAA6B,CAAC;AAE5D,eAAW,QAAQ,gBAAgB,MAAM,GAAG,CAAC,GAAG;AAC9C,cAAQ,IAAI,YAAO,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,GAAG;AAAA,IACnE;AACA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAQ,IAAI,aAAa,gBAAgB,SAAS,CAAC,OAAO;AAAA,IAC5D;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,uDAAuD,CAAC;AAEnF,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAGA,QAAM,UAAU;AAAA,IACd,QAAQ;AAAA,IACR,uBAAuB;AAAA,IACvB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvC;AAGA,MAAI,QAAQ,SAAS;AACnB,YAAQ,kBAAkB,QAAQ;AAAA,EACpC;AAGA,UAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,SAAS,eAAe,EAAE,gBAAgB,CAAC;AACjF,UAAQ,IAAI,YAAY,MAAM,QAAQ,MAAM,MAAM,KAAK,EAAE;AACzD,UAAQ,IAAI,aAAa,MAAM,MAAM,mBAAc;AACnD,UAAQ,IAAI,eAAe,MAAM,yBAAyB,CAAC,eAAU;AAErE,MAAI,QAAQ,SAAS;AACnB,YAAQ,IAAI,cAAc,QAAQ,OAAO,EAAE;AAAA,EAC7C;AAEA,MAAI,QAAQ,QAAQ;AAClB;AAAA,EACF;AAGA,MAAI;AACF,UAAM,eAAe,OAAO,WAAW,MAAM,WAAW,OAAO;AAG/D,wBAAoB,aAAa;AAEjC,YAAQ,IAAI,UAAU,QAAQ,4BAA4B,CAAC;AAC3D,YAAQ,IAAI,UAAU,KAAK,aAAa,OAAO,EAAE,CAAC;AAClD,YAAQ,IAAI,UAAU,KAAK,UAAU,aAAa,KAAK,EAAE,CAAC;AAC1D,YAAQ,IAAI,UAAU,KAAK,WAAW,aAAa,MAAM,EAAE,CAAC;AAC5D,YAAQ,IAAI,UAAU,KAAK,eAAc,oBAAI,KAAK,GAAE,mBAAmB,CAAC,EAAE,CAAC;AAE3E,QAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAQ,IAAI,UAAU,QAAQ,SAAS,gBAAgB,MAAM,2BAA2B,CAAC;AAAA,IAC3F;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IAC1F;AAAA,EACF;AACF;AA/IA,IAIAC;AAJA;AAAA;AAAA;AAAA;AAIA,IAAAA,qBAAwB;AACxB;AACA;AACA;AACA;AASgB;AA0BD;AAAA;AAAA;;;ACvBR,SAAS,6BAAsC;AACpD,QAAM,MAAM,IAAI,2BAAQ,UAAU;AAElC,MACG,YAAY,4BAA4B,EACxC,SAAS,cAAc,sBAAsB,EAC7C,OAAO,eAAe,0CAA0C,EAChE,OAAO,4BAA4B,wBAAwB,EAC3D,OAAO,6BAA6B,sBAAsB,EAC1D,OAAO,wBAAwB,wBAAwB,EACvD,OAAO,yBAAyB,wCAAwC,EACxE,OAAO,aAAa,iDAAiD,EACrE,OAAO,OAAO,SAAiB,YAA6B;AAC3D,QAAI;AACF,YAAM,cAAc,SAAS,OAAO;AAAA,IACtC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACvF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,cAAc,SAAiB,SAAyC;AACrF,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,QAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAM,YAAY,oBAAoB,kBAAkB,OAAO;AAC/D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,EAC/C;AAEA,QAAM,EAAE,OAAO,MAAM,IAAI;AAGzB,MAAI,MAAM,WAAW,aAAa;AAChC,YAAQ,IAAI,UAAU,QAAQ,SAAS,OAAO,wBAAwB,CAAC;AACvE;AAAA,EACF;AAGA,QAAM,kBAAkB,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW;AAG1E,UAAQ,IAAI,UAAU,KAAK,UAAU,MAAM,KAAK,EAAE,CAAC;AACnD,UAAQ,IAAI,UAAU,KAAK,mBAAmB,MAAM,MAAM,EAAE,CAAC;AAC7D,UAAQ,IAAI,EAAE;AAGd,QAAM,qBACJ,MAAM,SAAS,KAAM,MAAM,SAAS,gBAAgB,UAAU,MAAM,SAAU,MAAM;AAEtF,UAAQ,IAAI,UAAU,QAAQ,oBAAoB,CAAC;AACnD,UAAQ;AAAA,IACN,YAAY,MAAM,SAAS,gBAAgB,MAAM,IAAI,MAAM,MAAM,eAAe,mBAAmB,QAAQ,CAAC,CAAC;AAAA,EAC/G;AACA,UAAQ,IAAI,EAAE;AAGd,MAAI,gBAAgB,SAAS,KAAK,CAAC,QAAQ,SAAS,CAAC,QAAQ,mBAAmB;AAC9E,YAAQ,IAAI,UAAU,QAAQ,6BAA6B,CAAC;AAE5D,eAAW,QAAQ,gBAAgB,MAAM,GAAG,CAAC,GAAG;AAC9C,cAAQ,IAAI,cAAS,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,GAAG;AAAA,IACrE;AACA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAQ,IAAI,eAAe,gBAAgB,SAAS,CAAC,OAAO;AAAA,IAC9D;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,UAAU,CAAC;AACtC,YAAQ,IAAI,oCAAoC;AAChD,YAAQ,IAAI,qDAAqD;AACjE,YAAQ,IAAI,mCAAmC;AAE/C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAU;AAAA,IACd,QAAQ;AAAA,IACR,uBAAuB;AAAA,IACvB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvC;AAEA,MAAI,QAAQ,iBAAiB,QAAW;AACtC,IAAC,QAAgB,gBAAgB,SAAS,QAAQ,aAAa,SAAS,GAAG,EAAE;AAAA,EAC/E;AAGA,MAAI,QAAQ,SAAS;AACnB,IAAC,QAAgB,qBAAqB,QAAQ;AAAA,EAChD;AAGA,QAAM,cAAc,CAAC;AAErB,MAAI,QAAQ,mBAAmB;AAC7B,eAAW,QAAQ,iBAAiB;AAClC,kBAAY,KAAK;AAAA,QACf,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,UAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,SAAS,eAAe,EAAE,iBAAiB,CAAC;AAClF,UAAQ,IAAI,YAAY,MAAM,QAAQ,MAAM,MAAM,KAAK,EAAE;AACzD,UAAQ,IAAI,eAAe,MAAM,MAAM,mBAAc;AACrD,UAAQ,IAAI,iBAAiB,MAAM,yBAAyB,CAAC,eAAU;AAEvE,MAAI,QAAQ,iBAAiB,QAAW;AACtC,YAAQ,IAAI,sBAAsB,MAAM,iBAAiB,CAAC,WAAM,QAAQ,YAAY,EAAE;AAAA,EACxF;AAEA,MAAI,QAAQ,SAAS;AACnB,YAAQ,IAAI,gBAAgB,QAAQ,OAAO,EAAE;AAAA,EAC/C;AAEA,MAAI,YAAY,SAAS,GAAG;AAC1B,YAAQ,IAAI,YAAY,YAAY,MAAM,IAAI;AAC9C,eAAW,QAAQ,aAAa;AAC9B,cAAQ,IAAI,cAAS,KAAK,EAAE,oBAAe;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB;AAAA,EACF;AAGA,MAAI;AAEF,UAAM,eAAe,OAAO,WAAW,MAAM,WAAW,OAAO;AAG/D,eAAW,QAAQ,aAAa;AAC9B,aAAO,WAAW,KAAK,UAAU,KAAK,OAAO;AAAA,IAC/C;AAGA,wBAAoB,aAAa;AAEjC,YAAQ,IAAI,UAAU,QAAQ,+BAA+B,CAAC;AAC9D,YAAQ,IAAI,UAAU,KAAK,aAAa,OAAO,EAAE,CAAC;AAClD,YAAQ,IAAI,UAAU,KAAK,UAAU,aAAa,KAAK,EAAE,CAAC;AAC1D,YAAQ,IAAI,UAAU,KAAK,WAAW,aAAa,MAAM,EAAE,CAAC;AAC5D,YAAQ,IAAI,UAAU,KAAK,aAAa,aAAa,qBAAqB,GAAG,CAAC;AAE9E,QAAI,aAAa,eAAe;AAC9B,cAAQ,IAAI,UAAU,KAAK,kBAAkB,aAAa,aAAa,EAAE,CAAC;AAE1E,UAAI,aAAa,mBAAmB,GAAG;AACrC,cAAM,aAAa,aAAa,gBAAgB,aAAa;AAC7D,cAAM,oBACJ,cAAc,IACV,UAAU,QAAQ,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG,IACrD,UAAU,QAAQ,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC3D,gBAAQ,IAAI,UAAU,KAAK,qBAAqB,iBAAiB,EAAE,CAAC;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,GAAG;AAC1B,cAAQ,IAAI,UAAU,KAAK,kBAAkB,YAAY,MAAM,SAAS,CAAC;AAAA,IAC3E;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,qCAA8B,CAAC;AAC7D,YAAQ,IAAI,YAAO,MAAM,MAAM,cAAc;AAC7C,YAAQ,IAAI,0BAAoB,oBAAI,KAAK,GAAE,mBAAmB,CAAC,EAAE;AAEjE,QAAI,QAAQ,iBAAiB;AAC3B,cAAQ,IAAI,mBAAc,QAAQ,eAAe,EAAE;AAAA,IACrD;AAEA,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,qBAAgB,QAAQ,OAAO,EAAE;AAAA,IAC/C;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IACrF;AAAA,EACF;AACF;AAhOA,IAKAC;AALA,IAAAC,iBAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB;AACA;AACA;AACA;AAWgB;AA4BD;AAAA;AAAA;;;ACdR,SAAS,2BAAoC;AAClD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,gDAAgD,EAC5D,SAAS,WAAW,8CAA8C,EAClE,OAAO,kBAAkB,kDAAkD,EAC3E,OAAO,wBAAwB,0CAA0C,EACzE,OAAO,4BAA4B,mBAAmB,EACtD,OAAO,6BAA6B,mBAAmB,EACvD,OAAO,0BAA0B,6CAA6C,QAAQ,EACtF;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,yBAAyB,mBAAmB,SAAS,EAC5D,OAAO,+BAA+B,yBAAyB,GAAG,EAClE,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,0BAA0B,gBAAgB,EACjD,OAAO,wBAAwB,gCAAgC,EAC/D,OAAO,oBAAoB,uCAAuC,EAClE,OAAO,aAAa,6CAA6C,EACjE,OAAO,OAAO,UAA8B,YAA2B;AACtE,QAAI;AAEF,YAAM,QAAQ,YAAY,QAAQ;AAClC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,YAAY,OAAO,OAAO;AAAA,IAClC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACrF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YAAY,OAAe,SAAuC;AAE/E,QAAM,iBAAiB,IAAI,sBAAsB;AAGjD,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,iBAAiB,MAAM,eAAe,kBAAkB,QAAQ,OAAO;AAG7E,QAAM,eAAe,uBAAuB;AAG5C,QAAM,gBAAgB,eAAe;AACrC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,QAAQ,eAAe;AAC7B,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,MAAI,SAAS,QAAQ;AACrB,MAAI,gBAAqB;AAEzB,MAAI,QAAQ;AAEV,oBAAgB,oBAAoB,iBAAiB,MAAM;AAC3D,QAAI,CAAC,eAAe;AAClB,cAAQ,KAAK,UAAU,QAAQ,QAAQ,MAAM,0CAA0C,CAAC;AAGxF,UAAI;AACF,cAAM,sBAAsB,QAAQ,OAAO,eAAe,QAAQ,WAAW;AAC7E,gBAAQ,IAAI,UAAU,QAAQ,4BAA4B,MAAM,EAAE,CAAC;AAGnE,4BAAoB,aAAa;AACjC,wBAAgB,oBAAoB,iBAAiB,MAAM;AAAA,MAC7D,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,UAAU;AAAA,YACR,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAChG;AAAA,QACF;AACA,gBAAQ,IAAI,UAAU,KAAK,gDAAgD,CAAC;AAC5E,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF,OAAO;AAEL,YAAQ,IAAI,UAAU,KAAK,2CAA2C,CAAC;AAAA,EACzE;AAGA,QAAM,UAAU,YAAY,gBAAgB,QAAQ,KAAK;AAGzD,QAAM,WAAW,cAAc,wBAAwB,SAAS,QAAQ,YAAY,SAAS;AAC7F,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,mBAAmB,QAAQ,YAAY,SAAS,aAAa;AAAA,EAC/E;AAGA,QAAM,OAAO,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC;AAChF,QAAM,eAAe,QAAQ,eACzB,QAAQ,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IACvD,CAAC;AAGL,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,mBAAqC;AAAA,IACzC,UAAU;AAAA,IACV,SAAS;AAAA,IACT;AAAA,IACA,aAAa,QAAQ,eAAe,SAAS,qBAAqB,eAAe;AAAA,IACjF,QAAQ,QAAQ,UAAU;AAAA;AAAA,IAE1B,GAAI,QAAQ,SAAS;AAAA,MACnB,OAAO,QAAQ;AAAA,MACf,gBAAgB;AAAA,QACd,iBAAiB;AAAA,QACjB,iBAAiB,QAAQ,IAAI,QAAQ;AAAA,QACrC,qBAAqB;AAAA,QACrB,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,IACA,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ,YAAY,OAAO,oBAAoB;AAAA,IACzD,cAAc;AAAA,IACd,cAAc;AAAA,IACd,kBAAkB,SAAS,QAAQ,mBAAmB,KAAK,EAAE;AAAA,IAC7D,eAAe;AAAA,IACf,YAAY,SAAS,uBAAuB,OAAO,wBAAwB,CAAC;AAAA,IAC5E,aAAa;AAAA,IACb,eAAe,CAAC;AAAA,IAChB,gBAAgB,CAAC;AAAA,IACjB,MAAM,KAAK,SAAS,IAAI,OAAO;AAAA,IAC/B,WAAW,QAAQ;AAAA,IACnB,cAAc,aAAa,SAAS,IAAI,eAAe;AAAA,IACvD,uBAAuB;AAAA,IACvB,YAAY,CAAC;AAAA,IACb,QAAQ,CAAC;AAAA,EACX;AAGA,QAAM,UAAU,SAAS,iBACtB,QAAQ,kBAAkB,KAAK,EAC/B,QAAQ,wBAAwB,iBAAiB,WAAW;AAG/D,QAAM,WAAW,GAAG,OAAO,IAAI,MAAM,YAAY,EAAE,QAAQ,eAAe,GAAG,CAAC,GAAG,OAAO,mBAAmB,cAAc;AACzH,QAAM,WAAgB,YAAK,MAAM,WAAW,QAAQ;AAEpD,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,wCAAwC,CAAC;AACpE,YAAQ,IAAI,UAAU,MAAM,SAAS,QAAQ,EAAE,CAAC;AAChD,YAAQ,IAAI,UAAU,MAAM,aAAa,OAAO,EAAE,CAAC;AACnD,YAAQ,IAAI,UAAU,MAAM,YAAY,UAAU,MAAM,EAAE,CAAC;AAC3D,YAAQ,IAAI,UAAU,MAAM,UAAU,KAAK,EAAE,CAAC;AAC9C,YAAQ,IAAI,UAAU,MAAM,WAAW,iBAAiB,MAAM,EAAE,CAAC;AACjE,QAAI,iBAAiB,OAAO;AAC1B,cAAQ,IAAI,UAAU,MAAM,UAAU,iBAAiB,KAAK,EAAE,CAAC;AAAA,IACjE;AACA,YAAQ,IAAI,UAAU,MAAM,aAAa,iBAAiB,QAAQ,EAAE,CAAC;AACrE,YAAQ,IAAI,UAAU,MAAM,aAAa,iBAAiB,QAAQ,EAAE,CAAC;AACrE,QAAI,KAAK,SAAS,GAAG;AACnB,cAAQ,IAAI,UAAU,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACzD;AACA,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ,IAAI,UAAU,MAAM,iBAAiB,aAAa,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACzE;AACA;AAAA,EACF;AAGA,MAAO,gBAAW,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,8BAA8B,QAAQ,EAAE;AAAA,EAC1D;AAGA,SAAO,WAAW,UAAU,kBAAkB,OAAO;AAGrD,MAAI,+CAAe,MAAM;AACvB,UAAM,OAAO,cAAc;AAC3B,UAAM,uBAAuB,CAAC,GAAI,KAAK,kBAAkB,CAAC,GAAI,OAAO;AACrE,WAAO,WAAW,KAAK,WAAW,EAAE,gBAAgB,qBAAqB,CAAC;AAAA,EAC5E;AAGA,MAAI;AACF,UAAM,eAAe,IAAI,sBAAsB,QAAQ,MAAM,aAAa,WAAW;AACrF,UAAM,aAAa,WAAW,SAAS,OAAO;AAC9C,QAAI,QAAQ;AACV,YAAM,aAAa,WAAW,QAAQ,MAAM;AAAA,IAC9C;AAAA,EACF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,uCAAuC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACjG;AAAA,IACF;AAAA,EACF;AAGA,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,6BAA6B,CAAC;AAC5D,UAAQ,IAAI,UAAU,KAAK,aAAa,OAAO,EAAE,CAAC;AAClD,UAAQ,IAAI,UAAU,KAAK,YAAY,UAAU,MAAM,EAAE,CAAC;AAC1D,UAAQ,IAAI,UAAU,KAAK,SAAS,QAAQ,EAAE,CAAC;AAC/C,UAAQ,IAAI,UAAU,KAAK,UAAU,KAAK,EAAE,CAAC;AAC7C,UAAQ,IAAI,UAAU,KAAK,WAAW,iBAAiB,MAAM,EAAE,CAAC;AAChE,UAAQ,IAAI,UAAU,KAAK,aAAa,iBAAiB,QAAQ,EAAE,CAAC;AACpE,UAAQ,IAAI,UAAU,KAAK,aAAa,iBAAiB,QAAQ,EAAE,CAAC;AAEpE,MAAI,KAAK,SAAS,GAAG;AACnB,YAAQ,IAAI,UAAU,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACxD;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI,UAAU,KAAK,iBAAiB,aAAa,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACxE;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,IAAI,UAAU,KAAK,cAAc,QAAQ,SAAS,EAAE,CAAC;AAAA,EAC/D;AAEA,UAAQ,IAAI,EAAE;AACd,MAAI,eAAe;AACjB,YAAQ,IAAI,UAAU,QAAQ,wBAAwB,cAAc,KAAK,KAAK,GAAG,CAAC;AAAA,EACpF,OAAO;AACL,YAAQ,IAAI,UAAU,QAAQ,uCAAuC,CAAC;AAAA,EACxE;AACF;AAKA,eAAe,sBACb,QACA,OACA,eACA,QACA,cACe;AACf,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,WAAW,cAAc,wBAAwB,QAAQ,SAAS;AACxE,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAEA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,kBAAkB;AAAA,IACtB,SAAS;AAAA,IACT,OAAO,sBAAsB,MAAM;AAAA,IACnC,aAAa,uCAAuC,MAAM;AAAA,IAC1D,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU,OAAO,oBAAoB;AAAA,IACrC,cAAc;AAAA,IACd,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,YAAY,SAAS,uBAAuB,CAAC;AAAA,IAC7C,aAAa;AAAA,IACb,gBAAgB,CAAC;AAAA,IACjB,cAAc,CAAC;AAAA,IACf,uBAAuB;AAAA,EACzB;AAGA,QAAM,UAAU,SAAS,iBACtB,QAAQ,kBAAkB,gBAAgB,KAAK,EAC/C,QAAQ,wBAAwB,gBAAgB,WAAW;AAG9D,QAAM,WAAW,GAAG,MAAM,oBAAoB,OAAO,mBAAmB,cAAc;AACtF,QAAM,WAAgB,YAAK,MAAM,UAAU,QAAQ;AAGnD,SAAO,UAAU,UAAU,iBAAiB,OAAO;AACrD;AAzUA,IAKAE,MACAC,QACAC;AAPA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAH,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAGxB;AACA;AACA;AACA;AACA;AACA;AAmBgB;AAkDD;AAwMA;AAAA;AAAA;;;AC3QR,SAAS,2BAAoC;AAClD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,iBAAiB,EAC7B,SAAS,cAAc,oBAAoB,EAC3C,OAAO,eAAe,qCAAqC,EAC3D,OAAO,mBAAmB,0BAA0B,EACpD,OAAO,aAAa,6CAA6C,EACjE,OAAO,OAAO,SAAiB,YAA2B;AACzD,QAAI;AACF,YAAM,YAAY,SAAS,OAAO;AAAA,IACpC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACrF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YAAY,SAAiB,SAAuC;AACjF,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,YAAY,oBAAoB,kBAAkB,OAAO;AAC/D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,EAC/C;AAEA,QAAM,EAAE,OAAO,MAAM,IAAI;AAGzB,MAAI,MAAM,SAAS,KAAK,CAAC,QAAQ,WAAW;AAC1C,YAAQ,IAAI,UAAU,QAAQ,0BAA0B,CAAC;AACzD,YAAQ,IAAI,YAAY,MAAM,MAAM,EAAE;AACtC,YAAQ,IAAI,EAAE;AACd,YAAQ;AAAA,MACN,UAAU,KAAK,sEAAsE;AAAA,IACvF;AACA,YAAQ,IAAI,UAAU,KAAK,gBAAgB,CAAC;AAE5C,eAAW,QAAQ,MAAM,MAAM,GAAG,CAAC,GAAG;AACpC,cAAQ,IAAI,YAAO,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE;AAAA,IAClD;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ,IAAI,aAAa,MAAM,SAAS,CAAC,OAAO;AAAA,IAClD;AAEA,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAGA,QAAM,UAAU,oBAAoB,gBAAgB,OAAO;AAC3D,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,YAAQ,IAAI,UAAU,QAAQ,oCAAoC,CAAC;AACnE,eAAW,aAAa,QAAQ,YAAY;AAC1C,YAAM,QAAQE,WAAU,SAAS;AACjC,cAAQ,IAAI,YAAO,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,IAChD;AAEA,QAAI,CAAC,QAAQ,OAAO;AAClB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,CAAC,MAAM,SAAS;AAEtC,MAAI,QAAQ,WAAW;AACrB,kBAAc,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;AAAA,EAC3D;AAGA,UAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,SAAS,eAAe,EAAE,eAAe,CAAC;AAChF,UAAQ,IAAI,YAAY,MAAM,QAAQ,MAAM,MAAM,KAAK,EAAE;AACzD,UAAQ,IAAI,aAAa,MAAM,SAAS,EAAE;AAE1C,MAAI,QAAQ,aAAa,MAAM,SAAS,GAAG;AACzC,YAAQ,IAAI,YAAY,MAAM,MAAM,IAAI;AACxC,eAAW,QAAQ,OAAO;AACxB,cAAQ,IAAI,cAAS,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE;AAClD,cAAQ,IAAI,eAAe,KAAK,SAAS,EAAE;AAAA,IAC7C;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,KAAK,0BAA0B,cAAc,MAAM,EAAE,CAAC;AAE5E,MAAI,QAAQ,QAAQ;AAClB;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,OAAO;AAClB,UAAM,WAAW,MAAM,OAAO,UAAe;AAC7C,UAAM,KAAK,SAAS,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,UAAM,SAAS,MAAM,IAAI,QAAgB,CAACC,aAAY;AACpD,SAAG;AAAA,QACD,UAAU;AAAA,UACR;AAAA,QACF;AAAA,QACAA;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,MAAM;AAET,QAAI,OAAO,YAAY,MAAM,SAAS,OAAO,YAAY,MAAM,KAAK;AAClE,cAAQ,IAAI,UAAU,KAAK,qBAAqB,CAAC;AACjD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,eAAe;AACnB,QAAM,SAAmB,CAAC;AAE1B,aAAW,YAAY,eAAe;AACpC,QAAI;AACF,UAAO,gBAAW,QAAQ,GAAG;AAC3B,QAAG,gBAAW,QAAQ;AACtB;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,UAAU,QAAQ,mBAAmB,QAAQ,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,WAAW,oBAAoB,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAC1G,aAAO,KAAK,QAAQ;AACpB,cAAQ,MAAM,UAAU,MAAM,QAAQ,CAAC;AAAA,IACzC;AAAA,EACF;AAGA,sBAAoB,aAAa;AAGjC,UAAQ,IAAI,UAAU,QAAQ,2BAA2B,CAAC;AAC1D,UAAQ,IAAI,UAAU,KAAK,kBAAkB,YAAY,IAAI,cAAc,MAAM,EAAE,CAAC;AAEpF,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,IAAI,UAAU,QAAQ,uBAAuB,OAAO,MAAM,EAAE,CAAC;AACrE,eAAW,SAAS,QAAQ;AAC1B,cAAQ,IAAI,UAAU,MAAM,YAAO,KAAK,EAAE,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,QAAQ,SAAS,OAAO,oBAAoB,CAAC;AAEnE,MAAI,QAAQ,aAAa,MAAM,SAAS,GAAG;AACzC,YAAQ,IAAI,UAAU,KAAK,gBAAgB,MAAM,MAAM,SAAS,CAAC;AAAA,EACnE;AAEA,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,YAAQ;AAAA,MACN,UAAU,QAAQ,oEAAoE;AAAA,IACxF;AACA,eAAW,aAAa,QAAQ,YAAY;AAC1C,YAAM,QAAQD,WAAU,SAAS;AACjC,cAAQ,IAAI,YAAO,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAASA,WAAU,MAAmB;AACpC,MAAI,KAAK,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AACjE,MAAI,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AAChD,MAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,SAAO;AACT;AA7MA,IAKAE,MACAC;AANA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAF,OAAoB;AACpB,IAAAC,qBAAwB;AACxB;AACA;AACA;AAQgB;AAyBD;AA8JN,WAAAH,YAAA;AAAA;AAAA;;;AC/KF,SAAS,yBAAkC;AAChD,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,oCAAoC,EAChD,OAAO,qBAAqB,kDAAkD,EAC9E,OAAO,mBAAmB,oIAAoI,EAC9J,OAAO,gBAAgB,2CAA2C,EAClE,OAAO,yBAAyB,+CAA+C,EAC/E,OAAO,yBAAyB,oBAAoB,EACpD,OAAO,oBAAoB,mBAAmB,EAC9C,OAAO,oBAAoB,gBAAgB,EAC3C,OAAO,uBAAuB,mCAAmC,OAAO,EACxE,OAAO,oBAAoB,2BAA2B,IAAI,EAC1D,OAAO,qBAAqB,yBAAyB,GAAG,EACxD,OAAO,YAAY,yDAAyD,EAC5E,OAAO,OAAO,YAAyB;AACtC,QAAI;AACF,YAAM,WAAW,OAAO;AAAA,IAC1B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACpF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,WAAW,SAAqC;AAC7D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,MAAI,SAAS,oBAAoB,aAAa;AAG9C,MAAI,QAAQ,QAAQ;AAClB,aAAS,OAAO,OAAO,CAAC,UAAU,MAAM,WAAW,QAAQ;AAAA,EAC7D,WAAW,QAAQ,QAAQ;AACzB,aAAS,OAAO,OAAO,CAAC,UAAU,MAAM,WAAW,QAAQ,MAAM;AAAA,EACnE;AAEA,MAAI,QAAQ,UAAU;AACpB,aAAS,OAAO,OAAO,CAAC,UAAU,MAAM,aAAa,QAAQ,QAAQ;AAAA,EACvE;AAEA,MAAI,QAAQ,UAAU;AACpB,aAAS,OAAO,OAAO,CAAC,UAAU,MAAM,aAAa,QAAQ,QAAQ;AAAA,EACvE;AAEA,MAAI,QAAQ,MAAM;AAChB,aAAS,OAAO,OAAO,CAAC,UAAU,MAAM,YAAY,QAAQ,IAAI;AAAA,EAClE;AAGA,MAAI,QAAQ,OAAO;AACjB,aAAS,OAAO,OAAO,CAAC,UAAU;AAChC,YAAM,iBAAiB,aAAa,kBAAkB,KAAK;AAC3D,aAAO,mBAAmB,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,aAAS,OAAO;AAAA,MACd,CAAC,UAAO;AApGd;AAoGiB,qBAAM,UAAQ,aAAQ,SAAR,mBAAc,KAAK,CAAC,QAAQ,MAAM,KAAK,SAAS,GAAG;AAAA;AAAA,IAC9E;AAAA,EACF;AAGA,QAAM,QAAQ,SAAS,QAAQ,SAAS,IAAI;AAC5C,QAAM,SAAS,SAAS,QAAQ,UAAU,GAAG;AAC7C,QAAM,kBAAkB,OAAO,MAAM,QAAQ,SAAS,KAAK;AAG3D,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACH,cAAQ,IAAI,KAAK,UAAU,iBAAiB,MAAM,CAAC,CAAC;AACpD;AAAA,IAEF,KAAK,QAAQ;AACX,YAAMK,QAAO,MAAM,OAAO,MAAM;AAChC,cAAQ,IAAIA,MAAK,UAAU,eAAe,CAAC;AAC3C;AAAA,IACF;AAAA,IAEA;AACE,YAAM,mBAAmB,iBAAiB,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,EACnF;AACF;AAEA,eAAe,mBACb,QACA,YACA,QACA,OACA,SACe;AACf,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,IAAI,UAAU,KAAK,uCAAuC,CAAC;AACnE;AAAA,EACF;AAGA,UAAQ,IAAI,UAAU,QAAQ;AAAA,cAAiB,OAAO,MAAM,IAAI,UAAU,OAAO,CAAC;AAElF,MAAI,aAAa,OAAO;AACtB,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,WAAW,SAAS,CAAC,IAAI,KAAK,IAAI,SAAS,OAAO,UAAU,CAAC,OAAO,UAAU;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAGd,QAAM,UAAU,CAAC,MAAM,SAAS,QAAQ;AACxC,QAAM,eAAe,CAAC,IAAI,IAAI,EAAE;AAEhC,MAAI,QAAQ,WAAW;AACrB,YAAQ,KAAK,OAAO;AACpB,iBAAa,KAAK,EAAE;AAAA,EACtB;AAEA,UAAQ,KAAK,YAAY,QAAQ,YAAY,SAAS;AACtD,eAAa,KAAK,IAAI,IAAI,IAAI,EAAE;AAGhC,QAAM,YAAY,QAAQ,IAAI,CAAC,QAAQ,MAAM,OAAO,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG;AACrF,UAAQ,IAAI,UAAU,QAAQ,SAAS,CAAC;AACxC,UAAQ,IAAI,UAAU,QAAQ,IAAI,OAAO,UAAU,MAAM,CAAC,CAAC;AAG3D,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM;AAAA,MACV,MAAM,YAAY;AAAA,MAClB,SAAS,MAAM,SAAS,YAAY,aAAa,CAAC,CAAC;AAAA,MACnDC,kBAAiB,MAAM,MAAM;AAAA,IAC/B;AAEA,QAAI,QAAQ,WAAW;AACrB,YAAM,iBAAiB,aAAa,kBAAkB,KAAK;AAC3D,UAAI,KAAK,gBAAgB,cAAc,CAAC;AAAA,IAC1C;AAEA,QAAI;AAAA,MACFC,oBAAmB,MAAM,QAAQ;AAAA,MACjC,MAAM,WAAW;AAAA,MACjB,MAAM,YAAY;AAAA,MAClBC,YAAW,MAAM,YAAY;AAAA,IAC/B;AAEA,UAAM,eAAe,IAAI,IAAI,CAAC,MAAM,MAAM,KAAK,SAAS,EAAE,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG;AAC3F,YAAQ,IAAI,YAAY;AAAA,EAC1B;AAEA,UAAQ,IAAI,EAAE;AAGd,MAAI,aAAa,OAAO;AACtB,UAAM,aAAa,SAAS;AAC5B,UAAM,UAAU,aAAa;AAC7B,UAAM,aAAa,KAAK,IAAI,GAAG,SAAS,KAAK;AAC7C,UAAM,UAAU,SAAS;AAEzB,YAAQ,IAAI,UAAU,KAAK,aAAa,CAAC;AACzC,QAAI,SAAS;AACX,cAAQ,IAAI,+CAA+C,UAAU,YAAY,KAAK,EAAE;AAAA,IAC1F;AACA,QAAI,SAAS;AACX,cAAQ,IAAI,2CAA2C,UAAU,YAAY,KAAK,EAAE;AAAA,IACtF;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF;AAEA,SAASF,kBAAiB,QAAwB;AAChD,QAAM,eAAyD;AAAA,IAC7D,MAAM,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACN,eAAe,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACf,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACN,SAAS,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACX;AAEA,QAAM,UAAU,aAAa,MAAM,MAAM,CAAC,SAAS;AACnD,SAAO,QAAQ,OAAO,YAAY,CAAC;AACrC;AAEA,SAASC,oBAAmB,UAA0B;AACpD,QAAM,iBAA2D;AAAA,IAC/D,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACN,QAAQ,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACR,KAAK,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACP;AAEA,QAAM,UAAU,eAAe,QAAQ,MAAM,CAAC,SAAS;AACvD,SAAO,QAAQ,SAAS,YAAY,CAAC;AACvC;AAEA,SAASC,YAAW,YAA4B;AAC9C,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAO,KAAK,mBAAmB;AACjC;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,cAAwD;AAAA,IAC5D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,uBAAuB,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACvB,cAAc,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACd,sBAAsB,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACtB,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,EACR;AAEA,QAAM,UAAU,YAAY,KAAK,MAAM,CAAC,SAAS;AACjD,SAAO,QAAQ,MAAM,YAAY,EAAE,QAAQ,MAAM,GAAG,CAAC;AACvD;AAEA,SAAS,SAAS,MAAc,WAA2B;AACzD,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,GAAG,KAAK,UAAU,GAAG,YAAY,CAAC,CAAC;AAC5C;AAtQA,IAKAC;AALA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB;AACA;AACA;AACA;AAgBgB;AAgCD;AAqEA;AAsFN,WAAAH,mBAAA;AAYA,WAAAC,qBAAA;AAYA,WAAAC,aAAA;AAMA;AAiBA;AAAA;AAAA;;;ACkSF,SAAS,YAAY,SAAyB;AACnD,SAAO,cAAAG,QAAM,IAAI,KAAK,SAAS,IAAI,cAAAA,QAAM,IAAI,OAAO;AACtD;AAUO,SAAS,WAAW,SAAyB;AAClD,SAAO,cAAAA,QAAM,KAAK,KAAK,QAAQ,IAAI,cAAAA,QAAM,KAAK,OAAO;AACvD;AAnjBA,IAIAC;AAJA;AAAA;AAAA;AAAA;AAIA,IAAAA,gBAAkB;AAiiBF;AAYA;AAAA;AAAA;;;ACniBT,SAAS,2BAAoC;AAClD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,mDAAmD,EAC/D,SAAS,cAAc,2BAA2B,EAClD,OAAO,wBAAwB,4BAA4B,EAC3D,OAAO,qBAAqB,qCAAqC,OAAO,EACxE,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,OAAO,SAAiB,YAAgC;AAC9D,QAAI;AACF,YAAM,kBAAkB,SAAS,OAAO;AAAA,IAC1C,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,YAAY,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB;AAAA,MAC/E;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,kBAAkB,SAAiB,SAA4C;AAE5F,UAAQ,IAAI,WAAW,qCAAqC,CAAC;AAC7D,UAAQ,IAAI,WAAW,wCAAwC,OAAO,gBAAgB,CAAC;AAEvF,MAAI,QAAQ,SAAS;AACnB,YAAQ,IAAI,WAAW,oDAAoD,CAAC;AAAA,EAC9E;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,cAAAC,QAAM,OAAO,2DAA2D,CAAC;AACrF,UAAQ,IAAI,cAAAA,QAAM,OAAO,iEAAiE,CAAC;AAC7F;AAjDA,IAIAC,eACAC;AALA;AAAA;AAAA;AAAA;AAIA,IAAAD,gBAAkB;AAClB,IAAAC,qBAAwB;AACxB;AAQgB;AAuBD;AAAA;AAAA;;;AClBR,SAAS,yBAAkC;AAChD,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,0CAA0C,EACtD,SAAS,cAAc,kBAAkB,EACzC,OAAO,uBAAuB,sCAAsC,UAAU,EAC9E,OAAO,8BAA8B,oBAAoB,EACzD,OAAO,cAAc,4BAA4B,EACjD,OAAO,kBAAkB,gCAAgC,EACzD,OAAO,kBAAkB,sCAAsC,EAC/D,OAAO,OAAO,SAAiB,YAAyB;AACvD,QAAI;AACF,YAAM,UAAU,SAAS,OAAO;AAAA,IAClC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACnF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,UAAU,SAAiB,SAAqC;AAC7E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,YAAY,oBAAoB,kBAAkB,OAAO;AAC/D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,EAC/C;AAEA,QAAM,EAAE,OAAO,OAAO,KAAK,KAAK,IAAI;AAGpC,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK,QAAQ;AACX,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,GAAI,QAAQ,aAAa,EAAE,MAAM;AAAA,QACjC,GAAI,QAAQ,WAAW,EAAE,IAAI;AAAA,QAC7B,GAAI,QAAQ,EAAE,KAAK;AAAA,MACrB;AACA,cAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC/C;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,YAAMC,QAAO,MAAM,OAAO,MAAM;AAChC,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,GAAI,QAAQ,aAAa,EAAE,MAAM;AAAA,QACjC,GAAI,QAAQ,WAAW,EAAE,IAAI;AAAA,QAC7B,GAAI,QAAQ,EAAE,KAAK;AAAA,MACrB;AACA,cAAQ,IAAIA,MAAK,UAAU,UAAU,CAAC;AACtC;AAAA,IACF;AAAA,IAEA;AACE,YAAM,qBAAqB,OAAO,OAAO,KAAK,MAAM,SAAS,mBAAmB;AAAA,EACpF;AACF;AAEA,eAAe,qBACb,OACA,OACA,KACA,MACA,SACA,qBACe;AAEf,UAAQ,IAAI,UAAU,QAAQ;AAAA,aAAgB,MAAM,KAAK,MAAM,CAAC;AAChE,UAAQ,IAAI,UAAU,KAAK,OAAO,MAAM,QAAQ,EAAE,CAAC;AACnD,UAAQ,IAAI,EAAE;AAGd,UAAQ,IAAI,UAAU,QAAQ,oBAAoB,CAAC;AACnD,UAAQ,IAAI,YAAY,MAAM,KAAK,EAAE;AACrC,UAAQ,IAAI,aAAaC,kBAAiB,MAAM,MAAM,CAAC,EAAE;AACzD,UAAQ,IAAI,eAAeC,oBAAmB,MAAM,QAAQ,CAAC,EAAE;AAC/D,UAAQ,IAAI,eAAe,MAAM,YAAY,YAAY,EAAE;AAE3D,MAAI,MAAM;AACR,YAAQ,IAAI,WAAW,KAAK,OAAO,MAAM,KAAK,KAAK,EAAE;AAAA,EACvD;AAEA,MAAI,MAAM,WAAW;AACnB,YAAQ,IAAI,gBAAgB,MAAM,SAAS,EAAE;AAAA,EAC/C;AAEA,MAAI,MAAM,QAAQ,MAAM,KAAK,SAAS,GAAG;AACvC,YAAQ,IAAI,WAAW,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,EAChD;AAEA,MAAI,MAAM,0BAA0B,QAAW;AAC7C,YAAQ,IAAI,eAAe,MAAM,qBAAqB,GAAG;AAAA,EAC3D;AAEA,UAAQ,IAAI,EAAE;AAGd,UAAQ,IAAI,UAAU,QAAQ,uBAAuB,CAAC;AACtD,UAAQ,IAAI,cAAcC,gBAAe,MAAM,YAAY,CAAC,EAAE;AAC9D,UAAQ,IAAI,cAAcA,gBAAe,MAAM,YAAY,CAAC,EAAE;AAC9D,UAAQ,IAAI,uBAAuB,MAAM,oBAAoB,CAAC,EAAE;AAChE,UAAQ,IAAI,oBAAoB,MAAM,iBAAiB,CAAC,EAAE;AAE1D,MAAI,MAAM,mBAAmB,GAAG;AAC9B,UAAM,aAAa,MAAM,gBAAgB,MAAM;AAC/C,YAAQ,IAAI,wBAAwB,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,EACrE;AAEA,UAAQ,IAAI,kBAAkB,MAAM,eAAe,OAAO,EAAE;AAC5D,UAAQ,IAAI,EAAE;AAGd,MAAI,MAAM,aAAa;AACrB,YAAQ,IAAI,UAAU,QAAQ,cAAc,CAAC;AAC7C,YAAQ,IAAI,KAAK,MAAM,WAAW,EAAE;AACpC,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,eAAe,MAAM,SAAS;AACxC,YAAQ,IAAI,UAAU,QAAQ,UAAU,CAAC;AACzC,YAAQ,IAAI,MAAM,OAAO;AACzB,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,MAAM,cAAc,MAAM,WAAW,SAAS,GAAG;AACnD,YAAQ,IAAI,UAAU,QAAQ,aAAa,CAAC;AAC5C,eAAW,WAAW,MAAM,YAAY;AACtC,cAAQ,IAAI,YAAO,OAAO,EAAE;AAAA,IAC9B;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,MAAM,gBAAgB,MAAM,aAAa,SAAS,GAAG;AACvD,YAAQ,IAAI,UAAU,QAAQ,eAAe,CAAC;AAC9C,eAAW,OAAO,MAAM,cAAc;AACpC,cAAQ,IAAI,YAAO,GAAG,EAAE;AAAA,IAC1B;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,MAAM,cAAc,MAAM,WAAW,SAAS,GAAG;AACnD,YAAQ,IAAI,UAAU,QAAQ,aAAa,CAAC;AAC5C,eAAW,WAAW,MAAM,YAAY;AACtC,cAAQ,IAAI,YAAO,OAAO,EAAE;AAAA,IAC9B;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,MAAI,MAAM,UAAU,MAAM,OAAO,SAAS,GAAG;AAC3C,YAAQ,IAAI,UAAU,QAAQ,SAAS,CAAC;AACxC,eAAW,WAAW,MAAM,QAAQ;AAClC,cAAQ,IAAI,YAAO,OAAO,EAAE;AAAA,IAC9B;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,aAAa,MAAM,SAAS,GAAG;AACzC,YAAQ,IAAI,UAAU,QAAQ,kBAAkB,MAAM,MAAM,IAAI,CAAC;AACjE,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,UAAU,MAAM,kBAAkB,CAAC;AAAA,IACjD,OAAO;AACL,iBAAW,QAAQ,OAAO;AACxB,cAAM,aAAaC,eAAc,KAAK,MAAM;AAC5C,cAAM,gBAAgBF,oBAAmB,KAAK,QAAQ;AACtD,gBAAQ,IAAI,KAAK,UAAU,IAAI,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,aAAa,GAAG;AAAA,MACjF;AAAA,IACF;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,WAAW,IAAI,SAAS,GAAG;AACrC,YAAQ,IAAI,UAAU,QAAQ,0BAA0B,IAAI,MAAM,IAAI,CAAC;AACvE,QAAI,IAAI,WAAW,GAAG;AACpB,cAAQ,IAAI,UAAU,MAAM,0BAA0B,CAAC;AAAA,IACzD,OAAO;AACL,iBAAW,MAAM,KAAK;AACpB,cAAM,aAAa,gBAAgB,GAAG,SAAS;AAC/C,gBAAQ,IAAI,KAAK,UAAU,IAAI,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,UAAU,YAAY,CAAC,GAAG;AAAA,MACxF;AAAA,IACF;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,MAAM,kBAAkB,MAAM,eAAe,SAAS,GAAG;AAC3D,YAAQ,IAAI,UAAU,QAAQ,iBAAiB,CAAC;AAChD,eAAW,aAAa,MAAM,gBAAgB;AAC5C,cAAQ,IAAI,YAAO,SAAS,EAAE;AAAA,IAChC;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,QAAQ,aAAa;AACvB,UAAM,UAAU,oBAAoB,gBAAgB,MAAM,QAAQ;AAElE,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,cAAQ,IAAI,UAAU,QAAQ,iBAAiB,CAAC;AAChD,iBAAW,WAAW,QAAQ,UAAU;AACtC,gBAAQ,IAAI,YAAOG,WAAU,OAAO,CAAC,KAAK,QAAQ,KAAK,EAAE;AAAA,MAC3D;AACA,cAAQ,IAAI,EAAE;AAAA,IAChB;AAEA,QAAI,QAAQ,aAAa,SAAS,GAAG;AACnC,cAAQ,IAAI,UAAU,QAAQ,eAAe,CAAC;AAC9C,iBAAW,OAAO,QAAQ,cAAc;AACtC,gBAAQ,IAAI,YAAOA,WAAU,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE;AAAA,MACnD;AACA,cAAQ,IAAI,EAAE;AAAA,IAChB;AAEA,QAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,cAAQ,IAAI,UAAU,QAAQ,aAAa,CAAC;AAC5C,iBAAW,OAAO,QAAQ,YAAY;AACpC,gBAAQ,IAAI,YAAOA,WAAU,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE;AAAA,MACnD;AACA,cAAQ,IAAI,EAAE;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,MAAM,aAAa,MAAM,iBAAiB,MAAM,YAAY;AAC9D,YAAQ,IAAI,UAAU,QAAQ,qBAAqB,CAAC;AACpD,QAAI,MAAM,WAAW;AACnB,cAAQ,IAAI,gBAAgB,MAAM,SAAS,EAAE;AAAA,IAC/C;AACA,QAAI,MAAM,eAAe;AACvB,cAAQ,IAAI,qBAAqB,MAAM,aAAa,EAAE;AAAA,IACxD;AACA,QAAI,MAAM,YAAY;AACpB,cAAQ,IAAI,iBAAiB,MAAM,UAAU,EAAE;AAAA,IACjD;AACA,QAAI,MAAM,iBAAiB,MAAM,cAAc,SAAS,GAAG;AACzD,cAAQ,IAAI,oBAAoB,MAAM,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,IAClE;AACA,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,UAAQ,IAAI,UAAU,QAAQ,mBAAmB,CAAC;AAClD,UAAQ,IAAI,WAAW,MAAM,SAAS,EAAE;AACxC,UAAQ,IAAI,EAAE;AAGd,QAAM,iBAAiB,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AACrE,QAAM,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,cAAc,QAAQ,EAAE;AAE9D,UAAQ,IAAI,UAAU,QAAQ,UAAU,CAAC;AACzC,UAAQ,IAAI,YAAY,cAAc,IAAI,MAAM,MAAM,YAAY;AAClE,UAAQ,IAAI,UAAU,SAAS,IAAI,IAAI,MAAM,SAAS;AAEtD,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,sBAAuB,iBAAiB,MAAM,SAAU,KAAK,QAAQ,CAAC;AAC5E,YAAQ,IAAI,sBAAsB,kBAAkB,GAAG;AAAA,EACzD;AAEA,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,eAAgB,YAAY,IAAI,SAAU,KAAK,QAAQ,CAAC;AAC9D,YAAQ,IAAI,oBAAoB,WAAW,GAAG;AAAA,EAChD;AACF;AAEA,SAASJ,kBAAiB,QAAwB;AAChD,QAAM,eAAyD;AAAA,IAC7D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACZ;AAEA,QAAM,UAAU,aAAa,MAAM,MAAM,CAAC,SAAS;AACnD,SAAO,QAAQ,OAAO,YAAY,CAAC;AACrC;AAEA,SAASC,oBAAmB,UAA0B;AACpD,QAAM,iBAA2D;AAAA,IAC/D,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACN,QAAQ,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACR,KAAK,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACP;AAEA,QAAM,UAAU,eAAe,QAAQ,MAAM,CAAC,SAAS;AACvD,SAAO,QAAQ,SAAS,YAAY,CAAC;AACvC;AAEA,SAASE,eAAc,QAAwB;AAC7C,QAAM,QAAgC;AAAA,IACpC,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAEA,SAAO,MAAM,MAAM,KAAK;AAC1B;AAEA,SAAS,gBAAgB,QAAwB;AAC/C,QAAM,QAAgC;AAAA,IACpC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,SAAO,MAAM,MAAM,KAAK;AAC1B;AAEA,SAASD,gBAAe,YAA4B;AAClD,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAO,KAAK,eAAe;AAC7B;AAEA,SAASE,WAAU,MAAmB;AACpC,MAAI,KAAK,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AACjE,MAAI,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO,KAAK;AAChD,MAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,MAAI,KAAK,MAAO,QAAO,KAAK;AAC5B,SAAO;AACT;AA9WA,IAKAC;AALA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AAExB;AACA;AACA;AAUgB;AA2BD;AAiDA;AAmNN,WAAAL,mBAAA;AAYA,WAAAC,qBAAA;AAYA,WAAAE,gBAAA;AAWA;AAaA,WAAAD,iBAAA;AAMA,WAAAE,YAAA;AAAA;AAAA;;;ACjUF,SAAS,2BAAoC;AAClD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,0BAA0B,EACtC,SAAS,cAAc,oBAAoB,EAC3C,OAAO,sBAAsB,cAAc,EAC3C,OAAO,4BAA4B,oBAAoB,EACvD,OAAO,yBAAyB,oDAAoD,EACpF,OAAO,mBAAmB,iIAAiI,EAC3J,OAAO,0BAA0B,4CAA4C,EAC7E,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,kBAAkB,gBAAgB,EACzC,OAAO,qBAAqB,4BAA4B,EACxD,OAAO,wBAAwB,+BAA+B,EAC9D,OAAO,0BAA0B,eAAe,EAChD,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,mCAAmC,yBAAyB,EACnE,OAAO,4BAA4B,sBAAsB,EACzD,OAAO,4BAA4B,wCAAwC,EAC3E,OAAO,+BAA+B,2CAA2C,EACjF,OAAO,0BAA0B,sCAAsC,EACvE,OAAO,6BAA6B,yCAAyC,EAC7E,OAAO,sBAAsB,kCAAkC,EAC/D,OAAO,yBAAyB,qCAAqC,EACrE,OAAO,2BAA2B,sCAAsC,EACxE,OAAO,mBAAmB,yDAAyD,EACnF,OAAO,yBAAyB,sDAAsD,EACtF,OAAO,aAAa,6CAA6C,EACjE,OAAO,OAAO,SAAiB,YAA2B;AACzD,QAAI;AACF,YAAM,YAAY,SAAS,OAAO;AAAA,IACpC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACrF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YAAY,SAAiB,SAAuC;AACjF,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,QAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAM,YAAY,oBAAoB,kBAAkB,OAAO;AAC/D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,EAC/C;AAEA,QAAM,QAAQ,UAAU;AACxB,QAAM,WAAW,MAAM;AAGvB,QAAM,UAAqC,CAAC;AAE5C,MAAI,QAAQ,OAAO;AACjB,YAAQ,QAAQ,QAAQ;AAAA,EAC1B;AAEA,MAAI,QAAQ,aAAa;AACvB,YAAQ,cAAc,QAAQ;AAAA,EAChC;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,SAAS,QAAQ;AAAA,EAC3B;AAGA,MAAI,QAAQ,OAAO;AACjB,UAAM,eAAe,aAAa,kBAAkB,KAAK;AAGzD,UAAM,mBAAmB,gBAAgB;AAAA,MACvC;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,IAAI,QAAQ;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAEA,QAAI,CAAC,iBAAiB,SAAS;AAC7B,cAAQ,MAAM,UAAU,MAAM,0BAA0B,CAAC;AACzD,uBAAiB,OAAO;AAAA,QAAQ,WAC9B,QAAQ,MAAM,UAAU,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,MAC/C;AACA,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,QAAI,iBAAiB,SAAS,SAAS,GAAG;AACxC,cAAQ,IAAI,UAAU,QAAQ,4BAA4B,CAAC;AAC3D,uBAAiB,SAAS;AAAA,QAAQ,aAChC,QAAQ,IAAI,UAAU,QAAQ,OAAO,OAAO,EAAE,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,YAAQ,QAAQ,iBAAiB,KAAK;AACtC,YAAQ,iBAAiB,iBAAiB,KAAK;AAAA,EACjD;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,WAAW,QAAQ;AAAA,EAC7B;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,WAAW,QAAQ;AAAA,EAC7B;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,UAAU,QAAQ;AAAA,EAC5B;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,YAAY,QAAQ;AAAA,EAC9B;AAEA,MAAI,QAAQ,gBAAgB;AAC1B,YAAQ,YAAY;AAAA,EACtB;AAEA,MAAI,QAAQ,oBAAoB,QAAW;AACzC,YAAQ,mBAAmB,SAAS,QAAQ,gBAAgB,SAAS,GAAG,EAAE;AAAA,EAC5E;AAEA,MAAI,QAAQ,iBAAiB,QAAW;AACtC,YAAQ,gBAAgB,SAAS,QAAQ,aAAa,SAAS,GAAG,EAAE;AAAA,EACtE;AAEA,MAAI,QAAQ,aAAa,QAAW;AAClC,UAAM,WAAW,SAAS,QAAQ,SAAS,SAAS,GAAG,EAAE;AACzD,QAAI,WAAW,KAAK,WAAW,KAAK;AAClC,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,YAAQ,wBAAwB;AAAA,EAClC;AAGA,MAAI,QAAQ,WAAW,QAAQ,YAAY;AACzC,UAAM,cAAc,MAAM,QAAQ,CAAC;AACnC,QAAI,UAAU,CAAC,GAAG,WAAW;AAE7B,QAAI,QAAQ,SAAS;AACnB,YAAM,YAAY,QAAQ,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AACpE,iBAAW,OAAO,WAAW;AAC3B,YAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,kBAAQ,KAAK,GAAG;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY;AACtB,YAAM,eAAe,QAAQ,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC1E,gBAAU,QAAQ,OAAO,CAAC,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;AAAA,IAC/D;AAEA,YAAQ,OAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,EAChD;AAGA,MAAI,QAAQ,mBAAmB,QAAQ,oBAAoB;AACzD,UAAM,cAAc,MAAM,gBAAgB,CAAC;AAC3C,QAAI,UAAU,CAAC,GAAG,WAAW;AAE7B,QAAI,QAAQ,iBAAiB;AAC3B,YAAM,YAAY,QAAQ,gBAAgB,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC5E,iBAAW,OAAO,WAAW;AAC3B,YAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,kBAAQ,KAAK,GAAG;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,oBAAoB;AAC9B,YAAM,eAAe,QAAQ,mBAAmB,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAClF,gBAAU,QAAQ,OAAO,CAAC,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;AAAA,IAC/D;AAEA,YAAQ,eAAe,QAAQ,SAAS,IAAI,UAAU;AAAA,EACxD;AAGA,MAAI,QAAQ,gBAAgB,QAAQ,iBAAiB;AACnD,UAAM,iBAAiB,MAAM,cAAc,CAAC;AAC5C,QAAI,aAAa,CAAC,GAAG,cAAc;AAEnC,QAAI,QAAQ,cAAc;AACxB,YAAM,eAAe,QAAQ,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AAC1E,iBAAW,MAAM,cAAc;AAC7B,YAAI,CAAC,WAAW,SAAS,EAAE,GAAG;AAC5B,qBAAW,KAAK,EAAE;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,iBAAiB;AAC3B,YAAM,kBAAkB,QAAQ,gBAAgB,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AAChF,mBAAa,WAAW,OAAO,CAAC,OAAO,CAAC,gBAAgB,SAAS,EAAE,CAAC;AAAA,IACtE;AAEA,YAAQ,aAAa,WAAW,SAAS,IAAI,aAAa;AAAA,EAC5D;AAGA,MAAI,QAAQ,aAAa,QAAQ,cAAc;AAC7C,UAAM,gBAAgB,MAAM,UAAU,CAAC;AACvC,QAAI,YAAY,CAAC,GAAG,aAAa;AAEjC,QAAI,QAAQ,WAAW;AACrB,YAAM,cAAc,QAAQ,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACtE,iBAAW,MAAM,aAAa;AAC5B,YAAI,CAAC,UAAU,SAAS,EAAE,GAAG;AAC3B,oBAAU,KAAK,EAAE;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,cAAc;AACxB,YAAM,iBAAiB,QAAQ,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AAC5E,kBAAY,UAAU,OAAO,CAAC,OAAO,CAAC,eAAe,SAAS,EAAE,CAAC;AAAA,IACnE;AAEA,YAAQ,SAAS,UAAU,SAAS,IAAI,YAAY;AAAA,EACtD;AAGA,MAAI,QAAQ,UAAU,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACvD,YAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,SAAS,eAAe,EAAE,yBAAyB,CAAC;AAC1F,YAAQ,IAAI,UAAU,MAAM,aAAa,OAAO,EAAE,CAAC;AACnD,YAAQ,IAAI,UAAU,MAAM,SAAS,QAAQ,EAAE,CAAC;AAEhD,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,cAAQ,IAAI,UAAU,QAAQ,sBAAsB,CAAC;AACrD;AAAA,IACF;AAEA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,YAAM,eAAe,MAAM,GAAyB;AACpD,cAAQ,IAAI,UAAU,MAAM,GAAG,GAAG,KAAK,YAAY,WAAM,KAAK,EAAE,CAAC;AAAA,IACnE;AAEA,QAAI,QAAQ,QAAQ;AAClB;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAG9C,QAAM,eAAe,OAAO,WAAW,UAAU,OAAO;AAGxD,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,6BAA6B,CAAC;AAC5D,UAAQ,IAAI,UAAU,KAAK,aAAa,OAAO,EAAE,CAAC;AAClD,UAAQ,IAAI,UAAU,KAAK,SAAS,QAAQ,EAAE,CAAC;AAG/C,QAAM,gBAAgB,OAAO,KAAK,OAAO,EAAE,OAAO,CAAC,QAAQ,QAAQ,cAAc;AACjF,MAAI,cAAc,SAAS,GAAG;AAC5B,YAAQ,IAAI,UAAU,KAAK,mBAAmB,cAAc,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EAC3E;AAGA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,QAAQ,iBAAiB,CAAC;AAChD,UAAQ,IAAI,YAAY,aAAa,KAAK,EAAE;AAC5C,UAAQ,IAAI,aAAaG,kBAAiB,aAAa,MAAM,CAAC,EAAE;AAChE,MAAI,aAAa,OAAO;AACtB,YAAQ,IAAI,YAAYC,iBAAgB,aAAa,KAAK,CAAC,EAAE;AAAA,EAC/D;AACA,UAAQ,IAAI,eAAeC,oBAAmB,aAAa,QAAQ,CAAC,EAAE;AACtE,UAAQ,IAAI,eAAe,aAAa,QAAQ,EAAE;AAClD,UAAQ,IAAI,cAAc,aAAa,OAAO,EAAE;AAEhD,MAAI,aAAa,WAAW;AAC1B,YAAQ,IAAI,gBAAgB,aAAa,SAAS,EAAE;AAAA,EACtD;AAEA,MAAI,aAAa,QAAQ,aAAa,KAAK,SAAS,GAAG;AACrD,YAAQ,IAAI,WAAW,aAAa,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,EACvD;AAEA,MAAI,aAAa,0BAA0B,QAAW;AACpD,YAAQ,IAAI,eAAe,aAAa,qBAAqB,GAAG;AAAA,EAClE;AAEA,MAAI,aAAa,gBAAgB,aAAa,aAAa,SAAS,GAAG;AACrE,YAAQ,IAAI,mBAAmB,aAAa,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,EACvE;AAEA,MAAI,aAAa,cAAc,aAAa,WAAW,SAAS,GAAG;AACjE,YAAQ,IAAI,iBAAiB,aAAa,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,EACnE;AAEA,MAAI,aAAa,UAAU,aAAa,OAAO,SAAS,GAAG;AACzD,YAAQ,IAAI,aAAa,aAAa,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EAC3D;AAEA,UAAQ,IAAI,uBAAuB,aAAa,oBAAoB,CAAC,EAAE;AACvE,UAAQ,IAAI,oBAAoB,aAAa,iBAAiB,CAAC,EAAE;AAEjE,UAAQ,IAAI,cAAc,IAAI,KAAK,aAAa,YAAY,EAAE,eAAe,CAAC,EAAE;AAClF;AAEA,SAASF,kBAAiB,QAAwB;AAChD,QAAM,eAAyD;AAAA,IAC7D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACZ;AAEA,QAAM,UAAU,aAAa,MAAM,MAAM,CAAC,SAAS;AACnD,SAAO,QAAQ,OAAO,YAAY,CAAC;AACrC;AAEA,SAASE,oBAAmB,UAA0B;AACpD,QAAM,iBAA2D;AAAA,IAC/D,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACN,QAAQ,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACR,KAAK,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACP;AAEA,QAAM,UAAU,eAAe,QAAQ,MAAM,CAAC,SAAS;AACvD,SAAO,QAAQ,SAAS,YAAY,CAAC;AACvC;AAEA,SAASD,iBAAgB,OAAuB;AAC9C,QAAM,cAAwD;AAAA,IAC5D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,uBAAuB,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACvB,cAAc,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACd,sBAAsB,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACtB,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,EACR;AAEA,QAAM,UAAU,YAAY,KAAK,MAAM,CAAC,SAAS;AACjD,SAAO,QAAQ,MAAM,YAAY,EAAE,QAAQ,MAAM,GAAG,CAAC;AACvD;AA7YA,IAKAE;AALA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AAExB;AACA;AACA;AACA;AACA;AA4BgB;AA6CD;AAkRN,WAAAH,mBAAA;AAYA,WAAAE,qBAAA;AAYA,WAAAD,kBAAA;AAAA;AAAA;;;AC9WF,SAAS,qBAA8B;AAC5C,QAAM,MAAM,IAAI,2BAAQ,OAAO;AAE/B,MACG,YAAY,mDAAmD,EAC/D,MAAM,QAAQ,EACd,WAAW,yBAAyB,CAAC,EACrC,WAAW,uBAAuB,CAAC,EACnC,WAAW,uBAAuB,CAAC,EACnC,WAAW,yBAAyB,CAAC,EACrC,WAAW,yBAAyB,CAAC,EACrC,WAAW,2BAA2B,CAAC,EACvC,WAAW,yBAAyB,CAAC,EACrC,WAAW,wBAAwB,CAAC,EACpC,WAAW,yBAAyB,CAAC;AAExC,SAAO;AACT;AAjCA,IAKAI;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB;AACA;AACA,IAAAC;AACA,IAAAC;AACA,IAAAC;AACA,IAAAC;AACA;AACA,IAAAC;AACA,IAAAC;AAEgB;AAAA;AAAA;;;AC4iBT,SAAS,uBAAgC;AAC9C,SAAO,IAAI,2BAAQ,SAAS,EACzB,YAAY,yDAAyD,EACrE,OAAO,iBAAiB,0CAA0C,EAClE,OAAO,iBAAiB,kCAAkC,EAC1D,OAAO,gBAAgB,gCAAgC,EACvD,OAAO,kBAAkB,oCAAoC,QAAQ,IAAI,CAAC,EAC1E,OAAO,OAAO,YAAY;AACzB,UAAM,gBAAgB,IAAI,cAAc;AAExC,QAAI;AACF,cAAQ,IAAI,cAAAC,QAAM,KAAK,KAAK,6BAA6B,CAAC;AAC1D,cAAQ,IAAI,cAAAA,QAAM,KAAK,0DAA0D,CAAC;AAElF,YAAM,SAAS,MAAM,cAAc,QAAQ,QAAQ,QAAQ;AAAA,QACzD,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,UAAI,QAAQ,QAAQ;AAClB,gBAAQ;AAAA,UACN,cAAAA,QAAM,OAAO,yEAAyE;AAAA,QACxF;AAAA,MACF;AAEA,cAAQ,KAAK,CAAC;AAAA,IAChB,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,cAAAA,QAAM,IAAI,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,MAC3F;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AA9lBA,IASAC,MACAC,QACAC,eACAC,oBACAC,aACAC,OA2Ba;AAzCb;AAAA;AAAA;AAAA;AASA,IAAAL,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,gBAAkB;AAClB,IAAAC,qBAAwB;AACxB,IAAAC,cAAgB;AAChB,IAAAC,QAAsB;AAEtB;AACA;AACA;AAuBO,IAAM,iBAAN,MAAM,eAAc;AAAA,MACjB,oBAAoB,IAAI,kBAAkB;AAAA,MAC1C,gBAAgB,IAAI,cAAc;AAAA,MAClC,cAAc,IAAI,YAAY;AAAA,MAC9B,QAAwB;AAAA,QAC9B,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,QAAQ,CAAC;AAAA,MACX;AAAA;AAAA;AAAA;AAAA,MAKA,MAAa,QACX,YAAoB,QAAQ,IAAI,GAChC,UAII,CAAC,GACoB;AACzB,cAAM,cAAU,YAAAC,SAAI,oCAAoC,EAAE,MAAM;AAEhE,YAAI;AAEF,cAAI,QAAQ,QAAQ;AAClB,kBAAM,KAAK,aAAa,SAAS;AACjC,oBAAQ,OAAO;AAAA,UACjB;AAGA,kBAAQ,OAAO;AACf,gBAAM,KAAK,qBAAqB,WAAW,QAAQ,MAAM;AAGzD,kBAAQ,OAAO;AACf,gBAAM,KAAK,yBAAyB,WAAW,QAAQ,MAAM;AAG7D,kBAAQ,OAAO;AACf,gBAAM,KAAK,aAAa,WAAW,QAAQ,QAAQ,QAAQ,OAAO;AAGlE,kBAAQ,OAAO;AACf,gBAAM,KAAK,mBAAmB,WAAW,QAAQ,MAAM;AAEvD,kBAAQ,QAAQ,mCAAmC;AACnD,eAAK,eAAe;AAAA,QACtB,SAAS,OAAO;AACd,kBAAQ,KAAK,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAC5F,gBAAM;AAAA,QACR;AAEA,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,qBAAqB,WAAmB,SAAS,OAAsB;AACnF,cAAM,mBAAwB,YAAK,WAAW,mBAAmB;AAEjE,YAAI,CAAI,gBAAW,gBAAgB,GAAG;AACpC,kBAAQ,IAAI,cAAAP,QAAM,OAAO,4DAA4D,CAAC;AACtF;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,eAA6B,KAAK,MAAS,kBAAa,kBAAkB,MAAM,CAAC;AAGvF,gBAAM,YAAY;AAAA,YAChB,SAAS;AAAA,YACT,gBAAgB,aAAa,kBAAkB;AAAA,YAC/C,UAAU;AAAA,cACR,UAAU,aAAa,oBAAoB;AAAA,cAC3C,UAAU;AAAA,cACV,QAAQ;AAAA,YACV;AAAA,YACA,WAAW;AAAA,cACT,MAAM;AAAA,cACN,OAAO;AAAA,cACP,MAAM;AAAA,YACR;AAAA,YACA,cAAc;AAAA;AAAA,YAEd;AAAA,YACA,YAAY;AAAA,cACV,iBAAiB;AAAA,cACjB,mBAAmB;AAAA,cACnB,0BAA0B;AAAA,YAC5B;AAAA,UACF;AAEA,cAAI,CAAC,QAAQ;AACX,kBAAM,YAAiB,YAAK,WAAW,eAAe;AACtD,gBAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,cAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,YAC7C;AAEA,kBAAM,gBAAqB,YAAK,WAAW,aAAa;AACxD,YAAG,mBAAc,eAAoB,gBAAU,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;AAExE,oBAAQ,IAAI,cAAAA,QAAM,MAAM,oCAA+B,aAAa,EAAE,CAAC;AAAA,UACzE,OAAO;AACL,oBAAQ,IAAI,cAAAA,QAAM,KAAK,6DAA6D,CAAC;AAAA,UACvF;AAEA,eAAK,MAAM,iBAAiB;AAAA,QAC9B,SAAS,OAAO;AACd,gBAAM,WAAW,oCAAoC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAC7G,eAAK,MAAM,OAAO,KAAK,QAAQ;AAC/B,gBAAM,IAAI,MAAM,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,yBAAyB,WAAmB,SAAS,OAAsB;AACvF,cAAM,iBAAsB,YAAK,WAAW,eAAe;AAC3D,cAAM,cAAc;AAAA,UACb,YAAK,gBAAgB,OAAO;AAAA,UAC5B,YAAK,gBAAgB,QAAQ;AAAA,UAC7B,YAAK,gBAAgB,OAAO;AAAA,UAC5B,YAAK,gBAAgB,WAAW;AAAA,QACvC;AAEA,YAAI,CAAC,QAAQ;AACX,qBAAW,OAAO,aAAa;AAC7B,gBAAI,CAAI,gBAAW,GAAG,GAAG;AACvB,cAAG,eAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACrC,sBAAQ,IAAI,cAAAA,QAAM,MAAM,6BAAwB,GAAG,EAAE,CAAC;AAAA,YACxD;AAAA,UACF;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,cAAAA,QAAM,KAAK,uCAAuC,YAAY,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,QACzF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,aAAa,WAAmB,SAAS,OAAO,UAAU,OAAsB;AAC5F,cAAM,aAAa;AAAA,UACZ,YAAK,WAAW,QAAQ;AAAA,UACxB,YAAK,WAAW,WAAW;AAAA,UAC3B,YAAK,WAAW,WAAW;AAAA;AAAA,QAClC;AAEA,mBAAW,aAAa,YAAY;AAClC,cAAO,gBAAW,SAAS,GAAG;AAC5B,kBAAM,KAAK,uBAAuB,WAAW,WAAW,QAAQ,OAAO;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,uBACZ,WACA,WACA,SAAS,OACT,UAAU,OACK;AACf,cAAM,QAAW,iBAAY,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC;AAE7E,mBAAW,QAAQ,OAAO;AACxB,gBAAM,WAAgB,YAAK,WAAW,IAAI;AAE1C,cAAI;AACF,kBAAM,KAAK,YAAY,UAAU,WAAW,QAAQ,OAAO;AAC3D,iBAAK,MAAM;AAAA,UACb,SAAS,OAAO;AACd,kBAAM,WAAW,qBAAqB,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAC3G,iBAAK,MAAM,OAAO,KAAK,QAAQ;AAC/B,gBAAI,SAAS;AACX,sBAAQ,IAAI,cAAAA,QAAM,IAAI,UAAK,QAAQ,EAAE,CAAC;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,YACZ,UACA,WACA,SAAS,OACT,UAAU,OACK;AACf,cAAM,UAAa,kBAAa,UAAU,MAAM;AAChD,cAAM,WAAgB,gBAAS,UAAU,KAAK;AAG9C,cAAM,EAAE,MAAM,aAAa,WAAW,IAAI,KAAK;AAAA,UAC7C;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI,CAAC,QAAQ;AAEX,gBAAM,YAAiB,eAAQ,UAAU;AACzC,cAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,YAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,UAC7C;AAGA,cAAI;AAEJ,kBAAQ,MAAM;AAAA,YACZ,KAAK;AACH,gCAAkB,KAAK,kBAAkB;AAAA,gBACvC;AAAA,gBACA,KAAK,eAAe,OAAO;AAAA,cAC7B;AACA,mBAAK,MAAM;AACX;AAAA,YACF,KAAK;AACH,gCAAkB,KAAK,kBAAkB;AAAA,gBACvC;AAAA,gBACA,KAAK,eAAe,OAAO;AAAA,cAC7B;AACA,mBAAK,MAAM;AACX;AAAA,YACF,KAAK;AACH,gCAAkB,KAAK,kBAAkB;AAAA,gBACvC;AAAA,gBACA,KAAK,eAAe,OAAO;AAAA,cAC7B;AACA,mBAAK,MAAM;AACX;AAAA,YACF;AACE,oBAAM,IAAI,MAAM,sBAAsB,IAAI,EAAE;AAAA,UAChD;AAEA,UAAG,mBAAc,YAAY,eAAe;AAE5C,cAAI,SAAS;AACX,oBAAQ,IAAI,cAAAA,QAAM,MAAM,mBAAc,IAAI,KAAK,QAAQ,WAAM,UAAU,EAAE,CAAC;AAAA,UAC5E;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,cAAAA,QAAM,KAAK,2BAA2B,IAAI,KAAK,QAAQ,WAAM,UAAU,EAAE,CAAC;AAAA,QACxF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,sBACN,UACA,SACA,WAKA;AACA,cAAM,iBAAsB,YAAK,WAAW,eAAe;AAG3D,YAAI;AACJ,YAAI;AAEJ,YAAI,SAAS,WAAW,OAAO,KAAK,SAAS,SAAS,MAAM,GAAG;AAC7D,iBAAO;AACP,eAAK,KAAK,oBAAoB,UAAU,IAAI;AAAA,QAC9C,WAAW,SAAS,WAAW,QAAQ,KAAK,SAAS,SAAS,OAAO,GAAG;AACtE,iBAAO;AACP,eAAK,KAAK,oBAAoB,UAAU,KAAK;AAAA,QAC/C,WACE,SAAS,WAAW,OAAO,KAC3B,SAAS,SAAS,MAAM,KACxB,SAAS,WAAW,MAAM,GAC1B;AACA,iBAAO;AACP,eAAK,KAAK,oBAAoB,UAAU,KAAK;AAAA,QAC/C,OAAO;AAEL,iBAAO;AACP,eAAK,KAAK,oBAAoB,UAAU,KAAK;AAAA,QAC/C;AAEA,cAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,cAAM,QAAQ,KAAK,aAAa,OAAO,KAAK,SAAS,QAAQ,MAAM,GAAG;AAGtE,cAAM,kBAAkB;AAAA,UACtB;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,QAAQ,CAAC;AAAA,UACT,cAAc;AAAA,UACd,cAAc;AAAA,QAChB;AAEA,YAAI;AACJ,YAAI;AAEJ,gBAAQ,MAAM;AAAA,UACZ,KAAK;AACH,0BAAc;AAAA,cACZ,SAAS;AAAA,cACT,GAAG;AAAA,cACH,cAAc;AAAA,cACd,uBAAuB;AAAA,YACzB;AACA,yBAAkB,YAAK,gBAAgB,SAAS,GAAG,EAAE,KAAK;AAC1D;AAAA,UAEF,KAAK,SAAS;AAEZ,kBAAM,SAAS,KAAK,wBAAwB,SAAS;AACrD,0BAAc;AAAA,cACZ,UAAU;AAAA,cACV,SAAS;AAAA,cACT,GAAG;AAAA,cACH,cAAc;AAAA,YAChB;AACA,yBAAkB,YAAK,gBAAgB,UAAU,GAAG,EAAE,KAAK;AAC3D;AAAA,UACF;AAAA,UAEA,KAAK,QAAQ;AAEX,kBAAM,aAAa,KAAK,wBAAwB,SAAS;AACzD,kBAAM,UAAU,KAAK,yBAAyB,WAAW,UAAU;AACnE,0BAAc;AAAA,cACZ,SAAS;AAAA,cACT,UAAU;AAAA,cACV,SAAS;AAAA,cACT,GAAG;AAAA,cACH,iBAAiB;AAAA,cACjB,cAAc;AAAA,YAChB;AACA,yBAAkB,YAAK,gBAAgB,SAAS,GAAG,EAAE,KAAK;AAC1D;AAAA,UACF;AAAA,QACF;AAEA,eAAO,EAAE,MAAM,aAAa,WAAW;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAAoB,UAAkB,QAAwB;AAEpE,cAAM,WAAW;AAAA,UACf,IAAI,OAAO,GAAG,MAAM,WAAW;AAAA,UAC/B,IAAI,OAAO,IAAI,OAAO,YAAY,CAAC,IAAI,MAAM,YAAY,GAAG;AAAA,UAC5D;AAAA,QACF;AAEA,mBAAW,WAAW,UAAU;AAC9B,gBAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,cAAI,OAAO;AACT,kBAAM,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC;AAC/B,mBAAO,GAAG,MAAM,IAAI,IAAI,SAAS,GAAG,GAAG,CAAC;AAAA,UAC1C;AAAA,QACF;AAGA,gBAAQ,QAAQ;AAAA,UACd,KAAK;AACH,mBAAO,KAAK,YAAY,eAAe,UAAU;AAAA,UACnD,KAAK;AACH,mBAAO,KAAK,YAAY,gBAAgB,WAAW,UAAU;AAAA,UAC/D,KAAK;AACH,mBAAO,KAAK,YAAY,eAAe,YAAY,UAAU;AAAA,UAC/D;AACE,mBAAO,GAAG,MAAM;AAAA,QACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAa,SAAgC;AAEnD,cAAM,aAAa,QAAQ,MAAM,aAAa;AAC9C,YAAI,YAAY;AACd,iBAAO,WAAW,CAAC,EAAE,KAAK;AAAA,QAC5B;AAGA,cAAM,QAAQ,QACX,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,IAAI;AACxB,YAAI,MAAM,SAAS,GAAG;AACpB,iBAAO,MAAM,CAAC,EAAE,QAAQ,UAAU,EAAE;AAAA,QACtC;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,SAAyB;AAhclD;AAkcI,cAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,aAAI,WAAM,CAAC,MAAP,mBAAU,OAAO,WAAW,OAAO;AACrC,iBAAO,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,KAAK;AAAA,QACxC;AACA,eAAO,QAAQ,KAAK;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKQ,wBAAwB,YAA4B;AAE1D,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,yBAAyB,YAAoB,SAAyB;AAE5E,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,aAAa,WAAkC;AAC3D,cAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,cAAM,YAAiB,YAAK,WAAW,UAAU,SAAS,EAAE;AAG5D,aAAK,cAAc,WAAW,WAAW,CAAC,gBAAgB,QAAQ,UAAU,CAAC;AAE7E,gBAAQ,IAAI,cAAAA,QAAM,MAAM,4BAAuB,SAAS,EAAE,CAAC;AAAA,MAC7D;AAAA;AAAA;AAAA;AAAA,MAKQ,cAAc,KAAa,MAAc,UAAoB,CAAC,GAAS;AAC7E,YAAI,CAAI,gBAAW,IAAI,GAAG;AACxB,UAAG,eAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,QACxC;AAEA,cAAM,QAAW,iBAAY,GAAG;AAEhC,mBAAW,QAAQ,OAAO;AACxB,gBAAM,UAAe,YAAK,KAAK,IAAI;AACnC,gBAAM,WAAgB,YAAK,MAAM,IAAI;AAGrC,cAAI,QAAQ,KAAK,CAAC,YAAY,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,CAAC,GAAG;AAC9D;AAAA,UACF;AAEA,gBAAMQ,QAAU,cAAS,OAAO;AAEhC,cAAIA,MAAK,YAAY,GAAG;AACtB,iBAAK,cAAc,SAAS,UAAU,OAAO;AAAA,UAC/C,OAAO;AACL,YAAG,kBAAa,SAAS,QAAQ;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAAmB,WAAmB,SAAS,OAAsB;AACjF,cAAM,cAAc,CAAM,YAAK,WAAW,mBAAmB,CAAC;AAE9D,cAAM,aAAa,CAAM,YAAK,WAAW,QAAQ,GAAQ,YAAK,WAAW,WAAW,CAAC;AAErF,YAAI,CAAC,QAAQ;AAEX,qBAAW,QAAQ,aAAa;AAC9B,gBAAO,gBAAW,IAAI,GAAG;AACvB,cAAG,gBAAW,IAAI;AAClB,sBAAQ,IAAI,cAAAR,QAAM,MAAM,+BAA0B,IAAI,EAAE,CAAC;AAAA,YAC3D;AAAA,UACF;AAGA,qBAAW,OAAO,YAAY;AAC5B,gBAAO,gBAAW,GAAG,GAAG;AACtB,oBAAM,aAAkB,YAAK,WAAW,GAAQ,gBAAS,GAAG,CAAC,SAAS;AACtE,cAAG,gBAAW,KAAK,UAAU;AAC7B,sBAAQ,IAAI,cAAAA,QAAM,MAAM,qCAAgC,GAAG,WAAM,UAAU,EAAE,CAAC;AAAA,YAChF;AAAA,UACF;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,cAAAA,QAAM,KAAK,sDAAsD,CAAC;AAAA,QAChF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAuB;AAC7B,gBAAQ,IAAI;AAAA,EAAK,cAAAA,QAAM,KAAK,MAAM,oBAAoB,CAAC,EAAE;AACzD,gBAAQ,IAAI,cAAAA,QAAM,MAAM,kCAA6B,KAAK,MAAM,cAAc,EAAE,CAAC;AACjF,gBAAQ,IAAI,cAAAA,QAAM,MAAM,2BAAsB,KAAK,MAAM,cAAc,EAAE,CAAC;AAC1E,gBAAQ,IAAI,cAAAA,QAAM,MAAM,0BAAqB,KAAK,MAAM,aAAa,EAAE,CAAC;AACxE,gBAAQ,IAAI,cAAAA,QAAM,MAAM,2BAAsB,KAAK,MAAM,cAAc,EAAE,CAAC;AAC1E,gBAAQ,IAAI,cAAAA,QAAM,MAAM,0BAAqB,KAAK,MAAM,aAAa,EAAE,CAAC;AAExE,YAAI,KAAK,MAAM,OAAO,SAAS,GAAG;AAChC,kBAAQ,IAAI,cAAAA,QAAM,IAAI,8BAAyB,KAAK,MAAM,OAAO,MAAM,EAAE,CAAC;AAC1E,eAAK,MAAM,OAAO,QAAQ,CAAC,UAAU;AACnC,oBAAQ,IAAI,cAAAA,QAAM,IAAI,OAAO,KAAK,EAAE,CAAC;AAAA,UACvC,CAAC;AAAA,QACH;AAEA,gBAAQ,IAAI;AAAA,EAAK,cAAAA,QAAM,KAAK,KAAK,aAAa,CAAC,EAAE;AACjD,gBAAQ,IAAI,sDAAsD;AAClE,gBAAQ,IAAI,+CAA+C;AAC3D,gBAAQ,IAAI,iDAAiD;AAC7D,gBAAQ,IAAI,kDAAkD;AAAA,MAChE;AAAA,IACF;AAhhB2B;AAApB,IAAM,gBAAN;AAmhBS;AAAA;AAAA;;;ACxiBT,SAAS,gCAAyC;AACvD,QAAM,MAAM,IAAI,2BAAQ,mBAAmB;AAE3C,MACG,YAAY,6DAA6D,EACzE,OAAO,aAAa,oDAAoD,EACxE,OAAO,YAAY,gCAAgC,EACnD,OAAO,aAAa,gBAAgB,EACpC,OAAO,WAAW,kDAAkD,EACpE,OAAO,sBAAsB,0DAA0D,EACvF;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BF,EACC,OAAO,OAAO,YAA4B;AACzC,QAAI;AACF,YAAM,iBAAiB,OAAO;AAAA,IAChC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC/E;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,iBAAiB,SAAwC;AACtE,QAAM,cAAc,QAAQ,IAAI;AAEhC,MAAI;AAEF,UAAM,gBAAgB,IAAI,cAAc,WAAW;AACnD,QAAI,CAAC,cAAc,mBAAmB,WAAW,GAAG;AAClD,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAEA,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,YAAY,QAAQ,IAAI;AAGpD,UAAM,eAAe,IAAI,oBAAoB,QAAQ,aAAa,WAAW;AAC7E,UAAM,SAAS,aAAa,sBAAsB;AAElD,QAAI,CAAC,OAAO,WAAW;AACrB,cAAQ;AAAA,QACN,UAAU;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAGA,mBAAa,kBAAkB;AAC/B;AAAA,IACF;AAEA,YAAQ,IAAI,UAAU,QAAQ,gDAAyC,CAAC;AACxE,WAAO,WAAW,QAAQ,CAAC,QAAQ;AACjC,cAAQ,IAAI,UAAU,KAAK,aAAa,gBAAS,aAAa,GAAG,CAAC,EAAE,CAAC;AAAA,IACvE,CAAC;AAED,UAAM,cAAc,aAAa,gBAAgB;AACjD,UAAM,kBAAuB,gBAAS,aAAa,YAAY,SAAS;AAExE,YAAQ,IAAI,UAAU,KAAK;AAAA,0BAAsB,CAAC;AAClD,YAAQ,IAAI,UAAU,KAAK,wBAAwB,eAAe,GAAG,CAAC;AAGtE,UAAM,gBAAgB,cAAc,aAAa,OAAO,YAAY,YAAY;AAEhF,QAAI,cAAc,WAAW,GAAG;AAC9B,cAAQ,IAAI,UAAU,QAAQ,sBAAsB,CAAC;AACrD;AAAA,IACF;AAEA,YAAQ,IAAI,UAAU,KAAK;AAAA,8BAA0B,cAAc,MAAM,EAAE,CAAC;AAE5E,QAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,oBAAc,QAAQ,CAAC,SAAS;AAC9B,cAAM,aAAkB,gBAAS,aAAa,KAAK,MAAM;AACzD,cAAM,aAAkB,gBAAS,aAAa,KAAK,MAAM;AACzD,gBAAQ,IAAI,UAAU,MAAM,MAAM,UAAU,WAAM,UAAU,EAAE,CAAC;AAAA,MACjE,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,QAAQ;AAClB,cAAQ;AAAA,QACN,UAAU,KAAK,4EAAqE;AAAA,MACtF;AACA;AAAA,IACF;AAGA,UAAM,YAAY,cAAc,OAAO,CAAC,SAAY,gBAAW,KAAK,MAAM,CAAC;AAC3E,QAAI,UAAU,SAAS,KAAK,CAAC,QAAQ,OAAO;AAC1C,cAAQ,IAAI,UAAU,MAAM,wCAAmC,CAAC;AAChE,gBAAU,QAAQ,CAAC,SAAS;AAC1B,cAAM,aAAkB,gBAAS,aAAa,KAAK,MAAM;AACzD,gBAAQ,IAAI,UAAU,MAAM,qBAAqB,UAAU,EAAE,CAAC;AAAA,MAChE,CAAC;AACD,cAAQ;AAAA,QACN,UAAU;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ;AAClB,YAAM,aAAa,aAAa,OAAO,UAAU;AAAA,IACnD;AAGA,YAAQ,IAAI,UAAU,KAAK,mCAA4B,CAAC;AAGxD,UAAM,wBAAwB,YAAY;AAG1C,QAAI,gBAAgB;AACpB,eAAW,QAAQ,eAAe;AAChC,UAAI;AAEF,cAAM,YAAiB,eAAQ,KAAK,MAAM;AAC1C,YAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,UAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,QAC7C;AAGA,QAAG,gBAAW,KAAK,QAAQ,KAAK,MAAM;AACtC;AAEA,YAAI,QAAQ,SAAS;AACnB,gBAAM,aAAkB,gBAAS,aAAa,KAAK,MAAM;AACzD,gBAAM,aAAkB,gBAAS,aAAa,KAAK,MAAM;AACzD,kBAAQ,IAAI,UAAU,QAAQ,aAAQ,UAAU,WAAM,UAAU,EAAE,CAAC;AAAA,QACrE;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,UAAU;AAAA,YACR,qBAAqB,KAAK,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC/F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,6BAA6B,OAAO,UAAU;AAGpD,QAAI,eAAe,gBAAgB,OAAO,iBAAiB;AACzD,oBAAc,aAAa,EAAE,iBAAiB,YAAY,CAAC;AAC3D,cAAQ;AAAA,QACN,UAAU,QAAQ,oDAA+C,WAAW,GAAG;AAAA,MACjF;AAAA,IACF;AAEA,YAAQ,IAAI,UAAU,QAAQ;AAAA,4CAAwC,CAAC;AACvE,YAAQ,IAAI,UAAU,KAAK,sBAAsB,aAAa,EAAE,CAAC;AACjE,YAAQ,IAAI,UAAU,KAAK,wBAAwB,eAAe,GAAG,CAAC;AAGtE,YAAQ,IAAI,UAAU,KAAK,wCAAiC,CAAC;AAC7D,iBAAa,kBAAkB;AAAA,EACjC,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IAC/E;AAAA,EACF;AACF;AAEA,SAAS,cACP,cACA,YACA,cACyD;AACzD,QAAM,OAAgE,CAAC;AACvE,QAAM,cAAc,aAAa,gBAAgB;AAEjD,aAAW,aAAa,YAAY;AAClC,QAAI,CAAI,gBAAW,SAAS,EAAG;AAE/B,UAAM,UAAe,gBAAS,SAAS;AACvC,QAAI;AAGJ,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,oBAAY,YAAY;AACxB;AAAA,MACF,KAAK;AACH,oBAAY,YAAY;AACxB;AAAA,MACF,KAAK;AACH,oBAAY,YAAY;AACxB;AAAA,MACF,KAAK;AACH,oBAAY,YAAY;AACxB;AAAA,MACF,KAAK,aAAa;AAEhB,cAAM,UACH,iBAAY,WAAW,EAAE,eAAe,KAAK,CAAC,EAC9C,OAAO,CAAC,WAAW,OAAO,YAAY,CAAC,EACvC,IAAI,CAAC,WAAW,OAAO,IAAI;AAE9B,mBAAW,UAAU,SAAS;AAC5B,gBAAM,eAAoB,YAAK,WAAW,MAAM;AAChD,cAAI;AAEJ,kBAAQ,QAAQ;AAAA,YACd,KAAK;AAAA,YACL,KAAK;AACH,6BAAe,YAAY;AAC3B;AAAA,YACF,KAAK;AACH,6BAAe,YAAY;AAC3B;AAAA,YACF,KAAK;AACH,6BAAe,YAAY;AAC3B;AAAA,YACF,KAAK;AACH,6BAAe,YAAY;AAC3B;AAAA,YACF;AACE;AAAA,UACJ;AAGA,cAAO,gBAAW,YAAY,GAAG;AAC/B,kBAAM,QACH,iBAAY,YAAY,EACxB,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,OAAO,CAAC;AAElE,uBAAW,QAAQ,OAAO;AACxB,mBAAK,KAAK;AAAA,gBACR,QAAa,YAAK,cAAc,IAAI;AAAA,gBACpC,QAAa,YAAK,cAAc,IAAI;AAAA,gBACpC,MAAM;AAAA,cACR,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA;AACE;AAAA,IACJ;AAGA,QAAO,gBAAW,SAAS,GAAG;AAC5B,YAAM,QACH,iBAAY,SAAS,EACrB,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,OAAO,CAAC;AAElE,iBAAW,QAAQ,OAAO;AACxB,aAAK,KAAK;AAAA,UACR,QAAa,YAAK,WAAW,IAAI;AAAA,UACjC,QAAa,YAAK,WAAW,IAAI;AAAA,UACjC,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,wBAAwB,cAAkD;AACvF,QAAM,eAAe,aAAa,uBAAuB;AAEzD,aAAW,OAAO,cAAc;AAC9B,QAAI,CAAI,gBAAW,GAAG,GAAG;AACvB,MAAG,eAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC;AAAA,EACF;AACF;AAEA,eAAe,aAAa,aAAqB,YAAqC;AACpF,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,YAAiB,YAAK,aAAa,WAAW,SAAS,EAAE;AAE/D,UAAQ,IAAI,UAAU,KAAK,gCAA8B,gBAAS,aAAa,SAAS,CAAC,KAAK,CAAC;AAE/F,EAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAE3C,aAAW,aAAa,YAAY;AAClC,QAAO,gBAAW,SAAS,GAAG;AAC5B,YAAM,kBAAuB,YAAK,WAAgB,gBAAS,SAAS,CAAC;AACrE,YAAM,cAAc,WAAW,eAAe;AAAA,IAChD;AAAA,EACF;AAEA,UAAQ,IAAI,UAAU,QAAQ,0BAA0B,gBAAS,aAAa,SAAS,CAAC,EAAE,CAAC;AAC7F;AAEA,eAAe,cAAc,QAAgB,QAA+B;AAC1E,MAAI,CAAI,gBAAW,MAAM,GAAG;AAC1B,IAAG,eAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,QAAM,QAAW,iBAAY,QAAQ,EAAE,eAAe,KAAK,CAAC;AAE5D,aAAW,QAAQ,OAAO;AACxB,UAAM,aAAkB,YAAK,QAAQ,KAAK,IAAI;AAC9C,UAAM,aAAkB,YAAK,QAAQ,KAAK,IAAI;AAE9C,QAAI,KAAK,YAAY,GAAG;AACtB,YAAM,cAAc,YAAY,UAAU;AAAA,IAC5C,OAAO;AACL,MAAG,kBAAa,YAAY,UAAU;AAAA,IACxC;AAAA,EACF;AACF;AAEA,eAAe,6BAA6B,YAAqC;AAC/E,aAAW,OAAO,YAAY;AAC5B,QAAI;AACF,UAAO,gBAAW,GAAG,GAAG;AACtB,cAAM,QAAW,iBAAY,GAAG;AAChC,YAAI,MAAM,WAAW,GAAG;AACtB,UAAG,eAAU,GAAG;AAChB,kBAAQ,IAAI,UAAU,QAAQ,mCAAmC,gBAAS,GAAG,CAAC,EAAE,CAAC;AAAA,QACnF;AAAA,MACF;AAAA,IACF,SAAS,QAAQ;AAAA,IAEjB;AAAA,EACF;AACF;AA5XA,IAKAS,MACAC,QACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AACxB;AACA;AACA;AAUgB;AAyDD;AAiJN;AAiGM;AAUA;AAkBA;AAmBA;AAAA;AAAA;;;AClVR,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAI,2BAAQ,SAAS;AAEjC,MACG,YAAY,yCAAyC,EACrD,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,oDAAoD,EACtE,OAAO,WAAW,4CAA4C,EAC9D,OAAO,aAAa,sCAAsC;AAG7D,MACG,QAAQ,uBAAuB,EAC/B,YAAY,oCAAoC,EAChD,OAAO,uBAAuB,uBAAuB,EACrD,OAAO,yBAAyB,sCAAsC,EACtE,OAAO,6BAA6B,6BAA6B,EACjE,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,oDAAoD,EACtE,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,QAAgB,YAA4B;AACzD,UAAM,YAAY,QAAQ,yBAAyB,OAAO;AAAA,EAC5D,CAAC;AAEH,MACG,QAAQ,cAAc,EACtB,YAAY,2BAA2B,EACvC,OAAO,uBAAuB,uBAAuB,EACrD,OAAO,yBAAyB,sCAAsC,EACtE,OAAO,6BAA6B,gCAAgC,EACpE,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,oDAAoD,EACtE,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,QAAgB,YAA4B;AACzD,UAAM,YAAY,QAAQ,gBAAgB,OAAO;AAAA,EACnD,CAAC;AAEH,MACG,QAAQ,sBAAsB,EAC9B,YAAY,mCAAmC,EAC/C,OAAO,uBAAuB,uBAAuB,EACrD,OAAO,yBAAyB,sCAAsC,EACtE,OAAO,6BAA6B,wCAAwC,EAC5E,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,oDAAoD,EACtE,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,QAAgB,YAA4B;AACzD,UAAM,YAAY,QAAQ,wBAAwB,OAAO;AAAA,EAC3D,CAAC;AAEH,MACG,QAAQ,gBAAgB,EACxB,YAAY,6BAA6B,EACzC,OAAO,uBAAuB,uBAAuB,EACrD,OAAO,yBAAyB,kCAAkC,EAClE,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,oDAAoD,EACtE,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,QAAgB,YAA4B;AACzD,UAAM,YAAY,QAAQ,QAAQ,OAAO;AAAA,EAC3C,CAAC;AAEH,MACG,QAAQ,kBAAkB,EAC1B,YAAY,kCAAmC,EAC/C,OAAO,uBAAuB,+CAA+C,EAC7E,OAAO,yBAAyB,0CAA0C,EAC1E,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,oDAAoD,EACtE,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,QAAgB,YAA4B;AACzD,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,QAAQ;AACtC,cAAQ,MAAM,UAAU,MAAM,yCAAyC,CAAC;AACxE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,YAAY,QAAQ,YAAY,OAAO;AAAA,EAC/C,CAAC;AAGH,MACG,QAAQ,mBAAmB,EAC3B,YAAY,8CAA8C,EAC1D,SAAS,iBAAiB,kCAAkC,EAC5D,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,yBAAyB,uCAAuC,EACvE,OAAO,6BAA6B,6BAA6B,EACjE,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,oDAAoD,EACtE,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,SAAmB,YAA4B;AAC5D,UAAM,aAAa,SAAS,yBAAyB,OAAO;AAAA,EAC9D,CAAC;AAEH,MACG,QAAQ,UAAU,EAClB,YAAY,qCAAqC,EACjD,SAAS,iBAAiB,kCAAkC,EAC5D,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,yBAAyB,uCAAuC,EACvE,OAAO,6BAA6B,gCAAgC,EACpE,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,oDAAoD,EACtE,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,SAAmB,YAA4B;AAC5D,UAAM,aAAa,SAAS,gBAAgB,OAAO;AAAA,EACrD,CAAC;AAEH,MACG,QAAQ,kBAAkB,EAC1B,YAAY,6CAA6C,EACzD,SAAS,iBAAiB,kCAAkC,EAC5D,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,yBAAyB,uCAAuC,EACvE,OAAO,6BAA6B,wCAAwC,EAC5E,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,oDAAoD,EACtE,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,SAAmB,YAA4B;AAC5D,UAAM,aAAa,SAAS,wBAAwB,OAAO;AAAA,EAC7D,CAAC;AAGH,MACG,QAAQ,kBAAkB,EAC1B,YAAY,0DAA0D,EACtE,OAAO,aAAa,iCAAiC,EACrD,OAAO,OAAO,QAAgB,YAAmC;AAChE,UAAM,kBAAkB,QAAQ,OAAO;AAAA,EACzC,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YACb,QACA,aACA,SACe;AArKjB;AAsKE,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,UAAM,SAAS,IAAI,kBAAkB;AAGrC,UAAM,OAAO,SAAS,qBAAqB,MAAM;AACjD,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,eAAe,aAAa,kBAAkB,IAAI;AAExD,QAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,cAAQ,IAAI,UAAU,KAAK,aAAa,MAAM,OAAO,WAAW,EAAE,CAAC;AACnE,cAAQ,IAAI,UAAU,MAAM,kBAAkB,YAAY,EAAE,CAAC;AAC7D,cAAQ,IAAI,UAAU,MAAM,iBAAiB,WAAW,EAAE,CAAC;AAC3D,cAAQ,IAAI,UAAU,MAAM,SAAS,KAAK,SAAS,EAAE,CAAC;AAAA,IACxD;AAGA,UAAM,mBAAmB,gBAAgB;AAAA,MACvC;AAAA,MACA;AAAA,MACA,QAAQ,IAAI,QAAQ;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAEA,QAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAI,QAAQ,SAAS,iBAAiB,SAAS,SAAS,KAAK,iBAAiB,OAAO,WAAW,GAAG;AACjG,gBAAQ,IAAI,UAAU,QAAQ,sCAAsC,CAAC;AACrE,yBAAiB,SAAS;AAAA,UAAQ,aAChC,QAAQ,IAAI,UAAU,QAAQ,OAAO,OAAO,EAAE,CAAC;AAAA,QACjD;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,UAAU,MAAM,0BAA0B,CAAC;AACzD,yBAAiB,OAAO;AAAA,UAAQ,WAC9B,QAAQ,MAAM,UAAU,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,QAC/C;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,iBAAiB,SAAS,SAAS,KAAK,CAAC,QAAQ,OAAO;AAC1D,cAAQ,IAAI,UAAU,QAAQ,sBAAsB,CAAC;AACrD,uBAAiB,SAAS;AAAA,QAAQ,aAChC,QAAQ,IAAI,UAAU,QAAQ,OAAO,OAAO,EAAE,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,UAAU,KAAK,2BAA2B,CAAC;AACvD;AAAA,IACF;AAGA,QAAI,QAAQ,UAAU;AACpB,uBAAiB,KAAK,WAAW,QAAQ;AAAA,IAC3C;AAGA,UAAM,UAAU;AAAA,MACd,OAAO,iBAAiB,KAAK;AAAA,MAC7B,gBAAgB,iBAAiB,KAAK;AAAA,MACtC,cAAc,iBAAiB,KAAK;AAAA,MACpC,GAAI,QAAQ,YAAY,EAAE,UAAU,QAAQ,SAAS;AAAA,IACvD;AAEA,WAAO,WAAW,KAAK,WAAW,OAAO;AAGzC,wBAAoB,aAAa;AAEjC,YAAQ,IAAI,UAAU,QAAQ,QAAQ,MAAM,gBAAgB,WAAW,EAAE,CAAC;AAE1E,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,iBAAiB,CAAC;AAC7C,cAAQ,IAAI,YAAY,YAAY,WAAM,WAAW,EAAE;AACvD,cAAQ,IAAI,uBAAsB,sBAAiB,KAAK,mBAAtB,mBAAsC,eAAe,EAAE;AACzF,cAAQ,IAAI,sBAAsB,IAAI,OAAK,sBAAiB,KAAK,mBAAtB,mBAAsC,oBAAmB,EAAE,EAAE,eAAe,CAAC,EAAE;AAC1H,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,aAAa,QAAQ,MAAM,EAAE;AAAA,MAC3C;AACA,UAAI,QAAQ,UAAU;AACpB,gBAAQ,IAAI,eAAe,QAAQ,QAAQ,EAAE;AAAA,MAC/C;AACA,UAAI,QAAQ,UAAU;AACpB,gBAAQ,IAAI,kBAAkB,QAAQ,QAAQ,EAAE;AAAA,MAClD;AAAA,IACF;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACrF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,aACb,SACA,aACA,SACe;AACf,UAAQ,IAAI,UAAU,KAAK,mBAAmB,QAAQ,MAAM,aAAa,WAAW,EAAE,CAAC;AAEvF,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,mCAAmC,CAAC;AAAA,EACjE;AAEA,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,QAAM,WAAqB,CAAC;AAE5B,aAAW,UAAU,SAAS;AAC5B,QAAI;AACF,YAAM,YAAY,QAAQ,aAAa,EAAE,GAAG,SAAS,SAAS,MAAM,CAAC;AACrE;AACA,cAAQ,IAAI,UAAU,QAAQ,UAAK,MAAM,EAAE,CAAC;AAAA,IAC9C,SAAS,OAAO;AACd;AACA,YAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU;AAC1D,eAAS,KAAK,GAAG,MAAM,KAAK,QAAQ,EAAE;AACtC,cAAQ,IAAI,UAAU,MAAM,UAAK,MAAM,KAAK,QAAQ,EAAE,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,KAAK,2BAA2B,CAAC;AACvD,UAAQ,IAAI,iBAAiB,YAAY,EAAE;AAC3C,UAAQ,IAAI,aAAa,YAAY,EAAE;AACvC,UAAQ,IAAI,YAAY,QAAQ,MAAM,EAAE;AAExC,MAAI,SAAS,SAAS,KAAK,QAAQ,SAAS;AAC1C,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,MAAM,WAAW,CAAC;AACxC,aAAS,QAAQ,aAAW,QAAQ,IAAI,UAAU,MAAM,OAAO,OAAO,EAAE,CAAC,CAAC;AAAA,EAC5E;AAEA,MAAI,eAAe,GAAG;AACpB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,kBAAkB,QAAgB,SAA+C;AAC9F,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,UAAM,OAAO,SAAS,qBAAqB,MAAM;AACjD,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,eAAe,aAAa,kBAAkB,IAAI;AACxD,UAAM,uBAAuB,gBAAgB,wBAAwB,IAAI;AAEzE,YAAQ,IAAI,UAAU,KAAK,sBAAsB,MAAM,GAAG,CAAC;AAC3D,YAAQ,IAAI,oBAAoBC,iBAAgB,YAAY,CAAC,EAAE;AAC/D,YAAQ,IAAI,gBAAgBC,aAAY,IAAI,CAAC,EAAE;AAC/C,YAAQ,IAAI,WAAW,KAAK,SAAS,EAAE;AAEvC,QAAI,KAAK,gBAAgB;AACvB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,iBAAiB,CAAC;AAC7C,cAAQ,IAAI,sBAAsB,KAAK,eAAe,eAAe,EAAE;AACvE,cAAQ,IAAI,sBAAsB,IAAI,KAAK,KAAK,eAAe,eAAe,EAAE,eAAe,CAAC,EAAE;AAElG,UAAI,KAAK,eAAe,gBAAgB;AACtC,gBAAQ,IAAI,qBAAqB,KAAK,eAAe,cAAc,EAAE;AAAA,MACvE;AAEA,UAAI,KAAK,eAAe,mBAAmB;AACzC,gBAAQ,IAAI,aAAa,KAAK,eAAe,iBAAiB,EAAE;AAAA,MAClE;AAEA,UAAI,KAAK,eAAe,UAAU;AAChC,gBAAQ,IAAI,eAAe,KAAK,eAAe,QAAQ,EAAE;AAAA,MAC3D;AAEA,cAAQ,IAAI,0BAA0B,KAAK,eAAe,sBAAsB,QAAQ,IAAI,EAAE;AAAA,IAChG;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,wBAAwB,CAAC;AAEpD,QAAI,qBAAqB,WAAW,GAAG;AACrC,cAAQ,IAAI,kCAAkC;AAAA,IAChD,OAAO;AACL,2BAAqB,QAAQ,WAAS;AACpC,cAAM,cAAc,gBAAgB,YAAY,MAAM,KAAK;AAC3D,cAAM,eAAe,cAAc,2BAA2B;AAC9D,gBAAQ,IAAI,YAAOD,iBAAgB,KAAK,CAAC,GAAG,YAAY,EAAE;AAAA,MAC5D,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,MAAM,eAAe,CAAC;AAC5C,cAAQ,IAAI,YAAY,KAAK,KAAK,EAAE;AACpC,cAAQ,IAAI,eAAe,KAAK,QAAQ,EAAE;AAC1C,cAAQ,IAAI,eAAe,KAAK,QAAQ,EAAE;AAC1C,cAAQ,IAAI,cAAc,IAAI,KAAK,KAAK,YAAY,EAAE,eAAe,CAAC,EAAE;AACxE,cAAQ,IAAI,cAAc,IAAI,KAAK,KAAK,YAAY,EAAE,eAAe,CAAC,EAAE;AAAA,IAC1E;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC3F;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,SAAS,qBAA0C,QAAoC;AAE9F,QAAM,OAAO,oBAAoB,iBAAiB,MAAM;AACxD,MAAI,KAAM,QAAO,KAAK;AAEtB,QAAM,QAAQ,oBAAoB,kBAAkB,MAAM;AAC1D,MAAI,MAAO,QAAO,MAAM;AAExB,QAAM,OAAO,oBAAoB,iBAAiB,MAAM;AACxD,MAAI,KAAM,QAAO,KAAK;AAEtB,QAAM,KAAK,oBAAoB,eAAe,MAAM;AACpD,MAAI,GAAI,QAAO,GAAG;AAElB,SAAO;AACT;AAEA,SAASC,aAAY,MAA2B;AAC9C,MAAI,aAAa,QAAQ,EAAE,cAAc,MAAO,QAAO;AACvD,MAAI,cAAc,QAAQ,WAAW,KAAM,QAAO;AAClD,MAAI,cAAc,QAAQ,aAAa,KAAM,QAAO;AACpD,MAAI,cAAc,KAAM,QAAO;AAC/B,MAAI,gBAAgB,KAAM,QAAO;AACjC,SAAO;AACT;AAEA,SAASD,iBAAgB,OAA6B;AACpD,QAAM,cAAwD;AAAA,IAC5D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,uBAAuB,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACvB,cAAc,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACd,sBAAsB,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACtB,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,EACR;AAEA,QAAM,UAAU,YAAY,KAAK,MAAM,CAAC,SAAS;AACjD,SAAO,QAAQ,MAAM,YAAY,EAAE,QAAQ,MAAM,GAAG,CAAC;AACvD;AAlbA,IAKAE;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AAOxB;AACA;AACA;AACA;AACA;AAYgB;AAqID;AA+GA;AA6CA;AA4EN;AAiBA,WAAAD,cAAA;AASA,WAAAD,kBAAA;AAAA;AAAA;;;AC9XF,SAAS,qBAA8B;AAC5C,QAAM,MAAM,IAAI,2BAAQ,OAAO;AAE/B,MACG,YAAY,gCAAgC,EAC5C,OAAO,aAAa,iCAAiC;AAGxD,MACG,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,OAAO,iBAAiB,0CAA0C,EAClE,OAAO,qBAAqB,8DAA8D,EAC1F,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,yBAAyB,oBAAoB,EACpD,OAAO,qBAAqB,sCAAsC,OAAO,EACzE,OAAO,sBAAsB,0CAA0C,EACvE,OAAO,aAAa,iCAAiC,EACrD,OAAO,OAAO,YAA+B;AAC5C,UAAM,WAAW,OAAO;AAAA,EAC1B,CAAC;AAGH,MACG,QAAQ,gBAAgB,EACxB,YAAY,qDAAqD,EACjE,OAAO,sBAAsB,kCAAkC,EAC/D,OAAO,aAAa,8BAA8B,EAClD,OAAO,OAAO,QAAgB,YAA8D;AAC3F,UAAM,UAAU,QAAQ,OAAO;AAAA,EACjC,CAAC;AAGH,MACG,QAAQ,8BAA8B,EACtC,YAAY,4BAA4B,EACxC,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,yBAAyB,kCAAkC,EAClE,OAAO,6BAA6B,kCAAkC,EACtE,OAAO,aAAa,mDAAmD,EACvE,OAAO,WAAW,gDAAgD,EAClE,OAAO,aAAa,kCAAkC,EACtD,OAAO,OAAO,QAAgB,UAAkB,YAAgC;AAC/E,UAAM,YAAY,QAAQ,UAA0B,OAAO;AAAA,EAC7D,CAAC;AAGH,MACG,QAAQ,UAAU,EAClB,YAAY,6CAA6C,EACzD,OAAO,iBAAiB,kCAAkC,EAC1D,OAAO,SAAS,kCAAkC,EAClD,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,YAAiE;AAC9E,UAAM,eAAe,OAAO;AAAA,EAC9B,CAAC;AAGH,MACG,QAAQ,WAAW,EACnB,YAAY,uCAAuC,EACnD,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,qBAAqB,8BAA8B,OAAO,EACjE,OAAO,aAAa,yBAAyB,EAC7C,OAAO,OAAO,YAAmE;AAChF,UAAM,mBAAmB,OAAO;AAAA,EAClC,CAAC;AAGH,MACG,QAAQ,UAAU,EAClB,YAAY,0CAA0C,EACtD,OAAO,kBAAkB,sCAAsC,EAC/D,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,aAAa,oCAAoC,EACxD,OAAO,OAAO,YAA+D;AAC5E,UAAM,kBAAkB,OAAO;AAAA,EACjC,CAAC;AAGH,MACG,QAAQ,0BAA0B,EAClC,YAAY,qCAAqC,EACjD,SAAS,iBAAiB,kCAAkC,EAC5D,OAAO,uBAAuB,0BAA0B,EACxD,OAAO,yBAAyB,mCAAmC,EACnE,OAAO,aAAa,mDAAmD,EACvE,OAAO,WAAW,iDAAiD,EACnE,OAAO,aAAa,kCAAkC,EACtD,OAAO,OAAO,UAAkB,SAAmB,YAAgC;AAClF,UAAM,iBAAiB,SAAS,UAA0B,OAAO;AAAA,EACnE,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,WAAW,SAA2C;AACnE,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAI,QAAuB,CAAC;AAG5B,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,SAAS;AAC7C,YAAM,KAAK,GAAG,oBAAoB,aAAa,CAAC;AAAA,IAClD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,MAAM;AAC1C,YAAM,KAAK,GAAG,oBAAoB,UAAU,CAAC;AAAA,IAC/C;AAGA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,MAAM,OAAO,UAAQ,KAAK,WAAW,QAAQ,MAAM;AAAA,IAC7D;AAEA,QAAI,QAAQ,OAAO;AACjB,cAAQ,MAAM,OAAO,UAAQ;AAC3B,cAAM,iBAAiB,aAAa,kBAAkB,IAAI;AAC1D,eAAO,mBAAmB,QAAQ;AAAA,MACpC,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,UAAU;AACpB,cAAQ,MAAM,OAAO,UAAQ,KAAK,aAAa,QAAQ,QAAQ;AAAA,IACjE;AAEA,QAAI,QAAQ,WAAW,QAAQ;AAC7B,YAAM,SAAS,MAAM,IAAI,WAAS;AAAA,QAChC,IAAIG,WAAU,IAAI;AAAA,QAClB,MAAMC,aAAY,IAAI;AAAA,QACtB,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,OAAO,aAAa,kBAAkB,IAAI;AAAA,QAC1C,UAAU,KAAK;AAAA,QACf,cAAc,KAAK;AAAA,QACnB,cAAc,KAAK;AAAA,QACnB,GAAI,QAAQ,mBAAmB;AAAA,UAC7B,uBAAuB,gBAAgB,wBAAwB,IAAI;AAAA,QACrE;AAAA,QACA,GAAI,QAAQ,WAAW;AAAA,UACrB,gBAAgB,KAAK;AAAA,QACvB;AAAA,MACF,EAAE;AACF,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,WAAW;AAChC,uBAAiB,KAAK;AACtB;AAAA,IACF;AAGA,YAAQ,IAAI,UAAU,KAAK,SAAS,MAAM,MAAM,QAAQ,CAAC;AACzD,YAAQ,IAAI,EAAE;AAEd,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,UAAU,QAAQ,sCAAsC,CAAC;AACrE;AAAA,IACF;AAGA,UAAM,UAAU,CAAC,MAAM,QAAQ,SAAS,UAAU,SAAS,UAAU;AACrE,QAAI,QAAQ,gBAAiB,SAAQ,KAAK,uBAAuB;AAEjE,YAAQ,IAAI,QAAQ,IAAI,OAAK,UAAU,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AACpE,YAAQ,IAAI,QAAQ,IAAI,MAAM,SAAI,OAAO,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC;AAGvD,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAKD,WAAU,IAAI;AACzB,YAAM,OAAOC,aAAY,IAAI;AAC7B,YAAM,QAAQ,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,UAAU,GAAG,EAAE,IAAI,QAAQ,KAAK;AAClF,YAAM,SAAS,KAAK;AACpB,YAAM,QAAQ,aAAa,kBAAkB,IAAI;AACjD,YAAM,WAAW,KAAK,YAAY;AAElC,YAAM,MAAM;AAAA,QACV,GAAG,OAAO,EAAE;AAAA,QACZ,KAAK,OAAO,EAAE;AAAA,QACd,MAAM,OAAO,EAAE;AAAA,QACfC,kBAAiB,MAAM,EAAE,OAAO,EAAE;AAAA,QAClCC,iBAAgB,KAAK,EAAE,OAAO,EAAE;AAAA,QAChC,SAAS,OAAO,EAAE;AAAA,MACpB;AAEA,UAAI,QAAQ,iBAAiB;AAC3B,cAAM,cAAc,gBAAgB,wBAAwB,IAAI;AAChE,cAAM,kBAAkB,YAAY,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,KAAK,YAAY,SAAS,IAAI,QAAQ;AAC/F,YAAI,KAAK,gBAAgB,OAAO,EAAE,CAAC;AAAA,MACrC;AAEA,cAAQ,IAAI,IAAI,KAAK,GAAG,CAAC;AAAA,IAC3B;AAEA,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,EAAE;AACd,uBAAiB,KAAK;AAAA,IACxB;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACpF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,UAAU,QAAgB,SAA0E;AACjH,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAE1F,UAAM,OAAOC,UAAS,qBAAqB,MAAM;AACjD,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,eAAe,aAAa,kBAAkB,IAAI;AACxD,UAAM,oBAAoB,aAAa,kBAAkB,YAAY;AACrE,UAAM,iBAAiB,aAAa,eAAe,YAAY;AAE/D,YAAQ,IAAI,UAAU,KAAK,yBAAyB,MAAM,GAAG,CAAC;AAC9D,YAAQ,IAAI,YAAY,KAAK,KAAK,EAAE;AACpC,YAAQ,IAAI,WAAWH,aAAY,IAAI,CAAC,EAAE;AAC1C,YAAQ,IAAI,oBAAoBC,kBAAiB,KAAK,MAAM,CAAC,EAAE;AAC/D,YAAQ,IAAI,oBAAoBC,iBAAgB,YAAY,CAAC,EAAE;AAC/D,YAAQ,IAAI,iBAAiB,oBAAoB,qBAAqB,eAAe,EAAE;AACvF,YAAQ,IAAI,eAAe,KAAK,QAAQ,EAAE;AAE1C,QAAI,KAAK,gBAAgB;AACvB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,iBAAiB,CAAC;AAC7C,cAAQ,IAAI,sBAAsB,KAAK,eAAe,eAAe,EAAE;AACvE,cAAQ,IAAI,sBAAsB,IAAI,KAAK,KAAK,eAAe,eAAe,EAAE,eAAe,CAAC,EAAE;AAElG,UAAI,KAAK,eAAe,gBAAgB;AACtC,gBAAQ,IAAI,qBAAqBA,iBAAgB,KAAK,eAAe,cAAc,CAAC,EAAE;AAAA,MACxF;AAEA,UAAI,KAAK,eAAe,mBAAmB;AACzC,gBAAQ,IAAI,aAAa,KAAK,eAAe,iBAAiB,EAAE;AAAA,MAClE;AAEA,UAAI,KAAK,eAAe,UAAU;AAChC,gBAAQ,IAAI,eAAe,KAAK,eAAe,QAAQ,EAAE;AAAA,MAC3D;AAEA,cAAQ,IAAI,0BAA0B,KAAK,eAAe,sBAAsB,QAAQ,IAAI,EAAE;AAE9F,UAAI,KAAK,eAAe,mBAAmB;AACzC,gBAAQ,IAAI,wBAAwB,KAAK,eAAe,iBAAiB,EAAE;AAAA,MAC7E;AAAA,IACF,WAAW,KAAK,OAAO;AACrB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,6CAA6C,CAAC;AAAA,IAC9E;AAEA,QAAI,QAAQ,iBAAiB;AAC3B,YAAM,uBAAuB,gBAAgB,wBAAwB,IAAI;AACzE,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,wBAAwB,CAAC;AAEpD,UAAI,qBAAqB,WAAW,GAAG;AACrC,gBAAQ,IAAI,kCAAkC;AAAA,MAChD,OAAO;AACL,6BAAqB,QAAQ,WAAS;AACpC,gBAAM,cAAc,gBAAgB,YAAY,MAAM,KAAK;AAC3D,gBAAM,eAAe,cAAc,2BAA2B;AAC9D,kBAAQ,IAAI,YAAOA,iBAAgB,KAAK,CAAC,GAAG,YAAY,EAAE;AAAA,QAC5D,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,MAAM,yBAAyB,CAAC;AACtD,cAAQ,IAAI,eAAe,KAAK,QAAQ,EAAE;AAC1C,cAAQ,IAAI,cAAc,IAAI,KAAK,KAAK,YAAY,EAAE,eAAe,CAAC,EAAE;AACxE,cAAQ,IAAI,cAAc,IAAI,KAAK,KAAK,YAAY,EAAE,eAAe,CAAC,EAAE;AACxE,cAAQ,IAAI,WAAW,KAAK,SAAS,EAAE;AAEvC,UAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AACrC,gBAAQ,IAAI,WAAW,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MAC/C;AAEA,UAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;AACrD,gBAAQ,IAAI,mBAAmB,KAAK,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,MAC/D;AAAA,IACF;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACnF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,YAAY,QAAgB,UAAwB,SAA4C;AAlW/G;AAmWE,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,UAAM,SAAS,IAAI,kBAAkB;AAErC,UAAM,OAAOC,UAAS,qBAAqB,MAAM;AACjD,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,eAAe,aAAa,kBAAkB,IAAI;AAExD,QAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,cAAQ,IAAI,UAAU,KAAK,sBAAsB,MAAM,EAAE,CAAC;AAC1D,cAAQ,IAAI,UAAU,MAAM,kBAAkB,YAAY,EAAE,CAAC;AAC7D,cAAQ,IAAI,UAAU,MAAM,cAAc,QAAQ,EAAE,CAAC;AACrD,cAAQ,IAAI,UAAU,MAAM,SAAS,KAAK,SAAS,EAAE,CAAC;AAAA,IACxD;AAGA,UAAM,mBAAmB,gBAAgB;AAAA,MACvC;AAAA,MACA;AAAA,MACA,QAAQ,IAAI,QAAQ;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAEA,QAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAI,QAAQ,SAAS,iBAAiB,SAAS,SAAS,KAAK,iBAAiB,OAAO,WAAW,GAAG;AACjG,gBAAQ,IAAI,UAAU,QAAQ,wCAAwC,CAAC;AACvE,yBAAiB,SAAS;AAAA,UAAQ,aAChC,QAAQ,IAAI,UAAU,QAAQ,OAAO,OAAO,EAAE,CAAC;AAAA,QACjD;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,UAAU,MAAM,sBAAsB,CAAC;AACrD,yBAAiB,OAAO;AAAA,UAAQ,WAC9B,QAAQ,MAAM,UAAU,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,QAC/C;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,iBAAiB,SAAS,SAAS,KAAK,CAAC,QAAQ,OAAO;AAC1D,cAAQ,IAAI,UAAU,QAAQ,kBAAkB,CAAC;AACjD,uBAAiB,SAAS;AAAA,QAAQ,aAChC,QAAQ,IAAI,UAAU,QAAQ,OAAO,OAAO,EAAE,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,UAAU,KAAK,2BAA2B,CAAC;AACvD;AAAA,IACF;AAGA,QAAI,QAAQ,UAAU;AACpB,uBAAiB,KAAK,WAAW,QAAQ;AAAA,IAC3C;AAGA,UAAM,UAAU;AAAA,MACd,OAAO,iBAAiB,KAAK;AAAA,MAC7B,gBAAgB,iBAAiB,KAAK;AAAA,MACtC,cAAc,iBAAiB,KAAK;AAAA,MACpC,GAAI,QAAQ,YAAY,EAAE,UAAU,QAAQ,SAAS;AAAA,IACvD;AAEA,WAAO,WAAW,KAAK,WAAW,OAAO;AAGzC,wBAAoB,aAAa;AAEjC,YAAQ,IAAI,UAAU,QAAQ,qBAAqB,MAAM,KAAK,YAAY,WAAM,QAAQ,EAAE,CAAC;AAE3F,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,iBAAiB,CAAC;AAC7C,cAAQ,IAAI,uBAAsB,sBAAiB,KAAK,mBAAtB,mBAAsC,eAAe,EAAE;AACzF,cAAQ,IAAI,sBAAsB,IAAI,OAAK,sBAAiB,KAAK,mBAAtB,mBAAsC,oBAAmB,EAAE,EAAE,eAAe,CAAC,EAAE;AAC1H,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,aAAa,QAAQ,MAAM,EAAE;AAAA,MAC3C;AACA,UAAI,QAAQ,UAAU;AACpB,gBAAQ,IAAI,eAAe,QAAQ,QAAQ,EAAE;AAAA,MAC/C;AACA,UAAI,QAAQ,UAAU;AACpB,gBAAQ,IAAI,kBAAkB,QAAQ,QAAQ,EAAE;AAAA,MAClD;AAAA,IACF;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACrF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,eAAe,SAA6E;AACzG,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAI,QAAuB,CAAC;AAE5B,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,SAAS;AAC7C,YAAM,KAAK,GAAG,oBAAoB,aAAa,CAAC;AAAA,IAClD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,MAAM;AAC1C,YAAM,KAAK,GAAG,oBAAoB,UAAU,CAAC;AAAA,IAC/C;AAEA,YAAQ,IAAI,UAAU,KAAK,cAAc,MAAM,MAAM,WAAW,CAAC;AAEjE,QAAI,aAAa;AACjB,QAAI,eAAe;AACnB,QAAI,eAAe;AACnB,UAAM,SAAgF,CAAC;AAEvF,eAAW,QAAQ,OAAO;AACxB,YAAM,SAASJ,WAAU,IAAI;AAC7B,UAAI,YAAY;AAGhB,UAAI,CAAC,KAAK,OAAO;AACf,eAAO,KAAK;AAAA,UACV;AAAA,UACA,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AACD;AAAA,MACF;AAGA,UAAI,KAAK,SAAS,CAAC,KAAK,gBAAgB;AACtC,eAAO,KAAK;AAAA,UACV;AAAA,UACA,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AACD,oBAAY;AAAA,MACd;AAGA,UAAI,KAAK,gBAAgB;AACvB,cAAM,aAAa,aAAa,sBAAsB,KAAK,cAAc;AACzE,YAAI,CAAC,WAAW,OAAO;AACrB,qBAAW,OAAO,QAAQ,WAAS;AACjC,mBAAO,KAAK;AAAA,cACV;AAAA,cACA,MAAM;AAAA,cACN,SAAS,2BAA2B,MAAM,OAAO;AAAA,YACnD,CAAC;AAAA,UACH,CAAC;AACD,sBAAY;AAAA,QACd;AAEA,mBAAW,SAAS,QAAQ,aAAW;AACrC,iBAAO,KAAK;AAAA,YACV;AAAA,YACA,MAAM;AAAA,YACN,SAAS,2BAA2B,QAAQ,OAAO;AAAA,UACrD,CAAC;AACD;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,WAAW;AACb;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,qBAAqB,CAAC;AACjD,YAAQ,IAAI,YAAY,UAAU,EAAE;AACpC,YAAQ,IAAI,cAAc,YAAY,EAAE;AACxC,YAAQ,IAAI,eAAe,YAAY,EAAE;AACzC,YAAQ,IAAI,YAAY,MAAM,MAAM,EAAE;AAEtC,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,eAAe,CAAC;AAE9C,YAAM,SAAS,OAAO,OAAO,OAAK,EAAE,SAAS,OAAO;AACpD,YAAM,WAAW,OAAO,OAAO,OAAK,EAAE,SAAS,SAAS;AAExD,UAAI,OAAO,SAAS,GAAG;AACrB,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,MAAM,SAAS,CAAC;AACtC,eAAO,QAAQ,WAAS;AACtB,kBAAQ,IAAI,UAAU,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,EAAE,CAAC;AAAA,QACpE,CAAC;AAAA,MACH;AAEA,UAAI,SAAS,SAAS,KAAK,QAAQ,SAAS;AAC1C,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,QAAQ,WAAW,CAAC;AAC1C,iBAAS,QAAQ,WAAS;AACxB,kBAAQ,IAAI,UAAU,QAAQ,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,EAAE,CAAC;AAAA,QACtE,CAAC;AAAA,MACH;AAEA,UAAI,QAAQ,KAAK;AACf,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,8DAA8D,CAAC;AAAA,MAC5F;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,2CAA2C,CAAC;AAAA,IAC5E;AAEA,QAAI,eAAe,GAAG;AACpB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACxF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,mBAAmB,SAA+E;AAC/G,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAI,QAAuB,CAAC;AAE5B,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,SAAS;AAC7C,YAAM,KAAK,GAAG,oBAAoB,aAAa,CAAC;AAAA,IAClD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,MAAM;AAC1C,YAAM,KAAK,GAAG,oBAAoB,UAAU,CAAC;AAAA,IAC/C;AAGA,UAAM,oBAA4C,CAAC;AACnD,UAAM,qBAA6C,CAAC;AACpD,UAAM,mBAA2C,CAAC;AAClD,QAAI,eAAe;AACnB,QAAI,iBAAiB;AAErB,UAAM,QAAQ,UAAQ;AACpB,YAAM,QAAQ,aAAa,kBAAkB,IAAI;AACjD,YAAM,SAAS,KAAK;AACpB,YAAM,OAAOC,aAAY,IAAI;AAE7B,wBAAkB,KAAK,KAAK,kBAAkB,KAAK,KAAK,KAAK;AAC7D,yBAAmB,MAAM,KAAK,mBAAmB,MAAM,KAAK,KAAK;AACjE,uBAAiB,IAAI,KAAK,iBAAiB,IAAI,KAAK,KAAK;AAEzD,UAAI,KAAK,SAAS,KAAK,gBAAgB;AACrC;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,WAAW,QAAQ;AAC7B,YAAM,YAAY;AAAA,QAChB,aAAa,MAAM;AAAA,QACnB,oBAAoB;AAAA,QACpB,qBAAqB;AAAA,QACrB,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,UAChB,UAAU;AAAA,UACV,iBAAiB;AAAA,UACjB,sBAAsB,gBAAgB,eAAe,kBAAkB;AAAA,QACzE;AAAA,MACF;AACA,cAAQ,IAAI,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAC9C;AAAA,IACF;AAGA,YAAQ,IAAI,UAAU,KAAK,oBAAoB,MAAM,MAAM,gBAAgB,CAAC;AAC5E,YAAQ,IAAI,EAAE;AAEd,YAAQ,IAAI,UAAU,KAAK,qBAAqB,CAAC;AACjD,WAAO,QAAQ,iBAAiB,EAC7B,KAAK,CAAC,CAAC,EAAC,CAAC,GAAG,CAAC,EAAC,CAAC,MAAM,IAAI,CAAC,EAC1B,QAAQ,CAAC,CAAC,OAAO,KAAK,MAAM;AAC3B,YAAM,cAAc,QAAQ,MAAM,SAAS,KAAK,QAAQ,CAAC;AACzD,cAAQ,IAAI,KAAKE,iBAAgB,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,MAAM,SAAS,EAAE,SAAS,CAAC,CAAC,KAAK,UAAU,IAAI;AAAA,IACvG,CAAC;AAEH,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,6BAA6B,CAAC;AACzD,aAAO,QAAQ,kBAAkB,EAC9B,KAAK,CAAC,CAAC,EAAC,CAAC,GAAG,CAAC,EAAC,CAAC,MAAM,IAAI,CAAC,EAC1B,QAAQ,CAAC,CAAC,QAAQ,KAAK,MAAM;AAC5B,cAAM,cAAc,QAAQ,MAAM,SAAS,KAAK,QAAQ,CAAC;AACzD,gBAAQ,IAAI,KAAKD,kBAAiB,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,MAAM,SAAS,EAAE,SAAS,CAAC,CAAC,KAAK,UAAU,IAAI;AAAA,MACzG,CAAC;AAEH,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,oBAAoB,CAAC;AAChD,aAAO,QAAQ,gBAAgB,EAC5B,KAAK,CAAC,CAAC,EAAC,CAAC,GAAG,CAAC,EAAC,CAAC,MAAM,IAAI,CAAC,EAC1B,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAC1B,cAAM,cAAc,QAAQ,MAAM,SAAS,KAAK,QAAQ,CAAC;AACzD,gBAAQ,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC,IAAI,MAAM,SAAS,EAAE,SAAS,CAAC,CAAC,KAAK,UAAU,IAAI;AAAA,MACrF,CAAC;AAAA,IACL;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,mBAAmB,CAAC;AAC/C,YAAQ,IAAI,gCAAgC,YAAY,EAAE;AAC1D,YAAQ,IAAI,sBAAsB,cAAc,EAAE;AAClD,QAAI,eAAe,iBAAiB,GAAG;AACrC,YAAM,uBAAuB,gBAAgB,eAAe,kBAAkB,KAAK,QAAQ,CAAC;AAC5F,cAAQ,IAAI,yBAAyB,mBAAmB,GAAG;AAAA,IAC7D;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACvF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,kBAAkB,SAA2E;AAC1G,QAAM,YAA4B;AAAA,IAChC;AAAA,IAAY;AAAA,IAAU;AAAA,IAAa;AAAA,IACnC;AAAA,IAAyB;AAAA,IAAgB;AAAA,IAAwB;AAAA,IAAY;AAAA,EAC/E;AAEA,UAAQ,IAAI,UAAU,KAAK,4BAA4B,CAAC;AACxD,UAAQ,IAAI,EAAE;AAEd,MAAI,QAAQ,MAAM;AAChB,UAAM,YAAY,QAAQ;AAC1B,UAAM,cAAc,aAAa,sBAAsB,SAAS;AAEhE,YAAQ,IAAI,UAAU,KAAK,oBAAoBC,iBAAgB,SAAS,CAAC,GAAG,CAAC;AAC7E,QAAI,YAAY,WAAW,GAAG;AAC5B,cAAQ,IAAI,4BAA4B;AAAA,IAC1C,OAAO;AACL,kBAAY,QAAQ,WAAS;AAC3B,gBAAQ,IAAI,YAAOA,iBAAgB,KAAK,CAAC,EAAE;AAAA,MAC7C,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAEA,MAAI,QAAQ,IAAI;AACd,UAAM,UAAU,QAAQ;AACxB,UAAM,aAAa,UAAU,OAAO,WAAS;AAC3C,YAAM,cAAc,aAAa,sBAAsB,KAAK;AAC5D,aAAO,YAAY,SAAS,OAAO;AAAA,IACrC,CAAC;AAED,YAAQ,IAAI,UAAU,KAAK,kBAAkBA,iBAAgB,OAAO,CAAC,GAAG,CAAC;AACzE,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAI,qCAAqC;AAAA,IACnD,OAAO;AACL,iBAAW,QAAQ,WAAS;AAC1B,gBAAQ,IAAI,KAAKA,iBAAgB,KAAK,CAAC,SAAI;AAAA,MAC7C,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAGA,UAAQ,IAAI,UAAU,KAAK,oBAAoB,CAAC;AAChD,UAAQ,IAAI,EAAE;AAEd,UAAQ,IAAI,UAAU,KAAK,qBAAqB,CAAC;AACjD,UAAQ,IAAI,2DAA4C;AACxD,UAAQ,IAAI,EAAE;AAEd,UAAQ,IAAI,UAAU,KAAK,wBAAwB,CAAC;AACpD,UAAQ,IAAI,yCAAoC;AAChD,UAAQ,IAAI,uCAAkC;AAC9C,UAAQ,IAAI,6CAAwC;AACpD,UAAQ,IAAI,4CAAuC;AACnD,UAAQ,IAAI,oCAA+B;AAC3C,UAAQ,IAAI,wBAAmB;AAC/B,UAAQ,IAAI,EAAE;AAEd,UAAQ,IAAI,UAAU,KAAK,iBAAiB,CAAC;AAC7C,UAAQ,IAAI,6CAAmC;AAE/C,MAAI,QAAQ,SAAS;AACnB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,4BAA4B,CAAC;AACxD,cAAU,QAAQ,WAAS;AACzB,YAAM,cAAc,aAAa,sBAAsB,KAAK;AAC5D,cAAQ,IAAI,KAAKA,iBAAgB,KAAK,CAAC,GAAG;AAC1C,UAAI,YAAY,WAAW,GAAG;AAC5B,gBAAQ,IAAI,sBAAsB;AAAA,MACpC,OAAO;AACL,oBAAY,QAAQ,aAAW;AAC7B,kBAAQ,IAAI,cAASA,iBAAgB,OAAO,CAAC,EAAE;AAAA,QACjD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAe,iBAAiB,SAAmB,UAAwB,SAA4C;AACrH,UAAQ,IAAI,UAAU,KAAK,kBAAkB,QAAQ,MAAM,aAAa,QAAQ,EAAE,CAAC;AAEnF,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,mCAAmC,CAAC;AAAA,EACjE;AAEA,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,QAAM,WAAqB,CAAC;AAE5B,aAAW,UAAU,SAAS;AAC5B,QAAI;AACF,YAAM,YAAY,QAAQ,UAAU,EAAE,GAAG,SAAS,SAAS,MAAM,CAAC;AAClE;AACA,cAAQ,IAAI,UAAU,QAAQ,UAAK,MAAM,EAAE,CAAC;AAAA,IAC9C,SAAS,OAAO;AACd;AACA,YAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU;AAC1D,eAAS,KAAK,GAAG,MAAM,KAAK,QAAQ,EAAE;AACtC,cAAQ,IAAI,UAAU,MAAM,UAAK,MAAM,KAAK,QAAQ,EAAE,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,KAAK,uBAAuB,CAAC;AACnD,UAAQ,IAAI,iBAAiB,YAAY,EAAE;AAC3C,UAAQ,IAAI,aAAa,YAAY,EAAE;AACvC,UAAQ,IAAI,YAAY,QAAQ,MAAM,EAAE;AAExC,MAAI,SAAS,SAAS,KAAK,QAAQ,SAAS;AAC1C,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,MAAM,WAAW,CAAC;AACxC,aAAS,QAAQ,aAAW,QAAQ,IAAI,UAAU,MAAM,OAAO,OAAO,EAAE,CAAC,CAAC;AAAA,EAC5E;AAEA,MAAI,eAAe,GAAG;AACpB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,SAASC,UAAS,qBAA0C,QAAoC;AAE9F,QAAM,OAAO,oBAAoB,iBAAiB,MAAM;AACxD,MAAI,KAAM,QAAO,KAAK;AAEtB,QAAM,QAAQ,oBAAoB,kBAAkB,MAAM;AAC1D,MAAI,MAAO,QAAO,MAAM;AAExB,QAAM,OAAO,oBAAoB,iBAAiB,MAAM;AACxD,MAAI,KAAM,QAAO,KAAK;AAEtB,QAAM,KAAK,oBAAoB,eAAe,MAAM;AACpD,MAAI,GAAI,QAAO,GAAG;AAElB,SAAO;AACT;AAEA,SAASJ,WAAU,MAA2B;AAC5C,MAAI,gBAAgB,QAAQ,UAAU,KAAM,QAAO,KAAK;AACxD,MAAI,aAAa,KAAM,QAAO,KAAK;AACnC,MAAI,cAAc,QAAQ,WAAW,KAAM,QAAO,KAAK;AACvD,MAAI,cAAc,QAAQ,aAAa,KAAM,QAAO,KAAK;AACzD,MAAI,cAAc,KAAM,QAAO,KAAK;AACpC,QAAM,IAAI,MAAM,mBAAmB;AACrC;AAEA,SAASC,aAAY,MAA2B;AAC9C,MAAI,gBAAgB,QAAQ,UAAU,KAAM,QAAO;AACnD,MAAI,aAAa,QAAQ,EAAE,cAAc,MAAO,QAAO;AACvD,MAAI,cAAc,QAAQ,WAAW,KAAM,QAAO;AAClD,MAAI,cAAc,QAAQ,aAAa,KAAM,QAAO;AACpD,MAAI,cAAc,KAAM,QAAO;AAC/B,SAAO;AACT;AAEA,SAASE,iBAAgB,OAA6B;AACpD,QAAM,cAAwD;AAAA,IAC5D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,uBAAuB,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACvB,cAAc,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACd,sBAAsB,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACtB,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,EACR;AAEA,QAAM,UAAU,YAAY,KAAK,MAAM,CAAC,SAAS;AACjD,SAAO,QAAQ,MAAM,YAAY,EAAE,QAAQ,MAAM,GAAG,CAAC;AACvD;AAEA,SAASD,kBAAiB,QAAwB;AAChD,QAAM,eAAyD;AAAA,IAC7D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACZ;AAEA,QAAM,UAAU,aAAa,MAAM,MAAM,CAAC,SAAS;AACnD,SAAO,QAAQ,OAAO,YAAY,CAAC;AACrC;AAEA,SAAS,iBAAiB,OAA4B;AACpD,QAAM,oBAA4C,CAAC;AAEnD,QAAM,QAAQ,UAAQ;AACpB,UAAM,QAAQ,aAAa,kBAAkB,IAAI;AACjD,sBAAkB,KAAK,KAAK,kBAAkB,KAAK,KAAK,KAAK;AAAA,EAC/D,CAAC;AAED,UAAQ,IAAI,UAAU,KAAK,gBAAgB,CAAC;AAC5C,SAAO,QAAQ,iBAAiB,EAC7B,KAAK,CAAC,CAAC,EAAC,CAAC,GAAG,CAAC,EAAC,CAAC,MAAM,IAAI,CAAC,EAC1B,QAAQ,CAAC,CAAC,OAAO,KAAK,MAAM;AAC3B,UAAM,cAAc,QAAQ,MAAM,SAAS,KAAK,QAAQ,CAAC;AACzD,YAAQ,IAAI,KAAKC,iBAAgB,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,MAAM,SAAS,EAAE,SAAS,CAAC,CAAC,KAAK,UAAU,IAAI;AAAA,EACvG,CAAC;AACL;AAh5BA,IAKAE;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AAOxB;AACA;AACA;AACA;AACA;AAqBgB;AAgGD;AA6HA;AAgGA;AAyGA;AA2IA;AAkHA;AA+EA;AA0CN,WAAAD,WAAA;AAiBA,WAAAJ,YAAA;AASA,WAAAC,cAAA;AASA,WAAAE,kBAAA;AAiBA,WAAAD,mBAAA;AAYA;AAAA;AAAA;;;ACr2BF,SAAS,4BAAqC;AACnD,QAAM,MAAM,IAAI,2BAAQ,eAAe;AAEvC,MACG,YAAY,oDAAoD,EAChE,OAAO,iBAAiB,sDAAsD,EAC9E,OAAO,aAAa,0CAA0C,EAC9D,OAAO,YAAY,sCAAsC,EACzD,OAAO,WAAW,0DAA0D,EAC5E,OAAO,aAAa,qCAAqC,EACzD,OAAO,qBAAqB,4BAA4B,EACxD,OAAO,4BAA4B,uCAAuC,QAAQ,EAClF,OAAO,OAAO,YAAiC;AAC9C,UAAM,cAAc,OAAO;AAAA,EAC7B,CAAC;AAGH,MACG,QAAQ,SAAS,EACjB,YAAY,iDAAiD,EAC7D,OAAO,iBAAiB,iCAAiC,EACzD,OAAO,aAAa,mCAAmC,EACvD,OAAO,OAAO,YAAkD;AAC/D,UAAM,iBAAiB,OAAO;AAAA,EAChC,CAAC;AAGH,MACG,QAAQ,UAAU,EAClB,YAAY,4BAA4B,EACxC,OAAO,iBAAiB,kCAAkC,EAC1D,OAAO,aAAa,sCAAsC,EAC1D,OAAO,OAAO,YAAkD;AAC/D,UAAM,kBAAkB,OAAO;AAAA,EACjC,CAAC;AAGH,MACG,QAAQ,qBAAqB,EAC7B,YAAY,mCAAmC,EAC/C,OAAO,aAAa,yCAAyC,EAC7D,OAAO,aAAa,oCAAoC,EACxD,OAAO,OAAO,SAAiB,YAAqD;AACnF,UAAM,kBAAkB,SAAS,OAAO;AAAA,EAC1C,CAAC;AAGH,MACG,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,OAAO,iBAAiB,yCAAyC,EACjE,OAAO,qBAAqB,8BAA8B,OAAO,EACjE,OAAO,OAAO,YAAgD;AAC7D,UAAM,oBAAoB,OAAO;AAAA,EACnC,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,cAAc,SAA6C;AACxE,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,UAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAI,QAAuB,CAAC;AAE5B,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,SAAS;AAC7C,YAAM,KAAK,GAAG,oBAAoB,aAAa,CAAC;AAAA,IAClD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,MAAM;AAC1C,YAAM,KAAK,GAAG,oBAAoB,UAAU,CAAC;AAAA,IAC/C;AAEA,YAAQ,IAAI,UAAU,KAAK,SAAS,MAAM,MAAM,sBAAsB,CAAC;AAGvE,UAAM,wBAAwB,MAAM,OAAO,UAAQ,eAAe,eAAe,IAAI,CAAC;AAEtF,YAAQ,IAAI,UAAU,KAAK,GAAG,sBAAsB,MAAM,uBAAuB,CAAC;AAClF,YAAQ,IAAI,UAAU,KAAK,GAAG,MAAM,SAAS,sBAAsB,MAAM,yBAAyB,CAAC;AAEnG,QAAI,sBAAsB,WAAW,GAAG;AACtC,cAAQ,IAAI,UAAU,QAAQ,iCAAiC,CAAC;AAChE;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,UAAU,KAAK,sCAAsC,CAAC;AAClE,YAAM,UAAU,eAAe,iBAAiB,qBAAqB;AACrE,2BAAqB,SAAS,QAAQ,OAAO;AAC7C;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,UAAU,KAAK,0BAA0B,CAAC;AACtD,YAAM,cAAc,qBAAqB;AACzC,cAAQ,IAAI,UAAU,QAAQ,sBAAsB,CAAC;AAAA,IACvD;AAGA,YAAQ,IAAI,UAAU,KAAK,uBAAuB,CAAC;AACnD,UAAM,kBAAkB,eAAe;AAAA,MACrC;AAAA,MACA,QAAQ,cAAc;AAAA,IACxB;AAGA,QAAI,eAAe;AACnB,QAAI,sBAAsB;AAE1B,aAAS,IAAI,GAAG,IAAI,sBAAsB,QAAQ,KAAK;AACrD,YAAM,eAAe,sBAAsB,CAAC;AAC5C,YAAM,WAAW,gBAAgB,cAAc,CAAC;AAEhD,UAAI,SAAS,WAAW,gBAAgB,cAAc,CAAC,GAAG;AACxD,YAAI;AAEF,gBAAM,eAAe,MAAM;AAAA,YAAK,UAC9BI,WAAU,IAAI,MAAM,SAAS;AAAA,UAC/B;AAEA,cAAI,cAAc;AAEhB,kBAAM,wBAAwB,eAAe;AAAA,cAC3C;AAAA,cACA,QAAQ,cAAc;AAAA,YACxB;AAEA,gBAAI,sBAAsB,SAAS;AAEjC,oBAAM,UAAU;AAAA,gBACd,OAAO,sBAAsB,KAAK;AAAA,gBAClC,gBAAgB,sBAAsB,KAAK;AAAA,gBAC3C,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,cACvC;AAEA,qBAAO,WAAW,aAAa,WAAW,OAAO;AACjD;AAEA,kBAAI,QAAQ,SAAS;AACnB,wBAAQ,IAAI,UAAU,QAAQ,UAAK,SAAS,OAAO,KAAK,SAAS,UAAU,WAAM,SAAS,SAAS,EAAE,CAAC;AAAA,cACxG;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd;AACA,gBAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU;AAC1D,kBAAQ,IAAI,UAAU,MAAM,UAAK,SAAS,OAAO,KAAK,QAAQ,EAAE,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAGA,wBAAoB,aAAa;AAGjC,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,UAAM,iBAAiB,iBAAiB,SAAS;AACjD,UAAM,UAAU,QAAQ,WAAW;AAEnC,UAAM,UAAU;AAAA,MACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,cAAc;AAAA,MACd,SAAS;AAAA,QACP,MAAM,QAAQ;AAAA,QACd,aAAa,QAAQ;AAAA,QACrB,gBAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAEA,iCAAc,SAAS,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAGvD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,oBAAoB,CAAC;AAChD,YAAQ,IAAI,sBAAsB,sBAAsB,MAAM,EAAE;AAChE,YAAQ,IAAI,4BAA4B,gBAAgB,cAAc,EAAE;AACxE,YAAQ,IAAI,wBAAwB,gBAAgB,YAAY,EAAE;AAClE,YAAQ,IAAI,oBAAoB,YAAY,EAAE;AAC9C,YAAQ,IAAI,6BAA6B,mBAAmB,EAAE;AAC9D,YAAQ,IAAI,oBAAoB,OAAO,EAAE;AAEzC,QAAI,gBAAgB,OAAO,SAAS,GAAG;AACrC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,MAAM,mBAAmB,CAAC;AAChD,sBAAgB,OAAO,QAAQ,WAAS;AACtC,gBAAQ,IAAI,UAAU,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,QAAI,gBAAgB,eAAe,KAAK,sBAAsB,GAAG;AAC/D,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,+DAA+D,CAAC;AAC9F,cAAQ,KAAK,CAAC;AAAA,IAChB,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,mCAAmC,CAAC;AAAA,IACpE;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC/E;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,iBAAiB,SAA8D;AAC5F,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAI,QAAuB,CAAC;AAE5B,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,SAAS;AAC7C,YAAM,KAAK,GAAG,oBAAoB,aAAa,CAAC;AAAA,IAClD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,MAAM;AAC1C,YAAM,KAAK,GAAG,oBAAoB,UAAU,CAAC;AAAA,IAC/C;AAEA,UAAM,UAAU,eAAe,iBAAiB,KAAK;AAErD,YAAQ,IAAI,UAAU,KAAK,oBAAoB,CAAC;AAChD,YAAQ,IAAI,kBAAkB,QAAQ,WAAW,EAAE;AACnD,YAAQ,IAAI,qBAAqB,QAAQ,eAAe,EAAE;AAC1D,YAAQ,IAAI,uBAAuB,QAAQ,gBAAgB,EAAE;AAE7D,QAAI,QAAQ,oBAAoB,GAAG;AACjC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,iCAAiC,CAAC;AAChE;AAAA,IACF;AAEA,yBAAqB,SAAS,QAAQ,OAAO;AAAA,EAE/C,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC7E;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,kBAAkB,SAA8D;AAC7F,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAI,QAAuB,CAAC;AAE5B,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,SAAS;AAC7C,YAAM,KAAK,GAAG,oBAAoB,aAAa,CAAC;AAAA,IAClD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,MAAM;AAC1C,YAAM,KAAK,GAAG,oBAAoB,UAAU,CAAC;AAAA,IAC/C;AAEA,UAAM,aAAa,eAAe,kBAAkB,KAAK;AAEzD,YAAQ,IAAI,UAAU,KAAK,uBAAuB,CAAC;AACnD,YAAQ,IAAI,YAAY,WAAW,QAAQ,QAAQ,IAAI,EAAE;AACzD,YAAQ,IAAI,kBAAkB,MAAM,MAAM,EAAE;AAC5C,YAAQ,IAAI,aAAa,WAAW,OAAO,MAAM,EAAE;AACnD,YAAQ,IAAI,eAAe,WAAW,SAAS,MAAM,EAAE;AAEvD,QAAI,WAAW,OAAO,SAAS,GAAG;AAChC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,MAAM,oBAAoB,CAAC;AACjD,iBAAW,OAAO,QAAQ,WAAS;AACjC,gBAAQ,IAAI,UAAU,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,SAAS,SAAS,KAAK,QAAQ,SAAS;AACrD,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,sBAAsB,CAAC;AACrD,iBAAW,SAAS,QAAQ,aAAW;AACrC,gBAAQ,IAAI,UAAU,QAAQ,OAAO,OAAO,EAAE,CAAC;AAAA,MACjD,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,qBAAqB,CAAC;AACjD,iBAAW,mBAAmB,QAAQ,YAAU;AAC9C,cAAM,SAAS,OAAO,aAAa,OAAO,gBAAgB,OAAO,iBAAiB,WAAM;AACxF,gBAAQ,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,WAAW,OAAO,SAAS,cAAc,OAAO,YAAY,WAAW,OAAO,cAAc,qBAAqB,OAAO,mBAAmB,EAAE;AAAA,MACxL,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,WAAW,OAAO;AACrB,cAAQ,KAAK,CAAC;AAAA,IAChB,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,8BAA8B,CAAC;AAAA,IAC/D;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAChF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,kBAAkB,SAAiB,SAAiE;AACjH,MAAI;AAEF,UAAM,UAAU,KAAK,MAAM,QAAQ,IAAI,EAAE,aAAa,SAAS,MAAM,CAAC;AACtE,UAAM,kBAAmC,QAAQ;AAEjD,YAAQ,IAAI,UAAU,KAAK,+BAA+B,OAAO,EAAE,CAAC;AACpE,YAAQ,IAAI,yBAAyB,IAAI,KAAK,QAAQ,SAAS,EAAE,eAAe,CAAC,EAAE;AACnF,YAAQ,IAAI,wBAAwB,gBAAgB,cAAc,MAAM,EAAE;AAE1E,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,UAAU,KAAK,qCAAqC,CAAC;AAAA,IACnE;AAEA,UAAM,eAAe,eAAe,mBAAmB,gBAAgB,aAAa;AAEpF,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,gBAAgB,CAAC;AAC5C,YAAQ,IAAI,uBAAuB,aAAa,iBAAiB,gBAAgB,EAAE;AACnF,YAAQ,IAAI,0BAA0B,aAAa,iBAAiB,mBAAmB,EAAE;AACzF,YAAQ,IAAI,qBAAqB,aAAa,iBAAiB,cAAc,EAAE;AAC/E,YAAQ,IAAI,uBAAuB,aAAa,iBAAiB,SAAS,EAAE;AAE5E,QAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,sBAAsB,CAAC;AAClD,mBAAa,oBAAoB,QAAQ,QAAM;AAC7C,gBAAQ,IAAI,KAAK,GAAG,OAAO,KAAK,GAAG,MAAM,eAAe,GAAG,eAAe,GAAG;AAAA,MAC/E,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,QAAQ;AAClB;AAAA,IACF;AAGA,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,UAAM,SAAS,IAAI,kBAAkB;AAErC,QAAI,eAAe;AACnB,QAAI,eAAe;AAEnB,eAAW,aAAa,aAAa,qBAAqB;AACxD,UAAI;AACF,YAAI,UAAU,WAAW,uBAAuB;AAE9C,gBAAM,OAAOC,UAAS,qBAAqB,UAAU,OAAO;AAC5D,cAAI,MAAM;AACR,kBAAM,UAAU;AAAA,cACd,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,QAAQ,UAAU;AAAA,cAClB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,YACvC;AAEA,mBAAO,WAAW,KAAK,WAAW,OAAO;AACzC;AAEA,gBAAI,QAAQ,SAAS;AACnB,sBAAQ,IAAI,UAAU,QAAQ,UAAK,UAAU,OAAO,wBAAwB,CAAC;AAAA,YAC/E;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd;AACA,cAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU;AAC1D,gBAAQ,IAAI,UAAU,MAAM,UAAK,UAAU,OAAO,KAAK,QAAQ,EAAE,CAAC;AAAA,MACpE;AAAA,IACF;AAGA,wBAAoB,aAAa;AAEjC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,mBAAmB,CAAC;AAC/C,YAAQ,IAAI,iBAAiB,YAAY,EAAE;AAC3C,YAAQ,IAAI,aAAa,YAAY,EAAE;AACvC,YAAQ,IAAI,YAAY,aAAa,iBAAiB,gBAAgB,EAAE;AAExE,QAAI,eAAe,GAAG;AACpB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,kCAAkC,CAAC;AACjE,cAAQ,KAAK,CAAC;AAAA,IAChB,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,kCAAkC,CAAC;AAAA,IACnE;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,oBAAoB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC9E;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,oBAAoB,SAA4D;AAC7F,MAAI;AACF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,UAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAI,QAAuB,CAAC;AAE5B,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,SAAS;AAC7C,YAAM,KAAK,GAAG,oBAAoB,aAAa,CAAC;AAAA,IAClD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ;AAC5C,YAAM,KAAK,GAAG,oBAAoB,YAAY,CAAC;AAAA,IACjD;AACA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,MAAM;AAC1C,YAAM,KAAK,GAAG,oBAAoB,UAAU,CAAC;AAAA,IAC/C;AAEA,UAAM,UAAU,eAAe,iBAAiB,KAAK;AAErD,QAAI,QAAQ,WAAW,QAAQ;AAC7B,YAAM,SAAS;AAAA,QACb,aAAa,QAAQ;AAAA,QACrB,iBAAiB,QAAQ;AAAA,QACzB,kBAAkB,QAAQ;AAAA,QAC1B,uBAAuB,QAAQ,mBAAmB,QAAQ,cAAc,KAAK,QAAQ,CAAC;AAAA,QACtF,OAAO,QAAQ;AAAA,MACjB;AACA,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,IACF;AAGA,YAAQ,IAAI,UAAU,KAAK,mBAAmB,CAAC;AAC/C,YAAQ,IAAI,kBAAkB,QAAQ,WAAW,EAAE;AACnD,YAAQ,IAAI,uBAAuB,QAAQ,gBAAgB,EAAE;AAC7D,YAAQ,IAAI,sBAAsB,QAAQ,eAAe,EAAE;AAE3D,QAAI,QAAQ,cAAc,GAAG;AAC3B,YAAM,cAAc,QAAQ,mBAAmB,QAAQ,cAAc,KAAK,QAAQ,CAAC;AACnF,cAAQ,IAAI,yBAAyB,UAAU,GAAG;AAAA,IACpD;AAEA,QAAI,QAAQ,kBAAkB,GAAG;AAC/B,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,0BAA0B,CAAC;AACzD,cAAQ,kBACL,OAAO,UAAQ,KAAK,eAAe,EACnC,MAAM,GAAG,EAAE,EACX,QAAQ,UAAQ;AACf,gBAAQ,IAAI,KAAK,KAAK,OAAO,KAAK,KAAK,SAAS,MAAM,KAAK,cAAc,WAAM,KAAK,YAAY,EAAE;AAAA,MACpG,CAAC;AAEH,UAAI,QAAQ,kBAAkB,IAAI;AAChC,gBAAQ,IAAI,aAAa,QAAQ,kBAAkB,EAAE,OAAO;AAAA,MAC9D;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,yBAAyB,CAAC;AAAA,IAC1D;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAClF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,SAAS,qBAAqB,SAAc,SAAyB;AACnE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,KAAK,oBAAoB,CAAC;AAEhD,QAAM,iBAAiB,QAAQ,kBAAkB,OAAO,CAAC,SAAc,KAAK,eAAe;AAC3F,QAAM,kBAAkB,QAAQ,kBAAkB,OAAO,CAAC,SAAc,CAAC,KAAK,eAAe;AAE7F,MAAI,eAAe,SAAS,GAAG;AAC7B,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,8BAA8B,CAAC;AAC7D,mBAAe,MAAM,GAAG,UAAU,eAAe,SAAS,EAAE,EAAE,QAAQ,CAAC,SAAc;AACnF,cAAQ,IAAI,KAAK,KAAK,OAAO,KAAK,KAAK,SAAS,MAAM,KAAK,cAAc,WAAM,KAAK,YAAY,EAAE;AAAA,IACpG,CAAC;AAED,QAAI,CAAC,WAAW,eAAe,SAAS,IAAI;AAC1C,cAAQ,IAAI,aAAa,eAAe,SAAS,EAAE,OAAO;AAAA,IAC5D;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,KAAK,SAAS;AACzC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,yBAAyB,CAAC;AACxD,oBAAgB,MAAM,GAAG,EAAE,EAAE,QAAQ,CAAC,SAAc;AAClD,cAAQ,IAAI,KAAK,KAAK,OAAO,KAAK,KAAK,SAAS,4BAA4B;AAAA,IAC9E,CAAC;AAED,QAAI,gBAAgB,SAAS,IAAI;AAC/B,cAAQ,IAAI,aAAa,gBAAgB,SAAS,EAAE,OAAO;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,eAAe,cAAc,OAAqC;AAChE,QAAM,YAAY,qBAAoB,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,CAAC;AACpF,UAAQ,IAAI,EAAE,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAEtD,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,QAAQ,IAAI,EAAE,aAAa,KAAK,WAAW,MAAM;AACjE,UAAM,aAAa,GAAG,SAAS,IAAID,WAAU,IAAI,CAAC;AAClD,YAAQ,IAAI,EAAE,cAAc,YAAY,OAAO;AAAA,EACjD;AAEA,UAAQ,IAAI,UAAU,KAAK,sBAAsB,SAAS,EAAE,CAAC;AAC/D;AAEA,SAASC,UAAS,qBAA0C,QAAoC;AAE9F,QAAM,OAAO,oBAAoB,iBAAiB,MAAM;AACxD,MAAI,KAAM,QAAO,KAAK;AAEtB,QAAM,QAAQ,oBAAoB,kBAAkB,MAAM;AAC1D,MAAI,MAAO,QAAO,MAAM;AAExB,QAAM,OAAO,oBAAoB,iBAAiB,MAAM;AACxD,MAAI,KAAM,QAAO,KAAK;AAEtB,QAAM,KAAK,oBAAoB,eAAe,MAAM;AACpD,MAAI,GAAI,QAAO,GAAG;AAElB,SAAO;AACT;AAEA,SAASD,WAAU,MAA2B;AAC5C,MAAI,gBAAgB,QAAQ,UAAU,KAAM,QAAO,KAAK;AACxD,MAAI,aAAa,KAAM,QAAO,KAAK;AACnC,MAAI,cAAc,QAAQ,WAAW,KAAM,QAAO,KAAK;AACvD,MAAI,cAAc,QAAQ,aAAa,KAAM,QAAO,KAAK;AACzD,MAAI,cAAc,KAAM,QAAO,KAAK;AACpC,QAAM,IAAI,MAAM,mBAAmB;AACrC;AA/mBA,IAKAE,oBACA;AANA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB,gBAA8B;AAM9B;AACA;AACA;AACA;AACA;AAYgB;AA2DD;AAoKA;AAiDA;AA0EA;AAsGA;AA8EN;AAgCM;AAaN,WAAAD,WAAA;AAiBA,WAAAD,YAAA;AAAA;AAAA;;;ACzkBF,SAAS,yBAAkC;AAChD,QAAM,MAAM,IAAI,2BAAQ,WAAW;AAEnC,MACG,YAAY,uEAAuE,EACnF,OAAO,qBAAqB,yCAAyC,OAAO,EAC5E,OAAO,sBAAsB,uCAAuC,GAAG,EACvE,OAAO,YAAY,oCAAoC,EACvD,OAAO,aAAa,8BAA8B,EAClD,OAAO,OAAO,YAA8B;AAC3C,QAAI;AACF,YAAM,cAAc,OAAO;AAAA,IAC7B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACvF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,cAAc,SAA0C;AACrE,UAAQ,IAAI,UAAU,KAAK,yCAAkC,CAAC;AAC9D,UAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAE1B,QAAM,gBAAqB,eAAQ,QAAQ,aAAa,GAAG;AAC3D,QAAM,WAAW,MAAM,wBAAwB,aAAa;AAE5D,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,UAAU,QAAQ,gCAAgC,CAAC;AAC/D;AAAA,EACF;AAEA,QAAM,mBAAqC,CAAC;AAE5C,aAAW,WAAW,UAAU;AAC9B,QAAI;AACF,YAAM,UAAU,MAAM,eAAe,OAAO;AAC5C,uBAAiB,KAAK,OAAO;AAAA,IAC/B,SAAS,QAAQ;AACf,uBAAiB,KAAK;AAAA,QACpB,MAAW,gBAAS,OAAO;AAAA,QAC3B,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,QAAQ;AAC7B,YAAQ,IAAI,KAAK,UAAU,kBAAkB,MAAM,CAAC,CAAC;AACrD;AAAA,EACF;AAGA,0BAAwB,kBAAkB,OAAO;AACnD;AAEA,eAAe,wBAAwB,SAAoC;AACzE,QAAM,WAAqB,CAAC;AAE5B,WAAS,QAAQ,KAAa,QAAgB,GAAS;AACrD,QAAI,QAAQ,EAAG;AAEf,QAAI;AACF,YAAM,QAAW,iBAAY,GAAG;AAGhC,UAAI,MAAM,SAAS,eAAe,GAAG;AACnC,iBAAS,KAAK,GAAG;AACjB;AAAA,MACF;AAGA,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,GAAG,KAAK,SAAS,gBAAiB;AAEtD,cAAM,WAAgB,YAAK,KAAK,IAAI;AACpC,YAAI;AACF,gBAAMG,QAAU,cAAS,QAAQ;AACjC,cAAIA,MAAK,YAAY,GAAG;AACtB,oBAAQ,UAAU,QAAQ,CAAC;AAAA,UAC7B;AAAA,QACF,SAAS,QAAQ;AAAA,QAEjB;AAAA,MACF;AAAA,IACF,SAAS,QAAQ;AAAA,IAEjB;AAAA,EACF;AA7BS;AA+BT,UAAQ,OAAO;AACf,SAAO;AACT;AAEA,eAAe,eAAe,aAA8C;AAC1E,QAAM,gBAAgB,IAAI,cAAc,WAAW;AACnD,QAAM,SAAS,IAAI,kBAAkB;AAErC,MAAI,SAA+B;AACnC,MAAI,SAA0C;AAE9C,MAAI;AACF,aAAS,cAAc,UAAU;AAAA,EACnC,SAAS,QAAQ;AACf,aAAS;AAAA,EACX;AAEA,QAAM,QAAQ,cAAc,iBAAiB;AAE7C,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,MAAI,cAAc;AAElB,MAAI;AAEF,UAAM,WAAW,OAAO,eAAe,MAAM,UAAU,MAAM;AAC7D,YAAQ,SAAS;AAGjB,UAAM,YAAY,OAAO,eAAe,MAAM,WAAW,OAAO;AAChE,aAAS,UAAU;AAGnB,UAAM,WAAW,OAAO,eAAe,MAAM,UAAU,MAAM;AAC7D,YAAQ,SAAS;AAGjB,UAAM,WAAW,CAAC,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ;AACxD,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,QAAQ,SACX,IAAI,CAAC,SAAS,KAAK,YAAY,EAC/B,OAAO,CAAC,SAAS,IAAI,EACrB,KAAK,EACL,QAAQ;AAEX,UAAI,MAAM,SAAS,GAAG;AACpB,sBAAc,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,mBAAmB;AAAA,MACtD;AAAA,IACF;AAGA,QAAI,UAAU,KAAK,WAAW,KAAK,UAAU,GAAG;AAC9C,eAAS;AAAA,IACX;AAAA,EACF,SAAS,QAAQ;AACf,aAAS;AAAA,EACX;AAEA,SAAO;AAAA,IACL,OAAM,iCAAQ,iBAAqB,gBAAS,WAAW;AAAA,IACvD,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,UAA4B,SAAiC;AAC5F,UAAQ,IAAI,UAAU,KAAK,mBAAY,SAAS,MAAM,0BAA0B,CAAC;AACjF,UAAQ,IAAI,EAAE;AAGd,QAAM,aAAa,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAC/D,QAAM,cAAc,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AACjE,QAAM,aAAa,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAC/D,QAAM,kBAAkB,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AACvE,QAAM,kBAAkB,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AACvE,QAAM,gBAAgB,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,EAAE;AAEnE,UAAQ,IAAI,UAAU,QAAQ,+BAAwB,CAAC;AACvD,UAAQ,IAAI,UAAU,KAAK,mBAAmB,aAAa,cAAc,UAAU,EAAE,CAAC;AACtF,UAAQ;AAAA,IACN,UAAU,KAAK,aAAa,UAAU,cAAc,WAAW,aAAa,UAAU,EAAE;AAAA,EAC1F;AACA,UAAQ;AAAA,IACN,UAAU;AAAA,MACR,cAAc,eAAe,aAAa,eAAe,cAAc,aAAa;AAAA,IACtF;AAAA,EACF;AACA,UAAQ,IAAI,EAAE;AAEd,MAAI,QAAQ,SAAS;AACnB;AAAA,EACF;AAGA,UAAQ,IAAI,UAAU,QAAQ,4BAAqB,CAAC;AACpD,UAAQ,IAAI,EAAE;AAEd,aAAW,WAAW,UAAU;AAC9B,UAAM,aAAaC,eAAc,QAAQ,MAAM;AAC/C,UAAM,cAAc,eAAe,QAAQ,MAAM;AAEjD,YAAQ,IAAI,YAAY,GAAG,UAAU,IAAI,QAAQ,IAAI,EAAE,CAAC;AACxD,YAAQ,IAAI,UAAU,MAAM,YAAY,QAAQ,IAAI,EAAE,CAAC;AACvD,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,aAAa,QAAQ,KAAK,WAAW,QAAQ,MAAM,YAAY,QAAQ,KAAK;AAAA,MAC9E;AAAA,IACF;AACA,YAAQ,IAAI,UAAU,MAAM,oBAAoB,QAAQ,WAAW,EAAE,CAAC;AAEtE,QAAI,QAAQ,UAAU,QAAQ,WAAW,WAAW;AAClD,cAAQ,IAAI,UAAU,QAAQ,4BAAkB,QAAQ,MAAM,EAAE,CAAC;AAAA,IACnE;AAEA,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF;AAEA,SAASA,eAAc,QAAwB;AAC7C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,QAA0C;AAChE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,UAAU;AAAA,EACrB;AACF;AAvRA,IAKAC,MACAC,QACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AAoBgB;AAyBD;AAyCA;AAsCA;AAmEN;AAqDA,WAAAH,gBAAA;AAaA;AAAA;AAAA;;;ACrPF,SAAS,yBAAkC;AAChD,QAAM,MAAM,IAAI,2BAAQ,SAAS;AAEjC,MACG,YAAY,oCAAoC,EAChD,SAAS,WAAW,kBAAkB,EACtC,OAAO,yBAAyB,mBAAmB,EACnD,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,+BAA+B,wCAAwC,OAAO,EACrF,OAAO,yBAAyB,8CAA8C,EAC9E,OAAO,mBAAmB,oCAAoC,EAC9D,OAAO,aAAa,gDAAgD,EACpE,OAAO,OAAO,MAAc,YAA4B;AACvD,QAAI;AACF,YAAM,UAAU,MAAM,OAAO;AAAA,IAC/B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACnF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,UAAU,MAAc,SAAwC;AAC7E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AAGxD,QAAM,cAAc,oBAAoB,eAAe,IAAI;AAC3D,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,EACzC;AAEA,QAAM,KAAK,YAAY;AAGvB,MAAI,GAAG,cAAc,UAAU;AAC7B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,MAAI,GAAG,cAAc,UAAU;AAC7B,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAGA,QAAM,WAAW,QAAQ,YAAY,OAAO,oBAAoB;AAGhE,QAAM,mBAAmB,GAAG,aAAa,CAAC;AAC1C,MAAI,iBAAiB,SAAS,QAAQ,GAAG;AACvC,YAAQ,IAAI,UAAU,QAAQ,MAAM,IAAI,2BAA2B,QAAQ,EAAE,CAAC;AAC9E,QAAI,CAAC,QAAQ,cAAc;AACzB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAmB,GAAG,aAAa,CAAC;AAC1C,QAAM,mBAAmB,iBAAiB,SAAS,QAAQ,IACvD,mBACA,CAAC,GAAG,kBAAkB,QAAQ;AAGlC,QAAM,mBAAmB,iBAAiB,SAAS,QAAQ,IACvD,mBACA,CAAC,GAAG,kBAAkB,QAAQ;AAGlC,MAAI,YAAsB;AAG1B,QAAM,cACJ,iBAAiB,SAAS,KAAK,iBAAiB,UAAU,iBAAiB;AAE7E,MAAI,eAAe,QAAQ,cAAc;AACvC,gBAAY;AAAA,EACd;AAGA,QAAM,kBAAkB,QAAQ,cAAc,eAAe,QAAQ;AAErE,MAAI,iBAAiB;AACnB,gBAAY;AAAA,EACd;AAGA,QAAM,uBAAuB,CAAC,SAAS,UAAU,QAAQ;AACzD,MAAI,QAAQ,iBAAiB,CAAC,qBAAqB,SAAS,QAAQ,aAAa,GAAG;AAClF,UAAM,IAAI;AAAA,MACR,2BAA2B,QAAQ,aAAa,qBAAqB,qBAAqB,KAAK,IAAI,CAAC;AAAA,IACtG;AAAA,EACF;AAEA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,sCAAsC,CAAC;AAClE,YAAQ,IAAI,UAAU,MAAM,UAAU,IAAI,EAAE,CAAC;AAC7C,YAAQ,IAAI,UAAU,MAAM,aAAa,QAAQ,EAAE,CAAC;AACpD,YAAQ,IAAI,UAAU,MAAM,mBAAmB,GAAG,SAAS,EAAE,CAAC;AAC9D,YAAQ,IAAI,UAAU,MAAM,eAAe,SAAS,EAAE,CAAC;AACvD,YAAQ,IAAI,UAAU,MAAM,sBAAsB,iBAAiB,KAAK,IAAI,KAAK,MAAM,EAAE,CAAC;AAC1F,YAAQ,IAAI,UAAU,MAAM,sBAAsB,iBAAiB,KAAK,IAAI,CAAC,EAAE,CAAC;AAChF,YAAQ,IAAI,UAAU,MAAM,sBAAsB,iBAAiB,KAAK,IAAI,KAAK,MAAM,EAAE,CAAC;AAC1F,YAAQ,IAAI,UAAU,MAAM,sBAAsB,iBAAiB,KAAK,IAAI,CAAC,EAAE,CAAC;AAChF,YAAQ,IAAI,UAAU,MAAM,iBAAiB,WAAW,EAAE,CAAC;AAC3D,YAAQ,IAAI,UAAU,MAAM,eAAe,eAAe,EAAE,CAAC;AAC7D,QAAI,QAAQ,eAAe;AACzB,cAAQ,IAAI,UAAU,MAAM,mBAAmB,QAAQ,aAAa,EAAE,CAAC;AAAA,IACzE;AACA,QAAI,QAAQ,UAAU;AACpB,cAAQ,IAAI,UAAU,MAAM,aAAa,QAAQ,QAAQ,EAAE,CAAC;AAAA,IAC9D;AACA;AAAA,EACF;AAGA,QAAM,aAAkB,YAAK,MAAM,QAAQ,SAAS;AACpD,MAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,IAAG,eAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,mBAAmB,GAAG,IAAI,aAAa,KAAK,IAAI,CAAC;AACvD,QAAM,kBAAkB,kBAAkB,GAAG,KAAK;AAAA;AAAA,UAE1C,IAAI;AAAA,gBACE,QAAQ;AAAA,YACZ,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb,QAAQ,YAAY,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKtC,QAAQ;AAAA,oBACN,kBAAkB,QAAQ,IAAI;AAAA,EAChD,QAAQ,gBAAgB,yBAAyB,QAAQ,aAAa,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe7E,kBAAkB,wEAAiE,EAAE;AAAA;AAGrF,QAAM,sBAAsB;AAAA,IAC1B,WAAW;AAAA,IACX,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,UAAU,QAAQ;AAAA,IAClB,YAAY;AAAA,IACZ,gBAAgB,QAAQ;AAAA,EAC1B;AAGA,QAAM,mBAAwB,YAAK,YAAY,GAAG,gBAAgB,KAAK;AACvE,SAAO,UAAU,kBAAkB,qBAAqB,eAAe;AAGvE,QAAM,YAA6B;AAAA,IACjC,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AAGA,MAAI,iBAAiB;AACnB,cAAU,eAAe,cAAc,KAAK,IAAI,CAAC;AAAA,EACnD;AAEA,SAAO,WAAW,GAAG,WAAW,SAAS;AAGzC,MAAI,cAAc,GAAG,WAAW;AAC9B,UAAM,uBAAuB,IAAI,WAAW,KAAK;AAAA,EACnD;AAGA,MAAI,mBAAmB,YAAY,OAAO;AACxC,UAAM,kBAAkB,YAAY,OAAO,qBAAqB,MAAM;AAAA,EACxE;AAGA,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,2BAA2B,CAAC;AAC1D,UAAQ,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;AACvD,UAAQ,IAAI,UAAU,KAAK,aAAa,QAAQ,EAAE,CAAC;AACnD,UAAQ,IAAI,UAAU,KAAK,WAAW,GAAG,SAAS,WAAM,SAAS,EAAE,CAAC;AACpE,UAAQ,IAAI,UAAU,KAAK,kBAAkB,gBAAgB,EAAE,CAAC;AAEhE,MAAI,QAAQ,UAAU;AACpB,YAAQ,IAAI,UAAU,KAAK,aAAa,QAAQ,QAAQ,EAAE,CAAC;AAAA,EAC7D;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,KAAK,4BAAqB,CAAC;AACjD,UAAQ,IAAI,UAAU,KAAK,iBAAiB,iBAAiB,KAAK,IAAI,CAAC,EAAE,CAAC;AAC1E,UAAQ;AAAA,IACN,UAAU,KAAK,iBAAiB,iBAAiB,MAAM,IAAI,iBAAiB,MAAM,EAAE;AAAA,EACtF;AACA,UAAQ,IAAI,UAAU,KAAK,oBAAoB,cAAc,WAAM,QAAG,EAAE,CAAC;AAEzE,MAAI,iBAAiB;AACnB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,oCAA6B,CAAC;AAC5D,YAAQ,IAAI,UAAU,KAAK,mBAAmB,QAAQ,iBAAiB,OAAO,EAAE,CAAC;AACjF,YAAQ,IAAI,UAAU,KAAK,oCAAoC,CAAC;AAAA,EAClE,WAAW,cAAc,YAAY;AACnC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,+CAA0C,CAAC;AACzE,YAAQ,IAAI,UAAU,KAAK,4CAA4C,CAAC;AAAA,EAC1E,OAAO;AACL,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,gEAAsD,CAAC;AACrF,YAAQ;AAAA,MACN,UAAU,KAAK,QAAQ,iBAAiB,SAAS,iBAAiB,MAAM,iBAAiB;AAAA,IAC3F;AAAA,EACF;AACF;AAEA,eAAe,uBAAuB,IAAY,WAAqB,OAA2B;AAEhG,QAAM,aAAa;AAAA,IACjB,OAAY,YAAK,MAAM,QAAQ,OAAO;AAAA,IACtC,MAAW,YAAK,MAAM,QAAQ,QAAQ;AAAA,IACtC,QAAa,YAAK,MAAM,QAAQ,QAAQ;AAAA,IACxC,UAAe,YAAK,MAAM,QAAQ,QAAQ;AAAA,IAC1C,QAAa,YAAK,MAAM,QAAQ,QAAQ;AAAA,IACxC,QAAa,YAAK,MAAM,QAAQ,QAAQ;AAAA,EAC1C;AAGA,QAAM,aAAkB,eAAQ,GAAG,SAAS;AAC5C,QAAM,YAAY,WAAW,SAAS;AAGtC,MAAI,eAAe,WAAW;AAE5B,QAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,MAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC7C;AAGA,UAAM,WAAgB,gBAAS,GAAG,SAAS;AAC3C,UAAM,cAAmB,YAAK,WAAW,QAAQ;AAGjD,IAAG,gBAAW,GAAG,WAAW,WAAW;AAEvC,YAAQ,IAAI,UAAU,KAAK,kBAAkB,UAAU,WAAM,SAAS,EAAE,CAAC;AAAA,EAC3E;AACF;AAEA,eAAe,kBACb,OACA,qBACA,QACe;AACf,MAAI;AAEF,UAAM,iBAAiB,oBAAoB,kBAAkB,MAAM,QAAQ;AAC3E,QAAI,CAAC,gBAAgB;AACnB;AAAA,IACF;AAEA,UAAM,QAAQ,eAAe;AAC7B,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,aAAa;AAC/B,cAAM,cAAc;AAAA,UAClB,cAAc;AAAA,UACd,aAAa;AAAA,QACf;AAEA,eAAO,WAAW,KAAK,WAAW,WAAW;AAAA,MAC/C;AAAA,IACF;AAEA,YAAQ,IAAI,UAAU,KAAK,WAAW,MAAM,MAAM,eAAe,CAAC;AAAA,EACpE,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC5F;AAAA,IACF;AAAA,EACF;AACF;AAtVA,IAKAI,MACAC,QACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AAWgB;AA4BD;AA+NA;AAiCA;AAAA;AAAA;;;ACnTf,IAKAC,MACAC,QAIa;AAVb;AAAA;AAAA;AAAA;AAKA,IAAAD,OAAoB;AACpB,IAAAC,SAAsB;AAIf,IAAM,mBAAN,MAAM,iBAAgB;AAAA,MACnB;AAAA,MAER,YAAY,eAA8B;AACxC,aAAK,gBAAgB;AAAA,MACvB;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,eAAyB,WAA8B;AAC7E,cAAM,mBAAiD;AAAA,UACrD,OAAO,CAAC,QAAQ,QAAQ;AAAA,UACxB,MAAM,CAAC,SAAS,UAAU,YAAY,UAAU,QAAQ;AAAA,UACxD,QAAQ,CAAC,QAAQ,YAAY,QAAQ;AAAA,UACrC,UAAU,CAAC,UAAU,UAAU,QAAQ;AAAA,UACvC,QAAQ,CAAC;AAAA;AAAA,UACT,QAAQ,CAAC,SAAS,MAAM;AAAA;AAAA,QAC1B;AAEA,eAAO,iBAAiB,aAAa,EAAE,SAAS,SAAS;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAmB,QAAkB,YAA4B;AAC/D,cAAM,aAAa;AAAA,UACjB,OAAY,YAAK,YAAY,OAAO;AAAA,UACpC,MAAW,YAAK,YAAY,QAAQ;AAAA,UACpC,QAAa,YAAK,YAAY,QAAQ;AAAA,UACtC,UAAe,YAAK,YAAY,QAAQ;AAAA,UACxC,QAAa,YAAK,YAAY,QAAQ;AAAA,UACtC,QAAa,YAAK,YAAY,QAAQ;AAAA,QACxC;AAEA,eAAO,WAAW,MAAM;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,sBACJ,IACA,WACA,YACwB;AACxB,cAAM,aAAkB,eAAQ,GAAG,SAAS;AAC5C,cAAM,YAAY,KAAK,mBAAmB,WAAW,UAAU;AAG/D,YAAI,eAAe,WAAW;AAC5B,iBAAO;AAAA,QACT;AAGA,YAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,UAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,QAC7C;AAGA,cAAM,WAAgB,gBAAS,GAAG,SAAS;AAC3C,cAAM,cAAmB,YAAK,WAAW,QAAQ;AAGjD,YAAO,gBAAW,WAAW,GAAG;AAC9B,gBAAM,IAAI,MAAM,+BAA+B,WAAW,EAAE;AAAA,QAC9D;AAGA,QAAG,gBAAW,GAAG,WAAW,WAAW;AAEvC,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,yBACE,IACA,WACA,UAGI,CAAC,GACa;AAClB,cAAM,SAAmB,CAAC;AAC1B,cAAM,WAAqB,CAAC;AAG5B,YAAI,CAAC,KAAK,wBAAwB,GAAG,WAAW,SAAS,GAAG;AAC1D,iBAAO,KAAK,8BAA8B,GAAG,SAAS,WAAM,SAAS,EAAE;AAAA,QACzE;AAGA,YAAI,CAAC,QAAQ,cAAc;AACzB,kBAAQ,WAAW;AAAA,YACjB,KAAK,YAAY;AAEf,kBAAI,CAAC,GAAG,aAAa,GAAG,UAAU,WAAW,GAAG;AAC9C,yBAAS,KAAK,8BAA8B;AAAA,cAC9C;AAGA,oBAAM,YAAY,GAAG,aAAa,CAAC;AACnC,oBAAM,YAAY,GAAG,aAAa,CAAC;AACnC,oBAAM,oBAAoB,QAAQ,qBAAqB,UAAU;AAEjE,kBAAI,UAAU,SAAS,mBAAmB;AACxC,yBAAS,KAAK,YAAY,oBAAoB,UAAU,MAAM,iBAAiB;AAAA,cACjF;AACA;AAAA,YACF;AAAA,YAEA,KAAK;AAEH,kBAAI,GAAG,cAAc,YAAY;AAC/B,uBAAO,KAAK,oCAAoC;AAAA,cAClD;AAGA,kBAAI,GAAG,cAAc,GAAG,WAAW,SAAS,GAAG;AAC7C,uBAAO,KAAK,qBAAqB,GAAG,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,cAC7D;AACA;AAAA,YAEF,KAAK;AAEH,kBAAI,GAAG,cAAc,YAAY;AAC/B,yBAAS,KAAK,mDAAmD;AAAA,cACnE;AACA;AAAA,UACJ;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO,OAAO,WAAW;AAAA,UACzB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,yBAAyB,IAA6B;AACpD,gBAAQ,GAAG,WAAW;AAAA,UACpB,KAAK;AACH,mBAAO;AAAA,UACT,KAAK;AACH,mBAAO;AAAA,UACT,KAAK,UAAU;AACb,kBAAM,YAAY,GAAG,aAAa,CAAC;AACnC,kBAAM,YAAY,GAAG,aAAa,CAAC;AACnC,mBAAO,UAAU,UAAU,UAAU,SAAS,aAAa;AAAA,UAC7D;AAAA,UACA,KAAK;AACH,mBAAO;AAAA,UACT;AACE,mBAAO;AAAA,QACX;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,sBAAsB,QAAsC;AAC1D,cAAM,eAAqD;AAAA,UACzD,OAAO;AAAA,YACL,UAAU,CAAC;AAAA,YACX,aAAa,CAAC,SAAS,eAAe,aAAa;AAAA,YACnD,aAAa,CAAC,iBAAiB,2BAA2B;AAAA,UAC5D;AAAA,UACA,MAAM;AAAA,YACJ,UAAU,CAAC,SAAS,aAAa;AAAA,YACjC,aAAa,CAAC,aAAa,eAAe;AAAA,YAC1C,aAAa,CAAC,mBAAmB,yBAAyB;AAAA,UAC5D;AAAA,UACA,QAAQ;AAAA,YACN,UAAU,CAAC,WAAW;AAAA,YACtB,aAAa,CAAC,gBAAgB;AAAA,YAC9B,aAAa,CAAC,oBAAoB,kBAAkB;AAAA,UACtD;AAAA,UACA,UAAU;AAAA,YACR,UAAU,CAAC,WAAW;AAAA,YACtB,aAAa,CAAC,gBAAgB;AAAA,YAC9B,aAAa,CAAC,YAAY,gBAAgB;AAAA,UAC5C;AAAA,UACA,QAAQ;AAAA,YACN,UAAU,CAAC,cAAc;AAAA,YACzB,aAAa,CAAC,sBAAsB;AAAA,YACpC,aAAa,CAAC,uBAAuB,sBAAsB;AAAA,UAC7D;AAAA,UACA,QAAQ;AAAA,YACN,UAAU,CAAC;AAAA,YACX,aAAa,CAAC,cAAc;AAAA,YAC5B,aAAa,CAAC,6BAA6B;AAAA,UAC7C;AAAA,QACF;AAEA,eAAO,aAAa,MAAM;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,IAA6B;AAEnD,YAAI,GAAG,cAAc,UAAU;AAC7B,gBAAM,YAAY,GAAG,aAAa,CAAC;AACnC,gBAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,cAAI,UAAU,SAAS,KAAK,UAAU,UAAU,UAAU,QAAQ;AAChE,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,YAA0B;AAChD,cAAM,aAAa,CAAC,SAAS,UAAU,UAAU,UAAU,WAAW,MAAM;AAE5E,mBAAW,QAAQ,CAAC,QAAQ;AAC1B,gBAAM,UAAe,YAAK,YAAY,GAAG;AACzC,cAAI,CAAI,gBAAW,OAAO,GAAG;AAC3B,YAAG,eAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,UAC3C;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,qBACE,IACA,YACA,UACA,WAAgB,CAAC,GACO;AACxB,cAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,eAAO;AAAA,UACL,OAAO,GAAG;AAAA,UACV,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc,SAAS,gBAAgB;AAAA,UACvC,YAAY,SAAS,cAAc;AAAA,UACnC,eAAe,SAAS;AAAA,UACxB,kBAAkB,GAAG,aAAa,CAAC,GAAG;AAAA,UACtC,kBAAkB,GAAG,aAAa,CAAC,GAAG;AAAA,UACtC,mBAAmB,SAAS,qBAAqB;AAAA,UACjD,qBAAqB,SAAS,uBAAuB,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAnQ6B;AAAtB,IAAM,kBAAN;AAAA;AAAA;;;ACVP,IAKAC,MACAC,QAKa;AAXb;AAAA;AAAA;AAAA;AAKA,IAAAD,OAAoB;AACpB,IAAAC,SAAsB;AAGtB;AAEO,IAAM,iBAAN,MAAM,eAAc;AAAA,MACjB;AAAA,MACA;AAAA,MAER,YAAY,eAA8B;AACxC,aAAK,gBAAgB;AACrB,aAAK,gBAAgB,IAAI,gBAAgB,aAAa;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,YAA0B;AAChD,cAAM,cAAc;AAAA,UAClB;AAAA;AAAA,UACA;AAAA;AAAA,UACA;AAAA;AAAA,UACA;AAAA;AAAA,UACA;AAAA;AAAA,UACA;AAAA;AAAA,UACA;AAAA;AAAA,UACA;AAAA;AAAA,QACF;AAEA,oBAAY,QAAQ,CAAC,QAAQ;AAC3B,gBAAM,UAAe,YAAK,YAAY,GAAG;AACzC,cAAI,CAAI,gBAAW,OAAO,GAAG;AAC3B,YAAG,eAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,UAC3C;AAAA,QACF,CAAC;AAGD,cAAM,aAAa,CAAC,QAAQ,UAAU,UAAU;AAChD,mBAAW,QAAQ,CAAC,WAAW;AAC7B,gBAAM,aAAkB,YAAK,YAAY,UAAU,MAAM;AACzD,cAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,YAAG,eAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,UAC9C;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,QAAkB,YAA4B;AAC3D,cAAM,oBAAoB;AAAA,UACxB,OAAY,YAAK,YAAY,OAAO;AAAA,UACpC,MAAW,YAAK,YAAY,UAAU,MAAM;AAAA,UAC5C,QAAa,YAAK,YAAY,UAAU,QAAQ;AAAA,UAChD,UAAe,YAAK,YAAY,UAAU,UAAU;AAAA,UACpD,QAAa,YAAK,YAAY,QAAQ;AAAA,UACtC,QAAa,YAAK,YAAY,QAAQ;AAAA,QACxC;AAEA,eAAO,kBAAkB,MAAM;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,wBACJ,IACA,WACA,YACuB;AACvB,cAAM,cAAc,GAAG;AACvB,cAAM,YAAY,KAAK,eAAe,WAAW,UAAU;AAC3D,cAAM,WAAgB,gBAAS,WAAW;AAC1C,cAAM,UAAe,YAAK,WAAW,QAAQ;AAG7C,YAAI,gBAAgB,SAAS;AAC3B,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAGA,YAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,UAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,QAC7C;AAGA,YAAO,gBAAW,OAAO,GAAG;AAE1B,gBAAM,aAAa,KAAK,uBAAuB,OAAO;AAEtD,UAAG,gBAAW,aAAa,UAAU;AAErC,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAGA,QAAG,gBAAW,aAAa,OAAO;AAElC,eAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAAuB,UAA0B;AACvD,cAAM,MAAW,eAAQ,QAAQ;AACjC,cAAM,MAAW,eAAQ,QAAQ;AACjC,cAAM,OAAY,gBAAS,UAAU,GAAG;AAExC,YAAI,UAAU;AACd,YAAI,aAAa;AAEjB,eAAU,gBAAW,UAAU,GAAG;AAChC,uBAAkB,YAAK,KAAK,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG,EAAE;AACtD;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,iBACJ,MACA,UACA,YACA,SACA,YACiB;AACjB,cAAM,aAAkB,YAAK,YAAY,SAAS;AAGlD,YAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,UAAG,eAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,QAC9C;AAEA,cAAM,WAAW,GAAG,IAAI,IAAI,UAAU,IAAI,QAAQ,IAAI,KAAK,IAAI,CAAC;AAChE,cAAM,iBAAiB,GAAG,QAAQ;AAClC,cAAM,iBAAsB,YAAK,YAAY,cAAc;AAG3D,QAAG,mBAAc,gBAAgB,SAAS,MAAM;AAEhD,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,cAAc,YAAoB,gBAAwB,IAA4B;AAC1F,cAAM,aAAkB,YAAK,YAAY,SAAS;AAClD,YAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,UAAG,eAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,QAC9C;AAEA,cAAM,aAAa,oBAAI,KAAK;AAC5B,mBAAW,QAAQ,WAAW,QAAQ,IAAI,aAAa;AAEvD,cAAM,gBAA0B,CAAC;AACjC,cAAM,SAAmB,CAAC;AAG1B,cAAM,cAAc,CAAM,YAAK,YAAY,QAAQ,GAAQ,YAAK,YAAY,QAAQ,CAAC;AAErF,mBAAW,OAAO,aAAa;AAC7B,cAAI,CAAI,gBAAW,GAAG,EAAG;AAEzB,gBAAM,QAAW,iBAAY,GAAG;AAEhC,qBAAW,QAAQ,OAAO;AACxB,kBAAM,WAAgB,YAAK,KAAK,IAAI;AACpC,kBAAM,QAAW,cAAS,QAAQ;AAElC,gBAAI,MAAM,QAAQ,YAAY;AAC5B,kBAAI;AACF,sBAAM,cAAmB,YAAK,YAAY,IAAI;AAC9C,gBAAG,gBAAW,UAAU,WAAW;AACnC,8BAAc,KAAK,IAAI;AAAA,cACzB,SAAS,OAAO;AACd,uBAAO,KAAK,qBAAqB,IAAI,KAAK,KAAK,EAAE;AAAA,cACnD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,eAAe,cAAc;AAAA,UAC7B;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAoB,YAAsC;AACxD,cAAM,QAA0B;AAAA,UAC9B,OAAO;AAAA,UACP,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAEA,cAAM,cAAc;AAAA,UAClB,OAAY,YAAK,YAAY,OAAO;AAAA,UACpC,MAAW,YAAK,YAAY,UAAU,MAAM;AAAA,UAC5C,QAAa,YAAK,YAAY,UAAU,QAAQ;AAAA,UAChD,UAAe,YAAK,YAAY,UAAU,UAAU;AAAA,UACpD,QAAa,YAAK,YAAY,QAAQ;AAAA,UACtC,QAAa,YAAK,YAAY,QAAQ;AAAA,QACxC;AAEA,eAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,GAAG,MAAM;AACrD,cAAO,gBAAW,GAAG,GAAG;AACtB,kBAAM,QAAW,iBAAY,GAAG;AAChC,kBAAM,MAAgC,IAAI,MAAM;AAChD,kBAAM,SAAS,MAAM;AAGrB,kBAAM,QAAQ,CAAC,SAAS;AACtB,oBAAM,WAAgB,YAAK,KAAK,IAAI;AACpC,oBAAM,YAAe,cAAS,QAAQ;AACtC,oBAAM,aAAa,UAAU;AAAA,YAC/B,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAGD,cAAM,aAAkB,YAAK,YAAY,SAAS;AAClD,YAAO,gBAAW,UAAU,GAAG;AAC7B,gBAAM,cAAiB,iBAAY,UAAU;AAC7C,gBAAM,cAAc,YAAY;AAAA,QAClC;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,YAAmC;AACzD,cAAM,cAAwB,CAAC;AAC/B,cAAM,SAAmB,CAAC;AAE1B,cAAM,sBAAsB,wBAAC,QAAsB;AACjD,cAAI;AACF,gBAAO,gBAAW,GAAG,GAAG;AACtB,oBAAM,QAAW,iBAAY,GAAG;AAChC,kBAAI,MAAM,WAAW,GAAG;AACtB,gBAAG,eAAU,GAAG;AAChB,4BAAY,KAAK,GAAG;AAAA,cACtB;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,mBAAO,KAAK,oBAAoB,GAAG,KAAK,KAAK,EAAE;AAAA,UACjD;AAAA,QACF,GAZ4B;AAe5B,cAAM,UAAU;AAAA,UACT,YAAK,YAAY,UAAU,MAAM;AAAA,UACjC,YAAK,YAAY,UAAU,QAAQ;AAAA,UACnC,YAAK,YAAY,UAAU,UAAU;AAAA,QAC5C;AAEA,gBAAQ,QAAQ,mBAAmB;AAEnC,eAAO;AAAA,UACL,cAAc,YAAY;AAAA,UAC1B;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,6BAA6B,YAAsC;AACjE,cAAM,SAAmB,CAAC;AAC1B,cAAM,WAAqB,CAAC;AAE5B,cAAM,eAAe,CAAC,SAAS,UAAU,UAAU,UAAU,SAAS;AAGtE,qBAAa,QAAQ,CAAC,QAAQ;AAC5B,gBAAM,UAAe,YAAK,YAAY,GAAG;AACzC,cAAI,CAAI,gBAAW,OAAO,GAAG;AAC3B,mBAAO,KAAK,+BAA+B,GAAG,EAAE;AAAA,UAClD;AAAA,QACF,CAAC;AAGD,cAAM,gBAAgB,CAAC,QAAQ,UAAU,UAAU;AACnD,sBAAc,QAAQ,CAAC,WAAW;AAChC,gBAAM,aAAkB,YAAK,YAAY,UAAU,MAAM;AACzD,cAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,qBAAS,KAAK,gCAAgC,MAAM,EAAE;AAAA,UACxD;AAAA,QACF,CAAC;AAGD,cAAM,UAAU,KAAK,YAAY,UAAU;AAC3C,gBAAQ,QAAQ,CAAC,SAAS;AACxB,gBAAM,eAAoB,gBAAS,YAAY,IAAI;AACnD,gBAAM,YAAY,aAAa,MAAW,UAAG;AAE7C,cAAI,UAAU,SAAS,GAAG;AACxB,qBAAS,KAAK,8BAA8B,IAAI,EAAE;AAAA,UACpD;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,OAAO,OAAO,WAAW;AAAA,UACzB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,YAA8B;AACxC,cAAM,UAAoB,CAAC;AAE3B,cAAM,YAAY,wBAAC,QAAsB;AACvC,cAAI,CAAI,gBAAW,GAAG,EAAG;AAEzB,gBAAM,QAAW,iBAAY,GAAG;AAEhC,gBAAM,QAAQ,CAAC,SAAS;AACtB,kBAAM,WAAgB,YAAK,KAAK,IAAI;AACpC,kBAAM,QAAW,cAAS,QAAQ;AAElC,gBAAI,MAAM,YAAY,GAAG;AACvB,wBAAU,QAAQ;AAAA,YACpB,WAAW,KAAK,SAAS,KAAK,KAAK,KAAK,WAAW,KAAK,GAAG;AACzD,sBAAQ,KAAK,QAAQ;AAAA,YACvB;AAAA,UACF,CAAC;AAAA,QACH,GAfkB;AAiBlB,kBAAU,UAAU;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AAxW2B;AAApB,IAAM,gBAAN;AAAA;AAAA;;;AC6DA,SAAS,yBAAkC;AAChD,QAAM,MAAM,IAAI,2BAAQ,SAAS;AAEjC,MAAI,YAAY,iDAAiD;AAGjE,MACG,OAAO,qBAAqB,yCAAyC,IAAI,EACzE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,qBAAqB,mCAAmC,KAAK,EACpE,OAAO,cAAc,2BAA2B,KAAK,EACrD,OAAO,kBAAkB,2CAA2C,KAAK,EACzE,OAAO,wBAAwB,2CAA2C,KAAK,EAC/E,OAAO,WAAW,0CAA0C,KAAK,EACjE,OAAO,aAAa,iDAAiD,KAAK,EAC1E,OAAO,OAAO,YAAiB;AAC9B,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,cAAc,IAAI,cAAc,aAAa;AACnD,UAAM,aAAa,IAAI,UAAU;AAEjC,UAAM,iBAAiC;AAAA,MACrC,eAAe,SAAS,QAAQ,IAAI;AAAA,MACpC,QAAQ,QAAQ,OAAO,MAAM,GAAG;AAAA,MAChC,gBAAgB,QAAQ;AAAA,MACxB,UAAU,QAAQ;AAAA,MAClB,aAAa,QAAQ;AAAA,MACrB,mBAAmB,QAAQ;AAAA,MAC3B,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,IACjB;AAEA,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,OAAO,OAAO,6DAAsD,CAAC;AACjF,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAEA,2BAAqB,MAAM;AAE3B,UAAI,CAAC,OAAO,SAAS;AACnB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO,IAAI,0BAAqB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MAC1F;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,MACG,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B,OAAO,yBAAyB,8BAA8B,OAAO,EACrE,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,OAAO,YAAiB;AAC9B,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,YAAY,IAAI,UAAU;AAEhC,QAAI;AACF,YAAM,WAAW,MAAM,gBAAgB,eAAe,QAAQ,MAAM;AACpE,yBAAmB,UAAU,QAAQ,QAAQ,SAAS;AAAA,IACxD,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,sCAAiC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACzF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,MACG,QAAQ,SAAS,EACjB,YAAY,wBAAwB,EACpC,SAAS,WAAW,kBAAkB,EACtC,OAAO,wBAAwB,8BAA8B,QAAQ,EACrE,OAAO,OAAO,MAAc,YAAiB;AAC5C,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,cAAc,IAAI,cAAc,aAAa;AAEnD,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,SAAS;AAClB,gBAAQ,IAAI,OAAO,MAAM,mCAA8B,IAAI,EAAE,CAAC;AAC9D,gBAAQ,IAAI,0BAAmB,OAAO,YAAY,EAAE;AACpD,gBAAQ,IAAI,qBAAc,QAAQ,QAAQ,EAAE;AAAA,MAC9C,OAAO;AACL,gBAAQ,MAAM,OAAO,IAAI,+BAA0B,IAAI,EAAE,CAAC;AAC1D,eAAO,OAAO,QAAQ,CAAC,UAAU,QAAQ,MAAM,OAAO,IAAI,YAAO,KAAK,EAAE,CAAC,CAAC;AAC1E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,8BAAyB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACjF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,MACG,QAAQ,SAAS,EACjB,YAAY,6CAA6C,EACzD,OAAO,qBAAqB,6CAA6C,KAAK,EAC9E,OAAO,WAAW,sCAAsC,KAAK,EAC7D,OAAO,OAAO,YAAiB;AAC9B,UAAM,gBAAgB,IAAI,cAAc;AAExC,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,SAAS,QAAQ,IAAI,GAAG,QAAQ,OAAO,aAAa;AAExF,UAAI,OAAO,SAAS;AAClB,gBAAQ,IAAI,OAAO,MAAM,kCAA6B,CAAC;AACvD,gBAAQ,IAAI,4BAAgB,OAAO,YAAY,eAAe;AAC9D,gBAAQ,IAAI,mBAAY,YAAY,OAAO,UAAU,CAAC,WAAW;AAAA,MACnE,OAAO;AACL,gBAAQ,MAAM,OAAO,IAAI,+BAA0B,CAAC;AACpD,eAAO,OAAO,QAAQ,CAAC,UAAU,QAAQ,MAAM,OAAO,IAAI,YAAO,KAAK,EAAE,CAAC,CAAC;AAC1E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,gCAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACnF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,eACb,SACA,eACA,cACA,eACwB;AACxB,QAAM,SAAwB;AAAA,IAC5B,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,EACZ;AAEA,MAAI;AACF,UAAM,aAAa,cAAc,gBAAgB;AACjD,UAAM,aAAkB,YAAK,YAAY,SAAS;AAClD,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACvD,UAAM,cAAmB,YAAK,YAAY,WAAW,SAAS,EAAE;AAEhE,QAAI,CAAC,QAAQ,QAAQ;AACnB,UAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,QAAG,eAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,MAC9C;AAEA,UAAI,CAAI,gBAAW,WAAW,GAAG;AAC/B,QAAG,eAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO,cAAc;AAGrB,UAAM,eAAe,MAAM,sBAAsB,SAAS,eAAe,aAAa;AAEtF,YAAQ,IAAI,OAAO,KAAK,mBAAY,aAAa,MAAM,gCAAgC,CAAC;AAExF,QAAI,aAAa,WAAW,GAAG;AAC7B,cAAQ,IAAI,OAAO,MAAM,8BAAyB,CAAC;AACnD,aAAO,UAAU;AACjB,aAAO;AAAA,IACT;AAGA,eAAW,MAAM,cAAc;AAC7B,YAAM,QAAW,cAAS,GAAG,SAAS;AACtC,aAAO,mBAAmB,MAAM;AAAA,IAClC;AAGA,eAAW,MAAM,cAAc;AAC7B,YAAM,SAAS,MAAM,UAAU,IAAI,aAAa,SAAS,aAAa;AACtE,aAAO,QAAQ,KAAK,MAAM;AAE1B,UAAI,OAAO,UAAU;AACnB,eAAO;AACP,eAAO,kBAAkB,OAAO;AAAA,MAClC,OAAO;AACL,eAAO,SAAS,KAAK,qBAAqB,GAAG,KAAK,KAAK,OAAO,MAAM,EAAE;AAAA,MACxE;AAAA,IACF;AAGA,QAAI,QAAQ,gBAAgB;AAC1B,YAAM,cAAc,MAAM,mBAAmB,aAAa,SAAS,aAAa;AAChF,aAAO,kBAAkB;AAAA,IAC3B;AAGA,QAAI,OAAO,kBAAkB,GAAG;AAC9B,aAAO,oBACJ,OAAO,kBAAkB,OAAO,kBAAkB,OAAO;AAAA,IAC9D;AAGA,QAAI,QAAQ,eAAe,CAAC,QAAQ,QAAQ;AAC1C,YAAM,YAAY,MAAM,mBAAmB,cAAc,aAAa,QAAQ,aAAa;AAC3F,aAAO,YAAY;AAAA,IACrB;AAGA,QAAI,QAAQ,YAAY,CAAC,QAAQ,QAAQ;AACvC,YAAM,gBAAgB,aAAa,aAAa;AAAA,IAClD;AAEA,WAAO,UAAU,OAAO,OAAO,WAAW;AAE1C,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO;AAAA,MACZ,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACrF;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAe,sBACb,SACA,eACA,gBACmB;AACnB,QAAM,SAAS,MAAM,cAAc,QAAQ;AAC3C,QAAM,aAAa,oBAAI,KAAK;AAC5B,aAAW,QAAQ,WAAW,QAAQ,IAAI,QAAQ,aAAa;AAE/D,SAAO,OAAO,OAAO,CAAC,OAAO;AAE3B,QAAI,CAAC,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG;AAC1C,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,QAAQ,OAAO;AAClB,YAAM,SAAS,IAAI,KAAK,GAAG,YAAY;AACvC,UAAI,SAAS,YAAY;AACvB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAe,UACb,IACA,aACA,SACA,eACwB;AACxB,QAAM,SAAwB;AAAA,IAC5B,MAAM,GAAG;AAAA,IACT,cAAc,GAAG;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAEA,MAAI;AACF,UAAM,QAAW,cAAS,GAAG,SAAS;AACtC,WAAO,YAAY,MAAM;AAGzB,UAAM,WAAgB,gBAAS,GAAG,SAAS;AAC3C,QAAI;AAEJ,QAAI,QAAQ,mBAAmB;AAC7B,YAAM,eAAoB,gBAAS,cAAc,gBAAgB,GAAG,GAAG,SAAS;AAChF,mBAAkB,YAAK,aAAa,YAAY;AAGhD,YAAM,YAAiB,eAAQ,UAAU;AACzC,UAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,QAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,MAC7C;AAAA,IACF,OAAO;AACL,mBAAkB,YAAK,aAAa,QAAQ;AAAA,IAC9C;AAEA,WAAO,cAAc;AAErB,QAAI,CAAC,QAAQ,QAAQ;AAEnB,MAAG,kBAAa,GAAG,WAAW,UAAU;AAGxC,MAAG,gBAAW,GAAG,SAAS;AAAA,IAC5B;AAEA,WAAO,WAAW;AAElB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mBACb,aACA,SACA,eACiB;AACjB,MAAI;AACF,UAAM,aAAkB,YAAK,cAAc,gBAAgB,GAAG,SAAS;AAEvE,QAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,cAAiB,iBAAY,UAAU;AAC7C,UAAM,oBAAyB,YAAK,aAAa,SAAS;AAE1D,QAAI,CAAC,QAAQ,UAAU,YAAY,SAAS,GAAG;AAC7C,UAAI,CAAI,gBAAW,iBAAiB,GAAG;AACrC,QAAG,eAAU,mBAAmB,EAAE,WAAW,KAAK,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,gBAAgB;AAEpB,eAAW,QAAQ,aAAa;AAC9B,YAAM,aAAkB,YAAK,YAAY,IAAI;AAC7C,YAAM,aAAkB,YAAK,mBAAmB,IAAI;AAEpD,UAAI;AACF,YAAI,CAAC,QAAQ,QAAQ;AACnB,UAAG,kBAAa,YAAY,UAAU;AACtC,UAAG,gBAAW,UAAU;AAAA,QAC1B;AACA;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,KAAK,iCAAiC,IAAI,KAAK,KAAK,EAAE;AAAA,MAChE;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,iCAAiC,KAAK,EAAE;AACtD,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mBACb,KACA,aACA,QACA,gBACiB;AA9cnB;AA+cE,QAAM,QAAsB;AAAA,IAC1B,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,IAChC,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB,WAAW,OAAO;AAAA,IAClB,kBAAkB,OAAO;AAAA,IACzB,KAAK,CAAC;AAAA,EACR;AAEA,aAAW,MAAM,KAAK;AACpB,UAAM,QAA2B;AAAA,MAC/B,MAAM,GAAG;AAAA,MACT,OAAO,GAAG;AAAA,MACV,QAAQ,GAAG;AAAA,MACX,UAAU,GAAG;AAAA,MACb,SAAS,GAAG;AAAA,MACZ,aAAkB;AAAA,QAChB;AAAA,UACA,YAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,MAA9C,mBAAiD,gBAAe;AAAA,MAClE;AAAA,MACA,aAAW,YAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,MAA9C,mBAAiD,cAAa;AAAA,MACzE,aAAa,CAAC;AAAA;AAAA,MACd,cAAc,CAAC;AAAA,IACjB;AAEA,QAAI,GAAG,cAAc,UAAU;AAC7B,YAAM,SAAS,GAAG;AAAA,IACpB,WAAW,GAAG,cAAc,UAAU;AACpC,YAAM,SAAS,GAAG;AAAA,IACpB;AAEA,UAAM,IAAI,KAAK,KAAK;AAAA,EACtB;AAEA,QAAM,YAAiB,YAAK,aAAa,YAAY;AACrD,EAAG,mBAAc,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,MAAM;AAElE,SAAO;AACT;AAEA,eAAe,gBAAgB,aAAqB,gBAA8C;AAGhG,UAAQ,IAAI,0BAA0B,WAAW,KAAK;AACxD;AAEA,eAAe,gBACb,eACA,aAC8B;AAC9B,QAAM,aAAkB,YAAK,cAAc,gBAAgB,GAAG,SAAS;AAEvE,MAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAiB,iBAAY,UAAU,EAAE,OAAO,CAAC,QAAQ;AAC7D,UAAM,UAAe,YAAK,YAAY,GAAG;AACzC,WAAU,cAAS,OAAO,EAAE,YAAY;AAAA,EAC1C,CAAC;AAED,QAAM,SAA8B,CAAC;AAErC,aAAW,OAAO,aAAa;AAC7B,UAAM,YAAiB,YAAK,YAAY,KAAK,YAAY;AAEzD,QAAO,gBAAW,SAAS,GAAG;AAC5B,UAAI;AACF,cAAM,eAAkB,kBAAa,WAAW,MAAM;AACtD,cAAM,QAAsB,KAAK,MAAM,YAAY;AACnD,eAAO,KAAK,GAAG,MAAM,GAAG;AAAA,MAC1B,SAAS,OAAO;AACd,gBAAQ,KAAK,oCAAoC,GAAG,KAAK,KAAK,EAAE;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa;AACf,UAAM,QAAQ,YAAY,YAAY;AACtC,WAAO,OAAO;AAAA,MACZ,CAAC,OACC,GAAG,KAAK,YAAY,EAAE,SAAS,KAAK,KACpC,GAAG,MAAM,YAAY,EAAE,SAAS,KAAK,KACrC,GAAG,SAAS,YAAY,EAAE,SAAS,KAAK;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,UACb,MACA,cACA,gBACA,aACA,eACwE;AACxE,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI;AAEF,UAAM,cAAc,MAAM,gBAAgB,aAAa;AACvD,UAAM,aAAa,YAAY,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI;AAE5D,QAAI,CAAC,YAAY;AACf,aAAO,OAAO,KAAK,eAAe,IAAI,YAAY;AAClD,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,cAAc,gBAAgB;AACjD,UAAM,YAAY,YAAY,eAAe,cAA0B,UAAU;AACjF,UAAM,WAAgB,gBAAS,WAAW,WAAW;AACrD,UAAM,cAAmB,YAAK,WAAW,QAAQ;AAGjD,UAAM,aAAkB,YAAK,YAAY,SAAS;AAClD,UAAM,cAAiB,iBAAY,UAAU,EAAE,OAAO,CAAC,QAAQ;AAC7D,YAAM,UAAe,YAAK,YAAY,GAAG;AACzC,aAAU,cAAS,OAAO,EAAE,YAAY;AAAA,IAC1C,CAAC;AAED,QAAI;AAEJ,eAAW,OAAO,aAAa;AAC7B,YAAM,gBAAqB,YAAK,YAAY,KAAK,WAAW,WAAW;AACvE,UAAO,gBAAW,aAAa,GAAG;AAChC,qBAAa;AACb;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,YAAY;AACf,aAAO,OAAO,KAAK,uBAAuB,IAAI,YAAY;AAC1D,aAAO;AAAA,IACT;AAGA,QAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,MAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC7C;AAEA,IAAG,kBAAa,YAAY,WAAW;AAEvC,WAAO,UAAU;AACjB,WAAO,eAAe;AAEtB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO,KAAK,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAC9F,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eACb,eACA,OACA,eAC2F;AAC3F,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI;AACF,UAAM,aAAkB,YAAK,cAAc,gBAAgB,GAAG,SAAS;AAEvE,QAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,aAAO,UAAU;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,oBAAI,KAAK;AAC5B,eAAW,QAAQ,WAAW,QAAQ,IAAI,aAAa;AAEvD,UAAM,cAAiB,iBAAY,UAAU,EAAE,OAAO,CAAC,QAAQ;AAC7D,YAAM,UAAe,YAAK,YAAY,GAAG;AACzC,aAAU,cAAS,OAAO,EAAE,YAAY;AAAA,IAC1C,CAAC;AAED,eAAW,OAAO,aAAa;AAC7B,YAAM,UAAe,YAAK,YAAY,GAAG;AACzC,YAAM,QAAW,cAAS,OAAO;AAEjC,UAAI,MAAM,QAAQ,YAAY;AAC5B,YAAI;AACF,gBAAM,OAAO,uBAAuB,OAAO;AAE3C,cAAI,SAAU,MAAM,eAAe,GAAG,GAAI;AACxC,YAAG,YAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACnD,mBAAO;AACP,mBAAO,cAAc;AAAA,UACvB;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,OAAO,KAAK,oBAAoB,GAAG,KAAK,KAAK,EAAE;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO,KAAK,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAC9F,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,SAAyB;AACvD,MAAI,YAAY;AAEhB,QAAM,QAAW,iBAAY,OAAO;AAEpC,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAgB,YAAK,SAAS,IAAI;AACxC,UAAM,QAAW,cAAS,QAAQ;AAElC,QAAI,MAAM,YAAY,GAAG;AACvB,mBAAa,uBAAuB,QAAQ;AAAA,IAC9C,OAAO;AACL,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,eAAe,cAAwC;AAGpE,SAAO;AACT;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,SAAS,MAAM,MAAM,IAAI;AACxC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAElD,SAAO,GAAG,YAAY,QAAQ,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAC/D;AAEA,SAAS,qBAAqB,QAA6B;AACzD,UAAQ,IAAI,OAAO,KAAK;AAAA,sCAAkC,CAAC;AAC3D,UAAQ,IAAI,2BAAoB,OAAO,WAAW,EAAE;AACpD,UAAQ,IAAI,2BAAoB,OAAO,WAAW,EAAE;AACpD,UAAQ,IAAI,+BAAwB,OAAO,eAAe,EAAE;AAC5D,UAAQ,IAAI,0BAAmB,YAAY,OAAO,eAAe,CAAC,EAAE;AACpE,UAAQ,IAAI,yBAAkB,YAAY,OAAO,cAAc,CAAC,EAAE;AAElE,MAAI,OAAO,mBAAmB,GAAG;AAC/B,YAAQ,IAAI,2BAAoB,OAAO,mBAAmB,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,EAC9E;AAEA,MAAI,OAAO,WAAW;AACpB,YAAQ,IAAI,4BAAqB,OAAO,SAAS,EAAE;AAAA,EACrD;AAEA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,YAAQ,IAAI,8BAAuB;AACnC,WAAO,QAAQ,QAAQ,CAAC,WAAW;AACjC,YAAM,OAAO,OAAO,WAAW,WAAM;AACrC,YAAM,QAAQ,OAAO,WAAW,OAAO,QAAQ,OAAO;AACtD,YAAM,OAAO,YAAY,OAAO,SAAS;AACzC,cAAQ,IAAI,MAAM,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,GAAG,CAAC;AAAA,IACvD,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,YAAQ,IAAI,OAAO,OAAO,2BAAiB,CAAC;AAC5C,WAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,cAAQ,IAAI,OAAO,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,IAC7C,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAQ,IAAI,OAAO,IAAI,kBAAa,CAAC;AACrC,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,cAAQ,IAAI,OAAO,IAAI,OAAO,KAAK,EAAE,CAAC;AAAA,IACxC,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,OAAO,UAAU,OAAO,QAAQ,OAAO;AAC5D,QAAM,cAAc,OAAO,UAAU,WAAM;AAC3C,UAAQ;AAAA,IACN,aAAa;AAAA,EAAK,WAAW,YAAY,OAAO,UAAU,2BAA2B,QAAQ,EAAE;AAAA,EACjG;AACF;AAEA,SAAS,mBAAmB,KAA0B,QAAgB,YAA6B;AACjG,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,EAC1C,OAAO;AACL,YAAQ,IAAI,OAAO,KAAK;AAAA,0BAAsB,IAAI,MAAM,SAAS,CAAC;AAElE,QAAI,IAAI,WAAW,GAAG;AACpB,cAAQ,IAAI,OAAO,OAAO,uBAAuB,CAAC;AAClD;AAAA,IACF;AAEA,YAAQ;AAAA,MACN,IAAI,IAAI,CAAC,QAAQ;AAAA,QACf,SAAS,GAAG;AAAA,QACZ,OAAO,GAAG,MAAM,UAAU,GAAG,EAAE,KAAK,GAAG,MAAM,SAAS,KAAK,QAAQ;AAAA,QACnE,QAAQ,GAAG;AAAA,QACX,UAAU,GAAG;AAAA,QACb,SAAS,GAAG,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,QAChC,MAAM,YAAY,GAAG,SAAS;AAAA,MAChC,EAAE;AAAA,IACJ;AAAA,EACF;AACF;AA7wBA,IAKAC,MACAC,QACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AACA;AA2DgB;AA8JD;AAqGA;AA2BA;AAsDA;AA6CA;AA8CA;AAMA;AA6CA;AAoEA;AAuDN;AAmBM;AAMN;AAUA;AA+CA;AAAA;AAAA;;;AC9sBF,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAI,2BAAQ,OAAO;AAE/B,MACG,YAAY,sCAAsC,EAClD,SAAS,WAAW,0BAA0B,EAC9C;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,2BAA2B,gCAAgC,EAClE,OAAO,kBAAkB,yCAAyC,KAAK,EACvE,OAAO,mBAAmB,0CAA0C,KAAK,EACzE,OAAO,mBAAmB,sCAAsC,KAAK,EACrE,OAAO,gBAAgB,mCAAmC,KAAK,EAC/D,OAAO,sBAAsB,mCAAmC,KAAK,EACrE,OAAO,mBAAmB,yBAAyB,KAAK,EACxD,OAAO,WAAW,sCAAsC,KAAK,EAC7D,OAAO,aAAa,6CAA6C,KAAK,EACtE,OAAO,OAAO,MAAc,YAAiB;AAC5C,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,cAAc,IAAI,cAAc,aAAa;AACnD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AACjE,UAAM,aAAa,IAAI,UAAU;AAEjC,UAAM,eAA6B;AAAA,MACjC,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,mBAAmB,QAAQ;AAAA,MAC3B,oBAAoB,QAAQ;AAAA,MAC5B,oBAAoB,QAAQ;AAAA,MAC5B,cAAc,CAAC,QAAQ;AAAA,MACvB,iBAAiB,QAAQ;AAAA,MACzB,aAAa,QAAQ;AAAA,IACvB;AAEA,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,OAAO,OAAO,iDAA0C,CAAC;AACrE,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAEA,UAAI,OAAO,SAAS;AAClB,gBAAQ,IAAI,OAAO,MAAM,iCAA4B,IAAI,EAAE,CAAC;AAC5D,gBAAQ,IAAI,qBAAc,OAAO,MAAM,EAAE;AAEzC,YAAI,OAAO,aAAa,SAAS,GAAG;AAClC,kBAAQ,IAAI,4BAAqB,OAAO,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,QACnE;AAEA,YAAI,OAAO,cAAc,SAAS,GAAG;AACnC,kBAAQ,IAAI,6BAAsB,OAAO,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,QACrE;AAEA,YAAI,OAAO,cAAc,SAAS,GAAG;AACnC,kBAAQ,IAAI,6BAAsB,OAAO,cAAc,MAAM,EAAE;AAAA,QACjE;AAEA,YAAI,OAAO,cAAc,SAAS,GAAG;AACnC,kBAAQ,IAAI,iCAA0B,OAAO,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,QACzE;AAEA,YAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,kBAAQ,IAAI,OAAO,OAAO,yBAAe,CAAC;AAC1C,iBAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,oBAAQ,IAAI,OAAO,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,UAC7C,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,OAAO,IAAI,6BAAwB,IAAI,EAAE,CAAC;AACxD,eAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,kBAAQ,MAAM,OAAO,IAAI,YAAO,KAAK,EAAE,CAAC;AAAA,QAC1C,CAAC;AACD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,4BAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC/E;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,QACb,MACA,SACA,eACA,aACA,qBACA,eACA,QAAiB,OACjB,SAAkB,OACI;AACtB,QAAM,SAAsB;AAAA,IAC1B,SAAS;AAAA,IACT;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,cAAc,CAAC;AAAA,IACf,eAAe,CAAC;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,EACb;AAEA,MAAI;AAEF,UAAM,SAAS,MAAM,cAAc,WAAW,IAAI;AAClD,QAAI,CAAC,QAAQ;AACX,aAAO,OAAO,KAAK,MAAM,IAAI,YAAY;AACzC,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,mBAAmB,QAAQ,MAAM,GAAG;AACvC,aAAO,OAAO,KAAK,yBAAyB,QAAQ,MAAM,EAAE;AAC5D,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmB,yBAAyB,QAAQ,KAAK;AAC/D,QAAI,CAAC,iBAAiB,OAAO;AAC3B,aAAO,OAAO,KAAK,GAAG,iBAAiB,MAAM;AAC7C,aAAO;AAAA,IACT;AAGA,QAAI,iBAAiB,SAAS,SAAS,GAAG;AACxC,aAAO,SAAS,KAAK,GAAG,iBAAiB,QAAQ;AAAA,IACnD;AAGA,QAAI,CAAC,QAAQ;AACX,YAAM,cAAc,eAAe,MAAM,QAAQ;AACjD,YAAM,aAAa,cAAc,gBAAgB;AACjD,YAAM,aAAa,MAAM,YAAY,wBAAwB,QAAQ,UAAU,UAAU;AACzF,UAAI,WAAW,OAAO;AACpB,eAAO,cAAc,KAAK,WAAW,OAAO;AAAA,MAC9C;AAAA,IACF;AAGA,QAAI,QAAQ,mBAAmB;AAC7B,YAAM,cAAc,MAAM,oBAAoB,eAAe,IAAI;AAEjE,UAAI,CAAC,QAAQ;AACX,mBAAW,UAAU,aAAa;AAChC,gBAAM,mBAAmB,QAAQ,MAAM,SAAS,aAAa;AAC7D,iBAAO,aAAa,KAAK,MAAM;AAAA,QACjC;AAAA,MACF,OAAO;AACL,eAAO,eAAe;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,QAAQ,oBAAoB;AAC9B,YAAM,eAAe,MAAM,oBAAoB,gBAAgB,IAAI;AAEnE,UAAI,CAAC,QAAQ;AACX,mBAAW,WAAW,cAAc;AAClC,gBAAM,oBAAoB,SAAS,MAAM,SAAS,aAAa;AAC/D,iBAAO,cAAc,KAAK,OAAO;AAAA,QACnC;AAAA,MACF,OAAO;AACL,eAAO,gBAAgB;AAAA,MACzB;AAAA,IACF;AAGA,QAAI,QAAQ,mBAAmB,OAAO,WAAW;AAC/C,UAAI,CAAC,QAAQ;AACX,mBAAW,YAAY,OAAO,WAAW;AACvC,gBAAM,eAAe,UAAU,MAAM,OAAO;AAC5C,iBAAO,cAAc,KAAK,QAAQ;AAAA,QACpC;AAAA,MACF,OAAO;AACL,eAAO,gBAAgB,OAAO;AAAA,MAChC;AAAA,IACF;AAGA,QAAI,QAAQ,aAAa;AACvB,UAAI,CAAC,QAAQ;AACX,cAAM,mBAAmB,QAAQ,SAAS,aAAa;AAAA,MACzD;AACA,aAAO,SAAS,KAAK,yBAAyB;AAAA,IAChD;AAGA,QAAI,CAAC,QAAQ;AACX,YAAM,yBAAyB,QAAQ,SAAS,MAAM;AAAA,IACxD;AAGA,QAAI,CAAC,QAAQ;AACX,YAAM,wBAAwB,QAAQ,SAAS,aAAa;AAAA,IAC9D;AAEA,WAAO,UAAU;AACjB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO;AAAA,MACZ,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACnF;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,QAAuC;AACjE,SAAO,CAAC,aAAa,cAAc,YAAY,aAAa,SAAS,OAAO,EAAE,SAAS,MAAM;AAC/F;AAEA,SAAS,yBACP,QACA,OAKA;AACA,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAG5B,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO,KAAK,sBAAsB;AAAA,EACpC;AAGA,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO,KAAK,2CAA2C;AAAA,EACzD;AAGA,MAAI,OAAO,cAAc,cAAc,CAAC,OAAO;AAC7C,aAAS,KAAK,sDAAsD;AAAA,EACtE;AAGA,MAAI,OAAO,aAAa,OAAO,UAAU,SAAS,KAAK,CAAC,OAAO;AAC7D,aAAS,KAAK,UAAU,OAAO,UAAU,MAAM,0CAA0C;AAAA,EAC3F;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,mBACb,QACA,MACA,SACA,eACe;AACf,MAAI;AACF,UAAM,WAAW,cAAc,kBAAkB;AACjD,UAAM,YAAe,iBAAY,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,CAAC;AAEjF,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,KAAK,QAAQ,MAAM,iBAAiB,QAAQ,EAAE;AACtD;AAAA,IACF;AAEA,UAAM,WAAW,UAAU,CAAC;AAC5B,UAAM,WAAgB,YAAK,UAAU,QAAQ;AAC7C,UAAM,cAAiB,kBAAa,UAAU,MAAM;AAGpD,UAAM,iBAAiB,YAAY;AAAA,MACjC;AAAA,MACA,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,IAC3C;AAGA,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA,KAA0B,IAAI,gBAAgB,QAAQ,MAAM,IAAI,QAAQ,UAAU,KAAK,QAAQ,OAAO,KAAK,EAAE;AAAA;AAAA;AAAA;AACjI,UAAM,eAAe,iBAAiB;AAEtC,IAAG,mBAAc,UAAU,cAAc,MAAM;AAAA,EACjD,SAAS,OAAO;AACd,YAAQ,MAAM,yBAAyB,MAAM,KAAK,KAAK,EAAE;AAAA,EAC3D;AACF;AAEA,eAAe,oBACb,SACA,MACA,SACA,eACe;AACf,MAAI;AACF,UAAM,YAAY,cAAc,mBAAmB;AACnD,UAAM,aAAgB,iBAAY,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,CAAC;AAEpF,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,KAAK,SAAS,OAAO,iBAAiB,SAAS,EAAE;AACzD;AAAA,IACF;AAEA,UAAM,YAAY,WAAW,CAAC;AAC9B,UAAM,YAAiB,YAAK,WAAW,SAAS;AAChD,UAAM,eAAkB,kBAAa,WAAW,MAAM;AAGtD,UAAM,iBAAiB,aAAa;AAAA,MAClC;AAAA,MACA,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,IAC3C;AAGA,UAAM,cAAc;AAAA;AAAA;AAAA;AAAA,KAA0B,IAAI,gBAAgB,QAAQ,MAAM,IAAI,QAAQ,UAAU,KAAK,QAAQ,OAAO,KAAK,EAAE;AAAA;AAAA;AAAA;AACjI,UAAM,eAAe,iBAAiB;AAEtC,IAAG,mBAAc,WAAW,cAAc,MAAM;AAAA,EAClD,SAAS,OAAO;AACd,YAAQ,MAAM,0BAA0B,OAAO,KAAK,KAAK,EAAE;AAAA,EAC7D;AACF;AAEA,eAAe,eACb,UACA,MACA,SACe;AAGf,UAAQ,IAAI,aAAa,QAAQ,aAAa,IAAI,aAAa,QAAQ,MAAM,GAAG;AAClF;AAEA,eAAe,mBACb,QACA,SACA,eACe;AACf,QAAM,cAAc;AAAA,IAClB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,EACpB;AAGA,QAAM,aAAkB,YAAK,cAAc,gBAAgB,GAAG,SAAS;AACvE,MAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,IAAG,eAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,aAAkB,YAAK,YAAY,qBAAqB;AAC9D,MAAI,UAAiB,CAAC;AAEtB,MAAO,gBAAW,UAAU,GAAG;AAC7B,UAAM,gBAAmB,kBAAa,YAAY,MAAM;AACxD,cAAU,KAAK,MAAM,aAAa;AAAA,EACpC;AAEA,UAAQ,KAAK,WAAW;AACxB,EAAG,mBAAc,YAAY,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,MAAM;AACvE;AAEA,eAAe,yBACb,QACA,SACA,QACe;AACf,QAAM,WAAW;AAAA,IACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,QAAQ;AAAA,IACR,OAAO,OAAO;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,eAAe,OAAO;AAAA,IACtB,gBAAgB,OAAO;AAAA,IACvB,gBAAgB,OAAO;AAAA,IACvB,eAAe,OAAO;AAAA,EACxB;AAGA,UAAQ,IAAI,4BAA4B,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC3E;AAEA,eAAe,wBACb,QACA,SACA,gBACe;AACf,MAAI;AACF,UAAM,YAAe,kBAAa,OAAO,WAAW,MAAM;AAG1D,UAAM,iBAAiB,UACpB,QAAQ,oBAAoB,mBAAmB,EAC/C,QAAQ,0BAA0B,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AAGhF,UAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA,cAAmC,QAAQ,MAAM;AAAA,EAAK,QAAQ,UAAU,gBAAgB,QAAQ,OAAO;AAAA,IAAO,EAAE,gBAAe,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAC9K,UAAM,eAAe,iBAAiB;AAEtC,IAAG,mBAAc,OAAO,WAAW,cAAc,MAAM;AAAA,EACzD,SAAS,OAAO;AACd,YAAQ,MAAM,uBAAuB,OAAO,KAAK,uBAAuB,KAAK,EAAE;AAAA,EACjF;AACF;AAjdA,IAKAC,MACAC,QACAC;AAPA,IAAAC,cAAA;AAAA;AAAA;AAAA;AAKA,IAAAH,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AACA;AACA;AA2BgB;AAqGD;AA6HN;AAIA;AAsCM;AAmCA;AAmCA;AAUA;AAkCA;AAqBA;AAAA;AAAA;;;AC3YR,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAI,2BAAQ,OAAO;AAE/B,MACG,YAAY,8CAA8C,EAC1D,SAAS,WAAW,0BAA0B,EAC9C,OAAO,6BAA6B,wCAAwC,OAAO,EACnF,OAAO,2BAA2B,6BAA6B,EAC/D,OAAO,iBAAiB,kCAAkC,KAAK,EAC/D,OAAO,mBAAmB,oCAAoC,KAAK,EACnE,OAAO,mBAAmB,mCAAmC,KAAK,EAClE,OAAO,iBAAiB,oCAAoC,KAAK,EACjE,OAAO,gBAAgB,iCAAiC,KAAK,EAC7D,OAAO,sBAAsB,6BAA6B,KAAK,EAC/D,OAAO,aAAa,6CAA6C,KAAK,EACtE,OAAO,OAAO,MAAc,YAAiB;AAC5C,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,cAAc,IAAI,cAAc,aAAa;AACnD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AACjE,UAAM,aAAa,IAAI,UAAU;AAEjC,UAAM,eAA6B;AAAA,MACjC,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,MACjB,kBAAkB,QAAQ;AAAA,MAC1B,oBAAoB,QAAQ;AAAA,MAC5B,iBAAiB,CAAC,QAAQ;AAAA,MAC1B,mBAAmB,CAAC,QAAQ;AAAA,MAC5B,aAAa,CAAC,QAAQ;AAAA,MACtB,iBAAiB,QAAQ;AAAA,IAC3B;AAEA,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,OAAO,OAAO,iDAA0C,CAAC;AACrE,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAEA,UAAI,OAAO,SAAS;AAClB,gBAAQ,IAAI,OAAO,MAAM,iCAA4B,IAAI,EAAE,CAAC;AAC5D,gBAAQ,IAAI,uBAAgB,OAAO,QAAQ,EAAE;AAE7C,YAAI,OAAO,aAAa;AACtB,kBAAQ,IAAI,2BAAoB,OAAO,WAAW,EAAE;AAAA,QACtD;AAEA,YAAI,OAAO,aAAa,SAAS,GAAG;AAClC,kBAAQ,IAAI,4BAAqB,OAAO,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,QACnE;AAEA,YAAI,OAAO,cAAc,SAAS,GAAG;AACnC,kBAAQ,IAAI,6BAAsB,OAAO,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,QACrE;AAEA,YAAI,OAAO,cAAc,SAAS,GAAG;AACnC,kBAAQ,IAAI,6BAAsB,OAAO,cAAc,MAAM,EAAE;AAAA,QACjE;AAEA,YAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,kBAAQ,IAAI,OAAO,OAAO,yBAAe,CAAC;AAC1C,iBAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,oBAAQ,IAAI,OAAO,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,UAC7C,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,OAAO,IAAI,6BAAwB,IAAI,EAAE,CAAC;AACxD,eAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,kBAAQ,MAAM,OAAO,IAAI,YAAO,KAAK,EAAE,CAAC;AAAA,QAC1C,CAAC;AACD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,4BAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC/E;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,QACb,MACA,SACA,eACA,aACA,qBACA,eACA,SAAkB,OACI;AACtB,QAAM,SAAsB;AAAA,IAC1B,SAAS;AAAA,IACT;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,cAAc,CAAC;AAAA,IACf,eAAe,CAAC;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,EACb;AAEA,MAAI;AAEF,UAAM,SAAS,MAAM,cAAc,WAAW,IAAI;AAClD,QAAI,CAAC,QAAQ;AACX,aAAO,OAAO,KAAK,MAAM,IAAI,YAAY;AACzC,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,qBAAqB,QAAQ,QAAQ,GAAG;AAC3C,aAAO,OAAO,KAAK,2BAA2B,QAAQ,QAAQ,EAAE;AAChE,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmB,yBAAyB,MAAM;AACxD,QAAI,CAAC,iBAAiB,OAAO;AAC3B,aAAO,OAAO,KAAK,GAAG,iBAAiB,MAAM;AAC7C,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,mBAAmB;AAC7B,YAAM,eAAe,MAAM,kBAAkB,QAAQ,OAAO;AAC5D,YAAM,eAAe,aAAa,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,MAAM,MAAM;AAEnF,UAAI,aAAa,SAAS,GAAG;AAC3B,eAAO,OAAO,KAAK,mCAAmC;AACtD,qBAAa,QAAQ,CAAC,UAAU;AAC9B,iBAAO,OAAO,KAAK,OAAO,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,QAC1D,CAAC;AACD,eAAO;AAAA,MACT;AAGA,mBACG,OAAO,CAAC,UAAU,CAAC,MAAM,YAAY,CAAC,MAAM,MAAM,EAClD,QAAQ,CAAC,UAAU;AAClB,eAAO,SAAS,KAAK,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,MACxD,CAAC;AAAA,IACL;AAGA,QAAI,CAAC,QAAQ;AACX,YAAM,cAAc,MAAM,aAAa,QAAQ,OAAO;AACtD,UAAI,CAAC,YAAY,SAAS;AACxB,eAAO,OAAO,KAAK,GAAG,YAAY,MAAM;AACxC,eAAO;AAAA,MACT;AACA,aAAO,cAAc,YAAY;AAAA,IACnC;AAGA,QAAI,CAAC,QAAQ;AACX,YAAM,cAAc,eAAe,MAAM,QAAQ;AACjD,YAAM,aAAa,cAAc,gBAAgB;AACjD,YAAM,aAAa,MAAM,YAAY,wBAAwB,QAAQ,UAAU,UAAU;AACzF,UAAI,WAAW,OAAO;AACpB,eAAO,cAAc,KAAK,WAAW,OAAO;AAAA,MAC9C;AAAA,IACF;AAGA,QAAI,QAAQ,kBAAkB;AAC5B,YAAM,cAAc,MAAM,oBAAoB,eAAe,IAAI;AACjE,YAAM,eAAe,MAAM,oBAAoB,gBAAgB,IAAI;AAEnE,UAAI,CAAC,QAAQ;AAEX,mBAAW,UAAU,aAAa;AAChC,gBAAM,mBAAmB,QAAQ,MAAM,aAAa;AACpD,iBAAO,aAAa,KAAK,MAAM;AAAA,QACjC;AAGA,mBAAW,WAAW,cAAc;AAClC,gBAAM,oBAAoB,SAAS,MAAM,aAAa;AACtD,iBAAO,cAAc,KAAK,OAAO;AAAA,QACnC;AAAA,MACF,OAAO;AACL,eAAO,eAAe;AACtB,eAAO,gBAAgB;AAAA,MACzB;AAAA,IACF;AAGA,QAAI,QAAQ,mBAAmB,OAAO,WAAW;AAC/C,UAAI,CAAC,QAAQ;AACX,cAAM,wBAAwB,OAAO,WAAW,aAAa;AAAA,MAC/D;AACA,aAAO,SAAS,KAAK,2BAA2B,OAAO,SAAS,EAAE;AAAA,IACpE;AAGA,QAAI,CAAC,QAAQ;AACX,YAAM,uBAAuB,QAAQ,SAAS,MAAM;AAAA,IACtD;AAEA,WAAO,UAAU;AACjB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO;AAAA,MACZ,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACnF;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,UAA6C;AACzE,SAAO,CAAC,SAAS,UAAU,QAAQ,EAAE,SAAS,QAAQ;AACxD;AAEA,SAAS,yBAAyB,QAAsD;AACtF,QAAM,SAAmB,CAAC;AAG1B,MAAI,CAAC,CAAC,YAAY,QAAQ,QAAQ,EAAE,SAAS,OAAO,SAAS,GAAG;AAC9D,WAAO;AAAA,MACL,cAAc,OAAO,SAAS;AAAA,IAChC;AAAA,EACF;AAGA,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO,KAAK,sBAAsB;AAAA,EACpC;AAEA,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO,KAAK,mCAAmC;AAAA,EACjD;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAe,kBAAkB,QAAgB,SAAiD;AA7SlG;AA8SE,QAAM,SAA0B,CAAC;AAGjC,MAAI,QAAQ,iBAAiB;AAC3B,UAAM,cAAc,OAAO,aAAa,OAAO,UAAU,SAAS;AAClE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,QAAQ,eAAe;AAAA,MACvB,SAAS,cAAc,8BAA8B;AAAA,IACvD,CAAC;AAAA,EACH;AAGA,QAAM,eAAe,OAAO,aAAa,OAAO,UAAU,SAAS;AACnE,QAAM,wBACJ,kBACA,YAAO,cAAP,mBAAkB,MAAM,CAAC,aAAU;AAhUvC,QAAAE;AAgU0C,aAAAA,MAAA,OAAO,cAAP,gBAAAA,IAAkB,SAAS,cAAa;AAAA;AAEhF,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ,CAAC,gBAAgB;AAAA,IACzB,SAAS,wBACL,0BACA;AAAA,EACN,CAAC;AAGD,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ,QAAQ,OAAO,iBAAiB,OAAO,aAAa;AAAA,IAC5D,SACE,OAAO,iBAAiB,OAAO,gBAC3B,uBACA;AAAA,EACR,CAAC;AAGD,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA;AAAA,IACR,SAAS;AAAA,EACX,CAAC;AAGD,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,uBAAuB,MAAM,uBAAuB,MAAM;AAChE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS,uBACL,mCACA;AAAA,IACN,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,uBAAuB,SAAmC;AAGvE,SAAO;AACT;AAEA,eAAe,aACb,QACA,SAKC;AACD,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI;AAGF,UAAM,cAAc,oBAAoB,QAAQ,OAAO;AAGvD,YAAQ,QAAQ,UAAU;AAAA,MACxB,KAAK;AAEH,eAAO,cAAc;AACrB;AAAA,MACF,KAAK;AAEH,eAAO,cAAc,UAAU,WAAW;AAC1C;AAAA,MACF,KAAK;AAEH,eAAO,cAAc,UAAU,WAAW;AAC1C;AAAA,IACJ;AAEA,WAAO,UAAU;AACjB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO,KAAK,iBAAiB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAC5F,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,QAAgB,SAA+B;AAC1E,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,WAAW,QAAQ;AAEzB,MAAI,QAAQ,SAAS;AACnB,WAAO,GAAG,QAAQ,IAAI,SAAS;AAAA,EACjC;AAEA,SAAO,GAAG,QAAQ,IAAI,SAAS,IAAI,OAAO,KAAK;AACjD;AAEA,eAAe,mBACb,QACA,MACA,eACe;AACf,MAAI;AACF,UAAM,WAAW,cAAc,kBAAkB;AACjD,UAAM,YAAe,iBAAY,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,CAAC;AAEjF,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,KAAK,QAAQ,MAAM,iBAAiB,QAAQ,EAAE;AACtD;AAAA,IACF;AAEA,UAAM,WAAW,UAAU,CAAC;AAC5B,UAAM,WAAgB,YAAK,UAAU,QAAQ;AAC7C,UAAM,cAAiB,kBAAa,UAAU,MAAM;AAGpD,UAAM,iBAAiB,YACpB,QAAQ,iBAAiB,mBAAmB,EAC5C,QAAQ,0BAA0B,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AAGhF,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA,gDAAkF,IAAI;AAAA;AACxG,UAAM,eAAe,iBAAiB;AAEtC,IAAG,mBAAc,UAAU,cAAc,MAAM;AAAA,EACjD,SAAS,OAAO;AACd,YAAQ,MAAM,yBAAyB,MAAM,KAAK,KAAK,EAAE;AAAA,EAC3D;AACF;AAEA,eAAe,oBACb,SACA,MACA,eACe;AACf,MAAI;AACF,UAAM,YAAY,cAAc,mBAAmB;AACnD,UAAM,aAAgB,iBAAY,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,CAAC;AAEpF,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,KAAK,SAAS,OAAO,iBAAiB,SAAS,EAAE;AACzD;AAAA,IACF;AAEA,UAAM,YAAY,WAAW,CAAC;AAC9B,UAAM,YAAiB,YAAK,WAAW,SAAS;AAChD,UAAM,eAAkB,kBAAa,WAAW,MAAM;AAGtD,UAAM,iBAAiB,aAAa;AAAA,MAClC;AAAA,MACA,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,IAC3C;AAGA,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA,KAA0B,IAAI;AAAA;AAChD,UAAM,eAAe,iBAAiB;AAEtC,IAAG,mBAAc,WAAW,cAAc,MAAM;AAAA,EAClD,SAAS,OAAO;AACd,YAAQ,MAAM,0BAA0B,OAAO,KAAK,KAAK,EAAE;AAAA,EAC7D;AACF;AAEA,eAAe,wBACb,WACA,gBACe;AAGf,UAAQ,IAAI,oCAAoC,SAAS,EAAE;AAC7D;AAEA,eAAe,uBACb,QACA,SACA,QACe;AACf,QAAM,WAAW;AAAA,IACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,QAAQ;AAAA,IACR,OAAO,OAAO;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,cAAc,OAAO;AAAA,IACrB,eAAe,OAAO;AAAA,IACtB,gBAAgB,OAAO;AAAA,IACvB,gBAAgB,OAAO;AAAA,EACzB;AAGA,UAAQ,IAAI,0BAA0B,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AACzE;AA5gBA,IAKAC,MACAC,QACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AACA;AACA;AAmCgB;AA+FD;AAgIN;AAIA;AAyBM;AAqEA;AAMA;AA2CN;AAWM;AAiCA;AAkCA;AASA;AAAA;AAAA;;;ACjbR,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAI,2BAAQ,OAAO;AAE/B,MACG,YAAY,0CAA0C,EACtD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,qBAAqB,8CAA8C,EAC1E,OAAO,yBAAyB,oBAAoB,EACpD,OAAO,yBAAyB,oBAAoB,EACpD,OAAO,qBAAqB,oCAAoC,EAChE,OAAO,0BAA0B,+BAA+B,EAChE,OAAO,2BAA2B,gCAAgC,EAClE,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,qBAAqB,kBAAkB,EAC9C,OAAO,2BAA2B,qBAAqB,EACvD,OAAO,2BAA2B,iCAAiC,GAAG,EACtE,OAAO,uBAAuB,uCAAuC,KAAK,EAC1E,OAAO,mBAAmB,wCAAwC,KAAK,EACvE,OAAO,kBAAkB,2CAA2C,KAAK,EACzE,OAAO,aAAa,6CAA6C,KAAK,EACtE,OAAO,OAAO,YAAiB;AAC9B,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,cAAc,IAAI,cAAc,aAAa;AACnD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AACjE,UAAM,aAAa,IAAI,UAAU;AAEjC,UAAM,eAA6B;AAAA,MACjC,WAAW,QAAQ;AAAA,MACnB,QAAQ;AAAA,QACN,QAAQ,QAAQ,SAAS,QAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,QACrD,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,QAAQ,QAAQ,SAAS,QAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,QACrD,cAAc,QAAQ;AAAA,QACtB,eAAe,QAAQ;AAAA,QACvB,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,MACrB;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,gBAAgB,SAAS,QAAQ,cAAc;AAAA,MAC/C,iBAAiB,QAAQ;AAAA,MACzB,cAAc,QAAQ;AAAA,MACtB,aAAa,QAAQ;AAAA,IACvB;AAEA,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,OAAO,OAAO,uDAAgD,CAAC;AAC3E,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAEA,cAAQ,IAAI,OAAO,KAAK,mBAAY,OAAO,SAAS,sBAAsB,CAAC;AAC3E,cAAQ,IAAI,wBAAiB,OAAO,QAAQ,EAAE;AAC9C,cAAQ,IAAI,qBAAgB,OAAO,YAAY,EAAE;AACjD,cAAQ,IAAI,yBAAkB,OAAO,aAAa,EAAE;AACpD,cAAQ,IAAI,qBAAc,OAAO,SAAS,EAAE;AAC5C,cAAQ,IAAI,0BAAgB,OAAO,UAAU,EAAE;AAC/C,cAAQ,IAAI,uBAAa,OAAO,aAAa,IAAI;AAEjD,UAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,gBAAQ,IAAI,gCAAyB;AACrC,eAAO,QAAQ,QAAQ,CAAC,aAAa;AACnC,gBAAM,OAAO,SAAS,UAAU,WAAM;AACtC,gBAAM,QAAQ,SAAS,UAAU,OAAO,QAAQ,OAAO;AACvD,kBAAQ,IAAI,MAAM,GAAG,IAAI,IAAI,SAAS,IAAI,KAAK,SAAS,OAAO,EAAE,CAAC;AAElE,cAAI,SAAS,YAAY,SAAS,SAAS,SAAS,GAAG;AACrD,qBAAS,SAAS,QAAQ,CAAC,YAAY;AACrC,sBAAQ,IAAI,OAAO,OAAO,mBAAS,OAAO,EAAE,CAAC;AAAA,YAC/C,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,gBAAQ,IAAI,OAAO,OAAO,2BAAiB,CAAC;AAC5C,eAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,kBAAQ,IAAI,OAAO,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,QAC7C,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAQ,IAAI,OAAO,IAAI,kBAAa,CAAC;AACrC,eAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,kBAAQ,IAAI,OAAO,IAAI,OAAO,KAAK,EAAE,CAAC;AAAA,QACxC,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,QAAQ;AACjB,gBAAQ,IAAI,OAAO,KAAK;AAAA,6BAAyB,OAAO,MAAM,EAAE,CAAC;AAAA,MACnE;AAEA,UAAI,CAAC,OAAO,SAAS;AACnB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,kCAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACrF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,sBACb,SACA,eACA,aACA,qBACA,eACsB;AACtB,QAAM,YAAY,KAAK,IAAI;AAE3B,QAAM,SAAsB;AAAA,IAC1B,SAAS;AAAA,IACT,WAAW,QAAQ;AAAA,IACnB,UAAU;AAAA,IACV,cAAc;AAAA,IACd,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,SAAS,CAAC;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,eAAe;AAAA,EACjB;AAEA,MAAI;AAEF,UAAM,SAAS,MAAM,cAAc,QAAQ;AAC3C,UAAM,cAAc,UAAU,QAAQ,QAAQ,MAAM;AAEpD,WAAO,WAAW,YAAY;AAE9B,QAAI,YAAY,WAAW,GAAG;AAC5B,aAAO,SAAS,KAAK,4CAA4C;AACjE,aAAO,UAAU;AACjB,aAAO,gBAAgB,KAAK,IAAI,IAAI;AACpC,aAAO;AAAA,IACT;AAEA,YAAQ;AAAA,MACN,OAAO,KAAK,wBAAiB,YAAY,MAAM,wBAAwB,QAAQ,SAAS,EAAE;AAAA,IAC5F;AAGA,YAAQ,QAAQ,WAAW;AAAA,MACzB,KAAK;AACH,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,cAAM,oBAAoB,aAAa,SAAS,QAAQ,eAAe,aAAa;AACpF;AAAA,MACF,KAAK;AACH,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,cAAM,oBAAoB,aAAa,SAAS,QAAQ,aAAa,aAAa;AAClF;AAAA,MACF,KAAK;AACH,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF;AACE,eAAO,OAAO,KAAK,4BAA4B,QAAQ,SAAS,EAAE;AAClE,eAAO,gBAAgB,KAAK,IAAI,IAAI;AACpC,eAAO;AAAA,IACX;AAGA,QAAI,QAAQ,cAAc;AACxB,aAAO,SAAS,MAAM,kBAAkB,QAAQ,SAAS,aAAa;AAAA,IACxE;AAEA,WAAO,UAAU,OAAO,cAAc;AACtC,WAAO,gBAAgB,KAAK,IAAI,IAAI;AAEpC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO;AAAA,MACZ,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACnF;AACA,WAAO,gBAAgB,KAAK,IAAI,IAAI;AACpC,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,KAAe,QAAkC;AAClE,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,IAAI,OAAO,CAAC,OAAO;AAExB,QAAI,OAAO,QAAQ;AACjB,YAAM,WAAW,MAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,SAAS,CAAC,OAAO,MAAM;AAC9E,UAAI,CAAC,SAAS,SAAS,GAAG,SAAS,EAAG,QAAO;AAAA,IAC/C;AAGA,QAAI,OAAO,YAAY,GAAG,aAAa,OAAO,SAAU,QAAO;AAG/D,QAAI,OAAO,aAAa,CAAC,GAAG,aAAa,CAAC,GAAG,UAAU,SAAS,OAAO,QAAQ,GAAI,QAAO;AAG1F,QAAI,OAAO,QAAQ;AACjB,YAAM,SAAS,MAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,SAAS,CAAC,OAAO,MAAM;AAC5E,UAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,KAAK,CAAC,UAAO;AAxU3C;AAwU8C,wBAAG,SAAH,mBAAS,SAAS;AAAA,OAAM,EAAG,QAAO;AAAA,IAC5E;AAGA,QAAI,OAAO,gBAAgB,IAAI,KAAK,GAAG,YAAY,IAAI,IAAI,KAAK,OAAO,YAAY;AACjF,aAAO;AACT,QAAI,OAAO,iBAAiB,IAAI,KAAK,GAAG,YAAY,IAAI,IAAI,KAAK,OAAO,aAAa;AACnF,aAAO;AAGT,QAAI,OAAO,UAAU,GAAG,kBAAkB,OAAO,OAAQ,QAAO;AAGhE,QAAI,OAAO,UAAU,GAAG,aAAa,OAAO,OAAQ,QAAO;AAG3D,QAAI,OAAO,aAAa,GAAG,cAAc,OAAO,UAAW,QAAO;AAElE,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAe,kBACb,KACA,SACA,QACA,eACA,aACA,qBACA,eACe;AACf,QAAM,eAA6B;AAAA,IACjC,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,iBAAiB,CAAC,QAAQ;AAAA,IAC1B,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAEA,aAAW,MAAM,KAAK;AACpB,QAAI;AAEF,UAAI,CAAC,CAAC,YAAY,QAAQ,QAAQ,EAAE,SAAS,GAAG,SAAS,GAAG;AAC1D,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,wBAAwB,GAAG,SAAS;AAAA,QAC/C,CAAC;AACD;AAAA,MACF;AAEA,YAAM,cAAc,MAAM;AAAA,QACxB,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAEA,aAAO;AAEP,UAAI,YAAY,SAAS;AACvB,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,sCAAsC,YAAY,QAAQ;AAAA,UACnE,SAAS;AAAA,UACT,UAAU,YAAY;AAAA,QACxB,CAAC;AAAA,MACH,OAAO;AACL,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,iBAAiB,YAAY,OAAO,KAAK,IAAI,CAAC;AAAA,UACvD,OAAO,YAAY,OAAO,KAAK,IAAI;AAAA,QACrC,CAAC;AAED,YAAI,CAAC,QAAQ,iBAAiB;AAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AACP,aAAO,QAAQ,KAAK;AAAA,QAClB,MAAM,GAAG;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAED,UAAI,CAAC,QAAQ,iBAAiB;AAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,kBACb,KACA,SACA,QACA,eACA,aACA,qBACA,eACe;AACf,QAAM,eAA6B;AAAA,IACjC,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAEA,aAAW,MAAM,KAAK;AACpB,QAAI;AAEF,UAAI,CAAC,UAAU,QAAQ,EAAE,SAAS,GAAG,SAAS,GAAG;AAC/C,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,2BAA2B,GAAG,SAAS;AAAA,QAClD,CAAC;AACD;AAAA,MACF;AAEA,YAAM,cAAc,MAAM;AAAA,QACxB,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAEA,aAAO;AAEP,UAAI,YAAY,SAAS;AACvB,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,oCAAoC,YAAY,MAAM;AAAA,UAC/D,SAAS;AAAA,UACT,UAAU,YAAY;AAAA,QACxB,CAAC;AAAA,MACH,OAAO;AACL,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,iBAAiB,YAAY,OAAO,KAAK,IAAI,CAAC;AAAA,UACvD,OAAO,YAAY,OAAO,KAAK,IAAI;AAAA,QACrC,CAAC;AAED,YAAI,CAAC,QAAQ,iBAAiB;AAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AACP,aAAO,QAAQ,KAAK;AAAA,QAClB,MAAM,GAAG;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAED,UAAI,CAAC,QAAQ,iBAAiB;AAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,oBACb,KACA,SACA,QACA,eACA,gBACe;AACf,aAAW,MAAM,KAAK;AACpB,QAAI;AAEF,UAAI,CAAC,CAAC,QAAQ,QAAQ,EAAE,SAAS,GAAG,SAAS,GAAG;AAC9C,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,wBAAwB,GAAG,SAAS;AAAA,QAC/C,CAAC;AACD;AAAA,MACF;AAEA,UAAI,CAAC,QAAQ,QAAQ;AACnB,cAAM,cAAc,eAAe,GAAG,OAAO,UAAU;AAAA,MACzD;AAEA,aAAO;AACP,aAAO;AACP,aAAO,QAAQ,KAAK;AAAA,QAClB,MAAM,GAAG;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO;AACP,aAAO,QAAQ,KAAK;AAAA,QAClB,MAAM,GAAG;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAED,UAAI,CAAC,QAAQ,iBAAiB;AAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,yBACb,KACA,UACA,QACA,gBACA,cACA,gBACe;AAGf,aAAW,MAAM,KAAK;AACpB,WAAO;AACP,WAAO,QAAQ,KAAK;AAAA,MAClB,MAAM,GAAG;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,eAAe,oBACb,KACA,SACA,QACA,aACA,eACe;AACf,QAAM,aAAa,cAAc,gBAAgB;AAEjD,aAAW,MAAM,KAAK;AACpB,QAAI;AAEF,UAAI,CAAC,CAAC,UAAU,QAAQ,EAAE,SAAS,GAAG,SAAS,GAAG;AAChD,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,wBAAwB,GAAG,SAAS;AAAA,QAC/C,CAAC;AACD;AAAA,MACF;AAEA,UAAI,CAAC,QAAQ,QAAQ;AACnB,cAAM,iBAAiB,MAAM,YAAY,cAAc,YAAY,CAAC;AAAA,MAEtE;AAEA,aAAO;AACP,aAAO;AACP,aAAO,QAAQ,KAAK;AAAA,QAClB,MAAM,GAAG;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO;AACP,aAAO,QAAQ,KAAK;AAAA,QAClB,MAAM,GAAG;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAED,UAAI,CAAC,QAAQ,iBAAiB;AAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,4BACb,SACA,QACA,eACA,qBACA,eACe;AACf,MAAI;AAEF,UAAM,iBAAiB,MAAM,4BAA4B,aAAa;AAEtE,eAAW,QAAQ,gBAAgB;AACjC,UAAI;AACF,YAAI,CAAC,QAAQ,QAAQ;AAEnB,gBAAM,SAAS,MAAM,iBAAiB,MAAM,eAAe,aAAa;AACxE,gBAAM,oBAAoB,aAAa,OAAO,OAAO,KAAK,OAAO;AAAA,QACnE;AAEA,eAAO;AACP,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,MAAM,KAAK,OAAO;AAAA,UACxB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,yBAAyB,KAAK,KAAK;AAAA,QAC9C,CAAC;AAAA,MACH,SAAS,OAAO;AACd,eAAO;AACP,eAAO,QAAQ,KAAK;AAAA,UAClB,MAAM,MAAM,KAAK,OAAO;AAAA,UACxB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,kCAAkC,KAAK,KAAK;AAAA,UACrD,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,CAAC;AAED,YAAI,CAAC,QAAQ,iBAAiB;AAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,WAAW,eAAe;AAAA,EACnC,SAAS,OAAO;AACd,WAAO,OAAO;AAAA,MACZ,oCAAoC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC5F;AAAA,EACF;AACF;AAEA,eAAe,4BAA4B,gBAAoD;AAG7F,SAAO,CAAC;AACV;AAEA,eAAe,iBACb,MACA,gBACA,gBACiB;AAGjB,SAAO;AAAA,IACL,OAAO,MAAM,KAAK,OAAO;AAAA,IACzB,OAAO,UAAU,KAAK,KAAK;AAAA,IAC3B,aAAa,KAAK;AAAA,IAClB,QAAQ;AAAA,IACR,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IACf,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,YAAY,CAAC;AAAA,IACb,aAAa;AAAA,IACb,UAAU,KAAK;AAAA,IACf,SAAS,KAAK;AAAA,IACd,WAAW;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF;AAEA,eAAe,kBACb,QACA,SACA,eACiB;AACjB,QAAM,aAAa;AAAA,IACjB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,WAAW,OAAO;AAAA,IAClB,SAAS;AAAA,MACP,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO;AAAA,MACrB,eAAe,OAAO;AAAA,MACtB,WAAW,OAAO;AAAA,MAClB,YAAY,OAAO;AAAA,MACnB,eAAe,OAAO;AAAA,IACxB;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,EACnB;AAEA,QAAM,aAAkB,YAAK,cAAc,gBAAgB,GAAG,SAAS;AACvE,MAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,IAAG,eAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,iBAAiB,SAAS,OAAO,SAAS,KAAI,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAC1F,QAAM,aAAkB,YAAK,YAAY,cAAc;AAEvD,EAAG,mBAAc,YAAY,KAAK,UAAU,YAAY,MAAM,CAAC,GAAG,MAAM;AAExE,SAAO;AACT;AA7vBA,IAKAC,MACAC,QACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AAyDgB;AA0HD;AAkHN;AAyCM;AAsFA;AAuFA;AAkDA;AAqBA;AAqDA;AAmDA;AAMA;AA4BA;AAAA;AAAA;;;AC1rBR,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,iCAAiC,EAC7C,SAAS,WAAW,2CAA2C,EAC/D,OAAO,kBAAkB,+CAA+C,EACxE,eAAe,0BAA0B,iBAAiB,EAC1D,OAAO,4BAA4B,gBAAgB,EACnD,OAAO,6BAA6B,mBAAmB,EACvD,OAAO,0BAA0B,6CAA6C,QAAQ,EACtF;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,yBAAyB,mBAAmB,SAAS,EAC5D,OAAO,+BAA+B,yBAAyB,GAAG,EAClE,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,4BAA4B,wBAAwB,EAC3D,OAAO,0BAA0B,oBAAoB,EACrD,OAAO,0BAA0B,oCAAoC,EACrE,OAAO,0BAA0B,gBAAgB,EACjD,OAAO,2BAA2B,oCAAoC,EACtE,OAAO,wBAAwB,gCAAgC,EAC/D,OAAO,aAAa,6CAA6C,EACjE,OAAO,OAAO,UAA8B,YAA2B;AACtE,QAAI;AAEF,YAAM,QAAQ,YAAY,QAAQ;AAClC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAS,OAAO,OAAO;AAAA,IAC/B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAClF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,SAAS,OAAe,SAAuC;AAC5E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,cAAc,IAAI,YAAY;AAGpC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,iBAAiB,oBAAoB,kBAAkB,QAAQ,KAAK;AAC1E,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,oBAAoB,QAAQ,KAAK,EAAE;AAAA,EACrD;AAGA,QAAM,OAAO,YAAY,aAAa,QAAQ,OAAO,KAAK;AAG1D,QAAM,WAAW,cAAc,wBAAwB,MAAM,QAAQ,YAAY,SAAS;AAC1F,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,gBAAgB,QAAQ,YAAY,SAAS,aAAa;AAAA,EAC5E;AAGA,QAAM,OAAO,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC;AAChF,QAAM,YAAY,QAAQ,YAAY,QAAQ,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;AAC3F,QAAM,eAAe,QAAQ,eACzB,QAAQ,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IACvD,CAAC;AAGL,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,gBAA+B;AAAA,IACnC,OAAO;AAAA,IACP,UAAU,QAAQ;AAAA,IAClB,SAAS,eAAe,MAAM;AAAA,IAC9B;AAAA,IACA,aAAa,QAAQ,eAAe,SAAS,qBAAqB,eAAe;AAAA,IACjF,QAAQ;AAAA;AAAA,IACR,WAAW,QAAQ,YAAY;AAAA,IAC/B,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ,YAAY,OAAO,oBAAoB;AAAA,IACzD,cAAc;AAAA,IACd,cAAc;AAAA,IACd,kBAAkB,SAAS,QAAQ,mBAAmB,KAAK,EAAE;AAAA,IAC7D,eAAe;AAAA,IACf,YAAY,SAAS,uBAAuB,OAAO,wBAAwB,CAAC;AAAA,IAC5E,aAAa;AAAA,IACb,aAAa,QAAQ;AAAA,IACrB,eAAe,QAAQ;AAAA,IACvB,eAAe,QAAQ,gBAAgB;AAAA,IACvC,gBAAgB,QAAQ;AAAA,IACxB,WAAW,UAAU,SAAS,IAAI,YAAY;AAAA,IAC9C,WAAW,CAAC;AAAA,IACZ,MAAM,KAAK,SAAS,IAAI,OAAO;AAAA,IAC/B,cAAc,aAAa,SAAS,IAAI,eAAe;AAAA,IACvD,YAAY,CAAC;AAAA,IACb,QAAQ,CAAC;AAAA,IACT,aAAa,CAAC;AAAA,IACd,eAAe,QAAQ,YAAY;AAAA,EACrC;AAGA,QAAM,UAAU,SAAS,iBACtB,QAAQ,kBAAkB,KAAK,EAC/B,QAAQ,wBAAwB,cAAc,WAAW,EACzD,QAAQ,qBAAqB,QAAQ,KAAK,EAC1C,QAAQ,wBAAwB,cAAc,eAAe,EAAE,EAC/D,QAAQ,0BAA0B,cAAc,iBAAiB,MAAM;AAG1E,QAAM,WAAW,GAAG,IAAI,IAAI,MAAM,YAAY,EAAE,QAAQ,eAAe,GAAG,CAAC,GAAG,OAAO,mBAAmB,cAAc;AACtH,QAAM,WAAgB,YAAK,MAAM,QAAQ,QAAQ;AAEjD,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,qCAAqC,CAAC;AACjE,YAAQ,IAAI,UAAU,MAAM,SAAS,QAAQ,EAAE,CAAC;AAChD,YAAQ,IAAI,UAAU,MAAM,UAAU,IAAI,EAAE,CAAC;AAC7C,YAAQ,IAAI,UAAU,MAAM,aAAa,QAAQ,KAAK,EAAE,CAAC;AACzD,YAAQ,IAAI,UAAU,MAAM,YAAY,eAAe,MAAM,OAAO,EAAE,CAAC;AACvE,YAAQ,IAAI,UAAU,MAAM,UAAU,KAAK,EAAE,CAAC;AAC9C,YAAQ,IAAI,UAAU,MAAM,cAAc,cAAc,SAAS,EAAE,CAAC;AACpE,YAAQ,IAAI,UAAU,MAAM,aAAa,cAAc,QAAQ,EAAE,CAAC;AAClE,YAAQ,IAAI,UAAU,MAAM,aAAa,cAAc,QAAQ,EAAE,CAAC;AAClE,YAAQ,IAAI,UAAU,MAAM,kBAAkB,cAAc,aAAa,EAAE,CAAC;AAC5E,QAAI,cAAc,aAAa;AAC7B,cAAQ,IAAI,UAAU,MAAM,gBAAgB,cAAc,WAAW,EAAE,CAAC;AAAA,IAC1E;AACA,QAAI,KAAK,SAAS,GAAG;AACnB,cAAQ,IAAI,UAAU,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACzD;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,cAAQ,IAAI,UAAU,MAAM,cAAc,UAAU,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACnE;AACA,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ,IAAI,UAAU,MAAM,iBAAiB,aAAa,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACzE;AACA;AAAA,EACF;AAGA,MAAO,gBAAW,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,2BAA2B,QAAQ,EAAE;AAAA,EACvD;AAGA,SAAO,QAAQ,UAAU,eAAe,OAAO;AAG/C,QAAM,QAAQ,eAAe;AAC7B,QAAM,oBAAoB,CAAC,GAAI,MAAM,eAAe,CAAC,GAAI,IAAI;AAC7D,SAAO,WAAW,MAAM,WAAW,EAAE,aAAa,kBAAkB,CAAC;AAGrE,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,0BAA0B,CAAC;AACzD,UAAQ,IAAI,UAAU,KAAK,UAAU,IAAI,EAAE,CAAC;AAC5C,UAAQ,IAAI,UAAU,KAAK,aAAa,QAAQ,KAAK,EAAE,CAAC;AACxD,UAAQ,IAAI,UAAU,KAAK,YAAY,eAAe,MAAM,OAAO,EAAE,CAAC;AACtE,UAAQ,IAAI,UAAU,KAAK,SAAS,QAAQ,EAAE,CAAC;AAC/C,UAAQ,IAAI,UAAU,KAAK,UAAU,KAAK,EAAE,CAAC;AAC7C,UAAQ,IAAI,UAAU,KAAK,cAAc,cAAc,SAAS,EAAE,CAAC;AACnE,UAAQ,IAAI,UAAU,KAAK,aAAa,cAAc,QAAQ,EAAE,CAAC;AACjE,UAAQ,IAAI,UAAU,KAAK,aAAa,cAAc,QAAQ,EAAE,CAAC;AACjE,UAAQ,IAAI,UAAU,KAAK,kBAAkB,cAAc,aAAa,EAAE,CAAC;AAE3E,MAAI,cAAc,aAAa;AAC7B,YAAQ,IAAI,UAAU,KAAK,gBAAgB,cAAc,WAAW,EAAE,CAAC;AAAA,EACzE;AAEA,MAAI,KAAK,SAAS,GAAG;AACnB,YAAQ,IAAI,UAAU,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACxD;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,YAAQ,IAAI,UAAU,KAAK,cAAc,UAAU,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EAClE;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI,UAAU,KAAK,iBAAiB,aAAa,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACxE;AAEA,MAAI,QAAQ,eAAe;AACzB,YAAQ,IAAI,UAAU,KAAK,eAAe,QAAQ,aAAa,EAAE,CAAC;AAAA,EACpE;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,QAAQ,sBAAsB,MAAM,KAAK,GAAG,CAAC;AACrE;AA7OA,IAKAC,MACAC,QACAC;AAPA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAH,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AACA;AAqBgB;AAiDD;AAAA;AAAA;;;ACrCR,SAAS,8BAAuC;AACrD,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MAAI,YAAY,mDAAmD;AAGnE,MACG,QAAQ,KAAK,EACb,YAAY,2CAA2C,EACvD,SAAS,WAAW,+BAA+B,EACnD,SAAS,qBAAqB,+BAA+B,EAC7D;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,yBAAyB,2BAA2B,EAC3D,OAAO,OAAO,MAAc,eAAuB,YAAiB;AACnE,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AAEjE,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,SAAS;AAClB,gBAAQ;AAAA,UACN,OAAO,MAAM,4BAAuB,IAAI,IAAI,QAAQ,IAAI,IAAI,aAAa,EAAE;AAAA,QAC7E;AACA,YAAI,QAAQ,QAAQ;AAClB,kBAAQ,IAAI,qBAAc,QAAQ,MAAM,EAAE;AAAA,QAC5C;AACA,YAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,kBAAQ,IAAI,OAAO,OAAO,yBAAe,CAAC;AAC1C,iBAAO,SAAS,QAAQ,CAAC,YAAY,QAAQ,IAAI,OAAO,OAAO,OAAO,OAAO,EAAE,CAAC,CAAC;AAAA,QACnF;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,OAAO,IAAI,iCAA4B,CAAC;AACtD,eAAO,OAAO,QAAQ,CAAC,UAAU,QAAQ,MAAM,OAAO,IAAI,YAAO,KAAK,EAAE,CAAC,CAAC;AAC1E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,mCAA8B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACtF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,MACG,QAAQ,QAAQ,EAChB,YAAY,8CAA8C,EAC1D,SAAS,WAAW,OAAO,EAC3B,SAAS,qBAAqB,iBAAiB,EAC/C;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,MAAc,eAAuB,YAAiB;AACnE,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AAEjE,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,SAAS;AAClB,gBAAQ;AAAA,UACN,OAAO,MAAM,8BAAyB,IAAI,IAAI,QAAQ,QAAQ,KAAK,IAAI,aAAa,EAAE;AAAA,QACxF;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,OAAO,IAAI,oCAA+B,CAAC;AACzD,eAAO,OAAO,QAAQ,CAAC,UAAU,QAAQ,MAAM,OAAO,IAAI,YAAO,KAAK,EAAE,CAAC,CAAC;AAC1E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,qCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACxF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,MACG,QAAQ,MAAM,EACd,YAAY,sBAAsB,EAClC,SAAS,WAAW,gCAAgC,EACpD,OAAO,aAAa,wCAAwC,KAAK,EACjE,OAAO,yBAAyB,oCAAoC,OAAO,EAC3E,OAAO,OAAO,MAAc,YAAiB;AAC5C,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AACjE,UAAM,YAAY,IAAI,UAAU;AAEhC,QAAI;AACF,UAAI,QAAQ,KAAK;AACf,cAAM,kBAAkB,MAAM;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,4BAAoB,iBAAiB,QAAQ,QAAQ,SAAS;AAAA,MAChE,OAAO;AACL,cAAM,eAAe,MAAM;AAAA,UACzB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,8BAAsB,cAAc,QAAQ,QAAQ,SAAS;AAAA,MAC/D;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,sCAAiC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACzF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,MACG,QAAQ,UAAU,EAClB,YAAY,gEAAgE,EAC5E,OAAO,aAAa,oCAAoC,KAAK,EAC7D,OAAO,OAAO,YAAiB;AAC9B,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AAEjE,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,OAAO;AAChB,gBAAQ,IAAI,OAAO,MAAM,sCAAiC,CAAC;AAAA,MAC7D,OAAO;AACL,gBAAQ,IAAI,OAAO,IAAI,wCAAmC,CAAC;AAE3D,YAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,kBAAQ,IAAI,OAAO,IAAI,WAAW,CAAC;AACnC,iBAAO,OAAO,QAAQ,CAAC,UAAU,QAAQ,IAAI,OAAO,IAAI,YAAO,KAAK,EAAE,CAAC,CAAC;AAAA,QAC1E;AAEA,YAAI,OAAO,qBAAqB,SAAS,GAAG;AAC1C,kBAAQ,IAAI,OAAO,IAAI,0BAA0B,CAAC;AAClD,iBAAO,qBAAqB,QAAQ,CAAC,UAAU;AAC7C,oBAAQ,IAAI,OAAO,IAAI,YAAO,MAAM,KAAK,UAAK,CAAC,EAAE,CAAC;AAAA,UACpD,CAAC;AAAA,QACH;AAEA,YAAI,OAAO,uBAAuB,SAAS,GAAG;AAC5C,kBAAQ,IAAI,OAAO,OAAO,4BAA4B,CAAC;AACvD,iBAAO,uBAAuB,QAAQ,CAAC,QAAQ;AAC7C,oBAAQ,IAAI,OAAO,OAAO,YAAO,GAAG,EAAE,CAAC;AAAA,UACzC,CAAC;AAAA,QACH;AAEA,YAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,kBAAQ,IAAI,OAAO,OAAO,aAAa,CAAC;AACxC,iBAAO,SAAS,QAAQ,CAAC,YAAY,QAAQ,IAAI,OAAO,OAAO,YAAO,OAAO,EAAE,CAAC,CAAC;AAAA,QACnF;AAEA,YAAI,QAAQ,KAAK;AACf,kBAAQ,IAAI,OAAO,KAAK,yCAAkC,CAAC;AAC3D,gBAAM,YAAY,MAAM;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,UAAU,SAAS;AACrB,oBAAQ,IAAI,OAAO,MAAM,kCAA6B,CAAC;AAAA,UACzD,OAAO;AACL,oBAAQ,IAAI,OAAO,IAAI,kCAA6B,CAAC;AACrD,sBAAU,OAAO,QAAQ,CAAC,UAAU,QAAQ,IAAI,OAAO,IAAI,YAAO,KAAK,EAAE,CAAC,CAAC;AAAA,UAC7E;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,yCAAoC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC5F;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,MACG,QAAQ,aAAa,EACrB,YAAY,mDAAmD,EAC/D,SAAS,WAAW,gBAAgB,EACpC,OAAO,OAAO,SAAiB;AAC9B,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AAEjE,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,UAAU;AACnB,gBAAQ,IAAI,OAAO,MAAM,aAAQ,IAAI,gBAAgB,CAAC;AAAA,MACxD,OAAO;AACL,gBAAQ,IAAI,OAAO,IAAI,aAAQ,IAAI,mBAAmB,CAAC;AACvD,gBAAQ,IAAI,OAAO,IAAI,mBAAmB,CAAC;AAC3C,eAAO,gBAAgB,QAAQ,CAAC,WAAW;AACzC,kBAAQ,IAAI,OAAO,IAAI,YAAO,MAAM,EAAE,CAAC;AAAA,QACzC,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAQ,IAAI,OAAO,KAAK;AAAA,4BAAwB,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,MAC7E;AAEA,UAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,gBAAQ,IAAI,OAAO,OAAO;AAAA,gCAA8B,OAAO,UAAU,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,MACxF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,uCAAkC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC1F;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,cACb,MACA,eACA,MACA,QACA,eACA,qBACA,eACqE;AACrE,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,EACb;AAEA,MAAI;AAEF,UAAM,MAAM,MAAM,cAAc,WAAW,IAAI;AAC/C,UAAM,MAAM,MAAM,cAAc,WAAW,aAAa;AAExD,QAAI,CAAC,KAAK;AACR,aAAO,OAAO,KAAK,MAAM,IAAI,YAAY;AACzC,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,KAAK;AACR,aAAO,OAAO,KAAK,MAAM,aAAa,YAAY;AAClD,aAAO;AAAA,IACT;AAGA,UAAM,oBAAoB,MAAM;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,mBAAmB;AACrB,aAAO,OAAO,KAAK,2DAA2D;AAC9E,aAAO;AAAA,IACT;AAGA,UAAM,aAAiC;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAChC,WAAW;AAAA;AAAA,IACb;AAEA,UAAM,eAAe,YAAY,aAAa;AAG9C,UAAM,uBAAuB,KAAK,YAAY,YAAY,aAAa;AACvE,UAAM,uBAAuB,KAAK,YAAY,YAAY,aAAa;AAEvE,WAAO,UAAU;AAGjB,QAAI,IAAI,cAAc,YAAY,IAAI,cAAc,UAAU;AAC5D,aAAO,SAAS,KAAK,sEAAsE;AAAA,IAC7F;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO;AAAA,MACZ,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACrF;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iBACb,MACA,eACA,MACA,gBACA,sBACA,eACiD;AACjD,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI;AACF,UAAM,eAAe,MAAM,iBAAiB,aAAa;AACzD,UAAM,WAAW,aAAa;AAAA,MAC5B,CAAC,QACC,IAAI,SAAS,QAAQ,IAAI,kBAAkB,kBAAkB,CAAC,QAAQ,IAAI,SAAS;AAAA,IACvF;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,OAAO,KAAK,8BAA8B;AACjD,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,aAAa,OAAO,CAAC,QAAQ,CAAC,SAAS,SAAS,GAAG,CAAC;AACtE,UAAM,iBAAiB,WAAW,aAAa;AAE/C,WAAO,UAAU;AACjB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO;AAAA,MACZ,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACxF;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBACb,MACA,gBACA,sBACA,eAC0B;AAC1B,QAAM,eAAe,MAAM,iBAAiB,aAAa;AAEzD,QAAM,QAAyB;AAAA,IAC7B;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,WAAW,CAAC;AAAA,IACZ,WAAW,CAAC;AAAA,IACZ,YAAY,CAAC;AAAA,IACb,UAAU;AAAA,IACV,iBAAiB,CAAC;AAAA,EACpB;AAEA,eAAa,QAAQ,CAAC,QAAQ;AAC5B,QAAI,IAAI,SAAS,MAAM;AACrB,cAAQ,IAAI,MAAM;AAAA,QAChB,KAAK;AACH,gBAAM,OAAO,KAAK,IAAI,aAAa;AACnC;AAAA,QACF,KAAK;AACH,gBAAM,UAAU,KAAK,IAAI,aAAa;AACtC;AAAA,QACF,KAAK;AACH,gBAAM,WAAW,KAAK,IAAI,aAAa;AACvC;AAAA,MACJ;AAAA,IACF;AAEA,QAAI,IAAI,kBAAkB,MAAM;AAC9B,cAAQ,IAAI,MAAM;AAAA,QAChB,KAAK;AACH,gBAAM,UAAU,KAAK,IAAI,IAAI;AAC7B;AAAA,QACF,KAAK;AACH,gBAAM,UAAU,KAAK,IAAI,IAAI;AAC7B;AAAA,QACF,KAAK;AACH,gBAAM,OAAO,KAAK,IAAI,IAAI;AAC1B;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AAGD,MAAI,MAAM,UAAU,SAAS,GAAG;AAC9B,UAAM,WAAW;AACjB,UAAM,gBAAgB,KAAK,mBAAmB,MAAM,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,EAC5E;AAEA,SAAO;AACT;AAEA,eAAe,mBACb,gBACA,sBACA,eAC+B;AAC/B,SAAO,MAAM,iBAAiB,aAAa;AAC7C;AAEA,eAAe,qBACb,eACA,sBACA,eACqC;AACrC,QAAM,SAAqC;AAAA,IACzC,OAAO;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,sBAAsB,CAAC;AAAA,IACvB,wBAAwB,CAAC;AAAA,EAC3B;AAEA,MAAI;AACF,UAAM,eAAe,MAAM,iBAAiB,aAAa;AAGzD,UAAM,SAAS,yBAAyB,YAAY;AACpD,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO,QAAQ;AACf,aAAO,uBAAuB;AAC9B,aAAO,OAAO,KAAK,SAAS,OAAO,MAAM,wBAAwB;AAAA,IACnE;AAGA,UAAM,SAAS,MAAM,cAAc,QAAQ;AAC3C,UAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AAElD,iBAAa,QAAQ,CAAC,QAAQ;AAC5B,UAAI,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG;AACxB,eAAO,uBAAuB,KAAK,GAAG,IAAI,IAAI,6BAA6B;AAAA,MAC7E;AACA,UAAI,CAAC,MAAM,IAAI,IAAI,aAAa,GAAG;AACjC,eAAO,uBAAuB,KAAK,GAAG,IAAI,aAAa,6BAA6B;AAAA,MACtF;AAAA,IACF,CAAC;AAED,QAAI,OAAO,uBAAuB,SAAS,GAAG;AAC5C,aAAO,QAAQ;AACf,aAAO,OAAO,KAAK,SAAS,OAAO,uBAAuB,MAAM,0BAA0B;AAAA,IAC5F;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,QAAQ;AACf,WAAO,OAAO;AAAA,MACZ,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC9E;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBACb,MACA,eACA,qBACA,eAC0B;AAC1B,SAAO,MAAM,kBAAkB,MAAM,eAAe,qBAAqB,aAAa;AACxF;AAEA,eAAe,8BACb,MACA,eACA,MACA,gBACA,sBACA,eACkB;AAClB,QAAM,eAAe,MAAM,iBAAiB,aAAa;AAGzD,QAAM,cAAkC;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,IAChC,WAAW;AAAA,EACb;AAEA,QAAM,UAAU,CAAC,GAAG,cAAc,WAAW;AAC7C,QAAM,SAAS,yBAAyB,OAAO;AAE/C,SAAO,OAAO,SAAS;AACzB;AAEA,SAAS,yBAAyB,cAAgD;AAChF,QAAM,QAAQ,oBAAI,IAAyB;AAG3C,eAAa,QAAQ,CAAC,QAAQ;AAnkBhC;AAokBI,QAAI,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG;AACxB,YAAM,IAAI,IAAI,MAAM,oBAAI,IAAI,CAAC;AAAA,IAC/B;AACA,gBAAM,IAAI,IAAI,IAAI,MAAlB,mBAAqB,IAAI,IAAI;AAAA,EAC/B,CAAC;AAED,QAAM,SAAqB,CAAC;AAC5B,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,iBAAiB,oBAAI,IAAY;AAEvC,WAAS,IAAI,MAAcE,QAAsB;AAC/C,QAAI,eAAe,IAAI,IAAI,GAAG;AAE5B,YAAM,aAAaA,OAAK,QAAQ,IAAI;AACpC,UAAI,eAAe,IAAI;AACrB,eAAO,KAAK,CAAC,GAAGA,OAAK,MAAM,UAAU,GAAG,IAAI,CAAC;AAAA,MAC/C;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,IAAI,IAAI,GAAG;AACrB;AAAA,IACF;AAEA,YAAQ,IAAI,IAAI;AAChB,mBAAe,IAAI,IAAI;AACvB,IAAAA,OAAK,KAAK,IAAI;AAEd,UAAM,YAAY,MAAM,IAAI,IAAI;AAChC,QAAI,WAAW;AACb,iBAAW,YAAY,WAAW;AAChC,YAAI,UAAUA,MAAI;AAAA,MACpB;AAAA,IACF;AAEA,IAAAA,OAAK,IAAI;AACT,mBAAe,OAAO,IAAI;AAAA,EAC5B;AA3BS;AA6BT,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,QAAI,CAAC,QAAQ,IAAI,IAAI,GAAG;AACtB,UAAI,MAAM,CAAC,CAAC;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,iBAAiB,eAA6D;AAC3F,QAAM,WAAgB,YAAK,cAAc,gBAAgB,GAAG,mBAAmB;AAE/E,MAAI,CAAI,gBAAW,QAAQ,GAAG;AAC5B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAa,kBAAa,UAAU,MAAM;AAChD,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,eAAe,iBACb,cACA,eACe;AACf,QAAM,WAAgB,YAAK,cAAc,gBAAgB,GAAG,mBAAmB;AAC/E,EAAG,mBAAc,UAAU,KAAK,UAAU,cAAc,MAAM,CAAC,GAAG,MAAM;AAC1E;AAEA,eAAe,eACb,YACA,eACe;AACf,QAAM,eAAe,MAAM,iBAAiB,aAAa;AACzD,eAAa,KAAK,UAAU;AAC5B,QAAM,iBAAiB,cAAc,aAAa;AACpD;AAEA,eAAe,uBACb,IACA,YACA,WACA,gBACe;AACf,MAAI;AACF,UAAM,YAAe,kBAAa,GAAG,WAAW,MAAM;AAGtD,UAAM,iBACJ,cAAc,aACV,GAAG,WAAW,IAAI,IAAI,WAAW,aAAa,KAC9C,GAAG,WAAW,IAAI,IAAI,WAAW,IAAI;AAE3C,UAAM,iBAAiB,UAAU;AAAA,MAC/B;AAAA,MACA,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,IAC3C;AAGA,UAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA,IAA4B,cAAc,GAAG,WAAW,SAAS,KAAK,WAAW,MAAM,MAAM,EAAE;AAAA;AACzH,UAAM,eAAe,iBAAiB;AAEtC,IAAG,mBAAc,GAAG,WAAW,cAAc,MAAM;AAAA,EACrD,SAAS,OAAO;AACd,YAAQ,MAAM,uBAAuB,GAAG,KAAK,0BAA0B,KAAK,EAAE;AAAA,EAChF;AACF;AAEA,eAAe,oBACb,kBACA,eACA,sBACA,eACiD;AACjD,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI;AACF,UAAM,eAAe,MAAM,iBAAiB,aAAa;AACzD,QAAI,oBAAoB,CAAC,GAAG,YAAY;AAGxC,QAAI,iBAAiB,uBAAuB,SAAS,GAAG;AACtD,YAAM,SAAS,MAAM,cAAc,QAAQ;AAC3C,YAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AAElD,0BAAoB,kBAAkB;AAAA,QACpC,CAAC,QAAQ,MAAM,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,aAAa;AAAA,MAC7D;AAAA,IACF;AAGA,QAAI,iBAAiB,qBAAqB,SAAS,GAAG;AAEpD,iBAAW,SAAS,iBAAiB,sBAAsB;AAEzD,YAAI,MAAM,SAAS,GAAG;AACpB,gBAAM,SAAS,MAAM,MAAM,SAAS,CAAC;AACrC,gBAAM,UAAU,MAAM,CAAC;AAEvB,8BAAoB,kBAAkB;AAAA,YACpC,CAAC,QAAQ,EAAE,IAAI,SAAS,UAAU,IAAI,kBAAkB;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,mBAAmB,aAAa;AACvD,WAAO,UAAU;AAEjB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO;AAAA,MACZ,oCAAoC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC5F;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBACP,cACA,QACA,YACM;AACN,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AAAA,EACnD,WAAW,WAAW,SAAS;AAC7B,YAAQ;AAAA,MACN,aAAa,IAAI,CAAC,SAAS;AAAA,QACzB,SAAS,IAAI;AAAA,QACb,gBAAgB,IAAI;AAAA,QACpB,MAAM,IAAI;AAAA,QACV,QAAQ,IAAI,UAAU;AAAA,QACtB,SAAS,IAAI,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,MACnC,EAAE;AAAA,IACJ;AAAA,EACF,OAAO;AAEL,YAAQ,IAAI,OAAO,KAAK,sBAAsB,CAAC;AAC/C,iBAAa,QAAQ,CAAC,QAAQ;AAC5B,cAAQ,IAAI,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,OAAO,IAAI,aAAa,EAAE;AAAA,IACjE,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sBACP,cACA,QACA,YACM;AACN,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AAAA,EACnD,OAAO;AACL,YAAQ,IAAI,OAAO,KAAK,uBAAuB,aAAa,IAAI,GAAG,CAAC;AAEpE,QAAI,aAAa,OAAO,SAAS,GAAG;AAClC,cAAQ,IAAI,OAAO,IAAI,qBAAc,aAAa,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACxE;AAEA,QAAI,aAAa,UAAU,SAAS,GAAG;AACrC,cAAQ,IAAI,OAAO,OAAO,sBAAiB,aAAa,UAAU,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACjF;AAEA,QAAI,aAAa,UAAU,SAAS,GAAG;AACrC,cAAQ,IAAI,OAAO,KAAK,yBAAkB,aAAa,UAAU,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IAChF;AAEA,QAAI,aAAa,WAAW,SAAS,GAAG;AACtC,cAAQ,IAAI,OAAO,MAAM,0BAAmB,aAAa,WAAW,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACnF;AAEA,UAAM,gBAAgB,aAAa,WAAW,OAAO,QAAQ,OAAO;AACpE,UAAM,eAAe,aAAa,WAAW,WAAM;AACnD,YAAQ,IAAI,cAAc,GAAG,YAAY,eAAe,aAAa,QAAQ,EAAE,CAAC;AAEhF,QAAI,aAAa,gBAAgB,SAAS,GAAG;AAC3C,cAAQ,IAAI,OAAO,IAAI,mBAAmB,CAAC;AAC3C,mBAAa,gBAAgB,QAAQ,CAAC,WAAW;AAC/C,gBAAQ,IAAI,OAAO,IAAI,YAAO,MAAM,EAAE,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAlyBA,IAKAC,MACAD,QACAE;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAD,OAAoB;AACpB,IAAAD,SAAsB;AACtB,IAAAE,qBAAwB;AAExB;AACA;AACA;AACA;AACA;AAiCgB;AAuQD;AA6EA;AAsCA;AAyDA;AAQA;AAoDA;AASA;AAyBN;AAqDM;AAWA;AAQA;AASA;AA8BA;AAqDN;AA0BA;AAAA;AAAA;;;AChuBF,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,iCAAiC,EAC7C,OAAO,yBAAyB,4DAA4D,EAC5F;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,0BAA0B,+CAA+C,EAChF,OAAO,6BAA6B,oBAAoB,EACxD,OAAO,0BAA0B,oBAAoB,EACrD,OAAO,wBAAwB,mBAAmB,EAClD,OAAO,qBAAqB,kCAAkC,EAC9D,OAAO,6BAA6B,oBAAoB,EACxD,OAAO,uBAAuB,uBAAuB,EACrD,OAAO,sBAAsB,0BAA0B,EACvD,OAAO,wBAAwB,uCAAuC,EACtE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,wBAAwB,yBAAyB,MAAM,EAC9D,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,qBAAqB,kCAAkC,OAAO,EACrE,OAAO,OAAO,YAAyB;AACtC,QAAI;AACF,YAAM,QAAQ,OAAO;AAAA,IACvB,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACjF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,QAAQ,SAAqC;AAC1D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AAGxD,QAAM,SAAS,oBAAoB,UAAU;AAE7C,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,IAAI,UAAU,KAAK,eAAe,CAAC;AAC3C;AAAA,EACF;AAGA,MAAI,cAAc;AAElB,MAAI,QAAQ,QAAQ;AAClB,kBAAc,YAAY,OAAO,CAAC,OAAO,GAAG,WAAW,QAAQ,MAAM;AAAA,EACvE;AAEA,MAAI,QAAQ,UAAU;AACpB,kBAAc,YAAY,OAAO,CAAC,OAAO,GAAG,cAAc,QAAQ,QAAQ;AAAA,EAC5E;AAEA,MAAI,QAAQ,UAAU;AACpB,kBAAc,YAAY,OAAO,CAAC,OAAO,GAAG,aAAa,QAAQ,QAAQ;AAAA,EAC3E;AAEA,MAAI,QAAQ,UAAU;AACpB,kBAAc,YAAY,OAAO,CAAC,OAAO,GAAG,aAAa,QAAQ,QAAQ;AAAA,EAC3E;AAEA,MAAI,QAAQ,OAAO;AACjB,kBAAc,YAAY,OAAO,CAAC,OAAO,GAAG,aAAa,QAAQ,KAAK;AAAA,EACxE;AAEA,MAAI,QAAQ,MAAM;AAChB,kBAAc,YAAY,OAAO,CAAC,OAAO,GAAG,YAAY,QAAQ,IAAI;AAAA,EACtE;AAEA,MAAI,QAAQ,MAAM;AAChB,UAAM,aAAa,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAClE,kBAAc,YAAY,OAAO,CAAC,OAAI;AAxH1C;AAwH6C,sBAAG,SAAH,mBAAS,KAAK,CAAC,QAAQ,WAAW,SAAS,GAAG;AAAA,KAAE;AAAA,EAC3F;AAEA,MAAI,QAAQ,UAAU;AACpB,kBAAc,YAAY,OAAO,CAAC,OAAI;AA5H1C;AA4H6C,sBAAG,cAAH,mBAAc,SAAS,QAAQ;AAAA,KAAS;AAAA,EACnF;AAEA,MAAI,QAAQ,QAAQ;AAClB,kBAAc,YAAY;AAAA,MACxB,CAAC,OAAI;AAjIX;AAkIQ,yBAAG,gBAAH,mBAAgB,SAAS,QAAQ,cACjC,QAAG,kBAAH,mBAAkB,SAAS,QAAQ,cACnC,QAAG,kBAAH,mBAAkB,SAAS,QAAQ;AAAA;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,QAAQ,YAAY;AACtB,kBAAc,YAAY,OAAO,CAAC,OAAI;AAzI1C;AAyI6C,sBAAG,mBAAH,mBAAmB,SAAS,QAAQ;AAAA,KAAW;AAAA,EAC1F;AAGA,QAAM,YAAY,QAAQ,UAAU;AACpC,QAAM,YAAY,QAAQ,aAAa;AAEvC,cAAY,KAAK,CAAC,GAAG,MAAM;AACzB,QAAI;AACJ,QAAI;AAEJ,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,iBAAS,IAAI,KAAK,EAAE,YAAY;AAChC,iBAAS,IAAI,KAAK,EAAE,YAAY;AAChC;AAAA,MACF,KAAK;AACH,iBAAS,IAAI,KAAK,EAAE,YAAY;AAChC,iBAAS,IAAI,KAAK,EAAE,YAAY;AAChC;AAAA,MACF,KAAK,YAAY;AACf,cAAM,gBAAgB,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAChE,iBAAS,cAAc,EAAE,QAAoB;AAC7C,iBAAS,cAAc,EAAE,QAAoB;AAC7C;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,cAAc,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,EAAE;AACtF,iBAAS,YAAY,EAAE,SAAqB;AAC5C,iBAAS,YAAY,EAAE,SAAqB;AAC5C;AAAA,MACF;AAAA,MACA,KAAK;AACH,iBAAS,EAAE,MAAM,YAAY;AAC7B,iBAAS,EAAE,MAAM,YAAY;AAC7B;AAAA,MACF;AACE,iBAAS,EAAE;AACX,iBAAS,EAAE;AAAA,IACf;AAEA,QAAI,SAAS,OAAQ,QAAO,cAAc,QAAQ,KAAK;AACvD,QAAI,SAAS,OAAQ,QAAO,cAAc,QAAQ,IAAI;AACtD,WAAO;AAAA,EACT,CAAC;AAGD,QAAM,QAAQ,SAAS,QAAQ,SAAS,MAAM,EAAE;AAChD,QAAM,aAAa,YAAY,MAAM,GAAG,KAAK;AAG7C,MAAI,QAAQ,WAAW,QAAQ;AAC7B,YAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC/C;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,OAAO;AAC5B,YAAQ;AAAA,MACN;AAAA,IACF;AACA,eAAW,QAAQ,CAAC,OAAO;AACzB,cAAQ;AAAA,QACN;AAAA,UACE,GAAG;AAAA,UACH,IAAI,GAAG,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,UAChC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG,eAAe;AAAA,UAClB,GAAG,iBAAiB;AAAA,UACpB,GAAG;AAAA,UACH,GAAG;AAAA,QACL,EAAE,KAAK,GAAG;AAAA,MACZ;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAGA,UAAQ;AAAA,IACN,UAAU;AAAA,MACR;AAAA,iBAAa,WAAW,MAAM,GAAG,YAAY,SAAS,QAAQ,OAAO,YAAY,MAAM,KAAK,EAAE;AAAA,IAChG;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,YAAQ,IAAI,UAAU,KAAK,qCAAqC,CAAC;AACjE;AAAA,EACF;AAEA,aAAW,QAAQ,CAAC,OAAO;AACzB,UAAM,cAAc,iBAAiB,GAAG,SAAS;AACjD,UAAM,gBAAgBC,kBAAiB,GAAG,QAAQ;AAElD,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,GAAG,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE;AAC5D,YAAQ;AAAA,MACN,aAAa,YAAY,GAAG,SAAS,CAAC,gBAAgB,cAAc,GAAG,QAAQ,CAAC,gBAAgB,GAAG,QAAQ;AAAA,IAC7G;AACA,YAAQ,IAAI,YAAY,GAAG,QAAQ,YAAY,GAAG,OAAO,EAAE;AAE3D,QAAI,GAAG,aAAa;AAClB,cAAQ,IAAI,aAAa,GAAG,WAAW,WAAM,GAAG,iBAAiB,MAAM,EAAE;AAAA,IAC3E;AAEA,QAAI,GAAG,aAAa,GAAG,UAAU,SAAS,GAAG;AAC3C,cAAQ,IAAI,gBAAgB,GAAG,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,IACvD;AAEA,QAAI,GAAG,QAAQ,GAAG,KAAK,SAAS,GAAG;AACjC,cAAQ,IAAI,WAAW,GAAG,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7C;AAEA,QAAI,QAAQ,aAAa;AACvB,cAAQ,IAAI,kBAAkB,GAAG,eAAe,gBAAgB,EAAE;AAClE,cAAQ;AAAA,QACN,cAAcC,YAAW,GAAG,YAAY,CAAC,eAAeA,YAAW,GAAG,YAAY,CAAC;AAAA,MACrF;AACA,cAAQ,IAAI,WAAW,GAAG,SAAS,EAAE;AAErC,UAAI,GAAG,gBAAgB;AACrB,gBAAQ,IAAI,iBAAiB,GAAG,cAAc,EAAE;AAAA,MAClD;AAEA,UAAI,GAAG,WAAW;AAChB,gBAAQ,IAAI,iBAAiB,GAAG,SAAS,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,EACF,CAAC;AAGD,UAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,UAAU,CAAC,EAAE;AAC7C,UAAQ,IAAI,gBAAgB,OAAO,MAAM,EAAE;AAC3C,UAAQ,IAAI,eAAe,YAAY,MAAM,EAAE;AAC/C,UAAQ,IAAI,gBAAgB,WAAW,MAAM,EAAE;AAG/C,QAAM,kBAA0C,CAAC;AACjD,cAAY,QAAQ,CAAC,OAAO;AAC1B,oBAAgB,GAAG,SAAS,KAAK,gBAAgB,GAAG,SAAS,KAAK,KAAK;AAAA,EACzE,CAAC;AAED,UAAQ;AAAA,IACN,uBAAuB,OAAO,QAAQ,eAAe,EAClD,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,GAAG,MAAM,KAAK,KAAK,EAAE,EAC9C,KAAK,IAAI,CAAC;AAAA,EACf;AACF;AAEA,SAAS,iBAAiB,QAA4C;AACpE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,UAAU;AAAA,EACrB;AACF;AAEA,SAASD,kBAAiB,UAA8C;AACtE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,UAAU;AAAA,EACrB;AACF;AAEA,SAASC,YAAW,YAA4B;AAC9C,QAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAO,GAAG,KAAK,mBAAmB,CAAC,IAAI,KAAK,mBAAmB,CAAC;AAClE;AApUA,IAKAC;AALA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AAExB;AACA;AACA;AAoBgB;AA2CD;AAuNN;AAmBA,WAAAF,mBAAA;AAeA,WAAAC,aAAA;AAAA;AAAA;;;AC5RF,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,8BAA8B,EAC1C,SAAS,WAAW,iBAAiB,EACrC,OAAO,yBAAyB,iBAAiB,EACjD,OAAO,iBAAiB,gBAAgB,EACxC,OAAO,yBAAyB,2BAA2B,EAC3D,OAAO,yBAAyB,6DAA6D,EAC7F,OAAO,yBAAyB,8CAA8C,EAC9E,OAAO,yBAAyB,wBAAwB,EACxD,OAAO,6BAA6B,0BAA0B,EAC9D,OAAO,gCAAgC,+BAA+B,EACtE,OAAO,aAAa,gDAAgD,EACpE,OAAO,OAAO,MAAc,YAA2B;AACtD,QAAI;AACF,YAAM,SAAS,MAAM,OAAO;AAAA,IAC9B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAClF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,SAAS,MAAc,SAAuC;AAC3E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,cAAc,oBAAoB,eAAe,IAAI;AAC3D,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,EACzC;AAEA,QAAM,KAAK,YAAY;AAGvB,MAAI,QAAQ,WAAW,QAAQ,gBAAgB;AAC7C,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAGA,MAAI,aAAwD;AAC5D,MAAI,QAAQ,SAAS;AACnB,iBAAa;AAAA,EACf,WAAW,QAAQ,gBAAgB;AACjC,iBAAa;AAAA,EACf;AAGA,QAAM,WAAW,QAAQ,YAAY,OAAO,oBAAoB;AAGhE,QAAM,WAAW,GAAG,IAAI,WAAW,KAAK,IAAI,CAAC;AAG7C,MAAI,iBAAiB;AACrB,MAAI,QAAQ,UAAU;AACpB,UAAM,WAAW,cAAc,wBAAwB,aAAa,QAAQ,QAAQ;AACpF,QAAI,UAAU;AACZ,uBAAiB,SAAS,oBAAoB;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,oBAAuC;AAAA,IAC3C,WAAW;AAAA,IACX,OAAO;AAAA,IACP;AAAA,IACA,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,UAAU,QAAQ;AAAA,EACpB;AAGA,QAAM,gBAAgB,gBAAgB,GAAG,KAAK;AAAA;AAAA,UAEtC,IAAI;AAAA,gBACE,QAAQ;AAAA,mBACL,WAAW,YAAY,CAAC;AAAA,YAC/B,GAAG;AAAA;AAAA;AAAA;AAAA,EAIb,QAAQ,YAAY,EAAE;AAAA;AAAA,EAEtB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBd,eAAe,YAAY,yCAAoC,EAAE;AAAA,EACjE,eAAe,oBAAoB,2DAAsD,EAAE;AAAA,EAC3F,eAAe,YAAY,wDAAiD,EAAE;AAAA;AAI9E,MAAI,mBAAmB,CAAC,GAAI,GAAG,aAAa,CAAC,CAAE;AAE/C,MAAI,QAAQ,aAAa;AACvB,QAAI,CAAC,iBAAiB,SAAS,QAAQ,WAAW,GAAG;AACnD,uBAAiB,KAAK,QAAQ,WAAW;AAAA,IAC3C;AAAA,EACF;AAEA,MAAI,QAAQ,gBAAgB;AAC1B,uBAAmB,iBAAiB,OAAO,CAAC,MAAM,MAAM,QAAQ,cAAc;AAAA,EAChF;AAGA,MAAI,CAAC,iBAAiB,SAAS,QAAQ,GAAG;AACxC,qBAAiB,KAAK,QAAQ;AAAA,EAChC;AAGA,MAAI,mBAAmB,CAAC,GAAI,GAAG,aAAa,CAAC,CAAE;AAC/C,MAAI,eAAe,aAAa,CAAC,iBAAiB,SAAS,QAAQ,GAAG;AACpE,qBAAiB,KAAK,QAAQ;AAAA,EAChC,WAAW,eAAe,mBAAmB;AAE3C,uBAAmB,iBAAiB,OAAO,CAAC,MAAM,MAAM,QAAQ;AAAA,EAClE;AAGA,MAAI,cAAc,GAAG;AACrB,MAAI,QAAQ,QAAQ;AAClB,kBAAc,QAAQ;AAAA,EACxB,WAAW,eAAe,WAAW;AAEnC,QAAI,iBAAiB,SAAS,KAAK,iBAAiB,UAAU,iBAAiB,QAAQ;AACrF,oBAAc;AAAA,IAChB,WAAW,GAAG,cAAc,WAAW,GAAG,cAAc,QAAQ;AAC9D,oBAAc;AAAA,IAChB;AAAA,EACF,WAAW,eAAe,mBAAmB;AAC3C,kBAAc;AAAA,EAChB;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,yCAAyC,CAAC;AACrE,YAAQ,IAAI,UAAU,MAAM,UAAU,IAAI,EAAE,CAAC;AAC7C,YAAQ,IAAI,UAAU,MAAM,cAAc,QAAQ,EAAE,CAAC;AACrD,YAAQ,IAAI,UAAU,MAAM,aAAa,QAAQ,EAAE,CAAC;AACpD,YAAQ,IAAI,UAAU,MAAM,gBAAgB,UAAU,EAAE,CAAC;AACzD,YAAQ,IAAI,UAAU,MAAM,sBAAsB,GAAG,SAAS,EAAE,CAAC;AACjE,YAAQ,IAAI,UAAU,MAAM,kBAAkB,WAAW,EAAE,CAAC;AAC5D,YAAQ,IAAI,UAAU,MAAM,cAAc,iBAAiB,KAAK,IAAI,CAAC,EAAE,CAAC;AACxE,YAAQ,IAAI,UAAU,MAAM,cAAc,iBAAiB,KAAK,IAAI,CAAC,EAAE,CAAC;AACxE,QAAI,QAAQ,UAAU;AACpB,cAAQ,IAAI,UAAU,MAAM,aAAa,QAAQ,QAAQ,EAAE,CAAC;AAAA,IAC9D;AACA;AAAA,EACF;AAGA,QAAM,aAAkB,YAAK,MAAM,QAAQ,SAAS;AACpD,MAAI,CAAI,gBAAW,UAAU,GAAG;AAC9B,IAAG,eAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AAGA,QAAM,iBAAiB,GAAG,QAAQ;AAClC,QAAM,iBAAsB,YAAK,YAAY,cAAc;AAC3D,SAAO,UAAU,gBAAgB,mBAAmB,aAAa;AAGjE,QAAM,YAA6B;AAAA,IACjC,WAAW,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,IAC5D,WAAW,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,IAC5D,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AAEA,SAAO,WAAW,GAAG,WAAW,SAAS;AAGzC,MAAI,gBAAgB,GAAG,WAAW;AAChC,UAAMG,wBAAuB,IAAI,aAAa,OAAO,aAAa;AAAA,EACpE;AAGA,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,iCAAiC,CAAC;AAChE,UAAQ,IAAI,UAAU,KAAK,cAAc,QAAQ,EAAE,CAAC;AACpD,UAAQ,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;AACvD,UAAQ,IAAI,UAAU,KAAK,aAAa,QAAQ,EAAE,CAAC;AACnD,UAAQ,IAAI,UAAU,KAAK,gBAAgB,WAAW,YAAY,CAAC,EAAE,CAAC;AACtE,UAAQ,IAAI,UAAU,KAAK,gBAAgB,cAAc,EAAE,CAAC;AAE5D,MAAI,gBAAgB,GAAG,WAAW;AAChC,YAAQ,IAAI,UAAU,KAAK,sBAAsB,GAAG,SAAS,WAAM,WAAW,EAAE,CAAC;AAAA,EACnF;AAEA,UAAQ,IAAI,UAAU,KAAK,cAAc,iBAAiB,KAAK,IAAI,CAAC,EAAE,CAAC;AACvE,UAAQ,IAAI,UAAU,KAAK,cAAc,iBAAiB,MAAM,IAAI,iBAAiB,MAAM,EAAE,CAAC;AAE9F,MAAI,QAAQ,UAAU;AACpB,YAAQ,IAAI,UAAU,KAAK,aAAa,QAAQ,QAAQ,EAAE,CAAC;AAAA,EAC7D;AAGA,MAAI,eAAe,aAAa,gBAAgB,YAAY;AAC1D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,+CAA0C,CAAC;AACzE,YAAQ,IAAI,UAAU,KAAK,4CAA4C,CAAC;AAAA,EAC1E,WAAW,eAAe,mBAAmB;AAC3C,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,8DAAoD,CAAC;AACnF,YAAQ,IAAI,UAAU,KAAK,kDAAkD,CAAC;AAAA,EAChF;AACF;AAEA,eAAeA,wBACb,IACA,WACA,OACA,gBACe;AACf,QAAM,UAAU,IAAI,kBAAkB;AAGtC,QAAM,aAAa;AAAA,IACjB,OAAY,YAAK,MAAM,QAAQ,OAAO;AAAA,IACtC,MAAW,YAAK,MAAM,QAAQ,QAAQ;AAAA,IACtC,QAAa,YAAK,MAAM,QAAQ,QAAQ;AAAA,IACxC,UAAe,YAAK,MAAM,QAAQ,QAAQ;AAAA,IAC1C,QAAa,YAAK,MAAM,QAAQ,QAAQ;AAAA,IACxC,QAAa,YAAK,MAAM,QAAQ,QAAQ;AAAA,EAC1C;AAGA,QAAM,aAAkB,eAAQ,GAAG,SAAS;AAC5C,QAAM,YAAY,WAAW,SAAS;AAGtC,MAAI,eAAe,WAAW;AAE5B,QAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,MAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC7C;AAGA,UAAM,WAAgB,gBAAS,GAAG,SAAS;AAC3C,UAAM,cAAmB,YAAK,WAAW,QAAQ;AAGjD,IAAG,gBAAW,GAAG,WAAW,WAAW;AAEvC,YAAQ,IAAI,UAAU,KAAK,kBAAkB,UAAU,WAAM,SAAS,EAAE,CAAC;AAAA,EAC3E;AACF;AA9TA,IAKAC,MACAC,QACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AAyBgB;AA+BD;AAoNA,WAAAH,yBAAA;AAAA;AAAA;;;ACtQR,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,+CAA+C,EAC3D,SAAS,WAAW,kBAAkB,EACtC,OAAO,yBAAyB,sCAAsC,UAAU,EAChF,OAAO,sBAAsB,gCAAgC,EAC7D,OAAO,4BAA4B,gDAAgD,EACnF,OAAO,sBAAsB,oCAAoC,EACjE,OAAO,OAAO,MAAc,YAAyB;AACpD,QAAI;AACF,YAAM,OAAO,MAAM,OAAO;AAAA,IAC5B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAChF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,OAAO,MAAc,SAAqC;AA5CzE;AA6CE,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AAGxD,QAAM,cAAc,oBAAoB,eAAe,IAAI;AAC3D,MAAI,CAAC,aAAa;AAChB,YAAQ,MAAM,UAAU,MAAM,iBAAiB,IAAI,EAAE,CAAC;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,KAAK,YAAY;AAGvB,MAAI,QAAQ,WAAW,QAAQ;AAC7B,UAAM,SAAS;AAAA,MACb;AAAA,MACA,GAAI,QAAQ,qBAAqB;AAAA,QAC/B,eAAe;AAAA,UACb,OAAO,YAAY;AAAA,UACnB,MAAM,YAAY;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,QAAQ;AAE7B,UAAM,aAAa;AAAA,MACjB,OAAO,GAAG;AAAA,MACV,OAAO,GAAG;AAAA,MACV,aAAa,GAAG;AAAA,MAChB,QAAQ,GAAG;AAAA,MACX,WAAW,GAAG;AAAA,MACd,UAAU,GAAG;AAAA,MACb,UAAU,GAAG;AAAA,MACb,UAAU,GAAG;AAAA,MACb,SAAS,GAAG;AAAA,MACZ,cAAc,GAAG;AAAA,MACjB,cAAc,GAAG;AAAA,MACjB,kBAAkB,GAAG;AAAA,MACrB,eAAe,GAAG;AAAA,MAClB,aAAa,GAAG;AAAA,MAChB,eAAe,GAAG;AAAA,MAClB,eAAe,GAAG;AAAA,MAClB,gBAAgB,GAAG;AAAA,MACnB,WAAW,GAAG;AAAA,MACd,WAAW,GAAG;AAAA,MACd,WAAW,GAAG;AAAA,MACd,cAAc,GAAG;AAAA,MACjB,MAAM,GAAG;AAAA,MACT,cAAc,GAAG;AAAA,MACjB,YAAY,GAAG;AAAA,MACf,QAAQ,GAAG;AAAA,MACX,aAAa,GAAG;AAAA,MAChB,eAAe,GAAG;AAAA,MAClB,YAAY,GAAG;AAAA,MACf,aAAa,GAAG;AAAA,IAClB;AAEA,YAAQ,IAAI,KAAK;AACjB,WAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACnD,UAAI,UAAU,UAAa,UAAU,MAAM;AACzC,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAI,MAAM,SAAS,GAAG;AACpB,oBAAQ,IAAI,GAAG,GAAG,GAAG;AACrB,kBAAM,QAAQ,CAAC,SAAS,QAAQ,IAAI,OAAO,IAAI,EAAE,CAAC;AAAA,UACpD;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,QAChC;AAAA,MACF;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,KAAK;AACjB;AAAA,EACF;AAGA,QAAM,cAAcI,kBAAiB,GAAG,SAAS;AACjD,QAAM,gBAAgBC,kBAAiB,GAAG,QAAQ;AAElD,UAAQ,IAAI,UAAU,OAAO;AAAA,wBAAoB,GAAG,KAAK,EAAE,CAAC;AAC5D,UAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,QAAQ,CAAC,IAAI,GAAG,KAAK,EAAE;AACvD,UAAQ;AAAA,IACN,GAAG,UAAU,KAAK,SAAS,CAAC,IAAI,YAAY,GAAG,SAAS,CAAC,MAAM,UAAU,KAAK,WAAW,CAAC,IAAI,cAAc,GAAG,QAAQ,CAAC;AAAA,EAC1H;AACA,UAAQ,IAAI,GAAG,UAAU,KAAK,WAAW,CAAC,IAAI,GAAG,QAAQ,EAAE;AAE3D,UAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,YAAY,CAAC,EAAE;AAC/C,UAAQ,IAAI,WAAW,GAAG,OAAO,OAAK,iBAAY,SAAZ,mBAAkB,UAAS,SAAS,GAAG;AAC7E,UAAQ,IAAI,YAAY,GAAG,QAAQ,KAAK,YAAY,MAAM,KAAK,GAAG;AAClE,UAAQ,IAAI,SAAS,GAAG,KAAK,EAAE;AAE/B,UAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,qBAAqB,CAAC,EAAE;AACxD,MAAI,GAAG,aAAa;AAClB,YAAQ,IAAI,aAAa,GAAG,WAAW,EAAE;AAAA,EAC3C;AACA,MAAI,GAAG,eAAe;AACpB,YAAQ,IAAI,aAAa,GAAG,aAAa,EAAE;AAAA,EAC7C;AACA,UAAQ,IAAI,aAAa,GAAG,iBAAiB,MAAM,EAAE;AAErD,MAAI,GAAG,gBAAgB;AACrB,YAAQ,IAAI,iBAAiB,GAAG,cAAc,EAAE;AAAA,EAClD;AAEA,MAAI,GAAG,WAAW;AAChB,YAAQ,IAAI,iBAAiB,GAAG,SAAS,EAAE;AAAA,EAC7C;AAEA,UAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,QAAQ,CAAC,EAAE;AAC3C,UAAQ,IAAI,cAAcC,YAAW,GAAG,YAAY,CAAC,EAAE;AACvD,UAAQ,IAAI,cAAcA,YAAW,GAAG,YAAY,CAAC,EAAE;AAEvD,MAAI,GAAG,aAAa,GAAG,UAAU,SAAS,GAAG;AAC3C,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,YAAY,CAAC,EAAE;AAC/C,OAAG,UAAU,QAAQ,CAAC,aAAa;AAzKvC,UAAAC;AA0KM,YAAM,cAAaA,MAAA,GAAG,cAAH,gBAAAA,IAAc,SAAS;AAC1C,cAAQ,IAAI,KAAK,QAAQ,IAAI,aAAa,WAAM,QAAG,EAAE;AAAA,IACvD,CAAC;AAAA,EACH;AAEA,MAAI,GAAG,aAAa,GAAG,UAAU,SAAS,GAAG;AAC3C,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,YAAY,CAAC,EAAE;AAC/C,OAAG,UAAU,QAAQ,CAAC,aAAa;AACjC,cAAQ,IAAI,YAAO,QAAQ,EAAE;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,MAAI,GAAG,cAAc;AACnB,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,eAAe,CAAC,IAAI,GAAG,YAAY,EAAE;AAAA,EACvE;AAEA,MAAI,GAAG,QAAQ,GAAG,KAAK,SAAS,GAAG;AACjC,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,OAAO,CAAC,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,EAClE;AAEA,MAAI,GAAG,mBAAmB,KAAK,GAAG,gBAAgB,GAAG;AACnD,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,cAAc,CAAC,EAAE;AACjD,YAAQ,IAAI,gBAAgB,GAAG,gBAAgB,EAAE;AACjD,YAAQ,IAAI,aAAa,GAAG,aAAa,EAAE;AAC3C,QAAI,GAAG,mBAAmB,GAAG;AAC3B,YAAM,cAAe,GAAG,gBAAgB,GAAG,mBAAoB,KAAK,QAAQ,CAAC;AAC7E,cAAQ,IAAI,iBAAiB,UAAU,GAAG;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,GAAG,gBAAgB,GAAG,aAAa,SAAS,GAAG;AACjD,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,eAAe,CAAC,EAAE;AAClD,OAAG,aAAa,QAAQ,CAAC,QAAQ;AAC/B,cAAQ,IAAI,eAAQ,GAAG,EAAE;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,MAAI,GAAG,cAAc,GAAG,WAAW,SAAS,GAAG;AAC7C,YAAQ,IAAI;AAAA,EAAK,UAAU,QAAQ,aAAa,CAAC,EAAE;AACnD,OAAG,WAAW,QAAQ,CAAC,YAAY;AACjC,cAAQ,IAAI,eAAQ,OAAO,EAAE;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,MAAI,GAAG,UAAU,GAAG,OAAO,SAAS,GAAG;AACrC,YAAQ,IAAI;AAAA,EAAK,UAAU,QAAQ,SAAS,CAAC,EAAE;AAC/C,OAAG,OAAO,QAAQ,CAAC,YAAY;AAC7B,cAAQ,IAAI,eAAQ,OAAO,EAAE;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,MAAI,GAAG,eAAe,GAAG,YAAY,SAAS,GAAG;AAC/C,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,cAAc,CAAC,EAAE;AACjD,OAAG,YAAY,QAAQ,CAAC,cAAc;AACpC,cAAQ,IAAI,eAAQ,SAAS,EAAE;AAAA,IACjC,CAAC;AAAA,EACH;AAEA,MAAI,GAAG,cAAc,GAAG,WAAW,SAAS,GAAG;AAC7C,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,aAAa,CAAC,EAAE;AAChD,OAAG,WAAW,QAAQ,CAAC,YAAY;AACjC,cAAQ,IAAI,eAAQ,OAAO,EAAE;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,MAAI,GAAG,eAAe;AACpB,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,gBAAgB,CAAC,IAAI,GAAG,aAAa,EAAE;AAAA,EACzE;AAEA,UAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,cAAc,CAAC,IAAI,GAAG,WAAW,EAAE;AACnE,UAAQ,IAAI,GAAG,UAAU,KAAK,YAAY,CAAC,IAAI,GAAG,SAAS,EAAE;AAE7D,MAAI,QAAQ,eAAe,GAAG,aAAa;AACzC,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,cAAc,CAAC,EAAE;AACjD,YAAQ,IAAI,GAAG,WAAW;AAAA,EAC5B;AAEA,MAAI,QAAQ,eAAe,GAAG,SAAS;AACrC,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,UAAU,CAAC,EAAE;AAC7C,YAAQ,IAAI,GAAG,OAAO;AAAA,EACxB;AAEA,MAAI,QAAQ,mBAAmB;AAC7B,YAAQ,IAAI;AAAA,EAAK,UAAU,OAAO,gBAAgB,CAAC,EAAE;AAGrD,UAAM,QAAQ,YAAY;AAC1B,YAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,eAAe,CAAC,IAAI,MAAM,QAAQ,EAAE;AACpE,YAAQ,IAAI,YAAY,MAAM,KAAK,EAAE;AACrC,YAAQ,IAAI,aAAa,MAAM,MAAM,EAAE;AACvC,YAAQ,IAAI,eAAe,MAAM,QAAQ,EAAE;AAC3C,YAAQ,IAAI,eAAe,MAAM,QAAQ,EAAE;AAG3C,QAAI,YAAY,MAAM;AACpB,YAAM,OAAO,YAAY;AACzB,cAAQ,IAAI;AAAA,EAAK,UAAU,KAAK,cAAc,CAAC,IAAI,KAAK,OAAO,EAAE;AACjE,cAAQ,IAAI,YAAY,KAAK,KAAK,EAAE;AACpC,cAAQ,IAAI,aAAa,KAAK,MAAM,EAAE;AACtC,cAAQ,IAAI,eAAe,KAAK,QAAQ,EAAE;AAC1C,cAAQ,IAAI,eAAe,KAAK,QAAQ,EAAE;AAE1C,UAAI,KAAK,0BAA0B,QAAW;AAC5C,gBAAQ,IAAI,iBAAiB,KAAK,qBAAqB,GAAG;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,IAAI;AAAA,EAAK,UAAU,QAAQ,aAAa,CAAC,EAAE;AACnD,UAAQ,IAAI,QAAQ,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG;AAC5C,UAAQ,IAAI,aAAa,GAAG,SAAS,gBAAgB,GAAG,QAAQ,gBAAgB,GAAG,QAAQ,EAAE;AAC7F,UAAQ,IAAI,aAAa,GAAG,eAAe,KAAK,WAAM,GAAG,iBAAiB,MAAM,EAAE;AAClF,UAAQ,IAAI,cAAcD,YAAW,GAAG,YAAY,CAAC,EAAE;AACvD,UAAQ,IAAI,mBAAmBA,YAAW,GAAG,YAAY,CAAC,EAAE;AAC9D;AAEA,SAASF,kBAAiB,QAA4C;AACpE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,UAAU;AAAA,EACrB;AACF;AAEA,SAASC,kBAAiB,UAA8C;AACtE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,UAAU;AAAA,EACrB;AACF;AAEA,SAASC,YAAW,YAA4B;AAC9C,QAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAO,GAAG,KAAK,mBAAmB,CAAC,IAAI,KAAK,mBAAmB,CAAC;AAClE;AApUA,IAKAE;AALA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AAExB;AACA;AACA;AASgB;AA0BD;AAmPN,WAAAJ,mBAAA;AAmBA,WAAAC,mBAAA;AAeA,WAAAC,aAAA;AAAA;AAAA;;;AC7PF,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MAAI,YAAY,kCAAkC;AAGlD,MACG;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,iBAAiB,6CAA6C,KAAK,EAC1E,OAAO,mBAAmB,oDAAoD,KAAK,EACnF,OAAO,yBAAyB,mCAAmC,KAAK,EACxE,OAAO,qBAAqB,yCAAyC,KAAK,EAC1E,OAAO,oBAAoB,wCAAwC,KAAK,EACxE,OAAO,WAAW,wCAAwC,KAAK,EAC/D,OAAO,aAAa,+CAA+C,KAAK,EACxE,OAAO,OAAO,YAAiB;AAC9B,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AACjE,UAAM,aAAa,IAAI,UAAU;AAEjC,UAAM,cAA2B;AAAA,MAC/B,WAAW,QAAQ;AAAA,MACnB,YAAY,QAAQ;AAAA,MACpB,cAAc,QAAQ;AAAA,MACtB,oBAAoB,QAAQ;AAAA,MAC5B,gBAAgB,QAAQ;AAAA,MACxB,eAAe,QAAQ;AAAA,MACvB,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,IACjB;AAEA,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,OAAO,OAAO,sDAA+C,CAAC;AAC1E,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAEA,wBAAkB,MAAM;AAExB,UAAI,CAAC,OAAO,SAAS;AACnB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO,IAAI,uBAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MACvF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,MACG,QAAQ,QAAQ,EAChB,YAAY,gDAAgD,EAC5D,OAAO,yBAAyB,8BAA8B,OAAO,EACrE,OAAO,oBAAoB,uBAAuB,KAAK,EACvD,OAAO,OAAO,YAAiB;AAC9B,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AACjE,UAAM,YAAY,IAAI,UAAU;AAEhC,QAAI;AACF,YAAM,WAAW,MAAM,gBAAgB,eAAe,qBAAqB,aAAa;AAExF,UAAI,QAAQ,eAAe;AACzB,cAAM,YAAY,SAAS,OAAO,CAAC,MAAM,EAAE,kBAAkB,UAAU;AACvE,4BAAoB,WAAW,QAAQ,QAAQ,SAAS;AAAA,MAC1D,OAAO;AACL,4BAAoB,UAAU,QAAQ,QAAQ,SAAS;AAAA,MACzD;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,qCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACxF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,MACG,QAAQ,OAAO,EACf,YAAY,kDAAkD,EAC9D,SAAS,WAAW,OAAO,EAC3B,SAAS,aAAa,SAAS,EAC/B,OAAO,+BAA+B,0CAA0C,YAAY,EAC5F,OAAO,OAAO,MAAc,QAAgB,YAAiB;AAC5D,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,gBAAgB,IAAI,gBAAgB,aAAa;AACvD,UAAM,sBAAsB,IAAI,oBAAoB,aAAa;AAEjE,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,SAAS;AAClB,gBAAQ,IAAI,OAAO,MAAM,8BAAyB,IAAI,WAAM,MAAM,EAAE,CAAC;AACrE,gBAAQ,IAAI,wBAAiB,QAAQ,SAAS,EAAE;AAChD,YAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,GAAG;AAC/C,kBAAQ,IAAI,oBAAa;AACzB,iBAAO,QAAQ,QAAQ,CAAC,WAAW,QAAQ,IAAI,OAAO,MAAM,EAAE,CAAC;AAAA,QACjE;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,OAAO,IAAI,yBAAoB,IAAI,WAAM,MAAM,EAAE,CAAC;AAChE,YAAI,OAAO,OAAO;AAChB,kBAAQ,MAAM,OAAO,IAAI,YAAY,OAAO,KAAK,EAAE,CAAC;AAAA,QACtD;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO;AAAA,UACL,mCAA8B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACtF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YACb,SACA,eACA,qBACA,eACqB;AACrB,QAAM,SAAqB;AAAA,IACzB,SAAS;AAAA,IACT,WAAW,QAAQ;AAAA,IACnB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,EACZ;AAEA,MAAI;AAEF,UAAM,WAAW,MAAM,gBAAgB,eAAe,qBAAqB,aAAa;AAExF,WAAO,WAAW,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;AACvD,WAAO,aAAa,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;AAE3D,YAAQ,IAAI,OAAO,KAAK,sCAA+B,QAAQ,SAAS,EAAE,CAAC;AAC3E,YAAQ,IAAI,mBAAY,SAAS,MAAM,wBAAwB;AAG/D,UAAM,YAAY,SAAS,OAAO,CAAC,MAAM,EAAE,gBAAgB,QAAQ,KAAK;AAExE,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,IAAI,OAAO,MAAM,mDAA8C,CAAC;AACxE,aAAO,UAAU;AACjB,aAAO;AAAA,IACT;AAEA,YAAQ,IAAI,OAAO,OAAO,iBAAO,UAAU,MAAM,qCAAqC,CAAC;AAGvF,eAAW,WAAW,WAAW;AAC/B,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO,QAAQ,KAAK,MAAM;AAE1B,UAAI,OAAO,SAAS;AAClB,YAAI,OAAO,OAAO,SAAS,YAAY,EAAG,QAAO;AACjD,YAAI,OAAO,OAAO,SAAS,cAAc,EAAG,QAAO;AACnD,YAAI,OAAO,OAAO,SAAS,gBAAgB,EAAG,QAAO;AACrD,YAAI,OAAO,OAAO,SAAS,YAAY,EAAG,QAAO;AACjD,YAAI,OAAO,OAAO,SAAS,cAAc,EAAG,QAAO;AAAA,MACrD,OAAO;AACL,eAAO,OAAO,KAAK,GAAG,QAAQ,IAAI,WAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,EAAE;AAAA,MAC3E;AAAA,IACF;AAEA,WAAO,YAAY,OAAO,aAAa,OAAO;AAC9C,WAAO,cAAc,OAAO,eAAe,OAAO;AAClD,WAAO,UAAU,OAAO,OAAO,WAAW;AAE1C,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO;AAAA,MACZ,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAClF;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAe,gBACb,eACA,qBACA,eACwB;AACxB,QAAM,WAA0B,CAAC;AAGjC,QAAM,SAAS,MAAM,cAAc,QAAQ;AAE3C,aAAW,MAAM,QAAQ;AAEvB,UAAM,cAAc,MAAM,oBAAoB,eAAe,GAAG,KAAK;AAErE,eAAW,UAAU,aAAa;AAChC,YAAM,OAAO,MAAM,aAAa,QAAQ,aAAa;AAErD,UAAI,MAAM;AACR,cAAM,UAAU,kBAAkB,IAAI,IAAI;AAC1C,iBAAS,KAAK,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,IAAY,MAA6B;AAClE,QAAM,UAAuB;AAAA,IAC3B,MAAM,GAAG;AAAA,IACT,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,IACd,UAAU,GAAG;AAAA,IACb,YAAY,KAAK;AAAA,IACjB,YAAY,GAAG;AAAA,IACf,cAAc,KAAK;AAAA,IACnB,WAAW,GAAG;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,iBAAiB,CAAC;AAAA,EACpB;AAGA,QAAM,UAAU,IAAI,KAAK,GAAG,YAAY,IAAI,IAAI,KAAK,KAAK,YAAY;AACtE,QAAM,YAAY,IAAI,KAAK,KAAK,YAAY,IAAI,IAAI,KAAK,GAAG,YAAY;AAExE,QAAM,iBAAiB,CAAC,eAAe,GAAG,WAAW,KAAK,MAAM;AAChE,QAAM,mBAAmB,GAAG,aAAa,KAAK;AAE9C,MAAI,kBAAkB,kBAAkB;AACtC,YAAQ,eAAe;AAEvB,QAAI,SAAS;AACX,cAAQ,gBAAgB;AAAA,IAC1B,WAAW,WAAW;AACpB,cAAQ,gBAAgB;AAAA,IAC1B,OAAO;AACL,cAAQ,gBAAgB;AACxB,cAAQ,gBAAgB,KAAK,8CAA8C;AAAA,IAC7E;AAAA,EACF;AAGA,MAAI,kBAAkB,CAAC,cAAc,GAAG,WAAW,KAAK,MAAM,GAAG;AAC/D,YAAQ,gBAAgB;AACxB,YAAQ,gBAAgB,KAAK,uBAAuB,GAAG,SAAS,WAAM,KAAK,MAAM,EAAE;AAAA,EACrF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,UAAoB,YAAiC;AAC3E,QAAM,UAAwC;AAAA,IAC5C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,SAAO,QAAQ,QAAQ,MAAM;AAC/B;AAEA,SAAS,cAAc,UAAoB,YAAiC;AAtX5E;AAwXE,QAAM,qBAAqD;AAAA,IACzD,OAAO,CAAC,YAAY,QAAQ;AAAA,IAC5B,MAAM,CAAC,QAAQ;AAAA,IACf,QAAQ,CAAC,QAAQ;AAAA,IACjB,UAAU,CAAC,UAAU,WAAW;AAAA,IAChC,QAAQ,CAAC,WAAW;AAAA,IACpB,QAAQ,CAAC,UAAU;AAAA,EACrB;AAEA,WAAO,wBAAmB,QAAQ,MAA3B,mBAA8B,SAAS,gBAAe;AAC/D;AAEA,eAAe,WACb,SACA,SACA,eACA,sBACA,eACqB;AACrB,QAAM,SAAqB;AAAA,IACzB,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS,CAAC;AAAA,EACZ;AAEA,MAAI;AAEF,QAAI,QAAQ,kBAAkB,cAAc,CAAC,QAAQ,OAAO;AAC1D,aAAO,UAAU,sBAAsB,QAAQ,gBAAgB,KAAK,IAAI,CAAC;AACzE,aAAO,QAAQ;AACf,aAAO;AAAA,IACT;AAGA,UAAM,KAAK,MAAM,cAAc,WAAW,QAAQ,IAAI;AACtD,UAAM,OAAO,MAAM,aAAa,QAAQ,QAAQ,aAAa;AAE7D,QAAI,CAAC,MAAM,CAAC,MAAM;AAChB,aAAO,QAAQ,qBAAqB,QAAQ,IAAI,YAAY,QAAQ,MAAM;AAC1E,aAAO;AAAA,IACT;AAGA,QAAI,gBAAgB,QAAQ;AAC5B,QAAI,QAAQ,cAAc,iBAAiB;AACzC,sBAAgB,QAAQ;AAAA,IAC1B;AAEA,UAAM,UAAoB,CAAC;AAG3B,QAAI,kBAAkB,gBAAgB,kBAAkB,YAAY;AAElE,UAAI,GAAG,cAAc,QAAQ,YAAY,QAAQ,OAAO;AACtD,cAAM,gBAAgB,oBAAoB,GAAG,SAAS;AAEtD,YAAI,CAAC,QAAQ,QAAQ;AACnB,gBAAM,iBAAiB,MAAM,eAAe,aAAa;AAAA,QAC3D;AAEA,gBAAQ,KAAK,wBAAwB,KAAK,MAAM,WAAM,aAAa,EAAE;AAGrE,YAAI,QAAQ,gBAAgB,GAAG,cAAc,UAAU;AACrD,cAAI,CAAC,QAAQ,QAAQ;AACnB,kBAAM,iBAAiB,MAAM,aAAa,aAAa;AAAA,UACzD;AACA,kBAAQ,KAAK,iCAAiC;AAAA,QAChD;AAAA,MACF;AAGA,UAAI,QAAQ,iBAAiB,GAAG,aAAa,KAAK,UAAU;AAC1D,YAAI,CAAC,QAAQ,QAAQ;AACnB,gBAAM,mBAAmB,MAAM,GAAG,UAAU,aAAa;AAAA,QAC3D;AACA,gBAAQ,KAAK,0BAA0B,KAAK,QAAQ,WAAM,GAAG,QAAQ,EAAE;AAAA,MACzE;AAAA,IACF;AAEA,QAAI,kBAAkB,gBAAgB,kBAAkB,YAAY;AAElE,UAAI,KAAK,WAAW,QAAQ,cAAc,QAAQ,OAAO;AACvD,cAAM,cAAc,oBAAoB,KAAK,MAAM;AAEnD,YAAI,CAAC,QAAQ,QAAQ;AACnB,gBAAM,cAAc,eAAe,GAAG,OAAO,WAAW;AAAA,QAC1D;AAEA,gBAAQ,KAAK,sBAAsB,GAAG,SAAS,WAAM,WAAW,EAAE;AAAA,MACpE;AAGA,UAAI,QAAQ,iBAAiB,KAAK,aAAa,GAAG,UAAU;AAC1D,YAAI,CAAC,QAAQ,QAAQ;AACnB,gBAAM,iBAAiB,IAAI,KAAK,UAAU,aAAa;AAAA,QACzD;AACA,gBAAQ,KAAK,wBAAwB,GAAG,QAAQ,WAAM,KAAK,QAAQ,EAAE;AAAA,MACvE;AAAA,IACF;AAGA,QAAI,QAAQ,gBAAgB;AAC1B,YAAM,aAAa,IAAI;AAAA,QACrB,KAAK,IAAI,IAAI,KAAK,GAAG,YAAY,EAAE,QAAQ,GAAG,IAAI,KAAK,KAAK,YAAY,EAAE,QAAQ,CAAC;AAAA,MACrF,EAAE,YAAY;AAEd,UAAI,CAAC,QAAQ,QAAQ;AACnB,cAAM,iBAAiB,IAAI,MAAM,YAAY,aAAa;AAAA,MAC5D;AAEA,cAAQ,KAAK,yBAAyB,UAAU,EAAE;AAAA,IACpD;AAEA,WAAO,UAAU;AACjB,WAAO,UAAU;AACjB,WAAO,UACL,QAAQ,SAAS,IAAI,wBAAwB,QAAQ,MAAM,cAAc;AAC3E,WAAO,SAAS,UAAU,aAAa;AAEvC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,WAAO,UAAU;AACjB,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,UAAgC;AAC3D,QAAM,YAA0C;AAAA,IAC9C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,SAAO,UAAU,QAAQ,KAAK;AAChC;AAEA,SAAS,oBAAoB,YAAkC;AAC7D,QAAM,YAA0C;AAAA,IAC9C,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAEA,SAAO,UAAU,UAAU,KAAK;AAClC;AAEA,eAAe,aACb,QACA,eAC0B;AAC1B,MAAI;AACF,UAAM,WAAW,cAAc,kBAAkB;AACjD,UAAM,YAAe,iBAAY,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,CAAC;AAEjF,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,UAAU,CAAC;AAC5B,UAAM,WAAgB,YAAK,UAAU,QAAQ;AAG7C,UAAM,UAAa,kBAAa,UAAU,MAAM;AAGhD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,YAAY,CAAC;AAAA,MACb,aAAa;AAAA,MACb;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,sBAAsB,MAAM,KAAK,KAAK;AACpD,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iBACb,MACA,WACA,gBACe;AACf,MAAI;AACF,UAAM,UAAa,kBAAa,KAAK,WAAW,MAAM;AACtD,UAAM,iBAAiB,QACpB,QAAQ,iBAAiB,WAAW,SAAS,EAAE,EAC/C,QAAQ,0BAA0B,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AAEhF,IAAG,mBAAc,KAAK,WAAW,gBAAgB,MAAM;AAAA,EACzD,SAAS,OAAO;AACd,YAAQ,MAAM,uBAAuB,KAAK,OAAO,KAAK,KAAK;AAAA,EAC7D;AACF;AAEA,eAAe,mBACb,MACA,aACA,gBACe;AACf,MAAI;AACF,UAAM,UAAa,kBAAa,KAAK,WAAW,MAAM;AACtD,UAAM,iBAAiB,QACpB,QAAQ,sBAAsB,aAAa,WAAW,EAAE,EACxD,QAAQ,0BAA0B,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AAEhF,IAAG,mBAAc,KAAK,WAAW,gBAAgB,MAAM;AAAA,EACzD,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAgC,KAAK,OAAO,KAAK,KAAK;AAAA,EACtE;AACF;AAEA,eAAe,iBACb,IACA,aACA,gBACe;AACf,MAAI;AACF,UAAM,UAAa,kBAAa,GAAG,WAAW,MAAM;AACpD,UAAM,iBAAiB,QACpB,QAAQ,sBAAsB,aAAa,WAAW,EAAE,EACxD,QAAQ,0BAA0B,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AAEhF,IAAG,mBAAc,GAAG,WAAW,gBAAgB,MAAM;AAAA,EACvD,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,GAAG,KAAK,KAAK,KAAK;AAAA,EAChE;AACF;AAEA,eAAe,iBACb,IACA,MACA,WACA,gBACe;AACf,MAAI;AAEF,UAAM,YAAe,kBAAa,GAAG,WAAW,MAAM;AACtD,UAAM,mBAAmB,UAAU;AAAA,MACjC;AAAA,MACA,iBAAiB,SAAS;AAAA,IAC5B;AACA,IAAG,mBAAc,GAAG,WAAW,kBAAkB,MAAM;AAGvD,UAAM,cAAiB,kBAAa,KAAK,WAAW,MAAM;AAC1D,UAAM,qBAAqB,YAAY;AAAA,MACrC;AAAA,MACA,iBAAiB,SAAS;AAAA,IAC5B;AACA,IAAG,mBAAc,KAAK,WAAW,oBAAoB,MAAM;AAAA,EAC7D,SAAS,OAAO;AACd,YAAQ,MAAM,iCAAiC,GAAG,KAAK,WAAM,KAAK,OAAO,KAAK,KAAK;AAAA,EACrF;AACF;AAEA,eAAe,gBACb,MACA,QACA,WACA,eACA,qBACA,eACqB;AACrB,QAAM,KAAK,MAAM,cAAc,WAAW,IAAI;AAC9C,QAAM,OAAO,MAAM,aAAa,QAAQ,aAAa;AAErD,MAAI,CAAC,MAAM,CAAC,MAAM;AAChB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO,qBAAqB,IAAI,YAAY,MAAM;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,UAAU,kBAAkB,IAAI,IAAI;AAE1C,QAAM,cAA2B;AAAA,IAC/B;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAEA,SAAO,MAAM,WAAW,SAAS,aAAa,eAAe,qBAAqB,aAAa;AACjG;AAEA,SAAS,kBAAkB,QAA0B;AACnD,UAAQ,IAAI,OAAO,KAAK;AAAA,mCAA+B,CAAC;AACxD,UAAQ,IAAI,wBAAiB,OAAO,SAAS,EAAE;AAC/C,UAAQ,IAAI,wBAAiB,OAAO,QAAQ,EAAE;AAC9C,UAAQ,IAAI,0BAAmB,OAAO,UAAU,EAAE;AAClD,UAAQ,IAAI,yBAAkB,OAAO,SAAS,EAAE;AAChD,UAAQ,IAAI,2BAAoB,OAAO,WAAW,EAAE;AAEpD,MAAI,OAAO,aAAa,GAAG;AACzB,YAAQ,IAAI,uBAAkB,OAAO,UAAU,EAAE;AAAA,EACnD;AAEA,MAAI,OAAO,eAAe,GAAG;AAC3B,YAAQ,IAAI,yBAAoB,OAAO,YAAY,EAAE;AAAA,EACvD;AAEA,MAAI,OAAO,iBAAiB,GAAG;AAC7B,YAAQ,IAAI,2BAAsB,OAAO,cAAc,EAAE;AAAA,EAC3D;AAEA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,YAAQ,IAAI,2BAAoB;AAChC,WAAO,QAAQ,QAAQ,CAAC,WAAW;AACjC,YAAM,OAAO,OAAO,UAAU,WAAM;AACpC,YAAM,QAAQ,OAAO,UAAU,OAAO,QAAQ,OAAO;AACrD,cAAQ,IAAI,MAAM,GAAG,IAAI,IAAI,OAAO,IAAI,WAAM,OAAO,MAAM,KAAK,OAAO,OAAO,EAAE,CAAC;AAEjF,UAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,GAAG;AAC/C,eAAO,QAAQ,QAAQ,CAAC,WAAW;AACjC,kBAAQ,IAAI,OAAO,KAAK,SAAS,MAAM,EAAE,CAAC;AAAA,QAC5C,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,YAAQ,IAAI,OAAO,OAAO,2BAAiB,CAAC;AAC5C,WAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,cAAQ,IAAI,OAAO,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,IAC7C,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAQ,IAAI,OAAO,IAAI,kBAAa,CAAC;AACrC,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,cAAQ,IAAI,OAAO,IAAI,OAAO,KAAK,EAAE,CAAC;AAAA,IACxC,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,OAAO,UAAU,OAAO,QAAQ,OAAO;AAC5D,QAAM,cAAc,OAAO,UAAU,WAAM;AAC3C,UAAQ;AAAA,IACN,aAAa;AAAA,EAAK,WAAW,SAAS,OAAO,UAAU,2BAA2B,QAAQ,EAAE;AAAA,EAC9F;AACF;AAEA,SAAS,oBAAoB,UAAyB,QAAgB,YAA6B;AACjG,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,EAC/C,OAAO;AACL,YAAQ,IAAI,OAAO,KAAK;AAAA,iCAA6B,SAAS,MAAM,iBAAiB,CAAC;AAEtF,YAAQ;AAAA,MACN,SAAS,IAAI,CAAC,aAAa;AAAA,QACzB,SAAS,QAAQ;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,aAAa,QAAQ;AAAA,QACrB,eAAe,QAAQ;AAAA,QACvB,iBAAiB,QAAQ,eAAe,QAAQ;AAAA,QAChD,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ,gBAAgB,SAAS,IAAI,QAAQ,gBAAgB,KAAK,IAAI,IAAI;AAAA,MACvF,EAAE;AAAA,IACJ;AAEA,UAAM,YAAY,SAAS,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE;AACzD,UAAM,YAAY,SAAS,OAAO,CAAC,MAAM,EAAE,kBAAkB,UAAU,EAAE;AAEzE,YAAQ,IAAI,OAAO,KAAK;AAAA,mBAAe,CAAC;AACxC,YAAQ,IAAI,yBAAkB,SAAS,EAAE;AACzC,YAAQ,IAAI,4BAAkB,SAAS,EAAE;AACzC,YAAQ,IAAI,mBAAc,SAAS,SAAS,SAAS,EAAE;AAAA,EACzD;AACF;AApwBA,IAKAI,MACAC,QACAC;AAPA;AAAA;AAAA;AAAA;AAKA,IAAAF,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AACA;AAuDgB;AA8ID;AA+EA;AA2BN;AA6CA;AAaA;AAcM;AAuHN;AAaA;AAWM;AA2CA;AAiBA;AAiBA;AAiBA;AA2BA;AAsCN;AAwDA;AAAA;AAAA;;;ACvsBF,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,4CAA4C,EACxD,SAAS,WAAW,iBAAiB,EACrC,OAAO,yBAAyB,6DAA6D,EAC7F,OAAO,6BAA6B,4CAA4C,EAChF,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,uBAAuB,cAAc,EAC5C,OAAO,4BAA4B,oBAAoB,EACvD,OAAO,wBAAwB,oBAAoB,EACnD,OAAO,0BAA0B,sBAAsB,EACvD,OAAO,0BAA0B,sBAAsB,EACvD,OAAO,0BAA0B,uBAAuB,EACxD,OAAO,6BAA6B,gBAAgB,EACpD,OAAO,gCAAgC,mBAAmB,EAC1D,OAAO,mBAAmB,WAAW,EACrC,OAAO,sBAAsB,cAAc,EAC3C,OAAO,yBAAyB,kBAAkB,EAClD,OAAO,4BAA4B,qBAAqB,EACxD,OAAO,2BAA2B,kBAAkB,EACpD,OAAO,+BAA+B,yBAAyB,EAC/D,OAAO,aAAa,mDAAmD,EACvE,OAAO,OAAO,MAAc,YAA2B;AACtD,QAAI;AACF,YAAM,SAAS,MAAM,OAAO;AAAA,IAC9B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAClF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,SAAS,MAAc,SAAuC;AAC3E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AAGxD,QAAM,cAAc,oBAAoB,eAAe,IAAI;AAC3D,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,EACzC;AAEA,QAAM,KAAK,YAAY;AACvB,QAAM,iBAAiB,GAAG;AAG1B,MAAI,QAAQ,UAAU,CAAC,wBAAwB,gBAAgB,QAAQ,MAAM,GAAG;AAC9E,UAAM,IAAI,MAAM,8BAA8B,cAAc,WAAM,QAAQ,MAAM,EAAE;AAAA,EACpF;AAGA,MAAI,QAAQ,YAAY,CAAC,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,GAAG;AACzF,UAAM,IAAI;AAAA,MACR,qBAAqB,QAAQ,QAAQ;AAAA,IACvC;AAAA,EACF;AAGA,MACE,QAAQ,UACR,CAAC,CAAC,SAAS,QAAQ,UAAU,YAAY,UAAU,QAAQ,EAAE,SAAS,QAAQ,MAAM,GACpF;AACA,UAAM,IAAI;AAAA,MACR,sBAAsB,QAAQ,MAAM;AAAA,IACtC;AAAA,EACF;AAGA,MAAI,mBAAmB,CAAC,GAAI,GAAG,aAAa,CAAC,CAAE;AAC/C,MAAI,QAAQ,aAAa;AACvB,QAAI,CAAC,iBAAiB,SAAS,QAAQ,WAAW,GAAG;AACnD,uBAAiB,KAAK,QAAQ,WAAW;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,QAAQ,gBAAgB;AAC1B,uBAAmB,iBAAiB,OAAO,CAAC,MAAM,MAAM,QAAQ,cAAc;AAAA,EAChF;AAGA,MAAI,cAAc,CAAC,GAAI,GAAG,QAAQ,CAAC,CAAE;AACrC,MAAI,QAAQ,QAAQ;AAClB,QAAI,CAAC,YAAY,SAAS,QAAQ,MAAM,GAAG;AACzC,kBAAY,KAAK,QAAQ,MAAM;AAAA,IACjC;AAAA,EACF;AACA,MAAI,QAAQ,WAAW;AACrB,kBAAc,YAAY,OAAO,CAAC,MAAM,MAAM,QAAQ,SAAS;AAAA,EACjE;AAGA,MAAI,sBAAsB,CAAC,GAAI,GAAG,gBAAgB,CAAC,CAAE;AACrD,MAAI,QAAQ,eAAe;AACzB,QAAI,CAAC,oBAAoB,SAAS,QAAQ,aAAa,GAAG;AACxD,0BAAoB,KAAK,QAAQ,aAAa;AAAA,IAChD;AAAA,EACF;AACA,MAAI,QAAQ,kBAAkB;AAC5B,0BAAsB,oBAAoB,OAAO,CAAC,MAAM,MAAM,QAAQ,gBAAgB;AAAA,EACxF;AAGA,MAAI,mBAAmB,CAAC,GAAI,GAAG,aAAa,CAAC,CAAE;AAC/C,MAAI,QAAQ,WAAW,QAAQ,WAAW,WAAW,QAAQ,WAAW,SAAS;AAC/E,uBAAmB,CAAC;AAAA,EACtB;AAEA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,QAAM,UAA2B;AAAA,IAC/B,cAAc;AAAA,EAChB;AAGA,MAAI,QAAQ,OAAQ,SAAQ,YAAY,QAAQ;AAChD,MAAI,QAAQ,SAAU,SAAQ,WAAW,QAAQ;AACjD,MAAI,QAAQ,SAAU,SAAQ,WAAW,QAAQ;AACjD,MAAI,QAAQ,MAAO,SAAQ,QAAQ,QAAQ;AAC3C,MAAI,QAAQ,YAAa,SAAQ,cAAc,QAAQ;AACvD,MAAI,QAAQ,WAAY,SAAQ,cAAc,QAAQ;AACtD,MAAI,QAAQ,aAAc,SAAQ,gBAAgB,QAAQ;AAC1D,MAAI,QAAQ,aAAc,SAAQ,gBAAgB,QAAQ;AAC1D,MAAI,QAAQ,cAAe,SAAQ,iBAAiB,QAAQ;AAC5D,MAAI,QAAQ,UAAW,SAAQ,YAAY,QAAQ;AACnD,MAAI,QAAQ,oBAAoB,OAAW,SAAQ,mBAAmB,QAAQ;AAG9E,MAAI,QAAQ,eAAe,QAAQ,gBAAgB;AACjD,YAAQ,YAAY,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,EACvE;AACA,MAAI,QAAQ,UAAU,QAAQ,WAAW;AACvC,YAAQ,OAAO,YAAY,SAAS,IAAI,cAAc;AAAA,EACxD;AACA,MAAI,QAAQ,iBAAiB,QAAQ,kBAAkB;AACrD,YAAQ,eAAe,oBAAoB,SAAS,IAAI,sBAAsB;AAAA,EAChF;AACA,MAAI,QAAQ,WAAW,QAAQ,WAAW,WAAW,QAAQ,WAAW,SAAS;AAC/E,YAAQ,YAAY,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,EACvE;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,qCAAqC,CAAC;AACjE,YAAQ,IAAI,UAAU,MAAM,UAAU,IAAI,EAAE,CAAC;AAC7C,YAAQ,IAAI,UAAU,MAAM,kBAAkB,GAAG,KAAK,EAAE,CAAC;AACzD,YAAQ,IAAI,UAAU,MAAM,mBAAmB,GAAG,SAAS,EAAE,CAAC;AAC9D,YAAQ,IAAI,UAAU,MAAM,qBAAqB,GAAG,QAAQ,EAAE,CAAC;AAC/D,YAAQ,IAAI,UAAU,MAAM,qBAAqB,GAAG,QAAQ,EAAE,CAAC;AAE/D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,mBAAmB,CAAC;AAC/C,WAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAChD,UAAI,QAAQ,gBAAgB;AAC1B,gBAAQ,IAAI,UAAU,MAAM,KAAK,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,CAAC;AAAA,MACnE;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,UAAU,QAAQ,WAAW,gBAAgB;AACvD,cAAQ,IAAI,UAAU,MAAM,kBAAkB,cAAc,WAAM,QAAQ,MAAM,EAAE,CAAC;AAAA,IACrF;AAEA;AAAA,EACF;AAGA,QAAM,aAAa,OAAO,KAAK,OAAO,EAAE,SAAS;AACjD,MAAI,CAAC,YAAY;AACf,YAAQ,IAAI,UAAU,QAAQ,4DAA4D,CAAC;AAC3F;AAAA,EACF;AAGA,SAAO,WAAW,GAAG,WAAW,OAAO;AAGvC,MAAI,QAAQ,UAAU,QAAQ,WAAW,gBAAgB;AACvD,UAAMC,wBAAuB,IAAI,QAAQ,QAAQ,KAAK;AAAA,EACxD;AAGA,QAAM,iBAAiB;AAAA,IACrB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,YAAY,QAAQ,UAAU;AAAA,EAChC;AAGA,QAAM,YAAY,gBAAgB,KAAK;AAGvC,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,0BAA0B,CAAC;AACzD,UAAQ,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,QAAQ,SAAS,GAAG,KAAK,EAAE,CAAC;AACxE,UAAQ,IAAI,UAAU,KAAK,SAAS,GAAG,SAAS,EAAE,CAAC;AAEnD,MAAI,QAAQ,UAAU,QAAQ,WAAW,gBAAgB;AACvD,YAAQ,IAAI,UAAU,KAAK,WAAW,cAAc,WAAM,QAAQ,MAAM,EAAE,CAAC;AAAA,EAC7E;AAGA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,KAAK,iBAAiB,CAAC;AAC7C,SAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAChD,QAAI,QAAQ,gBAAgB;AAC1B,cAAQ,IAAI,UAAU,KAAK,KAAK,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,CAAC;AAAA,IAClE;AAAA,EACF,CAAC;AAGD,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,EAAE;AACd,YAAQ,QAAQ,QAAQ;AAAA,MACtB,KAAK;AACH,gBAAQ,IAAI,UAAU,KAAK,qCAA8B,CAAC;AAC1D,gBAAQ;AAAA,UACN,UAAU,KAAK,iEAAiE;AAAA,QAClF;AACA;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,UAAU,KAAK,qCAA8B,CAAC;AAC1D,gBAAQ,IAAI,UAAU,KAAK,4CAA4C,CAAC;AACxE;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,UAAU,KAAK,8BAAuB,CAAC;AACnD,gBAAQ,IAAI,UAAU,KAAK,yCAAyC,CAAC;AACrE;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,UAAU,KAAK,uBAAkB,CAAC;AAC9C,gBAAQ,IAAI,UAAU,KAAK,qCAAqC,CAAC;AACjE;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,UAAU,QAAQ,wBAAiB,CAAC;AAChD,gBAAQ,IAAI,UAAU,KAAK,oCAAoC,CAAC;AAChE;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,UAAU,KAAK,wBAAiB,CAAC;AAC7C,gBAAQ,IAAI,UAAU,KAAK,qDAAqD,CAAC;AACjF;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,eAAyB,WAA8B;AAEtF,QAAM,mBAAiD;AAAA,IACrD,OAAO,CAAC,QAAQ,QAAQ;AAAA,IACxB,MAAM,CAAC,SAAS,UAAU,YAAY,UAAU,QAAQ;AAAA,IACxD,QAAQ,CAAC,QAAQ,YAAY,QAAQ;AAAA,IACrC,UAAU,CAAC,UAAU,UAAU,QAAQ;AAAA,IACvC,QAAQ,CAAC;AAAA;AAAA,IACT,QAAQ,CAAC,SAAS,MAAM;AAAA;AAAA,EAC1B;AAEA,SAAO,iBAAiB,aAAa,EAAE,SAAS,SAAS;AAC3D;AAEA,eAAeA,wBAAuB,IAAY,WAAqB,OAA2B;AAEhG,QAAM,aAAa;AAAA,IACjB,OAAY,YAAK,MAAM,QAAQ,OAAO;AAAA,IACtC,MAAW,YAAK,MAAM,QAAQ,QAAQ;AAAA,IACtC,QAAa,YAAK,MAAM,QAAQ,QAAQ;AAAA,IACxC,UAAe,YAAK,MAAM,QAAQ,QAAQ;AAAA,IAC1C,QAAa,YAAK,MAAM,QAAQ,QAAQ;AAAA,IACxC,QAAa,YAAK,MAAM,QAAQ,QAAQ;AAAA,EAC1C;AAGA,QAAM,aAAkB,eAAQ,GAAG,SAAS;AAC5C,QAAM,YAAY,WAAW,SAAS;AAGtC,MAAI,eAAe,WAAW;AAE5B,QAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,MAAG,eAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC7C;AAGA,UAAM,WAAgB,gBAAS,GAAG,SAAS;AAC3C,UAAM,cAAmB,YAAK,WAAW,QAAQ;AAGjD,IAAG,gBAAW,GAAG,WAAW,WAAW;AAEvC,YAAQ,IAAI,UAAU,KAAK,kBAAkB,UAAU,WAAM,SAAS,EAAE,CAAC;AAAA,EAC3E;AACF;AAEA,eAAe,YAAY,gBAAqB,OAA2B;AACzE,MAAI;AACF,UAAM,SAAc,YAAK,MAAM,QAAQ,MAAM;AAC7C,QAAI,CAAI,gBAAW,MAAM,GAAG;AAC1B,MAAG,eAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AAEA,UAAM,UAAe,YAAK,QAAQ,gBAAgB;AAClD,UAAM,UAAU,GAAG,KAAK,UAAU,cAAc,CAAC;AAAA;AAEjD,IAAG,oBAAe,SAAS,OAAO;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AACF;AAxWA,IAKAC,MACAC,QACAC;AAPA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAH,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AAuBgB;AAwCD;AA4NN;AAcM,WAAAH,yBAAA;AAiCA;AAAA;AAAA;;;ACnUR,SAAS,kBAA2B;AACzC,QAAM,MAAM,IAAI,2BAAQ,IAAI;AAE5B,MACG,YAAY,kDAAkD,EAC9D,MAAM,KAAK,EACX,WAAW,sBAAsB,CAAC,EAClC,WAAW,oBAAoB,CAAC,EAChC,WAAW,oBAAoB,CAAC,EAChC,WAAW,sBAAsB,CAAC,EAClC,WAAW,uBAAuB,CAAC,EACnC,WAAW,sBAAsB,CAAC,EAClC,WAAW,qBAAqB,CAAC,EACjC,WAAW,qBAAqB,CAAC,EACjC,WAAW,qBAAqB,CAAC,EACjC,WAAW,4BAA4B,CAAC,EACxC,WAAW,oBAAoB,CAAC,EAChC,WAAW,uBAAuB,CAAC;AAEtC,SAAO;AACT;AAvCA,IAKAK;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB;AACA;AACA;AACA,IAAAC;AACA,IAAAC;AACA;AACA,IAAAC;AACA;AACA;AACA,IAAAC;AACA;AACA,IAAAC;AAEgB;AAAA;AAAA;;;ACnBhB,+BACAC,iBACAC,mBAEa;AAJb;AAAA;AAAA;AAAA;AAAA,gCAAyB;AACzB,IAAAD,kBAAe;AACf,IAAAC,oBAAiB;AAEV,IAAM,cAAN,MAAM,YAAW;AAAA;AAAA;AAAA;AAAA,MAItB,OAAe,iBAAyB;AACtC,YAAI,UAAU,QAAQ,IAAI;AAC1B,eAAO,YAAY,kBAAAC,QAAK,QAAQ,OAAO,GAAG;AACxC,cAAI,gBAAAC,QAAG,WAAW,kBAAAD,QAAK,KAAK,SAAS,MAAM,CAAC,GAAG;AAC7C,mBAAO;AAAA,UACT;AACA,oBAAU,kBAAAA,QAAK,QAAQ,OAAO;AAAA,QAChC;AACA,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,kBAA2B;AAChC,YAAI;AACF,kDAAS,2BAA2B,EAAE,OAAO,SAAS,CAAC;AACvD,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,wBAAiC;AACtC,YAAI;AACF,gBAAM,aAAS,oCAAS,0BAA0B,EAAE,UAAU,OAAO,CAAC;AACtE,iBAAO,OAAO,KAAK,EAAE,SAAS;AAAA,QAChC,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,mBAA2B;AAChC,YAAI;AACF,qBAAO,oCAAS,6BAA6B,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,QAC1E,QAAQ;AACN,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,UAAU,SAAiB,SAAwB;AACxD,YAAI,CAAC,YAAW,gBAAgB,GAAG;AACjC,gBAAM,IAAI,MAAM,yBAAyB;AAAA,QAC3C;AAEA,cAAM,UAAU,IAAI,OAAO;AAC3B,cAAM,aAAa,WAAW,mBAAmB,OAAO;AAExD,YAAI;AAEF,kDAAS,cAAc,OAAO,IAAI,EAAE,OAAO,SAAS,CAAC;AACrD,gBAAM,IAAI,MAAM,OAAO,OAAO,iBAAiB;AAAA,QACjD,SAAS,QAAQ;AAAA,QAEjB;AAEA,YAAI;AACF,kDAAS,cAAc,OAAO,QAAQ,UAAU,GAAG;AAAA,QACrD,SAAS,OAAO;AACd,gBAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE;AAAA,QAClD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,WAAiB;AACtB,YAAI,CAAC,YAAW,gBAAgB,GAAG;AACjC,gBAAM,IAAI,MAAM,yBAAyB;AAAA,QAC3C;AAEA,YAAI;AACF,kDAAS,iBAAiB;AAAA,QAC5B,SAAS,OAAO;AACd,gBAAM,IAAI,MAAM,wBAAwB,KAAK,EAAE;AAAA,QACjD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,UAAoB;AACzB,YAAI,CAAC,YAAW,gBAAgB,GAAG;AACjC,iBAAO,CAAC;AAAA,QACV;AAEA,YAAI;AACF,gBAAM,aAAS,oCAAS,cAAc,EAAE,UAAU,OAAO,CAAC;AAC1D,iBAAO,OACJ,KAAK,EACL,MAAM,IAAI,EACV,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;AAAA,QAC/B,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,aAA4B;AACjC,YAAI,CAAC,YAAW,gBAAgB,GAAG;AACjC,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,aAAS,oCAAS,kCAAkC,EAAE,UAAU,OAAO,CAAC;AAC9E,iBAAO,OAAO,KAAK;AAAA,QACrB,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,OAAO,SAAiB,OAAwB;AACrD,YAAI,CAAC,YAAW,gBAAgB,GAAG;AACjC,gBAAM,IAAI,MAAM,yBAAyB;AAAA,QAC3C;AAEA,YAAI;AAEF,cAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,uBAAW,QAAQ,OAAO;AACxB,sDAAS,YAAY,IAAI,GAAG;AAAA,YAC9B;AAAA,UACF;AAGA,kDAAS,kBAAkB,OAAO,GAAG;AAAA,QACvC,SAAS,OAAO;AACd,gBAAM,IAAI,MAAM,6BAA6B,KAAK,EAAE;AAAA,QACtD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,gBAAgB,OAAyB;AAC9C,YAAI,CAAC,YAAW,gBAAgB,GAAG;AACjC,iBAAO,CAAC;AAAA,QACV;AAEA,YAAI;AACF,gBAAM,aAAS,oCAAS,WAAW,KAAK,oBAAoB,EAAE,UAAU,OAAO,CAAC;AAChF,iBAAO,OACJ,KAAK,EACL,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AAAA,QACjC,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,UAAU,KAAsB;AACrC,YAAI,CAAC,YAAW,gBAAgB,GAAG;AACjC,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,kDAAS,cAAc,GAAG,IAAI,EAAE,OAAO,SAAS,CAAC;AACjD,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,mBAAkC;AACvC,YAAI,CAAC,YAAW,gBAAgB,GAAG;AACjC,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,aAAS,oCAAS,sCAAsC,EAAE,UAAU,OAAO,CAAC;AAClF,iBAAO,OAAO,KAAK;AAAA,QACrB,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAvMwB;AAAjB,IAAM,aAAN;AAAA;AAAA;;;ACJP,IAKAE,4BACAC,iBACAC,mBAwDa;AA/Db;AAAA;AAAA;AAAA;AAKA,IAAAF,6BAAyB;AACzB,IAAAC,kBAAe;AACf,IAAAC,oBAAiB;AAEjB;AAsDO,IAAM,wBAAN,MAAM,sBAAqB;AAAA,MAIf;AAAA,MACA;AAAA,MAEjB,YAAY,cAAsB,QAAQ,IAAI,GAAG,cAAuB,MAAM;AAC5E,aAAK,cAAc,kBAAAC,QAAK,QAAQ,WAAW;AAC3C,aAAK,cAAc;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,kBAAwC;AAC5C,cAAM,WAAW,KAAK;AAGtB,YAAI,KAAK,eAAe,sBAAqB,MAAM,IAAI,QAAQ,GAAG;AAChE,gBAAM,SAAS,sBAAqB,MAAM,IAAI,QAAQ;AACtD,cAAI,KAAK,IAAI,IAAI,OAAO,YAAY,sBAAqB,WAAW;AAClE,mBAAO,OAAO;AAAA,UAChB;AAAA,QACF;AAEA,cAAM,WAAwB;AAAA,UAC5B,aAAa;AAAA,UACb,yBAAyB;AAAA,UACzB,cAAc;AAAA,UACd,eAAe;AAAA,QACjB;AAEA,cAAM,cAAc,QAAQ,IAAI;AAEhC,YAAI;AAEF,cAAI,gBAAAC,QAAG,WAAW,KAAK,WAAW,GAAG;AACnC,oBAAQ,MAAM,KAAK,WAAW;AAC9B,qBAAS,cAAc,WAAW,gBAAgB;AAAA,UACpD,OAAO;AACL,qBAAS,cAAc;AAAA,UACzB;AAEA,cAAI,CAAC,SAAS,aAAa;AACzB,mBAAO;AAAA,UACT;AAGA,gBAAM,KAAK,oBAAoB,QAAQ;AAGvC,gBAAM,KAAK,sBAAsB,QAAQ;AAGzC,gBAAM,KAAK,oBAAoB,QAAQ;AAGvC,gBAAM,KAAK,qBAAqB,QAAQ;AAGxC,gBAAM,KAAK,mBAAmB,QAAQ;AAGtC,gBAAM,KAAK,mBAAmB,QAAQ;AAGtC,gBAAM,KAAK,0BAA0B,QAAQ;AAG7C,cAAI,KAAK,aAAa;AACpB,kCAAqB,MAAM,IAAI,UAAU;AAAA,cACvC,MAAM;AAAA,cACN,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,KAAK,mCAAmC,KAAK,EAAE;AACvD,iBAAO;AAAA,QACT,UAAE;AAEA,cAAI;AACF,oBAAQ,MAAM,WAAW;AAAA,UAC3B,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,oBAAoB,UAAsC;AACtE,YAAI;AAEF,mBAAS,iBAAiB,WAAW,iBAAiB;AAGtD,mBAAS,iBAAiB,MAAM,KAAK,iBAAiB;AAGtD,mBAAS,0BAA0B,WAAW,sBAAsB;AAGpE,mBAAS,eAAe,MAAM,KAAK,eAAe;AAGlD,mBAAS,mBAAmB,MAAM,KAAK,kBAAkB;AAAA,QAC3D,SAAS,OAAO;AACd,kBAAQ,KAAK,qCAAqC,KAAK,EAAE;AAAA,QAC3D;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,sBAAsB,UAAsC;AACxE,YAAI;AAEF,mBAAS,aAAa,WAAW,iBAAiB;AAElD,cAAI,SAAS,YAAY;AAEvB,qBAAS,iBAAiB,KAAK,uBAAuB,SAAS,UAAU;AACzE,qBAAS,YAAY,KAAK,YAAY,SAAS,UAAU;AAAA,UAC3D;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,KAAK,qCAAqC,KAAK,EAAE;AAAA,QAC3D;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,oBAAoB,UAAsC;AACtE,YAAI;AACF,gBAAM,gBAAgB,MAAM,KAAK,iBAAiB;AAClD,mBAAS,YAAY,cAClB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,CAAC,EACV,IAAI,CAACC,UAASA,MAAK,QAAQ;AAAA,QAChC,SAAS,OAAO;AACd,kBAAQ,KAAK,6BAA6B,KAAK,EAAE;AAAA,QACnD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,qBAAqB,UAAsC;AACvE,YAAI;AACF,gBAAM,aAAa,MAAM,KAAK,iBAAiB;AAC/C,cAAI,WAAW,SAAS,GAAG;AAEzB,kBAAM,eAAe,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAC7E,qBAAS,YAAY,aAAa;AAClC,gBAAI,aAAa,SAAS;AACxB,uBAAS,aAAa,IAAI,aAAa,OAAO;AAAA,YAChD;AAAA,UACF;AAGA,mBAAS,kBAAkB,MAAM,KAAK,qBAAqB;AAAA,QAC7D,SAAS,OAAO;AACd,kBAAQ,KAAK,+BAA+B,KAAK,EAAE;AAAA,QACrD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAAmB,UAAsC;AACrE,YAAI;AACF,mBAAS,eAAe,MAAM,KAAK,gBAAgB;AACnD,mBAAS,eAAe,SAAS,aAC9B,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,gBAAgB,YAAY,IAAI;AAAA,QAC1C,SAAS,OAAO;AACd,kBAAQ,KAAK,kCAAkC,KAAK,EAAE;AAAA,QACxD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAAmB,UAAsC;AACrE,YAAI;AACF,mBAAS,UAAU,MAAM,KAAK,cAAc;AAAA,QAC9C,SAAS,OAAO;AACd,kBAAQ,KAAK,6BAA6B,KAAK,EAAE;AAAA,QACnD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,0BAA0B,UAAsC;AAC5E,YAAI;AAEF,mBAAS,gBAAgB,MAAM,KAAK,UAAU;AAG9C,mBAAS,kBAAkB,MAAM,KAAK,kBAAkB;AAGxD,mBAAS,cAAc,MAAM,KAAK,cAAc;AAAA,QAClD,SAAS,OAAO;AACd,kBAAQ,KAAK,0CAA0C,KAAK,EAAE;AAAA,QAChE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAAoC;AAChD,YAAI;AAEF,gBAAM,iBAAa;AAAA,YACjB;AAAA,YACA,EAAE,UAAU,QAAQ,KAAK,KAAK,YAAY;AAAA,UAC5C,EAAE,KAAK;AAEP,cAAI,YAAY;AACd,mBAAO,WAAW,QAAQ,wBAAwB,EAAE;AAAA,UACtD;AAGA,gBAAM,iBAAiB,CAAC,QAAQ,UAAU,SAAS;AACnD,qBAAW,UAAU,gBAAgB;AACnC,gBAAI;AACF,uDAAS,oCAAoC,MAAM,IAAI;AAAA,gBACrD,OAAO;AAAA,gBACP,KAAK,KAAK;AAAA,cACZ,CAAC;AACD,qBAAO;AAAA,YACT,QAAQ;AAAA,YAAC;AAAA,UACX;AAGA,iBAAO,WAAW,iBAAiB;AAAA,QACrC,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,iBAAkC;AAC9C,YAAI;AACF,gBAAM,YAAQ,qCAAS,6BAA6B;AAAA,YAClD,UAAU;AAAA,YACV,KAAK,KAAK;AAAA,UACZ,CAAC,EAAE,KAAK;AACR,iBAAO,SAAS,OAAO,EAAE,KAAK;AAAA,QAChC,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,oBAAiD;AAC7D,YAAI;AACF,gBAAM,WAAO,qCAAS,2BAA2B;AAAA,YAC/C,UAAU;AAAA,YACV,KAAK,KAAK;AAAA,UACZ,CAAC,EAAE,KAAK;AACR,iBAAO,QAAQ;AAAA,QACjB,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAAuB,KAAqB;AAClD,YAAI,IAAI,WAAW,MAAM,GAAG;AAG1B,gBAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,cAAI,MAAM,UAAU,GAAG;AACrB,kBAAM,OAAO,MAAM,CAAC,EAAE,QAAQ,QAAQ,EAAE;AACxC,kBAAMF,SAAO,MAAM,CAAC,EAAE,QAAQ,UAAU,EAAE;AAC1C,mBAAO,WAAW,IAAI,IAAIA,MAAI;AAAA,UAChC;AAAA,QACF;AAEA,eAAO,IAAI,QAAQ,UAAU,EAAE;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAY,WAA2B;AAC7C,YAAI,UAAU,WAAW,UAAU,GAAG;AACpC,iBAAO;AAAA,QACT;AAEA,eAAO,GAAG,KAAK,uBAAuB,SAAS,CAAC;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAA6C;AACzD,cAAM,cAAc,oBAAI,IAAoB;AAG5C,cAAM,eAAuC;AAAA,UAC3C,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,UAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,OAAO;AAAA,QACT;AAEA,YAAI;AAEF,gBAAM,YAAQ,qCAAS,gBAAgB,EAAE,UAAU,QAAQ,KAAK,KAAK,YAAY,CAAC,EAC/E,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AAE/B,qBAAW,QAAQ,OAAO;AACxB,kBAAM,MAAM,kBAAAA,QAAK,QAAQ,IAAI,EAAE,YAAY;AAC3C,kBAAM,WAAW,aAAa,GAAG;AAEjC,gBAAI,UAAU;AACZ,0BAAY,IAAI,WAAW,YAAY,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,YAChE;AAAA,UACF;AAEA,iBAAO,MAAM,KAAK,YAAY,QAAQ,CAAC,EACpC,IAAI,CAAC,CAAC,UAAUG,MAAK,OAAO,EAAE,UAAU,OAAAA,OAAM,EAAE,EAChD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,QACrC,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAAkD;AAC9D,cAAM,aAAmC,CAAC;AAE1C,cAAM,YAAY;AAAA,UAChB,KAAK,sBAAsB,KAAK,IAAI;AAAA,UACpC,KAAK,sBAAsB,KAAK,IAAI;AAAA,UACpC,KAAK,oBAAoB,KAAK,IAAI;AAAA,UAClC,KAAK,oBAAoB,KAAK,IAAI;AAAA,UAClC,KAAK,kBAAkB,KAAK,IAAI;AAAA,UAChC,KAAK,mBAAmB,KAAK,IAAI;AAAA,UACjC,KAAK,oBAAoB,KAAK,IAAI;AAAA,QACpC;AAEA,mBAAW,YAAY,WAAW;AAChC,cAAI;AACF,kBAAM,WAAW,MAAM,SAAS;AAChC,gBAAI,UAAU;AACZ,yBAAW,KAAK,QAAQ;AAAA,YAC1B;AAAA,UACF,SAAS,QAAQ;AAAA,UAEjB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,wBAA4D;AACxE,cAAM,kBAAkB,kBAAAH,QAAK,KAAK,KAAK,aAAa,cAAc;AAElE,YAAI,CAAC,gBAAAC,QAAG,WAAW,eAAe,GAAG;AACnC,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,cAAc,KAAK,MAAM,gBAAAA,QAAG,aAAa,iBAAiB,MAAM,CAAC;AACvE,gBAAM,OAAO,EAAE,GAAG,YAAY,cAAc,GAAG,YAAY,gBAAgB;AAG3E,gBAAM,WAAW;AAAA,YACf,EAAE,MAAM,WAAW,UAAU,CAAC,MAAM,GAAG,YAAY,IAAI;AAAA,YACvD,EAAE,MAAM,SAAS,UAAU,CAAC,OAAO,GAAG,YAAY,IAAI;AAAA,YACtD,EAAE,MAAM,UAAU,UAAU,CAAC,KAAK,GAAG,YAAY,IAAI;AAAA,YACrD,EAAE,MAAM,WAAW,UAAU,CAAC,eAAe,GAAG,YAAY,IAAI;AAAA,YAChE,EAAE,MAAM,UAAU,UAAU,CAAC,QAAQ,GAAG,YAAY,IAAI;AAAA,YACxD,EAAE,MAAM,WAAW,UAAU,CAAC,SAAS,GAAG,YAAY,IAAI;AAAA,YAC1D,EAAE,MAAM,WAAW,UAAU,CAAC,SAAS,GAAG,YAAY,IAAI;AAAA,YAC1D,EAAE,MAAM,UAAU,UAAU,CAAC,cAAc,GAAG,YAAY,IAAI;AAAA,YAC9D,EAAE,MAAM,WAAW,UAAU,CAAC,MAAM,GAAG,YAAY,IAAI;AAAA,YACvD,EAAE,MAAM,UAAU,UAAU,CAAC,QAAQ,GAAG,YAAY,IAAI;AAAA,YACxD,EAAE,MAAM,YAAY,UAAU,CAAC,UAAU,GAAG,YAAY,IAAI;AAAA,UAC9D;AAEA,qBAAW,WAAW,UAAU;AAC9B,kBAAM,eAAe,QAAQ,SAAS,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC;AAC7D,gBAAI,cAAc;AAChB,oBAAM,UAAU,KAAK,QAAQ,SAAS,CAAC,CAAC;AACxC,qBAAO;AAAA,gBACL,MAAM,QAAQ;AAAA,gBACd,SAAS,mCAAS,QAAQ,UAAU;AAAA,gBACpC,cAAc,CAAC,eAAe;AAAA,gBAC9B,YAAY,QAAQ;AAAA,cACtB;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,wBAA4D;AACxE,cAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,cAAM,eAAe,YAAY;AAAA,UAAO,CAAC,SACvC,gBAAAA,QAAG,WAAW,kBAAAD,QAAK,KAAK,KAAK,aAAa,IAAI,CAAC;AAAA,QACjD;AAEA,YAAI,aAAa,WAAW,GAAG;AAC7B,iBAAO;AAAA,QACT;AAGA,YAAI,gBAAAC,QAAG,WAAW,kBAAAD,QAAK,KAAK,KAAK,aAAa,WAAW,CAAC,GAAG;AAC3D,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,cAAc;AAAA,YACd,YAAY;AAAA,UACd;AAAA,QACF;AAGA,YAAI;AACF,gBAAM,mBAAmB,kBAAAA,QAAK,KAAK,KAAK,aAAa,kBAAkB;AACvE,cAAI,gBAAAC,QAAG,WAAW,gBAAgB,GAAG;AACnC,kBAAM,eAAe,gBAAAA,QAAG,aAAa,kBAAkB,MAAM;AAC7D,gBAAI,aAAa,SAAS,OAAO,GAAG;AAClC,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,cAAc;AAAA,gBACd,YAAY;AAAA,cACd;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc;AAAA,UACd,YAAY;AAAA,QACd;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,sBAA0D;AACtE,cAAM,cAAc,CAAC,WAAW,gBAAgB,kBAAkB;AAClE,cAAM,eAAe,YAAY;AAAA,UAAO,CAAC,SACvC,gBAAAA,QAAG,WAAW,kBAAAD,QAAK,KAAK,KAAK,aAAa,IAAI,CAAC;AAAA,QACjD;AAEA,YAAI,aAAa,WAAW,GAAG;AAC7B,iBAAO;AAAA,QACT;AAGA,YAAI;AACF,gBAAM,UAAU,kBAAAA,QAAK,KAAK,KAAK,aAAa,SAAS;AACrD,cAAI,gBAAAC,QAAG,WAAW,OAAO,GAAG;AAC1B,kBAAM,MAAM,gBAAAA,QAAG,aAAa,SAAS,MAAM;AAC3C,gBAAI,IAAI,SAAS,aAAa,GAAG;AAC/B,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,cAAc;AAAA,gBACd,YAAY;AAAA,cACd;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc;AAAA,UACd,YAAY;AAAA,QACd;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,sBAA0D;AACtE,cAAM,YAAY,kBAAAD,QAAK,KAAK,KAAK,aAAa,YAAY;AAE1D,YAAI,CAAC,gBAAAC,QAAG,WAAW,SAAS,GAAG;AAC7B,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,QAAQ,gBAAAA,QAAG,aAAa,WAAW,MAAM;AAE/C,cAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,YAAY;AAAA,cAC3B,YAAY;AAAA,YACd;AAAA,UACF;AAEA,cAAI,MAAM,SAAS,QAAQ,GAAG;AAC5B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,YAAY;AAAA,cAC3B,YAAY;AAAA,YACd;AAAA,UACF;AAEA,cAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,YAAY;AAAA,cAC3B,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc,CAAC,YAAY;AAAA,UAC3B,YAAY;AAAA,QACd;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,oBAAwD;AACpE,cAAM,YAAY,kBAAAD,QAAK,KAAK,KAAK,aAAa,QAAQ;AAEtD,YAAI,CAAC,gBAAAC,QAAG,WAAW,SAAS,GAAG;AAC7B,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,QAAQ,gBAAAA,QAAG,aAAa,WAAW,MAAM;AAE/C,cAAI,MAAM,SAAS,eAAe,GAAG;AACnC,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,QAAQ;AAAA,cACvB,YAAY;AAAA,YACd;AAAA,UACF;AAEA,cAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,QAAQ;AAAA,cACvB,YAAY;AAAA,YACd;AAAA,UACF;AAEA,cAAI,MAAM,SAAS,OAAO,GAAG;AAC3B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,QAAQ;AAAA,cACvB,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc,CAAC,QAAQ;AAAA,UACvB,YAAY;AAAA,QACd;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,qBAAyD;AACrE,cAAM,eAAe,kBAAAD,QAAK,KAAK,KAAK,aAAa,eAAe;AAEhE,YAAI,CAAC,gBAAAC,QAAG,WAAW,YAAY,GAAG;AAChC,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,WAAW,KAAK,MAAM,gBAAAA,QAAG,aAAa,cAAc,MAAM,CAAC;AACjE,gBAAM,OAAO,EAAE,GAAG,SAAS,SAAS,GAAG,SAAS,aAAa,EAAE;AAE/D,cAAI,KAAK,mBAAmB,GAAG;AAC7B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,eAAe;AAAA,cAC9B,YAAY;AAAA,YACd;AAAA,UACF;AAEA,cAAI,KAAK,0BAA0B,GAAG;AACpC,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,eAAe;AAAA,cAC9B,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc,CAAC,eAAe;AAAA,UAC9B,YAAY;AAAA,QACd;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,sBAA0D;AACtE,cAAM,cAAc,kBAAAD,QAAK,KAAK,KAAK,aAAa,SAAS;AAEzD,YAAI,CAAC,gBAAAC,QAAG,WAAW,WAAW,GAAG;AAC/B,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,UAAU,gBAAAA,QAAG,aAAa,aAAa,MAAM;AAEnD,cAAI,QAAQ,SAAS,OAAO,GAAG;AAC7B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,SAAS;AAAA,cACxB,YAAY;AAAA,YACd;AAAA,UACF;AAEA,cAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,CAAC,SAAS;AAAA,cACxB,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc,CAAC,SAAS;AAAA,UACxB,YAAY;AAAA,QACd;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,uBAAoD;AAChE,cAAM,kBAAkB;AAAA,UACtB,EAAE,MAAM,OAAO,OAAO,CAAC,qBAAqB,cAAc,EAAE;AAAA,UAC5D,EAAE,MAAM,QAAQ,OAAO,CAAC,WAAW,EAAE;AAAA,UACrC,EAAE,MAAM,QAAQ,OAAO,CAAC,gBAAgB,EAAE;AAAA,UAC1C,EAAE,MAAM,OAAO,OAAO,CAAC,WAAW,EAAE;AAAA,UACpC,EAAE,MAAM,OAAO,OAAO,CAAC,kBAAkB,EAAE;AAAA,UAC3C,EAAE,MAAM,UAAU,OAAO,CAAC,SAAS,EAAE;AAAA,UACrC,EAAE,MAAM,UAAU,OAAO,CAAC,aAAa,EAAE;AAAA,UACzC,EAAE,MAAM,YAAY,OAAO,CAAC,eAAe,EAAE;AAAA,UAC7C,EAAE,MAAM,SAAS,OAAO,CAAC,YAAY,EAAE;AAAA,UACvC,EAAE,MAAM,UAAU,OAAO,CAAC,QAAQ,EAAE;AAAA,UACpC,EAAE,MAAM,SAAS,OAAO,CAAC,SAAS,EAAE;AAAA,UACpC,EAAE,MAAM,UAAU,OAAO,CAAC,cAAc,EAAE;AAAA,UAC1C,EAAE,MAAM,WAAW,OAAO,CAAC,SAAS,EAAE;AAAA,QACxC;AAGA,mBAAW,MAAM,iBAAiB;AAChC,cAAI,GAAG,SAAS,MAAO;AACvB,gBAAM,WAAW,GAAG,MAAM,KAAK,CAAC,SAAS,gBAAAA,QAAG,WAAW,kBAAAD,QAAK,KAAK,KAAK,aAAa,IAAI,CAAC,CAAC;AACzF,cAAI,UAAU;AACZ,mBAAO,GAAG;AAAA,UACZ;AAAA,QACF;AAGA,YAAI,gBAAAC,QAAG,WAAW,kBAAAD,QAAK,KAAK,KAAK,aAAa,cAAc,CAAC,GAAG;AAC9D,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,kBAA6C;AACzD,YAAI;AACF,gBAAM,aAAS,qCAAS,8CAA8C;AAAA,YACpE,UAAU;AAAA,YACV,KAAK,KAAK;AAAA,UACZ,CAAC;AAED,gBAAM,iBAAiB,oBAAI,IAA4B;AAEvD,qBAAW,QAAQ,OAAO,MAAM,IAAI,GAAG;AACrC,gBAAI,CAAC,KAAK,KAAK,EAAG;AAElB,kBAAM,CAAC,MAAM,OAAO,IAAI,IAAI,KAAK,MAAM,GAAG;AAC1C,gBAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAM;AAE9B,kBAAM,MAAM,GAAG,IAAI,IAAI,KAAK;AAE5B,gBAAI,eAAe,IAAI,GAAG,GAAG;AAC3B,oBAAM,cAAc,eAAe,IAAI,GAAG;AAC1C,0BAAY;AACZ,0BAAY,cAAc;AAAA,YAC5B,OAAO;AACL,6BAAe,IAAI,KAAK;AAAA,gBACtB;AAAA,gBACA;AAAA,gBACA,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,aAAa;AAAA,cACf,CAAC;AAAA,YACH;AAAA,UACF;AAEA,iBAAO,MAAM,KAAK,eAAe,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAAA,QACjF,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,gBAA6C;AACzD,cAAM,eAAe;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,mBAAW,QAAQ,cAAc;AAC/B,gBAAM,cAAc,kBAAAA,QAAK,KAAK,KAAK,aAAa,IAAI;AACpD,cAAI,gBAAAC,QAAG,WAAW,WAAW,GAAG;AAC9B,gBAAI;AACF,oBAAM,UAAU,gBAAAA,QAAG,aAAa,aAAa,MAAM;AACnD,qBAAO,KAAK,aAAa,OAAO;AAAA,YAClC,QAAQ;AAAA,YAAC;AAAA,UACX;AAAA,QACF;AAGA,cAAM,kBAAkB,kBAAAD,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,YAAI,gBAAAC,QAAG,WAAW,eAAe,GAAG;AAClC,cAAI;AACF,kBAAM,cAAc,KAAK,MAAM,gBAAAA,QAAG,aAAa,iBAAiB,MAAM,CAAC;AACvE,gBAAI,YAAY,SAAS;AACvB,qBAAO,YAAY;AAAA,YACrB;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAa,SAAyB;AAC5C,cAAM,eAAe,QAAQ,YAAY;AAEzC,cAAM,WAAW;AAAA,UACf,EAAE,MAAM,OAAO,UAAU,CAAC,eAAe,KAAK,EAAE;AAAA,UAChD,EAAE,MAAM,cAAc,UAAU,CAAC,kBAAkB,YAAY,EAAE;AAAA,UACjE,EAAE,MAAM,WAAW,UAAU,CAAC,8BAA8B,SAAS,EAAE;AAAA,UACvE,EAAE,MAAM,WAAW,UAAU,CAAC,8BAA8B,SAAS,EAAE;AAAA,UACvE,EAAE,MAAM,gBAAgB,UAAU,CAAC,gBAAgB,cAAc,EAAE;AAAA,UACnE,EAAE,MAAM,gBAAgB,UAAU,CAAC,gBAAgB,cAAc,EAAE;AAAA,UACnE,EAAE,MAAM,OAAO,UAAU,CAAC,eAAe,KAAK,EAAE;AAAA,UAChD,EAAE,MAAM,YAAY,UAAU,CAAC,iCAAiC,UAAU,EAAE;AAAA,UAC5E,EAAE,MAAM,YAAY,UAAU,CAAC,iCAAiC,UAAU,EAAE;AAAA,UAC5E,EAAE,MAAM,WAAW,UAAU,CAAC,0BAA0B,SAAS,EAAE;AAAA,UACnE,EAAE,MAAM,WAAW,UAAU,CAAC,oBAAoB,KAAK,EAAE;AAAA,UACzD,EAAE,MAAM,aAAa,UAAU,CAAC,WAAW,EAAE;AAAA,QAC/C;AAEA,mBAAW,WAAW,UAAU;AAC9B,gBAAM,cAAc,QAAQ,SAAS,KAAK,CAAC,YAAY,aAAa,SAAS,OAAO,CAAC;AACrF,cAAI,aAAa;AACf,mBAAO,QAAQ;AAAA,UACjB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,YAA8B;AAC1C,cAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,eAAO,YAAY,KAAK,CAAC,SAAS,gBAAAA,QAAG,WAAW,kBAAAD,QAAK,KAAK,KAAK,aAAa,IAAI,CAAC,CAAC;AAAA,MACpF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,oBAAiD;AAC7D,YAAI;AACF,gBAAM,aAAS,qCAAS,yBAAyB,EAAE,UAAU,QAAQ,KAAK,KAAK,YAAY,CAAC;AAE5F,gBAAM,YAAY,OAAO,MAAM,oBAAoB;AACnD,cAAI,WAAW;AACb,mBAAO,UAAU,CAAC;AAAA,UACpB;AAAA,QACF,QAAQ;AAEN,cAAI;AACF,kBAAM,aAAS,qCAAS,WAAW,KAAK,WAAW,mCAAmC;AAAA,cACpF,UAAU;AAAA,YACZ,CAAC;AACD,mBAAO,OAAO,MAAM,GAAI,EAAE,CAAC;AAAA,UAC7B,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,gBAA6C;AACzD,YAAI;AACF,gBAAM,aAAS,qCAAS,wBAAwB,EAAE,UAAU,QAAQ,KAAK,KAAK,YAAY,CAAC;AAC3F,iBAAO,SAAS,OAAO,KAAK,GAAG,EAAE;AAAA,QACnC,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,2BACJ,aAC6B;AAC7B,cAAM,WAAW,MAAM,KAAK,gBAAgB;AAE5C,eAAO;AAAA;AAAA,UAEL,OAAO,YAAY,SAAS;AAAA,UAC5B,aAAa,YAAY,eAAe;AAAA,UACxC,QAAQ,YAAY,UAAU;AAAA,UAC9B,UAAU,YAAY,YAAY;AAAA,UAClC,UAAU,YAAY,YAAY;AAAA,UAClC,cAAc,YAAY,iBAAgB,oBAAI,KAAK,GAAE,YAAY;AAAA,UACjE,cAAc,YAAY,iBAAgB,oBAAI,KAAK,GAAE,YAAY;AAAA,UACjE,kBAAkB,YAAY,oBAAoB;AAAA,UAClD,eAAe,YAAY,iBAAiB;AAAA,UAC5C,YAAY,YAAY,cAAc,CAAC;AAAA,UACvC,aAAa,YAAY,eAAe;AAAA,UACxC,YAAY,YAAY,cAAc;AAAA,UACtC,MAAM;AAAA,UACN,MAAM,YAAY,QAAQ,YAAY,SAAS;AAAA;AAAA,UAG/C,YAAY,SAAS;AAAA,UACrB,YAAY,SAAS;AAAA,UACrB,gBAAgB,SAAS;AAAA,UACzB,WAAW,SAAS;AAAA,UACpB,gBAAgB,SAAS;AAAA,UACzB,WAAW,SAAS;AAAA,UACpB,WAAW,SAAS;AAAA,UACpB,cAAc,SAAS;AAAA,UACvB,SAAS,SAAS;AAAA;AAAA,UAGlB,gBAAgB,YAAY;AAAA,UAC5B,mBAAmB,YAAY;AAAA,UAC/B,uBAAuB,YAAY;AAAA,UACnC,kBAAkB,YAAY;AAAA,UAC9B,MAAM,YAAY;AAAA,UAClB,cAAc,YAAY;AAAA,UAC1B,WAAW,YAAY;AAAA;AAAA,UAGvB,WAAW,YAAY;AAAA,UACvB,eAAe,YAAY;AAAA,UAC3B,YAAY,YAAY;AAAA,UACxB,mBAAmB,YAAY;AAAA,UAC/B,eAAe,YAAY;AAAA,UAC3B,kBAAkB,YAAY;AAAA,UAC9B,iBAAiB,YAAY;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,aAAmB;AACxB,8BAAqB,MAAM,MAAM;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,gBAAqD;AAC1D,eAAO;AAAA,UACL,MAAM,sBAAqB,MAAM;AAAA,UACjC,SAAS,MAAM,KAAK,sBAAqB,MAAM,KAAK,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAv+BkC;AAChC,kBADW,uBACa,aAAY,IAAI,KAAK;AAC7C;AAAA,kBAFW,uBAEI,SAAQ,oBAAI,IAAsD;AAF5E,IAAM,uBAAN;AAAA;AAAA;;;ACvCA,SAAS,6BAAsC;AACpD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,oDAAoD,EAChE,SAAS,UAAU,8CAA8C,EACjE,OAAO,iBAAiB,mDAAmD,EAC3E,OAAO,4BAA4B,qBAAqB,EACxD,OAAO,sBAAsB,gBAAgB,EAC7C,OAAO,yBAAyB,iBAAiB,EACjD,OAAO,sBAAsB,mBAAmB,EAChD,OAAO,sBAAsB,mCAAmC,EAChE,OAAO,yBAAyB,sCAAsC,EACtE,OAAO,yBAAyB,2BAA2B,SAAS,EACpE,OAAO,0BAA0B,+CAA+C,IAAI,EACpF,OAAO,aAAa,6CAA6C,EACjE,OAAO,OAAO,SAA6B,YAA2B;AACrE,QAAI;AAEF,YAAM,OAAO,WAAW,QAAQ;AAChC,UAAI,CAAC,MAAM;AACT,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,cAAc,MAAM,OAAO;AAAA,IACnC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACvF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,cAAc,MAAc,SAAuC;AAChF,QAAM,iBAAiB,IAAI,sBAAsB;AAGjD,QAAM,eAAe,kBAAkB;AAGvC,QAAM,OAAO,eAAe,eAAe;AAC3C,MAAI,SAAS,UAAU;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAmB,CAAC;AACxB,MAAI,QAAQ,oBAAoB;AAC9B,QAAI;AACF,YAAM,eAAe,IAAI,qBAAqB;AAC9C,oBAAc,MAAM,aAAa,mBAAmB;AACpD,cAAQ;AAAA,QACN,UAAU,KAAK,8BAA8B,YAAY,kBAAkB,YAAY,EAAE;AAAA,MAC3F;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,mCAAmC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC7F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,QAAQ,YACtB,QAAQ,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,IACtD,YAAY,aAAa,CAAC;AAC9B,QAAM,cAAc,QAAQ,cACxB,QAAQ,YAAY,MAAM,GAAG,EAAE,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,IAC5D,CAAC;AAGL,QAAM,gBAAwC;AAAA,IAC5C;AAAA,IACA,aAAa,QAAQ,eAAe,YAAY,eAAe,WAAW,IAAI;AAAA,IAC9E,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,eAAe;AAAA,MACf,SAAS;AAAA,IACX;AAAA,IACA,oBAAoB;AAAA,MAClB,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,aAAa;AAAA,MACb,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,aAAa,QAAQ,eAAe,YAAY,eAAe,WAAW,IAAI;AAAA,IAC9E,YAAY,QAAQ,aAAa,YAAY;AAAA,IAC7C,YAAY,QAAQ,aAAa,YAAY,cAAc,YAAY;AAAA,IACvE,gBAAgB,YAAY;AAAA,IAC5B,WAAW,YAAY;AAAA,IACvB,gBAAgB,YAAY;AAAA,IAC5B;AAAA,IACA,WAAW,QAAQ,aAAa,YAAY;AAAA,IAC5C,cAAc;AAAA,IACd,uBAAuB;AAAA,EACzB;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,0CAA0C,CAAC;AACtE,YAAQ,IAAI,UAAU,MAAM,SAAS,IAAI,EAAE,CAAC;AAC5C,YAAQ,IAAI,UAAU,MAAM,gBAAgB,YAAY,WAAW,EAAE,CAAC;AACtE,YAAQ,IAAI,UAAU,MAAM,eAAe,YAAY,cAAc,SAAS,EAAE,CAAC;AACjF,YAAQ,IAAI,UAAU,MAAM,eAAe,YAAY,cAAc,SAAS,EAAE,CAAC;AACjF,YAAQ,IAAI,UAAU,MAAM,mBAAmB,YAAY,kBAAkB,SAAS,EAAE,CAAC;AACzF,YAAQ,IAAI,UAAU,MAAM,cAAc,YAAY,aAAa,SAAS,EAAE,CAAC;AAC/E,YAAQ,IAAI,UAAU,MAAM,cAAc,UAAU,KAAK,IAAI,KAAK,SAAS,EAAE,CAAC;AAC9E,YAAQ,IAAI,UAAU,MAAM,iBAAiB,YAAY,KAAK,IAAI,KAAK,SAAS,EAAE,CAAC;AACnF,YAAQ,IAAI,UAAU,MAAM,aAAa,QAAQ,YAAY,SAAS,EAAE,CAAC;AACzE;AAAA,EACF;AAGA,MAAI;AACF,UAAM,iBAAiB,MAAM,eAAe,cAAc,MAAM,aAAa;AAG7E,UAAM,eAAe,uBAAuB;AAE5C,YAAQ,IAAI,UAAU,QAAQ,YAAY,IAAI,yBAAyB,CAAC;AACxE,YAAQ,IAAI,UAAU,KAAK,iBAAiB,eAAe,MAAM,WAAW,EAAE,CAAC;AAC/E,YAAQ,IAAI,UAAU,KAAK,eAAe,eAAe,MAAM,SAAS,EAAE,CAAC;AAC3E,YAAQ,IAAI,UAAU,KAAK,eAAe,eAAe,MAAM,SAAS,EAAE,CAAC;AAE3E,QAAI,YAAY,YAAY;AAC1B,cAAQ,IAAI,UAAU,KAAK,eAAe,YAAY,UAAU,EAAE,CAAC;AAAA,IACrE;AAEA,QAAI,YAAY,gBAAgB;AAC9B,cAAQ,IAAI,UAAU,KAAK,eAAe,YAAY,cAAc,EAAE,CAAC;AAAA,IACzE;AAEA,QAAI,UAAU,SAAS,GAAG;AACxB,cAAQ,IAAI,UAAU,KAAK,cAAc,UAAU,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IAClE;AAEA,QAAI,YAAY,WAAW;AACzB,cAAQ,IAAI,UAAU,KAAK,cAAc,YAAY,SAAS,EAAE,CAAC;AAAA,IACnE;AAEA,YAAQ;AAAA,MACN,UAAU;AAAA,QACR;AAAA,WAAc,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IACvF;AAAA,EACF;AACF;AAjMA,IAKAI;AALA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AAExB;AACA;AACA;AAegB;AAuCD;AAAA;AAAA;;;AChDR,SAAS,2BAAoC;AAClD,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,6BAA6B,EACzC,MAAM,IAAI,EACV,OAAO,uBAAuB,qCAAqC,OAAO,EAC1E,OAAO,uBAAuB,0BAA0B,KAAK,EAC7D,OAAO,sBAAsB,qCAAqC,KAAK,EACvE,OAAO,OAAO,YAAyB;AACtC,QAAI;AACF,YAAM,aAAa,OAAO;AAAA,IAC5B,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACtF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,aAAa,SAAqC;AAC/D,QAAM,iBAAiB,IAAI,sBAAsB;AAGjD,QAAM,eAAe,kBAAkB;AAGvC,QAAM,OAAO,eAAe,eAAe;AAC3C,MAAI,SAAS,UAAU;AACrB,YAAQ,IAAI,UAAU,KAAK,6DAA6D,CAAC;AACzF,YAAQ;AAAA,MACN,UAAU,KAAK,oEAAoE;AAAA,IACrF;AACA;AAAA,EACF;AAGA,QAAM,WAAW,eAAe,aAAa;AAC7C,QAAM,iBAAiB,eAAe,kBAAkB;AACxD,QAAM,iBAAiB,iDAAgB,QAAQ;AAE/C,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,UAAU,KAAK,oBAAoB,CAAC;AAChD,YAAQ;AAAA,MACN,UAAU,KAAK,uEAAuE;AAAA,IACxF;AACA;AAAA,EACF;AAGA,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACH,cAAQ;AAAA,QACN,KAAK;AAAA,UACH;AAAA,YACE,iBAAiB;AAAA,YACjB,UAAU,SAAS,IAAI,CAAC,UAAU;AAAA,cAChC;AAAA,cACA,YAAY,SAAS;AAAA,YACvB,EAAE;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,eAAS,QAAQ,CAAC,YAAY;AAC5B,cAAM,SAAS,YAAY,iBAAiB,MAAM;AAClD,gBAAQ,IAAI,GAAG,MAAM,IAAI,OAAO,EAAE;AAAA,MACpC,CAAC;AACD;AAAA,IACF;AACE,cAAQ,IAAI,UAAU,KAAK;AAAA,gCAA4B,SAAS,MAAM,GAAG,CAAC;AAC1E,cAAQ,IAAI,UAAU,KAAK,oBAAoB,kBAAkB,eAAe,EAAE,CAAC;AACnF,cAAQ,IAAI;AAEZ,eAAS,QAAQ,CAAC,SAAS,UAAU;AACnC,cAAM,SAAS,YAAY,iBAAiB,cAAO;AACnD,cAAM,SAAS,YAAY,iBAAiB,UAAU,QAAQ,WAAW,IAAI;AAC7E,gBAAQ,IAAI,GAAG,MAAM,IAAI,QAAQ,CAAC,KAAK,OAAO,IAAI,MAAM,EAAE;AAAA,MAC5D,CAAC;AAED,cAAQ,IAAI;AACZ,cAAQ;AAAA,QACN,UAAU,KAAK,2EAA2E;AAAA,MAC5F;AACA,cAAQ,IAAI,UAAU,KAAK,gEAAgE,CAAC;AAC5F;AAAA,EACJ;AAGA,MAAI,QAAQ,aAAa;AACvB,YAAQ,IAAI,UAAU,KAAK,8BAAuB,CAAC;AACnD,YAAQ,IAAI,UAAU,KAAK,SAAS,KAAK,YAAY,CAAC,EAAE,CAAC;AACzD,YAAQ;AAAA,MACN,UAAU,KAAK,wBAAuB,iDAAgB,QAAQ,gBAAe,SAAS,EAAE;AAAA,IAC1F;AACA,YAAQ,IAAI,UAAU,KAAK,mBAAmB,iDAAgB,QAAQ,WAAW,EAAE,CAAC;AAAA,EACtF;AACF;AAzHA,IAKAE;AALA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB;AACA;AAQgB;AAyBD;AAAA;AAAA;;;ACvBR,SAAS,2BAAoC;AAClD,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,2CAA2C,EACvD,SAAS,UAAU,4CAA4C,EAC/D,OAAO,uBAAuB,8BAA8B,OAAO,EACnE,OAAO,oBAAoB,2BAA2B,KAAK,EAC3D,OAAO,qBAAqB,8BAA8B,KAAK,EAC/D,OAAO,oBAAoB,4BAA4B,KAAK,EAC5D,OAAO,OAAO,SAA6B,YAAyB;AACnE,QAAI;AACF,YAAM,YAAY,SAAS,OAAO;AAAA,IACpC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACrF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,YAAY,MAA0B,SAAqC;AACxF,QAAM,iBAAiB,IAAI,sBAAsB;AAGjD,QAAM,eAAe,kBAAkB;AAGvC,QAAM,OAAO,eAAe,eAAe;AAC3C,MAAI,SAAS,UAAU;AACrB,YAAQ,IAAI,UAAU,KAAK,+BAA+B,CAAC;AAC3D,UAAM,sBAAsB,gBAAgB,OAAO;AACnD;AAAA,EACF;AAGA,QAAM,iBAAiB,eAAe,kBAAkB;AACxD,QAAM,gBAAgB,SAAQ,iDAAgB,QAAQ;AAEtD,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAGA,QAAM,WAAW,eAAe,aAAa;AAC7C,MAAI,CAAC,SAAS,SAAS,aAAa,GAAG;AACrC,UAAM,IAAI;AAAA,MACR,YAAY,aAAa,oCAAoC,SAAS,KAAK,IAAI,CAAC;AAAA,IAClF;AAAA,EACF;AAGA,MAAI,mBAAkB,iDAAgB,QAAQ,iBAAgB;AAC5D,UAAM,eAAe,cAAc,aAAa;AAAA,EAClD;AAEA,QAAM,iBAAiB,eAAe,kBAAkB;AACxD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAGA,QAAM,gBAAgB,eAAe;AACrC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,QAAQ,eAAe;AAG7B,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN;AAAA,IACA,cAAc,MAAM;AAAA,IACpB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,YAAQ,6BAAW,MAAM,WAAW,IAAI,WAAW;AAAA,IACnD;AAAA,EACF;AAGA,MAAI,QAAa,CAAC;AAClB,MAAI,QAAQ,WAAW;AACrB,YAAQ,MAAM,gBAAgB,KAAK;AAAA,EACrC;AAGA,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK,QAAQ;AACX,YAAM,aAAkB;AAAA,QACtB,SAAS;AAAA,QACT;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW;AACrB,mBAAW,aAAa;AAAA,MAC1B;AAEA,UAAI,QAAQ,YAAY;AACtB,mBAAW,gBAAgB;AAAA,MAC7B;AAEA,cAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC/C;AAAA,IACF;AAAA,IACA;AACE,cAAQ,IAAI,UAAU,KAAK;AAAA,qBAAiB,aAAa,EAAE,CAAC;AAC5D,cAAQ,IAAI,UAAU,KAAK,SAAS,KAAK,YAAY,CAAC,EAAE,CAAC;AACzD,cAAQ;AAAA,QACN,UAAU,KAAK,WAAW,YAAY,WAAW,WAAW,kBAAa,iBAAY,EAAE;AAAA,MACzF;AACA,cAAQ,IAAI,UAAU,KAAK,SAAS,MAAM,WAAW,EAAE,CAAC;AACxD,cAAQ,IAAI,UAAU,KAAK,WAAW,MAAM,SAAS,EAAE,CAAC;AACxD,cAAQ,IAAI,UAAU,KAAK,UAAU,MAAM,SAAS,EAAE,CAAC;AAEvD,UAAI,QAAQ,eAAe;AACzB,gBAAQ,IAAI,UAAU,KAAK,kCAA2B,CAAC;AACvD,gBAAQ,IAAI,UAAU,KAAK,gCAAiB,MAAM,QAAQ,EAAE,CAAC;AAC7D,gBAAQ,IAAI,UAAU,KAAK,iCAAkB,MAAM,SAAS,EAAE,CAAC;AAC/D,gBAAQ,IAAI,UAAU,KAAK,gCAAiB,MAAM,QAAQ,EAAE,CAAC;AAC7D,gBAAQ,IAAI,UAAU,KAAK,8BAAe,MAAM,MAAM,EAAE,CAAC;AACzD,gBAAQ,IAAI,UAAU,KAAK,oCAAqB,MAAM,YAAY,EAAE,CAAC;AAAA,MACvE;AAEA,UAAI,QAAQ,aAAa,OAAO;AAC9B,gBAAQ,IAAI,UAAU,KAAK,iCAA0B,CAAC;AACtD,gBAAQ,IAAI,UAAU,KAAK,aAAa,MAAM,SAAS,CAAC,EAAE,CAAC;AAC3D,gBAAQ,IAAI,UAAU,KAAK,cAAc,MAAM,UAAU,CAAC,EAAE,CAAC;AAC7D,gBAAQ,IAAI,UAAU,KAAK,aAAa,MAAM,SAAS,CAAC,EAAE,CAAC;AAC3D,gBAAQ,IAAI,UAAU,KAAK,WAAW,MAAM,OAAO,CAAC,EAAE,CAAC;AACvD,gBAAQ,IAAI,UAAU,KAAK,mBAAmB,MAAM,SAAS,CAAC,EAAE,CAAC;AAAA,MACnE;AAEA,UAAI,QAAQ,YAAY;AACtB,gBAAQ,IAAI,UAAU,KAAK,gCAAsB,CAAC;AAClD,gBAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,OAAO,EAAE,CAAC;AAC3D,gBAAQ,IAAI,UAAU,KAAK,wBAAwB,OAAO,oBAAoB,SAAS,EAAE,CAAC;AAC1F,gBAAQ;AAAA,UACN,UAAU,KAAK,sBAAsB,OAAO,mBAAmB,cAAc,EAAE;AAAA,QACjF;AACA,gBAAQ,IAAI,UAAU,KAAK,mBAAmB,OAAO,mBAAmB,WAAW,EAAE,CAAC;AACtF,gBAAQ,IAAI,UAAU,KAAK,oBAAoB,OAAO,mBAAmB,YAAY,EAAE,CAAC;AACxF,gBAAQ,IAAI,UAAU,KAAK,mBAAmB,OAAO,mBAAmB,WAAW,EAAE,CAAC;AACtF,YAAI,OAAO,mBAAmB,WAAW;AACvC,kBAAQ,IAAI,UAAU,KAAK,iBAAiB,OAAO,mBAAmB,SAAS,EAAE,CAAC;AAAA,QACpF;AAAA,MACF;AAEA,cAAQ,IAAI,UAAU,KAAK,+DAA+D,CAAC;AAC3F,cAAQ,IAAI,UAAU,KAAK,iDAAiD,CAAC;AAC7E;AAAA,EACJ;AACF;AAEA,eAAe,sBACb,gBACA,SACe;AACf,QAAM,iBAAiB,eAAe,kBAAkB;AACxD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,QAAM,QAAQ,eAAe;AAC7B,QAAM,SAAS,eAAe,cAAc,UAAU;AAEtD,UAAQ,IAAI,UAAU,KAAK;AAAA,8BAA0B,CAAC;AACtD,UAAQ,IAAI,UAAU,KAAK,SAAS,MAAM,WAAW,EAAE,CAAC;AACxD,UAAQ,IAAI,UAAU,KAAK,WAAW,MAAM,SAAS,EAAE,CAAC;AACxD,UAAQ,IAAI,UAAU,KAAK,UAAU,MAAM,SAAS,EAAE,CAAC;AAEvD,MAAI,QAAQ,WAAW;AACrB,UAAM,QAAQ,MAAM,gBAAgB,KAAK;AACzC,YAAQ,IAAI,UAAU,KAAK,iCAA0B,CAAC;AACtD,YAAQ,IAAI,UAAU,KAAK,aAAa,MAAM,SAAS,CAAC,EAAE,CAAC;AAC3D,YAAQ,IAAI,UAAU,KAAK,cAAc,MAAM,UAAU,CAAC,EAAE,CAAC;AAC7D,YAAQ,IAAI,UAAU,KAAK,aAAa,MAAM,SAAS,CAAC,EAAE,CAAC;AAC3D,YAAQ,IAAI,UAAU,KAAK,WAAW,MAAM,OAAO,CAAC,EAAE,CAAC;AACvD,YAAQ,IAAI,UAAU,KAAK,mBAAmB,MAAM,SAAS,CAAC,EAAE,CAAC;AAAA,EACnE;AAEA,MAAI,QAAQ,YAAY;AACtB,YAAQ,IAAI,UAAU,KAAK,gCAAsB,CAAC;AAClD,YAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,OAAO,EAAE,CAAC;AAC3D,YAAQ,IAAI,UAAU,KAAK,wBAAwB,OAAO,oBAAoB,SAAS,EAAE,CAAC;AAC1F,YAAQ,IAAI,UAAU,KAAK,sBAAsB,OAAO,mBAAmB,cAAc,EAAE,CAAC;AAAA,EAC9F;AACF;AAEA,eAAe,gBAAgB,OAA0B;AACvD,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AAEA,MAAI;AACF,YAAI,6BAAW,MAAM,QAAQ,GAAG;AAC9B,YAAM,YAAQ,8BAAY,MAAM,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,IACnF;AAEA,YAAI,6BAAW,MAAM,SAAS,GAAG;AAC/B,YAAM,aAAS,8BAAY,MAAM,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,IACrF;AAEA,YAAI,6BAAW,MAAM,QAAQ,GAAG;AAC9B,YAAM,YAAQ,8BAAY,MAAM,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,IACnF;AAEA,YAAI,6BAAW,MAAM,MAAM,GAAG;AAC5B,YAAM,UAAM,8BAAY,MAAM,MAAM,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,IAC/E;AAEA,UAAM,QAAQ,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ,MAAM;AAAA,EACjE,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC3F;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AApPA,IAKAE,kBACAC;AANA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAKA,IAAAF,mBAAwC;AACxC,IAAAC,qBAAwB;AACxB;AACA;AASgB;AA0BD;AAkIA;AAmCA;AAAA;AAAA;;;AClMR,SAAS,6BAAsC;AACpD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,+BAA+B,EAC3C,SAAS,UAAU,2BAA2B,EAC9C,OAAO,gBAAgB,uCAAuC,KAAK,EACnE,OAAO,eAAe,iDAAiD,KAAK,EAC5E,OAAO,OAAO,MAAc,YAA2B;AACtD,QAAI;AACF,YAAM,cAAc,MAAM,OAAO;AAAA,IACnC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACvF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,cAAc,MAAc,SAAuC;AAChF,QAAM,iBAAiB,IAAI,sBAAsB;AAGjD,QAAM,eAAe,kBAAkB;AAGvC,QAAM,OAAO,eAAe,eAAe;AAC3C,MAAI,SAAS,UAAU;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,eAAe,aAAa;AAC7C,QAAM,iBAAiB,eAAe,kBAAkB;AACxD,QAAM,iBAAiB,iDAAgB,QAAQ;AAG/C,MAAI,mBAAmB,MAAM;AAC3B,YAAQ,IAAI,UAAU,KAAK,uBAAuB,IAAI,IAAI,CAAC;AAC3D;AAAA,EACF;AAGA,MAAI,CAAC,SAAS,SAAS,IAAI,GAAG;AAC5B,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,UAAU,KAAK,YAAY,IAAI,kCAAkC,CAAC;AAC9E,YAAM,eAAe,cAAc,IAAI;AACvC,cAAQ,IAAI,UAAU,QAAQ,YAAY,IAAI,4BAA4B,CAAC;AAC3E;AAAA,IACF,OAAO;AACL,YAAM,IAAI;AAAA,QACR,YAAY,IAAI,oCAAoC,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,iBAAiB,MAAM,eAAe,cAAc,IAAI;AAG9D,UAAM,eAAe,uBAAuB;AAG5C,UAAM,aAAa,eAAe,gBAAgB;AAClD,QAAI,CAAC,WAAW,SAAS,CAAC,QAAQ,OAAO;AACvC,cAAQ,MAAM,UAAU,MAAM,YAAY,IAAI,0BAA0B,CAAC;AACzE,iBAAW,OAAO,QAAQ,CAAC,UAAU,QAAQ,MAAM,UAAU,MAAM,YAAO,KAAK,EAAE,CAAC,CAAC;AACnF,cAAQ,MAAM,UAAU,MAAM,+BAA+B,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,WAAW,SAAS,SAAS,GAAG;AAClC,cAAQ,IAAI,UAAU,QAAQ,uBAAuB,CAAC;AACtD,iBAAW,SAAS,QAAQ,CAAC,YAAY,QAAQ,IAAI,UAAU,QAAQ,YAAO,OAAO,EAAE,CAAC,CAAC;AAAA,IAC3F;AAGA,YAAQ,IAAI,UAAU,QAAQ,wBAAwB,IAAI,IAAI,CAAC;AAG/D,UAAM,QAAQ,eAAe;AAC7B,YAAQ,IAAI,UAAU,KAAK,iBAAiB,MAAM,WAAW,EAAE,CAAC;AAChE,YAAQ,IAAI,UAAU,KAAK,eAAe,MAAM,SAAS,EAAE,CAAC;AAC5D,YAAQ,IAAI,UAAU,KAAK,eAAe,MAAM,SAAS,EAAE,CAAC;AAG5D,UAAM,QAAQ,MAAM,cAAc,KAAK;AACvC,QAAI,MAAM,QAAQ,GAAG;AACnB,cAAQ,IAAI,UAAU,KAAK;AAAA,uBAAmB,CAAC;AAC/C,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,aAAa,MAAM,KAAK,aAAa,MAAM,MAAM,YAAY,MAAM,KAAK,UAAU,MAAM,GAAG;AAAA,QAC7F;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,UAAU,KAAK,4DAA4D,CAAC;AAAA,EAC1F,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,gCAAgC,IAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IACpG;AAAA,EACF;AACF;AAEA,eAAe,cAAc,OAA0B;AACrD,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAME,OAAK,MAAM,OAAO,IAAS;AAEjC,QAAIA,KAAG,WAAW,MAAM,QAAQ,GAAG;AACjC,YAAM,QAAQA,KAAG,YAAY,MAAM,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,IACtF;AAEA,QAAIA,KAAG,WAAW,MAAM,SAAS,GAAG;AAClC,YAAM,SAASA,KAAG,YAAY,MAAM,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,IACxF;AAEA,QAAIA,KAAG,WAAW,MAAM,QAAQ,GAAG;AACjC,YAAM,QAAQA,KAAG,YAAY,MAAM,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,IACtF;AAEA,QAAIA,KAAG,WAAW,MAAM,MAAM,GAAG;AAC/B,YAAM,MAAMA,KAAG,YAAY,MAAM,MAAM,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE;AAAA,IAClF;AAEA,UAAM,QAAQ,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ,MAAM;AAAA,EACjE,SAAS,QAAQ;AAAA,EAEjB;AAEA,SAAO;AACT;AAjKA,IAKAC;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB;AACA;AAOgB;AAwBD;AAyFA;AAAA;AAAA;;;ACpHR,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAI,2BAAQ,SAAS;AAEjC,MAAI,YAAY,qCAAqC,EAAE,MAAM,MAAM;AAGnE,MAAI,WAAW,2BAA2B,CAAC;AAC3C,MAAI,WAAW,yBAAyB,CAAC;AACzC,MAAI,WAAW,yBAAyB,CAAC;AACzC,MAAI,WAAW,2BAA2B,CAAC;AAE3C,SAAO;AACT;AAvBA,IAKAC;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB,IAAAC;AACA,IAAAC;AACA,IAAAC;AACA;AAEgB;AAAA;AAAA;;;ACOT,SAAS,sBAA+B;AAC7C,QAAM,UAAU,IAAI,2BAAQ,QAAQ;AAEpC,UACG,YAAY,4EAA4E,EACxF,OAAO,iBAAiB,kDAAkD,EAC1E,OAAO,iBAAiB,0CAA0C,EAClE,OAAO,WAAW,iCAAiC,EACnD,OAAO,WAAW,gDAAgD,EAClE,OAAO,aAAa,+CAA+C,EACnE,OAAO,oBAAoB,oDAAoD,EAC/E,OAAO,mBAAmB,gEAAgE,EAC1F,OAAO,yBAAyB,qDAAqD,EACrF,OAAO,6BAA6B,kDAAkD,EACtF,OAAO,yBAAyB,kCAAkC,EAClE,OAAO,qBAAqB,kCAAkC,EAC9D,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,0BAA0B,4CAA4C,EAC7E,OAAO,2BAA2B,6CAA6C,EAC/E,OAAO,0BAA0B,4CAA4C,EAC7E,OAAO,2BAA2B,6CAA6C,EAC/E,OAAO,2BAA2B,sBAAsB,EACxD,OAAO,2BAA2B,sBAAsB,EACxD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,uBAAuB,0BAA0B,MAAM,EAC9D,OAAO,mBAAmB,+BAA+B,EACzD,OAAO,oBAAoB,yCAAyC,EACpE,OAAO,iBAAiB,wCAAwC,EAChE,OAAO,WAAW,yCAAyC,EAC3D,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,UAAU,oDAAoD,EACrE,OAAO,oBAAoB,0CAA0C,EACrE,OAAO,kBAAkB,sDAAsD,EAC/E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4CF,EACC;AAAA,IACC,OAAO,YA0BD;AAjIZ;AAkIQ,UAAI;AAEF,cAAM,gBAAgB,QAAQ;AAC9B,cAAM,kBAAgB,oDAAe,WAAf,mBAAuB,cAAW,oDAAe,WAAf,mBAAuB;AAG/E,cAAM,gBAAgB,IAAI,cAAc;AACxC,cAAM,SAAS,cAAc,UAAU;AAGvC,cAAM,eAAe,IAAI,aAAa,eAAe,aAAa;AAElE,cAAM,mBAAe,yBAAK,QAAQ,IAAI,GAAG,aAAa,iBAAiB,CAAC;AAExE,YAAI,KAAC,6BAAW,YAAY,GAAG;AAE7B,cAAI,aAAa,cAAc,GAAG;AAChC,yBAAa,qBAAqB;AAClC,oBAAQ,IAAI,uBAAuB;AACnC,yBAAa,qBAAqB,EAAE,QAAQ,CAAC,QAAQ;AACnD,sBAAQ,IAAI,UAAU,UAAU,GAAG,CAAC;AAAA,YACtC,CAAC;AACD,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAEA,kBAAQ;AAAA,YACN,UAAU;AAAA,cACR,MAAM,aAAa,iBAAiB,CAAC;AAAA,YACvC;AAAA,UACF;AACA,kBAAQ,IAAI,UAAU,KAAK,oDAAoD,CAAC;AAChF,kBAAQ;AAAA,YACN,UAAU;AAAA,cACR,+CAA+C,aAAa,iBAAiB,CAAC;AAAA,YAChF;AAAA,UACF;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAGA,YAAI,mCAAS,aAAa;AACxB,gBAAM,qBAAqB,MAAM,yBAAyB,OAAO;AACjE,oBAAU,EAAE,GAAG,SAAS,GAAG,mBAAmB;AAAA,QAChD;AAGA,YAAI,mCAAS,OAAO;AAClB,iBAAOC,cAAa,cAAc,SAAS,QAAQ,YAAY;AAAA,QACjE;AAGA,cAAM,cAAU,YAAAC,SAAI,6BAA6B,EAAE,MAAM;AAEzD,YAAI;AAEF,gBAAM,QAAQ,MAAM,mCAAmC,QAAQ,YAAY;AAE3E,kBAAQ,OAAO;AAGf,gBAAM,UAAU,aAAa,OAAO;AAGpC,cAAI,gBAAgBC,sBAAqB,OAAO,OAAO;AAGvD,cAAI,mCAAS,eAAe;AAC1B,4BAAgB,yBAAyB,aAAa;AAAA,UACxD;AAEA,kBAAQ,OAAO;AAGf,gBAAM,cAAc;AAAA,YAClB;AAAA,aACA,mCAAS,SAAQ;AAAA,aACjB,mCAAS,UAAS;AAAA,UACpB;AACA,gBAAM,iBAAiB,gBAAgB,aAAa,mCAAS,OAAO,mCAAS,MAAM;AAEnF,kBAAQ;AAAA,YACN,SAAS,cAAc,MAAM,SAAS,cAAc,WAAW,MAAM,SAAS,KAAK,MAAM,MAAM,YAAY,EAAE;AAAA,UAC/G;AAGA,gBAAM,cAAa,mCAAS,iBACxB,aAAM,OAAO,eAAe,WAAW,oBACvC,aAAM,OAAO,eAAe,WAAW;AAC3C,kBAAQ,IAAI,UAAU,OAAO,UAAU,CAAC;AAGxC,cAAI,mCAAS,eAAe;AAC1B,oBAAQ;AAAA,cACN,UAAU;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AACA,oBAAQ,IAAI,EAAE;AAAA,UAChB;AAGA,eAAI,mCAAS,WAAU,OAAO;AAC5B,mCAAuB,cAAc,OAAO,QAAQ,YAAY;AAAA,UAClE;AAGA,cAAI,mCAAS,SAAS;AACpB,+BAAmB,cAAc,OAAO,eAAe,QAAQ,YAAY;AAC3E;AAAA,UACF;AAEA,cAAI,cAAc,WAAW,GAAG;AAC9B,oBAAQ,IAAI,UAAU,IAAI,sCAAsC,MAAM,CAAC;AACvE,oBAAQ;AAAA,cACN,UAAU;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AACA;AAAA,UACF;AAGA,cAAI,mCAAS,OAAO;AAClB,oBAAQ,IAAI,UAAU,OAAO,uBAAgB,CAAC;AAC9C,oBAAQ,IAAI,UAAU,YAAY,cAAc,CAAC;AAAA,UACnD,WAAW,mCAAS,SAAS;AAC3B,oBAAQ,IAAI,UAAU,OAAO,wBAAiB,CAAC;AAC/C,+BAAmB,cAAc;AAAA,UACnC,WAAW,mCAAS,SAAS;AAC3B,oBAAQ,IAAI,UAAU,OAAO,yBAAkB,CAAC;AAChD,gCAAoB,cAAc;AAAA,UACpC,OAAO;AACL,oBAAQ,IAAI,UAAU,OAAO,2BAAoB,CAAC;AAClD,+BAAmB,cAAc;AAAA,UACnC;AAGA,cAAI,mCAAS,OAAO;AAClB,oBAAQ,IAAI,UAAU,OAAO,6BAAsB,CAAC;AACpD,sCAA0B,eAAe,KAAK;AAAA,UAChD;AAGA,cAAI,iBAAiB,OAAO,GAAG;AAC7B,iCAAqB,OAAO;AAAA,UAC9B;AAGA,eAAI,mCAAS,WAAS,mCAAS,SAAQ;AACrC,kCAAsB,YAAY,QAAQ,eAAe,QAAQ,OAAO;AAAA,UAC1E;AAGA,cAAI,mCAAS,QAAQ;AACnB,kBAAM,cAAc,eAAe,QAAQ,QAAQ,MAAM;AAAA,UAC3D;AAGA,cAAI,EAAC,mCAAS,YAAW,EAAC,mCAAS,QAAO;AACxC,6BAAiB,eAAe,MAAM;AAAA,UACxC;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,KAAK,wBAAwB;AACrC,gBAAM;AAAA,QACR;AAAA,MACF,SAAS,OAAO;AACd,YAAI,iBAAiB,iBAAiB;AACpC,kBAAQ,MAAM,UAAU,MAAM,MAAM,OAAO,CAAC;AAC5C,cAAI,MAAM,YAAY;AACpB,oBAAQ,IAAI,UAAU,KAAK,aAAM,MAAM,UAAU,EAAE,CAAC;AAAA,UACtD;AACA,eAAI,WAAM,iBAAN,mBAAoB,QAAQ;AAC9B,oBAAQ,IAAI,UAAU,KAAK,gBAAgB,CAAC;AAC5C,kBAAM,aAAa,QAAQ,CAAC,WAAW;AACrC,sBAAQ,IAAI,UAAU,UAAU,KAAK,MAAM,EAAE,CAAC;AAAA,YAChD,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,kBAAQ;AAAA,YACN,UAAU;AAAA,cACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACnF;AAAA,UACF;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;AAGA,eAAe,yBAAyB,iBAAoC;AAC1E,UAAQ,IAAI,UAAU,OAAO,wCAAiC,CAAC;AAE/D,QAAM,UAAU,MAAM,iBAAAC,QAAS,OAAO;AAAA,IACpC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,yCAAkC,OAAO,UAAU;AAAA,QAC3D,EAAE,MAAM,0CAAmC,OAAO,UAAU;AAAA,QAC5D,EAAE,MAAM,sCAA+B,OAAO,UAAU;AAAA,QACxD,EAAE,MAAM,oCAA6B,OAAO,QAAQ;AAAA,MACtD;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,gCAAyB,OAAO,OAAO;AAAA,QAC/C,EAAE,MAAM,6CAAsC,OAAO,cAAc;AAAA,QACnE,EAAE,MAAM,8CAAuC,OAAO,UAAU;AAAA,QAChE,EAAE,MAAM,iCAA4B,OAAO,OAAO;AAAA,MACpD;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,yCAAkC,OAAO,WAAW;AAAA,QAC5D,EAAE,MAAM,sCAA+B,OAAO,OAAO;AAAA,QACrD,EAAE,MAAM,wCAAiC,OAAO,SAAS;AAAA,QACzD,EAAE,MAAM,gCAAyB,OAAO,MAAM;AAAA,MAChD;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,yCAAkC,OAAO,eAAe;AAAA,QAChE,EAAE,MAAM,yCAAkC,OAAO,cAAc;AAAA,QAC/D,EAAE,MAAM,yCAAkC,OAAO,eAAe;AAAA,QAChE,EAAE,MAAM,yCAAkC,OAAO,cAAc;AAAA,QAC/D,EAAE,MAAM,0CAA8B,OAAO,gBAAgB;AAAA,QAC7D,EAAE,MAAM,yBAAkB,OAAO,YAAY;AAAA,MAC/C;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU,wBAAC,UAAkB;AAC3B,YAAI,CAAC,MAAO,QAAO;AACnB,cAAM,MAAM,SAAS,KAAK;AAC1B,YAAI,OAAO,MAAM,GAAG,KAAK,MAAM,EAAG,QAAO;AACzC,eAAO;AAAA,MACT,GALU;AAAA,IAMZ;AAAA,EACF,CAAC;AAGD,QAAM,CAAC,WAAW,SAAS,IAAI,QAAQ,OAAO,MAAM,GAAG;AAEvD,SAAO;AAAA,IACL,SAAS,QAAQ,iBAAiB;AAAA,IAClC,SAAS,QAAQ,iBAAiB;AAAA,IAClC,OAAO,QAAQ,iBAAiB;AAAA,IAChC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ,aAAa,WAAW,IAAI,QAAQ,aAAa,CAAC,IAAI;AAAA,IACtE,UAAU,QAAQ,eAAe,WAAW,IAAI,QAAQ,eAAe,CAAC,IAAI;AAAA,IAC5E,UAAU,QAAQ,kBAAkB;AAAA,IACpC,MAAM,QAAQ,cAAc;AAAA,IAC5B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO,QAAQ,eAAe,QAAQ,eAAe;AAAA,IACrD,QAAQ,sBAAsB,OAAO;AAAA,EACvC;AACF;AAEA,SAAS,sBAAsB,SAAsB;AACnD,QAAM,UAAU,CAAC;AAEjB,MAAI,QAAQ,aAAa,SAAS,GAAG;AACnC,YAAQ,KAAK,UAAU,QAAQ,aAAa,KAAK,GAAG,CAAC,EAAE;AAAA,EACzD;AACA,MAAI,QAAQ,eAAe,SAAS,GAAG;AACrC,YAAQ,KAAK,YAAY,QAAQ,eAAe,KAAK,GAAG,CAAC,EAAE;AAAA,EAC7D;AACA,MAAI,QAAQ,gBAAgB;AAC1B,YAAQ,KAAK,YAAY,QAAQ,cAAc,EAAE;AAAA,EACnD;AACA,MAAI,QAAQ,YAAY;AACtB,YAAQ,KAAK,QAAQ,QAAQ,UAAU,EAAE;AAAA,EAC3C;AAEA,SAAO,QAAQ,KAAK,GAAG;AACzB;AAEA,eAAeH,cACb,cACA,SACA,QACA,cACe;AACf,UAAQ,IAAI,UAAU,KAAK,gEAAoD,CAAC;AAChF,UAAQ,IAAI,UAAU,KAAK,sBAAsB,CAAC;AAElD,MAAI,WAAW;AAEf,QAAM,gBAAgB,mCAAY;AAChC,QAAI;AAEF,cAAQ,MAAM;AAGd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,aAAM,OAAO,eAAe,WAAW,mBAAkB,oBAAI,KAAK,GAAE,mBAAmB,CAAC;AAAA,QAC1F;AAAA,MACF;AAGA,YAAM,QAAQ,MAAM,mCAAmC,QAAQ,YAAY;AAC3E,YAAM,cAAc,KAAK;AAAA,QACvB,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,QAAQ,CAAC,EAAE;AAAA,MACrD,EAAE,UAAU,GAAG,EAAE;AAEjB,UAAI,gBAAgB,UAAU;AAC5B,cAAM,UAAU,aAAa,OAAO;AACpC,cAAM,gBAAgBE,sBAAqB,OAAO,OAAO;AACzD,cAAM,cAAc;AAAA,UAClB;AAAA,WACA,mCAAS,SAAQ;AAAA,WACjB,mCAAS,UAAS;AAAA,QACpB;AACA,cAAM,iBAAiB,gBAAgB,aAAa,mCAAS,OAAO,mCAAS,MAAM;AAEnF,+BAAuB,cAAc,OAAO,QAAQ,YAAY;AAEhE,YAAI,eAAe,SAAS,GAAG;AAC7B,cAAI,mCAAS,OAAO;AAClB,oBAAQ,IAAI,UAAU,YAAY,cAAc,CAAC;AAAA,UACnD,OAAO;AACL,+BAAmB,cAAc;AAAA,UACnC;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,UAAU,IAAI,kCAAkC,MAAM,CAAC;AAAA,QACrE;AAEA,mBAAW;AACX,gBAAQ,IAAI,UAAU,KAAK,4BAAoB,oBAAI,KAAK,GAAE,mBAAmB,CAAC,EAAE,CAAC;AAAA,MACnF,OAAO;AACL,gBAAQ,IAAI,UAAU,KAAK,qBAAqB,CAAC;AAAA,MACnD;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC/E;AAAA,MACF;AAAA,IACF;AAAA,EACF,GApDsB;AAuDtB,QAAM,cAAc;AAGpB,QAAM,WAAW,YAAY,eAAe,GAAI;AAGhD,UAAQ,GAAG,UAAU,MAAM;AACzB,kBAAc,QAAQ;AACtB,YAAQ,IAAI,UAAU,KAAK,gCAAyB,CAAC;AACrD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;AAEA,eAAe,mCACb,QACA,eAC0B;AAE1B,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AAGxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,QAAQ,oBAAoB,YAAY;AAC9C,QAAM,SAAS,oBAAoB,aAAa;AAChD,QAAM,QAAQ,oBAAoB,YAAY;AAG9C,QAAM,QAAyB,CAAC;AAGhC,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,QAAQ,UAAU,KAAK,MAAM;AAAA,MAC7B,UAAU,YAAY,KAAK,QAAQ;AAAA,MACnC,UAAU,KAAK,aAAa,eAAe,KAAK,WAAW;AAAA,MAC3D,WAAW,IAAI,KAAK,KAAK,YAAY;AAAA,MACrC,WAAW,IAAI,KAAK,KAAK,YAAY;AAAA,MACrC,MAAM,KAAK;AAAA,MACX,UAAU,KAAK,oBAAoB;AAAA,IACrC,CAAC;AAAA,EACH;AAGA,aAAW,SAAS,QAAQ;AAC1B,UAAM,KAAK;AAAA,MACT,IAAI,MAAM;AAAA,MACV,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,QAAQ,UAAU,MAAM,MAAM;AAAA,MAC9B,UAAU,YAAY,MAAM,QAAQ;AAAA,MACpC,UAAU,MAAM,aAAa,eAAe,MAAM,WAAW;AAAA,MAC7D,WAAW,IAAI,KAAK,MAAM,YAAY;AAAA,MACtC,WAAW,IAAI,KAAK,MAAM,YAAY;AAAA,MACtC,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM,oBAAoB;AAAA,IACtC,CAAC;AAAA,EACH;AAGA,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,QAAQ,UAAU,KAAK,MAAM;AAAA,MAC7B,UAAU,YAAY,KAAK,QAAQ;AAAA,MACnC,UAAU,KAAK,aAAa,eAAe,KAAK,WAAW;AAAA,MAC3D,WAAW,IAAI,KAAK,KAAK,YAAY;AAAA,MACrC,WAAW,IAAI,KAAK,KAAK,YAAY;AAAA,MACrC,MAAM,KAAK;AAAA,MACX,UAAU,KAAK,oBAAoB;AAAA,IACrC,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC;AAC3E;AAGA,SAAS,UAAU,QAA6D;AAC9E,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,UAA0D;AAC7E,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,aAAa,SAA4B;AAChD,QAAM,UAAwB,CAAC;AAG/B,MAAI,mCAAS,QAAQ;AACnB,YAAQ,SAAS,eAAe,QAAQ,MAAM;AAAA,EAChD;AAEA,MAAI,mCAAS,UAAU;AACrB,YAAQ,WAAW,iBAAiB,QAAQ,QAAQ;AAAA,EACtD;AAEA,MAAI,mCAAS,UAAU;AACrB,YAAQ,WAAW,iBAAiB,QAAQ,QAAQ;AAAA,EACtD;AAEA,MAAI,mCAAS,IAAI;AACf,YAAQ,KAAK,WAAW,QAAQ,EAAE;AAAA,EACpC;AAEA,MAAI,mCAAS,MAAM;AACjB,YAAQ,OAAOE,cAAa,QAAQ,IAAI;AAAA,EAC1C;AAGA,MAAI,mCAAS,cAAc;AACzB,YAAQ,eAAe,IAAI,KAAK,QAAQ,YAAY;AAAA,EACtD;AAEA,MAAI,mCAAS,eAAe;AAC1B,YAAQ,gBAAgB,IAAI,KAAK,QAAQ,aAAa;AAAA,EACxD;AAEA,MAAI,mCAAS,cAAc;AACzB,YAAQ,eAAe,IAAI,KAAK,QAAQ,YAAY;AAAA,EACtD;AAEA,MAAI,mCAAS,eAAe;AAC1B,YAAQ,gBAAgB,IAAI,KAAK,QAAQ,aAAa;AAAA,EACxD;AAGA,MAAI,mCAAS,aAAa;AACxB,YAAQ,cAAc,WAAW,QAAQ,WAAW;AAAA,EACtD;AAEA,MAAI,mCAAS,aAAa;AACxB,YAAQ,cAAc,WAAW,QAAQ,WAAW;AAAA,EACtD;AAGA,MAAI,mCAAS,QAAQ;AACnB,wBAAoB,QAAQ,QAAQ,OAAO;AAAA,EAC7C;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,YAAoB,SAA6B;AAC5E,QAAM,QAAQ,WAAW,MAAM,GAAG;AAElC,aAAW,QAAQ,OAAO;AACxB,UAAM,CAAC,KAAK,KAAK,IAAI,KAAK,MAAM,GAAG;AACnC,QAAI,CAAC,OAAO,CAAC,MAAO;AAEpB,UAAM,aAAa,IAAI,KAAK;AAC5B,UAAM,eAAe,MAAM,KAAK;AAEhC,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,YAAI,aAAa,SAAS,GAAG,GAAG;AAC9B,kBAAQ,WAAW,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,QAChE,OAAO;AACL,kBAAQ,SAAS;AAAA,QACnB;AACA;AAAA,MACF,KAAK;AACH,YAAI,aAAa,SAAS,GAAG,GAAG;AAC9B,kBAAQ,aAAa,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,QAClE,OAAO;AACL,kBAAQ,WAAW;AAAA,QACrB;AACA;AAAA,MACF,KAAK;AACH,gBAAQ,WAAW;AACnB;AAAA,MACF,KAAK;AACH,gBAAQ,OAAO,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC1D;AAAA,MACF,KAAK;AACH,YAAI,aAAa,SAAS,GAAG,GAAG;AAC9B,gBAAM,CAAC,KAAK,GAAG,IAAI,aAAa,MAAM,GAAG;AACzC,kBAAQ,cAAc,WAAW,GAAG;AACpC,kBAAQ,cAAc,WAAW,GAAG;AAAA,QACtC;AACA;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAASF,sBAAqB,OAAwB,SAAwC;AAC5F,SAAO,MAAM,OAAO,CAAC,SAAS;AAE5B,QAAI,QAAQ,UAAU,KAAK,WAAW,QAAQ,OAAQ,QAAO;AAC7D,QAAI,QAAQ,YAAY,CAAC,QAAQ,SAAS,SAAS,KAAK,MAAM,EAAG,QAAO;AAGxE,QAAI,QAAQ,YAAY,KAAK,aAAa,QAAQ,SAAU,QAAO;AACnE,QAAI,QAAQ,cAAc,CAAC,QAAQ,WAAW,SAAS,KAAK,QAAQ,EAAG,QAAO;AAG9E,QAAI,QAAQ,YAAY,KAAK,aAAa,QAAQ,SAAU,QAAO;AAGnE,QAAI,QAAQ,MAAM,KAAK,OAAO,QAAQ,GAAI,QAAO;AAGjD,QAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,UAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAK;AAvuBjD;AAuuBoD,0BAAK,SAAL,mBAAW,SAAS;AAAA,OAAI,EAAG,QAAO;AAAA,IAClF;AAGA,QAAI,QAAQ,gBAAgB,KAAK,YAAY,QAAQ,aAAc,QAAO;AAC1E,QAAI,QAAQ,iBAAiB,KAAK,YAAY,QAAQ,cAAe,QAAO;AAC5E,QAAI,QAAQ,gBAAgB,KAAK,YAAY,QAAQ,aAAc,QAAO;AAC1E,QAAI,QAAQ,iBAAiB,KAAK,YAAY,QAAQ,cAAe,QAAO;AAG5E,QAAI,QAAQ,gBAAgB,CAAC,KAAK,YAAY,KAAK,WAAW,QAAQ;AACpE,aAAO;AACT,QAAI,QAAQ,gBAAgB,CAAC,KAAK,YAAY,KAAK,WAAW,QAAQ;AACpE,aAAO;AAET,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,aACP,OACA,WACA,WACiB;AACjB,QAAM,YAAY,cAAc,SAAS,KAAK;AAE9C,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM;AAC/B,QAAI,aAAa;AAEjB,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,qBAAa,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AACzD;AAAA,MACF,KAAK;AACH,qBAAa,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AACzD;AAAA,MACF,KAAK;AACH,qBAAa,EAAE,MAAM,cAAc,EAAE,KAAK;AAC1C;AAAA,MACF,KAAK,YAAY;AACf,cAAM,gBAAgB,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAChE,qBAAa,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ;AACjE;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,cAAc,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,MAAM,EAAE;AACrE,qBAAa,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM;AACzD;AAAA,MACF;AAAA,MACA;AACE,qBAAa,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AAAA,IAC7D;AAEA,WAAO,aAAa;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,gBAAgB,OAAwB,OAAgB,QAAkC;AACjG,MAAI,QAAQ;AACZ,MAAI,MAAM,MAAM;AAEhB,MAAI,QAAQ;AACV,YAAQ,SAAS,MAAM;AACvB,QAAI,OAAO,MAAM,KAAK,KAAK,QAAQ,EAAG,SAAQ;AAAA,EAChD;AAEA,MAAI,OAAO;AACT,UAAM,WAAW,SAAS,KAAK;AAC/B,QAAI,CAAC,OAAO,MAAM,QAAQ,KAAK,WAAW,GAAG;AAC3C,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AAEA,SAAO,MAAM,MAAM,OAAO,GAAG;AAC/B;AAEA,SAAS,uBACP,cACA,OACA,SACA,cACM;AACN,QAAM,UAAU,0BAA0B,cAAc,OAAO,YAAY;AAC3E,UAAQ,IAAI,OAAO;AACrB;AAEA,SAAS,0BACP,eACA,OACA,eACQ;AACR,QAAM,cAAc,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM;AACjE,QAAM,iBAAiB,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM;AACpE,QAAM,QAAQ,MAAM;AACpB,QAAM,iBAAiB,QAAQ,IAAI,KAAK,MAAO,eAAe,SAAS,QAAS,GAAG,IAAI;AAGvF,QAAM,WAAW,oBAAI,KAAK;AAC1B,WAAS,QAAQ,SAAS,QAAQ,IAAI,CAAC;AACvC,QAAM,oBAAoB,eAAe,OAAO,CAAC,SAAS,KAAK,aAAa,QAAQ,EAAE;AACtF,QAAM,kBAAkB,MAAM,OAAO,CAAC,SAAS,KAAK,aAAa,QAAQ,EAAE;AAG3E,QAAM,aAAa,MAAM;AAAA,IACvB,CAAC,KAAK,SAAS;AACb,UAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,KAAK;AACjD,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA,oBAAoB,UAAU,UAAU,YAAY,OAAO,SAAS,CAAC,CAAC;AAAA,IACtE,uBAAuB,UAAU,UAAU,eAAe,OAAO,SAAS,CAAC,CAAC;AAAA,IAC5E,mBAAmB,UAAU,UAAU,MAAM,SAAS,CAAC,CAAC;AAAA,IACxD,uBAAuB,UAAU,UAAU,GAAG,cAAc,GAAG,CAAC;AAAA,IAChE,uBAAuB,UAAU,UAAU,GAAG,iBAAiB,eAAe,eAAe,UAAU,CAAC;AAAA,IACxG,0BAA0B,OAAO,QAAQ,UAAU,EAChD,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,EAC5B,KAAK,IAAI,CAAC;AAAA,IACb;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,mBAAmB,OAA8B;AACxD,QAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,UAAM,cAAcG,eAAc,KAAK,MAAM;AAC7C,UAAM,gBAAgBC,kBAAiB,KAAK,QAAQ;AACpD,YAAQ;AAAA,MACN,IAAI,QAAQ,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,KAAK,WAAW,IAAI,cAAc,KAAK,SAAS,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,UAAU,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC;AAAA,IACnK;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,OAA8B;AACzD,QAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAQ,IAAI,UAAU,WAAW,MAAM,UAAU,CAAC;AAClD,QAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,cAAQ,IAAI,UAAU,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBAAmB,OAA8B;AACxD,QAAM,eAAe,mBAAmB,KAAK;AAE7C,aAAW,CAAC,QAAQ,WAAW,KAAK,OAAO,QAAQ,YAAY,GAAG;AAChE,QAAI,YAAY,SAAS,GAAG;AAC1B,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,GAAGD,eAAc,MAAM,CAAC,IAAI,OAAO,YAAY,CAAC,KAAK,YAAY,MAAM;AAAA,QACzE;AAAA,MACF;AAEA,kBAAY,QAAQ,CAAC,MAAM,UAAU;AAl4B3C;AAm4BQ,cAAM,gBAAgBC,kBAAiB,KAAK,QAAQ;AACpD,cAAM,eAAe,KAAK,WAAW,KAAK,KAAK,QAAQ,KAAK;AAC5D,cAAM,aAAW,UAAK,SAAL,mBAAW,UAAS,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM;AACpE,gBAAQ;AAAA,UACN,KAAK,QAAQ,CAAC,KAAK,cAAc,KAAK,SAAS,YAAY,CAAC,CAAC,IAAI,KAAK,KAAK,GAAG,YAAY,GAAG,QAAQ,IAAI,UAAU,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC;AAAA,QACxI;AAAA,MACF,CAAC;AACD,cAAQ,IAAI,EAAE;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,0BACP,eACA,UACM;AACN,QAAM,QAAQ,UAAU,cAAc,aAAa;AACnD,UAAQ,IAAI,KAAK;AAGjB,MAAI,SAAS,SAAS,cAAc,QAAQ;AAC1C,YAAQ;AAAA,MACN,UAAU,KAAK,qBAAc,cAAc,MAAM,OAAO,SAAS,MAAM,cAAc;AAAA,IACvF;AAAA,EACF;AAGA,QAAM,gBAAgB,cAAc,OAAO,CAAC,SAAS,KAAK,QAAQ;AAClE,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,cAAc,cAAc,OAAO,CAAC,KAAK,SAAS,OAAO,KAAK,YAAY,IAAI,CAAC;AACrF,UAAM,YAAY,KAAK,MAAO,cAAc,cAAc,SAAU,EAAE,IAAI;AAC1E,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,2BAAoB,WAAW,WAAW,SAAS,aAAa,cAAc,MAAM;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,oBAAI,KAAK;AAC1B,WAAS,QAAQ,SAAS,QAAQ,IAAI,CAAC;AACvC,QAAM,iBAAiB,cAAc,OAAO,CAAC,SAAS,KAAK,aAAa,QAAQ,EAAE;AAClF,UAAQ;AAAA,IACN,UAAU,KAAK,8BAAuB,cAAc,mCAAmC;AAAA,EACzF;AACF;AAEA,SAAS,iBAAiB,SAAgC;AACxD,SAAO,OAAO,KAAK,OAAO,EAAE,SAAS;AACvC;AAEA,SAAS,qBAAqB,SAA6B;AACzD,UAAQ,IAAI,UAAU,OAAO,0BAAmB,CAAC;AAEjD,QAAM,qBAAqB,CAAC;AAE5B,MAAI,QAAQ,OAAQ,oBAAmB,KAAK,WAAW,QAAQ,MAAM,EAAE;AACvE,MAAI,QAAQ,SAAU,oBAAmB,KAAK,cAAc,QAAQ,SAAS,KAAK,IAAI,CAAC,EAAE;AACzF,MAAI,QAAQ,SAAU,oBAAmB,KAAK,aAAa,QAAQ,QAAQ,EAAE;AAC7E,MAAI,QAAQ,WAAY,oBAAmB,KAAK,gBAAgB,QAAQ,WAAW,KAAK,IAAI,CAAC,EAAE;AAC/F,MAAI,QAAQ,SAAU,oBAAmB,KAAK,aAAa,QAAQ,QAAQ,EAAE;AAC7E,MAAI,QAAQ,GAAI,oBAAmB,KAAK,OAAO,QAAQ,EAAE,EAAE;AAC3D,MAAI,QAAQ,KAAM,oBAAmB,KAAK,SAAS,QAAQ,KAAK,KAAK,IAAI,CAAC,EAAE;AAC5E,MAAI,QAAQ;AACV,uBAAmB,KAAK,kBAAkB,QAAQ,aAAa,aAAa,CAAC,EAAE;AACjF,MAAI,QAAQ;AACV,uBAAmB,KAAK,mBAAmB,QAAQ,cAAc,aAAa,CAAC,EAAE;AACnF,MAAI,QAAQ;AACV,uBAAmB,KAAK,kBAAkB,QAAQ,aAAa,aAAa,CAAC,EAAE;AACjF,MAAI,QAAQ;AACV,uBAAmB,KAAK,mBAAmB,QAAQ,cAAc,aAAa,CAAC,EAAE;AACnF,MAAI,QAAQ,YAAa,oBAAmB,KAAK,iBAAiB,QAAQ,WAAW,EAAE;AACvF,MAAI,QAAQ,YAAa,oBAAmB,KAAK,iBAAiB,QAAQ,WAAW,EAAE;AAEvF,qBAAmB,QAAQ,CAAC,SAAS;AACnC,YAAQ,IAAI,UAAU,KAAK,YAAO,IAAI,EAAE,CAAC;AAAA,EAC3C,CAAC;AAED,UAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,sBAAsB,YAAoB,gBAAwB,SAAoB;AAC7F,QAAM,UAAS,mCAAS,UAAS,SAAS,QAAQ,MAAM,IAAI;AAC5D,QAAM,SAAQ,mCAAS,SAAQ,SAAS,QAAQ,KAAK,IAAI;AAEzD,UAAQ;AAAA,IACN,UAAU;AAAA,MACR,iCAA0B,cAAc,WAAW,SAAS,CAAC,IAAI,SAAS,cAAc,OAAO,UAAU;AAAA,IAC3G;AAAA,EACF;AAEA,MAAI,SAAS,iBAAiB,YAAY;AACxC,YAAQ,IAAI,UAAU,KAAK,0BAA0B,SAAS,KAAK,YAAY,KAAK,EAAE,CAAC;AAAA,EACzF;AAEA,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAe,cACb,OACA,YACA,SACe;AACf,QAAM,cAAU,YAAAL,SAAI,+BAA+B,EAAE,MAAM;AAE3D,MAAI;AACF,UAAM,SAAS,WAAW,MAAM,GAAG,EAAE,IAAI,KAAK;AAC9C,UAAM,aAAa,UAAU,aAAa,OAAO,MAAM;AAEvD,kBAAc,YAAY,UAAU;AAEpC,YAAQ,QAAQ,YAAY,MAAM,MAAM,aAAa,UAAU,EAAE;AACjE,YAAQ,IAAI,UAAU,KAAK,+BAAwB,UAAU,EAAE,CAAC;AAAA,EAClE,SAAS,OAAO;AACd,YAAQ,KAAK,eAAe;AAC5B,UAAM;AAAA,EACR;AACF;AAEA,SAAS,iBAAiB,OAAwB,SAAoB;AACpE,UAAQ,IAAI,UAAU,OAAO,yBAAkB,CAAC;AAEhD,QAAM,YAAY,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM;AAC/D,QAAM,kBAAkB,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,aAAa;AAC5E,QAAM,eAAe,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,SAAS;AAErE,MAAI,UAAU,SAAS,GAAG;AACxB,YAAQ,IAAI,UAAU,KAAK,8BAAuB,CAAC;AACnD,YAAQ,IAAI,UAAU,UAAU,oCAAoC,CAAC;AAAA,EACvE;AAEA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAQ,IAAI,UAAU,KAAK,+BAAwB,CAAC;AACpD,YAAQ,IAAI,UAAU,UAAU,kBAAkB,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC;AAAA,EAChF;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI,UAAU,QAAQ,+CAAwC,CAAC;AAAA,EACzE;AAEA,UAAQ,IAAI,UAAU,KAAK,+BAAwB,CAAC;AACpD,UAAQ,IAAI,UAAU,UAAU,6CAA6C,CAAC;AAE9E,UAAQ,IAAI,EAAE;AAChB;AAEA,SAASI,eAAc,QAAwB;AAC7C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,mBAAmB,OAAyD;AACnF,QAAM,SAA0C;AAAA,IAC9C,MAAM,CAAC;AAAA,IACP,eAAe,CAAC;AAAA,IAChB,SAAS,CAAC;AAAA,IACV,MAAM,CAAC;AAAA,EACT;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,KAAK,MAAM,GAAG;AACvB,aAAO,KAAK,MAAM,EAAE,KAAK,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASC,kBAAiB,UAA4C;AACpE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,CAAC,SAAiB;AAAA;AAAA,IAC3B,KAAK;AACH,aAAO,CAAC,SAAiB,UAAU,UAAU,IAAI;AAAA,IACnD,KAAK;AACH,aAAO,CAAC,SAAiB,UAAU,MAAM,IAAI;AAAA,IAC/C;AACE,aAAO,CAAC,SAAiB;AAAA,EAC7B;AACF;AAEA,SAAS,yBAAyB,OAAyC;AAKzE,SAAO,MAAM,OAAO,CAAC,SAAS;AAE5B,QAAI,KAAK,WAAW,eAAe;AACjC,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,WAAW,WAAW,KAAK,aAAa,UAAU,KAAK,aAAa,aAAa;AACxF,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,WAAW,WAAW;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,mBACP,eACA,UACA,eACA,SACA,eACM;AACN,QAAM,QAAQ,SAAS;AACvB,QAAM,WAAW,cAAc;AAG/B,QAAM,cAAc,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM;AACpE,QAAM,iBAAiB,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM;AACvE,QAAM,eAAe,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,SAAS;AACxE,QAAM,kBAAkB,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,aAAa;AAG/E,QAAM,oBAAoB,SAAS;AAAA,IACjC,CAAC,KAAK,SAAS;AACb,UAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,KAAK;AACjD,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAGA,QAAM,iBAAiB,QAAQ,IAAI,KAAK,MAAO,eAAe,SAAS,QAAS,GAAG,IAAI;AAGvF,QAAM,WAAW,oBAAI,KAAK;AAC1B,WAAS,QAAQ,SAAS,QAAQ,IAAI,CAAC;AACvC,QAAM,kBAAkB,SAAS,OAAO,CAAC,SAAS,KAAK,aAAa,QAAQ,EAAE;AAG9E,UAAQ,IAAI,UAAU,UAAU,2BAAoB,CAAC;AACrD,UAAQ,IAAI,mBAAmB,UAAU,UAAU,MAAM,SAAS,CAAC,CAAC,EAAE;AACtE,UAAQ;AAAA,IACN,cAAc,UAAU,UAAU,YAAY,OAAO,SAAS,CAAC,CAAC,iBAAiB,UAAU,UAAU,eAAe,OAAO,SAAS,CAAC,CAAC,eAAe,UAAU,UAAU,aAAa,OAAO,SAAS,CAAC,CAAC;AAAA,EAC1M;AACA,UAAQ,IAAI,gBAAgB,UAAU,UAAU,GAAG,cAAc,GAAG,CAAC,WAAW;AAChF,UAAQ,IAAI,EAAE;AAEd,UAAQ,IAAI,UAAU,UAAU,4BAAqB,CAAC;AACtD,UAAQ,IAAI,sBAAe,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM,EAAE,MAAM,EAAE;AACrF,UAAQ,IAAI,6BAAsB,gBAAgB,MAAM,EAAE;AAC1D,UAAQ,IAAI,yBAAkB,aAAa,MAAM,EAAE;AACnD,UAAQ,IAAI,mBAAc,eAAe,MAAM,EAAE;AACjD,UAAQ,IAAI,EAAE;AAEd,UAAQ,IAAI,UAAU,UAAU,8BAAyB,CAAC;AAC1D,UAAQ,IAAI,0BAAmB,kBAAkB,YAAY,CAAC,EAAE;AAChE,UAAQ,IAAI,sBAAe,kBAAkB,QAAQ,CAAC,EAAE;AACxD,UAAQ,IAAI,wBAAiB,kBAAkB,UAAU,CAAC,EAAE;AAC5D,UAAQ,IAAI,qBAAc,kBAAkB,OAAO,CAAC,EAAE;AACtD,UAAQ,IAAI,EAAE;AAEd,UAAQ,IAAI,UAAU,UAAU,2BAAoB,CAAC;AACrD,UAAQ;AAAA,IACN,oCAAoC,UAAU,UAAU,gBAAgB,SAAS,CAAC,CAAC;AAAA,EACrF;AAGA,MAAI,aAAa,OAAO;AACtB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,KAAK,aAAM,QAAQ,OAAO,KAAK,8BAA8B,CAAC;AAAA,EACtF;AAGA,QAAM,qBAAqB,YAAY;AAAA,IACrC,CAAC,SAAS,KAAK,aAAa,UAAU,KAAK,aAAa;AAAA,EAC1D;AACA,MAAI,mBAAmB,SAAS,GAAG;AACjC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,UAAU,yCAA+B,CAAC;AAChE,uBAAmB,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,UAAU;AACtD,YAAM,gBAAgBA,kBAAiB,KAAK,QAAQ;AACpD,cAAQ;AAAA,QACN,MAAM,QAAQ,CAAC,KAAK,cAAc,KAAK,SAAS,YAAY,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,UAAU,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC;AAAA,MAC/G;AAAA,IACF,CAAC;AACD,QAAI,mBAAmB,SAAS,GAAG;AACjC,cAAQ,IAAI,cAAc,mBAAmB,SAAS,CAAC,2BAA2B;AAAA,IACpF;AAAA,EACF;AACF;AAEA,SAASF,cAAa,MAAwB;AAC5C,SAAO,KACJ,MAAM,GAAG,EACT,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO;AACnB;AAxrCA,IAAAG,kBACAC,oBACAC,oBACAC,kBACAC;AAJA;AAAA;AAAA;AAAA;AAAA,IAAAJ,mBAA2B;AAC3B,IAAAC,qBAAqB;AACrB,IAAAC,qBAAwB;AACxB,IAAAC,mBAAqB;AACrB,IAAAC,cAAgB;AAEhB;AACA;AACA;AACA;AACA;AAQgB;AAiTD;AAoGN;AAmBM,WAAAX,eAAA;AA+EA;AA0EN;AAeA;AAeA;AA0DA;AA0CA,WAAAE,uBAAA;AAqCA;AAsCA;AAmBA;AAUA;AAuCA;AAUA;AASA;AAwBA;AAmCA;AAIA;AA8BA;AAiBM;AAqBN;AA2BA,WAAAG,gBAAA;AAeA;AAiBA,WAAAC,mBAAA;AAeA;AAyBA;AAsFA,WAAAF,eAAA;AAAA;AAAA;;;AClpCF,SAAS,8BAAuC;AACrD,QAAM,UAAU,IAAI,2BAAQ,iBAAiB;AAE7C,UACG,YAAY,0EAA0E,EACtF,OAAO,iBAAiB,gCAAgC,EACxD,OAAO,iBAAiB,uBAAuB,EAC/C,OAAO,WAAW,iCAAiC,EACnD,OAAO,WAAW,kCAAkC,EACpD,OAAO,yBAAyB,uDAAuD,EACvF,OAAO,6BAA6B,+CAA+C,EACnF,OAAO,yBAAyB,oBAAoB,EACpD,OAAO,qBAAqB,kCAAkC,EAC9D,OAAO,iBAAiB,0CAA0C,EAClE,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,mBAAmB,iDAAiD,EAC3E,OAAO,iBAAiB,8CAA8C,EACtE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBF,EACC,OAAO,OAAO,YAA2B;AACxC,QAAI;AACF,YAAM,sBAAsB,OAAO;AAAA,IACrC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACnF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,sBAAsB,SAAuC;AA1F5E;AA2FE,QAAM,YAAY,KAAK,IAAI;AAG3B,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,iBAAiB,aAAgB,YAAhB,mBAAyB;AAChD,QAAM,gBAAc,oDAAe,WAAf,mBAAuB,cAAW,oDAAe,WAAf,mBAAuB;AAE7E,QAAM,cAAc,cAAc,gBAAgB;AAClD,QAAM,eAAe,IAAI,sBAAsB,QAAQ,aAAa,WAAW;AAG/E,MAAI,QAAQ,cAAc;AACxB,YAAQ,IAAI,UAAU,KAAK,+BAAwB,CAAC;AACpD,UAAM,aAAa,aAAa;AAAA,EAClC;AAGA,MAAI,QAAQ,YAAY;AACtB,UAAM,uBAAuB,YAAY;AACzC;AAAA,EACF;AAEA,UAAQ,IAAI,UAAU,OAAO,aAAM,OAAO,QAAQ,cAAc,4BAA4B,CAAC;AAG7F,QAAM,WAAW,MAAM,aAAa,mBAAmB;AAGvD,wBAAsB,UAAU,SAAS;AAGzC,QAAM,gBAAgB,MAAM,aAAa,cAAc,OAAO;AAG9D,QAAM,eAAe,QAAQ,QACzB,cAAc,MAAM,GAAG,SAAS,QAAQ,KAAK,CAAC,IAC9C;AAEJ,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ,IAAI,UAAU,IAAI,sCAAsC,MAAM,CAAC;AACvE;AAAA,EACF;AAGA,MAAI,QAAQ,OAAO;AACjB,qBAAiB,YAAY;AAAA,EAC/B,WAAW,QAAQ,SAAS;AAC1B,IAAAQ,oBAAmB,YAAY;AAAA,EACjC,WAAW,QAAQ,SAAS;AAC1B,uBAAmB,YAAY;AAAA,EACjC,OAAO;AACL,IAAAC,oBAAmB,YAAY;AAAA,EACjC;AAGA,MAAI,QAAQ,OAAO;AACjB,UAAM,0BAA0B,cAAc,QAAQ;AAAA,EACxD;AAGA,QAAM,YAAY,KAAK,IAAI,IAAI;AAC/B,UAAQ,IAAI,UAAU,IAAI;AAAA,sBAAoB,SAAS,uBAAuB,CAAC;AAE/E,MAAI,cAAc,WAAW,SAAS,YAAY;AAChD,YAAQ;AAAA,MACN,UAAU;AAAA,QACR,qBAAc,aAAa,MAAM,OAAO,cAAc,MAAM,oBAAoB,SAAS,UAAU;AAAA,MACrG;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,uBAAuB,cAAoD;AACxF,QAAM,QAAQ,MAAM,aAAa,cAAc;AAE/C,UAAQ,IAAI,UAAU,OAAO,mCAA4B,CAAC;AAC1D,UAAQ,IAAI,UAAU,KAAK,kBAAkB,MAAM,UAAU,mBAAc,kBAAa,EAAE,CAAC;AAC3F,UAAQ,IAAI,UAAU,KAAK,sBAAsB,MAAM,kBAAkB,eAAU,WAAM,EAAE,CAAC;AAC5F,UAAQ,IAAI,UAAU,KAAK,cAAc,MAAM,WAAW,eAAU,WAAM,EAAE,CAAC;AAE7E,MAAI,MAAM,cAAc;AACtB,YAAQ,IAAI,UAAU,KAAK,kBAAkB,MAAM,aAAa,eAAe,CAAC,EAAE,CAAC;AAAA,EACrF;AAEA,UAAQ,IAAI,UAAU,UAAU,gCAAyB,CAAC;AAC1D,UAAQ,IAAI,UAAU,KAAK,gBAAgB,MAAM,UAAU,EAAE,CAAC;AAC9D,UAAQ,IAAI,UAAU,KAAK,iBAAiB,MAAM,WAAW,EAAE,CAAC;AAChE,UAAQ,IAAI,UAAU,KAAK,gBAAgB,MAAM,UAAU,EAAE,CAAC;AAC9D,UAAQ,IAAI,UAAU,KAAK,cAAc,MAAM,QAAQ,EAAE,CAAC;AAC1D,UAAQ,IAAI,UAAU,KAAK,eAAe,KAAK,MAAM,MAAM,YAAY,IAAI,CAAC,IAAI,CAAC;AACjF,UAAQ,IAAI,UAAU,KAAK,mBAAmB,MAAM,YAAY,EAAE,CAAC;AAEnE,UAAQ,IAAI,UAAU,UAAU,8BAAyB,CAAC;AAC1D,UAAQ,IAAI,UAAU,KAAK,mBAAmB,MAAM,mBAAmB,YAAY,IAAI,CAAC;AACxF,UAAQ,IAAI,UAAU,KAAK,qBAAqB,MAAM,mBAAmB,cAAc,IAAI,CAAC;AAC5F,UAAQ,IAAI,UAAU,KAAK,sBAAsB,MAAM,mBAAmB,eAAe,IAAI,CAAC;AAG9F,QAAM,eACJ,MAAM,mBAAmB,eAAe,MAAM,MAAM,mBAAmB,iBAAiB;AAE1F,UAAQ,IAAI,UAAU,UAAU,oCAA6B,CAAC;AAC9D,UAAQ;AAAA,IACN,UAAU,KAAK,wBAAwB,eAAe,wBAAiB,iCAAuB,EAAE;AAAA,EAClG;AAEA,MAAI,CAAC,cAAc;AACjB,YAAQ,IAAI,UAAU,QAAQ,sDAAsD,CAAC;AACrF,YAAQ,IAAI,UAAU,KAAK,kDAAkD,CAAC;AAAA,EAChF;AACF;AAEA,SAAS,sBAAsB,UAAe,YAA0B;AACtE,QAAM,cAAc,SAAS,cAAc,SAAS,SAAS,aAAa;AAE1E,UAAQ,IAAI,UAAU,UAAU,4BAAqB,CAAC;AACtD,UAAQ,IAAI,UAAU,KAAK,iBAAiB,UAAU,UAAU,YAAY,SAAS,CAAC,CAAC,EAAE,CAAC;AAC1F,UAAQ;AAAA,IACN,UAAU;AAAA,MACR,oBAAoB,UAAU,WAAW,SAAS,SAAS,aAAa,GAAG,SAAS,CAAC,CAAC;AAAA,IACxF;AAAA,EACF;AACA,UAAQ;AAAA,IACN,UAAU,KAAK,gBAAgB,UAAU,UAAU,SAAS,WAAW,SAAS,CAAC,CAAC,EAAE;AAAA,EACtF;AACA,UAAQ;AAAA,IACN,UAAU,KAAK,oBAAoB,UAAU,UAAU,GAAG,SAAS,cAAc,GAAG,CAAC,EAAE;AAAA,EACzF;AAGA,UAAQ;AAAA,IACN,UAAU;AAAA,MACR,0BAA0B,SAAS,OAAO,IAAI,aAAa,SAAS,OAAO,KAAK,YAAY,SAAS,OAAO,IAAI,UAAU,SAAS,OAAO,EAAE;AAAA,IAC9I;AAAA,EACF;AAGA,QAAM,oBAAoB,OAAO,QAAQ,SAAS,UAAU,EACzD,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM,GAAG,QAAQ,KAAK,KAAK,EAAE,EAClD,KAAK,IAAI;AACZ,UAAQ,IAAI,UAAU,KAAK,uBAAuB,iBAAiB,EAAE,CAAC;AAEtE,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAe,aACb,cACA,SACgB;AAChB,MAAI,QAAe,CAAC;AAGpB,MAAI,QAAQ,MAAM;AAChB,YAAQ,MAAM,aAAa,eAAe,QAAQ,IAAgB;AAAA,EACpE,OAAO;AAEL,UAAM,CAAC,OAAO,QAAQ,OAAO,GAAG,IAAI,MAAM,QAAQ,IAAI;AAAA,MACpD,aAAa,eAAe,MAAM;AAAA,MAClC,aAAa,eAAe,OAAO;AAAA,MACnC,aAAa,eAAe,MAAM;AAAA,MAClC,aAAa,eAAe,IAAI;AAAA,IAClC,CAAC;AACD,YAAQ,CAAC,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG;AAAA,EAChD;AAGA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,QAAQ,MAAM;AAAA,EAC/D;AAGA,MAAI,QAAQ,UAAU;AACpB,YAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,aAAa,QAAQ,QAAQ;AAAA,EACnE;AAGA,MAAI,QAAQ,UAAU;AACpB,YAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,aAAa,QAAQ,QAAQ;AAAA,EACnE;AAGA,MAAI,QAAQ,MAAM;AAChB,UAAM,aAAa,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AAClE,YAAQ,MAAM,OAAO,CAAC,SAAM;AArRhC;AAqRmC,wBAAK,SAAL,mBAAW,KAAK,CAAC,QAAgB,WAAW,SAAS,GAAG;AAAA,KAAE;AAAA,EAC3F;AAGA,QAAM,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC;AAE5F,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAoB;AAC5C,UAAQ,IAAI,UAAU,UAAU,uBAAgB,CAAC;AAGjD,QAAM,UAAU,CAAC,MAAM,QAAQ,SAAS,UAAU,YAAY,YAAY,UAAU;AAGpF,QAAM,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,IAC/B,KAAK;AAAA,IACLC,aAAY,IAAI;AAAA,IAChB,KAAK,MAAM,SAAS,KAAK,GAAG,KAAK,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,KAAK;AAAA,IACpE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,YAAY;AAAA,IACjB,IAAI,KAAK,KAAK,YAAY,EAAE,mBAAmB;AAAA,EACjD,CAAC;AAGD,UAAQ,IAAI,QAAQ,KAAK,GAAI,CAAC;AAC9B,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAC3B,OAAK,QAAQ,CAAC,QAAQ,QAAQ,IAAI,IAAI,KAAK,GAAI,CAAC,CAAC;AACnD;AAEA,SAASF,oBAAmB,OAAoB;AAC9C,UAAQ,IAAI,UAAU,UAAU,wBAAiB,CAAC;AAElD,QAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,UAAM,YAAYG,cAAaD,aAAY,IAAI,CAAC;AAChD,UAAM,cAAcE,gBAAe,KAAK,MAAM;AAC9C,UAAM,gBAAgBC,kBAAiB,KAAK,QAAQ;AAEpD,YAAQ;AAAA,MACN,IAAI,QAAQ,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,KAAK,SAAS,IAAI,WAAW,IAAI,cAAc,KAAK,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,UAAU,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC;AAAA,IACzK;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAoB;AAC9C,UAAQ,IAAI,UAAU,UAAU,yBAAkB,CAAC;AAEnD,QAAM,QAAQ,CAAC,MAAM,UAAU;AAtUjC;AAuUI,UAAM,YAAYF,cAAaD,aAAY,IAAI,CAAC;AAChD,UAAM,cAAcE,gBAAe,KAAK,MAAM;AAE9C,YAAQ,IAAI,GAAG,SAAS,IAAI,WAAW,IAAI,UAAU,UAAU,KAAK,KAAK,CAAC,EAAE;AAC5E,YAAQ,IAAI,UAAU,KAAK,EAAE,EAAE;AAC/B,YAAQ,IAAI,cAAc,KAAK,MAAM,gBAAgB,KAAK,QAAQ,EAAE;AACpE,QAAI,KAAK,SAAU,SAAQ,IAAI,gBAAgB,KAAK,QAAQ,EAAE;AAC9D,SAAI,UAAK,SAAL,mBAAW,OAAQ,SAAQ,IAAI,YAAY,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AACrE,YAAQ,IAAI,gBAAgB,IAAI,KAAK,KAAK,YAAY,EAAE,eAAe,CAAC,EAAE;AAC1E,YAAQ,IAAI,YAAY,KAAK,QAAQ,EAAE;AAEvC,QAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,cAAQ,IAAI,UAAU,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF,CAAC;AACH;AAEA,SAASH,oBAAmB,OAAoB;AAC9C,UAAQ,IAAI,UAAU,UAAU,2BAAoB,CAAC;AAGrD,QAAM,UAAU,MAAM;AAAA,IACpB,CAAC,KAAK,SAAS;AACb,UAAI,CAAC,IAAI,KAAK,MAAM,EAAG,KAAI,KAAK,MAAM,IAAI,CAAC;AAC3C,UAAI,KAAK,MAAM,EAAE,KAAK,IAAI;AAC1B,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAGA,aAAW,CAAC,QAAQ,WAAW,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC3D,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,cAAcG,gBAAe,MAAM;AACzC,cAAQ;AAAA,QACN,UAAU,UAAU,GAAG,WAAW,IAAI,OAAO,YAAY,CAAC,KAAK,YAAY,MAAM,GAAG;AAAA,MACtF;AAEA,kBAAY,QAAQ,CAAC,MAAM,UAAU;AA7W3C;AA8WQ,cAAM,YAAYD,cAAaD,aAAY,IAAI,CAAC;AAChD,cAAM,gBAAgBG,kBAAiB,KAAK,QAAQ;AACpD,cAAM,eAAe,KAAK,WAAW,KAAK,KAAK,QAAQ,KAAK;AAC5D,cAAM,aAAW,UAAK,SAAL,mBAAW,UAAS,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM;AAEpE,gBAAQ;AAAA,UACN,KAAK,QAAQ,CAAC,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,YAAY,CAAC,CAAC,IAAI,KAAK,KAAK,GAAG,YAAY,GAAG,QAAQ,IAAI,UAAU,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC;AAAA,QACrJ;AAAA,MACF,CAAC;AACD,cAAQ,IAAI,EAAE;AAAA,IAChB;AAAA,EACF;AACF;AAEA,eAAe,0BACb,cACA,UACe;AACf,UAAQ,IAAI,UAAU,OAAO,8BAAuB,CAAC;AAGrD,MAAI,SAAS,eAAe,SAAS,GAAG;AACtC,YAAQ,IAAI,UAAU,UAAU,yCAAkC,CAAC;AACnE,aAAS,eAAe,QAAQ,CAAC,SAAc;AAC7C,YAAM,YAAYF,cAAaD,aAAY,IAAI,CAAC;AAChD,cAAQ;AAAA,QACN,GAAG,SAAS,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,YAAY,EAAE,mBAAmB,CAAC;AAAA,MAClF;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,QAAM,QAAQ,MAAM,aAAa,cAAc;AAC/C,UAAQ,IAAI,UAAU,UAAU,4BAAuB,CAAC;AACxD,UAAQ,IAAI,UAAU,KAAK,oBAAoB,MAAM,mBAAmB,YAAY,IAAI,CAAC;AACzF,UAAQ,IAAI,UAAU,KAAK,eAAe,KAAK,MAAM,MAAM,YAAY,IAAI,CAAC,IAAI,CAAC;AACjF,UAAQ,IAAI,UAAU,KAAK,iBAAiB,MAAM,WAAW,QAAQ,MAAM,EAAE,CAAC;AAChF;AAGA,SAASA,aAAY,MAAmB;AACtC,MAAI,KAAK,GAAG,WAAW,KAAK,EAAG,QAAO;AACtC,MAAI,KAAK,GAAG,WAAW,MAAM,EAAG,QAAO;AACvC,MAAI,KAAK,GAAG,WAAW,MAAM,EAAG,QAAO;AACvC,MAAI,KAAK,GAAG,WAAW,KAAK,EAAG,QAAO;AACtC,SAAO;AACT;AAEA,SAASC,cAAa,MAAsB;AAC1C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASC,gBAAe,QAAwB;AAC9C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASC,kBAAiB,UAA4C;AACpE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,CAAC,SAAiB;AAAA,IAC3B,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,CAAC,SAAiB;AAAA,EAC7B;AACF;AA1cA,IAWAC;AAXA;AAAA;AAAA;AAAA;AAWA,IAAAA,qBAAwB;AAExB;AACA;AACA;AAkBgB;AAyDD;AA4EA;AAwCN;AAiCM;AA+CN;AAuBA,WAAAN,qBAAA;AAcA;AAqBA,WAAAC,qBAAA;AAoCM;AA2BN,WAAAC,cAAA;AAQA,WAAAC,eAAA;AAeA,WAAAC,iBAAA;AAeA,WAAAC,mBAAA;AAAA;AAAA;;;ACpbF,SAAS,wBAAiC;AAC/C,QAAM,UAAU,IAAI,2BAAQ,MAAM;AAElC,UACG,YAAY,+BAA+B,EAC3C,OAAO,YAAY,uBAAuB,EAC1C,OAAO,aAAa,wBAAwB,EAC5C,OAAO,wBAAwB,iDAAiD,EAChF,OAAO,YAAY,uBAAuB,EAC1C,OAAO,OAAO,YAAY;AAlB/B;AAmBM,QAAI;AACF,YAAM,gBAAgB,IAAI,cAAc;AACxC,YAAM,SAAS,cAAc,UAAU;AAGvC,UAAI,GAAC,YAAO,gBAAP,mBAAoB,UAAS;AAChC,gBAAQ;AAAA,UACN,UAAU,MAAM,oEAAoE;AAAA,QACtF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,IAAI,UAAU,OAAO,0CAAmC,CAAC;AACjE,cAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,YAAY,UAAU,EAAE,CAAC;AAC1E,cAAQ,IAAI,EAAE;AAEd,UAAI,QAAQ,QAAQ;AAElB,gBAAQ,IAAI,UAAU,KAAK,2BAA2B,CAAC;AACvD,gBAAQ,IAAI,cAAc,OAAO,YAAY,YAAY,QAAQ,IAAI,EAAE;AACvE,gBAAQ,IAAI,0BAA0B,OAAO,YAAY,mBAAmB,EAAE;AAC9E,gBAAQ,IAAI,iBAAiB,OAAO,YAAY,UAAU,EAAE;AAC5D,gBAAQ,IAAI,uBAAuB,OAAO,YAAY,gBAAgB,IAAI;AAE1E,YAAI,OAAO,YAAY,WAAW;AAChC,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,iCAAiC,CAAC;AAC7D,kBAAQ;AAAA,YACN,UAAU;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,wCAAwC,CAAC;AACpE,kBAAQ,IAAI,sEAAsE;AAClF,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,0BAA0B,CAAC;AACtD,kBAAQ,IAAI,yDAAyD;AACrE,kBAAQ,IAAI,uDAAuD;AACnE,kBAAQ,IAAI,gEAAgE;AAAA,QAC9E,OAAO;AACL,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,kCAAkC,CAAC;AAC9D,kBAAQ,IAAI,oDAAoD;AAAA,QAClE;AAEA;AAAA,MACF;AAEA,UAAI,QAAQ,QAAQ;AAElB,cAAM,gBAAgB;AAAA,UACpB,GAAG;AAAA,UACH,aAAa;AAAA,YACX,GAAG,OAAO;AAAA,YACV,WAAW;AAAA,UACb;AAAA,QACF;AAEA,sBAAc,WAAW,aAAa;AAEtC,gBAAQ,IAAI,UAAU,QAAQ,iCAAiC,CAAC;AAChE,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,0BAA0B,CAAC;AACtD,gBAAQ,IAAI,iBAAiB,cAAc,YAAY,UAAU,EAAE;AACnE,gBAAQ,IAAI,0BAA0B,cAAc,YAAY,mBAAmB,EAAE;AACrF,gBAAQ,IAAI,iBAAiB,cAAc,YAAY,UAAU,EAAE;AACnE,gBAAQ,IAAI,uBAAuB,cAAc,YAAY,gBAAgB,IAAI;AACjF,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,QAAQ,oDAAoD,CAAC;AACnF,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,gBAAgB,CAAC;AAC5C,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,4BAA4B,CAAC;AACxD,gBAAQ,IAAI,6BAA6B;AACzC,gBAAQ;AAAA,UACN;AAAA,QACF;AACA,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,mBAAmB,CAAC;AAC/C,gBAAQ,IAAI,sEAAsE;AAClF,gBAAQ,IAAI,kEAAkE;AAC9E,gBAAQ,IAAI,0DAA0D;AACtE,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,+BAA+B,CAAC;AAC3D,gBAAQ,IAAI,wCAAwC;AACpD,gBAAQ,IAAI,yCAAyC;AAAA,MACvD,WAAW,QAAQ,SAAS;AAE1B,cAAM,gBAAgB;AAAA,UACpB,GAAG;AAAA,UACH,aAAa;AAAA,YACX,GAAG,OAAO;AAAA,YACV,WAAW;AAAA,UACb;AAAA,QACF;AAEA,sBAAc,WAAW,aAAa;AAEtC,gBAAQ,IAAI,UAAU,QAAQ,kCAAkC,CAAC;AACjE,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,2CAA2C,CAAC;AACvE,gBAAQ,IAAI,+DAA0D;AACtE,gBAAQ,IAAI,+DAA0D;AACtE,gBAAQ,IAAI,mEAA8D;AAC1E,gBAAQ,IAAI,sDAAiD;AAAA,MAC/D,OAAO;AAEL,gBAAQ,IAAI,UAAU,KAAK,+BAA+B,CAAC;AAC3D,gBAAQ,IAAI,sCAAsC;AAClD,gBAAQ,IAAI,uCAAuC;AACnD,gBAAQ,IAAI,8CAA8C;AAC1D,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,WAAW,CAAC;AACvC,gBAAQ,IAAI,kCAAkC;AAC9C,gBAAQ,IAAI,mCAAmC;AAC/C,gBAAQ,IAAI,kCAAkC;AAAA,MAChD;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,MAAM,iCAAiC,CAAC;AAChE,cAAQ,MAAM,UAAU,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAjJA,IAKAE;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB;AACA;AAEgB;AAAA;AAAA;;;ACThB,IAAM;AAAN;AAAA;AAAA;AAAA;AAAA,IAAM,gBAAN,MAAM,sBAAqB,MAAM;AAAA,MAC/B;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,MACA,YAAY,SAAS,YAAY,SAAS;AACxC,cAAM,OAAO;AACb,aAAK,OAAO;AACZ,aAAK,SAAS,OAAO,SAAS,UAAU;AACxC,YAAI,OAAO,MAAM,KAAK,MAAM,GAAG;AAC7B,eAAK,SAAS;AAAA,QAChB;AACA,YAAI,cAAc,SAAS;AACzB,eAAK,WAAW,QAAQ;AAAA,QAC1B;AACA,cAAM,cAAc,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO;AACrD,YAAI,QAAQ,QAAQ,QAAQ,eAAe;AACzC,sBAAY,UAAU,OAAO,OAAO,CAAC,GAAG,QAAQ,QAAQ,SAAS;AAAA,YAC/D,eAAe,QAAQ,QAAQ,QAAQ,cAAc;AAAA,cACnD;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACA,oBAAY,MAAM,YAAY,IAAI,QAAQ,wBAAwB,0BAA0B,EAAE,QAAQ,uBAAuB,yBAAyB;AACtJ,aAAK,UAAU;AAAA,MACjB;AAAA,IACF;AApCiC;AAAjC,IAAM,eAAN;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA,IAMA,aAGa;AATb;AAAA;AAAA;AAAA;AAKA;AACA,kBAAwB;AAGjB,IAAM,gBAAN,MAAM,cAAa;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAER,YAAY,QAA0B;AACpC,aAAK,SAAS;AAGd,cAAM,CAAC,OAAO,IAAI,IAAI,OAAO,WAAW,MAAM,GAAG;AACjD,YAAI,CAAC,SAAS,CAAC,MAAM;AACnB,gBAAM,IAAI;AAAA,YACR,8BAA8B,OAAO,UAAU;AAAA,UACjD;AAAA,QACF;AAEA,aAAK,QAAQ;AACb,aAAK,OAAO;AAGZ,aAAK,UAAU,IAAI,oBAAQ;AAAA,UACzB,MAAM,OAAO;AAAA,UACb,SAAS;AAAA,YACP,SAAS;AAAA;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,iBAAiE;AAzCzE;AA0CI,YAAI;AAEF,gBAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,KAAK,MAAM,IAAI;AAAA,YAC3D,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,UACb,CAAC;AAGD,cAAI,GAAC,cAAS,gBAAT,mBAAsB,SAAQ,GAAC,cAAS,gBAAT,mBAAsB,QAAO;AAC/D,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,SAAS;AAAA,YACX;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,gBAAgB,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,UAClD;AAAA,QACF,SAAS,OAAO;AACd,cAAI,iBAAiB,cAAc;AACjC,oBAAQ,MAAM,QAAQ;AAAA,cACpB,KAAK;AACH,uBAAO;AAAA,kBACL,SAAS;AAAA,kBACT,SAAS;AAAA,gBACX;AAAA,cACF,KAAK;AACH,uBAAO;AAAA,kBACL,SAAS;AAAA,kBACT,SAAS;AAAA,gBACX;AAAA,cACF,KAAK;AACH,uBAAO;AAAA,kBACL,SAAS;AAAA,kBACT,SAAS,cAAc,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,gBAChD;AAAA,cACF;AACE,uBAAO;AAAA,kBACL,SAAS;AAAA,kBACT,SAAS,qBAAqB,MAAM,OAAO;AAAA,gBAC7C;AAAA,YACJ;AAAA,UACF;AACA,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACzF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aACJ,UAKI,CAAC,GACmB;AACxB,cAAM,SAAwB,CAAC;AAC/B,YAAI,OAAO;AACX,cAAM,WAAW,KAAK,IAAI,KAAK,OAAO,cAAc,KAAK,GAAG;AAE5D,YAAI;AACF,iBAAO,MAAM;AAEX,gBAAI,OAAO,GAAG;AACZ,oBAAM,KAAK,MAAM,KAAK,OAAO,oBAAoB,GAAG;AAAA,YACtD;AAEA,kBAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,OAAO,YAAY;AAAA,cAC1D,OAAO,KAAK;AAAA,cACZ,MAAM,KAAK;AAAA,cACX,OAAO,QAAQ,SAAS;AAAA,cACxB,MAAM,QAAQ,QAAQ;AAAA,cACtB,WAAW,QAAQ,aAAa;AAAA,cAChC,OAAO,QAAQ;AAAA,cACf;AAAA,cACA;AAAA,YACF,CAAC;AAED,gBAAI,SAAS,KAAK,WAAW,GAAG;AAC9B;AAAA,YACF;AAGA,kBAAM,kBAAkB,SAAS,KAAK,IAAI,KAAK,kBAAkB;AACjE,mBAAO,KAAK,GAAG,eAAe;AAG9B,gBAAI,SAAS,KAAK,SAAS,UAAU;AACnC;AAAA,YACF;AAEA;AAAA,UACF;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACrF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,SAAS,aAAkD;AAC/D,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,OAAO,IAAI;AAAA,YAClD,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,YACX,cAAc;AAAA,UAChB,CAAC;AAED,iBAAO,KAAK,mBAAmB,SAAS,IAAI;AAAA,QAC9C,SAAS,OAAO;AACd,cAAI,iBAAiB,gBAAgB,MAAM,WAAW,KAAK;AACzD,mBAAO;AAAA,UACT;AACA,gBAAM,IAAI;AAAA,YACR,0BAA0B,WAAW,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACpG;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAY,MAMO;AACvB,YAAI;AACF,gBAAM,KAAK,MAAM,KAAK,OAAO,oBAAoB,GAAG;AAEpD,gBAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,OAAO,OAAO;AAAA,YACrD,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,WAAW,KAAK;AAAA,YAChB,QAAQ,KAAK;AAAA,UACf,CAAC;AAED,iBAAO,KAAK,mBAAmB,SAAS,IAAI;AAAA,QAC9C,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACrF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YACJ,aACA,MAQsB;AACtB,YAAI;AACF,gBAAM,KAAK,MAAM,KAAK,OAAO,oBAAoB,GAAG;AAEpD,gBAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,OAAO,OAAO;AAAA,YACrD,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,YACX,cAAc;AAAA,YACd,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,YACZ,UAAU,KAAK;AAAA,YACf,WAAW,KAAK;AAAA,YAChB,QAAQ,KAAK;AAAA,UACf,CAAC;AAED,iBAAO,KAAK,mBAAmB,SAAS,IAAI;AAAA,QAC9C,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,2BAA2B,WAAW,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACrG;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,WAAW,aAA2C;AAC1D,eAAO,KAAK,YAAY,aAAa,EAAE,OAAO,SAAS,CAAC;AAAA,MAC1D;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAY,aAA2C;AAC3D,eAAO,KAAK,YAAY,aAAa,EAAE,OAAO,OAAO,CAAC;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAmF;AACvF,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,OAAO,kBAAkB;AAAA,YAChE,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,UACb,CAAC;AAED,iBAAO,SAAS,KAAK,IAAI,CAAC,WAAW;AAAA,YACnC,MAAM,MAAM;AAAA,YACZ,OAAO,MAAM;AAAA,YACb,aAAa,MAAM,eAAe;AAAA,UACpC,EAAE;AAAA,QACJ,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACrF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,gBAAkF;AACtF,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,OAAO,eAAe;AAAA,YAC7D,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,UACb,CAAC;AAED,iBAAO,SAAS,KAAK,IAAI,CAAC,eAAe;AAAA,YACvC,OAAO,UAAU;AAAA,YACjB,QAAQ,UAAU;AAAA,YAClB,OAAO,UAAU;AAAA,UACnB,EAAE;AAAA,QACJ,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACzF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,mBAAkE;AACtE,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,MAAM,kBAAkB;AAAA,YAC/D,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,UACb,CAAC;AAED,iBAAO,SAAS,KAAK,IAAI,CAAC,kBAAkB;AAAA,YAC1C,OAAO,aAAa;AAAA,YACpB,IAAI,aAAa;AAAA,UACnB,EAAE;AAAA,QACJ,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC5F;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,eAKH;AACD,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,UAAU,IAAI;AACvD,gBAAM,OAAO,SAAS,KAAK;AAE3B,iBAAO;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,WAAW,KAAK;AAAA,YAChB,OAAO,IAAI,KAAK,KAAK,QAAQ,GAAI;AAAA,YACjC,MAAM,KAAK;AAAA,UACb;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACzF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,mBAAmB,OAAyB;AAClD,eAAO;AAAA,UACL,IAAI,MAAM;AAAA,UACV,QAAQ,MAAM;AAAA,UACd,OAAO,MAAM;AAAA,UACb,MAAM,MAAM,QAAQ;AAAA,UACpB,OAAO,MAAM;AAAA,UACb,YAAY,MAAM;AAAA,UAClB,YAAY,MAAM;AAAA,UAClB,UAAU,MAAM,WACZ;AAAA,YACE,OAAO,MAAM,SAAS;AAAA,YACtB,IAAI,MAAM,SAAS;AAAA,UACrB,IACA;AAAA,UACJ,QAAQ,MAAM,OAAO,IAAI,CAAC,WAAgB;AAAA,YACxC,MAAM,MAAM;AAAA,YACZ,OAAO,MAAM;AAAA,UACf,EAAE;AAAA,UACF,WAAW,MAAM,YACb;AAAA,YACE,OAAO,MAAM,UAAU;AAAA,YACvB,QAAQ,MAAM,UAAU;AAAA,UAC1B,IACA;AAAA,UACJ,UAAU,MAAM;AAAA,QAClB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,MAAM,IAA2B;AACvC,eAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AAAA,MACzD;AAAA,IACF;AAtX0B;AAAnB,IAAM,eAAN;AAAA;AAAA;;;ACTP,IAKAC,MACAC,QAgBa;AAtBb;AAAA;AAAA;AAAA;AAKA,IAAAD,OAAoB;AACpB,IAAAC,SAAsB;AAatB;AACA;AAEO,IAAM,oBAAN,MAAM,kBAAiB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAER,YAAY,eAA8B;AA7B5C;AA8BI,aAAK,gBAAgB;AACrB,aAAK,SAAS,cAAc,UAAU;AACtC,aAAK,oBAAoB,IAAI,kBAAkB;AAE/C,YAAI,GAAC,UAAK,OAAO,gBAAZ,mBAAyB,UAAS;AACrC,gBAAM,IAAI,MAAM,qDAAqD;AAAA,QACvE;AAEA,aAAK,aAAa,KAAK,OAAO;AAC9B,aAAK,SAAS,IAAI,aAAa,KAAK,UAAU;AAAA,MAChD;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,iBAAiE;AACrE,eAAO,MAAM,KAAK,OAAO,eAAe;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,gBAAqC;AACzC,YAAI;AACF,gBAAM,YAAY,MAAM,KAAK,OAAO,aAAa;AACjD,gBAAM,cAAc,MAAM,KAAK,eAAe;AAC9C,gBAAM,eAAe,KAAK,gBAAgB;AAE1C,cAAI,WAAW;AACf,cAAI,YAAY;AAEhB,cAAO,gBAAW,YAAY,GAAG;AAC/B,kBAAM,WAAW,KAAK,MAAS,kBAAa,cAAc,MAAM,CAAC;AACjE,uBAAW,SAAS,aAAa;AACjC,wBAAY,SAAS,aAAa;AAAA,UACpC;AAEA,iBAAO;AAAA,YACL,SAAS,KAAK,WAAW;AAAA,YACzB,YAAY,KAAK,WAAW;AAAA,YAC5B,WAAW;AAAA,YACX,WAAW,KAAK,WAAW;AAAA,YAC3B,oBAAoB,YAAY;AAAA,cAC9B,CAAC,UAAU,MAAM,gBAAgB,WAAW,MAAM,gBAAgB;AAAA,YACpE,EAAE;AAAA,YACF;AAAA,YACA,aAAa,UAAU,YAAY,MAAM,YAAY;AAAA,UACvD;AAAA,QACF,SAAS,QAAQ;AACf,iBAAO;AAAA,YACL,SAAS,KAAK,WAAW;AAAA,YACzB,YAAY,KAAK,WAAW;AAAA,YAC5B,WAAW;AAAA,YACX,WAAW,KAAK,WAAW;AAAA,YAC3B,oBAAoB;AAAA,YACpB,WAAW;AAAA,YACX,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,eAAoC;AACxC,cAAM,SAAqB;AAAA,UACzB,SAAS;AAAA,UACT,YAAY,CAAC;AAAA,UACb,QAAQ,CAAC;AAAA,UACT,WAAW,CAAC;AAAA,UACZ,cAAc;AAAA,UACd,cAAc;AAAA,UACd,eAAe;AAAA,UACf,gBAAgB;AAAA,QAClB;AAEA,YAAI;AACF,gBAAM,cAAc,MAAM,KAAK,eAAe;AAC9C,gBAAM,eAAe,MAAM,KAAK,OAAO,aAAa;AAGpD,gBAAM,kBAAkB,IAAI,IAAI,aAAa,IAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC;AAElF,qBAAW,cAAc,aAAa;AACpC,kBAAM,YAAY,MAAM,KAAK,qBAAqB,YAAY,eAAe;AAC7E,mBAAO,WAAW,KAAK,SAAS;AAEhC,gBAAI,UAAU,SAAS,QAAQ;AAC7B,qBAAO;AAAA,YACT,WAAW,UAAU,SAAS,YAAY;AACxC,qBAAO,UAAU,KAAK,SAAS;AAC/B,qBAAO;AAAA,YACT,OAAO;AACL,qBAAO;AAAA,YACT;AAAA,UACF;AAGA,gBAAM,KAAK,mBAAmB,MAAM;AAEpC,iBAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,iBAAO,OAAO,KAAK,iBAAiB,QAAQ,MAAM,UAAU,2BAA2B;AACvF,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,iBAAsC;AAC1C,cAAM,SAAqB;AAAA,UACzB,SAAS;AAAA,UACT,YAAY,CAAC;AAAA,UACb,QAAQ,CAAC;AAAA,UACT,WAAW,CAAC;AAAA,UACZ,cAAc;AAAA,UACd,cAAc;AAAA,UACd,eAAe;AAAA,UACf,gBAAgB;AAAA,QAClB;AAEA,YAAI;AACF,gBAAM,eAAe,MAAM,KAAK,OAAO,aAAa;AACpD,gBAAM,cAAc,MAAM,KAAK,eAAe;AAG9C,gBAAM,iBAAiB,IAAI;AAAA,YACzB,YACG,OAAO,CAAC,UAAU,MAAM,aAAa,EACrC,IAAI,CAAC,UAAU,CAAC,MAAM,eAAgB,KAAK,CAAC;AAAA,UACjD;AAEA,qBAAW,eAAe,cAAc;AACtC,kBAAM,YAAY,MAAM,KAAK,qBAAqB,aAAa,cAAc;AAC7E,mBAAO,WAAW,KAAK,SAAS;AAEhC,gBAAI,UAAU,SAAS,QAAQ;AAC7B,qBAAO;AAAA,YACT,WAAW,UAAU,SAAS,YAAY;AACxC,qBAAO,UAAU,KAAK,SAAS;AAC/B,qBAAO;AAAA,YACT,OAAO;AACL,qBAAO;AAAA,YACT;AAAA,UACF;AAGA,gBAAM,KAAK,mBAAmB,MAAM;AAEpC,iBAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,iBAAO,OAAO,KAAK,iBAAiB,QAAQ,MAAM,UAAU,2BAA2B;AACvF,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,oBAAyC;AAC7C,cAAM,SAAqB;AAAA,UACzB,SAAS;AAAA,UACT,YAAY,CAAC;AAAA,UACb,QAAQ,CAAC;AAAA,UACT,WAAW,CAAC;AAAA,UACZ,cAAc;AAAA,UACd,cAAc;AAAA,UACd,eAAe;AAAA,UACf,gBAAgB;AAAA,QAClB;AAEA,YAAI;AACF,gBAAM,cAAc,MAAM,KAAK,eAAe;AAC9C,gBAAM,eAAe,MAAM,KAAK,OAAO,aAAa;AAGpD,gBAAM,kBAAkB,IAAI,IAAI,aAAa,IAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC;AAClF,gBAAM,iBAAiB,IAAI;AAAA,YACzB,YACG,OAAO,CAAC,UAAU,MAAM,aAAa,EACrC,IAAI,CAAC,UAAU,CAAC,MAAM,eAAgB,KAAK,CAAC;AAAA,UACjD;AAGA,qBAAW,cAAc,aAAa;AACpC,kBAAM,YAAY,MAAM,KAAK;AAAA,cAC3B;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,mBAAO,WAAW,KAAK,SAAS;AAChC,iBAAK,qBAAqB,QAAQ,SAAS;AAAA,UAC7C;AAGA,qBAAW,eAAe,cAAc;AACtC,gBAAI,CAAC,eAAe,IAAI,YAAY,MAAM,GAAG;AAC3C,oBAAM,YAAY,MAAM,KAAK;AAAA,gBAC3B;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AACA,qBAAO,WAAW,KAAK,SAAS;AAChC,mBAAK,qBAAqB,QAAQ,SAAS;AAAA,YAC7C;AAAA,UACF;AAGA,gBAAM,KAAK,mBAAmB,MAAM;AAEpC,iBAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,iBAAO,OAAO;AAAA,YACZ,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UAC3C;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,qBACZ,YACA,iBACwB;AACxB,cAAM,YAA2B;AAAA,UAC/B,MAAM;AAAA,UACN,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAEA,YAAI;AACF,cAAI,WAAW,eAAe;AAE5B,kBAAM,cAAc,gBAAgB,IAAI,WAAW,aAAa;AAChE,gBAAI,aAAa;AACf,wBAAU,eAAe;AAGzB,kBAAI,MAAM,KAAK,YAAY,YAAY,WAAW,GAAG;AACnD,0BAAU,OAAO;AACjB,0BAAU,SAAS;AACnB,uBAAO;AAAA,cACT;AAGA,oBAAM,qBAAqB,MAAM,KAAK,OAAO,YAAY,WAAW,eAAe;AAAA,gBACjF,OAAO,WAAW;AAAA,gBAClB,MAAM,KAAK,sBAAsB,UAAU;AAAA,gBAC3C,OAAO,KAAK,uBAAuB,WAAW,MAAM;AAAA,gBACpD,UAAU,KAAK,WAAW,iBAAiB,WAAW,WAAW;AAAA,gBACjE,QAAQ,KAAK,WAAW,cAAc,WAAW,OAAO;AAAA,cAC1D,CAAC;AAED,wBAAU,SAAS;AACnB,wBAAU,eAAe;AAGzB,oBAAM,KAAK,mCAAmC,YAAY,kBAAkB;AAAA,YAC9E;AAAA,UACF,OAAO;AAEL,kBAAM,iBAAiB,MAAM,KAAK,OAAO,YAAY;AAAA,cACnD,OAAO,WAAW;AAAA,cAClB,MAAM,KAAK,sBAAsB,UAAU;AAAA,cAC3C,UAAU,KAAK,WAAW,iBAAiB,WAAW,WAAW;AAAA,cACjE,QAAQ,KAAK,WAAW,cAAc,WAAW,OAAO;AAAA,YAC1D,CAAC;AAED,sBAAU,SAAS;AACnB,sBAAU,eAAe;AAGzB,kBAAM,KAAK,mCAAmC,YAAY,cAAc;AAAA,UAC1E;AAAA,QACF,SAAS,OAAO;AACd,oBAAU,SAAS,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACvF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,qBACZ,aACA,gBACwB;AACxB,cAAM,YAA2B;AAAA,UAC/B,MAAM;AAAA,UACN,aAAa,CAAC;AAAA,UACd,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAEA,YAAI;AACF,gBAAM,aAAa,eAAe,IAAI,YAAY,MAAM;AAExD,cAAI,YAAY;AAEd,sBAAU,cAAc;AAGxB,gBAAI,MAAM,KAAK,YAAY,YAAY,WAAW,GAAG;AACnD,wBAAU,OAAO;AACjB,wBAAU,SAAS;AACnB,qBAAO;AAAA,YACT;AAGA,kBAAM,KAAK,2BAA2B,YAAY,WAAW;AAC7D,sBAAU,SAAS;AAAA,UACrB,OAAO;AAEL,kBAAM,gBAAgB,MAAM,KAAK,2BAA2B,WAAW;AACvE,sBAAU,cAAc;AACxB,sBAAU,SAAS;AAAA,UACrB;AAAA,QACF,SAAS,OAAO;AACd,oBAAU,SAAS,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACvF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,8BACZ,YACA,iBACA,WACA,aACwB;AACxB,YAAI,cAAc,UAAU,YAAY;AACtC,iBAAO,KAAK,qBAAqB,YAAY,eAAe;AAAA,QAC9D,WAAW,cAAc,UAAU,aAAa;AAC9C,gBAAM,iBAAiB,oBAAI,IAAuB;AAClD,iBAAO,KAAK,qBAAqB,aAAa,cAAc;AAAA,QAC9D;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa,cAAe,CAAC;AAAA,UAC7B,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,YAAY,YAAuB,aAA4C;AAC3F,YACE,KAAK,WAAW,wBAAwB,gBACxC,KAAK,WAAW,wBAAwB,eACxC;AACA,iBAAO;AAAA,QACT;AAGA,cAAM,eAAe,IAAI,KAAK,WAAW,YAAY;AACrD,cAAM,gBAAgB,IAAI,KAAK,YAAY,UAAU;AACrD,cAAM,WAAW,MAAM,KAAK,gBAAgB;AAE5C,eAAO,eAAe,YAAY,gBAAgB;AAAA,MACpD;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,iBAAuC;AACnD,cAAM,QAAQ,KAAK,cAAc,iBAAiB;AAClD,cAAM,YAAY,MAAM;AAExB,YAAI,CAAI,gBAAW,SAAS,GAAG;AAC7B,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,SAAsB,CAAC;AAC7B,cAAM,QAAW,iBAAY,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC;AAE7E,mBAAW,QAAQ,OAAO;AACxB,cAAI;AACF,kBAAM,WAAgB,YAAK,WAAW,IAAI;AAC1C,kBAAM,UAAa,kBAAa,UAAU,MAAM;AAChD,kBAAM,SAAS,KAAK,kBAAkB,MAAM,OAAO;AAEnD,kBAAM,YAAuB;AAAA,cAC3B,GAAI,OAAO;AAAA,cACX,SAAS,OAAO;AAAA,cAChB,WAAW;AAAA,YACb;AAEA,mBAAO,KAAK,SAAS;AAAA,UACvB,SAAS,OAAO;AACd,oBAAQ;AAAA,cACN,8BAA8B,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACjG;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,sBAAsB,YAA+B;AAC3D,cAAM,aAAa;AAAA,UACjB,YAAY,WAAW;AAAA,UACvB,kBAAkB,WAAW;AAAA,UAC7B,eAAe,WAAW;AAAA,UAC1B,SAAS,WAAW;AAAA,UACpB,UAAU,WAAW;AAAA,UACrB,oBAAoB,WAAW;AAAA,UAC/B,oBAAoB,WAAW;AAAA,QACjC;AAEA,eAAO,GAAG,WAAW,OAAO;AAAA;AAAA;AAAA;AAAA,EAI9B,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA;AAAA,MAEnC;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAAuB,QAAuC;AACpE,gBAAQ,QAAQ;AAAA,UACd,KAAK;AAAA,UACL,KAAK;AACH,mBAAO;AAAA,UACT;AACE,mBAAO;AAAA,QACX;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAAuB,OAAsC;AACnE,eAAO,UAAU,WAAW,cAAc;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mCACZ,YACA,aACe;AACf,cAAM,qBAAuC;AAAA,UAC3C,GAAG;AAAA,UACH,WAAW,YAAY;AAAA,UACvB,eAAe,YAAY;AAAA,UAC3B,YAAY,YAAY;AAAA,UACxB,mBAAmB,YAAY;AAAA,UAC/B,aAAa;AAAA,UACb,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,QACvC;AAEA,YAAI,KAAK,WAAW,eAAe,YAAY,OAAO,SAAS,GAAG;AAChE,6BAAmB,gBAAgB,YAAY,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,QACjF;AAEA,YAAI,KAAK,WAAW,kBAAkB,YAAY,UAAU;AAC1D,6BAAmB,kBAAkB,YAAY,SAAS;AAAA,QAC5D;AAEA,YAAI,KAAK,WAAW,mBAAmB,YAAY,WAAW;AAC5D,6BAAmB,mBAAmB,YAAY,UAAU;AAAA,QAC9D;AAGA,cAAM,iBAAiB,KAAK,kBAAkB,UAAU,oBAAoB,WAAW,OAAO;AAC9F,QAAG,mBAAc,WAAW,WAAW,gBAAgB,MAAM;AAAA,MAC/D;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,2BACZ,YACA,aACe;AACf,cAAM,qBAAuC;AAAA,UAC3C,GAAG;AAAA,UACH,OAAO,YAAY;AAAA,UACnB,QAAQ,KAAK,uBAAuB,YAAY,KAAK;AAAA,UACrD,WAAW,YAAY;AAAA,UACvB,eAAe,YAAY;AAAA,UAC3B,YAAY,YAAY;AAAA,UACxB,mBAAmB,YAAY;AAAA,UAC/B,aAAa;AAAA,UACb,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,QACvC;AAEA,YAAI,KAAK,WAAW,eAAe,YAAY,OAAO,SAAS,GAAG;AAChE,6BAAmB,OAAO,YAAY,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AACtE,6BAAmB,gBAAgB,YAAY,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,QACjF;AAEA,YAAI,KAAK,WAAW,kBAAkB,YAAY,UAAU;AAC1D,6BAAmB,WAAW,YAAY,SAAS;AACnD,6BAAmB,kBAAkB,YAAY,SAAS;AAAA,QAC5D;AAEA,YAAI,KAAK,WAAW,mBAAmB,YAAY,WAAW;AAC5D,6BAAmB,YAAY,YAAY,UAAU;AACrD,6BAAmB,mBAAmB,YAAY,UAAU;AAAA,QAC9D;AAGA,cAAM,UAAU,KAAK,6BAA6B,YAAY,IAAI;AAGlE,cAAM,iBAAiB,KAAK,kBAAkB,UAAU,oBAAoB,OAAO;AACnF,QAAG,mBAAc,WAAW,WAAW,gBAAgB,MAAM;AAAA,MAC/D;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,2BAA2B,aAA8C;AAtjBzF;AAujBI,cAAM,QAAQ,KAAK,cAAc,iBAAiB;AAClD,cAAM,YAAY,MAAM;AAGxB,cAAM,UAAU,GAAG,KAAK,OAAO,mBAAmB,YAAY,IAAI,OAAO,YAAY,MAAM,EAAE,SAAS,GAAG,GAAG,CAAC;AAC7G,cAAM,WAAW,GAAG,OAAO;AAC3B,cAAM,WAAgB,YAAK,WAAW,QAAQ;AAE9C,cAAM,WAA6B;AAAA,UACjC,UAAU;AAAA,UACV,SAAS;AAAA;AAAA,UACT,OAAO,YAAY;AAAA,UACnB,aAAa,YAAY;AAAA,UACzB,QAAQ,KAAK,uBAAuB,YAAY,KAAK;AAAA,UACrD,UAAU;AAAA,UACV,YAAU,iBAAY,aAAZ,mBAAsB,UAAS,KAAK,OAAO,oBAAoB;AAAA,UACzE,cAAc,YAAY;AAAA,UAC1B,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,UACrC,kBAAkB;AAAA,UAClB,eAAe;AAAA,UACf,YAAY,CAAC;AAAA,UACb,aAAa;AAAA,UACb,eAAe,CAAC;AAAA,UAChB,WAAW,YAAY;AAAA,UACvB,eAAe,YAAY;AAAA,UAC3B,YAAY,YAAY;AAAA,UACxB,mBAAmB,YAAY;AAAA,UAC/B,MAAM,KAAK,WAAW,cAAc,YAAY,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,IAAI,CAAC;AAAA,UACrF,eAAe,YAAY,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,UAC3D,kBAAiB,iBAAY,aAAZ,mBAAsB;AAAA,UACvC,mBAAkB,iBAAY,cAAZ,mBAAuB;AAAA,UACzC,WAAW,KAAK,WAAW,mBAAkB,iBAAY,cAAZ,mBAAuB,QAAQ;AAAA,QAC9E;AAGA,cAAM,UAAU,KAAK,6BAA6B,YAAY,IAAI;AAGlE,cAAM,eAAe,KAAK,kBAAkB,UAAU,UAAU,OAAO;AACvE,QAAG,mBAAc,UAAU,cAAc,MAAM;AAE/C,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,6BAA6B,MAAsB;AAEzD,cAAM,gBAAgB;AACtB,eAAO,KAAK,QAAQ,eAAe,EAAE,EAAE,KAAK;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,kBAAiC;AAC7C,cAAM,eAAe,KAAK,gBAAgB;AAC1C,YAAO,gBAAW,YAAY,GAAG;AAC/B,gBAAM,WAAW,KAAK,MAAS,kBAAa,cAAc,MAAM,CAAC;AACjE,iBAAO,IAAI,KAAK,SAAS,aAAa,CAAC;AAAA,QACzC;AACA,eAAO,oBAAI,KAAK,CAAC;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAAmB,QAAmC;AAClE,cAAM,eAAe,KAAK,gBAAgB;AAC1C,cAAM,WAAW;AAAA,UACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,aAAa;AAAA,UACb,WAAW,OAAO;AAAA,QACpB;AAEA,QAAG,mBAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,MAAM;AAAA,MAC1E;AAAA;AAAA;AAAA;AAAA,MAKQ,kBAA0B;AAChC,cAAM,QAAQ,KAAK,cAAc,iBAAiB;AAClD,eAAY,YAAK,MAAM,WAAW,oBAAoB;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA,MAKQ,qBAAqB,QAAoB,WAAgC;AAC/E,YAAI,UAAU,SAAS,QAAQ;AAC7B,iBAAO;AAAA,QACT,WAAW,UAAU,SAAS,QAAQ;AACpC,iBAAO;AAAA,QACT,WAAW,UAAU,SAAS,YAAY;AACxC,iBAAO,UAAU,KAAK,SAAS;AAC/B,iBAAO;AAAA,QACT,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AA3oB8B;AAAvB,IAAM,mBAAN;AAAA;AAAA;;;ACXA,SAAS,iCAA0C;AACxD,QAAM,UAAU,IAAI,2BAAQ,eAAe;AAE3C,UACG,YAAY,0DAA0D,EACtE,OAAO,aAAa,kDAAkD,EACtE,OAAO,WAAW,gCAAgC,EAClD,OAAO,aAAa,oCAAoC,EACxD,OAAO,oCAAoC,yCAAyC,QAAQ,EAC5F,OAAO,OAAO,YAAY;AApB/B;AAqBM,QAAI;AACF,YAAM,gBAAgB,IAAI,cAAc;AACxC,YAAM,SAAS,cAAc,UAAU;AAGvC,UAAI,GAAC,YAAO,gBAAP,mBAAoB,UAAS;AAChC,gBAAQ;AAAA,UACN,UAAU,MAAM,oEAAoE;AAAA,QACtF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,IAAI,UAAU,OAAO,qCAA8B,CAAC;AAC5D,cAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,YAAY,UAAU,EAAE,CAAC;AAC1E,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,wBAAwB,QAAQ,uBAAuB,WAAW,OAAO,YAAY,sBAAsB,QAAQ,kBAAkB;AAAA,QACvI;AAAA,MACF;AACA,cAAQ,IAAI,EAAE;AAEd,YAAM,aAAa,IAAI,iBAAiB,aAAa;AAGrD,YAAM,cAAU,YAAAC,SAAI,8BAA8B,EAAE,MAAM;AAC1D,YAAM,aAAa,MAAM,WAAW,eAAe;AAEnD,UAAI,CAAC,WAAW,SAAS;AACvB,gBAAQ,KAAK,0BAA0B;AACvC,gBAAQ,IAAI,UAAU,MAAM,WAAW,OAAO,CAAC;AAC/C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,QAAQ,4BAA4B;AAG5C,YAAM,kBAAc,YAAAA,SAAI,kCAAkC,EAAE,MAAM;AAElE,UAAI;AACF,cAAM,SAAS,MAAM,WAAW,kBAAkB;AAElD,YAAI,QAAQ,QAAQ;AAClB,sBAAY,QAAQ,mBAAmB;AACvC,kBAAQ,IAAI,UAAU,KAAK,qCAAqC,CAAC;AAAA,QACnE,OAAO;AACL,sBAAY,QAAQ,8BAA8B;AAAA,QACpD;AAEA,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,eAAe,CAAC;AAC3C,gBAAQ,IAAI,aAAa,OAAO,YAAY,SAAS;AACrD,gBAAQ,IAAI,aAAa,OAAO,YAAY,SAAS;AACrD,gBAAQ,IAAI,cAAc,OAAO,aAAa,SAAS;AACvD,gBAAQ,IAAI,gBAAgB,OAAO,cAAc,SAAS;AAC1D,gBAAQ,IAAI,aAAa,OAAO,OAAO,MAAM,EAAE;AAG/C,YAAI,OAAO,WAAW,OAAO,mBAAmB,GAAG;AACjD,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,QAAQ,mDAA8C,CAAC;AAAA,QAC/E,WAAW,OAAO,WAAW,OAAO,iBAAiB,GAAG;AACtD,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,QAAQ,4CAAkC,CAAC;AAAA,QACnE,OAAO;AACL,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,MAAM,mCAA8B,CAAC;AAAA,QAC7D;AAGA,YAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,MAAM,qBAAqB,CAAC;AAClD,iBAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,oBAAQ,IAAI,YAAO,KAAK,EAAE;AAAA,UAC5B,CAAC;AAAA,QACH;AAGA,YAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,QAAQ,qBAAqB,CAAC;AACpD,iBAAO,UAAU,QAAQ,CAAC,aAAa;AACrC,oBAAQ,IAAI,YAAO,SAAS,YAAY,KAAK,KAAK,SAAS,YAAY,QAAQ,GAAG;AAClF,oBAAQ,IAAI,aAAa,SAAS,IAAI,EAAE;AACxC,oBAAQ,IAAI,eAAe,SAAS,MAAM,EAAE;AAC5C,gBAAI,SAAS,cAAc;AACzB,sBAAQ;AAAA,gBACN,gBAAgB,SAAS,aAAa,MAAM,MAAM,SAAS,aAAa,QAAQ;AAAA,cAClF;AAAA,YACF;AAAA,UACF,CAAC;AAED,cAAI,CAAC,QAAQ,OAAO;AAClB,oBAAQ,IAAI,EAAE;AACd,oBAAQ,IAAI,UAAU,KAAK,8BAA8B,CAAC;AAC1D,oBAAQ;AAAA,cACN;AAAA,YACF;AACA,oBAAQ,IAAI,0EAAqE;AACjF,oBAAQ,IAAI,2EAAsE;AAClF,oBAAQ,IAAI,oDAA+C;AAAA,UAC7D;AAAA,QACF;AAGA,YAAI,QAAQ,SAAS;AACnB,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,sBAAsB,CAAC;AAClD,iBAAO,WAAW,QAAQ,CAAC,IAAI,UAAU;AAjIrD,gBAAAC,KAAA;AAkIc,kBAAM,QAAQ,GAAG,YAAY,WAASA,MAAA,GAAG,iBAAH,gBAAAA,IAAiB,UAAS;AAChE,kBAAM,UAAU,GAAG,YAAY,YAAY,KAAI,QAAG,iBAAH,mBAAiB,MAAM;AAEtE,oBAAQ,IAAI,KAAK,QAAQ,CAAC,KAAK,KAAK,KAAK,OAAO,GAAG;AACnD,oBAAQ,IAAI,cAAc,GAAG,IAAI,EAAE;AACnC,oBAAQ,IAAI,gBAAgB,GAAG,MAAM,EAAE;AACvC,gBAAI,GAAG,QAAQ;AACb,sBAAQ,IAAI,gBAAgB,GAAG,MAAM,EAAE;AAAA,YACzC;AACA,gBAAI,GAAG,cAAc;AACnB,sBAAQ;AAAA,gBACN,iBAAiB,GAAG,aAAa,MAAM,MAAM,GAAG,aAAa,QAAQ;AAAA,cACvE;AAAA,YACF;AACA,gBAAI,GAAG,YAAY,WAAW;AAC5B,sBAAQ,IAAI,eAAe,GAAG,YAAY,SAAS,EAAE;AAAA,YACvD;AACA,oBAAQ,IAAI,EAAE;AAAA,UAChB,CAAC;AAAA,QACH;AAGA,YAAI,OAAO,SAAS;AAClB,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,aAAa,CAAC;AAEzC,cAAI,OAAO,eAAe,GAAG;AAC3B,oBAAQ,IAAI,+DAA0D;AACtE,oBAAQ,IAAI,+DAA0D;AAAA,UACxE;AAEA,cAAI,OAAO,eAAe,GAAG;AAC3B,oBAAQ,IAAI,0DAAqD;AACjE,oBAAQ,IAAI,uEAAkE;AAAA,UAChF;AAEA,cAAI,OAAO,iBAAiB,GAAG;AAC7B,oBAAQ,IAAI,gDAA2C;AACvD,oBAAQ,IAAI,0DAAqD;AAAA,UACnE;AAEA,cAAI,OAAO,YAAY,WAAW;AAChC,oBAAQ,IAAI,wEAAmE;AAAA,UACjF,OAAO;AACL,oBAAQ,IAAI,4EAAuE;AAAA,UACrF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,KAAK,2BAA2B;AAC5C,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,MAAM,4BAA4B,CAAC;AAC3D,cAAQ,MAAM,UAAU,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AA7LA,IAKAC,oBACAC;AANA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB,IAAAC,cAAgB;AAChB;AACA;AACA;AAEgB;AAAA;AAAA;;;ACAT,SAAS,wBAAiC;AAC/C,QAAM,UAAU,IAAI,2BAAQ,MAAM;AAElC,UACG,YAAY,mCAAmC,EAC/C,OAAO,aAAa,kDAAkD,EACtE,OAAO,WAAW,gCAAgC,EAClD,OAAO,aAAa,oCAAoC,EACxD,OAAO,OAAO,YAAY;AAnB/B;AAoBM,QAAI;AACF,YAAM,gBAAgB,IAAI,cAAc;AACxC,YAAM,SAAS,cAAc,UAAU;AAGvC,UAAI,GAAC,YAAO,gBAAP,mBAAoB,UAAS;AAChC,gBAAQ;AAAA,UACN,UAAU,MAAM,oEAAoE;AAAA,QACtF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,IAAI,UAAU,OAAO,uCAAgC,CAAC;AAC9D,cAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,YAAY,UAAU,EAAE,CAAC;AAC1E,cAAQ,IAAI,EAAE;AAEd,YAAM,aAAa,IAAI,iBAAiB,aAAa;AAGrD,YAAM,cAAU,YAAAC,SAAI,8BAA8B,EAAE,MAAM;AAC1D,YAAM,aAAa,MAAM,WAAW,eAAe;AAEnD,UAAI,CAAC,WAAW,SAAS;AACvB,gBAAQ,KAAK,0BAA0B;AACvC,gBAAQ,IAAI,UAAU,MAAM,WAAW,OAAO,CAAC;AAC/C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,QAAQ,4BAA4B;AAG5C,YAAM,kBAAc,YAAAA,SAAI,gCAAgC,EAAE,MAAM;AAEhE,UAAI;AACF,cAAM,SAAS,MAAM,WAAW,eAAe;AAE/C,YAAI,QAAQ,QAAQ;AAClB,sBAAY,QAAQ,mBAAmB;AACvC,kBAAQ,IAAI,UAAU,KAAK,qCAAqC,CAAC;AAAA,QACnE,OAAO;AACL,sBAAY,QAAQ,gBAAgB;AAAA,QACtC;AAEA,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,eAAe,CAAC;AAC3C,gBAAQ,IAAI,aAAa,OAAO,YAAY,SAAS;AACrD,gBAAQ,IAAI,cAAc,OAAO,aAAa,SAAS;AACvD,gBAAQ,IAAI,gBAAgB,OAAO,cAAc,SAAS;AAC1D,gBAAQ,IAAI,aAAa,OAAO,OAAO,MAAM,EAAE;AAE/C,YAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,MAAM,qBAAqB,CAAC;AAClD,iBAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,oBAAQ,IAAI,YAAO,KAAK,EAAE;AAAA,UAC5B,CAAC;AAAA,QACH;AAEA,YAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,QAAQ,qBAAqB,CAAC;AACpD,iBAAO,UAAU,QAAQ,CAAC,aAAa;AACrC,oBAAQ,IAAI,YAAO,SAAS,YAAY,KAAK,KAAK,SAAS,YAAY,QAAQ,GAAG;AAClF,oBAAQ,IAAI,eAAe,SAAS,MAAM,EAAE;AAC5C,gBAAI,SAAS,cAAc;AACzB,sBAAQ;AAAA,gBACN,gBAAgB,SAAS,aAAa,MAAM,MAAM,SAAS,aAAa,QAAQ;AAAA,cAClF;AAAA,YACF;AAAA,UACF,CAAC;AAED,cAAI,CAAC,QAAQ,OAAO;AAClB,oBAAQ,IAAI,EAAE;AACd,oBAAQ,IAAI,UAAU,KAAK,uBAAuB,CAAC;AACnD,oBAAQ,IAAI,6EAAwE;AACpF,oBAAQ,IAAI,2EAAsE;AAClF,oBAAQ,IAAI,4DAAuD;AAAA,UACrE;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS;AACnB,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,sBAAsB,CAAC;AAClD,iBAAO,WAAW,QAAQ,CAAC,IAAI,UAAU;AAvGrD,gBAAAC,KAAA;AAwGc,oBAAQ;AAAA,cACN,KAAK,QAAQ,CAAC,OAAKA,MAAA,GAAG,iBAAH,gBAAAA,IAAiB,UAAS,SAAS,OAAM,QAAG,iBAAH,mBAAiB,MAAM;AAAA,YACrF;AACA,oBAAQ,IAAI,cAAc,GAAG,IAAI,EAAE;AACnC,oBAAQ,IAAI,gBAAgB,GAAG,MAAM,EAAE;AACvC,gBAAI,GAAG,QAAQ;AACb,sBAAQ,IAAI,gBAAgB,GAAG,MAAM,EAAE;AAAA,YACzC;AACA,gBAAI,GAAG,cAAc;AACnB,sBAAQ,IAAI,gBAAgB,GAAG,aAAa,QAAQ,EAAE;AAAA,YACxD;AACA,gBAAI,GAAG,YAAY,UAAU;AAC3B,sBAAQ,IAAI,eAAe,GAAG,YAAY,QAAQ,EAAE;AAAA,YACtD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,OAAO,SAAS;AAClB,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,QAAQ,wCAAwC,CAAC;AAEvE,cAAI,OAAO,eAAe,GAAG;AAC3B,oBAAQ,IAAI,EAAE;AACd,oBAAQ,IAAI,UAAU,KAAK,aAAa,CAAC;AACzC,oBAAQ,IAAI,uDAAkD;AAC9D,oBAAQ,IAAI,uDAAkD;AAC9D,oBAAQ,IAAI,0DAAqD;AAAA,UACnE;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,EAAE;AACd,kBAAQ;AAAA,YACN,UAAU,QAAQ,gEAAgE;AAAA,UACpF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,KAAK,aAAa;AAC9B,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,MAAM,cAAc,CAAC;AAC7C,cAAQ,MAAM,UAAU,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAtJA,IAKAC,oBACAC;AANA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB,IAAAC,cAAgB;AAChB;AACA;AACA;AAEgB;AAAA;AAAA;;;ACAT,SAAS,wBAAiC;AAC/C,QAAM,UAAU,IAAI,2BAAQ,MAAM;AAElC,UACG,YAAY,8BAA8B,EAC1C,OAAO,aAAa,kDAAkD,EACtE,OAAO,WAAW,gCAAgC,EAClD,OAAO,aAAa,oCAAoC,EACxD,OAAO,OAAO,YAAY;AAnB/B;AAoBM,QAAI;AACF,YAAM,gBAAgB,IAAI,cAAc;AACxC,YAAM,SAAS,cAAc,UAAU;AAGvC,UAAI,GAAC,YAAO,gBAAP,mBAAoB,UAAS;AAChC,gBAAQ;AAAA,UACN,UAAU,MAAM,oEAAoE;AAAA,QACtF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,IAAI,UAAU,OAAO,2CAAoC,CAAC;AAClE,cAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,YAAY,UAAU,EAAE,CAAC;AAC1E,cAAQ,IAAI,EAAE;AAEd,YAAM,aAAa,IAAI,iBAAiB,aAAa;AAGrD,YAAM,cAAU,YAAAC,SAAI,8BAA8B,EAAE,MAAM;AAC1D,YAAM,aAAa,MAAM,WAAW,eAAe;AAEnD,UAAI,CAAC,WAAW,SAAS;AACvB,gBAAQ,KAAK,0BAA0B;AACvC,gBAAQ,IAAI,UAAU,MAAM,WAAW,OAAO,CAAC;AAC/C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,QAAQ,4BAA4B;AAG5C,YAAM,kBAAc,YAAAA,SAAI,oCAAoC,EAAE,MAAM;AAEpE,UAAI;AACF,cAAM,SAAS,MAAM,WAAW,aAAa;AAE7C,YAAI,QAAQ,QAAQ;AAClB,sBAAY,QAAQ,mBAAmB;AACvC,kBAAQ,IAAI,UAAU,KAAK,qCAAqC,CAAC;AAAA,QACnE,OAAO;AACL,sBAAY,QAAQ,gBAAgB;AAAA,QACtC;AAEA,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,eAAe,CAAC;AAC3C,gBAAQ,IAAI,aAAa,OAAO,YAAY,SAAS;AACrD,gBAAQ,IAAI,cAAc,OAAO,aAAa,SAAS;AACvD,gBAAQ,IAAI,gBAAgB,OAAO,cAAc,SAAS;AAC1D,gBAAQ,IAAI,aAAa,OAAO,OAAO,MAAM,EAAE;AAE/C,YAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,MAAM,qBAAqB,CAAC;AAClD,iBAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,oBAAQ,IAAI,YAAO,KAAK,EAAE;AAAA,UAC5B,CAAC;AAAA,QACH;AAEA,YAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,QAAQ,qBAAqB,CAAC;AACpD,iBAAO,UAAU,QAAQ,CAAC,aAAa;AACrC,oBAAQ,IAAI,YAAO,SAAS,YAAY,KAAK,KAAK,SAAS,YAAY,QAAQ,GAAG;AAClF,oBAAQ,IAAI,eAAe,SAAS,MAAM,EAAE;AAAA,UAC9C,CAAC;AAED,cAAI,CAAC,QAAQ,OAAO;AAClB,oBAAQ,IAAI,EAAE;AACd,oBAAQ,IAAI,UAAU,KAAK,uBAAuB,CAAC;AACnD,oBAAQ,IAAI,6EAAwE;AACpF,oBAAQ,IAAI,0EAAqE;AACjF,oBAAQ,IAAI,6DAAwD;AAAA,UACtE;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS;AACnB,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,sBAAsB,CAAC;AAClD,iBAAO,WAAW,QAAQ,CAAC,IAAI,UAAU;AACvC,oBAAQ,IAAI,KAAK,QAAQ,CAAC,KAAK,GAAG,YAAY,KAAK,KAAK,GAAG,YAAY,QAAQ,GAAG;AAClF,oBAAQ,IAAI,cAAc,GAAG,IAAI,EAAE;AACnC,oBAAQ,IAAI,gBAAgB,GAAG,MAAM,EAAE;AACvC,gBAAI,GAAG,QAAQ;AACb,sBAAQ,IAAI,gBAAgB,GAAG,MAAM,EAAE;AAAA,YACzC;AACA,gBAAI,GAAG,cAAc;AACnB,sBAAQ;AAAA,gBACN,iBAAiB,GAAG,aAAa,MAAM,MAAM,GAAG,aAAa,QAAQ;AAAA,cACvE;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,OAAO,SAAS;AAClB,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,QAAQ,wCAAwC,CAAC;AAAA,QACzE,OAAO;AACL,kBAAQ,IAAI,EAAE;AACd,kBAAQ;AAAA,YACN,UAAU,QAAQ,gEAAgE;AAAA,UACpF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,KAAK,aAAa;AAC9B,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,MAAM,cAAc,CAAC;AAC7C,cAAQ,MAAM,UAAU,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAtIA,IAKAC,oBACAC;AANA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB,IAAAC,cAAgB;AAChB;AACA;AACA;AAEgB;AAAA;AAAA;;;ACCT,SAAS,yBAAkC;AAChD,QAAM,UAAU,IAAI,2BAAQ,OAAO;AAEnC,UACG,YAAY,uCAAuC,EACnD,OAAO,uBAAuB,uCAAuC,EACrE,OAAO,mBAAmB,8BAA8B,EACxD,OAAO,eAAe,uBAAuB,EAC7C,OAAO,kBAAkB,wBAAwB,EACjD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,oBAAoB,+BAA+B,EAC1D,OAAO,qBAAqB,kCAAkC,EAC9D,OAAO,wBAAwB,mCAAmC,EAClE,OAAO,oBAAoB,iCAAiC,EAC5D,OAAO,uBAAuB,kCAAkC,EAChE,OAAO,uBAAuB,kCAAkC,IAAI,EACpE,OAAO,2BAA2B,2CAA2C,KAAK,EAClF,OAAO,aAAa,sDAAsD,EAC1E,OAAO,WAAW,wCAAwC,EAC1D,OAAO,OAAO,YAAY;AApC/B;AAqCM,QAAI;AACF,YAAM,gBAAgB,IAAI,cAAc;AACxC,YAAM,SAAS,cAAc,UAAU;AAGvC,YAAI,YAAO,gBAAP,mBAAoB,YAAW,CAAC,QAAQ,OAAO;AACjD,gBAAQ;AAAA,UACN,UAAU,QAAQ,gEAAgE;AAAA,QACpF;AACA,gBAAQ,IAAI,UAAU,KAAK,uBAAuB,OAAO,YAAY,UAAU,EAAE,CAAC;AAClF,gBAAQ;AAAA,UACN,UAAU,KAAK,cAAc,OAAO,YAAY,YAAY,YAAY,UAAU,EAAE;AAAA,QACtF;AACA,gBAAQ;AAAA,UACN,UAAU,KAAK,wBAAwB,OAAO,YAAY,mBAAmB,EAAE;AAAA,QACjF;AACA;AAAA,MACF;AAEA,cAAQ,IAAI,UAAU,OAAO,6BAAsB,CAAC;AACpD,cAAQ;AAAA,QACN,UAAU,KAAK,qEAAqE;AAAA,MACtF;AACA,cAAQ,IAAI,EAAE;AAEd,UAAI;AAEJ,UAAI,QAAQ,cAAc,QAAQ,OAAO;AAEvC,qBAAa;AAAA,UACX,SAAS;AAAA,UACT,YAAY,QAAQ;AAAA,UACpB,OAAO,QAAQ;AAAA,UACf,WAAW,QAAQ,YAAY;AAAA,UAC/B,qBAAqB,QAAQ,sBAAsB;AAAA,UACnD,aAAa,QAAQ,cAAc;AAAA,UACnC,iBAAiB,QAAQ,kBAAkB;AAAA,UAC3C,gBAAgB,QAAQ,iBAAiB;AAAA,UACzC,YAAY,SAAS,QAAQ,SAAS,KAAK;AAAA,UAC3C,kBAAkB,SAAS,QAAQ,cAAc,KAAK;AAAA,QACxD;AAAA,MACF,OAAO;AAEL,cAAM,UAAU,MAAM,iBAAAC,QAAS,OAAO;AAAA,UACpC;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,UAAU,wBAAC,UAAkB;AAC3B,kBAAI,CAAC,MAAM,SAAS,GAAG,GAAG;AACxB,uBAAO;AAAA,cACT;AACA,qBAAO;AAAA,YACT,GALU;AAAA,YAMV,SAAS,QAAQ;AAAA,UACnB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,UAAU,wBAAC,UAAkB;AAC3B,kBAAI,MAAM,SAAS,IAAI;AACrB,uBAAO;AAAA,cACT;AACA,qBAAO;AAAA,YACT,GALU;AAAA,YAMV,SAAS,QAAQ;AAAA,UACnB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,QAAQ,YAAY;AAAA,UAC/B;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,cACP,EAAE,MAAM,kCAAkC,OAAO,cAAc;AAAA,cAC/D,EAAE,MAAM,qBAAqB,OAAO,aAAa;AAAA,cACjD,EAAE,MAAM,sBAAsB,OAAO,cAAc;AAAA,YACrD;AAAA,YACA,SAAS,QAAQ,sBAAsB;AAAA,UACzC;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,QAAQ,cAAc;AAAA,UACjC;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,QAAQ,kBAAkB;AAAA,UACrC;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,QAAQ,iBAAiB;AAAA,UACpC;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,SAAS,QAAQ,SAAS,KAAK;AAAA,YACxC,UAAU,wBAAC,UAAkB,QAAQ,KAAK,SAAS,KAAzC;AAAA,UACZ;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,SAAS,QAAQ,cAAc,KAAK;AAAA,YAC7C,UAAU,wBAAC,UAAkB,SAAS,GAA5B;AAAA,UACZ;AAAA,QACF,CAAC;AAED,qBAAa;AAAA,UACX,SAAS;AAAA,UACT,GAAG;AAAA,QACL;AAAA,MACF;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,UAAU,KAAK,gDAAgD,CAAC;AAC5E,gBAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC/C;AAAA,MACF;AAGA,cAAQ,IAAI,UAAU,KAAK,8BAA8B,CAAC;AAC1D,YAAM,aAAa,IAAI,aAAa,UAAU;AAC9C,YAAM,aAAa,MAAM,WAAW,eAAe;AAEnD,UAAI,CAAC,WAAW,SAAS;AACvB,gBAAQ,IAAI,UAAU,MAAM,gCAAgC,CAAC;AAC7D,gBAAQ,IAAI,UAAU,MAAM,WAAW,OAAO,CAAC;AAC/C;AAAA,MACF;AAEA,cAAQ,IAAI,UAAU,QAAQ,gCAAgC,CAAC;AAG/D,YAAM,gBAAgB;AAAA,QACpB,GAAG;AAAA,QACH,aAAa;AAAA,MACf;AAEA,oBAAc,WAAW,aAAa;AAEtC,cAAQ,IAAI,UAAU,QAAQ,+CAA+C,CAAC;AAC9E,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,wBAAwB,CAAC;AACpD,cAAQ,IAAI,iBAAiB,WAAW,UAAU,EAAE;AACpD,cAAQ,IAAI,gBAAgB,WAAW,YAAY,YAAY,UAAU,EAAE;AAC3E,cAAQ,IAAI,0BAA0B,WAAW,mBAAmB,EAAE;AACtE,cAAQ,IAAI,kBAAkB,WAAW,cAAc,YAAY,UAAU,EAAE;AAC/E,cAAQ,IAAI,sBAAsB,WAAW,kBAAkB,YAAY,UAAU,EAAE;AACvF,cAAQ,IAAI,qBAAqB,WAAW,iBAAiB,YAAY,UAAU,EAAE;AACrF,cAAQ,IAAI,iBAAiB,WAAW,UAAU,EAAE;AACpD,cAAQ,IAAI,uBAAuB,WAAW,gBAAgB,IAAI;AAClE,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,aAAa,CAAC;AACzC,cAAQ,IAAI,6DAAwD;AACpE,cAAQ,IAAI,qEAAgE;AAC5E,cAAQ,IAAI,qEAAgE;AAC5E,cAAQ,IAAI,+DAA0D;AAAA,IACxE,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,MAAM,eAAe,CAAC;AAC9C,cAAQ,MAAM,UAAU,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAtNA,IAKAC,oBACAC;AANA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB,IAAAC,mBAAqB;AAErB;AACA;AACA;AAEgB;AAAA;AAAA;;;ACDT,SAAS,0BAAmC;AACjD,QAAM,UAAU,IAAI,2BAAQ,QAAQ;AAEpC,UACG,YAAY,gCAAgC,EAC5C,OAAO,aAAa,kCAAkC,EACtD,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,OAAO,YAAY;AAlB/B;AAmBM,QAAI;AACF,YAAM,gBAAgB,IAAI,cAAc;AACxC,YAAM,SAAS,cAAc,UAAU;AAGvC,UAAI,GAAC,YAAO,gBAAP,mBAAoB,UAAS;AAChC,gBAAQ;AAAA,UACN,UAAU,MAAM,oEAAoE;AAAA,QACtF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,IAAI,UAAU,OAAO,8BAAuB,CAAC;AACrD,cAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,YAAY,UAAU,EAAE,CAAC;AAC1E,cAAQ,IAAI,EAAE;AAEd,YAAM,aAAa,IAAI,iBAAiB,aAAa;AAGrD,YAAM,cAAU,YAAAC,SAAI,+BAA+B,EAAE,MAAM;AAC3D,YAAM,aAAa,MAAM,WAAW,eAAe;AAEnD,UAAI,CAAC,WAAW,SAAS;AACvB,gBAAQ,KAAK,0BAA0B;AACvC,gBAAQ,IAAI,UAAU,MAAM,WAAW,OAAO,CAAC;AAC/C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,QAAQ,4BAA4B;AAG5C,YAAM,oBAAgB,YAAAA,SAAI,yBAAyB,EAAE,MAAM;AAE3D,UAAI;AACF,cAAM,SAAS,MAAM,WAAW,cAAc;AAC9C,sBAAc,QAAQ,uBAAuB;AAG7C,YAAI,CAAC,QAAQ,eAAe;AAC1B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,qBAAqB,CAAC;AACjD,kBAAQ,IAAI,iBAAiB,OAAO,UAAU,EAAE;AAChD,kBAAQ,IAAI,gBAAgB,OAAO,YAAY,YAAY,UAAU,EAAE;AACvE,kBAAQ,IAAI,0BAA0B,OAAO,YAAY,mBAAmB,EAAE;AAC9E,kBAAQ;AAAA,YACN,kBAAkB,OAAO,YAAY,cAAc,YAAY,UAAU;AAAA,UAC3E;AACA,kBAAQ;AAAA,YACN,sBAAsB,OAAO,YAAY,kBAAkB,YAAY,UAAU;AAAA,UACnF;AACA,kBAAQ;AAAA,YACN,qBAAqB,OAAO,YAAY,iBAAiB,YAAY,UAAU;AAAA,UACjF;AAEA,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,cAAc,CAAC;AAC1C,kBAAQ,IAAI,gBAAgB,OAAO,aAAa,OAAO,EAAE;AACzD,kBAAQ,IAAI,yBAAyB,OAAO,kBAAkB,EAAE;AAChE,kBAAQ,IAAI,gBAAgB,OAAO,SAAS,EAAE;AAC9C,kBAAQ,IAAI,aAAa,OAAO,WAAW,EAAE;AAG7C,gBAAM,aACJ,OAAO,gBAAgB,YACnB,WACA,OAAO,gBAAgB,aACrB,iBACA;AACR,kBAAQ,IAAI,aAAa,UAAU,IAAI,OAAO,WAAW,EAAE;AAAA,QAC7D;AAGA,YAAI,OAAO,YAAY,GAAG;AACxB,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,QAAQ,gBAAM,OAAO,SAAS,qBAAqB,CAAC;AAE1E,cAAI,QAAQ,SAAS;AAEnB,kBAAM,sBAAkB,YAAAA,SAAI,wBAAwB,EAAE,MAAM;AAE5D,gBAAI;AAEF,oBAAM,eAAe,MAAM,WAAW,kBAAkB;AACxD,8BAAgB,QAAQ,6BAA6B;AAErD,kBAAI,aAAa,UAAU,SAAS,GAAG;AACrC,wBAAQ,IAAI,EAAE;AACd,wBAAQ,IAAI,UAAU,QAAQ,mBAAmB,CAAC;AAClD,6BAAa,UAAU,QAAQ,CAAC,UAAU,UAAU;AAClD,0BAAQ;AAAA,oBACN,KAAK,QAAQ,CAAC,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,YAAY,QAAQ;AAAA,kBACjF;AACA,0BAAQ,IAAI,gBAAgB,SAAS,MAAM,EAAE;AAC7C,sBAAI,SAAS,cAAc;AACzB,4BAAQ;AAAA,sBACN,iBAAiB,SAAS,aAAa,MAAM,MAAM,SAAS,aAAa,QAAQ;AAAA,oBACnF;AACA,4BAAQ,IAAI,uBAAuB,SAAS,YAAY,YAAY,EAAE;AACtE,4BAAQ,IAAI,wBAAwB,SAAS,aAAa,UAAU,EAAE;AAAA,kBACxE;AACA,0BAAQ,IAAI,EAAE;AAAA,gBAChB,CAAC;AAAA,cACH;AAAA,YACF,SAAS,OAAO;AACd,8BAAgB,KAAK,6BAA6B;AAClD,sBAAQ;AAAA,gBACN,UAAU;AAAA,kBACR,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,gBACpE;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,kBAAQ,IAAI,UAAU,KAAK,8BAA8B,CAAC;AAC1D,kBAAQ,IAAI,oEAA+D;AAC3E,kBAAQ,IAAI,qEAAgE;AAC5E,kBAAQ,IAAI,oDAA+C;AAAA,QAC7D;AAEA,YAAI,QAAQ,WAAW,CAAC,QAAQ,eAAe;AAE7C,gBAAM,uBAAmB,YAAAA,SAAI,wBAAwB,EAAE,MAAM;AAE7D,cAAI;AACF,kBAAM,SAAS,KAAK,MAAM,6EAAwC;AAAA,cAChE,OAAO;AAAA,YACT;AACA,kBAAM,YAAY,MAAM,OAAO,aAAa;AAC5C,6BAAiB,QAAQ,kCAAkC;AAE3D,oBAAQ,IAAI,EAAE;AACd,oBAAQ,IAAI,UAAU,KAAK,wBAAwB,CAAC;AACpD,oBAAQ,IAAI,YAAY,UAAU,KAAK,gBAAgB;AACvD,oBAAQ,IAAI,gBAAgB,UAAU,SAAS,WAAW;AAC1D,oBAAQ,IAAI,WAAW,UAAU,IAAI,WAAW;AAChD,oBAAQ,IAAI,YAAY,UAAU,MAAM,eAAe,CAAC,EAAE;AAG1D,kBAAM,sBAAuB,UAAU,YAAY,UAAU,QAAS;AACtE,kBAAM,gBACJ,sBAAsB,KAAK,WAAM,sBAAsB,KAAK,iBAAO;AACrE,oBAAQ;AAAA,cACN,aAAa,aAAa,IAAI,oBAAoB,QAAQ,CAAC,CAAC;AAAA,YAC9D;AAAA,UACF,SAAS,OAAO;AACd,6BAAiB,KAAK,4BAA4B;AAClD,oBAAQ;AAAA,cACN,UAAU;AAAA,gBACR,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,cACpE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,YAAI,CAAC,QAAQ,eAAe;AAC1B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,kBAAkB,CAAC;AAE9C,cAAI,OAAO,qBAAqB,GAAG;AACjC,oBAAQ,IAAI,4DAAuD;AACnE,oBAAQ,IAAI,6DAAwD;AAAA,UACtE;AAEA,cAAI,OAAO,YAAY,GAAG;AACxB,oBAAQ,IAAI,qDAAgD;AAC5D,oBAAQ,IAAI,kDAA6C;AAAA,UAC3D;AAEA,cAAI,CAAC,OAAO,WAAW;AACrB,oBAAQ,IAAI,4EAAuE;AAAA,UACrF;AAEA,cAAI,OAAO,gBAAgB,YAAY;AACrC,oBAAQ,IAAI,gEAA2D;AAAA,UACzE;AAEA,cAAI,OAAO,gBAAgB,UAAU;AACnC,oBAAQ,IAAI,kDAA6C;AACzD,oBAAQ,IAAI,4DAAuD;AAAA,UACrE;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,sBAAc,KAAK,gCAAgC;AACnD,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,UAAU,MAAM,sBAAsB,CAAC;AACrD,cAAQ,MAAM,UAAU,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AArNA,IAKAC,oBACAC;AANA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAF,qBAAwB;AACxB,IAAAC,cAAgB;AAChB;AACA;AACA;AAEgB;AAAA;AAAA;;;ACET,SAAS,oBAA6B;AAC3C,QAAM,UAAU,IAAI,2BAAQ,MAAM;AAElC,UACG,YAAY,+BAA+B,EAC3C,WAAW,uBAAuB,CAAC,EACnC,WAAW,sBAAsB,CAAC,EAClC,WAAW,sBAAsB,CAAC,EAClC,WAAW,wBAAwB,CAAC,EACpC,WAAW,sBAAsB,CAAC,EAClC,WAAW,+BAA+B,CAAC;AAG9C,UAAQ,OAAO,MAAM;AACnB,YAAQ,IAAI,yCAAkC;AAC9C,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,qBAAqB;AACjC,YAAQ,IAAI,uDAAuD;AACnE,YAAQ,IAAI,8CAA8C;AAC1D,YAAQ,IAAI,8CAA8C;AAC1D,YAAQ,IAAI,iDAAiD;AAC7D,YAAQ,IAAI,gDAAgD;AAC5D,YAAQ,IAAI,+CAA+C;AAC3D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW;AACvB,YAAQ,IAAI,kEAAkE;AAC9E,YAAQ,IAAI,mCAAmC;AAC/C,YAAQ,IAAI,mCAAmC;AAC/C,YAAQ,IAAI,kCAAkC;AAC9C,YAAQ,IAAI,qCAAqC;AACjD,YAAQ,IAAI,kCAAkC;AAC9C,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,+EAA+E;AAAA,EAC7F,CAAC;AAED,SAAO;AACT;AAjDA,IAKAE;AALA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,IAAAE;AAEgB;AAAA;AAAA;;;ACKT,SAAS,4BAAqC;AACnD,QAAM,MAAM,IAAI,2BAAQ,UAAU;AAElC,MACG,YAAY,0BAA0B,EACtC,SAAS,aAAa,qBAAqB,EAC3C,OAAO,4BAA4B,wBAAwB,EAC3D,OAAO,2BAA2B,wCAAwC,EAC1E,OAAO,6BAA6B,sBAAsB,EAC1D,OAAO,aAAa,iDAAiD,EACrE,OAAO,OAAO,QAAgB,YAA6B;AAC1D,QAAI;AACF,YAAM,aAAa,QAAQ,OAAO;AAAA,IACpC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACtF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,aAAa,QAAgB,SAAyC;AACnF,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAC1F,QAAM,SAAS,IAAI,kBAAkB;AAGrC,QAAM,WAAW,oBACd,OAAO,EAAE,gBAAgB,OAAO,CAAC,EACjC,MAAM,OAAO,CAAC,SAAS,aAAa,QAAQ,KAAK,YAAY,MAAM;AAEtE,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,EAC7C;AAEA,QAAM,OAAO,SAAS,CAAC;AAGvB,MAAI,KAAK,WAAW,aAAa;AAC/B,YAAQ,IAAI,UAAU,QAAQ,QAAQ,MAAM,wBAAwB,CAAC;AACrE;AAAA,EACF;AAGA,UAAQ,IAAI,UAAU,KAAK,SAAS,KAAK,KAAK,EAAE,CAAC;AACjD,UAAQ,IAAI,UAAU,KAAK,mBAAmB,KAAK,MAAM,EAAE,CAAC;AAC5D,UAAQ,IAAI,EAAE;AAGd,QAAM,UAAU;AAAA,IACd,QAAQ;AAAA,IACR,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvC;AAEA,MAAI,QAAQ,iBAAiB,QAAW;AACtC,IAAC,QAAgB,gBAAgB,SAAS,QAAQ,aAAa,SAAS,GAAG,EAAE;AAAA,EAC/E;AAEA,MAAI,QAAQ,WAAW;AACrB,IAAC,QAAgB,aAAa,QAAQ;AAAA,EACxC;AAGA,UAAQ,IAAI,UAAU,KAAK,GAAG,QAAQ,SAAS,eAAe,EAAE,iBAAiB,CAAC;AAClF,UAAQ,IAAI,WAAW,KAAK,OAAO,MAAM,KAAK,KAAK,EAAE;AACrD,UAAQ,IAAI,eAAe,KAAK,MAAM,mBAAc;AAEpD,MAAI,QAAQ,iBAAiB,QAAW;AACtC,YAAQ,IAAI,sBAAsB,KAAK,iBAAiB,CAAC,WAAM,QAAQ,YAAY,EAAE;AAAA,EACvF;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,IAAI,mBAAmB,KAAK,cAAc,MAAM,WAAM,QAAQ,SAAS,EAAE;AAAA,EACnF;AAEA,MAAI,QAAQ,QAAQ;AAClB;AAAA,EACF;AAGA,MAAI;AACF,UAAM,cAAc,OAAO,WAAW,KAAK,WAAW,OAAO;AAG7D,wBAAoB,aAAa;AAEjC,YAAQ,IAAI,UAAU,QAAQ,8BAA8B,CAAC;AAC7D,YAAQ,IAAI,UAAU,KAAK,YAAY,MAAM,EAAE,CAAC;AAChD,YAAQ,IAAI,UAAU,KAAK,UAAU,YAAY,KAAK,EAAE,CAAC;AACzD,YAAQ,IAAI,UAAU,KAAK,WAAW,YAAY,MAAM,EAAE,CAAC;AAE3D,QAAI,YAAY,eAAe;AAC7B,cAAQ,IAAI,UAAU,KAAK,kBAAkB,YAAY,aAAa,EAAE,CAAC;AAEzE,UAAI,YAAY,mBAAmB,GAAG;AACpC,cAAM,aAAa,YAAY,gBAAgB,YAAY;AAC3D,cAAM,oBACJ,cAAc,IACV,UAAU,QAAQ,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG,IACrD,UAAU,QAAQ,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC3D,gBAAQ,IAAI,UAAU,KAAK,qBAAqB,iBAAiB,EAAE,CAAC;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,YAAY,YAAY;AAC1B,cAAQ,IAAI,UAAU,KAAK,eAAe,YAAY,UAAU,EAAE,CAAC;AAAA,IACrE;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU,QAAQ,wBAAmB,CAAC;AAClD,YAAQ,IAAI,0BAAoB,oBAAI,KAAK,GAAE,mBAAmB,CAAC,EAAE;AAEjE,QAAI,QAAQ,iBAAiB;AAC3B,cAAQ,IAAI,mBAAc,QAAQ,eAAe,EAAE;AAAA,IACrD;AAGA,QAAI,YAAY,iBAAiB,YAAY,YAAY;AACvD,cAAQ,IAAI,kBAAa,YAAY,UAAU,gBAAgB,YAAY,aAAa,GAAG;AAAA,IAC7F;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IACpF;AAAA,EACF;AACF;AA3JA,IAKAC;AALA,IAAAC,iBAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB;AACA;AACA;AACA;AASgB;AA0BD;AAAA;AAAA;;;ACdR,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,mCAAmC,EAC/C,SAAS,WAAW,6CAA6C,EACjE,OAAO,kBAAkB,iDAAiD,EAC1E,eAAe,0BAA0B,iBAAiB,EAC1D,OAAO,4BAA4B,kBAAkB,EACrD,OAAO,6BAA6B,mBAAmB,EACvD,OAAO,0BAA0B,6CAA6C,QAAQ,EACtF;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,yBAAyB,mBAAmB,SAAS,EAC5D,OAAO,+BAA+B,yBAAyB,GAAG,EAClE,OAAO,8BAA8B,oCAAoC,EACzE,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,wBAAwB,gCAAgC,EAC/D,OAAO,aAAa,6CAA6C,EACjE,OAAO,OAAO,UAA8B,YAA2B;AACtE,QAAI;AAEF,YAAM,QAAQ,YAAY,QAAQ;AAClC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,WAAW,OAAO,OAAO;AAAA,IACjC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACpF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,WAAW,OAAe,SAAuC;AAC9E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,SAAS,IAAI,kBAAkB;AACrC,QAAM,cAAc,IAAI,YAAY;AAGpC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,iBAAiB,oBAAoB,kBAAkB,QAAQ,KAAK;AAC1E,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,oBAAoB,QAAQ,KAAK,EAAE;AAAA,EACrD;AAEA,QAAM,QAAQ,eAAe;AAC7B,QAAM,SAAS,MAAM;AAGrB,QAAM,SAAS,YAAY,eAAe,QAAQ,OAAO,KAAK;AAG9D,QAAM,WAAW,cAAc,wBAAwB,QAAQ,QAAQ,YAAY,SAAS;AAC5F,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,kBAAkB,QAAQ,YAAY,SAAS,aAAa;AAAA,EAC9E;AAGA,QAAM,OAAO,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC;AAChF,QAAM,eAAe,QAAQ,eACzB,QAAQ,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IACvD,CAAC;AAGL,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,kBAAmC;AAAA,IACvC,SAAS;AAAA,IACT,UAAU,QAAQ;AAAA,IAClB,SAAS;AAAA,IACT;AAAA,IACA,aAAa,QAAQ,eAAe,SAAS,qBAAqB,eAAe;AAAA,IACjF,QAAQ,QAAQ,UAAU;AAAA,IAC1B,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ,YAAY,OAAO,oBAAoB;AAAA,IACzD,cAAc;AAAA,IACd,cAAc;AAAA,IACd,kBAAkB,SAAS,QAAQ,mBAAmB,KAAK,EAAE;AAAA,IAC7D,eAAe;AAAA,IACf,YAAY,SAAS,uBAAuB,OAAO,wBAAwB,CAAC;AAAA,IAC5E,aAAa;AAAA,IACb,UAAU,CAAC;AAAA,IACX,aAAa;AAAA,IACb,MAAM,KAAK,SAAS,IAAI,OAAO;AAAA,IAC/B,cAAc,aAAa,SAAS,IAAI,eAAe;AAAA,IACvD,eAAe,QAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,YAAY,CAAC;AAAA,IACb,QAAQ,CAAC;AAAA,EACX;AAGA,QAAM,UAAU,SAAS,iBACtB,QAAQ,kBAAkB,KAAK,EAC/B,QAAQ,wBAAwB,gBAAgB,WAAW;AAG9D,QAAM,WAAW,GAAG,MAAM,IAAI,MAAM,YAAY,EAAE,QAAQ,eAAe,GAAG,CAAC,GAAG,OAAO,mBAAmB,cAAc;AACxH,QAAM,WAAgB,YAAK,MAAM,UAAU,QAAQ;AAEnD,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,UAAU,KAAK,uCAAuC,CAAC;AACnE,YAAQ,IAAI,UAAU,MAAM,SAAS,QAAQ,EAAE,CAAC;AAChD,YAAQ,IAAI,UAAU,MAAM,YAAY,MAAM,EAAE,CAAC;AACjD,YAAQ,IAAI,UAAU,MAAM,aAAa,QAAQ,KAAK,EAAE,CAAC;AACzD,YAAQ,IAAI,UAAU,MAAM,YAAY,MAAM,EAAE,CAAC;AACjD,YAAQ,IAAI,UAAU,MAAM,UAAU,KAAK,EAAE,CAAC;AAC9C,YAAQ,IAAI,UAAU,MAAM,WAAW,gBAAgB,MAAM,EAAE,CAAC;AAChE,YAAQ,IAAI,UAAU,MAAM,aAAa,gBAAgB,QAAQ,EAAE,CAAC;AACpE,YAAQ,IAAI,UAAU,MAAM,aAAa,gBAAgB,QAAQ,EAAE,CAAC;AACpE,QAAI,QAAQ,cAAc;AACxB,cAAQ,IAAI,UAAU,MAAM,kBAAkB,QAAQ,YAAY,EAAE,CAAC;AAAA,IACvE;AACA,QAAI,KAAK,SAAS,GAAG;AACnB,cAAQ,IAAI,UAAU,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACzD;AACA,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ,IAAI,UAAU,MAAM,iBAAiB,aAAa,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACzE;AACA;AAAA,EACF;AAGA,MAAO,gBAAW,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,6BAA6B,QAAQ,EAAE;AAAA,EACzD;AAGA,SAAO,UAAU,UAAU,iBAAiB,OAAO;AAGnD,QAAM,sBAAsB,CAAC,GAAI,MAAM,iBAAiB,CAAC,GAAI,MAAM;AACnE,SAAO,WAAW,MAAM,WAAW,EAAE,eAAe,oBAAoB,CAAC;AAGzE,sBAAoB,aAAa;AAEjC,UAAQ,IAAI,UAAU,QAAQ,4BAA4B,CAAC;AAC3D,UAAQ,IAAI,UAAU,KAAK,YAAY,MAAM,EAAE,CAAC;AAChD,UAAQ,IAAI,UAAU,KAAK,aAAa,QAAQ,KAAK,EAAE,CAAC;AACxD,UAAQ,IAAI,UAAU,KAAK,YAAY,MAAM,EAAE,CAAC;AAChD,UAAQ,IAAI,UAAU,KAAK,SAAS,QAAQ,EAAE,CAAC;AAC/C,UAAQ,IAAI,UAAU,KAAK,UAAU,KAAK,EAAE,CAAC;AAC7C,UAAQ,IAAI,UAAU,KAAK,WAAW,gBAAgB,MAAM,EAAE,CAAC;AAC/D,UAAQ,IAAI,UAAU,KAAK,aAAa,gBAAgB,QAAQ,EAAE,CAAC;AACnE,UAAQ,IAAI,UAAU,KAAK,aAAa,gBAAgB,QAAQ,EAAE,CAAC;AAEnE,MAAI,QAAQ,cAAc;AACxB,YAAQ,IAAI,UAAU,KAAK,kBAAkB,QAAQ,YAAY,EAAE,CAAC;AAAA,EACtE;AAEA,MAAI,KAAK,SAAS,GAAG;AACnB,YAAQ,IAAI,UAAU,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACxD;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI,UAAU,KAAK,iBAAiB,aAAa,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EACxE;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,QAAQ,wBAAwB,MAAM,KAAK,GAAG,CAAC;AACvE;AAjNA,IAKAE,MACAC,QACAC;AAPA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAH,OAAoB;AACpB,IAAAC,SAAsB;AACtB,IAAAC,qBAAwB;AAExB;AACA;AACA;AACA;AACA;AAiBgB;AA6CD;AAAA;AAAA;;;ACnER,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,eAAe,EAC3B,SAAS,aAAa,mBAAmB,EACzC,OAAO,OAAO,WAAmB;AAChC,YAAQ,IAAI,UAAU,KAAK,+CAA+C,MAAM,EAAE,CAAC;AACnF,YAAQ;AAAA,MACN,UAAU;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAxBA,IAKAE;AALA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB;AAEgB;AAAA;AAAA;;;ACmBT,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,mCAAmC,EAC/C,OAAO,2BAA2B,oCAAoC,EACtE,OAAO,+BAA+B,sCAAsC,EAC5E,OAAO,6BAA6B,oBAAoB,EACxD,OAAO,0BAA0B,oBAAoB,EACrD,OAAO,wBAAwB,mBAAmB,EAClD,OAAO,qBAAqB,kCAAkC,EAC9D,OAAO,mBAAmB,2CAA2C,EACrE,OAAO,uBAAuB,mCAAmC,OAAO,EACxE,OAAO,qBAAqB,yDAAyD,SAAS,EAC9F,OAAO,wBAAwB,yBAAyB,MAAM,EAC9D,OAAO,wBAAwB,yBAAyB,EACxD,OAAO,eAAe,+BAA+B,EACrD,OAAO,OAAO,YAAyB;AACtC,QAAI;AACF,YAAM,UAAU,OAAO;AAAA,IACzB,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACnF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEA,eAAe,UAAU,SAAqC;AAC5D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,cAAc,UAAU;AAGvC,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,QAAQ,cAAc,iBAAiB,WAAW;AACxD,QAAM,sBAAsB,IAAI,oBAAoB,QAAQ,MAAM,aAAa,WAAW;AAG1F,QAAM,UAAyB,CAAC;AAEhC,MAAI,QAAQ,QAAQ;AAClB,UAAM,WAAW,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC9D,YAAQ,SAAS,SAAS,WAAW,IAAI,SAAS,CAAC,IAAI;AAAA,EACzD;AAEA,MAAI,QAAQ,UAAU;AACpB,UAAM,aAAa,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAClE,YAAQ,WAAW,WAAW,WAAW,IAAI,WAAW,CAAC,IAAI;AAAA,EAC/D;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,WAAW,QAAQ;AAAA,EAC7B;AAEA,MAAI,QAAQ,MAAM;AAChB,UAAM,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACxD,YAAQ,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI;AAAA,EAC/C;AAEA,MAAI,QAAQ,QAAQ;AAClB,YAAQ,iBAAiB,QAAQ;AAAA,EACnC;AAGA,QAAM,eAAe,oBAAoB,OAAO,OAAO;AAGvD,MAAI,QAAQ,aAAa,MAAM,OAAO,UAAU;AAGhD,MAAI,QAAQ,OAAO;AACjB,YAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,aAAa,QAAQ,KAAK;AAAA,EAChE;AAEA,MAAI,QAAQ,MAAM;AAChB,YAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,YAAY,QAAQ,IAAI;AAAA,EAC9D;AAGA,YAAU,OAAO,QAAQ,UAAU,WAAW,QAAQ,aAAa,MAAM;AAGzE,MAAI,QAAQ,OAAO;AACjB,UAAM,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG,EAAE;AACnD,YAAQ,MAAM,MAAM,GAAG,KAAK;AAAA,EAC9B;AAGA,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACH,cAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,IACF,KAAK,QAAQ;AACX,YAAME,QAAO,MAAM,OAAO,MAAM;AAChC,cAAQ,IAAIA,MAAK,UAAU,KAAK,CAAC;AACjC;AAAA,IACF;AAAA,IACA;AACE,YAAM,kBAAkB,OAAO,OAAO;AAAA,EAC1C;AACF;AAEA,SAAS,UAAU,OAAc,QAAgB,WAAyB;AACxE,QAAM,KAAK,CAAC,GAAG,MAAM;AACnB,QAAI,MAAW;AAEf,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,IAAI,KAAK,EAAE,YAAY;AAC9B,eAAO,IAAI,KAAK,EAAE,YAAY;AAC9B;AAAA,MACF,KAAK;AACH,eAAO,IAAI,KAAK,EAAE,YAAY;AAC9B,eAAO,IAAI,KAAK,EAAE,YAAY;AAC9B;AAAA,MACF,KAAK;AACH,eAAO,EAAE,MAAM,YAAY;AAC3B,eAAO,EAAE,MAAM,YAAY;AAC3B;AAAA,MACF,KAAK,YAAY;AACf,cAAM,gBAAgB,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAChE,eAAO,cAAc,EAAE,QAAsC,KAAK;AAClE,eAAO,cAAc,EAAE,QAAsC,KAAK;AAClE;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,cAAc,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,EAAE;AACxE,eAAO,YAAY,EAAE,MAAkC,KAAK;AAC5D,eAAO,YAAY,EAAE,MAAkC,KAAK;AAC5D;AAAA,MACF;AAAA,MACA;AACE,eAAO,EAAE;AACT,eAAO,EAAE;AAAA,IACb;AAEA,QAAI,cAAc,OAAO;AACvB,aAAO,OAAO,OAAO,KAAK,OAAO,OAAO,IAAI;AAAA,IAC9C,OAAO;AACL,aAAO,OAAO,OAAO,KAAK,OAAO,OAAO,IAAI;AAAA,IAC9C;AAAA,EACF,CAAC;AACH;AAEA,eAAe,kBAAkB,OAAc,SAAqC;AAClF,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,UAAU,KAAK,uCAAuC,CAAC;AACnE;AAAA,EACF;AAEA,UAAQ,IAAI,UAAU,QAAQ,SAAS,MAAM,MAAM,WAAW,CAAC;AAC/D,UAAQ,IAAI,EAAE;AAGd,QAAM,UAAU,CAAC,MAAM,SAAS,UAAU,YAAY,SAAS,UAAU;AACzE,MAAI,QAAQ,UAAU;AACpB,YAAQ,KAAK,WAAW;AACxB,YAAQ,KAAK,YAAY;AAAA,EAC3B;AACA,UAAQ,KAAK,SAAS;AAGtB,QAAM,YAAY,QAAQ,IAAI,MAAM,CAAC;AAGrC,QAAM,OAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM;AAAA,MACV,KAAK;AAAA,MACLC,cAAa,KAAK,OAAO,EAAE;AAAA,MAC3BC,kBAAiB,KAAK,MAAM;AAAA,MAC5BC,oBAAmB,KAAK,QAAQ;AAAA,MAChC,KAAK;AAAA,MACLF,cAAa,KAAK,UAAU,EAAE;AAAA,IAChC;AAEA,QAAI,QAAQ,UAAU;AACpB,UAAI,KAAK,KAAK,iBAAiB,GAAG;AAClC,UAAI,KAAK,KAAK,cAAc,GAAG;AAAA,IACjC;AAEA,QAAI,KAAKG,YAAW,KAAK,YAAY,CAAC;AACtC,SAAK,KAAK,GAAG;AAAA,EACf;AAGA,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,cAAU,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,MAAM,CAAC;AAAA,EAChF;AAGA,EAAAC,eAAc,SAAS,WAAW,IAAI;AACtC,EAAAC,gBAAe,SAAS;AAExB,aAAW,OAAO,MAAM;AACtB,IAAAD,eAAc,KAAK,WAAW,KAAK;AAAA,EACrC;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU,KAAK,UAAU,MAAM,MAAM,UAAU,CAAC;AAC9D;AAEA,SAASA,eAAc,KAAe,QAAkB,UAAyB;AAC/E,QAAM,YAAY,IAAI,IAAI,CAAC,MAAM,MAAM,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC;AAC7D,QAAM,UAAU,UAAU,KAAK,KAAK;AAEpC,MAAI,UAAU;AACZ,YAAQ,IAAI,UAAU,KAAK,OAAO,CAAC;AAAA,EACrC,OAAO;AACL,YAAQ,IAAI,OAAO;AAAA,EACrB;AACF;AAEA,SAASC,gBAAe,QAAwB;AAC9C,QAAM,YAAY,OAAO,IAAI,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,KAAK;AACrE,UAAQ,IAAI,SAAS;AACvB;AAEA,SAASL,cAAa,MAAc,WAA2B;AAC7D,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,GAAG,KAAK,UAAU,GAAG,YAAY,CAAC,CAAC;AAC5C;AAEA,SAASC,kBAAiB,QAAwB;AAChD,QAAM,eAAyD;AAAA,IAC7D,UAAU,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACV,QAAQ,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACR,WAAW,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACX,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACZ;AAEA,QAAM,UAAU,aAAa,MAAM,MAAM,CAAC,SAAS;AACnD,SAAO,QAAQ,OAAO,YAAY,CAAC;AACrC;AAEA,SAASC,oBAAmB,UAA0B;AACpD,QAAM,iBAA2D;AAAA,IAC/D,UAAU,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,IACV,MAAM,wBAAC,SAAS,UAAU,QAAQ,IAAI,GAAhC;AAAA,IACN,QAAQ,wBAAC,SAAS,UAAU,KAAK,IAAI,GAA7B;AAAA,IACR,KAAK,wBAAC,SAAS,UAAU,MAAM,IAAI,GAA9B;AAAA,EACP;AAEA,QAAM,UAAU,eAAe,QAAQ,MAAM,CAAC,SAAS;AACvD,SAAO,QAAQ,SAAS,YAAY,CAAC;AACvC;AAEA,SAASC,YAAW,YAA4B;AAC9C,QAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAO,KAAK,mBAAmB;AACjC;AA7RA,IAKAG;AALA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AAExB;AACA;AACA;AACA;AAiBgB;AAiCD;AA4EN;AA0CM;AA2DN,WAAAF,gBAAA;AAWA,WAAAC,iBAAA;AAKA,WAAAL,eAAA;AAKA,WAAAC,mBAAA;AAYA,WAAAC,qBAAA;AAYA,WAAAC,aAAA;AAAA;AAAA;;;AClRF,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,wCAAwC,EACpD,SAAS,aAAa,iBAAiB,EACvC,OAAO,OAAO,WAAmB;AAChC,YAAQ,IAAI,UAAU,KAAK,6CAA6C,MAAM,EAAE,CAAC;AACjF,YAAQ;AAAA,MACN,UAAU;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAxBA,IAKAK;AALA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB;AAEgB;AAAA;AAAA;;;ACAT,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAI,2BAAQ,QAAQ;AAEhC,MACG,YAAY,yBAAyB,EACrC,SAAS,aAAa,mBAAmB,EACzC,OAAO,OAAO,WAAmB;AAChC,YAAQ,IAAI,UAAU,KAAK,+CAA+C,MAAM,EAAE,CAAC;AACnF,YAAQ;AAAA,MACN,UAAU;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAxBA,IAKAE;AALA,IAAAC,eAAA;AAAA;AAAA;AAAA;AAKA,IAAAD,qBAAwB;AACxB;AAEgB;AAAA;AAAA;;;ACKT,SAAS,oBAA6B;AAC3C,QAAM,MAAM,IAAI,2BAAQ,MAAM;AAE9B,MACG,YAAY,kDAAkD,EAC9D,MAAM,OAAO,EACb,WAAW,wBAAwB,CAAC,EACpC,WAAW,sBAAsB,CAAC,EAClC,WAAW,sBAAsB,CAAC,EAClC,WAAW,wBAAwB,CAAC,EACpC,WAAW,wBAAwB,CAAC,EACpC,WAAW,0BAA0B,CAAC;AAEzC,SAAO;AACT;AA3BA,IAKAE;AALA;AAAA;AAAA;AAAA;AAKA,IAAAA,qBAAwB;AACxB,IAAAC;AACA,IAAAC;AACA,IAAAC;AACA,IAAAC;AACA,IAAAC;AACA,IAAAC;AAEgB;AAAA;AAAA;;;ACMT,SAAS,qBAA8B;AAC5C,QAAM,UAAU,IAAI,2BAAQ,OAAO;AAEnC,UACG,YAAY,kDAAkD,EAC9D,SAAS,WAAW,4BAA4B,EAChD,OAAO,sBAAsB,8CAA8C,EAC3E,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,iBAAiB,sBAAsB,EAC9C,OAAO,uBAAuB,sBAAsB,EACpD,OAAO,wBAAwB,sBAAsB,EACrD,OAAO,aAAa,wBAAwB,EAC5C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,iBAAiB,gCAAgC,EACxD,OAAO,yBAAyB,8BAA8B,EAC9D,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,qBAAqB,8BAA8B,EAC1D;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBF,EACC;AAAA,IACC,OACE,OACA,YAaG;AA3EX;AA4EQ,UAAI;AAEF,cAAM,gBAAgB,QAAQ;AAC9B,cAAM,kBAAgB,oDAAe,WAAf,mBAAuB,cAAW,oDAAe,WAAf,mBAAuB;AAG/E,cAAM,gBAAgB,IAAIC,eAAc;AACxC,cAAM,SAAS,cAAc,UAAU;AAGvC,cAAM,eAAe,IAAI,aAAa,eAAe,aAAa;AAElE,YAAI,WAAW;AAAA,UACb;AAAA,UACA,WAAU,mCAAS,aAAY,OAAO,mBAAmB;AAAA,UACzD,UAAU,mCAAS;AAAA,UACnB,MAAM,mCAAS;AAAA,UACf,UAAU,mCAAS;AAAA,UACnB,aAAa,mCAAS;AAAA,UACtB,IAAI,mCAAS;AAAA,UACb,WAAU,mCAAS,aAAY,OAAO,mBAAmB;AAAA,UACzD,QAAQ,mCAAS;AAAA,UACjB,SAAS,mCAAS;AAAA,QACpB;AAGA,YAAI,mCAAS,aAAa;AACxB,qBAAW,MAAM,2BAA2B,UAAU,MAAM;AAAA,QAC9D;AAGA,YAAI,mCAAS,eAAe;AAC1B,qBAAW,MAAM,cAAc,QAAQ,eAAe,QAAQ;AAAA,QAChE;AAGA,cAAM,iBAAiB,iBAAiB,SAAS,OAAO,OAAO;AAC/D,cAAM,WAAW,iBAAiB,SAAS,QAAQ;AACnD,cAAM,OAAO,SAAS,OAAO,aAAa,SAAS,IAAI,IAAI;AAC3D,cAAM,SAAS,SAAS,SAAS,aAAa,SAAS,MAAM,IAAI;AACjE,cAAM,WAAW,SAAS,WACtB,iBAAiB,SAAS,QAAQ,IAClC,OAAO,aACL,OAAO,kBACP;AACN,cAAM,WAAW,SAAS,WAAW,oBAAoB,SAAS,QAAQ,IAAI;AAC9E,cAAM,SAAS,SAAS,KAAK,WAAW,SAAS,EAAE,IAAI,WAAW;AAGlE,cAAM,cAAU,YAAAC,SAAI,4BAA4B,EAAE,MAAM;AAExD,YAAI;AAEF,gBAAM,OAAsB;AAAA,YAC1B,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa,SAAS;AAAA,YACtB,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA,WAAW,oBAAI,KAAK;AAAA,YACpB,WAAW,oBAAI,KAAK;AAAA,YACpB;AAAA,YACA;AAAA,YACA;AAAA,YACA,UAAU;AAAA,cACR,UAAU,SAAS;AAAA,cACnB,SAAS,SAAS;AAAA,cAClB,SAAQ,mCAAS,iBAAgB,cAAc;AAAA,cAC/C,WAAW,QAAQ,IAAI,QAAQ;AAAA,YACjC;AAAA,UACF;AAEA,kBAAQ,OAAO;AAGf,gBAAM,gBAAY,yBAAK,QAAQ,IAAI,GAAG,aAAa,aAAa,CAAC;AACjE,cAAI,KAAC,6BAAW,SAAS,GAAG;AAE1B,gBAAI,aAAa,cAAc,GAAG;AAChC,2BAAa,qBAAqB;AAClC,sBAAQ,IAAI,uBAAuB;AACnC,2BAAa,qBAAqB,EAAE,QAAQ,CAAC,QAAQ;AACnD,wBAAQ,IAAI,UAAU,UAAU,GAAG,CAAC;AAAA,cACtC,CAAC;AACD,sBAAQ,KAAK,CAAC;AAAA,YAChB;AACA,4CAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,UAC1C;AAGA,gBAAM,WAAW,GAAG,MAAM,IAAI,iBAAiB,cAAc,CAAC;AAC9D,gBAAM,eAAW,yBAAK,WAAW,QAAQ;AAEzC,kBAAI,6BAAW,QAAQ,GAAG;AACxB,kBAAM,IAAI;AAAA,cACR,iBAAiB,MAAM;AAAA,cACvB;AAAA,cACA;AAAA,cACA;AAAA,cACA,CAAC,mBAAmB,qBAAqB,kBAAkB;AAAA,YAC7D;AAAA,UACF;AAEA,kBAAQ,OAAO;AAGf,gBAAM,UAAU,wBAAwB,MAAM,MAAM;AACpD,8CAAc,UAAU,OAAO;AAE/B,kBAAQ,QAAQ,4BAA4B;AAG5C,kBAAQ;AAAA,YACN,UAAU;AAAA,cACR;AAAA,kBACL,cAAc;AAAA;AAAA,MAEnB,MAAM;AAAA,YACA,SAAS,YAAY,CAAC;AAAA,EAChC,WAAW,aAAa,QAAQ,KAAK,EAAE;AAAA,EACvC,WAAW,aAAa,QAAQ,kBAAkB,EAAE;AAAA,GACpD,6BAAM,UAAS,SAAS,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,YACpC,QAAQ;AAAA;AAAA,cAEJ;AAAA,YACF;AAAA,UACF;AAGA,kBAAQ,IAAI,UAAU,OAAO,YAAY,CAAC;AAC1C,kBAAQ,IAAI,UAAU,KAAK,2BAAsB,CAAC;AAClD,kBAAQ,IAAI,UAAU,UAAU,kCAAkC,MAAM,EAAE,CAAC;AAC3E,kBAAQ,IAAI,UAAU,KAAK,4BAAuB,CAAC;AACnD,kBAAQ,IAAI,UAAU,UAAU,KAAK,QAAQ,IAAI,UAAU,MAAM,KAAK,QAAQ,GAAG,CAAC;AAClF,kBAAQ,IAAI,UAAU,KAAK,8BAAyB,CAAC;AACrD,kBAAQ,IAAI,UAAU,UAAU,oBAAoB,CAAC;AAGrD,cAAI,CAAC,YAAY,CAAC,OAAO,YAAY;AACnC,oBAAQ,IAAI,UAAU,QAAQ,mDAA4C,CAAC;AAC3E,oBAAQ;AAAA,cACN,UAAU,KAAK,2DAA2D;AAAA,YAC5E;AAAA,UACF;AAGA,cAAI,CAAC,UAAU;AACb,oBAAQ,IAAI,UAAU,KAAK,kDAA2C,CAAC;AACvE,oBAAQ,IAAI,UAAU,KAAK,0CAA0C,CAAC;AAAA,UACxE;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,KAAK,sBAAsB;AACnC,gBAAM;AAAA,QACR;AAAA,MACF,SAAS,OAAO;AACd,YAAI,iBAAiB,iBAAiB;AACpC,kBAAQ,MAAM,UAAU,MAAM,MAAM,OAAO,CAAC;AAC5C,cAAI,MAAM,YAAY;AACpB,oBAAQ,IAAI,UAAU,KAAK,aAAM,MAAM,UAAU,EAAE,CAAC;AAAA,UACtD;AACA,eAAI,WAAM,iBAAN,mBAAoB,QAAQ;AAC9B,oBAAQ,IAAI,UAAU,KAAK,gBAAgB,CAAC;AAC5C,kBAAM,aAAa,QAAQ,CAAC,WAAW;AACrC,sBAAQ,IAAI,UAAU,UAAU,KAAK,MAAM,EAAE,CAAC;AAAA,YAChD,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,kBAAQ;AAAA,YACN,UAAU;AAAA,cACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACnF;AAAA,UACF;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;AAEA,eAAe,2BAA2B,UAAe,QAAa;AACpE,UAAQ,IAAI,UAAU,OAAO,qCAA8B,CAAC;AAE5D,QAAM,UAAU,MAAM,iBAAAC,QAAS,OAAO;AAAA,IACpC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,SAAS;AAAA,MAClB,UAAU,wBAAC,UAAkB;AAC3B,YAAI;AACF,2BAAiB,OAAO,OAAO;AAC/B,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,iBAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD;AAAA,MACF,GAPU;AAAA,IAQZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,SAAS,eAAe;AAAA,MACjC,MAAM,6BAAM,QAAQ,IAAI,WAAW,QAA7B;AAAA,IACR;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,SAAS;AAAA,MAClB,MAAM,6BAAM,QAAQ,IAAI,WAAW,QAA7B;AAAA,IACR;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,gCAAyB,OAAO,MAAM;AAAA,QAC9C,EAAE,MAAM,wCAAiC,OAAO,SAAS;AAAA,QACzD,EAAE,MAAM,sCAA+B,OAAO,OAAO;AAAA,QACrD,EAAE,MAAM,4CAAqC,OAAO,WAAW;AAAA,MACjE;AAAA,MACA,SAAS,SAAS;AAAA,IACpB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,SAAS,YAAY,OAAO;AAAA,MACrC,UAAU,wBAAC,UAAkB;AAC3B,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI;AACF,2BAAiB,KAAK;AACtB,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,iBAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD;AAAA,MACF,GARU;AAAA,IASZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,SAAS;AAAA,MAClB,UAAU,wBAAC,UAAkB;AAC3B,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI;AACF,8BAAoB,KAAK;AACzB,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,iBAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD;AAAA,MACF,GARU;AAAA,IASZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,SAAS;AAAA,MAClB,UAAU,wBAAC,UAAkB;AAC3B,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI;AACF,uBAAa,KAAK;AAClB,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,iBAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD;AAAA,MACF,GARU;AAAA,IASZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,SAAS;AAAA,MAClB,UAAU,wBAAC,UAAkB;AAC3B,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI;AACF,qBAAW,KAAK;AAChB,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,iBAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD;AAAA,MACF,GARU;AAAA,IASZ;AAAA,EACF,CAAC;AAED,SAAO,EAAE,GAAG,UAAU,GAAG,QAAQ;AACnC;AAEA,eAAe,cAAc,UAAkB,UAA6B;AAG1E,UAAQ,IAAI,UAAU,KAAK,oCAA6B,QAAQ,EAAE,CAAC;AACnE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,GAAG,SAAS,eAAe,EAAE;AAAA;AAAA,yBAA8B,QAAQ;AAAA,EAClF;AACF;AAEA,SAAS,aAAqB;AAC5B,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACxD,SAAO,MAAM,SAAS,IAAI,MAAM,GAAG,YAAY;AACjD;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,MACJ,YAAY,EACZ,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,QAAQ,GAAG,EACnB,UAAU,GAAG,EAAE;AACpB;AAEA,SAAS,wBAAwB,MAAqB,SAAsB;AAvY5E;AAwYE,QAAM,gBAAc,UAAK,SAAL,mBAAW,UAC3B;AAAA,YAAe,KAAK,KAAK,IAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC,KAC9D;AAEJ,QAAM,kBAAgB,UAAK,WAAL,mBAAa,UAC/B;AAAA,cAAiB,KAAK,OAAO,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC,KACtE;AAEJ,QAAM,kBAAkB,KAAK,WAAW;AAAA,oBAAuB,KAAK,QAAQ,KAAK;AAEjF,QAAM,mBAAiB,UAAK,aAAL,mBAAe,WAAU;AAAA,gBAAmB,KAAK,SAAS,OAAO,KAAK;AAE7F,QAAM,kBAAkB;AAAA;AAAA;AAAA,oBAGR,UAAK,aAAL,mBAAe,aAAY,UAAU;AAAA,sBACnC,UAAK,aAAL,mBAAe,cAAa,SAAS;AAAA,kBACzC,UAAK,aAAL,mBAAe,WAAU,KAAK;AAAA,IAC5C,UAAK,aAAL,mBAAe,WAAU,mBAAmB,KAAK,SAAS,OAAO,KAAK,EAAE;AAAA;AAGxE,SAAO,KAAK,KAAK,KAAK;AAAA;AAAA,UAEd,KAAK,EAAE;AAAA,cACH,KAAK,MAAM;AAAA,gBACT,KAAK,QAAQ;AAAA,gBACb,KAAK,YAAY,YAAY;AAAA,eAC9B,KAAK,UAAU,YAAY,CAAC;AAAA,eAC5B,KAAK,UAAU,YAAY,CAAC,GAAG,eAAe,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc;AAAA;AAAA;AAAA;AAAA,EAI1G,KAAK,eAAe,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkB5C,KAAK,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5C,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAMjB;AAtcA,IAAAC,kBACAC,oBACAC,oBACAC,kBACAC;AAJA;AAAA;AAAA;AAAA;AAAA,IAAAJ,mBAAqD;AACrD,IAAAC,qBAAqB;AACrB,IAAAC,qBAAwB;AACxB,IAAAC,mBAAqB;AACrB,IAAAC,cAAgB;AAEhB;AACA;AACA;AACA;AAUgB;AA+OD;AA6GA;AAUN;AAMA;AAQA;AAAA;AAAA;;;ACvYT,IAAAC,kBACAC,oBACAC,kBACA,eASa;AAZb;AAAA;AAAA;AAAA;AAAA,IAAAF,mBAAe;AACf,IAAAC,qBAAiB;AACjB,IAAAC,mBAA8B;AAC9B,oBAAmB;AASZ,IAAM,kBAAN,MAAM,gBAAe;AAAA;AAAA;AAAA;AAAA,MAO1B,OAAe,iBAAyB;AAEtC,cAAM,kBAAc,gCAAc,aAAe;AACjD,cAAM,aAAa,mBAAAC,QAAK,QAAQ,WAAW;AAG3C,YAAI,UAAU;AACd,eAAO,YAAY,mBAAAA,QAAK,QAAQ,OAAO,GAAG;AACxC,gBAAM,kBAAkB,mBAAAA,QAAK,KAAK,SAAS,cAAc;AACzD,cAAI,iBAAAC,QAAG,WAAW,eAAe,GAAG;AAClC,gBAAI;AACF,oBAAM,cAAc,KAAK,MAAM,iBAAAA,QAAG,aAAa,iBAAiB,MAAM,CAAC;AACvE,kBAAI,YAAY,SAAS,iCAAiC;AACxD,uBAAO;AAAA,cACT;AAAA,YACF,SAAS,QAAQ;AAAA,YAEjB;AAAA,UACF;AACA,oBAAU,mBAAAD,QAAK,QAAQ,OAAO;AAAA,QAChC;AAGA,YAAI,UAAU,QAAQ,IAAI;AAC1B,eAAO,YAAY,mBAAAA,QAAK,QAAQ,OAAO,GAAG;AACxC,cAAI,iBAAAC,QAAG,WAAW,mBAAAD,QAAK,KAAK,SAAS,cAAc,CAAC,GAAG;AACrD,mBAAO;AAAA,UACT;AACA,oBAAU,mBAAAA,QAAK,QAAQ,OAAO;AAAA,QAChC;AACA,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,aAA0B;AAC/B,cAAM,cAAc,gBAAe,eAAe;AAClD,cAAM,cAAc,mBAAAA,QAAK,KAAK,aAAa,gBAAe,YAAY;AAEtE,YAAI;AAEJ,YAAI,iBAAAC,QAAG,WAAW,WAAW,GAAG;AAC9B,0BAAgB,iBAAAA,QAAG,aAAa,aAAa,MAAM,EAAE,KAAK;AAAA,QAC5D,OAAO;AAEL,gBAAM,kBAAkB,mBAAAD,QAAK,KAAK,aAAa,gBAAe,YAAY;AAC1E,cAAI,iBAAAC,QAAG,WAAW,eAAe,GAAG;AAClC,kBAAM,cAAc,KAAK,MAAM,iBAAAA,QAAG,aAAa,iBAAiB,MAAM,CAAC;AACvE,4BAAgB,YAAY;AAAA,UAC9B,OAAO;AACL,kBAAM,IAAI,MAAM,6CAA6C;AAAA,UAC/D;AAAA,QACF;AAEA,YAAI,CAAC,cAAAC,QAAO,MAAM,aAAa,GAAG;AAChC,gBAAM,IAAI,MAAM,2BAA2B,aAAa,EAAE;AAAA,QAC5D;AAEA,cAAM,SAAS,cAAAA,QAAO,MAAM,aAAa;AACzC,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,4BAA4B,aAAa,EAAE;AAAA,QAC7D;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,OAAO;AAAA,UACd,OAAO,OAAO;AAAA,UACd,OAAO,OAAO;AAAA,QAChB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,WAAW,SAAuB;AACvC,YAAI,CAAC,cAAAA,QAAO,MAAM,OAAO,GAAG;AAC1B,gBAAM,IAAI,MAAM,2BAA2B,OAAO,EAAE;AAAA,QACtD;AAEA,cAAM,cAAc,gBAAe,eAAe;AAClD,cAAM,cAAc,mBAAAF,QAAK,KAAK,aAAa,gBAAe,YAAY;AAEtE,yBAAAC,QAAG,cAAc,aAAa,OAAO;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,YAAY,MAAgD;AACjE,cAAM,iBAAiB,gBAAe,WAAW;AACjD,cAAM,aAAa,cAAAC,QAAO,IAAI,eAAe,SAAS,IAAI;AAE1D,YAAI,CAAC,YAAY;AACf,gBAAM,IAAI,MAAM,gCAAgC,eAAe,OAAO,EAAE;AAAA,QAC1E;AAEA,wBAAe,WAAW,UAAU;AACpC,eAAO,gBAAe,WAAW;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,cAAoB;AACzB,cAAM,cAAc,gBAAe,WAAW;AAC9C,cAAM,cAAc,gBAAe,eAAe;AAGlD,wBAAe,yBAAyB,aAAa,YAAY,OAAO;AAAA,MAC1E;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,yBAAyB,aAAqB,SAAuB;AAClF,cAAM,kBAAkB,mBAAAF,QAAK,KAAK,aAAa,gBAAe,YAAY;AAE1E,YAAI,CAAC,iBAAAC,QAAG,WAAW,eAAe,GAAG;AACnC,gBAAM,IAAI,MAAM,wBAAwB;AAAA,QAC1C;AAEA,cAAM,cAAc,KAAK,MAAM,iBAAAA,QAAG,aAAa,iBAAiB,MAAM,CAAC;AACvE,oBAAY,UAAU;AAEtB,yBAAAA,QAAG,cAAc,iBAAiB,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,MAC/E;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,6BAAwF;AAC7F,cAAM,cAAc,gBAAe,eAAe;AAClD,cAAM,cAAc,gBAAe,WAAW;AAC9C,cAAM,WAAmC;AAAA,UACvC,SAAS,YAAY;AAAA,QACvB;AAGA,cAAM,kBAAkB,mBAAAD,QAAK,KAAK,aAAa,gBAAe,YAAY;AAC1E,YAAI,iBAAAC,QAAG,WAAW,eAAe,GAAG;AAClC,gBAAM,cAAc,KAAK,MAAM,iBAAAA,QAAG,aAAa,iBAAiB,MAAM,CAAC;AACvE,mBAAS,cAAc,IAAI,YAAY;AAAA,QACzC;AAGA,cAAM,cAAc,OAAO,OAAO,QAAQ;AAC1C,cAAM,aAAa,YAAY,MAAM,CAAC,MAAM,MAAM,YAAY,OAAO;AAErE,eAAO,EAAE,YAAY,SAAS;AAAA,MAChC;AAAA,IACF;AA9J4B;AAC1B,kBADW,iBACa,gBAAe;AACvC,kBAFW,iBAEa,gBAAe;AAFlC,IAAM,iBAAN;AAAA;AAAA;;;ACZP,IAAAE,4BACAC,kBACAC,oBAyBa;AA3Bb;AAAA;AAAA;AAAA;AAAA,IAAAF,6BAAyB;AACzB,IAAAC,mBAAe;AACf,IAAAC,qBAAiB;AACjB;AAwBO,IAAM,oBAAN,MAAM,kBAAiB;AAAA;AAAA;AAAA;AAAA,MAM5B,OAAe,iBAAyB;AACtC,YAAI,UAAU,QAAQ,IAAI;AAC1B,eAAO,YAAY,mBAAAC,QAAK,QAAQ,OAAO,GAAG;AACxC,cAAI,iBAAAC,QAAG,WAAW,mBAAAD,QAAK,KAAK,SAAS,cAAc,CAAC,GAAG;AACrD,mBAAO;AAAA,UACT;AACA,oBAAU,mBAAAA,QAAK,QAAQ,OAAO;AAAA,QAChC;AACA,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,aAAa,OAAsC;AACxD,cAAM,cAAc,kBAAiB,eAAe;AAEpD,YAAI;AACF,gBAAM,YAAY,QAAQ,YAAY,KAAK,MAAM;AACjD,gBAAM,aAAS,qCAAS,kDAAkD,SAAS,IAAI;AAAA,YACrF,KAAK;AAAA,YACL,UAAU;AAAA,UACZ,CAAC;AAED,cAAI,CAAC,OAAO,KAAK,GAAG;AAClB,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO,OACJ,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAC5B,IAAI,CAAC,SAAS;AACb,kBAAM,CAAC,MAAM,SAAS,IAAI,IAAI,KAAK,MAAM,GAAG;AAC5C,mBAAO,kBAAiB,wBAAwB,MAAM,SAAS,QAAQ,EAAE;AAAA,UAC3E,CAAC,EACA,OAAO,CAAC,WAAW,WAAW,IAAI;AAAA,QACvC,SAAS,QAAQ;AACf,kBAAQ,KAAK,8EAA8E;AAC3F,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,wBACb,MACA,SACA,MAC2B;AAE3B,cAAM,sBAAsB;AAC5B,cAAM,QAAQ,QAAQ,MAAM,mBAAmB;AAE/C,YAAI,CAAC,OAAO;AAEV,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa;AAAA,YACb;AAAA,YACA,UAAU,QAAQ,SAAS,UAAU,KAAK,KAAK,SAAS,iBAAiB;AAAA,YACzE,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,UAC3B;AAAA,QACF;AAEA,cAAM,CAAC,EAAE,MAAM,YAAY,WAAW,IAAI;AAC1C,cAAM,QAAQ,aAAa,WAAW,MAAM,GAAG,EAAE,IAAI;AACrD,cAAM,WAAW,QAAQ,SAAS,GAAG,KAAK,KAAK,SAAS,iBAAiB;AAEzE,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,QAC3B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,kBAAkB,SAA2D;AAClF,cAAM,WAAuC;AAAA,UAC3C,OAAO,CAAC;AAAA,UACR,SAAS,CAAC;AAAA,UACV,YAAY,CAAC;AAAA,UACb,SAAS,CAAC;AAAA,UACV,OAAO,CAAC;AAAA,UACR,UAAU,CAAC;AAAA,QACb;AAEA,mBAAW,UAAU,SAAS;AAC5B,gBAAM,QAAQ,OAAO,QACjB,KAAK,OAAO,KAAK,OAAO,OAAO,WAAW,KAAK,OAAO,IAAI,MAC1D,GAAG,OAAO,WAAW,KAAK,OAAO,IAAI;AAEzC,kBAAQ,OAAO,MAAM;AAAA,YACnB,KAAK;AACH,uBAAS,MAAM,KAAK,KAAK;AACzB;AAAA,YACF,KAAK;AACH,uBAAS,MAAM,KAAK,KAAK;AACzB;AAAA,YACF,KAAK;AACH,uBAAS,QAAQ,KAAK,KAAK;AAC3B;AAAA,YACF,KAAK;AACH,uBAAS,QAAQ,KAAK,KAAK;AAC3B;AAAA,YACF,KAAK;AACH,uBAAS,QAAQ,KAAK,KAAK;AAC3B;AAAA,YACF,KAAK;AACH,uBAAS,QAAQ,KAAK,KAAK;AAC3B;AAAA,YACF,KAAK;AACH,uBAAS,QAAQ,KAAK,KAAK;AAC3B;AAAA,YACF,KAAK;AACH,uBAAS,QAAQ,KAAK,KAAK;AAC3B;AAAA,YACF,KAAK;AACH,uBAAS,SAAS,KAAK,KAAK;AAC5B;AAAA,YACF;AACE,kBAAI,OAAO,UAAU;AACnB,yBAAS,QAAQ,KAAK,KAAK;AAAA,cAC7B,OAAO;AACL,yBAAS,QAAQ,KAAK,KAAK;AAAA,cAC7B;AAAA,UACJ;AAGA,cAAI,OAAO,UAAU;AACnB,kBAAM,gBAAgB,iBAAiB,OAAO,WAAW,KAAK,OAAO,IAAI;AACzE,gBAAI,CAAC,SAAS,QAAQ,SAAS,aAAa,GAAG;AAC7C,uBAAS,QAAQ,QAAQ,aAAa;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,uBAAuB,SAAkB,OAAgC;AAC9E,cAAM,iBAAiB,WAAW,eAAe,WAAW,EAAE;AAC9D,cAAM,UAAU,kBAAiB,aAAa,KAAK;AACnD,cAAM,WAAW,kBAAiB,kBAAkB,OAAO;AAE3D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,qBAAqB,OAA+B;AACzD,cAAM,QAAkB,CAAC;AAEzB,cAAM,KAAK,OAAO,MAAM,OAAO,OAAO,MAAM,IAAI,EAAE;AAClD,cAAM,KAAK,EAAE;AAGb,cAAM,eAAe;AAAA,UACnB,OAAO;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAEA,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,gBAAM,QAAQ,MAAM,SAAS,GAAkC;AAC/D,cAAI,MAAM,SAAS,GAAG;AACpB,kBAAM,KAAK,OAAO,KAAK,EAAE;AACzB,uBAAW,QAAQ,OAAO;AACxB,oBAAM,KAAK,KAAK,IAAI,EAAE;AAAA,YACxB;AACA,kBAAM,KAAK,EAAE;AAAA,UACf;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,kBAAkB,SAAkB,OAAsB;AAC/D,cAAM,cAAc,kBAAiB,eAAe;AACpD,cAAM,gBAAgB,mBAAAA,QAAK,KAAK,aAAa,kBAAiB,cAAc;AAE5E,cAAM,QAAQ,kBAAiB,uBAAuB,SAAS,KAAK;AACpE,cAAM,gBAAgB,kBAAiB,qBAAqB,KAAK;AAEjE,YAAI,mBAAmB;AAEvB,YAAI,iBAAAC,QAAG,WAAW,aAAa,GAAG;AAEhC,gBAAM,kBAAkB,iBAAAA,QAAG,aAAa,eAAe,MAAM;AAG7D,gBAAM,iBAAiB,gBAAgB,QAAQ,OAAO;AACtD,cAAI,mBAAmB,IAAI;AACzB,kBAAM,SAAS,gBAAgB,UAAU,GAAG,iBAAiB,CAAC;AAC9D,kBAAM,OAAO,gBAAgB,UAAU,iBAAiB,CAAC;AACzD,+BAAmB,GAAG,SAAS,aAAa;AAAA,EAAK,IAAI;AAAA,UACvD,OAAO;AACL,+BAAmB,GAAG,eAAe;AAAA,EAAK,aAAa;AAAA,UACzD;AAAA,QACF,OAAO;AAEL,6BAAmB,kBAAiB,sBAAsB,IAAI;AAAA,QAChE;AAEA,yBAAAA,QAAG,cAAc,eAAe,gBAAgB;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,wBAAgC;AAC7C,eAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQT;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,4BAA2C;AAChD,cAAM,cAAc,kBAAiB,eAAe;AACpD,cAAM,gBAAgB,mBAAAD,QAAK,KAAK,aAAa,kBAAiB,cAAc;AAE5E,YAAI,CAAC,iBAAAC,QAAG,WAAW,aAAa,GAAG;AACjC,iBAAO;AAAA,QACT;AAEA,cAAM,UAAU,iBAAAA,QAAG,aAAa,eAAe,MAAM;AACrD,cAAM,eAAe,QAAQ,MAAM,iBAAiB;AAEpD,eAAO,eAAe,aAAa,CAAC,IAAI;AAAA,MAC1C;AAAA,IACF;AAtQ8B;AAC5B,kBADW,mBACa,kBAAiB;AADpC,IAAM,mBAAN;AAAA;AAAA;;;ACrBA,SAAS,oBAA6B;AAC3C,QAAM,UAAU,IAAI,2BAAQ,MAAM;AAElC,UACG,YAAY,4CAA4C,EACxD,SAAS,UAAU,yCAAyC,EAC5D,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,eAAe,iBAAiB,EACvC,OAAO,aAAa,gDAAgD,EACpE,OAAO,mBAAmB,uBAAuB,EACjD,OAAO,OAAO,MAAc,YAAY;AACvC,QAAI;AAEF,UAAI,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,SAAS,IAAI,GAAG;AAC/C,gBAAQ,MAAM,UAAU,MAAM,oDAAoD,CAAC;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,iBAAiB,eAAe,WAAW;AAGjD,UACE,WAAW,gBAAgB,KAC3B,WAAW,sBAAsB,KACjC,CAAC,QAAQ,UACT;AACA,gBAAQ;AAAA,UACN,UAAU,MAAM,qEAAqE;AAAA,QACvF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,UAAU,KAAK,kDAA2C,CAAC;AAGvE,cAAMC,UAAS,MAAM,OAAO,QAAQ;AACpC,cAAMC,cAAaD,QAAO,IAAI,eAAe,SAAS,IAAW;AAEjE,gBAAQ,IAAI,UAAU,KAAK,8BAAuB,eAAe,OAAO,EAAE,CAAC;AAC3E,gBAAQ,IAAI,UAAU,KAAK,0BAAmBC,WAAU,EAAE,CAAC;AAE3D,YAAI,CAAC,QAAQ,aAAa;AACxB,kBAAQ,IAAI,UAAU,KAAK,0CAAmC,CAAC;AAAA,QACjE;AAEA,YAAI,CAAC,QAAQ,YAAY,WAAW,gBAAgB,GAAG;AACrD,kBAAQ,IAAI,UAAU,KAAK,uCAAgC,CAAC;AAAA,QAC9D;AAEA;AAAA,MACF;AAEA,cAAQ,IAAI,UAAU,KAAK,kCAA2B,eAAe,OAAO,KAAK,CAAC;AAGlF,YAAM,UAAU,WAAW,WAAW;AAGtC,YAAM,aAAa,eAAe,YAAY,IAAmC;AACjF,cAAQ,IAAI,UAAU,QAAQ,+BAAwB,WAAW,OAAO,EAAE,CAAC;AAG3E,qBAAe,YAAY;AAC3B,cAAQ,IAAI,UAAU,QAAQ,iDAA0C,CAAC;AAGzE,UAAI,CAAC,QAAQ,aAAa;AACxB,cAAM,QAAQ,WAAW;AACzB,yBAAiB,kBAAkB,WAAW,SAAS,KAAK;AAC5D,gBAAQ,IAAI,UAAU,QAAQ,6BAAsB,CAAC;AAAA,MACvD;AAGA,UAAI,CAAC,QAAQ,YAAY,WAAW,gBAAgB,GAAG;AACrD,cAAM,gBAAgB,QAAQ,WAAW,0BAA0B,WAAW,OAAO;AAErF,cAAM,gBAAgB,CAAC,WAAW,cAAc;AAChD,YAAI,CAAC,QAAQ,aAAa;AACxB,wBAAc,KAAK,cAAc;AAAA,QACnC;AAEA,mBAAW,OAAO,eAAe,aAAa;AAC9C,gBAAQ,IAAI,UAAU,QAAQ,gCAAyB,aAAa,EAAE,CAAC;AAAA,MACzE;AAEA,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,+BAA0B,CAAC;AACzD,cAAQ,IAAI,UAAU,KAAK,gBAAgB,eAAe,OAAO,EAAE,CAAC;AACpE,cAAQ,IAAI,UAAU,KAAK,gBAAgB,WAAW,OAAO,EAAE,CAAC;AAEhE,UAAI,WAAW,gBAAgB,GAAG;AAChC,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,uBAAgB,CAAC;AAC5C,gBAAQ,IAAI,UAAU,KAAK,yBAAyB,CAAC;AACrD,gBAAQ,IAAI,UAAU,KAAK,kDAAkD,CAAC;AAC9E,gBAAQ;AAAA,UACN,UAAU,KAAK,sCAAsC,WAAW,iBAAiB,CAAC,EAAE;AAAA,QACtF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACrF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AArHA,IAAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,qBAAwB;AACxB;AACA;AACA;AACA;AAEgB;AAAA;AAAA;;;ACAT,SAAS,yBAAkC;AAChD,QAAM,UAAU,IAAI,2BAAQ,WAAW;AAEvC,UACG,YAAY,iCAAiC,EAC7C;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,aAAa,sDAAsD,EAC1E,OAAO,qBAAqB,kCAAkC,UAAU,EACxE,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,UAAI,CAAC,WAAW,gBAAgB,GAAG;AACjC,gBAAQ;AAAA,UACN,UAAU,QAAQ,+DAA+D;AAAA,QACnF;AAAA,MACF;AAEA,YAAM,UAAU,QAAQ,WAAW,eAAe,WAAW,EAAE;AAC/D,YAAM,QAAQ,QAAQ,SAAS,WAAW,WAAW,KAAK;AAE1D,cAAQ,IAAI,UAAU,KAAK,8CAAuC,OAAO,KAAK,CAAC;AAE/E,UAAI,OAAO;AACT,gBAAQ,IAAI,UAAU,KAAK,sCAA+B,KAAK,EAAE,CAAC;AAAA,MACpE;AAGA,YAAM,QAAQ,iBAAiB,uBAAuB,SAAS,KAAK;AAEpE,UAAI,QAAQ,WAAW,QAAQ;AAC7B,YAAI,QAAQ,QAAQ;AAClB,kBAAQ,IAAI,6CAAsC;AAClD,kBAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,QAC5C,OAAO;AACL,kBAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,QAC5C;AACA;AAAA,MACF;AAGA,YAAM,WAAW,iBAAiB,qBAAqB,KAAK;AAE5D,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,sCAA+B;AAC3C,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,QAAQ;AACpB;AAAA,MACF;AAGA,uBAAiB,kBAAkB,SAAS,KAAK;AAEjD,cAAQ,IAAI,UAAU,QAAQ,2CAAsC,CAAC;AAGrE,YAAM,eAAe,OAAO,OAAO,MAAM,QAAQ,EAAE;AAAA,QACjD,CAAC,KAAK,UAAU,MAAM,MAAM;AAAA,QAC5B;AAAA,MACF;AACA,cAAQ,IAAI,UAAU,KAAK,oBAAa,CAAC;AACzC,cAAQ,IAAI,UAAU,KAAK,iBAAiB,MAAM,OAAO,EAAE,CAAC;AAC5D,cAAQ,IAAI,UAAU,KAAK,cAAc,MAAM,IAAI,EAAE,CAAC;AACtD,cAAQ,IAAI,UAAU,KAAK,uBAAuB,YAAY,EAAE,CAAC;AAGjE,YAAM,eAAe;AAAA,QACnB,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAEA,iBAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,YAAY,GAAG;AACtD,cAAM,QAAQ,MAAM,SAAS,GAAkC,EAAE;AACjE,YAAI,QAAQ,GAAG;AACb,kBAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,CAAC;AAAA,QAC5D;AAAA,MACF;AAEA,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,gEAAyD,CAAC;AAAA,IACvF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC3F;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAvGA,IAAAC;AAAA,IAAAC,kBAAA;AAAA;AAAA;AAAA;AAAA,IAAAD,qBAAwB;AACxB;AACA;AACA;AACA;AAEgB;AAAA;AAAA;;;ACAT,SAAS,uBAAgC;AAC9C,QAAM,UAAU,IAAI,2BAAQ,SAAS;AAErC,UACG,YAAY,qEAAqE,EACjF,SAAS,UAAU,2CAA2C,OAAO,EACrE,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,eAAe,iBAAiB,EACvC,OAAO,YAAY,uBAAuB,EAC1C,OAAO,UAAU,iCAAiC,EAClD,OAAO,aAAa,gDAAgD,EACpE,OAAO,mBAAmB,wBAAwB,EAClD,OAAO,OAAO,MAAc,YAAY;AACvC,QAAI;AAEF,UAAI,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,SAAS,IAAI,GAAG;AAC/C,gBAAQ,MAAM,UAAU,MAAM,uDAAuD,CAAC;AACtF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,iBAAiB,eAAe,WAAW;AAGjD,UAAI,WAAW,gBAAgB,GAAG;AAChC,YAAI,WAAW,sBAAsB,KAAK,CAAC,QAAQ,UAAU;AAC3D,kBAAQ;AAAA,YACN,UAAU,MAAM,qEAAqE;AAAA,UACvF;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN,UAAU,QAAQ,0DAA0D;AAAA,QAC9E;AACA,gBAAQ,WAAW;AACnB,gBAAQ,QAAQ;AAAA,MAClB;AAGA,YAAME,UAAS,MAAM,OAAO,QAAQ;AACpC,YAAM,aAAaA,QAAO,IAAI,eAAe,SAAS,IAAW;AAEjE,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,wCAAwC,eAAe,OAAO,EAAE;AAAA,MAClF;AAEA,cAAQ,IAAI,UAAU,KAAK,uCAAgC,CAAC;AAC5D,cAAQ,IAAI,EAAE;AAEd,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,UAAU,KAAK,kDAA2C,CAAC;AACvE,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,yBAAkB,CAAC;AAC9C,gBAAQ,IAAI,UAAU,KAAK,iCAA0B,eAAe,OAAO,EAAE,CAAC;AAC9E,gBAAQ,IAAI,UAAU,KAAK,6BAAsB,UAAU,EAAE,CAAC;AAE9D,YAAI,CAAC,QAAQ,aAAa;AACxB,kBAAQ,IAAI,UAAU,KAAK,iCAA0B,CAAC;AAAA,QACxD;AAEA,YAAI,CAAC,QAAQ,YAAY,WAAW,gBAAgB,GAAG;AACrD,kBAAQ,IAAI,UAAU,KAAK,6BAAsB,CAAC;AAAA,QACpD;AAEA,YAAI,CAAC,QAAQ,SAAS,WAAW,gBAAgB,GAAG;AAClD,kBAAQ,IAAI,UAAU,KAAK,mCAAuB,UAAU,EAAE,CAAC;AAAA,QACjE;AAEA,YAAI,QAAQ,QAAQ,WAAW,gBAAgB,GAAG;AAChD,kBAAQ,IAAI,UAAU,KAAK,6BAAsB,CAAC;AAAA,QACpD;AAEA;AAAA,MACF;AAGA,cAAQ;AAAA,QACN,UAAU,KAAK,kCAA2B,eAAe,OAAO,OAAO,UAAU,KAAK;AAAA,MACxF;AACA,qBAAe,YAAY,IAAmC;AAC9D,qBAAe,YAAY;AAC3B,cAAQ,IAAI,UAAU,QAAQ,wBAAmB,CAAC;AAGlD,UAAI,CAAC,QAAQ,aAAa;AACxB,gBAAQ,IAAI,UAAU,KAAK,mCAA4B,CAAC;AACxD,cAAM,UAAU,WAAW,WAAW;AACtC,cAAM,QAAQ,WAAW;AACzB,yBAAiB,kBAAkB,YAAY,KAAK;AACpD,gBAAQ,IAAI,UAAU,QAAQ,0BAAqB,CAAC;AAAA,MACtD;AAGA,UAAI,CAAC,QAAQ,YAAY,WAAW,gBAAgB,GAAG;AACrD,gBAAQ,IAAI,UAAU,KAAK,iCAA0B,CAAC;AAEtD,cAAM,gBAAgB,QAAQ,WAAW,0BAA0B,UAAU;AAC7E,cAAM,gBAAgB,CAAC,WAAW,cAAc;AAEhD,YAAI,CAAC,QAAQ,aAAa;AACxB,wBAAc,KAAK,cAAc;AAAA,QACnC;AAEA,mBAAW,OAAO,eAAe,aAAa;AAC9C,gBAAQ,IAAI,UAAU,QAAQ,0BAAqB,CAAC;AAAA,MACtD;AAGA,UAAI,CAAC,QAAQ,SAAS,WAAW,gBAAgB,GAAG;AAClD,gBAAQ,IAAI,UAAU,KAAK,kCAAsB,UAAU,KAAK,CAAC;AAEjE,cAAM,aAAa,mBAAmB,UAAU;AAChD,mBAAW,UAAU,YAAY,UAAU;AAC3C,gBAAQ,IAAI,UAAU,QAAQ,oBAAe,CAAC;AAAA,MAChD;AAGA,UAAI,QAAQ,QAAQ,WAAW,gBAAgB,GAAG;AAChD,gBAAQ,IAAI,UAAU,KAAK,gCAAyB,CAAC;AAErD,YAAI;AACF,gBAAM,EAAE,UAAAC,UAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,gBAAM,gBAAgB,WAAW,iBAAiB;AAGlD,UAAAA,UAAS,mBAAmB,aAAa,EAAE;AAC3C,kBAAQ,IAAI,UAAU,QAAQ,uBAAkB,CAAC;AAGjD,cAAI,CAAC,QAAQ,OAAO;AAClB,uBAAW,SAAS;AACpB,oBAAQ,IAAI,UAAU,QAAQ,oBAAe,CAAC;AAAA,UAChD;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,UAAU,MAAM,6BAA6B,KAAK,EAAE,CAAC;AACnE,kBAAQ,IAAI,UAAU,KAAK,uCAAgC,CAAC;AAAA,QAC9D;AAAA,MACF;AAGA,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,2CAAoC,CAAC;AACnE,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK,4BAAqB,CAAC;AACjD,cAAQ,IAAI,UAAU,KAAK,yBAAkB,eAAe,OAAO,WAAM,UAAU,EAAE,CAAC;AACtF,cAAQ,IAAI,UAAU,KAAK,uBAAe,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;AAEnF,UAAI,CAAC,QAAQ,aAAa;AACxB,gBAAQ,IAAI,UAAU,KAAK,iCAA0B,CAAC;AAAA,MACxD;AAEA,UAAI,CAAC,QAAQ,YAAY,WAAW,gBAAgB,GAAG;AACrD,gBAAQ,IAAI,UAAU,KAAK,qCAA8B,CAAC;AAAA,MAC5D;AAEA,UAAI,CAAC,QAAQ,SAAS,WAAW,gBAAgB,GAAG;AAClD,gBAAQ,IAAI,UAAU,KAAK,6BAAiB,UAAU,UAAU,CAAC;AAAA,MACnE;AAGA,UAAI,CAAC,QAAQ,QAAQ,WAAW,gBAAgB,GAAG;AACjD,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,uBAAgB,CAAC;AAC5C,gBAAQ;AAAA,UACN,UAAU,KAAK,sCAAsC,WAAW,iBAAiB,CAAC,EAAE;AAAA,QACtF;AAEA,YAAI,CAAC,QAAQ,OAAO;AAClB,kBAAQ,IAAI,UAAU,KAAK,oCAAoC,UAAU,EAAE,CAAC;AAAA,QAC9E;AAEA,gBAAQ,IAAI,UAAU,KAAK,yCAAyC,CAAC;AAAA,MACvE;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC7E;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AA9LA,IAAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,qBAAwB;AACxB;AACA;AACA;AACA;AAEgB;AAAA;AAAA;;;ACFT,SAAS,oBAA6B;AAC3C,QAAM,UAAU,IAAI,2BAAQ,MAAM;AAElC,UACG,YAAY,qCAAqC,EACjD,OAAO,UAAU,gBAAgB,EACjC,OAAO,uBAAuB,wCAAwC,EACtE,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,YAAM,cAAc,eAAe,WAAW;AAE9C,UAAI,QAAQ,MAAM;AAChB,YAAI,QAAQ,kBAAkB;AAC5B,gBAAM,cAAc,eAAe,2BAA2B;AAC9D,kBAAQ;AAAA,YACN,KAAK;AAAA,cACH;AAAA,gBACE,GAAG;AAAA,gBACH;AAAA,cACF;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,QAClD;AACA;AAAA,MACF;AAGA,cAAQ,IAAI,UAAU,QAAQ,+BAAwB,YAAY,OAAO,EAAE,CAAC;AAC5E,cAAQ,IAAI,UAAU,KAAK,aAAa,YAAY,KAAK,EAAE,CAAC;AAC5D,cAAQ,IAAI,UAAU,KAAK,aAAa,YAAY,KAAK,EAAE,CAAC;AAC5D,cAAQ,IAAI,UAAU,KAAK,aAAa,YAAY,KAAK,EAAE,CAAC;AAE5D,UAAI,QAAQ,kBAAkB;AAC5B,gBAAQ,IAAI,EAAE;AACd,cAAM,cAAc,eAAe,2BAA2B;AAE9D,YAAI,YAAY,YAAY;AAC1B,kBAAQ,IAAI,UAAU,QAAQ,yCAAoC,CAAC;AAAA,QACrE,OAAO;AACL,kBAAQ,IAAI,UAAU,MAAM,wCAAmC,CAAC;AAChE,qBAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,YAAY,QAAQ,GAAG;AAClE,kBAAM,SAAS,YAAY,YAAY,UAAU,WAAM;AACvD,oBAAQ,IAAI,UAAU,KAAK,MAAM,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE,CAAC;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACpF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAjEA,IAAAC;AAAA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAAA,IAAAD,qBAAwB;AACxB;AACA;AAEgB;AAAA;AAAA;;;ACAT,SAASE,qBAA6B;AAC3C,QAAM,UAAU,IAAI,2BAAQ,MAAM;AAElC,UACG,YAAY,sCAAsC,EAClD,OAAO,gBAAgB,+CAA+C,EACtE,OAAO,aAAa,2CAA2C,EAC/D,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,cAAQ,IAAI,UAAU,KAAK,2CAAoC,CAAC;AAGhE,YAAM,cAAc,eAAe,2BAA2B;AAC9D,YAAM,cAAc,eAAe,WAAW;AAE9C,UAAI,QAAQ,WAAW,QAAQ,WAAW;AACxC,gBAAQ,IAAI,UAAU,KAAK,4CAAqC,YAAY,OAAO,EAAE,CAAC;AACtF,gBAAQ,IAAI,EAAE;AAEd,mBAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,YAAY,QAAQ,GAAG;AAClE,gBAAM,SAAS,YAAY,YAAY,UAAU,WAAM;AACvD,gBAAM,UAAU,YAAY,YAAY,UAAU,iBAAiB;AACnE,kBAAQ,IAAI,UAAU,KAAK,MAAM,IAAI,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO,GAAG,CAAC;AAAA,QAC7E;AAAA,MACF;AAEA,UAAI,YAAY,YAAY;AAC1B,gBAAQ,IAAI,UAAU,QAAQ,4CAAuC,CAAC;AACtE;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW;AACrB,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,MAAM,wCAAmC,CAAC;AAChE,gBAAQ,IAAI,UAAU,KAAK,sDAAsD,CAAC;AAClF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,gEAAsD,CAAC;AAGrF,qBAAe,YAAY;AAG3B,YAAM,iBAAiB,eAAe,2BAA2B;AAEjE,UAAI,eAAe,YAAY;AAC7B,gBAAQ,IAAI,UAAU,QAAQ,wDAAmD,CAAC;AAElF,YAAI,QAAQ,SAAS;AACnB,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,UAAU,KAAK,0BAAmB,CAAC;AAC/C,qBAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,eAAe,QAAQ,GAAG;AACrE,oBAAQ,IAAI,UAAU,KAAK,MAAM,IAAI,KAAK,OAAO,SAAI,CAAC;AAAA,UACxD;AAAA,QACF;AAEA,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,wCAAiC,YAAY,OAAO,EAAE,CAAC;AAAA,MACpF,OAAO;AACL,gBAAQ;AAAA,UACN,UAAU,MAAM,iEAA4D;AAAA,QAC9E;AAEA,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,2BAAoB,CAAC;AAChD,mBAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,eAAe,QAAQ,GAAG;AACrE,gBAAM,SAAS,YAAY,YAAY,UAAU,WAAM;AACvD,kBAAQ,IAAI,UAAU,KAAK,MAAM,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE,CAAC;AAAA,QAChE;AAEA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,mCAAmC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC7F;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAzFA,IAAAC;AAAA,IAAAC,aAAA;AAAA;AAAA;AAAA;AAAA,IAAAD,qBAAwB;AACxB;AACA;AAEgB,WAAAD,oBAAA;AAAA;AAAA;;;ACET,SAAS,mBAA4B;AAC1C,QAAM,UAAU,IAAI,2BAAQ,KAAK;AAEjC,UACG,YAAY,0CAA0C,EACtD,OAAO,UAAU,mCAAmC,EACpD,OAAO,mBAAmB,oBAAoB,EAC9C,OAAO,aAAa,kDAAkD,EACtE,OAAO,WAAW,oCAAoC,EACtD,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,UAAI,CAAC,WAAW,gBAAgB,GAAG;AACjC,gBAAQ,MAAM,UAAU,MAAM,8CAA8C,CAAC;AAC7E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,cAAc,eAAe,WAAW;AAC9C,YAAM,UAAU,IAAI,YAAY,OAAO;AACvC,YAAM,aAAa,QAAQ,WAAW,mBAAmB,YAAY,OAAO;AAE5E,cAAQ,IAAI,UAAU,KAAK,iCAAqB,OAAO,KAAK,CAAC;AAG7D,UAAI,WAAW,UAAU,OAAO,KAAK,CAAC,QAAQ,OAAO;AACnD,gBAAQ;AAAA,UACN,UAAU,MAAM,OAAO,OAAO,8CAA8C;AAAA,QAC9E;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,UAAI,WAAW,sBAAsB,GAAG;AACtC,gBAAQ,KAAK,UAAU,QAAQ,sDAA4C,CAAC;AAC5E,gBAAQ,IAAI,UAAU,KAAK,4DAA4D,CAAC;AAAA,MAC1F;AAEA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,UAAU,KAAK,iDAA0C,CAAC;AACtE,gBAAQ,IAAI,UAAU,KAAK,aAAa,OAAO,EAAE,CAAC;AAClD,gBAAQ,IAAI,UAAU,KAAK,gBAAgB,UAAU,EAAE,CAAC;AAExD,YAAI,QAAQ,MAAM;AAChB,kBAAQ,IAAI,UAAU,KAAK,qCAAqC,CAAC;AAAA,QACnE;AAEA;AAAA,MACF;AAGA,UAAI;AACF,mBAAW,UAAU,YAAY,SAAS,UAAU;AACpD,gBAAQ,IAAI,UAAU,QAAQ,cAAS,OAAO,wBAAwB,CAAC;AAAA,MACzE,SAAS,OAAO;AACd,YAAI,QAAQ,SAAS,iBAAiB,SAAS,MAAM,QAAQ,SAAS,gBAAgB,GAAG;AAEvF,kBAAQ,IAAI,UAAU,QAAQ,qCAA8B,OAAO,KAAK,CAAC;AACzE,cAAI;AAEF,qDAAS,cAAc,OAAO,IAAI,EAAE,OAAO,SAAS,CAAC;AACrD,uBAAW,UAAU,YAAY,SAAS,UAAU;AACpD,oBAAQ,IAAI,UAAU,QAAQ,cAAS,OAAO,0BAA0B,CAAC;AAAA,UAC3E,SAAS,eAAe;AACtB,kBAAM,IAAI,MAAM,2BAA2B,aAAa,EAAE;AAAA,UAC5D;AAAA,QACF,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAGA,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,UAAU,KAAK,+CAAwC,CAAC;AACpE,YAAI;AACF,qBAAW,SAAS;AACpB,kBAAQ,IAAI,UAAU,QAAQ,iCAA4B,CAAC;AAAA,QAC7D,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,UAAU;AAAA,cACR,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACjF;AAAA,UACF;AACA,kBAAQ;AAAA,YACN,UAAU,KAAK,+DAAwD,OAAO,EAAE;AAAA,UAClF;AAAA,QACF;AAAA,MACF;AAGA,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,QAAQ,qCAA8B,CAAC;AAC7D,cAAQ,IAAI,UAAU,KAAK,WAAW,OAAO,EAAE,CAAC;AAChD,cAAQ,IAAI,UAAU,KAAK,eAAe,UAAU,EAAE,CAAC;AACvD,cAAQ,IAAI,UAAU,KAAK,cAAc,WAAW,iBAAiB,CAAC,EAAE,CAAC;AAEzE,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,uBAAgB,CAAC;AAC5C,gBAAQ,IAAI,UAAU,KAAK,sCAAsC,OAAO,EAAE,CAAC;AAC3E,gBAAQ,IAAI,UAAU,KAAK,4CAA4C,CAAC;AAAA,MAC1E;AAGA,YAAM,UAAU,WAAW,QAAQ;AACnC,UAAI,QAAQ,SAAS,GAAG;AACtB,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,UAAU,KAAK,qBAAc,CAAC;AAC1C,gBAAQ,MAAM,EAAE,EAAE,QAAQ,CAAC,QAAQ;AACjC,gBAAM,YAAY,QAAQ,UAAU,oBAAe;AACnD,kBAAQ,IAAI,UAAU,KAAK,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;AAAA,QACrD,CAAC;AAED,YAAI,QAAQ,SAAS,GAAG;AACtB,kBAAQ,IAAI,UAAU,KAAK,cAAc,QAAQ,SAAS,CAAC,OAAO,CAAC;AAAA,QACrE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,UAAU;AAAA,UACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACnF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AApIA,IAAAG,4BACAC;AADA;AAAA;AAAA;AAAA;AAAA,IAAAD,6BAAyB;AACzB,IAAAC,qBAAwB;AACxB;AACA;AACA;AAEgB;AAAA;AAAA;;;ACET,SAAS,uBAAgC;AAC9C,QAAM,UAAU,IAAI,2BAAQ,SAAS;AAErC,UAAQ,YAAY,6BAA6B,EAAE;AAAA,IACjD;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeF;AAGA,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,uBAAuB,CAAC;AAC3C,UAAQ,WAAW,iBAAiB,CAAC;AACrC,UAAQ,WAAWC,mBAAkB,CAAC;AACtC,UAAQ,WAAW,qBAAqB,CAAC;AAEzC,SAAO;AACT;AAvCA,IAAAC;AAAA,IAAAC,gBAAA;AAAA;AAAA;AAAA;AAAA,IAAAD,qBAAwB;AACxB;AACA,IAAAE;AACA;AACA,IAAAC;AACA,IAAAC;AACA;AAEgB;AAAA;AAAA;;;ACRhB;AAAA;AAAA;AAAA;AA6BA,SAAS,aAAqB;AAC5B,MAAI;AACF,WAAO,eAAe,WAAW,EAAE;AAAA,EACrC,SAAS,QAAQ;AACf,YAAQ,KAAK,8DAA8D;AAC3E,WAAO;AAAA,EACT;AACF;AASA,eAAe,OAAsB;AACnC,QAAM,UAAU,IAAI,2BAAQ;AAG5B,UACG,KAAK,aAAa,EAClB,YAAY,YAAY,WAAW,EACnC,QAAQ,YAAY,SAAS,iBAAiB,wBAAwB,EACtE,WAAW,cAAc,0BAA0B;AAGtD,UACG,OAAO,aAAa,uBAAuB,EAC3C,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,cAAc,wBAAwB,EAC7C,OAAO,qBAAqB,sDAAsD,EAClF,OAAO,sBAAsB,sBAAsB,EACnD,OAAO,wBAAwB,4DAA4D;AAG9F,UAAQ,KAAK,aAAa,CAAC,gBAAgB;AACzC,UAAM,OAAO,QAAQ,KAAK;AAG1B,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,cAAc;AAAA,IAC5B;AAGA,QAAI,KAAK,YAAY;AACnB,cAAQ,IAAI,kBAAkB,KAAK;AAEnC,UAAI;AACF,gBAAQ,MAAM,KAAK,UAAU;AAAA,MAC/B,SAAS,OAAO;AACd,gBAAQ,MAAM,UAAU,MAAM,0CAA0C,KAAK,UAAU,EAAE,CAAC;AAC1F,gBAAQ,MAAM,UAAU,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe,CAAC;AACvF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,YAAY,KAAK;AACvC,QAAI,UAAU;AACZ,cAAQ,IAAI,gBAAgB;AAAA,IAC9B;AAGA,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,UAAU,MAAM,oBAAoB,YAAY,KAAK,CAAC,EAAE,CAAC;AACrE,cAAQ,IAAI,UAAU,MAAM,cAAc,KAAK,UAAU,YAAY,IAAI,CAAC,EAAE,CAAC;AAC7E,cAAQ,IAAI,UAAU,MAAM,YAAY,KAAK,UAAU,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;AAC7E,UAAI,KAAK,YAAY;AACnB,gBAAQ,IAAI,UAAU,MAAM,sBAAsB,KAAK,UAAU,EAAE,CAAC;AAAA,MACtE;AACA,UAAI,UAAU;AACZ,gBAAQ,IAAI,UAAU,MAAM,6BAA6B,QAAQ,EAAE,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF,CAAC;AAGD,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,mBAAmB,CAAC;AACvC,UAAQ,WAAW,oBAAoB,CAAC;AACxC,UAAQ,WAAW,4BAA4B,CAAC;AAChD,UAAQ,WAAW,qBAAqB,CAAC;AACzC,UAAQ,WAAW,6BAA6B,CAAC;AACjD,UAAQ,WAAW,uBAAuB,CAAC;AAC3C,UAAQ,WAAW,oBAAoB,CAAC;AACxC,UAAQ,WAAW,qBAAqB,CAAC;AACzC,UAAQ,WAAW,oBAAoB,CAAC;AACxC,UAAQ,WAAW,yBAAyB,CAAC;AAG7C,UAAQ,WAAW,qBAAqB,CAAC;AACzC,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,mBAAmB,CAAC;AACvC,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,gBAAgB,CAAC;AACpC,UAAQ,WAAW,gBAAgB,CAAC;AACpC,UAAQ,WAAW,kBAAkB,CAAC;AAGtC,UAAQ,WAAW,qBAAqB,CAAC;AACzC,UAAQ,WAAW,8BAA8B,CAAC;AAClD,UAAQ,WAAW,0BAA0B,CAAC;AAG9C,UAAQ,WAAW,qBAAqB,CAAC;AACzC,UAAQ,WAAW,mBAAmB,CAAC;AAGvC,UACG,QAAQ,KAAK,EACb,MAAM,aAAa,EACnB,YAAY,+BAA+B,EAC3C,OAAO,MAAM;AACZ,YAAQ,IAAI,UAAU,KAAK,oDAAoD,CAAC;AAAA,EAClF,CAAC;AAGH,UAAQ,GAAG,aAAa,CAAC,aAAa;AACpC,YAAQ,MAAM,UAAU,MAAM,oBAAoB,SAAS,CAAC,CAAC,EAAE,CAAC;AAChE,YAAQ,IAAI,UAAU,KAAK,oDAAoD,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAGD,UAAQ,GAAG,UAAU,MAAM;AACzB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAC,QAAM,KAAK,KAAK,oEAA6D,CAAC;AAC1F,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,OAAO,mCAA4B,CAAC;AAC3D,YAAQ,IAAI,+DAAgD;AAC5D,YAAQ,IAAI,yDAAyD;AACrE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,wCAA4B,CAAC;AACzD,YAAQ,IAAI,oBAAoB;AAChC,YAAQ,IAAI,4DAA4D;AACxE,YAAQ,IAAI,6DAA6D;AACzE,YAAQ,IAAI,mDAAmD;AAC/D,YAAQ,IAAI,8DAA8D;AAC1E,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,qBAAqB;AACjC,YAAQ,IAAI,sEAAsE;AAClF,YAAQ,IAAI,6DAA6D;AACzE,YAAQ,IAAI,+DAA+D;AAC3E,YAAQ,IAAI,yDAAyD;AACrE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,oBAAoB;AAChC,YAAQ,IAAI,kEAAkE;AAC9E,YAAQ,IAAI,8DAA8D;AAC1E,YAAQ,IAAI,0DAA0D;AACtE,YAAQ,IAAI,wDAAwD;AACpE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,kBAAkB;AAC9B,YAAQ,IAAI,wEAAwE;AACpF,YAAQ,IAAI,yDAAyD;AACrE,YAAQ,IAAI,oDAAoD;AAChE,YAAQ,IAAI,gEAAgE;AAC5E,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,gBAAgB;AAC5B,YAAQ,IAAI,sEAAsE;AAClF,YAAQ,IAAI,uCAAuC;AACnD,YAAQ,IAAI,uCAAuC;AACnD,YAAQ,IAAI,sCAAsC;AAClD,YAAQ,IAAI,yCAAyC;AACrD,YAAQ,IAAI,sCAAsC;AAClD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,iCAA0B,CAAC;AACvD,YAAQ,IAAI,mBAAmB;AAC/B,YAAQ,IAAI,4CAA4C;AACxD,YAAQ,IAAI,0DAA0D;AACtE,YAAQ,IAAI,6EAA6E;AACzF,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,0CAAmC,CAAC;AAChE,YAAQ,IAAI,wCAAwC;AACpD,YAAQ,IAAI,0EAA0E;AACtF,YAAQ,IAAI,gFAAgF;AAC5F,YAAQ,IAAI,mEAAmE;AAC/E,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,qCAA2B,CAAC;AACxD,YAAQ,IAAI,kBAAkB;AAC9B,YAAQ,IAAI,mCAAmC;AAC/C,YAAQ,IAAI,oCAAoC;AAChD,YAAQ,IAAI,iCAAiC;AAC7C,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,oBAAoB;AAChC,YAAQ,IAAI,yCAAyC;AACrD,YAAQ,IAAI,sCAAsC;AAClD,YAAQ,IAAI,wCAAwC;AACpD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,sCAA+B,CAAC;AAC5D,YAAQ,IAAI,uCAAuC;AACnD,YAAQ,IAAI,gFAAgF;AAC5F,YAAQ,IAAI,qEAAqE;AACjF,YAAQ,IAAI,6EAA6E;AACzF,YAAQ,IAAI,yCAAyC;AACrD,YAAQ,IAAI,mEAAmE;AAC/E,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,4BAA4B;AACxC,YAAQ,IAAI,gEAAgE;AAC5E,YAAQ,IAAI,0DAA0D;AACtE,YAAQ,IAAI,mFAAmF;AAC/F,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,gDAAgD;AAC5D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,qBAAqB;AACjC,YAAQ,IAAI,+DAA+D;AAC3E,YAAQ,IAAI,6DAA6D;AACzE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,+BAAwB,CAAC;AACrD,YAAQ,IAAI,+BAA+B;AAC3C,YAAQ,IAAI,+CAA+C;AAC3D,YAAQ,IAAI,oCAAoC;AAChD,YAAQ,IAAI,+CAA+C;AAC3D,YAAQ,IAAI,sDAAsD;AAClE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,oBAAoB;AAChC,YAAQ,IAAI,mDAAmD;AAC/D,YAAQ,IAAI,oDAAoD;AAChE,YAAQ,IAAI,0CAA0C;AACtD,YAAQ,IAAI,wCAAwC;AACpD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,6BAAwB,CAAC;AACrD,YAAQ,IAAI,uCAAuC;AACnD,YAAQ,IAAI,0CAA0C;AACtD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,2BAAoB,CAAC;AACjD,YAAQ,IAAI,sEAAsE;AAClF,YAAQ,IAAI,8DAA8D;AAC1E,YAAQ,IAAI,gDAAgD;AAC5D,YAAQ,IAAI,iDAAiD;AAC7D,YAAQ,IAAI,kDAAkD;AAC9D,YAAQ,IAAI,+CAA+C;AAC3D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,uBAAgB,CAAC;AAC7C,YAAQ,IAAI,kEAAkE;AAC9E,YAAQ,IAAI,kEAAkE;AAC9E,YAAQ,IAAI,cAAc,YAAY,OAAO,EAAE;AAAA,EACjD,CAAC;AAGD,MAAI,QAAQ,IAAI,aAAa,QAAQ;AAEnC,YAAQ,mBAAmB,mBAAmB;AAC9C,YAAQ,mBAAmB,oBAAoB;AAE/C,YAAQ,GAAG,qBAAqB,CAAC,UAAU;AACzC,cAAQ,MAAM,UAAU,MAAM,uBAAuB,MAAM,OAAO,EAAE,CAAC;AACrE,UAAI,QAAQ,KAAK,EAAE,SAAS;AAC1B,gBAAQ,MAAM,MAAM,KAAK;AAAA,MAC3B;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,YAAQ,GAAG,sBAAsB,CAAC,WAAW;AAC3C,cAAQ,MAAM,UAAU,MAAM,wBAAwB,MAAM,EAAE,CAAC;AAC/D,UAAI,QAAQ,KAAK,EAAE,WAAW,kBAAkB,OAAO;AACrD,gBAAQ,MAAM,OAAO,KAAK;AAAA,MAC5B;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,QAAQ,WAAW,QAAQ,IAAI;AAAA,EACvC,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,UAAU,MAAM,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,IAC/F;AAEA,QAAI,iBAAiB,OAAO;AAE1B,UAAI,MAAM,QAAQ,SAAS,QAAQ,GAAG;AACpC,gBAAQ,IAAI,UAAU,KAAK,8DAA8D,CAAC;AAAA,MAC5F,WAAW,MAAM,QAAQ,SAAS,QAAQ,GAAG;AAC3C,gBAAQ,IAAI,UAAU,KAAK,4DAA4D,CAAC;AAAA,MAC1F,WAAW,MAAM,QAAQ,SAAS,QAAQ,GAAG;AAC3C,gBAAQ,IAAI,UAAU,KAAK,6DAA6D,CAAC;AAAA,MAC3F,WAAW,QAAQ,KAAK,EAAE,SAAS;AACjC,gBAAQ,MAAM,MAAM,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AA1TA,IAAAC,eACAC,oBAsCM;AAvCN;AAAA;AAAA;AAAA;AAAA,IAAAD,gBAAkB;AAClB,IAAAC,qBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA,IAAAC;AACA;AACA;AAGS;AAUT,IAAM,cAAc;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,WAAW;AAAA,MACpB,aAAa;AAAA,IACf;AAEe;AAAA;AAAA;;;AC7Cf;AACA,eAAe,SAAS;AACtB,MAAI;AAEF,UAAM,EAAE,MAAAC,MAAK,IAAI,MAAM;AACvB,UAAMA,MAAK;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,MAAM,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClF,QAAI,QAAQ,IAAI,OAAO;AACrB,cAAQ,MAAM,iBAAiB,QAAQ,MAAM,QAAQ,KAAK;AAAA,IAC5D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAZe;AAef,OAAO;","names":["__filename","fs","path","YAML","TemplateManager","chalk","path","figlet","boxen","fs","path","YAML","path","item","fs","path","import_commander","item","getItemId","getItemType","import_commander","import_commander","import_commander","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","fs","path","readFile","writeFile","stat","readdir","access","ProjectContextManager","ConfigManager","displayEpic","getItemType","fs","import_commander","import_commander","fs","path","fs","path","import_commander","getItemId","resolve","fs","import_commander","YAML","truncateText","printTableRow","printSeparator","import_commander","YAML","getStatusDisplay","getPriorityDisplay","getItemId","import_commander","getStatusDisplay","getPriorityDisplay","import_commander","import_commander","import_node_fs","import_node_path","_ConfigManager","ConfigManager","path","YAML","import_node_fs","import_node_path","ConfigManager","ora","inquirer","import_node_fs","import_node_path","import_commander","import_commander","import_commander","fs","path","ora","resolve","inquirer","answers","fs","path","import_commander","import_inquirer","import_ora","import_commander","import_commander","import_commander","init_complete","fs","path","import_commander","init_create","getItemId","resolve","fs","import_commander","init_delete","YAML","getStatusDisplay","getPriorityDisplay","formatDate","import_commander","init_list","chalk","import_chalk","chalk","import_chalk","import_commander","YAML","getStatusDisplay","getPriorityDisplay","formatDateTime","getStatusIcon","getItemId","import_commander","init_show","getStatusDisplay","getStateDisplay","getPriorityDisplay","import_commander","init_update","import_commander","init_complete","init_create","init_delete","init_list","init_show","init_update","chalk","fs","path","import_chalk","import_commander","import_ora","YAML","ora","stat","fs","path","import_commander","getStateDisplay","getItemType","import_commander","getItemId","getItemType","getStatusDisplay","getStateDisplay","findItem","import_commander","getItemId","findItem","import_commander","stat","getStatusIcon","fs","path","import_commander","fs","path","import_commander","fs","path","fs","path","fs","path","import_commander","fs","path","import_commander","init_close","_a","fs","path","import_commander","fs","path","import_commander","init_close","fs","path","import_commander","init_create","path","fs","import_commander","getPriorityColor","formatDate","import_commander","init_list","handleStatusTransition","fs","path","import_commander","getPRStatusColor","getPriorityColor","formatDate","_a","import_commander","init_show","fs","path","import_commander","handleStatusTransition","fs","path","import_commander","init_update","import_commander","init_close","init_create","init_list","init_show","init_update","import_node_fs","import_node_path","path","fs","import_node_child_process","import_node_fs","import_node_path","path","fs","stat","files","import_commander","init_create","import_commander","init_list","import_node_fs","import_commander","init_show","fs","import_commander","import_commander","init_create","init_list","init_show","runWatchMode","ora","applyAdvancedFilters","inquirer","validateTags","getStatusIcon","getPriorityColor","import_node_fs","import_node_path","import_commander","import_inquirer","import_ora","displayCompactView","displayGroupedView","getItemType","getTypeEmoji","getStatusEmoji","getPriorityColor","import_commander","import_commander","resolve","fs","path","ora","_a","import_commander","import_ora","ora","_a","import_commander","import_ora","ora","import_commander","import_ora","inquirer","import_commander","import_inquirer","ora","import_commander","import_ora","init_status","import_commander","init_sync","init_status","import_commander","init_complete","fs","path","import_commander","init_create","import_commander","init_delete","YAML","truncateText","getStatusDisplay","getPriorityDisplay","formatDate","printTableRow","printSeparator","import_commander","init_list","import_commander","init_show","import_commander","init_update","import_commander","init_complete","init_create","init_delete","init_list","init_show","init_update","ConfigManager","ora","inquirer","import_node_fs","import_node_path","import_commander","import_inquirer","import_ora","import_node_fs","import_node_path","import_node_url","path","fs","semver","import_node_child_process","import_node_fs","import_node_path","path","fs","semver","newVersion","import_commander","import_commander","init_changelog","semver","execSync","import_commander","import_commander","init_show","createSyncCommand","import_commander","init_sync","import_node_child_process","import_commander","createSyncCommand","import_commander","init_version","init_changelog","init_show","init_sync","chalk","import_chalk","import_commander","init_sync","init_version","main"]}