raggrep 0.5.2 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -5,7 +5,7 @@
5
5
  "/**\n * SearchResult Entity\n *\n * Represents a single result from a search query.\n */\n\nimport type { Chunk } from \"./chunk\";\n\n/**\n * Contribution from the core index.\n */\nexport interface CoreContribution {\n /** Symbol name match score (0-1) */\n symbolMatch: number;\n /** BM25 keyword match score (0-1) */\n keywordMatch: number;\n}\n\n/**\n * Contribution from a language-specific index.\n */\nexport interface LanguageContribution {\n /** Semantic embedding similarity (0-1) */\n semanticMatch: number;\n /** BM25 keyword match score (0-1) */\n keywordMatch: number;\n}\n\n/**\n * Contribution from introspection boosting.\n */\nexport interface IntrospectionContribution {\n /** Boost from domain match */\n domainBoost: number;\n /** Boost from layer match */\n layerBoost: number;\n /** Boost from scope match */\n scopeBoost: number;\n /** Boost from path segment match */\n pathBoost: number;\n}\n\n/**\n * Tracks which indexes contributed to a search result's score.\n * Used for learning and tuning.\n */\nexport interface SearchContributions {\n /** Core index contribution */\n core?: CoreContribution;\n /** Language-specific index contribution (keyed by module ID) */\n language?: Record<string, LanguageContribution>;\n /** Introspection boost contribution */\n introspection?: IntrospectionContribution;\n}\n\n/**\n * A search result with relevance score and source information.\n */\nexport interface SearchResult {\n /** Path to the file containing the result */\n filepath: string;\n\n /** The matching chunk */\n chunk: Chunk;\n\n /** Final relevance score (0-1, higher is better) */\n score: number;\n\n /** ID of the module that produced this result */\n moduleId: string;\n\n /** Contribution tracking for learning */\n contributions?: SearchContributions;\n\n /** Additional context from the search (e.g., semantic vs keyword scores) */\n context?: Record<string, unknown>;\n}\n\n/**\n * Options for search operations.\n */\nexport interface SearchOptions {\n /** Maximum number of results to return (default: 10) */\n topK?: number;\n\n /** Minimum similarity score threshold 0-1 (default: 0.15) */\n minScore?: number;\n\n /** Filter to specific file patterns (e.g., ['*.ts', '*.tsx']) */\n filePatterns?: string[];\n\n /**\n * Filter to files within specified paths (e.g., ['src/auth', 'src/utils']).\n * Results will only include files that start with one of the specified paths.\n */\n pathFilter?: string[];\n\n /**\n * Ensure the index is fresh before searching (default: true).\n *\n * When true, the search will automatically:\n * - Create the index if it doesn't exist\n * - Re-index any modified files\n * - Remove entries for deleted files\n *\n * Set to false if you've already ensured freshness or want explicit control.\n */\n ensureFresh?: boolean;\n}\n\n/**\n * Default search options.\n */\nexport const DEFAULT_SEARCH_OPTIONS: Required<SearchOptions> = {\n topK: 10,\n minScore: 0.15,\n filePatterns: [],\n pathFilter: [],\n ensureFresh: true,\n};\n",
6
6
  "/**\n * Config Entity\n *\n * Configuration for RAGgrep indexing and search operations.\n */\n\n/**\n * Configuration for a specific index module.\n */\nexport interface ModuleConfig {\n /** Unique module identifier */\n id: string;\n\n /** Whether the module is enabled */\n enabled: boolean;\n\n /** Module-specific options */\n options?: Record<string, unknown>;\n}\n\n/**\n * Main RAGgrep configuration.\n */\nexport interface Config {\n /** RAGgrep version */\n version: string;\n\n /** Directory name for index storage (default: '.raggrep') */\n indexDir: string;\n\n /** File extensions to index (e.g., ['.ts', '.tsx', '.js']) */\n extensions: string[];\n\n /** Paths to ignore during indexing */\n ignorePaths: string[];\n\n /** Enabled modules and their configurations */\n modules: ModuleConfig[];\n}\n\n/**\n * Default paths to ignore during indexing.\n */\nexport const DEFAULT_IGNORE_PATHS = [\n // Package managers & dependencies\n \"node_modules\",\n \".pnpm-store\",\n \".yarn\",\n \"vendor\",\n\n // Version control\n \".git\",\n\n // Build outputs\n \"dist\",\n \"build\",\n \"out\",\n \".output\",\n \"target\",\n\n // Framework-specific build outputs\n \".next\",\n \".nuxt\",\n \".svelte-kit\",\n \".vercel\",\n \".netlify\",\n\n // Caches\n \".cache\",\n \".turbo\",\n \".parcel-cache\",\n \".eslintcache\",\n\n // Test & coverage\n \"coverage\",\n \".nyc_output\",\n\n // Python\n \"__pycache__\",\n \".venv\",\n \"venv\",\n \".pytest_cache\",\n \"*.egg-info\",\n\n // IDE & editor\n \".idea\",\n\n // RAGgrep index\n \".raggrep\",\n];\n\n/**\n * Default file extensions to index.\n *\n * Note: Each module filters for its own supported extensions.\n * - language/typescript: .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts\n * - data/json: .json\n * - docs/markdown: .md\n * - core: all remaining extensions\n */\nexport const DEFAULT_EXTENSIONS = [\n // TypeScript/JavaScript (language/typescript module)\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n // JSON (data/json module)\n \".json\",\n // Markdown (docs/markdown module)\n \".md\",\n // Other languages (core module)\n \".py\",\n \".go\",\n \".rs\",\n \".java\",\n // Config & data (core module)\n \".yaml\",\n \".yml\",\n \".toml\",\n // Database (core module)\n \".sql\",\n // Other documentation (core module)\n \".txt\",\n];\n\n/**\n * Create a default configuration.\n */\nexport function createDefaultConfig(): Config {\n return {\n version: \"0.1.0\",\n indexDir: \".raggrep\",\n extensions: DEFAULT_EXTENSIONS,\n ignorePaths: DEFAULT_IGNORE_PATHS,\n modules: [\n {\n id: \"core\",\n enabled: true,\n options: {},\n },\n {\n id: \"language/typescript\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n {\n id: \"data/json\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n {\n id: \"docs/markdown\",\n enabled: true,\n options: {\n embeddingModel: \"all-MiniLM-L6-v2\",\n },\n },\n ],\n };\n}\n",
7
7
  "/**\n * Domain Entities\n *\n * Core business objects with no external dependencies.\n * These represent the fundamental concepts in the RAGgrep domain.\n */\n\n// Chunk - The fundamental unit of indexing\nexport type { Chunk, ChunkType } from \"./chunk\";\nexport { createChunkId } from \"./chunk\";\n\n// FileIndex - Tier 2 full index data\nexport type {\n FileIndex,\n FileManifestEntry,\n ModuleManifest,\n GlobalManifest,\n} from \"./fileIndex\";\n\n// FileSummary - Symbolic index (lightweight summaries)\nexport type {\n FileSummary,\n SymbolicIndexMeta,\n Tier1Manifest,\n} from \"./fileSummary\";\n\n// SearchResult - Query results\nexport type {\n SearchResult,\n SearchOptions,\n SearchContributions,\n CoreContribution,\n LanguageContribution,\n IntrospectionContribution,\n} from \"./searchResult\";\nexport { DEFAULT_SEARCH_OPTIONS } from \"./searchResult\";\n\n// Config - Application configuration\nexport type { Config, ModuleConfig } from \"./config\";\nexport {\n DEFAULT_IGNORE_PATHS,\n DEFAULT_EXTENSIONS,\n createDefaultConfig,\n} from \"./config\";\n\n// Introspection - File metadata for context-aware search\nexport type {\n FileIntrospection,\n ProjectStructure,\n Project,\n ProjectType,\n Scope,\n IntrospectionConfig,\n} from \"./introspection\";\n\n// Conventions - File pattern recognition\nexport type {\n FileConvention,\n ConventionCategory,\n FrameworkConventions,\n ConventionMatch,\n} from \"./conventions\";\n",
8
- "/**\n * Configuration Loader\n *\n * Infrastructure adapter for loading and saving RAGgrep configuration.\n * Handles file I/O operations for configuration management.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport * as os from \"os\";\nimport * as crypto from \"crypto\";\nimport type { Config, ModuleConfig } from \"../../domain/entities\";\nimport { createDefaultConfig } from \"../../domain/entities\";\nimport type { EmbeddingConfig, EmbeddingModelName } from \"../../domain/ports\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default configuration instance */\nexport const DEFAULT_CONFIG: Config = createDefaultConfig();\n\n/** Base directory for raggrep temp indexes */\nconst RAGGREP_TEMP_BASE = path.join(os.tmpdir(), \"raggrep-indexes\");\n\n/** Available embedding models (for validation) */\nexport const EMBEDDING_MODELS: Record<EmbeddingModelName, string> = {\n \"all-MiniLM-L6-v2\": \"Xenova/all-MiniLM-L6-v2\",\n \"all-MiniLM-L12-v2\": \"Xenova/all-MiniLM-L12-v2\",\n \"bge-small-en-v1.5\": \"Xenova/bge-small-en-v1.5\",\n \"paraphrase-MiniLM-L3-v2\": \"Xenova/paraphrase-MiniLM-L3-v2\",\n};\n\n// ============================================================================\n// Path Utilities (pure functions)\n// ============================================================================\n\n/**\n * Generate a short hash of a string for use in directory names.\n * Uses first 12 characters of SHA256 hash.\n */\nfunction hashPath(inputPath: string): string {\n return crypto\n .createHash(\"sha256\")\n .update(inputPath)\n .digest(\"hex\")\n .slice(0, 12);\n}\n\n/**\n * Get the index storage directory path.\n *\n * Index data is stored in a system temp directory to avoid cluttering\n * the user's project with index files. The temp path is derived from\n * a hash of the project's absolute path to ensure uniqueness.\n *\n * Structure: {tmpdir}/raggrep-indexes/{hash}/\n *\n * @param rootDir - Absolute path to the project root\n * @returns Absolute path to the index storage directory\n */\nexport function getRaggrepDir(\n rootDir: string,\n _config: Config = DEFAULT_CONFIG\n): string {\n // Ensure we have an absolute path\n const absoluteRoot = path.resolve(rootDir);\n\n // Generate a unique hash for this project\n const projectHash = hashPath(absoluteRoot);\n\n // Return the temp directory path\n return path.join(RAGGREP_TEMP_BASE, projectHash);\n}\n\n/**\n * Get the index storage path and also return useful metadata.\n * Helpful for debugging and user feedback.\n */\nexport function getIndexLocation(rootDir: string): {\n indexDir: string;\n projectRoot: string;\n projectHash: string;\n} {\n const absoluteRoot = path.resolve(rootDir);\n const projectHash = hashPath(absoluteRoot);\n\n return {\n indexDir: path.join(RAGGREP_TEMP_BASE, projectHash),\n projectRoot: absoluteRoot,\n projectHash,\n };\n}\n\n/**\n * Get the index data directory for a specific module\n */\nexport function getModuleIndexPath(\n rootDir: string,\n moduleId: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"index\", moduleId);\n}\n\n/**\n * Get the manifest path for a specific module\n */\nexport function getModuleManifestPath(\n rootDir: string,\n moduleId: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"index\", moduleId, \"manifest.json\");\n}\n\n/**\n * Get the global manifest path\n */\nexport function getGlobalManifestPath(\n rootDir: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"manifest.json\");\n}\n\n/**\n * Get the config file path.\n * Note: Config is still stored in the temp index directory, not the project.\n */\nexport function getConfigPath(\n rootDir: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"config.json\");\n}\n\n// ============================================================================\n// Config I/O (infrastructure)\n// ============================================================================\n\n/**\n * Load config from file or return default\n */\nexport async function loadConfig(rootDir: string): Promise<Config> {\n const configPath = getConfigPath(rootDir, DEFAULT_CONFIG);\n\n try {\n const content = await fs.readFile(configPath, \"utf-8\");\n const savedConfig = JSON.parse(content) as Partial<Config>;\n return { ...DEFAULT_CONFIG, ...savedConfig };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\n/**\n * Save config to file\n */\nexport async function saveConfig(\n rootDir: string,\n config: Config\n): Promise<void> {\n const configPath = getConfigPath(rootDir, config);\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(config, null, 2));\n}\n\n// ============================================================================\n// Config Utilities (pure functions)\n// ============================================================================\n\n/**\n * Get module config by ID\n */\nexport function getModuleConfig(\n config: Config,\n moduleId: string\n): ModuleConfig | undefined {\n return config.modules.find((m) => m.id === moduleId);\n}\n\n/**\n * Extract embedding config from module options\n */\nexport function getEmbeddingConfigFromModule(\n moduleConfig: ModuleConfig\n): EmbeddingConfig {\n const options = moduleConfig.options || {};\n const modelName = (options.embeddingModel as string) || \"all-MiniLM-L6-v2\";\n\n // Validate model name\n if (!(modelName in EMBEDDING_MODELS)) {\n console.warn(\n `Unknown embedding model: ${modelName}, falling back to all-MiniLM-L6-v2`\n );\n return { model: \"all-MiniLM-L6-v2\" };\n }\n\n return {\n model: modelName as EmbeddingModelName,\n // Default to NO progress logs unless explicitly enabled\n showProgress: options.showProgress === true,\n };\n}\n",
8
+ "/**\n * Configuration Loader\n *\n * Infrastructure adapter for loading and saving RAGgrep configuration.\n * Handles file I/O operations for configuration management.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport * as os from \"os\";\nimport * as crypto from \"crypto\";\nimport type { Config, ModuleConfig } from \"../../domain/entities\";\nimport { createDefaultConfig } from \"../../domain/entities\";\nimport type { EmbeddingConfig, EmbeddingModelName } from \"../../domain/ports\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default configuration instance */\nexport const DEFAULT_CONFIG: Config = createDefaultConfig();\n\n/** Base directory for raggrep temp indexes */\nconst RAGGREP_TEMP_BASE = path.join(os.tmpdir(), \"raggrep-indexes\");\n\n/** Available embedding models (for validation) */\nexport const EMBEDDING_MODELS: Record<EmbeddingModelName, string> = {\n \"all-MiniLM-L6-v2\": \"Xenova/all-MiniLM-L6-v2\",\n \"all-MiniLM-L12-v2\": \"Xenova/all-MiniLM-L12-v2\",\n \"bge-small-en-v1.5\": \"Xenova/bge-small-en-v1.5\",\n \"paraphrase-MiniLM-L3-v2\": \"Xenova/paraphrase-MiniLM-L3-v2\",\n \"nomic-embed-text-v1.5\": \"nomic-ai/nomic-embed-text-v1.5\",\n};\n\n// ============================================================================\n// Path Utilities (pure functions)\n// ============================================================================\n\n/**\n * Generate a short hash of a string for use in directory names.\n * Uses first 12 characters of SHA256 hash.\n */\nfunction hashPath(inputPath: string): string {\n return crypto\n .createHash(\"sha256\")\n .update(inputPath)\n .digest(\"hex\")\n .slice(0, 12);\n}\n\n/**\n * Get the index storage directory path.\n *\n * Index data is stored in a system temp directory to avoid cluttering\n * the user's project with index files. The temp path is derived from\n * a hash of the project's absolute path to ensure uniqueness.\n *\n * Structure: {tmpdir}/raggrep-indexes/{hash}/\n *\n * @param rootDir - Absolute path to the project root\n * @returns Absolute path to the index storage directory\n */\nexport function getRaggrepDir(\n rootDir: string,\n _config: Config = DEFAULT_CONFIG\n): string {\n // Ensure we have an absolute path\n const absoluteRoot = path.resolve(rootDir);\n\n // Generate a unique hash for this project\n const projectHash = hashPath(absoluteRoot);\n\n // Return the temp directory path\n return path.join(RAGGREP_TEMP_BASE, projectHash);\n}\n\n/**\n * Get the index storage path and also return useful metadata.\n * Helpful for debugging and user feedback.\n */\nexport function getIndexLocation(rootDir: string): {\n indexDir: string;\n projectRoot: string;\n projectHash: string;\n} {\n const absoluteRoot = path.resolve(rootDir);\n const projectHash = hashPath(absoluteRoot);\n\n return {\n indexDir: path.join(RAGGREP_TEMP_BASE, projectHash),\n projectRoot: absoluteRoot,\n projectHash,\n };\n}\n\n/**\n * Get the index data directory for a specific module\n */\nexport function getModuleIndexPath(\n rootDir: string,\n moduleId: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"index\", moduleId);\n}\n\n/**\n * Get the manifest path for a specific module\n */\nexport function getModuleManifestPath(\n rootDir: string,\n moduleId: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"index\", moduleId, \"manifest.json\");\n}\n\n/**\n * Get the global manifest path\n */\nexport function getGlobalManifestPath(\n rootDir: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"manifest.json\");\n}\n\n/**\n * Get the config file path.\n * Note: Config is still stored in the temp index directory, not the project.\n */\nexport function getConfigPath(\n rootDir: string,\n config: Config = DEFAULT_CONFIG\n): string {\n const indexDir = getRaggrepDir(rootDir, config);\n return path.join(indexDir, \"config.json\");\n}\n\n// ============================================================================\n// Config I/O (infrastructure)\n// ============================================================================\n\n/**\n * Load config from file or return default\n */\nexport async function loadConfig(rootDir: string): Promise<Config> {\n const configPath = getConfigPath(rootDir, DEFAULT_CONFIG);\n\n try {\n const content = await fs.readFile(configPath, \"utf-8\");\n const savedConfig = JSON.parse(content) as Partial<Config>;\n return { ...DEFAULT_CONFIG, ...savedConfig };\n } catch {\n return DEFAULT_CONFIG;\n }\n}\n\n/**\n * Save config to file\n */\nexport async function saveConfig(\n rootDir: string,\n config: Config\n): Promise<void> {\n const configPath = getConfigPath(rootDir, config);\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(config, null, 2));\n}\n\n// ============================================================================\n// Config Utilities (pure functions)\n// ============================================================================\n\n/**\n * Get module config by ID\n */\nexport function getModuleConfig(\n config: Config,\n moduleId: string\n): ModuleConfig | undefined {\n return config.modules.find((m) => m.id === moduleId);\n}\n\n/**\n * Extract embedding config from module options\n */\nexport function getEmbeddingConfigFromModule(\n moduleConfig: ModuleConfig\n): EmbeddingConfig {\n const options = moduleConfig.options || {};\n const modelName = (options.embeddingModel as string) || \"bge-small-en-v1.5\";\n\n // Validate model name\n if (!(modelName in EMBEDDING_MODELS)) {\n console.warn(\n `Unknown embedding model: ${modelName}, falling back to bge-small-en-v1.5`\n );\n return { model: \"bge-small-en-v1.5\" };\n }\n\n return {\n model: modelName as EmbeddingModelName,\n // Default to NO progress logs unless explicitly enabled\n showProgress: options.showProgress === true,\n };\n}\n",
9
9
  "/**\n * Configuration Infrastructure\n *\n * Handles loading and saving RAGgrep configuration from the filesystem.\n */\n\nexport {\n // Constants\n DEFAULT_CONFIG,\n EMBEDDING_MODELS,\n // Path utilities\n getRaggrepDir,\n getIndexLocation,\n getModuleIndexPath,\n getModuleManifestPath,\n getGlobalManifestPath,\n getConfigPath,\n // I/O operations\n loadConfig,\n saveConfig,\n // Config utilities\n getModuleConfig,\n getEmbeddingConfigFromModule,\n} from \"./configLoader\";\n\n",
10
10
  "/**\n * BM25 (Best Matching 25) Implementation\n * \n * A ranking function for keyword-based search. This is a pure domain service\n * with no external dependencies - just algorithms operating on data.\n * \n * BM25 estimates relevance of documents to a search query using term frequency\n * and inverse document frequency with length normalization.\n */\n\n/**\n * BM25 parameters\n * - k1: Term frequency saturation (typical: 1.2-2.0)\n * - b: Length normalization (typical: 0.75)\n */\nconst BM25_K1 = 1.5;\nconst BM25_B = 0.75;\n\n/**\n * Tokenize text into normalized terms.\n * \n * @param text - Text to tokenize\n * @returns Array of lowercase tokens\n */\nexport function tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .split(/\\s+/)\n .filter(token => token.length > 1);\n}\n\n/**\n * Calculate term frequency (TF) for a term in a document.\n */\nfunction termFrequency(term: string, tokens: string[]): number {\n return tokens.filter(t => t === term).length;\n}\n\n/**\n * Document data for BM25 scoring.\n */\nexport interface BM25Document {\n id: string;\n content: string;\n /** Pre-computed tokens (optional, computed from content if not provided) */\n tokens?: string[];\n}\n\n/**\n * BM25 search result.\n */\nexport interface BM25Result {\n id: string;\n score: number;\n}\n\n/**\n * BM25 search index.\n * \n * This is a pure in-memory data structure with no I/O operations.\n * Build the index by adding documents, then search against it.\n */\nexport class BM25Index {\n private documents: Map<string, { content: string; tokens: string[] }> = new Map();\n private avgDocLength: number = 0;\n private documentFrequencies: Map<string, number> = new Map();\n private totalDocs: number = 0;\n\n /**\n * Add documents to the index.\n * \n * @param documents - Array of documents to index\n */\n addDocuments(documents: BM25Document[]): void {\n let totalLength = this.avgDocLength * this.totalDocs;\n\n for (const doc of documents) {\n const tokens = doc.tokens ?? tokenize(doc.content);\n this.documents.set(doc.id, { content: doc.content, tokens });\n totalLength += tokens.length;\n this.totalDocs++;\n\n // Update document frequencies\n const uniqueTerms = new Set(tokens);\n for (const term of uniqueTerms) {\n const count = this.documentFrequencies.get(term) || 0;\n this.documentFrequencies.set(term, count + 1);\n }\n }\n\n this.avgDocLength = this.totalDocs > 0 ? totalLength / this.totalDocs : 0;\n }\n\n /**\n * Calculate IDF (Inverse Document Frequency) for a term.\n */\n private idf(term: string): number {\n const docFreq = this.documentFrequencies.get(term) || 0;\n if (docFreq === 0) return 0;\n \n // Standard IDF formula with smoothing\n return Math.log(1 + (this.totalDocs - docFreq + 0.5) / (docFreq + 0.5));\n }\n\n /**\n * Calculate BM25 score for a document given query terms.\n */\n private score(tokens: string[], queryTerms: string[]): number {\n const docLength = tokens.length;\n let score = 0;\n\n for (const term of queryTerms) {\n const tf = termFrequency(term, tokens);\n if (tf === 0) continue;\n\n const idfScore = this.idf(term);\n \n // BM25 formula\n const numerator = tf * (BM25_K1 + 1);\n const denominator = tf + BM25_K1 * (1 - BM25_B + BM25_B * (docLength / this.avgDocLength));\n \n score += idfScore * (numerator / denominator);\n }\n\n return score;\n }\n\n /**\n * Search the index with a query.\n * \n * @param query - Search query\n * @param topK - Maximum number of results to return\n * @returns Sorted array of results (highest score first)\n */\n search(query: string, topK: number = 10): BM25Result[] {\n const queryTerms = tokenize(query);\n if (queryTerms.length === 0) return [];\n\n const results: BM25Result[] = [];\n\n for (const [id, { tokens }] of this.documents) {\n const score = this.score(tokens, queryTerms);\n if (score > 0) {\n results.push({ id, score });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n\n /**\n * Get the number of indexed documents.\n */\n get size(): number {\n return this.totalDocs;\n }\n\n /**\n * Clear the index.\n */\n clear(): void {\n this.documents.clear();\n this.documentFrequencies.clear();\n this.avgDocLength = 0;\n this.totalDocs = 0;\n }\n\n /**\n * Add a single document by ID and pre-computed tokens.\n *\n * @param id - Document identifier\n * @param tokens - Pre-computed tokens\n */\n addDocument(id: string, tokens: string[]): void {\n this.addDocuments([{ id, content: \"\", tokens }]);\n }\n\n /**\n * Serialize the index to a JSON-compatible object.\n */\n serialize(): BM25SerializedData {\n const documents: Record<string, string[]> = {};\n for (const [id, { tokens }] of this.documents) {\n documents[id] = tokens;\n }\n\n return {\n documents,\n avgDocLength: this.avgDocLength,\n documentFrequencies: Object.fromEntries(this.documentFrequencies),\n totalDocs: this.totalDocs,\n };\n }\n\n /**\n * Deserialize a BM25 index from saved data.\n */\n static deserialize(data: BM25SerializedData): BM25Index {\n const index = new BM25Index();\n index.avgDocLength = data.avgDocLength;\n index.totalDocs = data.totalDocs;\n index.documentFrequencies = new Map(Object.entries(data.documentFrequencies));\n\n for (const [id, tokens] of Object.entries(data.documents)) {\n index.documents.set(id, { content: \"\", tokens });\n }\n\n return index;\n }\n}\n\n/**\n * Serialized BM25 index data.\n */\nexport interface BM25SerializedData {\n documents: Record<string, string[]>;\n avgDocLength: number;\n documentFrequencies: Record<string, number>;\n totalDocs: number;\n}\n\n/**\n * Normalize a raw score to 0-1 range using sigmoid function.\n * \n * @param score - Raw score\n * @param midpoint - Score at which output is 0.5\n * @returns Normalized score between 0 and 1\n */\nexport function normalizeScore(score: number, midpoint: number = 5): number {\n return 1 / (1 + Math.exp(-score / midpoint + 1));\n}\n\n",
11
11
  "/**\n * Entry Point Conventions\n *\n * Patterns for recognizing module entry points and barrel files.\n */\n\nimport * as path from \"path\";\nimport type { FileConvention } from \"../../entities/conventions\";\n\n/**\n * Get the parent folder name from a filepath.\n */\nfunction getParentFolder(filepath: string): string {\n const dir = path.dirname(filepath);\n return path.basename(dir);\n}\n\n/**\n * Entry point conventions for JavaScript/TypeScript projects.\n */\nexport const entryPointConventions: FileConvention[] = [\n {\n id: \"index-file\",\n name: \"Index/Barrel File\",\n description:\n \"Module entry point that typically re-exports from other files\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return /^index\\.(ts|tsx|js|jsx|mjs|cjs)$/.test(filename);\n },\n keywords: [\"entry\", \"barrel\", \"exports\", \"module\"],\n // Add parent folder as a strong keyword since \"auth/index.ts\" should match \"auth\"\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n // Don't add generic folder names\n if ([\"src\", \"lib\", \"dist\", \"build\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n\n {\n id: \"main-file\",\n name: \"Main Entry Point\",\n description: \"Application main entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return /^main\\.(ts|tsx|js|jsx|mjs|cjs)$/.test(filename);\n },\n keywords: [\"entry\", \"main\", \"entrypoint\", \"bootstrap\", \"startup\"],\n },\n\n {\n id: \"app-component\",\n name: \"Root App Component\",\n description: \"Root application component (React, Vue, etc.)\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return /^App\\.(tsx|jsx|vue|svelte)$/.test(filename);\n },\n keywords: [\"root\", \"app\", \"application\", \"component\", \"main\"],\n },\n\n {\n id: \"deno-mod\",\n name: \"Deno Module Entry\",\n description: \"Deno module entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"mod.ts\";\n },\n keywords: [\"entry\", \"module\", \"deno\", \"exports\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n if ([\"src\", \"lib\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n\n {\n id: \"python-init\",\n name: \"Python Package Init\",\n description: \"Python package initialization file\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"__init__.py\";\n },\n keywords: [\"entry\", \"package\", \"init\", \"python\", \"module\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n if ([\"src\", \"lib\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n\n {\n id: \"rust-lib\",\n name: \"Rust Library Entry\",\n description: \"Rust library crate entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"lib.rs\" || filename === \"main.rs\";\n },\n keywords: [\"entry\", \"crate\", \"rust\", \"module\"],\n },\n\n // ============================================================================\n // Go Entry Points\n // ============================================================================\n {\n id: \"go-main\",\n name: \"Go Main Entry\",\n description: \"Go application main entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"main.go\";\n },\n keywords: [\"entry\", \"main\", \"go\", \"golang\", \"entrypoint\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n // cmd/myapp/main.go -> \"myapp\"\n if (parent && ![\"cmd\", \"src\", \".\", \"\"].includes(parent)) {\n return [parent.toLowerCase()];\n }\n return [];\n },\n },\n\n // ============================================================================\n // Python Entry Points\n // ============================================================================\n {\n id: \"python-main\",\n name: \"Python Main Module\",\n description: \"Python package main entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"__main__.py\";\n },\n keywords: [\"entry\", \"main\", \"python\", \"entrypoint\", \"cli\"],\n dynamicKeywords: (filepath) => {\n const parent = getParentFolder(filepath);\n if ([\"src\", \"lib\", \".\", \"\"].includes(parent)) {\n return [];\n }\n return [parent.toLowerCase()];\n },\n },\n {\n id: \"python-app\",\n name: \"Python App Entry\",\n description: \"Common Python application entry points\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return (\n filename === \"app.py\" || filename === \"main.py\" || filename === \"run.py\"\n );\n },\n keywords: [\"entry\", \"main\", \"python\", \"app\", \"entrypoint\"],\n },\n {\n id: \"python-manage\",\n name: \"Django Manage\",\n description: \"Django management script\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"manage.py\";\n },\n keywords: [\"entry\", \"django\", \"python\", \"manage\", \"cli\", \"admin\"],\n },\n {\n id: \"python-wsgi\",\n name: \"Python WSGI Entry\",\n description: \"Python WSGI application entry point\",\n category: \"entry-point\",\n match: (filepath, filename) => {\n return filename === \"wsgi.py\" || filename === \"asgi.py\";\n },\n keywords: [\"entry\", \"wsgi\", \"asgi\", \"python\", \"server\", \"web\"],\n },\n];\n",
@@ -17,8 +17,8 @@
17
17
  "/**\n * Introspection Service\n *\n * Pure functions for extracting file metadata from paths and content.\n * No I/O operations - all functions operate on provided data.\n */\n\nimport * as path from \"path\";\nimport type {\n FileIntrospection,\n Project,\n ProjectStructure,\n Scope,\n ProjectType,\n} from \"../entities/introspection\";\nimport { getConventionKeywords } from \"./conventions\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Layer detection patterns.\n */\nconst LAYER_PATTERNS: Record<string, string[]> = {\n controller: [\"controller\", \"api\", \"routes\", \"route\", \"handler\"],\n service: [\"service\", \"logic\", \"usecase\", \"usecases\", \"handler\"],\n repository: [\"repository\", \"repo\", \"dao\", \"store\", \"persistence\"],\n model: [\n \"model\",\n \"models\",\n \"entity\",\n \"entities\",\n \"schema\",\n \"schemas\",\n \"types\",\n \"type\",\n ],\n util: [\"util\", \"utils\", \"helper\", \"helpers\", \"common\", \"lib\"],\n config: [\"config\", \"configuration\", \"settings\"],\n middleware: [\"middleware\", \"middlewares\"],\n domain: [\"domain\"],\n infrastructure: [\"infrastructure\", \"infra\"],\n application: [\"application\", \"app\"],\n presentation: [\n \"presentation\",\n \"ui\",\n \"views\",\n \"view\",\n \"component\",\n \"components\",\n ],\n test: [\"test\", \"tests\", \"spec\", \"specs\", \"__tests__\", \"e2e\"],\n};\n\n/**\n * Domain detection patterns (feature areas).\n */\nconst DOMAIN_PATTERNS = [\n \"auth\",\n \"authentication\",\n \"user\",\n \"users\",\n \"account\",\n \"accounts\",\n \"profile\",\n \"profiles\",\n \"product\",\n \"products\",\n \"item\",\n \"items\",\n \"catalog\",\n \"order\",\n \"orders\",\n \"cart\",\n \"checkout\",\n \"payment\",\n \"payments\",\n \"billing\",\n \"subscription\",\n \"subscriptions\",\n \"notification\",\n \"notifications\",\n \"email\",\n \"sms\",\n \"report\",\n \"reports\",\n \"analytics\",\n \"metrics\",\n \"dashboard\",\n \"admin\",\n \"settings\",\n \"search\",\n \"chat\",\n \"message\",\n \"messages\",\n \"feed\",\n \"post\",\n \"posts\",\n \"comment\",\n \"comments\",\n \"media\",\n \"upload\",\n \"file\",\n \"files\",\n \"storage\",\n \"cache\",\n \"session\",\n \"log\",\n \"logs\",\n \"audit\",\n];\n\n/**\n * Framework detection from imports.\n */\nconst FRAMEWORK_INDICATORS: Record<string, string[]> = {\n nextjs: [\"next\", \"next/\"],\n express: [\"express\"],\n fastify: [\"fastify\"],\n react: [\"react\"],\n vue: [\"vue\"],\n angular: [\"@angular/\"],\n nestjs: [\"@nestjs/\"],\n koa: [\"koa\"],\n};\n\n/**\n * Language detection from file extension.\n */\nconst EXTENSION_TO_LANGUAGE: Record<string, string> = {\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascript\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".py\": \"python\",\n \".go\": \"go\",\n \".rs\": \"rust\",\n \".java\": \"java\",\n \".kt\": \"kotlin\",\n \".swift\": \"swift\",\n \".rb\": \"ruby\",\n \".php\": \"php\",\n \".cs\": \"csharp\",\n \".cpp\": \"cpp\",\n \".c\": \"c\",\n \".h\": \"c\",\n \".hpp\": \"cpp\",\n \".md\": \"markdown\",\n \".json\": \"json\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n \".txt\": \"text\",\n};\n\n/**\n * Keywords for detecting scope from project name or path.\n */\nconst SCOPE_KEYWORDS: Record<Scope, string[]> = {\n frontend: [\n \"web\",\n \"webapp\",\n \"frontend\",\n \"client\",\n \"ui\",\n \"app\",\n \"mobile\",\n \"react\",\n \"vue\",\n \"angular\",\n \"next\",\n \"nuxt\",\n ],\n backend: [\n \"api\",\n \"server\",\n \"backend\",\n \"service\",\n \"worker\",\n \"lambda\",\n \"functions\",\n ],\n shared: [\"shared\", \"common\", \"utils\", \"lib\", \"core\", \"types\", \"models\"],\n tooling: [\"scripts\", \"tools\", \"cli\", \"devtools\", \"build\", \"config\", \"infra\"],\n unknown: [],\n};\n\n/**\n * Patterns for detecting project directories.\n */\nconst PROJECT_PATTERNS: Array<{\n pattern: RegExp;\n type: ProjectType;\n defaultScope: Scope;\n}> = [\n { pattern: /^apps\\/([^/]+)/, type: \"app\", defaultScope: \"unknown\" },\n { pattern: /^packages\\/([^/]+)/, type: \"library\", defaultScope: \"shared\" },\n { pattern: /^libs\\/([^/]+)/, type: \"library\", defaultScope: \"shared\" },\n { pattern: /^services\\/([^/]+)/, type: \"service\", defaultScope: \"backend\" },\n { pattern: /^scripts\\/([^/]+)/, type: \"script\", defaultScope: \"tooling\" },\n { pattern: /^tools\\/([^/]+)/, type: \"script\", defaultScope: \"tooling\" },\n];\n\n// ============================================================================\n// Public Functions\n// ============================================================================\n\n/**\n * Extract introspection metadata for a file.\n *\n * @param filepath - Relative file path\n * @param structure - Project structure (from detectProjectStructure)\n * @param fileContent - Optional file content for framework detection\n */\nexport function introspectFile(\n filepath: string,\n structure: ProjectStructure,\n fileContent?: string\n): FileIntrospection {\n const normalizedPath = filepath.replace(/\\\\/g, \"/\");\n const segments = normalizedPath.split(\"/\").filter((s) => s.length > 0);\n const filename = segments[segments.length - 1] || \"\";\n const ext = path.extname(filename);\n\n const project = findProjectForFile(normalizedPath, structure);\n const language = EXTENSION_TO_LANGUAGE[ext] || \"unknown\";\n const layer = detectLayer(segments, filename);\n const domain = detectDomain(segments);\n const scope = detectScope(segments, project, layer);\n const framework = fileContent ? detectFramework(fileContent) : undefined;\n\n return {\n filepath: normalizedPath,\n project,\n scope,\n layer,\n domain,\n language,\n framework,\n depth: segments.length - 1,\n pathSegments: segments.slice(0, -1),\n };\n}\n\n/**\n * Extract keywords from introspection for search boosting.\n */\nexport function introspectionToKeywords(intro: FileIntrospection): string[] {\n const keywords: string[] = [];\n\n // Add filename keywords (without extension)\n const filename = path.basename(intro.filepath);\n const filenameWithoutExt = filename.replace(/\\.[^.]+$/, \"\");\n const filenameParts = filenameWithoutExt\n .split(/[-_.]/)\n .flatMap((part) => part.split(/(?=[A-Z])/))\n .map((part) => part.toLowerCase())\n .filter((part) => part.length > 1);\n keywords.push(...filenameParts);\n keywords.push(filenameWithoutExt.toLowerCase());\n\n // Add project name keywords\n if (intro.project.name && intro.project.name !== \"root\") {\n keywords.push(intro.project.name.toLowerCase());\n }\n\n // Add scope, layer, domain, language, framework\n if (intro.scope !== \"unknown\") keywords.push(intro.scope);\n if (intro.layer) keywords.push(intro.layer);\n if (intro.domain) keywords.push(intro.domain);\n if (intro.language !== \"unknown\") keywords.push(intro.language);\n if (intro.framework) keywords.push(intro.framework);\n\n // Add path segments (filtered)\n const skipSegments = new Set([\"src\", \"lib\", \"index\"]);\n for (const segment of intro.pathSegments) {\n if (!skipSegments.has(segment.toLowerCase()) && segment.length > 2) {\n keywords.push(segment.toLowerCase());\n }\n }\n\n // Add convention-based keywords\n const conventionKeywords = getConventionKeywords(intro.filepath);\n keywords.push(...conventionKeywords);\n\n return [...new Set(keywords)];\n}\n\n/**\n * Detect scope from project name.\n */\nexport function detectScopeFromName(name: string): Scope {\n const nameLower = name.toLowerCase();\n\n for (const [scope, keywords] of Object.entries(SCOPE_KEYWORDS)) {\n if (scope === \"unknown\") continue;\n for (const keyword of keywords) {\n if (nameLower.includes(keyword)) {\n return scope as Scope;\n }\n }\n }\n\n return \"unknown\";\n}\n\n/**\n * Find which project a file belongs to.\n */\nexport function findProjectForFile(\n filepath: string,\n structure: ProjectStructure\n): Project {\n const normalizedPath = filepath.replace(/\\\\/g, \"/\");\n const matches: Project[] = [];\n\n // Check against detected projects\n for (const project of structure.projects) {\n if (\n normalizedPath === project.root ||\n normalizedPath.startsWith(project.root + \"/\")\n ) {\n matches.push(project);\n }\n }\n\n // Return the most specific match (longest root path)\n if (matches.length > 0) {\n return matches.reduce((best, current) =>\n current.root.length > best.root.length ? current : best\n );\n }\n\n // Fallback: pattern matching\n for (const { pattern, type } of PROJECT_PATTERNS) {\n const match = normalizedPath.match(pattern);\n if (match) {\n return { name: match[1], root: match[0], type };\n }\n }\n\n // Default: root project\n return { name: \"root\", root: \"\", type: structure.rootType ?? \"unknown\" };\n}\n\n/**\n * Calculate search boost based on introspection and query.\n */\nexport function calculateIntrospectionBoost(\n intro: FileIntrospection,\n query: string\n): number {\n let boost = 1.0;\n const queryTerms = query.toLowerCase().split(/\\s+/);\n\n // Domain match: +10%\n if (\n intro.domain &&\n queryTerms.some(\n (t) => intro.domain!.includes(t) || t.includes(intro.domain!)\n )\n ) {\n boost *= 1.1;\n }\n\n // Layer match: +5%\n if (\n intro.layer &&\n queryTerms.some((t) => intro.layer!.includes(t) || t.includes(intro.layer!))\n ) {\n boost *= 1.05;\n }\n\n // Scope match for backend queries: +5%\n const backendTerms = [\"api\", \"server\", \"backend\", \"endpoint\", \"route\"];\n if (\n queryTerms.some((t) => backendTerms.includes(t)) &&\n intro.scope === \"backend\"\n ) {\n boost *= 1.05;\n }\n\n // Scope match for frontend queries: +5%\n const frontendTerms = [\n \"ui\",\n \"component\",\n \"page\",\n \"view\",\n \"frontend\",\n \"client\",\n ];\n if (\n queryTerms.some((t) => frontendTerms.includes(t)) &&\n intro.scope === \"frontend\"\n ) {\n boost *= 1.05;\n }\n\n // Path segment match: +3% per match\n for (const segment of intro.pathSegments) {\n if (queryTerms.some((t) => segment.toLowerCase().includes(t))) {\n boost *= 1.03;\n }\n }\n\n // Project name match: +5%\n if (\n intro.project.name !== \"root\" &&\n queryTerms.some((t) => intro.project.name.toLowerCase().includes(t))\n ) {\n boost *= 1.05;\n }\n\n return boost;\n}\n\n// ============================================================================\n// Internal Helper Functions\n// ============================================================================\n\nfunction detectLayer(segments: string[], filename: string): string | undefined {\n const filenameLower = filename.toLowerCase();\n for (const [layer, patterns] of Object.entries(LAYER_PATTERNS)) {\n for (const pattern of patterns) {\n if (filenameLower.includes(pattern)) return layer;\n }\n }\n\n for (let i = segments.length - 2; i >= 0; i--) {\n const segment = segments[i].toLowerCase();\n for (const [layer, patterns] of Object.entries(LAYER_PATTERNS)) {\n if (patterns.includes(segment)) return layer;\n }\n }\n\n return undefined;\n}\n\nfunction detectDomain(segments: string[]): string | undefined {\n const skipSegments = new Set([\n \"src\",\n \"lib\",\n \"app\",\n \"apps\",\n \"packages\",\n \"services\",\n \"modules\",\n \"features\",\n ...Object.values(LAYER_PATTERNS).flat(),\n ]);\n\n for (const segment of segments) {\n const segmentLower = segment.toLowerCase();\n if (skipSegments.has(segmentLower)) continue;\n\n if (DOMAIN_PATTERNS.includes(segmentLower)) return segmentLower;\n\n for (const domain of DOMAIN_PATTERNS) {\n if (segmentLower.startsWith(domain) || segmentLower.endsWith(domain)) {\n return domain;\n }\n }\n }\n\n return undefined;\n}\n\nfunction detectScope(\n segments: string[],\n project: Project,\n layer?: string\n): Scope {\n const projectScope = detectScopeFromName(project.name);\n if (projectScope !== \"unknown\") return projectScope;\n\n if (layer) {\n switch (layer) {\n case \"controller\":\n case \"repository\":\n case \"middleware\":\n return \"backend\";\n case \"presentation\":\n return \"frontend\";\n case \"util\":\n case \"model\":\n return \"shared\";\n case \"test\":\n return \"tooling\";\n }\n }\n\n for (const segment of segments) {\n const segmentLower = segment.toLowerCase();\n if ([\"server\", \"api\", \"backend\"].includes(segmentLower)) return \"backend\";\n if ([\"client\", \"web\", \"frontend\", \"ui\"].includes(segmentLower))\n return \"frontend\";\n if ([\"shared\", \"common\", \"lib\", \"libs\"].includes(segmentLower))\n return \"shared\";\n }\n\n return \"unknown\";\n}\n\nfunction detectFramework(content: string): string | undefined {\n for (const [framework, indicators] of Object.entries(FRAMEWORK_INDICATORS)) {\n for (const indicator of indicators) {\n if (\n content.includes(`from '${indicator}`) ||\n content.includes(`from \"${indicator}`) ||\n content.includes(`require('${indicator}`) ||\n content.includes(`require(\"${indicator}`)\n ) {\n return framework;\n }\n }\n }\n return undefined;\n}\n\n\n\n",
18
18
  "/**\n * Regex-based Symbol Extraction\n *\n * Extracts symbols from code using regular expressions.\n * Language-agnostic but optimized for common patterns.\n */\n\nexport type SymbolType =\n | \"function\"\n | \"class\"\n | \"variable\"\n | \"interface\"\n | \"type\"\n | \"enum\"\n | \"method\"\n | \"other\";\n\nexport interface ExtractedSymbol {\n name: string;\n type: SymbolType;\n line: number;\n isExported: boolean;\n}\n\n/**\n * Patterns for extracting symbols from code.\n * Order matters - more specific patterns should come first.\n */\nconst SYMBOL_PATTERNS: Array<{\n type: SymbolType;\n pattern: RegExp;\n exported: boolean;\n}> = [\n // Exported function declarations\n {\n type: \"function\",\n pattern: /^export\\s+(?:async\\s+)?function\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported arrow functions\n {\n type: \"function\",\n pattern: /^export\\s+(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/gm,\n exported: true,\n },\n // Exported classes\n {\n type: \"class\",\n pattern: /^export\\s+(?:abstract\\s+)?class\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported interfaces (TypeScript)\n {\n type: \"interface\",\n pattern: /^export\\s+interface\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported types (TypeScript)\n {\n type: \"type\",\n pattern: /^export\\s+type\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported enums\n {\n type: \"enum\",\n pattern: /^export\\s+(?:const\\s+)?enum\\s+(\\w+)/gm,\n exported: true,\n },\n // Exported variables\n {\n type: \"variable\",\n pattern: /^export\\s+(?:const|let|var)\\s+(\\w+)\\s*(?::|=)/gm,\n exported: true,\n },\n // Default exports\n {\n type: \"function\",\n pattern: /^export\\s+default\\s+(?:async\\s+)?function\\s+(\\w+)/gm,\n exported: true,\n },\n {\n type: \"class\",\n pattern: /^export\\s+default\\s+class\\s+(\\w+)/gm,\n exported: true,\n },\n\n // Non-exported declarations\n {\n type: \"function\",\n pattern: /^(?:async\\s+)?function\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"function\",\n pattern: /^(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/gm,\n exported: false,\n },\n {\n type: \"class\",\n pattern: /^(?:abstract\\s+)?class\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"interface\",\n pattern: /^interface\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"type\",\n pattern: /^type\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"enum\",\n pattern: /^(?:const\\s+)?enum\\s+(\\w+)/gm,\n exported: false,\n },\n\n // Python patterns\n {\n type: \"function\",\n pattern: /^def\\s+(\\w+)\\s*\\(/gm,\n exported: false,\n },\n {\n type: \"class\",\n pattern: /^class\\s+(\\w+)(?:\\s*\\(|:)/gm,\n exported: false,\n },\n\n // Go patterns\n {\n type: \"function\",\n pattern: /^func\\s+(?:\\([^)]+\\)\\s+)?(\\w+)\\s*\\(/gm,\n exported: false,\n },\n {\n type: \"type\",\n pattern: /^type\\s+(\\w+)\\s+(?:struct|interface)/gm,\n exported: false,\n },\n\n // Rust patterns\n {\n type: \"function\",\n pattern: /^(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"type\",\n pattern: /^(?:pub\\s+)?struct\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"enum\",\n pattern: /^(?:pub\\s+)?enum\\s+(\\w+)/gm,\n exported: false,\n },\n {\n type: \"interface\",\n pattern: /^(?:pub\\s+)?trait\\s+(\\w+)/gm,\n exported: false,\n },\n];\n\n/**\n * Extract symbols from code content using regex patterns.\n *\n * @param content - The source code content\n * @returns Array of extracted symbols with their locations\n */\nexport function extractSymbols(content: string): ExtractedSymbol[] {\n const symbols: ExtractedSymbol[] = [];\n const seenSymbols = new Set<string>(); // Track seen symbols to avoid duplicates\n\n // Split content into lines for line number calculation\n const lines = content.split(\"\\n\");\n\n for (const { type, pattern, exported } of SYMBOL_PATTERNS) {\n // Reset regex state\n pattern.lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n const name = match[1];\n const symbolKey = `${name}:${type}`;\n\n // Skip if we've already seen this symbol (from a more specific pattern)\n if (seenSymbols.has(symbolKey)) continue;\n seenSymbols.add(symbolKey);\n\n // Calculate line number\n const beforeMatch = content.substring(0, match.index);\n const line = beforeMatch.split(\"\\n\").length;\n\n symbols.push({\n name,\n type,\n line,\n isExported: exported,\n });\n }\n }\n\n // Sort by line number\n return symbols.sort((a, b) => a.line - b.line);\n}\n\n/**\n * Extract symbol names as keywords for BM25 indexing.\n *\n * @param symbols - Array of extracted symbols\n * @returns Array of unique symbol names\n */\nexport function symbolsToKeywords(symbols: ExtractedSymbol[]): string[] {\n const keywords = new Set<string>();\n\n for (const symbol of symbols) {\n // Add the full name\n keywords.add(symbol.name.toLowerCase());\n\n // Split camelCase/PascalCase into parts\n const parts = symbol.name\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/\\s+/);\n\n for (const part of parts) {\n if (part.length > 2) {\n keywords.add(part);\n }\n }\n }\n\n return Array.from(keywords);\n}\n\n",
19
19
  "/**\n * Core Index Module\n *\n * Language-agnostic text search using:\n * - Regex-based symbol extraction\n * - BM25 keyword matching\n * - Line-based chunking\n *\n * Index location: .raggrep/index/core/\n *\n * This module provides fast, deterministic search without embeddings.\n * It complements language-specific modules by catching symbol matches.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport {\n IndexModule,\n IndexContext,\n SearchContext,\n SearchOptions,\n} from \"../../types\";\nimport type {\n FileIndex,\n SearchResult,\n Chunk,\n ModuleConfig,\n ChunkType,\n} from \"../../domain/entities\";\nimport {\n BM25Index,\n tokenize,\n normalizeScore,\n} from \"../../domain/services/bm25\";\nimport { getRaggrepDir } from \"../../infrastructure/config\";\nimport { introspectionToKeywords } from \"../../domain/services/introspection\";\nimport {\n extractSymbols,\n symbolsToKeywords,\n type ExtractedSymbol,\n} from \"./symbols\";\n\n/** Default minimum score for core search results */\nconst DEFAULT_MIN_SCORE = 0.1;\n\n/** Default number of results */\nconst DEFAULT_TOP_K = 20;\n\n/** Lines per chunk for basic chunking */\nconst LINES_PER_CHUNK = 50;\n\n/** Overlap between chunks */\nconst CHUNK_OVERLAP = 10;\n\n/**\n * Core module-specific data stored with file index\n */\nexport interface CoreModuleData {\n /** Extracted symbols */\n symbols: ExtractedSymbol[];\n /** BM25 tokens for this file */\n tokens: string[];\n [key: string]: unknown;\n}\n\n/**\n * Stored symbol index for fast lookup\n */\ninterface SymbolIndexEntry {\n filepath: string;\n symbols: ExtractedSymbol[];\n tokens: string[];\n}\n\nexport class CoreModule implements IndexModule {\n readonly id = \"core\";\n readonly name = \"Core Search\";\n readonly description = \"Language-agnostic text search with symbol extraction\";\n readonly version = \"1.0.0\";\n\n /**\n * Core module accepts all files (it's the fallback).\n */\n supportsFile(_filepath: string): boolean {\n return true;\n }\n\n private symbolIndex: Map<string, SymbolIndexEntry> = new Map();\n private bm25Index: BM25Index | null = null;\n private rootDir: string = \"\";\n\n async initialize(_config: ModuleConfig): Promise<void> {\n // Core module needs no initialization\n }\n\n /**\n * Index a single file.\n */\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n this.rootDir = ctx.rootDir;\n\n // Extract symbols using regex\n const symbols = extractSymbols(content);\n const symbolKeywords = symbolsToKeywords(symbols);\n\n // Tokenize content for BM25\n const contentTokens = tokenize(content);\n\n // Get introspection keywords (includes filename, path segments, etc.)\n const intro = ctx.getIntrospection?.(filepath);\n const introKeywords = intro ? introspectionToKeywords(intro) : [];\n\n const allTokens = [\n ...new Set([...contentTokens, ...symbolKeywords, ...introKeywords]),\n ];\n\n // Create line-based chunks\n const chunks = this.createChunks(filepath, content, symbols);\n\n // Get file stats\n const stats = await ctx.getFileStats(filepath);\n\n // Store in memory for finalize\n this.symbolIndex.set(filepath, {\n filepath,\n symbols,\n tokens: allTokens,\n });\n\n // Build module data\n const moduleData: CoreModuleData = {\n symbols,\n tokens: allTokens,\n };\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n /**\n * Create line-based chunks from content.\n */\n private createChunks(\n filepath: string,\n content: string,\n symbols: ExtractedSymbol[]\n ): Chunk[] {\n const lines = content.split(\"\\n\");\n const chunks: Chunk[] = [];\n\n // Create overlapping chunks\n for (\n let start = 0;\n start < lines.length;\n start += LINES_PER_CHUNK - CHUNK_OVERLAP\n ) {\n const end = Math.min(start + LINES_PER_CHUNK, lines.length);\n const chunkLines = lines.slice(start, end);\n const chunkContent = chunkLines.join(\"\\n\");\n\n // Find symbols in this chunk\n const chunkSymbols = symbols.filter(\n (s) => s.line >= start + 1 && s.line <= end\n );\n\n // Determine chunk type based on symbols\n let chunkType: ChunkType = \"block\";\n let chunkName: string | undefined;\n let isExported = false;\n\n if (chunkSymbols.length > 0) {\n const primarySymbol = chunkSymbols[0];\n chunkType = this.symbolTypeToChunkType(primarySymbol.type);\n chunkName = primarySymbol.name;\n isExported = primarySymbol.isExported;\n }\n\n const chunkId = `${filepath}:${start + 1}-${end}`;\n\n chunks.push({\n id: chunkId,\n content: chunkContent,\n startLine: start + 1,\n endLine: end,\n type: chunkType,\n name: chunkName,\n isExported,\n });\n\n // Stop if we've reached the end\n if (end >= lines.length) break;\n }\n\n return chunks;\n }\n\n /**\n * Convert symbol type to chunk type.\n */\n private symbolTypeToChunkType(symbolType: string): ChunkType {\n switch (symbolType) {\n case \"function\":\n case \"method\":\n return \"function\";\n case \"class\":\n return \"class\";\n case \"interface\":\n return \"interface\";\n case \"type\":\n return \"type\";\n case \"enum\":\n return \"enum\";\n case \"variable\":\n return \"variable\";\n default:\n return \"block\";\n }\n }\n\n /**\n * Finalize indexing - build BM25 index and save symbol index.\n */\n async finalize(ctx: IndexContext): Promise<void> {\n const config = ctx.config;\n const coreDir = path.join(\n getRaggrepDir(ctx.rootDir, config),\n \"index\",\n \"core\"\n );\n\n // Ensure directory exists\n await fs.mkdir(coreDir, { recursive: true });\n\n // Build BM25 index from all tokens\n this.bm25Index = new BM25Index();\n for (const [filepath, entry] of this.symbolIndex) {\n this.bm25Index.addDocument(filepath, entry.tokens);\n }\n\n // Save symbol index\n const symbolIndexData = {\n version: this.version,\n lastUpdated: new Date().toISOString(),\n files: Object.fromEntries(this.symbolIndex),\n bm25Data: this.bm25Index.serialize(),\n };\n\n await fs.writeFile(\n path.join(coreDir, \"symbols.json\"),\n JSON.stringify(symbolIndexData, null, 2)\n );\n }\n\n /**\n * Search the index.\n */\n async search(\n query: string,\n ctx: SearchContext,\n options?: SearchOptions\n ): Promise<SearchResult[]> {\n const config = ctx.config;\n const topK = options?.topK ?? DEFAULT_TOP_K;\n const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;\n\n // Load symbol index if not in memory\n if (this.symbolIndex.size === 0) {\n await this.loadSymbolIndex(ctx.rootDir, config);\n }\n\n if (!this.bm25Index || this.symbolIndex.size === 0) {\n return [];\n }\n\n // Tokenize query\n const queryTokens = tokenize(query);\n\n // Get BM25 scores\n const bm25Results = this.bm25Index.search(query, topK * 2);\n const bm25Scores = new Map(bm25Results.map((r) => [r.id, r.score]));\n\n // Check for symbol name matches (exact or partial)\n const symbolMatches = this.findSymbolMatches(queryTokens);\n\n // Combine results\n const results: SearchResult[] = [];\n\n for (const filepath of this.symbolIndex.keys()) {\n const entry = this.symbolIndex.get(filepath)!;\n const bm25Score = bm25Scores.get(filepath) ?? 0;\n const symbolScore = symbolMatches.get(filepath) ?? 0;\n\n // Skip if no match\n if (bm25Score === 0 && symbolScore === 0) continue;\n\n // Combined score: symbol matches are highly weighted\n const combinedScore = 0.6 * normalizeScore(bm25Score) + 0.4 * symbolScore;\n\n if (combinedScore >= minScore) {\n // Load file index to get chunks\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n // Find best matching chunk\n const bestChunk = this.findBestChunk(\n fileIndex.chunks,\n queryTokens,\n entry.symbols\n );\n\n results.push({\n filepath,\n chunk: bestChunk,\n score: combinedScore,\n moduleId: this.id,\n context: {\n bm25Score: normalizeScore(bm25Score),\n symbolScore,\n },\n });\n }\n }\n\n // Sort by score and limit\n return results.sort((a, b) => b.score - a.score).slice(0, topK);\n }\n\n /**\n * Find symbol name matches for query tokens.\n */\n private findSymbolMatches(queryTokens: string[]): Map<string, number> {\n const matches = new Map<string, number>();\n\n for (const [filepath, entry] of this.symbolIndex) {\n let matchScore = 0;\n\n for (const symbol of entry.symbols) {\n const symbolName = symbol.name.toLowerCase();\n const symbolParts = symbolsToKeywords([symbol]);\n\n for (const token of queryTokens) {\n // Exact match on symbol name\n if (symbolName === token) {\n matchScore += symbol.isExported ? 1.0 : 0.8;\n }\n // Partial match on symbol name\n else if (symbolName.includes(token) || token.includes(symbolName)) {\n matchScore += symbol.isExported ? 0.5 : 0.4;\n }\n // Match on symbol parts (camelCase split)\n else if (symbolParts.some((p) => p === token)) {\n matchScore += symbol.isExported ? 0.3 : 0.2;\n }\n }\n }\n\n if (matchScore > 0) {\n // Normalize by number of query tokens\n matches.set(filepath, Math.min(1, matchScore / queryTokens.length));\n }\n }\n\n return matches;\n }\n\n /**\n * Find the best matching chunk based on query tokens.\n */\n private findBestChunk(\n chunks: Chunk[],\n queryTokens: string[],\n symbols: ExtractedSymbol[]\n ): Chunk {\n let bestChunk = chunks[0];\n let bestScore = 0;\n\n for (const chunk of chunks) {\n let score = 0;\n const chunkContent = chunk.content.toLowerCase();\n\n // Score based on query token presence\n for (const token of queryTokens) {\n if (chunkContent.includes(token)) {\n score += 1;\n }\n }\n\n // Bonus for named chunks matching query\n if (chunk.name) {\n const nameLower = chunk.name.toLowerCase();\n for (const token of queryTokens) {\n if (nameLower.includes(token)) {\n score += 2;\n }\n }\n }\n\n // Bonus for exported symbols\n if (chunk.isExported) {\n score += 0.5;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestChunk = chunk;\n }\n }\n\n return bestChunk;\n }\n\n /**\n * Load the symbol index from disk.\n */\n private async loadSymbolIndex(rootDir: string, config: any): Promise<void> {\n const coreDir = path.join(getRaggrepDir(rootDir, config), \"index\", \"core\");\n const symbolsPath = path.join(coreDir, \"symbols.json\");\n\n try {\n const content = await fs.readFile(symbolsPath, \"utf-8\");\n const data = JSON.parse(content);\n\n // Restore symbol index\n this.symbolIndex = new Map(Object.entries(data.files));\n\n // Restore BM25 index\n if (data.bm25Data) {\n this.bm25Index = BM25Index.deserialize(data.bm25Data);\n }\n } catch (error) {\n // Index doesn't exist yet\n this.symbolIndex = new Map();\n this.bm25Index = null;\n }\n }\n\n async dispose(): Promise<void> {\n this.symbolIndex.clear();\n this.bm25Index = null;\n }\n}\n",
20
- "/**\n * Transformers.js Embedding Adapter\n *\n * Implements the EmbeddingProvider port using Transformers.js for local embeddings.\n * Models are automatically downloaded and cached on first use.\n */\n\nimport {\n pipeline,\n env,\n type FeatureExtractionPipeline,\n} from \"@xenova/transformers\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport type {\n EmbeddingProvider,\n EmbeddingConfig,\n EmbeddingModelName,\n Logger,\n} from \"../../domain/ports\";\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/** Cache directory for models */\nconst CACHE_DIR = path.join(os.homedir(), \".cache\", \"raggrep\", \"models\");\n\n// Set the cache directory for transformers.js\nenv.cacheDir = CACHE_DIR;\nenv.allowLocalModels = true;\n\n/** Available embedding models and their Hugging Face IDs */\nexport const EMBEDDING_MODELS: Record<EmbeddingModelName, string> = {\n \"all-MiniLM-L6-v2\": \"Xenova/all-MiniLM-L6-v2\",\n \"all-MiniLM-L12-v2\": \"Xenova/all-MiniLM-L12-v2\",\n \"bge-small-en-v1.5\": \"Xenova/bge-small-en-v1.5\",\n \"paraphrase-MiniLM-L3-v2\": \"Xenova/paraphrase-MiniLM-L3-v2\",\n};\n\n/** Embedding dimension for all MiniLM models */\nconst EMBEDDING_DIMENSION = 384;\n\n/** Maximum texts per batch */\nconst BATCH_SIZE = 32;\n\n// ============================================================================\n// Transformers.js Embedding Provider\n// ============================================================================\n\n/**\n * Embedding provider using Transformers.js (local inference).\n */\nexport class TransformersEmbeddingProvider implements EmbeddingProvider {\n private pipeline: FeatureExtractionPipeline | null = null;\n private config: EmbeddingConfig;\n private isInitializing = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config?: Partial<EmbeddingConfig>) {\n this.config = {\n model: config?.model ?? \"all-MiniLM-L6-v2\",\n showProgress: config?.showProgress ?? false, // Silent by default\n logger: config?.logger,\n };\n }\n\n async initialize(config?: EmbeddingConfig): Promise<void> {\n if (config) {\n // If model changed, reset pipeline\n if (config.model !== this.config.model) {\n this.pipeline = null;\n }\n this.config = { ...this.config, ...config };\n }\n\n await this.ensurePipeline();\n }\n\n private async ensurePipeline(): Promise<void> {\n if (this.pipeline) {\n return;\n }\n\n // Prevent multiple simultaneous initializations\n if (this.isInitializing && this.initPromise) {\n return this.initPromise;\n }\n\n this.isInitializing = true;\n\n this.initPromise = (async () => {\n const modelId = EMBEDDING_MODELS[this.config.model];\n const logger = this.config.logger;\n const showProgress = this.config.showProgress || !!logger;\n\n // Check if model is already cached to avoid logging progress when using cached model\n const isCached = await isModelCached(this.config.model);\n\n // Track if we've seen any actual downloads (only log if actually downloading)\n let hasDownloads = false;\n\n try {\n this.pipeline = await pipeline(\"feature-extraction\", modelId, {\n // Only show progress if we want progress AND the model isn't already cached\n progress_callback:\n showProgress && !isCached\n ? (progress: {\n status: string;\n file?: string;\n progress?: number;\n }) => {\n if (progress.status === \"progress\" && progress.file) {\n // Only start logging once we confirm there's a download happening\n if (!hasDownloads) {\n hasDownloads = true;\n if (logger) {\n logger.info(\n `Downloading embedding model: ${this.config.model}`\n );\n } else {\n console.log(\n `\\n Loading embedding model: ${this.config.model}`\n );\n console.log(` Cache: ${CACHE_DIR}`);\n }\n }\n const pct = progress.progress\n ? Math.round(progress.progress)\n : 0;\n\n if (logger) {\n logger.progress(\n ` Downloading ${progress.file}: ${pct}%`\n );\n } else {\n process.stdout.write(\n `\\r Downloading ${progress.file}: ${pct}% `\n );\n }\n } else if (progress.status === \"done\" && progress.file) {\n if (logger) {\n logger.clearProgress();\n logger.info(` Downloaded ${progress.file}`);\n } else if (hasDownloads) {\n process.stdout.write(\n `\\r Downloaded ${progress.file} \\n`\n );\n }\n }\n }\n : undefined,\n });\n\n // Only log completion if we actually downloaded something\n if (hasDownloads) {\n if (logger) {\n logger.clearProgress();\n logger.info(`Model ready: ${this.config.model}`);\n } else {\n console.log(` Model ready.\\n`);\n }\n }\n } catch (error) {\n this.pipeline = null;\n if (logger) {\n logger.clearProgress();\n }\n throw new Error(`Failed to load embedding model: ${error}`);\n } finally {\n this.isInitializing = false;\n this.initPromise = null;\n }\n })();\n\n return this.initPromise;\n }\n\n async getEmbedding(text: string): Promise<number[]> {\n await this.ensurePipeline();\n\n if (!this.pipeline) {\n throw new Error(\"Embedding pipeline not initialized\");\n }\n\n const output = await this.pipeline(text, {\n pooling: \"mean\",\n normalize: true,\n });\n\n return Array.from(output.data as Float32Array);\n }\n\n async getEmbeddings(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n\n await this.ensurePipeline();\n\n if (!this.pipeline) {\n throw new Error(\"Embedding pipeline not initialized\");\n }\n\n const results: number[][] = [];\n\n // Process in batches\n for (let i = 0; i < texts.length; i += BATCH_SIZE) {\n const batch = texts.slice(i, i + BATCH_SIZE);\n\n const outputs = await Promise.all(\n batch.map(async (text) => {\n const output = await this.pipeline!(text, {\n pooling: \"mean\",\n normalize: true,\n });\n return Array.from(output.data as Float32Array);\n })\n );\n\n results.push(...outputs);\n }\n\n return results;\n }\n\n getDimension(): number {\n return EMBEDDING_DIMENSION;\n }\n\n getModelName(): string {\n return this.config.model;\n }\n\n async dispose(): Promise<void> {\n this.pipeline = null;\n }\n}\n\n/**\n * Get the cache directory path\n */\nexport function getCacheDir(): string {\n return CACHE_DIR;\n}\n\n/**\n * Check if a model is already cached\n */\nexport async function isModelCached(\n model: EmbeddingModelName\n): Promise<boolean> {\n const modelId = EMBEDDING_MODELS[model];\n // transformers.js caches models in subdirectories matching the model ID\n // e.g., Xenova/all-MiniLM-L6-v2\n const modelPath = path.join(CACHE_DIR, modelId);\n\n try {\n const fs = await import(\"fs/promises\");\n // Check for the actual model file to ensure it's fully downloaded\n const onnxPath = path.join(modelPath, \"onnx\", \"model_quantized.onnx\");\n await fs.access(onnxPath);\n return true;\n } catch {\n return false;\n }\n}\n\n// ============================================================================\n// Global Embedding API (convenience functions)\n// ============================================================================\n\n/** Global provider instance for convenience functions */\nlet globalProvider: TransformersEmbeddingProvider | null = null;\nlet globalConfig: EmbeddingConfig = {\n model: \"all-MiniLM-L6-v2\",\n showProgress: false, // Silent by default for CLI usage\n logger: undefined,\n};\n\n/**\n * Configure the global embedding provider.\n */\nexport function configureEmbeddings(config: Partial<EmbeddingConfig>): void {\n const newConfig = { ...globalConfig, ...config };\n\n // If model or logger changed, reset provider to pick up new config\n if (\n newConfig.model !== globalConfig.model ||\n newConfig.logger !== globalConfig.logger\n ) {\n globalProvider = null;\n }\n\n globalConfig = newConfig as EmbeddingConfig;\n}\n\n/**\n * Get current embedding configuration.\n */\nexport function getEmbeddingConfig(): EmbeddingConfig {\n return { ...globalConfig };\n}\n\n/**\n * Ensure the global provider is initialized.\n */\nasync function ensureGlobalProvider(): Promise<TransformersEmbeddingProvider> {\n if (!globalProvider) {\n globalProvider = new TransformersEmbeddingProvider(globalConfig);\n await globalProvider.initialize();\n }\n return globalProvider;\n}\n\n/**\n * Get embedding for a single text using the global provider.\n */\nexport async function getEmbedding(text: string): Promise<number[]> {\n const provider = await ensureGlobalProvider();\n return provider.getEmbedding(text);\n}\n\n/**\n * Get embeddings for multiple texts using the global provider.\n */\nexport async function getEmbeddings(texts: string[]): Promise<number[][]> {\n const provider = await ensureGlobalProvider();\n return provider.getEmbeddings(texts);\n}\n",
21
- "/**\n * Embedding Infrastructure\n *\n * Provides embedding generation using Transformers.js.\n */\n\nexport {\n // Class-based API\n TransformersEmbeddingProvider,\n // Constants\n EMBEDDING_MODELS,\n // Utilities\n getCacheDir,\n isModelCached,\n // Global API (convenience functions)\n configureEmbeddings,\n getEmbeddingConfig,\n getEmbedding,\n getEmbeddings,\n} from \"./transformersEmbedding\";\n\n",
20
+ "/**\n * Transformers.js Embedding Adapter\n *\n * Implements the EmbeddingProvider port using Transformers.js for local embeddings.\n * Models are automatically downloaded and cached on first use.\n */\n\nimport {\n pipeline,\n env,\n type FeatureExtractionPipeline,\n} from \"@xenova/transformers\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport type {\n EmbeddingProvider,\n EmbeddingConfig,\n EmbeddingModelName,\n Logger,\n} from \"../../domain/ports\";\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/** Cache directory for models */\nconst CACHE_DIR = path.join(os.homedir(), \".cache\", \"raggrep\", \"models\");\n\n// Set the cache directory for transformers.js\nenv.cacheDir = CACHE_DIR;\nenv.allowLocalModels = true;\n\n/** Available embedding models and their Hugging Face IDs */\nexport const EMBEDDING_MODELS: Record<EmbeddingModelName, string> = {\n \"all-MiniLM-L6-v2\": \"Xenova/all-MiniLM-L6-v2\",\n \"all-MiniLM-L12-v2\": \"Xenova/all-MiniLM-L12-v2\",\n \"bge-small-en-v1.5\": \"Xenova/bge-small-en-v1.5\",\n \"paraphrase-MiniLM-L3-v2\": \"Xenova/paraphrase-MiniLM-L3-v2\",\n \"nomic-embed-text-v1.5\": \"nomic-ai/nomic-embed-text-v1.5\",\n};\n\n/** Embedding dimensions per model */\nexport const EMBEDDING_DIMENSIONS: Record<EmbeddingModelName, number> = {\n \"all-MiniLM-L6-v2\": 384,\n \"all-MiniLM-L12-v2\": 384,\n \"bge-small-en-v1.5\": 384,\n \"paraphrase-MiniLM-L3-v2\": 384,\n \"nomic-embed-text-v1.5\": 768,\n};\n\n/** Maximum texts per batch */\nconst BATCH_SIZE = 32;\n\n// ============================================================================\n// Transformers.js Embedding Provider\n// ============================================================================\n\n/**\n * Embedding provider using Transformers.js (local inference).\n */\nexport class TransformersEmbeddingProvider implements EmbeddingProvider {\n private pipeline: FeatureExtractionPipeline | null = null;\n private config: EmbeddingConfig;\n private isInitializing = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(config?: Partial<EmbeddingConfig>) {\n this.config = {\n model: config?.model ?? \"bge-small-en-v1.5\",\n showProgress: config?.showProgress ?? false, // Silent by default\n logger: config?.logger,\n };\n }\n\n async initialize(config?: EmbeddingConfig): Promise<void> {\n if (config) {\n // If model changed, reset pipeline\n if (config.model !== this.config.model) {\n this.pipeline = null;\n }\n this.config = { ...this.config, ...config };\n }\n\n await this.ensurePipeline();\n }\n\n private async ensurePipeline(): Promise<void> {\n if (this.pipeline) {\n return;\n }\n\n // Prevent multiple simultaneous initializations\n if (this.isInitializing && this.initPromise) {\n return this.initPromise;\n }\n\n this.isInitializing = true;\n\n this.initPromise = (async () => {\n const modelId = EMBEDDING_MODELS[this.config.model];\n const logger = this.config.logger;\n const showProgress = this.config.showProgress || !!logger;\n\n // Check if model is already cached to avoid logging progress when using cached model\n const isCached = await isModelCached(this.config.model);\n\n // Track if we've seen any actual downloads (only log if actually downloading)\n let hasDownloads = false;\n\n try {\n this.pipeline = await pipeline(\"feature-extraction\", modelId, {\n // Only show progress if we want progress AND the model isn't already cached\n progress_callback:\n showProgress && !isCached\n ? (progress: {\n status: string;\n file?: string;\n progress?: number;\n }) => {\n if (progress.status === \"progress\" && progress.file) {\n // Only start logging once we confirm there's a download happening\n if (!hasDownloads) {\n hasDownloads = true;\n if (logger) {\n logger.info(\n `Downloading embedding model: ${this.config.model}`\n );\n } else {\n console.log(\n `\\n Loading embedding model: ${this.config.model}`\n );\n console.log(` Cache: ${CACHE_DIR}`);\n }\n }\n const pct = progress.progress\n ? Math.round(progress.progress)\n : 0;\n\n if (logger) {\n logger.progress(\n ` Downloading ${progress.file}: ${pct}%`\n );\n } else {\n process.stdout.write(\n `\\r Downloading ${progress.file}: ${pct}% `\n );\n }\n } else if (progress.status === \"done\" && progress.file) {\n if (logger) {\n logger.clearProgress();\n logger.info(` Downloaded ${progress.file}`);\n } else if (hasDownloads) {\n process.stdout.write(\n `\\r Downloaded ${progress.file} \\n`\n );\n }\n }\n }\n : undefined,\n });\n\n // Only log completion if we actually downloaded something\n if (hasDownloads) {\n if (logger) {\n logger.clearProgress();\n logger.info(`Model ready: ${this.config.model}`);\n } else {\n console.log(` Model ready.\\n`);\n }\n }\n } catch (error) {\n this.pipeline = null;\n if (logger) {\n logger.clearProgress();\n }\n throw new Error(`Failed to load embedding model: ${error}`);\n } finally {\n this.isInitializing = false;\n this.initPromise = null;\n }\n })();\n\n return this.initPromise;\n }\n\n async getEmbedding(text: string): Promise<number[]> {\n await this.ensurePipeline();\n\n if (!this.pipeline) {\n throw new Error(\"Embedding pipeline not initialized\");\n }\n\n const output = await this.pipeline(text, {\n pooling: \"mean\",\n normalize: true,\n });\n\n return Array.from(output.data as Float32Array);\n }\n\n async getEmbeddings(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n\n await this.ensurePipeline();\n\n if (!this.pipeline) {\n throw new Error(\"Embedding pipeline not initialized\");\n }\n\n const results: number[][] = [];\n\n // Process in batches\n for (let i = 0; i < texts.length; i += BATCH_SIZE) {\n const batch = texts.slice(i, i + BATCH_SIZE);\n\n const outputs = await Promise.all(\n batch.map(async (text) => {\n const output = await this.pipeline!(text, {\n pooling: \"mean\",\n normalize: true,\n });\n return Array.from(output.data as Float32Array);\n })\n );\n\n results.push(...outputs);\n }\n\n return results;\n }\n\n getDimension(): number {\n return EMBEDDING_DIMENSIONS[this.config.model];\n }\n\n getModelName(): string {\n return this.config.model;\n }\n\n async dispose(): Promise<void> {\n this.pipeline = null;\n }\n}\n\n/**\n * Get the cache directory path\n */\nexport function getCacheDir(): string {\n return CACHE_DIR;\n}\n\n/**\n * Check if a model is already cached\n */\nexport async function isModelCached(\n model: EmbeddingModelName\n): Promise<boolean> {\n const modelId = EMBEDDING_MODELS[model];\n // transformers.js caches models in subdirectories matching the model ID\n // e.g., Xenova/all-MiniLM-L6-v2\n const modelPath = path.join(CACHE_DIR, modelId);\n\n try {\n const fs = await import(\"fs/promises\");\n // Check for the actual model file to ensure it's fully downloaded\n const onnxPath = path.join(modelPath, \"onnx\", \"model_quantized.onnx\");\n await fs.access(onnxPath);\n return true;\n } catch {\n return false;\n }\n}\n\n// ============================================================================\n// Global Embedding API (convenience functions)\n// ============================================================================\n\n/** Global provider instance for convenience functions */\nlet globalProvider: TransformersEmbeddingProvider | null = null;\nlet globalConfig: EmbeddingConfig = {\n model: \"bge-small-en-v1.5\",\n showProgress: false, // Silent by default for CLI usage\n logger: undefined,\n};\n\n/**\n * Configure the global embedding provider.\n */\nexport function configureEmbeddings(config: Partial<EmbeddingConfig>): void {\n const newConfig = { ...globalConfig, ...config };\n\n // If model or logger changed, reset provider to pick up new config\n if (\n newConfig.model !== globalConfig.model ||\n newConfig.logger !== globalConfig.logger\n ) {\n globalProvider = null;\n }\n\n globalConfig = newConfig as EmbeddingConfig;\n}\n\n/**\n * Get current embedding configuration.\n */\nexport function getEmbeddingConfig(): EmbeddingConfig {\n return { ...globalConfig };\n}\n\n/**\n * Ensure the global provider is initialized.\n */\nasync function ensureGlobalProvider(): Promise<TransformersEmbeddingProvider> {\n if (!globalProvider) {\n globalProvider = new TransformersEmbeddingProvider(globalConfig);\n await globalProvider.initialize();\n }\n return globalProvider;\n}\n\n/**\n * Get embedding for a single text using the global provider.\n */\nexport async function getEmbedding(text: string): Promise<number[]> {\n const provider = await ensureGlobalProvider();\n return provider.getEmbedding(text);\n}\n\n/**\n * Get embeddings for multiple texts using the global provider.\n */\nexport async function getEmbeddings(texts: string[]): Promise<number[][]> {\n const provider = await ensureGlobalProvider();\n return provider.getEmbeddings(texts);\n}\n",
21
+ "/**\n * Embedding Infrastructure\n *\n * Provides embedding generation using Transformers.js.\n */\n\nexport {\n // Class-based API\n TransformersEmbeddingProvider,\n // Constants\n EMBEDDING_MODELS,\n EMBEDDING_DIMENSIONS,\n // Utilities\n getCacheDir,\n isModelCached,\n // Global API (convenience functions)\n configureEmbeddings,\n getEmbeddingConfig,\n getEmbedding,\n getEmbeddings,\n} from \"./transformersEmbedding\";\n",
22
22
  "/**\n * Keyword Extraction Service\n * \n * Pure domain service for extracting keywords from code.\n * No external dependencies - operates only on string data.\n */\n\n/**\n * Common programming keywords to exclude from keyword extraction.\n * These appear in almost every code file and don't add search value.\n */\nexport const COMMON_KEYWORDS = new Set([\n // JavaScript/TypeScript\n 'const', 'let', 'var', 'function', 'class', 'interface', 'type', 'enum',\n 'export', 'import', 'from', 'return', 'async', 'await', 'new', 'this',\n 'true', 'false', 'null', 'undefined', 'if', 'else', 'for', 'while',\n 'switch', 'case', 'break', 'continue', 'try', 'catch', 'finally',\n 'throw', 'typeof', 'instanceof', 'void', 'delete', 'in', 'of',\n 'string', 'number', 'boolean', 'any', 'unknown', 'never', 'object',\n 'public', 'private', 'protected', 'static', 'readonly', 'abstract',\n 'implements', 'extends', 'super', 'get', 'set', 'constructor',\n // Common words\n 'the', 'and', 'for', 'not', 'with', 'are', 'was', 'has', 'have',\n]);\n\n/**\n * Common architectural layer patterns in file names/paths.\n * Used to detect the layer a file belongs to.\n */\nexport const LAYER_PATTERNS: Record<string, string[]> = {\n 'controller': ['controller', 'controllers', 'handler', 'handlers', 'route', 'routes', 'api'],\n 'service': ['service', 'services', 'usecase', 'usecases', 'application'],\n 'repository': ['repository', 'repositories', 'repo', 'repos', 'dao', 'store', 'storage'],\n 'model': ['model', 'models', 'entity', 'entities', 'schema', 'schemas'],\n 'util': ['util', 'utils', 'utility', 'utilities', 'helper', 'helpers', 'common', 'shared'],\n 'config': ['config', 'configs', 'configuration', 'settings'],\n 'middleware': ['middleware', 'middlewares', 'interceptor', 'interceptors'],\n 'domain': ['domain', 'core', 'business'],\n 'infrastructure': ['infrastructure', 'infra', 'external', 'adapters'],\n 'presentation': ['presentation', 'view', 'views', 'component', 'components', 'ui'],\n 'test': ['test', 'tests', 'spec', 'specs', '__tests__', '__test__'],\n};\n\n/**\n * Extract keywords from code content and optional name.\n * \n * @param content - Code content to extract keywords from\n * @param name - Optional name (function name, class name, etc.)\n * @param maxKeywords - Maximum keywords to return (default: 50)\n * @returns Array of unique lowercase keywords\n */\nexport function extractKeywords(\n content: string, \n name?: string,\n maxKeywords: number = 50\n): string[] {\n const keywords = new Set<string>();\n \n // Add the name if present\n if (name) {\n keywords.add(name.toLowerCase());\n \n // Also add camelCase parts (e.g., \"getUserById\" → [\"get\", \"user\", \"by\", \"id\"])\n const parts = name.split(/(?=[A-Z])/).map(p => p.toLowerCase());\n parts.forEach(p => p.length > 2 && keywords.add(p));\n }\n \n // Extract identifiers from content\n const identifierRegex = /\\b([a-zA-Z_][a-zA-Z0-9_]{2,})\\b/g;\n let match;\n \n while ((match = identifierRegex.exec(content)) !== null) {\n const word = match[1].toLowerCase();\n \n // Skip common keywords and very short words\n if (!COMMON_KEYWORDS.has(word) && word.length > 2) {\n keywords.add(word);\n }\n }\n \n return Array.from(keywords).slice(0, maxKeywords);\n}\n\n/**\n * Split a string by camelCase, PascalCase, snake_case, and kebab-case.\n */\nfunction splitIdentifier(str: string): string[] {\n return str\n // Split camelCase and PascalCase\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Split snake_case and kebab-case\n .replace(/[_-]/g, ' ')\n .split(/\\s+/)\n .map(s => s.toLowerCase())\n .filter(s => s.length > 1);\n}\n\n/**\n * Extract keywords from a file path.\n * \n * Enhanced extraction that:\n * - Splits camelCase/PascalCase filenames\n * - Extracts directory segments\n * - Recognizes common patterns (Service, Controller, etc.)\n * \n * @param filepath - File path to extract keywords from\n * @returns Array of keywords from path segments\n */\nexport function extractPathKeywords(filepath: string): string[] {\n const keywords = new Set<string>();\n \n // Split path into segments (excluding extension)\n const pathWithoutExt = filepath.replace(/\\.[^.]+$/, '');\n const segments = pathWithoutExt.split(/[/\\\\]/);\n \n for (const segment of segments) {\n if (segment.length < 2) continue;\n \n // Add the full segment\n const lower = segment.toLowerCase();\n if (!COMMON_KEYWORDS.has(lower) && lower.length > 2) {\n keywords.add(lower);\n }\n \n // Split camelCase/PascalCase/snake_case and add parts\n const parts = splitIdentifier(segment);\n for (const part of parts) {\n if (!COMMON_KEYWORDS.has(part) && part.length > 2) {\n keywords.add(part);\n }\n }\n }\n \n return Array.from(keywords);\n}\n\n/**\n * Path context information extracted from a file path.\n */\nexport interface PathContext {\n /** Directory segments (excluding filename) */\n segments: string[];\n /** Detected architectural layer (service, controller, repository, etc.) */\n layer?: string;\n /** Detected feature domain (auth, users, payments, etc.) */\n domain?: string;\n /** Path depth (number of directory levels) */\n depth: number;\n /** Keywords extracted from the path */\n keywords: string[];\n}\n\n/**\n * Parse a file path and extract structural context.\n * \n * This helps with:\n * - Boosting files in related directories\n * - Understanding architectural layer\n * - Grouping by feature domain\n * \n * @param filepath - File path to parse\n * @returns Parsed path context\n */\nexport function parsePathContext(filepath: string): PathContext {\n const pathWithoutExt = filepath.replace(/\\.[^.]+$/, '');\n const allSegments = pathWithoutExt.split(/[/\\\\]/);\n const filename = allSegments[allSegments.length - 1];\n const dirSegments = allSegments.slice(0, -1);\n \n // Extract keywords from all segments\n const keywords = extractPathKeywords(filepath);\n \n // Detect layer from filename and path\n let layer: string | undefined;\n const allLower = [...dirSegments, filename].map(s => s.toLowerCase()).join(' ');\n const filenameLower = filename.toLowerCase();\n \n for (const [layerName, patterns] of Object.entries(LAYER_PATTERNS)) {\n for (const pattern of patterns) {\n // Check filename first (higher priority)\n if (filenameLower.includes(pattern)) {\n layer = layerName;\n break;\n }\n // Check path segments\n if (dirSegments.some(s => s.toLowerCase() === pattern)) {\n layer = layerName;\n break;\n }\n }\n if (layer) break;\n }\n \n // Detect domain from non-layer directory names\n // e.g., src/services/auth/authService.ts → domain = \"auth\"\n // Traverse from innermost to outermost to find the most specific domain\n let domain: string | undefined;\n const layerPatternSet = new Set(Object.values(LAYER_PATTERNS).flat());\n \n // Create a reversed copy to traverse from innermost to outermost\n const reversedSegments = [...dirSegments].reverse();\n for (const segment of reversedSegments) {\n const lower = segment.toLowerCase();\n // Skip common non-domain directories\n if (['src', 'lib', 'app', 'packages', 'modules'].includes(lower)) continue;\n // Skip layer directories\n if (layerPatternSet.has(lower)) continue;\n // This is likely the domain\n if (lower.length > 2) {\n domain = lower;\n break;\n }\n }\n \n return {\n segments: dirSegments,\n layer,\n domain,\n depth: dirSegments.length,\n keywords,\n };\n}\n\n/**\n * Generate a path context string for embedding.\n * This is prepended to content to give the embedding model path awareness.\n * \n * @param pathContext - Parsed path context\n * @returns A string representation of the path context\n */\nexport function formatPathContextForEmbedding(pathContext: PathContext): string {\n const parts: string[] = [];\n \n if (pathContext.domain) {\n parts.push(pathContext.domain);\n }\n \n if (pathContext.layer) {\n parts.push(pathContext.layer);\n }\n \n // Add significant path segments (limit to avoid noise)\n const significantSegments = pathContext.segments\n .slice(-3) // Last 3 directories\n .filter(s => s.length > 2 && !['src', 'lib', 'app'].includes(s.toLowerCase()));\n \n if (significantSegments.length > 0) {\n parts.push(...significantSegments.map(s => s.toLowerCase()));\n }\n \n if (parts.length === 0) return '';\n \n // Deduplicate\n const unique = [...new Set(parts)];\n return `[${unique.join(' ')}]`;\n}\n\n",
23
23
  "/**\n * Similarity Service\n *\n * Pure mathematical functions for computing vector similarity.\n * No external dependencies.\n */\n\n/**\n * Calculate cosine similarity between two vectors.\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Similarity score between -1 and 1 (1 = identical, 0 = orthogonal, -1 = opposite)\n * @throws Error if vectors have different lengths\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(`Vector length mismatch: ${a.length} vs ${b.length}`);\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n\n if (magnitude === 0) return 0;\n\n return dotProduct / magnitude;\n}\n\n/**\n * Calculate Euclidean distance between two vectors.\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Distance (0 = identical, larger = more different)\n */\nexport function euclideanDistance(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(`Vector length mismatch: ${a.length} vs ${b.length}`);\n }\n\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n const diff = a[i] - b[i];\n sum += diff * diff;\n }\n\n return Math.sqrt(sum);\n}\n\n",
24
24
  "/**\n * Query Intent Detection Service\n *\n * Detects whether a search query is looking for implementation code\n * or documentation, and calculates appropriate boosts.\n */\n\nimport * as path from \"path\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Implementation-related query terms that boost source code files */\nexport const IMPLEMENTATION_TERMS = [\n \"function\",\n \"method\",\n \"class\",\n \"interface\",\n \"implement\",\n \"implementation\",\n \"endpoint\",\n \"route\",\n \"handler\",\n \"controller\",\n \"module\",\n \"code\",\n];\n\n/** Documentation-related query terms that boost documentation files */\nexport const DOCUMENTATION_TERMS = [\n \"documentation\",\n \"docs\",\n \"guide\",\n \"tutorial\",\n \"readme\",\n \"how\",\n \"what\",\n \"why\",\n \"explain\",\n \"overview\",\n \"getting\",\n \"started\",\n \"requirements\",\n \"setup\",\n \"install\",\n \"configure\",\n \"configuration\",\n];\n\n/** Source code file extensions */\nexport const SOURCE_CODE_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".py\",\n \".go\",\n \".rs\",\n \".java\",\n];\n\n/** Documentation file extensions */\nexport const DOC_EXTENSIONS = [\".md\", \".txt\", \".rst\"];\n\n/** Data/config file extensions */\nexport const DATA_EXTENSIONS = [\".json\", \".yaml\", \".yml\", \".toml\"];\n\n// ============================================================================\n// Query Intent Detection\n// ============================================================================\n\n/** Query intent types */\nexport type QueryIntent = \"implementation\" | \"documentation\" | \"neutral\";\n\n/**\n * Detect query intent based on terms.\n * Returns: 'implementation' | 'documentation' | 'neutral'\n *\n * @param queryTerms - Array of query terms (lowercase)\n * @returns The detected intent\n */\nexport function detectQueryIntent(queryTerms: string[]): QueryIntent {\n const hasImplementationTerm = queryTerms.some((term) =>\n IMPLEMENTATION_TERMS.includes(term)\n );\n const hasDocumentationTerm = queryTerms.some((term) =>\n DOCUMENTATION_TERMS.includes(term)\n );\n\n // Documentation terms take precedence if both are present\n // (e.g., \"api documentation\" should favor docs)\n if (hasDocumentationTerm) {\n return \"documentation\";\n }\n\n if (hasImplementationTerm) {\n return \"implementation\";\n }\n\n return \"neutral\";\n}\n\n/**\n * Extract query terms from a search query.\n *\n * @param query - The search query string\n * @returns Array of lowercase terms (length > 2)\n */\nexport function extractQueryTerms(query: string): string[] {\n return query\n .toLowerCase()\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n}\n\n// ============================================================================\n// File Type Boosts\n// ============================================================================\n\n/**\n * Determine if a file is a source code file based on extension.\n */\nexport function isSourceCodeFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return SOURCE_CODE_EXTENSIONS.includes(ext);\n}\n\n/**\n * Determine if a file is a documentation file based on extension.\n */\nexport function isDocFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return DOC_EXTENSIONS.includes(ext);\n}\n\n/**\n * Determine if a file is a data/config file based on extension.\n */\nexport function isDataFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return DATA_EXTENSIONS.includes(ext);\n}\n\n/**\n * Calculate boost based on file type and query context.\n * Bidirectional: boosts code for implementation queries, docs for documentation queries.\n * Only applies when query intent is clear.\n *\n * @param filepath - The file path\n * @param queryTerms - Array of query terms (lowercase)\n * @returns Boost value (0 to ~0.1)\n */\nexport function calculateFileTypeBoost(\n filepath: string,\n queryTerms: string[]\n): number {\n const isSourceCode = isSourceCodeFile(filepath);\n const isDoc = isDocFile(filepath);\n\n const intent = detectQueryIntent(queryTerms);\n\n // For implementation-focused queries, boost source code\n if (intent === \"implementation\") {\n if (isSourceCode) {\n return 0.06; // Moderate boost for source code\n }\n // No penalty for docs - they might still be relevant\n return 0;\n }\n\n // For documentation-focused queries, boost documentation files\n if (intent === \"documentation\") {\n if (isDoc) {\n return 0.08; // Boost documentation files\n }\n // No penalty for code - they might still be relevant\n return 0;\n }\n\n // Neutral queries: no boost either way\n return 0;\n}\n",
@@ -31,7 +31,7 @@
31
31
  "/**\n * TypeScript/JavaScript Language Index Module\n *\n * Provides TypeScript/JavaScript-aware code search using:\n * - AST parsing via TypeScript Compiler API\n * - Local text embeddings for semantic similarity\n * - BM25 keyword matching for fast filtering\n *\n * Supported file types: .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts\n *\n * Index location: .raggrep/index/language/typescript/\n */\n\nimport * as path from \"path\";\nimport {\n IndexModule,\n IndexContext,\n SearchContext,\n SearchOptions,\n FileIndex,\n SearchResult,\n Chunk,\n ModuleConfig,\n ChunkType,\n} from \"../../../types\";\nimport {\n getEmbeddings,\n getEmbedding,\n configureEmbeddings,\n getEmbeddingConfig,\n} from \"../../../infrastructure/embeddings\";\nimport {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractKeywords,\n parsePathContext,\n formatPathContextForEmbedding,\n calculateFileTypeBoost,\n extractQueryTerms,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { parseTypeScriptCode, generateChunkId } from \"./parseCode\";\nimport { SymbolicIndex } from \"../../../infrastructure/storage\";\nimport type { EmbeddingConfig, Logger } from \"../../../domain/ports\";\nimport type { FileSummary } from \"../../../domain/entities\";\n\n/** Default minimum similarity score for search results */\nexport const DEFAULT_MIN_SCORE = 0.15;\n\n/** Default number of results to return */\nexport const DEFAULT_TOP_K = 10;\n\n/** Weight for semantic similarity in hybrid scoring (0-1) */\nconst SEMANTIC_WEIGHT = 0.7;\n\n/** Weight for BM25 keyword matching in hybrid scoring (0-1) */\nconst BM25_WEIGHT = 0.3;\n\n/** File extensions supported by this module */\nexport const TYPESCRIPT_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isTypeScriptFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return TYPESCRIPT_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isTypeScriptFile;\n\n/**\n * Calculate boost based on chunk type.\n * Function/class/interface chunks rank higher than generic blocks.\n */\nfunction calculateChunkTypeBoost(chunk: Chunk): number {\n switch (chunk.type) {\n case \"function\":\n return 0.05;\n case \"class\":\n case \"interface\":\n return 0.04;\n case \"type\":\n case \"enum\":\n return 0.03;\n case \"variable\":\n return 0.02;\n case \"file\":\n case \"block\":\n default:\n return 0;\n }\n}\n\n/**\n * Calculate boost for exported symbols.\n * Public APIs are more likely to be what users are searching for.\n */\nfunction calculateExportBoost(chunk: Chunk): number {\n return chunk.isExported ? 0.03 : 0;\n}\n\n/**\n * Module-specific data stored alongside file index\n */\nexport interface SemanticModuleData {\n embeddings: number[][];\n /** Store the model used for these embeddings for compatibility checking */\n embeddingModel: string;\n [key: string]: unknown; // Index signature for compatibility with Record<string, unknown>\n}\n\nexport class TypeScriptModule implements IndexModule {\n readonly id = \"language/typescript\";\n readonly name = \"TypeScript Search\";\n readonly description =\n \"TypeScript-aware code search with AST parsing and semantic embeddings\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isTypeScriptFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n // Extract embedding config from module options\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n\n // Extract logger from module options (passed from indexer)\n this.logger = config.options?.logger as Logger | undefined;\n\n // Add logger to embedding config\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n // Configure the embedding provider\n configureEmbeddings(this.embeddingConfig);\n\n // Clear pending summaries for fresh indexing\n this.pendingSummaries.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Only process TypeScript/JavaScript files\n if (!isTypeScriptFile(filepath)) {\n return null;\n }\n\n // Store rootDir for finalize\n this.rootDir = ctx.rootDir;\n\n // Parse code into chunks using TypeScript AST\n const parsedChunks = parseTypeScriptCode(content, filepath);\n\n if (parsedChunks.length === 0) {\n return null;\n }\n\n // Parse path context for structural awareness\n const pathContext = parsePathContext(filepath);\n const pathPrefix = formatPathContextForEmbedding(pathContext);\n\n // Generate embeddings for all chunks with path context\n // Prepending path context helps the embedding model understand file structure\n const chunkContents = parsedChunks.map((c) => {\n // For named chunks, include the name for better embedding\n const namePrefix = c.name ? `${c.name}: ` : \"\";\n return `${pathPrefix} ${namePrefix}${c.content}`;\n });\n const embeddings = await getEmbeddings(chunkContents);\n\n // Create chunks with all metadata\n const chunks: Chunk[] = parsedChunks.map((pc) => ({\n id: generateChunkId(filepath, pc.startLine, pc.endLine),\n content: pc.content,\n startLine: pc.startLine,\n endLine: pc.endLine,\n type: pc.type,\n name: pc.name,\n isExported: pc.isExported,\n jsDoc: pc.jsDoc,\n }));\n\n // Extract references (imports)\n const references = this.extractReferences(content, filepath);\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: SemanticModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n };\n\n // Build Tier 1 summary for this file\n const chunkTypes = [\n ...new Set(parsedChunks.map((pc) => pc.type)),\n ] as ChunkType[];\n const exports = parsedChunks\n .filter((pc) => pc.isExported && pc.name)\n .map((pc) => pc.name!);\n\n // Extract keywords from all chunks + path keywords\n const allKeywords = new Set<string>();\n for (const pc of parsedChunks) {\n const keywords = extractKeywords(pc.content, pc.name);\n keywords.forEach((k) => allKeywords.add(k));\n }\n // Add path keywords\n pathContext.keywords.forEach((k) => allKeywords.add(k));\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes,\n keywords: Array.from(allKeywords),\n exports,\n lastModified: stats.lastModified,\n // Include parsed path context for search boosting\n pathContext: {\n segments: pathContext.segments,\n layer: pathContext.layer,\n domain: pathContext.domain,\n depth: pathContext.depth,\n },\n };\n\n // Store summary for finalize\n this.pendingSummaries.set(filepath, fileSummary);\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n references,\n };\n }\n\n /**\n * Finalize indexing by building and saving the symbolic index\n */\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n // Initialize symbolic index\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n // Add all pending summaries\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFile(summary);\n }\n\n // Build BM25 index from summaries\n this.symbolicIndex.buildBM25Index();\n\n // Save to disk (creates symbolic/ folder with per-file summaries)\n await this.symbolicIndex.save();\n\n // Clear pending summaries\n this.pendingSummaries.clear();\n }\n\n /**\n * Search the semantic index for chunks matching the query.\n *\n * Uses a tiered approach for efficient search:\n * 1. Tier 1: Use BM25 on file summaries to find candidate files\n * 2. Tier 2: Load only candidate files and compute semantic similarity\n *\n * @param query - Natural language search query\n * @param ctx - Search context with index access\n * @param options - Search options (topK, minScore, filePatterns)\n * @returns Array of search results sorted by relevance\n */\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n // Load symbolic index for BM25 scoring (not filtering)\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n // Get ALL indexed files - semantic search needs to check all embeddings\n // BM25 contributes to the hybrid score but doesn't filter candidates\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n // Symbolic index doesn't exist, fall back to loading all files\n allFiles = await ctx.listIndexedFiles();\n }\n\n // Apply file pattern filter if specified\n let filesToSearch = allFiles;\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = allFiles.filter((filepath) => {\n return filePatterns.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const ext = pattern.slice(1);\n return filepath.endsWith(ext);\n }\n return filepath.includes(pattern);\n });\n });\n }\n\n // Get query embedding for semantic search\n const queryEmbedding = await getEmbedding(query);\n\n // Load all indexed files and compute scores\n // BM25 is used for keyword scoring, not filtering\n const bm25Index = new BM25Index();\n const allChunksData: Array<{\n filepath: string;\n chunk: Chunk;\n embedding: number[];\n }> = [];\n\n for (const filepath of filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as SemanticModuleData;\n if (!moduleData?.embeddings) continue;\n\n for (let i = 0; i < fileIndex.chunks.length; i++) {\n const chunk = fileIndex.chunks[i];\n const embedding = moduleData.embeddings[i];\n\n if (!embedding) continue;\n\n allChunksData.push({\n filepath: fileIndex.filepath,\n chunk,\n embedding,\n });\n\n // Add to BM25 index for chunk-level keyword matching\n bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\n // Perform BM25 search at chunk level\n const bm25Results = bm25Index.search(query, topK * 3);\n const bm25Scores = new Map<string, number>();\n\n for (const result of bm25Results) {\n bm25Scores.set(result.id, normalizeScore(result.score, 3));\n }\n\n // Extract query terms for path matching and intent detection\n const queryTerms = extractQueryTerms(query);\n\n // Build path boost map from file summaries\n const pathBoosts = new Map<string, number>();\n for (const filepath of filesToSearch) {\n const summary = symbolicIndex.getFileSummary(filepath);\n if (summary?.pathContext) {\n let boost = 0;\n const ctx = summary.pathContext;\n\n // Check if query terms match domain\n if (\n ctx.domain &&\n queryTerms.some(\n (t) => ctx.domain!.includes(t) || t.includes(ctx.domain!)\n )\n ) {\n boost += 0.1;\n }\n\n // Check if query terms match layer\n if (\n ctx.layer &&\n queryTerms.some(\n (t) => ctx.layer!.includes(t) || t.includes(ctx.layer!)\n )\n ) {\n boost += 0.05;\n }\n\n // Check if query terms match path segments\n const segmentMatch = ctx.segments.some((seg) =>\n queryTerms.some(\n (t) =>\n seg.toLowerCase().includes(t) || t.includes(seg.toLowerCase())\n )\n );\n if (segmentMatch) {\n boost += 0.05;\n }\n\n pathBoosts.set(filepath, boost);\n }\n }\n\n // Calculate hybrid scores for all chunks\n const results: SearchResult[] = [];\n\n for (const { filepath, chunk, embedding } of allChunksData) {\n const semanticScore = cosineSimilarity(queryEmbedding, embedding);\n const bm25Score = bm25Scores.get(chunk.id) || 0;\n const pathBoost = pathBoosts.get(filepath) || 0;\n\n // Additional boosts for ranking improvement\n const fileTypeBoost = calculateFileTypeBoost(filepath, queryTerms);\n const chunkTypeBoost = calculateChunkTypeBoost(chunk);\n const exportBoost = calculateExportBoost(chunk);\n const totalBoost =\n pathBoost + fileTypeBoost + chunkTypeBoost + exportBoost;\n\n // Hybrid score: weighted combination of semantic, BM25, and boosts\n const hybridScore =\n SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score + totalBoost;\n\n if (hybridScore >= minScore || bm25Score > 0.3) {\n results.push({\n filepath,\n chunk,\n score: hybridScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n pathBoost,\n fileTypeBoost,\n chunkTypeBoost,\n exportBoost,\n },\n });\n }\n }\n\n // Sort by score descending and take top K\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n\n private extractReferences(content: string, filepath: string): string[] {\n const references: string[] = [];\n\n // Extract import statements\n const importRegex = /import\\s+.*?\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n const requireRegex = /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const importPath = match[1];\n if (importPath.startsWith(\".\")) {\n const dir = path.dirname(filepath);\n const resolved = path.normalize(path.join(dir, importPath));\n references.push(resolved);\n }\n }\n\n while ((match = requireRegex.exec(content)) !== null) {\n const importPath = match[1];\n if (importPath.startsWith(\".\")) {\n const dir = path.dirname(filepath);\n const resolved = path.normalize(path.join(dir, importPath));\n references.push(resolved);\n }\n }\n\n return references;\n }\n}\n",
32
32
  "/**\n * JSON Data Index Module\n *\n * Provides JSON file search using:\n * - JSON structure parsing\n * - Local text embeddings for semantic similarity\n * - Key/value extraction for better search\n *\n * Supported file types: .json\n *\n * Index location: .raggrep/index/data/json/\n */\n\nimport * as path from \"path\";\nimport {\n IndexModule,\n IndexContext,\n SearchContext,\n SearchOptions,\n FileIndex,\n SearchResult,\n Chunk,\n ModuleConfig,\n} from \"../../../types\";\nimport {\n getEmbeddings,\n getEmbedding,\n configureEmbeddings,\n getEmbeddingConfig,\n} from \"../../../infrastructure/embeddings\";\nimport {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractQueryTerms,\n createLineBasedChunks,\n generateChunkId,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex } from \"../../../infrastructure/storage\";\nimport type { EmbeddingConfig, Logger } from \"../../../domain/ports\";\nimport type { FileSummary } from \"../../../domain/entities\";\n\n/** Default minimum similarity score for search results */\nexport const DEFAULT_MIN_SCORE = 0.15;\n\n/** Default number of results to return */\nexport const DEFAULT_TOP_K = 10;\n\n/** Weight for semantic similarity in hybrid scoring (0-1) */\nconst SEMANTIC_WEIGHT = 0.7;\n\n/** Weight for BM25 keyword matching in hybrid scoring (0-1) */\nconst BM25_WEIGHT = 0.3;\n\n/** File extensions supported by this module */\nexport const JSON_EXTENSIONS = [\".json\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isJsonFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return JSON_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isJsonFile;\n\n/**\n * Extract all keys from a JSON object recursively.\n */\nfunction extractJsonKeys(obj: unknown, prefix = \"\"): string[] {\n const keys: string[] = [];\n\n if (obj === null || obj === undefined) {\n return keys;\n }\n\n if (Array.isArray(obj)) {\n obj.forEach((item, index) => {\n keys.push(...extractJsonKeys(item, `${prefix}[${index}]`));\n });\n } else if (typeof obj === \"object\") {\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n keys.push(key);\n keys.push(...extractJsonKeys(value, fullKey));\n }\n }\n\n return keys;\n}\n\n/**\n * Extract keywords from JSON content for BM25 search.\n */\nfunction extractJsonKeywords(content: string): string[] {\n try {\n const parsed = JSON.parse(content);\n const keys = extractJsonKeys(parsed);\n\n // Also extract string values\n const stringValues: string[] = [];\n const extractStrings = (obj: unknown): void => {\n if (typeof obj === \"string\") {\n // Split camelCase and extract words\n const words = obj\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 2);\n stringValues.push(...words);\n } else if (Array.isArray(obj)) {\n obj.forEach(extractStrings);\n } else if (obj && typeof obj === \"object\") {\n Object.values(obj as Record<string, unknown>).forEach(extractStrings);\n }\n };\n extractStrings(parsed);\n\n return [...new Set([...keys, ...stringValues])];\n } catch {\n // If JSON parsing fails, return empty keywords\n return [];\n }\n}\n\n/**\n * Module-specific data stored alongside file index\n */\nexport interface JsonModuleData {\n embeddings: number[][];\n embeddingModel: string;\n jsonKeys: string[];\n [key: string]: unknown;\n}\n\nexport class JsonModule implements IndexModule {\n readonly id = \"data/json\";\n readonly name = \"JSON Search\";\n readonly description = \"JSON file search with structure-aware indexing\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isJsonFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Only process JSON files\n if (!isJsonFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Create chunks from JSON content\n const textChunks = createLineBasedChunks(content, {\n chunkSize: 50,\n overlap: 10,\n });\n\n if (textChunks.length === 0) {\n return null;\n }\n\n // Generate embeddings for chunks\n const chunkContents = textChunks.map((c) => {\n // Include file context in embedding\n const filename = path.basename(filepath);\n return `${filename}: ${c.content}`;\n });\n const embeddings = await getEmbeddings(chunkContents);\n\n // Create chunks with metadata\n const chunks: Chunk[] = textChunks.map((tc, i) => ({\n id: generateChunkId(filepath, tc.startLine, tc.endLine),\n content: tc.content,\n startLine: tc.startLine,\n endLine: tc.endLine,\n type: tc.type,\n }));\n\n // Extract JSON keys for metadata\n const jsonKeys = extractJsonKeys(\n (() => {\n try {\n return JSON.parse(content);\n } catch {\n return {};\n }\n })()\n );\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: JsonModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n jsonKeys,\n };\n\n // Build file summary\n const keywords = extractJsonKeywords(content);\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes: [\"file\"],\n keywords,\n exports: [], // JSON files don't have exports\n lastModified: stats.lastModified,\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFile(summary);\n }\n\n this.symbolicIndex.buildBM25Index();\n await this.symbolicIndex.save();\n this.pendingSummaries.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n // Filter to JSON files only\n let filesToSearch = allFiles.filter((f) => isJsonFile(f));\n\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = filesToSearch.filter((filepath) => {\n return filePatterns.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const ext = pattern.slice(1);\n return filepath.endsWith(ext);\n }\n return filepath.includes(pattern);\n });\n });\n }\n\n const queryEmbedding = await getEmbedding(query);\n const bm25Index = new BM25Index();\n const allChunksData: Array<{\n filepath: string;\n chunk: Chunk;\n embedding: number[];\n }> = [];\n\n for (const filepath of filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as JsonModuleData;\n if (!moduleData?.embeddings) continue;\n\n for (let i = 0; i < fileIndex.chunks.length; i++) {\n const chunk = fileIndex.chunks[i];\n const embedding = moduleData.embeddings[i];\n\n if (!embedding) continue;\n\n allChunksData.push({\n filepath: fileIndex.filepath,\n chunk,\n embedding,\n });\n\n bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\n const bm25Results = bm25Index.search(query, topK * 3);\n const bm25Scores = new Map<string, number>();\n\n for (const result of bm25Results) {\n bm25Scores.set(result.id, normalizeScore(result.score, 3));\n }\n\n const queryTerms = extractQueryTerms(query);\n const results: SearchResult[] = [];\n\n for (const { filepath, chunk, embedding } of allChunksData) {\n const semanticScore = cosineSimilarity(queryEmbedding, embedding);\n const bm25Score = bm25Scores.get(chunk.id) || 0;\n\n const hybridScore =\n SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score;\n\n if (hybridScore >= minScore || bm25Score > 0.3) {\n results.push({\n filepath,\n chunk,\n score: hybridScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n },\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n",
33
33
  "/**\n * Markdown Documentation Index Module\n *\n * Provides Markdown file search using:\n * - Heading-based section parsing\n * - Local text embeddings for semantic similarity\n * - Structure-aware chunking\n *\n * Supported file types: .md\n *\n * Index location: .raggrep/index/docs/markdown/\n */\n\nimport * as path from \"path\";\nimport {\n IndexModule,\n IndexContext,\n SearchContext,\n SearchOptions,\n FileIndex,\n SearchResult,\n Chunk,\n ModuleConfig,\n} from \"../../../types\";\nimport {\n getEmbeddings,\n getEmbedding,\n configureEmbeddings,\n getEmbeddingConfig,\n} from \"../../../infrastructure/embeddings\";\nimport {\n cosineSimilarity,\n BM25Index,\n normalizeScore,\n extractQueryTerms,\n generateChunkId,\n} from \"../../../domain/services\";\nimport {\n getEmbeddingConfigFromModule,\n getRaggrepDir,\n} from \"../../../infrastructure/config\";\nimport { SymbolicIndex } from \"../../../infrastructure/storage\";\nimport type { EmbeddingConfig, Logger } from \"../../../domain/ports\";\nimport type { FileSummary, ChunkType } from \"../../../domain/entities\";\n\n/** Default minimum similarity score for search results */\nexport const DEFAULT_MIN_SCORE = 0.15;\n\n/** Default number of results to return */\nexport const DEFAULT_TOP_K = 10;\n\n/** Weight for semantic similarity in hybrid scoring (0-1) */\nconst SEMANTIC_WEIGHT = 0.7;\n\n/** Weight for BM25 keyword matching in hybrid scoring (0-1) */\nconst BM25_WEIGHT = 0.3;\n\n/** File extensions supported by this module */\nexport const MARKDOWN_EXTENSIONS = [\".md\", \".txt\"];\n\n/**\n * Check if a file is supported by this module.\n */\nexport function isMarkdownFile(filepath: string): boolean {\n const ext = path.extname(filepath).toLowerCase();\n return MARKDOWN_EXTENSIONS.includes(ext);\n}\n\n// Re-export for module interface\nexport const supportsFile = isMarkdownFile;\n\n/**\n * Represents a parsed section from a Markdown document.\n */\ninterface MarkdownSection {\n /** The heading text (without #) */\n heading: string;\n /** The heading level (1-6) */\n level: number;\n /** The content under this heading */\n content: string;\n /** 1-based start line number */\n startLine: number;\n /** 1-based end line number */\n endLine: number;\n}\n\n/**\n * Parse Markdown content into sections based on headings.\n */\nfunction parseMarkdownSections(content: string): MarkdownSection[] {\n const lines = content.split(\"\\n\");\n const sections: MarkdownSection[] = [];\n\n let currentSection: MarkdownSection | null = null;\n let currentContent: string[] = [];\n let startLine = 1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n\n if (headingMatch) {\n // Save previous section\n if (currentSection) {\n currentSection.content = currentContent.join(\"\\n\").trim();\n currentSection.endLine = i; // Previous line\n if (currentSection.content || currentSection.heading) {\n sections.push(currentSection);\n }\n } else if (currentContent.length > 0) {\n // Content before first heading\n sections.push({\n heading: \"\",\n level: 0,\n content: currentContent.join(\"\\n\").trim(),\n startLine: 1,\n endLine: i,\n });\n }\n\n // Start new section\n currentSection = {\n heading: headingMatch[2],\n level: headingMatch[1].length,\n content: \"\",\n startLine: i + 1,\n endLine: lines.length,\n };\n currentContent = [];\n } else {\n currentContent.push(line);\n }\n }\n\n // Save final section\n if (currentSection) {\n currentSection.content = currentContent.join(\"\\n\").trim();\n currentSection.endLine = lines.length;\n if (currentSection.content || currentSection.heading) {\n sections.push(currentSection);\n }\n } else if (currentContent.length > 0) {\n // No headings at all\n sections.push({\n heading: \"\",\n level: 0,\n content: currentContent.join(\"\\n\").trim(),\n startLine: 1,\n endLine: lines.length,\n });\n }\n\n return sections;\n}\n\n/**\n * Extract keywords from Markdown content.\n */\nfunction extractMarkdownKeywords(content: string): string[] {\n const keywords: string[] = [];\n\n // Extract headings\n const headingMatches = content.matchAll(/^#{1,6}\\s+(.+)$/gm);\n for (const match of headingMatches) {\n const heading = match[1].toLowerCase();\n const words = heading.split(/\\s+/).filter((w) => w.length > 2);\n keywords.push(...words);\n }\n\n // Extract bold/emphasized text\n const emphasisMatches = content.matchAll(/\\*\\*(.+?)\\*\\*|\\*(.+?)\\*/g);\n for (const match of emphasisMatches) {\n const text = (match[1] || match[2] || \"\").toLowerCase();\n const words = text.split(/\\s+/).filter((w) => w.length > 2);\n keywords.push(...words);\n }\n\n // Extract code blocks (inline)\n const codeMatches = content.matchAll(/`([^`]+)`/g);\n for (const match of codeMatches) {\n const code = match[1].toLowerCase();\n if (code.length > 2 && code.length < 50) {\n keywords.push(code);\n }\n }\n\n // Extract links\n const linkMatches = content.matchAll(/\\[([^\\]]+)\\]/g);\n for (const match of linkMatches) {\n const text = match[1].toLowerCase();\n const words = text.split(/\\s+/).filter((w) => w.length > 2);\n keywords.push(...words);\n }\n\n return [...new Set(keywords)];\n}\n\n/**\n * Module-specific data stored alongside file index\n */\nexport interface MarkdownModuleData {\n embeddings: number[][];\n embeddingModel: string;\n headings: string[];\n [key: string]: unknown;\n}\n\nexport class MarkdownModule implements IndexModule {\n readonly id = \"docs/markdown\";\n readonly name = \"Markdown Search\";\n readonly description =\n \"Markdown documentation search with section-aware indexing\";\n readonly version = \"1.0.0\";\n\n supportsFile(filepath: string): boolean {\n return isMarkdownFile(filepath);\n }\n\n private embeddingConfig: EmbeddingConfig | null = null;\n private symbolicIndex: SymbolicIndex | null = null;\n private pendingSummaries: Map<string, FileSummary> = new Map();\n private rootDir: string = \"\";\n private logger: Logger | undefined = undefined;\n\n async initialize(config: ModuleConfig): Promise<void> {\n this.embeddingConfig = getEmbeddingConfigFromModule(config);\n this.logger = config.options?.logger as Logger | undefined;\n\n if (this.logger) {\n this.embeddingConfig = {\n ...this.embeddingConfig,\n logger: this.logger,\n };\n }\n\n configureEmbeddings(this.embeddingConfig);\n this.pendingSummaries.clear();\n }\n\n async indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null> {\n // Only process Markdown files\n if (!isMarkdownFile(filepath)) {\n return null;\n }\n\n this.rootDir = ctx.rootDir;\n\n // Parse Markdown into sections\n const sections = parseMarkdownSections(content);\n\n if (sections.length === 0) {\n return null;\n }\n\n // Generate embeddings for sections\n const chunkContents = sections.map((s) => {\n const filename = path.basename(filepath);\n const headingContext = s.heading ? `${s.heading}: ` : \"\";\n return `${filename} ${headingContext}${s.content}`;\n });\n const embeddings = await getEmbeddings(chunkContents);\n\n // Create chunks from sections\n const chunks: Chunk[] = sections.map((section, i) => ({\n id: generateChunkId(filepath, section.startLine, section.endLine),\n content: section.heading\n ? `## ${section.heading}\\n\\n${section.content}`\n : section.content,\n startLine: section.startLine,\n endLine: section.endLine,\n type: \"block\" as ChunkType,\n name: section.heading || undefined,\n }));\n\n // Extract headings for metadata\n const headings = sections.filter((s) => s.heading).map((s) => s.heading);\n\n const stats = await ctx.getFileStats(filepath);\n const currentConfig = getEmbeddingConfig();\n\n const moduleData: MarkdownModuleData = {\n embeddings,\n embeddingModel: currentConfig.model,\n headings,\n };\n\n // Build file summary\n const keywords = extractMarkdownKeywords(content);\n\n const fileSummary: FileSummary = {\n filepath,\n chunkCount: chunks.length,\n chunkTypes: [\"block\"],\n keywords,\n exports: headings, // Use headings as \"exports\" for searchability\n lastModified: stats.lastModified,\n };\n\n this.pendingSummaries.set(filepath, fileSummary);\n\n return {\n filepath,\n lastModified: stats.lastModified,\n chunks,\n moduleData,\n };\n }\n\n async finalize(ctx: IndexContext): Promise<void> {\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n\n this.symbolicIndex = new SymbolicIndex(indexDir, this.id);\n await this.symbolicIndex.initialize();\n\n for (const [filepath, summary] of this.pendingSummaries) {\n this.symbolicIndex.addFile(summary);\n }\n\n this.symbolicIndex.buildBM25Index();\n await this.symbolicIndex.save();\n this.pendingSummaries.clear();\n }\n\n async search(\n query: string,\n ctx: SearchContext,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const {\n topK = DEFAULT_TOP_K,\n minScore = DEFAULT_MIN_SCORE,\n filePatterns,\n } = options;\n\n const indexDir = getRaggrepDir(ctx.rootDir, ctx.config);\n const symbolicIndex = new SymbolicIndex(indexDir, this.id);\n\n let allFiles: string[];\n\n try {\n await symbolicIndex.initialize();\n allFiles = symbolicIndex.getAllFiles();\n } catch {\n allFiles = await ctx.listIndexedFiles();\n }\n\n // Filter to Markdown files only\n let filesToSearch = allFiles.filter((f) => isMarkdownFile(f));\n\n if (filePatterns && filePatterns.length > 0) {\n filesToSearch = filesToSearch.filter((filepath) => {\n return filePatterns.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const ext = pattern.slice(1);\n return filepath.endsWith(ext);\n }\n return filepath.includes(pattern);\n });\n });\n }\n\n const queryEmbedding = await getEmbedding(query);\n const bm25Index = new BM25Index();\n const allChunksData: Array<{\n filepath: string;\n chunk: Chunk;\n embedding: number[];\n }> = [];\n\n for (const filepath of filesToSearch) {\n const fileIndex = await ctx.loadFileIndex(filepath);\n if (!fileIndex) continue;\n\n const moduleData = fileIndex.moduleData as unknown as MarkdownModuleData;\n if (!moduleData?.embeddings) continue;\n\n for (let i = 0; i < fileIndex.chunks.length; i++) {\n const chunk = fileIndex.chunks[i];\n const embedding = moduleData.embeddings[i];\n\n if (!embedding) continue;\n\n allChunksData.push({\n filepath: fileIndex.filepath,\n chunk,\n embedding,\n });\n\n bm25Index.addDocuments([{ id: chunk.id, content: chunk.content }]);\n }\n }\n\n const bm25Results = bm25Index.search(query, topK * 3);\n const bm25Scores = new Map<string, number>();\n\n for (const result of bm25Results) {\n bm25Scores.set(result.id, normalizeScore(result.score, 3));\n }\n\n const queryTerms = extractQueryTerms(query);\n const results: SearchResult[] = [];\n\n for (const { filepath, chunk, embedding } of allChunksData) {\n const semanticScore = cosineSimilarity(queryEmbedding, embedding);\n const bm25Score = bm25Scores.get(chunk.id) || 0;\n\n // Documentation files get a small boost for documentation-intent queries\n let docBoost = 0;\n if (\n queryTerms.some((t) =>\n [\n \"docs\",\n \"documentation\",\n \"readme\",\n \"guide\",\n \"how\",\n \"what\",\n \"explain\",\n ].includes(t)\n )\n ) {\n docBoost = 0.05;\n }\n\n const hybridScore =\n SEMANTIC_WEIGHT * semanticScore + BM25_WEIGHT * bm25Score + docBoost;\n\n if (hybridScore >= minScore || bm25Score > 0.3) {\n results.push({\n filepath,\n chunk,\n score: hybridScore,\n moduleId: this.id,\n context: {\n semanticScore,\n bm25Score,\n docBoost,\n },\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n}\n",
34
- "// Main indexer - coordinates modules for indexing files\nimport { glob } from \"glob\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport {\n Config,\n IndexContext,\n IndexModule,\n ModuleManifest,\n GlobalManifest,\n FileIndex,\n} from \"../../types\";\nimport {\n DEFAULT_CONFIG,\n loadConfig,\n getModuleIndexPath,\n getModuleManifestPath,\n getGlobalManifestPath,\n getModuleConfig,\n getIndexLocation,\n getRaggrepDir,\n} from \"../../infrastructure/config\";\nimport { registry, registerBuiltInModules } from \"../../modules/registry\";\nimport type { EmbeddingModelName, Logger } from \"../../domain/ports\";\nimport { IntrospectionIndex } from \"../../infrastructure/introspection\";\nimport { createLogger, createSilentLogger } from \"../../infrastructure/logger\";\n\n// ============================================================================\n// Parallel Processing Utilities\n// ============================================================================\n\n/**\n * Process items in parallel with controlled concurrency.\n * Returns results in the same order as input items.\n *\n * @param items - Items to process\n * @param processor - Async function to process each item\n * @param concurrency - Maximum number of concurrent operations\n * @returns Array of results (or errors) in input order\n */\nasync function parallelMap<T, R>(\n items: T[],\n processor: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<\n Array<{ success: true; value: R } | { success: false; error: unknown }>\n> {\n const results: Array<\n { success: true; value: R } | { success: false; error: unknown }\n > = new Array(items.length);\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n const item = items[index];\n try {\n const value = await processor(item, index);\n results[index] = { success: true, value };\n } catch (error) {\n results[index] = { success: false, error };\n }\n }\n }\n\n // Start workers up to concurrency limit\n const workers = Array(Math.min(concurrency, items.length))\n .fill(null)\n .map(() => worker());\n\n await Promise.all(workers);\n return results;\n}\n\n/**\n * Current index schema version.\n * Increment this when making breaking changes to the index format.\n * This is separate from the package version to allow non-breaking updates.\n */\nconst INDEX_SCHEMA_VERSION = \"1.0.0\";\n\nexport interface IndexResult {\n moduleId: string;\n indexed: number;\n skipped: number;\n errors: number;\n /** Time taken in milliseconds */\n durationMs?: number;\n}\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n const seconds = ms / 1000;\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds.toFixed(1)}s`;\n}\n\n/**\n * Get optimal concurrency based on CPU specs.\n *\n * Uses the number of CPU cores with some considerations:\n * - Minimum: 2 (ensure some parallelism)\n * - Maximum: 16 (avoid diminishing returns / memory pressure)\n * - For embedding generation, we leave 1-2 cores free for the system\n *\n * @returns Optimal concurrency value\n */\nfunction getOptimalConcurrency(): number {\n const cpuCount = os.cpus().length;\n\n // Leave some cores for system/other processes\n // For 4 cores: use 3\n // For 8 cores: use 6\n // For 16+ cores: use 12-14\n const optimal = Math.max(2, Math.min(16, Math.floor(cpuCount * 0.75)));\n\n return optimal;\n}\n\n/** Default concurrency for parallel file processing (dynamic based on CPU) */\nconst DEFAULT_CONCURRENCY = getOptimalConcurrency();\n\nexport interface IndexOptions {\n /** Override the embedding model (semantic module) */\n model?: EmbeddingModelName;\n /** Show detailed progress */\n verbose?: boolean;\n /** Suppress most output (for use during query) */\n quiet?: boolean;\n /** Logger for progress reporting. If not provided, uses console by default (quiet mode uses silent logger) */\n logger?: Logger;\n /** Number of files to process in parallel (default: auto based on CPU cores) */\n concurrency?: number;\n}\n\nexport interface EnsureFreshResult {\n /** Number of files indexed (new or modified) */\n indexed: number;\n /** Number of stale entries removed (deleted files) */\n removed: number;\n /** Number of files unchanged (used cache) */\n unchanged: number;\n}\n\nexport interface CleanupResult {\n moduleId: string;\n /** Number of stale entries removed */\n removed: number;\n /** Number of valid entries kept */\n kept: number;\n}\n\nexport interface IndexStatus {\n /** Whether an index exists */\n exists: boolean;\n /** Root directory path */\n rootDir: string;\n /** Index directory path */\n indexDir: string;\n /** Last time the index was updated */\n lastUpdated?: string;\n /** Active modules and their file counts */\n modules: Array<{\n id: string;\n fileCount: number;\n lastUpdated: string;\n }>;\n /** Total number of indexed files */\n totalFiles: number;\n}\n\n/**\n * Index a directory using all enabled modules\n */\nexport async function indexDirectory(\n rootDir: string,\n options: IndexOptions = {}\n): Promise<IndexResult[]> {\n const verbose = options.verbose ?? false;\n const quiet = options.quiet ?? false;\n const concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n\n // Create logger based on options\n const logger: Logger = options.logger\n ? options.logger\n : quiet\n ? createSilentLogger()\n : createLogger({ verbose });\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Show index location\n const location = getIndexLocation(rootDir);\n logger.info(`Indexing directory: ${rootDir}`);\n logger.info(`Index location: ${location.indexDir}`);\n logger.debug(`Concurrency: ${concurrency}`);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Initialize introspection\n const introspection = new IntrospectionIndex(rootDir);\n await introspection.initialize();\n const structure = introspection.getStructure();\n if (structure?.isMonorepo) {\n logger.debug(\n `Detected monorepo with ${structure.projects.length} projects`\n );\n }\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n logger.info(\"No modules enabled. Check your configuration.\");\n return [];\n }\n\n logger.info(`Enabled modules: ${enabledModules.map((m) => m.id).join(\", \")}`);\n\n // Get all files matching extensions\n const files = await findFiles(rootDir, config);\n logger.info(`Found ${files.length} files to index`);\n\n // Track overall timing\n const overallStart = Date.now();\n\n // Index with each module\n const results: IndexResult[] = [];\n\n for (const module of enabledModules) {\n const moduleStart = Date.now();\n logger.info(`\\n[${module.name}] Starting indexing...`);\n\n // Initialize module if needed\n const moduleConfig = getModuleConfig(config, module.id);\n if (module.initialize && moduleConfig) {\n // Apply CLI overrides to module config, including logger\n const configWithOverrides = { ...moduleConfig };\n if (options.model && module.id === \"language/typescript\") {\n configWithOverrides.options = {\n ...configWithOverrides.options,\n embeddingModel: options.model,\n };\n }\n // Pass logger to module via options\n configWithOverrides.options = {\n ...configWithOverrides.options,\n logger,\n };\n await module.initialize(configWithOverrides);\n }\n\n // Pre-filter files that this module supports\n const moduleFiles = module.supportsFile\n ? files.filter((f) => module.supportsFile!(f))\n : files;\n\n logger.info(` Processing ${moduleFiles.length} files...`);\n\n const result = await indexWithModule(\n rootDir,\n moduleFiles,\n module,\n config,\n verbose,\n introspection,\n logger,\n concurrency\n );\n results.push(result);\n\n // Call finalize to build secondary indexes (Tier 1, BM25, etc.)\n if (module.finalize) {\n logger.info(`[${module.name}] Building secondary indexes...`);\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n return fs.readFile(fullPath, \"utf-8\");\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n };\n await module.finalize(ctx);\n }\n\n const moduleDuration = Date.now() - moduleStart;\n result.durationMs = moduleDuration;\n\n logger.info(\n `[${module.name}] Complete: ${result.indexed} indexed, ${\n result.skipped\n } skipped, ${result.errors} errors (${formatDuration(moduleDuration)})`\n );\n }\n\n // Save introspection data\n await introspection.save(config);\n\n // Log overall timing\n const overallDuration = Date.now() - overallStart;\n logger.info(`\\nIndexing complete in ${formatDuration(overallDuration)}`);\n\n // Log summary\n const totalIndexed = results.reduce((sum, r) => sum + r.indexed, 0);\n const totalSkipped = results.reduce((sum, r) => sum + r.skipped, 0);\n const totalErrors = results.reduce((sum, r) => sum + r.errors, 0);\n logger.info(\n `Total: ${totalIndexed} indexed, ${totalSkipped} skipped, ${totalErrors} errors`\n );\n\n // Update global manifest\n await updateGlobalManifest(rootDir, enabledModules, config);\n\n return results;\n}\n\n/**\n * Check if the existing index version is compatible with the current schema.\n * Returns true if compatible, false if needs rebuild.\n */\nasync function isIndexVersionCompatible(rootDir: string): Promise<boolean> {\n const config = await loadConfig(rootDir);\n const globalManifestPath = getGlobalManifestPath(rootDir, config);\n\n try {\n const content = await fs.readFile(globalManifestPath, \"utf-8\");\n const manifest: GlobalManifest = JSON.parse(content);\n\n // Check if version matches current schema version\n return manifest.version === INDEX_SCHEMA_VERSION;\n } catch {\n // Can't read manifest - treat as incompatible\n return false;\n }\n}\n\n/**\n * Delete the entire index directory to allow a clean rebuild.\n */\nasync function deleteIndex(rootDir: string): Promise<void> {\n const indexDir = getRaggrepDir(rootDir);\n\n try {\n await fs.rm(indexDir, { recursive: true, force: true });\n } catch {\n // Directory may not exist, that's okay\n }\n}\n\n/**\n * Result of a reset operation\n */\nexport interface ResetResult {\n /** Whether the reset was successful */\n success: boolean;\n /** The index directory that was removed */\n indexDir: string;\n}\n\n/**\n * Reset (delete) the index for a directory.\n *\n * @param rootDir - Root directory of the project\n * @returns ResetResult with success status\n * @throws Error if no index exists\n */\nexport async function resetIndex(rootDir: string): Promise<ResetResult> {\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Check if index exists\n const status = await getIndexStatus(rootDir);\n\n if (!status.exists) {\n throw new Error(`No index found for ${rootDir}`);\n }\n\n // Delete the index\n await deleteIndex(rootDir);\n\n return {\n success: true,\n indexDir: status.indexDir,\n };\n}\n\n/**\n * Ensure the index is fresh by checking for changes and updating incrementally.\n * This function is designed to be called before search to transparently manage the index.\n *\n * - If no index exists, creates a full index\n * - If index version is incompatible, rebuilds from scratch\n * - If files have changed, re-indexes only the modified files\n * - If files have been deleted, removes stale entries\n * - If nothing changed, returns immediately (uses cache)\n *\n * @param rootDir - Root directory of the project\n * @param options - Index options\n * @returns Statistics about what was updated\n */\nexport async function ensureIndexFresh(\n rootDir: string,\n options: IndexOptions = {}\n): Promise<EnsureFreshResult> {\n const verbose = options.verbose ?? false;\n const quiet = options.quiet ?? false;\n\n // Create logger based on options\n const logger: Logger = options.logger\n ? options.logger\n : quiet\n ? createSilentLogger()\n : createLogger({ verbose });\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Check if index exists\n const status = await getIndexStatus(rootDir);\n\n if (!status.exists) {\n // No index exists - do full indexing\n logger.info(\"No index found. Creating index...\\n\");\n const results = await indexDirectory(rootDir, { ...options, logger });\n const totalIndexed = results.reduce((sum, r) => sum + r.indexed, 0);\n return { indexed: totalIndexed, removed: 0, unchanged: 0 };\n }\n\n // Index exists - check if version is compatible\n const versionCompatible = await isIndexVersionCompatible(rootDir);\n if (!versionCompatible) {\n // Incompatible index version - delete and rebuild\n logger.info(\"Index version incompatible. Rebuilding...\\n\");\n await deleteIndex(rootDir);\n const results = await indexDirectory(rootDir, { ...options, logger });\n const totalIndexed = results.reduce((sum, r) => sum + r.indexed, 0);\n return { indexed: totalIndexed, removed: 0, unchanged: 0 };\n }\n\n // Index exists and is compatible - check for changes incrementally\n const config = await loadConfig(rootDir);\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n return { indexed: 0, removed: 0, unchanged: 0 };\n }\n\n // Initialize introspection\n const introspection = new IntrospectionIndex(rootDir);\n await introspection.initialize();\n\n // Get all current files\n const currentFiles = await findFiles(rootDir, config);\n const currentFileSet = new Set(\n currentFiles.map((f) => path.relative(rootDir, f))\n );\n\n let totalIndexed = 0;\n let totalRemoved = 0;\n let totalUnchanged = 0;\n\n for (const module of enabledModules) {\n // Initialize module if needed\n const moduleConfig = getModuleConfig(config, module.id);\n if (module.initialize && moduleConfig) {\n const configWithOverrides = { ...moduleConfig };\n if (options.model && module.id === \"language/typescript\") {\n configWithOverrides.options = {\n ...configWithOverrides.options,\n embeddingModel: options.model,\n };\n }\n // Pass logger to module\n configWithOverrides.options = {\n ...configWithOverrides.options,\n logger,\n };\n await module.initialize(configWithOverrides);\n }\n\n // Load manifest\n const manifest = await loadModuleManifest(rootDir, module.id, config);\n const indexPath = getModuleIndexPath(rootDir, module.id, config);\n\n // Find files to remove (in manifest but not on disk)\n const filesToRemove: string[] = [];\n for (const filepath of Object.keys(manifest.files)) {\n if (!currentFileSet.has(filepath)) {\n filesToRemove.push(filepath);\n }\n }\n\n // Remove stale entries\n for (const filepath of filesToRemove) {\n logger.debug(` Removing stale: ${filepath}`);\n // Remove main index file\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(indexFilePath);\n } catch {\n // Index file may not exist\n }\n // Remove symbolic index file\n const symbolicFilePath = path.join(\n indexPath,\n \"symbolic\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(symbolicFilePath);\n } catch {\n // Symbolic file may not exist\n }\n delete manifest.files[filepath];\n totalRemoved++;\n }\n\n // Index new/modified files\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n return fs.readFile(fullPath, \"utf-8\");\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n getIntrospection: (filepath: string) => introspection.getFile(filepath),\n };\n\n const totalFiles = currentFiles.length;\n for (let i = 0; i < currentFiles.length; i++) {\n const filepath = currentFiles[i];\n const relativePath = path.relative(rootDir, filepath);\n const progress = `[${i + 1}/${totalFiles}]`;\n\n try {\n const stats = await fs.stat(filepath);\n const lastModified = stats.mtime.toISOString();\n\n // Check if file needs re-indexing\n const existingEntry = manifest.files[relativePath];\n if (existingEntry && existingEntry.lastModified === lastModified) {\n totalUnchanged++;\n continue;\n }\n\n // File is new or modified - index it\n logger.progress(` ${progress} Indexing: ${relativePath}`);\n\n const content = await fs.readFile(filepath, \"utf-8\");\n introspection.addFile(relativePath, content);\n\n const fileIndex = await module.indexFile(relativePath, content, ctx);\n\n if (fileIndex) {\n await writeFileIndex(\n rootDir,\n module.id,\n relativePath,\n fileIndex,\n config\n );\n manifest.files[relativePath] = {\n lastModified,\n chunkCount: fileIndex.chunks.length,\n };\n totalIndexed++;\n }\n } catch (error) {\n logger.clearProgress();\n logger.error(` ${progress} Error indexing ${relativePath}: ${error}`);\n }\n }\n\n // Clear progress line\n logger.clearProgress();\n\n // Update manifest if there were changes\n if (totalIndexed > 0 || totalRemoved > 0) {\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, module.id, manifest, config);\n\n // Call finalize to rebuild secondary indexes\n if (module.finalize) {\n await module.finalize(ctx);\n }\n }\n\n // Clean up empty directories\n if (totalRemoved > 0) {\n await cleanupEmptyDirectories(indexPath);\n }\n }\n\n // Save introspection if there were changes\n if (totalIndexed > 0) {\n await introspection.save(config);\n }\n\n // Update global manifest if needed\n if (totalIndexed > 0 || totalRemoved > 0) {\n await updateGlobalManifest(rootDir, enabledModules, config);\n }\n\n return {\n indexed: totalIndexed,\n removed: totalRemoved,\n unchanged: totalUnchanged,\n };\n}\n\n/**\n * Result of processing a single file\n */\ninterface FileProcessResult {\n relativePath: string;\n status: \"indexed\" | \"skipped\" | \"error\";\n lastModified?: string;\n chunkCount?: number;\n error?: unknown;\n}\n\n/**\n * Index files with a specific module using parallel processing\n */\nasync function indexWithModule(\n rootDir: string,\n files: string[],\n module: IndexModule,\n config: Config,\n verbose: boolean,\n introspection: IntrospectionIndex,\n logger: Logger,\n concurrency: number = DEFAULT_CONCURRENCY\n): Promise<IndexResult> {\n const result: IndexResult = {\n moduleId: module.id,\n indexed: 0,\n skipped: 0,\n errors: 0,\n };\n\n // Load existing manifest for this module\n const manifest = await loadModuleManifest(rootDir, module.id, config);\n const indexPath = getModuleIndexPath(rootDir, module.id, config);\n\n // Build set of current files for quick lookup\n const currentFileSet = new Set(files.map((f) => path.relative(rootDir, f)));\n\n // Clean up stale entries (files in manifest but no longer on disk)\n const filesToRemove: string[] = [];\n for (const filepath of Object.keys(manifest.files)) {\n if (!currentFileSet.has(filepath)) {\n filesToRemove.push(filepath);\n }\n }\n\n if (filesToRemove.length > 0) {\n logger.info(` Removing ${filesToRemove.length} stale entries...`);\n for (const filepath of filesToRemove) {\n logger.debug(` Removing: ${filepath}`);\n // Remove main index file\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(indexFilePath);\n } catch {\n // Index file may not exist\n }\n // Remove symbolic index file\n const symbolicFilePath = path.join(\n indexPath,\n \"symbolic\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(symbolicFilePath);\n } catch {\n // Symbolic file may not exist\n }\n delete manifest.files[filepath];\n }\n // Clean up empty directories\n await cleanupEmptyDirectories(indexPath);\n }\n\n // Create index context\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n return fs.readFile(fullPath, \"utf-8\");\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n getIntrospection: (filepath: string) => introspection.getFile(filepath),\n };\n\n const totalFiles = files.length;\n\n // Track progress across parallel operations\n let completedCount = 0;\n\n // Process files in parallel with concurrency control\n const processFile = async (\n filepath: string,\n _index: number\n ): Promise<FileProcessResult> => {\n const relativePath = path.relative(rootDir, filepath);\n\n try {\n const stats = await fs.stat(filepath);\n const lastModified = stats.mtime.toISOString();\n\n // Check if file needs re-indexing\n const existingEntry = manifest.files[relativePath];\n if (existingEntry && existingEntry.lastModified === lastModified) {\n completedCount++;\n logger.debug(\n ` [${completedCount}/${totalFiles}] Skipped ${relativePath} (unchanged)`\n );\n return { relativePath, status: \"skipped\" };\n }\n\n // Read and index file\n const content = await fs.readFile(filepath, \"utf-8\");\n\n // Add introspection for this file (thread-safe - just adds to a Map)\n introspection.addFile(relativePath, content);\n\n // Update progress\n completedCount++;\n logger.progress(\n ` [${completedCount}/${totalFiles}] Processing: ${relativePath}`\n );\n\n const fileIndex = await module.indexFile(relativePath, content, ctx);\n\n if (!fileIndex) {\n logger.debug(\n ` [${completedCount}/${totalFiles}] Skipped ${relativePath} (no chunks)`\n );\n return { relativePath, status: \"skipped\" };\n }\n\n // Write index file\n await writeFileIndex(rootDir, module.id, relativePath, fileIndex, config);\n\n return {\n relativePath,\n status: \"indexed\",\n lastModified,\n chunkCount: fileIndex.chunks.length,\n };\n } catch (error) {\n completedCount++;\n return { relativePath, status: \"error\", error };\n }\n };\n\n // Run parallel processing\n logger.debug(` Using concurrency: ${concurrency}`);\n const results = await parallelMap(files, processFile, concurrency);\n\n // Clear progress line\n logger.clearProgress();\n\n // Process results and update manifest\n for (const item of results) {\n if (!item.success) {\n // This shouldn't happen as we catch errors in processFile\n result.errors++;\n continue;\n }\n\n const fileResult = item.value;\n switch (fileResult.status) {\n case \"indexed\":\n manifest.files[fileResult.relativePath] = {\n lastModified: fileResult.lastModified!,\n chunkCount: fileResult.chunkCount!,\n };\n result.indexed++;\n break;\n case \"skipped\":\n result.skipped++;\n break;\n case \"error\":\n logger.error(\n ` Error indexing ${fileResult.relativePath}: ${fileResult.error}`\n );\n result.errors++;\n break;\n }\n }\n\n // Update manifest\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, module.id, manifest, config);\n\n return result;\n}\n\nasync function findFiles(rootDir: string, config: Config): Promise<string[]> {\n const patterns = config.extensions.map((ext) => `**/*${ext}`);\n const ignorePatterns = config.ignorePaths.map((p) => `**/${p}/**`);\n\n const files: string[] = [];\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: rootDir,\n absolute: true,\n ignore: ignorePatterns,\n });\n files.push(...matches);\n }\n\n return [...new Set(files)]; // Remove duplicates\n}\n\nasync function loadModuleManifest(\n rootDir: string,\n moduleId: string,\n config: Config\n): Promise<ModuleManifest> {\n const manifestPath = getModuleManifestPath(rootDir, moduleId, config);\n\n try {\n const content = await fs.readFile(manifestPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return {\n moduleId,\n version: \"1.0.0\",\n lastUpdated: new Date().toISOString(),\n files: {},\n };\n }\n}\n\nasync function writeModuleManifest(\n rootDir: string,\n moduleId: string,\n manifest: ModuleManifest,\n config: Config\n): Promise<void> {\n const manifestPath = getModuleManifestPath(rootDir, moduleId, config);\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\nasync function writeFileIndex(\n rootDir: string,\n moduleId: string,\n filepath: string,\n fileIndex: FileIndex,\n config: Config\n): Promise<void> {\n const indexPath = getModuleIndexPath(rootDir, moduleId, config);\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n\n await fs.mkdir(path.dirname(indexFilePath), { recursive: true });\n await fs.writeFile(indexFilePath, JSON.stringify(fileIndex, null, 2));\n}\n\nasync function updateGlobalManifest(\n rootDir: string,\n modules: IndexModule[],\n config: Config\n): Promise<void> {\n const manifestPath = getGlobalManifestPath(rootDir, config);\n\n const manifest: GlobalManifest = {\n version: INDEX_SCHEMA_VERSION,\n lastUpdated: new Date().toISOString(),\n modules: modules.map((m) => m.id),\n };\n\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Options for cleanup operation\n */\nexport interface CleanupOptions {\n /** Show detailed progress */\n verbose?: boolean;\n /** Logger for progress reporting */\n logger?: Logger;\n}\n\n/**\n * Clean up stale index entries for files that no longer exist\n * @param rootDir - Root directory of the project\n * @param options - Cleanup options\n * @returns Array of cleanup results per module\n */\nexport async function cleanupIndex(\n rootDir: string,\n options: CleanupOptions = {}\n): Promise<CleanupResult[]> {\n const verbose = options.verbose ?? false;\n\n // Create logger\n const logger: Logger = options.logger ?? createLogger({ verbose });\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n logger.info(`Cleaning up index in: ${rootDir}`);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n logger.info(\"No modules enabled.\");\n return [];\n }\n\n const results: CleanupResult[] = [];\n\n for (const module of enabledModules) {\n logger.info(`\\n[${module.name}] Checking for stale entries...`);\n\n const result = await cleanupModuleIndex(rootDir, module.id, config, logger);\n results.push(result);\n\n logger.info(\n `[${module.name}] Removed ${result.removed} stale entries, kept ${result.kept} valid entries`\n );\n }\n\n return results;\n}\n\n/**\n * Clean up stale index entries for a specific module\n */\nasync function cleanupModuleIndex(\n rootDir: string,\n moduleId: string,\n config: Config,\n logger: Logger\n): Promise<CleanupResult> {\n const result: CleanupResult = {\n moduleId,\n removed: 0,\n kept: 0,\n };\n\n // Load manifest\n const manifest = await loadModuleManifest(rootDir, moduleId, config);\n const indexPath = getModuleIndexPath(rootDir, moduleId, config);\n\n const filesToRemove: string[] = [];\n const updatedFiles: ModuleManifest[\"files\"] = {};\n\n // Check each indexed file\n for (const [filepath, entry] of Object.entries(manifest.files)) {\n const fullPath = path.join(rootDir, filepath);\n\n try {\n await fs.access(fullPath);\n // File exists, keep it\n updatedFiles[filepath] = entry;\n result.kept++;\n } catch {\n // File doesn't exist, mark for removal\n filesToRemove.push(filepath);\n result.removed++;\n logger.debug(` Removing stale entry: ${filepath}`);\n }\n }\n\n // Remove stale index files\n for (const filepath of filesToRemove) {\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(indexFilePath);\n } catch {\n // Index file may not exist, that's okay\n }\n }\n\n // Update manifest with only valid files\n manifest.files = updatedFiles;\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, moduleId, manifest, config);\n\n // Clean up empty directories in the index\n await cleanupEmptyDirectories(indexPath);\n\n return result;\n}\n\n/**\n * Recursively remove empty directories\n */\nasync function cleanupEmptyDirectories(dir: string): Promise<boolean> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n // Process subdirectories first\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subDir = path.join(dir, entry.name);\n await cleanupEmptyDirectories(subDir);\n }\n }\n\n // Check if directory is now empty (re-read after potential subdirectory removal)\n const remainingEntries = await fs.readdir(dir);\n\n // Don't remove the root index directory or manifest files\n if (remainingEntries.length === 0) {\n await fs.rmdir(dir);\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the current status of the index\n * @param rootDir - Root directory of the project\n * @returns Index status information\n */\nexport async function getIndexStatus(rootDir: string): Promise<IndexStatus> {\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Get index location (now in temp directory)\n const location = getIndexLocation(rootDir);\n const indexDir = location.indexDir;\n\n const status: IndexStatus = {\n exists: false,\n rootDir,\n indexDir,\n modules: [],\n totalFiles: 0,\n };\n\n // Check if index directory exists\n try {\n await fs.access(indexDir);\n } catch {\n return status;\n }\n\n // Try to load global manifest\n try {\n const globalManifestPath = getGlobalManifestPath(rootDir, config);\n const content = await fs.readFile(globalManifestPath, \"utf-8\");\n const globalManifest: GlobalManifest = JSON.parse(content);\n\n status.exists = true;\n status.lastUpdated = globalManifest.lastUpdated;\n\n // Load each module's manifest\n for (const moduleId of globalManifest.modules) {\n try {\n const manifest = await loadModuleManifest(rootDir, moduleId, config);\n const fileCount = Object.keys(manifest.files).length;\n\n status.modules.push({\n id: moduleId,\n fileCount,\n lastUpdated: manifest.lastUpdated,\n });\n\n status.totalFiles += fileCount;\n } catch {\n // Module manifest doesn't exist or is corrupt\n }\n }\n } catch {\n // Global manifest doesn't exist - check if there's any index data\n try {\n const entries = await fs.readdir(path.join(indexDir, \"index\"));\n if (entries.length > 0) {\n status.exists = true;\n // Try to load manifests for known modules\n for (const entry of entries) {\n try {\n const manifest = await loadModuleManifest(rootDir, entry, config);\n const fileCount = Object.keys(manifest.files).length;\n\n status.modules.push({\n id: entry,\n fileCount,\n lastUpdated: manifest.lastUpdated,\n });\n\n status.totalFiles += fileCount;\n } catch {\n // Skip\n }\n }\n }\n } catch {\n // No index directory\n }\n }\n\n return status;\n}\n\n// Re-export watcher\nexport { watchDirectory, type WatchOptions, type FileWatcher } from \"./watcher\";\n",
34
+ "// Main indexer - coordinates modules for indexing files\nimport { glob } from \"glob\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport {\n Config,\n IndexContext,\n IndexModule,\n ModuleManifest,\n GlobalManifest,\n FileIndex,\n} from \"../../types\";\nimport {\n DEFAULT_CONFIG,\n loadConfig,\n getModuleIndexPath,\n getModuleManifestPath,\n getGlobalManifestPath,\n getModuleConfig,\n getIndexLocation,\n getRaggrepDir,\n} from \"../../infrastructure/config\";\nimport { registry, registerBuiltInModules } from \"../../modules/registry\";\nimport type { EmbeddingModelName, Logger } from \"../../domain/ports\";\nimport { IntrospectionIndex } from \"../../infrastructure/introspection\";\nimport { createLogger, createSilentLogger } from \"../../infrastructure/logger\";\n\n// ============================================================================\n// Parallel Processing Utilities\n// ============================================================================\n\n/**\n * Process items in parallel with controlled concurrency.\n * Returns results in the same order as input items.\n *\n * @param items - Items to process\n * @param processor - Async function to process each item\n * @param concurrency - Maximum number of concurrent operations\n * @returns Array of results (or errors) in input order\n */\nasync function parallelMap<T, R>(\n items: T[],\n processor: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<\n Array<{ success: true; value: R } | { success: false; error: unknown }>\n> {\n const results: Array<\n { success: true; value: R } | { success: false; error: unknown }\n > = new Array(items.length);\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n const item = items[index];\n try {\n const value = await processor(item, index);\n results[index] = { success: true, value };\n } catch (error) {\n results[index] = { success: false, error };\n }\n }\n }\n\n // Start workers up to concurrency limit\n const workers = Array(Math.min(concurrency, items.length))\n .fill(null)\n .map(() => worker());\n\n await Promise.all(workers);\n return results;\n}\n\n/**\n * Current index schema version.\n * Increment this when making breaking changes to the index format.\n * This is separate from the package version to allow non-breaking updates.\n *\n * History:\n * - 1.0.0: Initial version\n * - 1.1.0: Changed default embedding model to bge-small-en-v1.5, added nomic-embed-text-v1.5\n */\nconst INDEX_SCHEMA_VERSION = \"1.1.0\";\n\nexport interface IndexResult {\n moduleId: string;\n indexed: number;\n skipped: number;\n errors: number;\n /** Time taken in milliseconds */\n durationMs?: number;\n}\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n const seconds = ms / 1000;\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds.toFixed(1)}s`;\n}\n\n/**\n * Get optimal concurrency based on CPU specs.\n *\n * Uses the number of CPU cores with some considerations:\n * - Minimum: 2 (ensure some parallelism)\n * - Maximum: 16 (avoid diminishing returns / memory pressure)\n * - For embedding generation, we leave 1-2 cores free for the system\n *\n * @returns Optimal concurrency value\n */\nfunction getOptimalConcurrency(): number {\n const cpuCount = os.cpus().length;\n\n // Leave some cores for system/other processes\n // For 4 cores: use 3\n // For 8 cores: use 6\n // For 16+ cores: use 12-14\n const optimal = Math.max(2, Math.min(16, Math.floor(cpuCount * 0.75)));\n\n return optimal;\n}\n\n/** Default concurrency for parallel file processing (dynamic based on CPU) */\nconst DEFAULT_CONCURRENCY = getOptimalConcurrency();\n\nexport interface IndexOptions {\n /** Override the embedding model (semantic module) */\n model?: EmbeddingModelName;\n /** Show detailed progress */\n verbose?: boolean;\n /** Suppress most output (for use during query) */\n quiet?: boolean;\n /** Logger for progress reporting. If not provided, uses console by default (quiet mode uses silent logger) */\n logger?: Logger;\n /** Number of files to process in parallel (default: auto based on CPU cores) */\n concurrency?: number;\n}\n\nexport interface EnsureFreshResult {\n /** Number of files indexed (new or modified) */\n indexed: number;\n /** Number of stale entries removed (deleted files) */\n removed: number;\n /** Number of files unchanged (used cache) */\n unchanged: number;\n}\n\nexport interface CleanupResult {\n moduleId: string;\n /** Number of stale entries removed */\n removed: number;\n /** Number of valid entries kept */\n kept: number;\n}\n\nexport interface IndexStatus {\n /** Whether an index exists */\n exists: boolean;\n /** Root directory path */\n rootDir: string;\n /** Index directory path */\n indexDir: string;\n /** Last time the index was updated */\n lastUpdated?: string;\n /** Active modules and their file counts */\n modules: Array<{\n id: string;\n fileCount: number;\n lastUpdated: string;\n }>;\n /** Total number of indexed files */\n totalFiles: number;\n}\n\n/**\n * Index a directory using all enabled modules\n */\nexport async function indexDirectory(\n rootDir: string,\n options: IndexOptions = {}\n): Promise<IndexResult[]> {\n const verbose = options.verbose ?? false;\n const quiet = options.quiet ?? false;\n const concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n\n // Create logger based on options\n const logger: Logger = options.logger\n ? options.logger\n : quiet\n ? createSilentLogger()\n : createLogger({ verbose });\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Show index location\n const location = getIndexLocation(rootDir);\n logger.info(`Indexing directory: ${rootDir}`);\n logger.info(`Index location: ${location.indexDir}`);\n logger.debug(`Concurrency: ${concurrency}`);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Initialize introspection\n const introspection = new IntrospectionIndex(rootDir);\n await introspection.initialize();\n const structure = introspection.getStructure();\n if (structure?.isMonorepo) {\n logger.debug(\n `Detected monorepo with ${structure.projects.length} projects`\n );\n }\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n logger.info(\"No modules enabled. Check your configuration.\");\n return [];\n }\n\n logger.info(`Enabled modules: ${enabledModules.map((m) => m.id).join(\", \")}`);\n\n // Get all files matching extensions\n const files = await findFiles(rootDir, config);\n logger.info(`Found ${files.length} files to index`);\n\n // Track overall timing\n const overallStart = Date.now();\n\n // Index with each module\n const results: IndexResult[] = [];\n\n for (const module of enabledModules) {\n const moduleStart = Date.now();\n logger.info(`\\n[${module.name}] Starting indexing...`);\n\n // Initialize module if needed\n const moduleConfig = getModuleConfig(config, module.id);\n if (module.initialize && moduleConfig) {\n // Apply CLI overrides to module config, including logger\n const configWithOverrides = { ...moduleConfig };\n if (options.model && module.id === \"language/typescript\") {\n configWithOverrides.options = {\n ...configWithOverrides.options,\n embeddingModel: options.model,\n };\n }\n // Pass logger to module via options\n configWithOverrides.options = {\n ...configWithOverrides.options,\n logger,\n };\n await module.initialize(configWithOverrides);\n }\n\n // Pre-filter files that this module supports\n const moduleFiles = module.supportsFile\n ? files.filter((f) => module.supportsFile!(f))\n : files;\n\n logger.info(` Processing ${moduleFiles.length} files...`);\n\n const result = await indexWithModule(\n rootDir,\n moduleFiles,\n module,\n config,\n verbose,\n introspection,\n logger,\n concurrency\n );\n results.push(result);\n\n // Call finalize to build secondary indexes (Tier 1, BM25, etc.)\n if (module.finalize) {\n logger.info(`[${module.name}] Building secondary indexes...`);\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n return fs.readFile(fullPath, \"utf-8\");\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n };\n await module.finalize(ctx);\n }\n\n const moduleDuration = Date.now() - moduleStart;\n result.durationMs = moduleDuration;\n\n logger.info(\n `[${module.name}] Complete: ${result.indexed} indexed, ${\n result.skipped\n } skipped, ${result.errors} errors (${formatDuration(moduleDuration)})`\n );\n }\n\n // Save introspection data\n await introspection.save(config);\n\n // Log overall timing\n const overallDuration = Date.now() - overallStart;\n logger.info(`\\nIndexing complete in ${formatDuration(overallDuration)}`);\n\n // Log summary\n const totalIndexed = results.reduce((sum, r) => sum + r.indexed, 0);\n const totalSkipped = results.reduce((sum, r) => sum + r.skipped, 0);\n const totalErrors = results.reduce((sum, r) => sum + r.errors, 0);\n logger.info(\n `Total: ${totalIndexed} indexed, ${totalSkipped} skipped, ${totalErrors} errors`\n );\n\n // Update global manifest\n await updateGlobalManifest(rootDir, enabledModules, config);\n\n return results;\n}\n\n/**\n * Check if the existing index version is compatible with the current schema.\n * Returns true if compatible, false if needs rebuild.\n */\nasync function isIndexVersionCompatible(rootDir: string): Promise<boolean> {\n const config = await loadConfig(rootDir);\n const globalManifestPath = getGlobalManifestPath(rootDir, config);\n\n try {\n const content = await fs.readFile(globalManifestPath, \"utf-8\");\n const manifest: GlobalManifest = JSON.parse(content);\n\n // Check if version matches current schema version\n return manifest.version === INDEX_SCHEMA_VERSION;\n } catch {\n // Can't read manifest - treat as incompatible\n return false;\n }\n}\n\n/**\n * Delete the entire index directory to allow a clean rebuild.\n */\nasync function deleteIndex(rootDir: string): Promise<void> {\n const indexDir = getRaggrepDir(rootDir);\n\n try {\n await fs.rm(indexDir, { recursive: true, force: true });\n } catch {\n // Directory may not exist, that's okay\n }\n}\n\n/**\n * Result of a reset operation\n */\nexport interface ResetResult {\n /** Whether the reset was successful */\n success: boolean;\n /** The index directory that was removed */\n indexDir: string;\n}\n\n/**\n * Reset (delete) the index for a directory.\n *\n * @param rootDir - Root directory of the project\n * @returns ResetResult with success status\n * @throws Error if no index exists\n */\nexport async function resetIndex(rootDir: string): Promise<ResetResult> {\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Check if index exists\n const status = await getIndexStatus(rootDir);\n\n if (!status.exists) {\n throw new Error(`No index found for ${rootDir}`);\n }\n\n // Delete the index\n await deleteIndex(rootDir);\n\n return {\n success: true,\n indexDir: status.indexDir,\n };\n}\n\n/**\n * Ensure the index is fresh by checking for changes and updating incrementally.\n * This function is designed to be called before search to transparently manage the index.\n *\n * - If no index exists, creates a full index\n * - If index version is incompatible, rebuilds from scratch\n * - If files have changed, re-indexes only the modified files\n * - If files have been deleted, removes stale entries\n * - If nothing changed, returns immediately (uses cache)\n *\n * @param rootDir - Root directory of the project\n * @param options - Index options\n * @returns Statistics about what was updated\n */\nexport async function ensureIndexFresh(\n rootDir: string,\n options: IndexOptions = {}\n): Promise<EnsureFreshResult> {\n const verbose = options.verbose ?? false;\n const quiet = options.quiet ?? false;\n\n // Create logger based on options\n const logger: Logger = options.logger\n ? options.logger\n : quiet\n ? createSilentLogger()\n : createLogger({ verbose });\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Check if index exists\n const status = await getIndexStatus(rootDir);\n\n if (!status.exists) {\n // No index exists - do full indexing\n logger.info(\"No index found. Creating index...\\n\");\n const results = await indexDirectory(rootDir, { ...options, logger });\n const totalIndexed = results.reduce((sum, r) => sum + r.indexed, 0);\n return { indexed: totalIndexed, removed: 0, unchanged: 0 };\n }\n\n // Index exists - check if version is compatible\n const versionCompatible = await isIndexVersionCompatible(rootDir);\n if (!versionCompatible) {\n // Incompatible index version - delete and rebuild\n logger.info(\"Index version incompatible. Rebuilding...\\n\");\n await deleteIndex(rootDir);\n const results = await indexDirectory(rootDir, { ...options, logger });\n const totalIndexed = results.reduce((sum, r) => sum + r.indexed, 0);\n return { indexed: totalIndexed, removed: 0, unchanged: 0 };\n }\n\n // Index exists and is compatible - check for changes incrementally\n const config = await loadConfig(rootDir);\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n return { indexed: 0, removed: 0, unchanged: 0 };\n }\n\n // Initialize introspection\n const introspection = new IntrospectionIndex(rootDir);\n await introspection.initialize();\n\n // Get all current files\n const currentFiles = await findFiles(rootDir, config);\n const currentFileSet = new Set(\n currentFiles.map((f) => path.relative(rootDir, f))\n );\n\n let totalIndexed = 0;\n let totalRemoved = 0;\n let totalUnchanged = 0;\n\n for (const module of enabledModules) {\n // Initialize module if needed\n const moduleConfig = getModuleConfig(config, module.id);\n if (module.initialize && moduleConfig) {\n const configWithOverrides = { ...moduleConfig };\n if (options.model && module.id === \"language/typescript\") {\n configWithOverrides.options = {\n ...configWithOverrides.options,\n embeddingModel: options.model,\n };\n }\n // Pass logger to module\n configWithOverrides.options = {\n ...configWithOverrides.options,\n logger,\n };\n await module.initialize(configWithOverrides);\n }\n\n // Load manifest\n const manifest = await loadModuleManifest(rootDir, module.id, config);\n const indexPath = getModuleIndexPath(rootDir, module.id, config);\n\n // Find files to remove (in manifest but not on disk)\n const filesToRemove: string[] = [];\n for (const filepath of Object.keys(manifest.files)) {\n if (!currentFileSet.has(filepath)) {\n filesToRemove.push(filepath);\n }\n }\n\n // Remove stale entries\n for (const filepath of filesToRemove) {\n logger.debug(` Removing stale: ${filepath}`);\n // Remove main index file\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(indexFilePath);\n } catch {\n // Index file may not exist\n }\n // Remove symbolic index file\n const symbolicFilePath = path.join(\n indexPath,\n \"symbolic\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(symbolicFilePath);\n } catch {\n // Symbolic file may not exist\n }\n delete manifest.files[filepath];\n totalRemoved++;\n }\n\n // Index new/modified files\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n return fs.readFile(fullPath, \"utf-8\");\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n getIntrospection: (filepath: string) => introspection.getFile(filepath),\n };\n\n const totalFiles = currentFiles.length;\n for (let i = 0; i < currentFiles.length; i++) {\n const filepath = currentFiles[i];\n const relativePath = path.relative(rootDir, filepath);\n const progress = `[${i + 1}/${totalFiles}]`;\n\n try {\n const stats = await fs.stat(filepath);\n const lastModified = stats.mtime.toISOString();\n\n // Check if file needs re-indexing\n const existingEntry = manifest.files[relativePath];\n if (existingEntry && existingEntry.lastModified === lastModified) {\n totalUnchanged++;\n continue;\n }\n\n // File is new or modified - index it\n logger.progress(` ${progress} Indexing: ${relativePath}`);\n\n const content = await fs.readFile(filepath, \"utf-8\");\n introspection.addFile(relativePath, content);\n\n const fileIndex = await module.indexFile(relativePath, content, ctx);\n\n if (fileIndex) {\n await writeFileIndex(\n rootDir,\n module.id,\n relativePath,\n fileIndex,\n config\n );\n manifest.files[relativePath] = {\n lastModified,\n chunkCount: fileIndex.chunks.length,\n };\n totalIndexed++;\n }\n } catch (error) {\n logger.clearProgress();\n logger.error(` ${progress} Error indexing ${relativePath}: ${error}`);\n }\n }\n\n // Clear progress line\n logger.clearProgress();\n\n // Update manifest if there were changes\n if (totalIndexed > 0 || totalRemoved > 0) {\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, module.id, manifest, config);\n\n // Call finalize to rebuild secondary indexes\n if (module.finalize) {\n await module.finalize(ctx);\n }\n }\n\n // Clean up empty directories\n if (totalRemoved > 0) {\n await cleanupEmptyDirectories(indexPath);\n }\n }\n\n // Save introspection if there were changes\n if (totalIndexed > 0) {\n await introspection.save(config);\n }\n\n // Update global manifest if needed\n if (totalIndexed > 0 || totalRemoved > 0) {\n await updateGlobalManifest(rootDir, enabledModules, config);\n }\n\n return {\n indexed: totalIndexed,\n removed: totalRemoved,\n unchanged: totalUnchanged,\n };\n}\n\n/**\n * Result of processing a single file\n */\ninterface FileProcessResult {\n relativePath: string;\n status: \"indexed\" | \"skipped\" | \"error\";\n lastModified?: string;\n chunkCount?: number;\n error?: unknown;\n}\n\n/**\n * Index files with a specific module using parallel processing\n */\nasync function indexWithModule(\n rootDir: string,\n files: string[],\n module: IndexModule,\n config: Config,\n verbose: boolean,\n introspection: IntrospectionIndex,\n logger: Logger,\n concurrency: number = DEFAULT_CONCURRENCY\n): Promise<IndexResult> {\n const result: IndexResult = {\n moduleId: module.id,\n indexed: 0,\n skipped: 0,\n errors: 0,\n };\n\n // Load existing manifest for this module\n const manifest = await loadModuleManifest(rootDir, module.id, config);\n const indexPath = getModuleIndexPath(rootDir, module.id, config);\n\n // Build set of current files for quick lookup\n const currentFileSet = new Set(files.map((f) => path.relative(rootDir, f)));\n\n // Clean up stale entries (files in manifest but no longer on disk)\n const filesToRemove: string[] = [];\n for (const filepath of Object.keys(manifest.files)) {\n if (!currentFileSet.has(filepath)) {\n filesToRemove.push(filepath);\n }\n }\n\n if (filesToRemove.length > 0) {\n logger.info(` Removing ${filesToRemove.length} stale entries...`);\n for (const filepath of filesToRemove) {\n logger.debug(` Removing: ${filepath}`);\n // Remove main index file\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(indexFilePath);\n } catch {\n // Index file may not exist\n }\n // Remove symbolic index file\n const symbolicFilePath = path.join(\n indexPath,\n \"symbolic\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(symbolicFilePath);\n } catch {\n // Symbolic file may not exist\n }\n delete manifest.files[filepath];\n }\n // Clean up empty directories\n await cleanupEmptyDirectories(indexPath);\n }\n\n // Create index context\n const ctx: IndexContext = {\n rootDir,\n config,\n readFile: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n return fs.readFile(fullPath, \"utf-8\");\n },\n getFileStats: async (filepath: string) => {\n const fullPath = path.isAbsolute(filepath)\n ? filepath\n : path.join(rootDir, filepath);\n const stats = await fs.stat(fullPath);\n return { lastModified: stats.mtime.toISOString() };\n },\n getIntrospection: (filepath: string) => introspection.getFile(filepath),\n };\n\n const totalFiles = files.length;\n\n // Track progress across parallel operations\n let completedCount = 0;\n\n // Process files in parallel with concurrency control\n const processFile = async (\n filepath: string,\n _index: number\n ): Promise<FileProcessResult> => {\n const relativePath = path.relative(rootDir, filepath);\n\n try {\n const stats = await fs.stat(filepath);\n const lastModified = stats.mtime.toISOString();\n\n // Check if file needs re-indexing\n const existingEntry = manifest.files[relativePath];\n if (existingEntry && existingEntry.lastModified === lastModified) {\n completedCount++;\n logger.debug(\n ` [${completedCount}/${totalFiles}] Skipped ${relativePath} (unchanged)`\n );\n return { relativePath, status: \"skipped\" };\n }\n\n // Read and index file\n const content = await fs.readFile(filepath, \"utf-8\");\n\n // Add introspection for this file (thread-safe - just adds to a Map)\n introspection.addFile(relativePath, content);\n\n // Update progress\n completedCount++;\n logger.progress(\n ` [${completedCount}/${totalFiles}] Processing: ${relativePath}`\n );\n\n const fileIndex = await module.indexFile(relativePath, content, ctx);\n\n if (!fileIndex) {\n logger.debug(\n ` [${completedCount}/${totalFiles}] Skipped ${relativePath} (no chunks)`\n );\n return { relativePath, status: \"skipped\" };\n }\n\n // Write index file\n await writeFileIndex(rootDir, module.id, relativePath, fileIndex, config);\n\n return {\n relativePath,\n status: \"indexed\",\n lastModified,\n chunkCount: fileIndex.chunks.length,\n };\n } catch (error) {\n completedCount++;\n return { relativePath, status: \"error\", error };\n }\n };\n\n // Run parallel processing\n logger.debug(` Using concurrency: ${concurrency}`);\n const results = await parallelMap(files, processFile, concurrency);\n\n // Clear progress line\n logger.clearProgress();\n\n // Process results and update manifest\n for (const item of results) {\n if (!item.success) {\n // This shouldn't happen as we catch errors in processFile\n result.errors++;\n continue;\n }\n\n const fileResult = item.value;\n switch (fileResult.status) {\n case \"indexed\":\n manifest.files[fileResult.relativePath] = {\n lastModified: fileResult.lastModified!,\n chunkCount: fileResult.chunkCount!,\n };\n result.indexed++;\n break;\n case \"skipped\":\n result.skipped++;\n break;\n case \"error\":\n logger.error(\n ` Error indexing ${fileResult.relativePath}: ${fileResult.error}`\n );\n result.errors++;\n break;\n }\n }\n\n // Update manifest\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, module.id, manifest, config);\n\n return result;\n}\n\nasync function findFiles(rootDir: string, config: Config): Promise<string[]> {\n const patterns = config.extensions.map((ext) => `**/*${ext}`);\n const ignorePatterns = config.ignorePaths.map((p) => `**/${p}/**`);\n\n const files: string[] = [];\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: rootDir,\n absolute: true,\n ignore: ignorePatterns,\n });\n files.push(...matches);\n }\n\n return [...new Set(files)]; // Remove duplicates\n}\n\nasync function loadModuleManifest(\n rootDir: string,\n moduleId: string,\n config: Config\n): Promise<ModuleManifest> {\n const manifestPath = getModuleManifestPath(rootDir, moduleId, config);\n\n try {\n const content = await fs.readFile(manifestPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return {\n moduleId,\n version: \"1.0.0\",\n lastUpdated: new Date().toISOString(),\n files: {},\n };\n }\n}\n\nasync function writeModuleManifest(\n rootDir: string,\n moduleId: string,\n manifest: ModuleManifest,\n config: Config\n): Promise<void> {\n const manifestPath = getModuleManifestPath(rootDir, moduleId, config);\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\nasync function writeFileIndex(\n rootDir: string,\n moduleId: string,\n filepath: string,\n fileIndex: FileIndex,\n config: Config\n): Promise<void> {\n const indexPath = getModuleIndexPath(rootDir, moduleId, config);\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n\n await fs.mkdir(path.dirname(indexFilePath), { recursive: true });\n await fs.writeFile(indexFilePath, JSON.stringify(fileIndex, null, 2));\n}\n\nasync function updateGlobalManifest(\n rootDir: string,\n modules: IndexModule[],\n config: Config\n): Promise<void> {\n const manifestPath = getGlobalManifestPath(rootDir, config);\n\n const manifest: GlobalManifest = {\n version: INDEX_SCHEMA_VERSION,\n lastUpdated: new Date().toISOString(),\n modules: modules.map((m) => m.id),\n };\n\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Options for cleanup operation\n */\nexport interface CleanupOptions {\n /** Show detailed progress */\n verbose?: boolean;\n /** Logger for progress reporting */\n logger?: Logger;\n}\n\n/**\n * Clean up stale index entries for files that no longer exist\n * @param rootDir - Root directory of the project\n * @param options - Cleanup options\n * @returns Array of cleanup results per module\n */\nexport async function cleanupIndex(\n rootDir: string,\n options: CleanupOptions = {}\n): Promise<CleanupResult[]> {\n const verbose = options.verbose ?? false;\n\n // Create logger\n const logger: Logger = options.logger ?? createLogger({ verbose });\n\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n logger.info(`Cleaning up index in: ${rootDir}`);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Register built-in modules\n await registerBuiltInModules();\n\n // Get enabled modules\n const enabledModules = registry.getEnabled(config);\n\n if (enabledModules.length === 0) {\n logger.info(\"No modules enabled.\");\n return [];\n }\n\n const results: CleanupResult[] = [];\n\n for (const module of enabledModules) {\n logger.info(`\\n[${module.name}] Checking for stale entries...`);\n\n const result = await cleanupModuleIndex(rootDir, module.id, config, logger);\n results.push(result);\n\n logger.info(\n `[${module.name}] Removed ${result.removed} stale entries, kept ${result.kept} valid entries`\n );\n }\n\n return results;\n}\n\n/**\n * Clean up stale index entries for a specific module\n */\nasync function cleanupModuleIndex(\n rootDir: string,\n moduleId: string,\n config: Config,\n logger: Logger\n): Promise<CleanupResult> {\n const result: CleanupResult = {\n moduleId,\n removed: 0,\n kept: 0,\n };\n\n // Load manifest\n const manifest = await loadModuleManifest(rootDir, moduleId, config);\n const indexPath = getModuleIndexPath(rootDir, moduleId, config);\n\n const filesToRemove: string[] = [];\n const updatedFiles: ModuleManifest[\"files\"] = {};\n\n // Check each indexed file\n for (const [filepath, entry] of Object.entries(manifest.files)) {\n const fullPath = path.join(rootDir, filepath);\n\n try {\n await fs.access(fullPath);\n // File exists, keep it\n updatedFiles[filepath] = entry;\n result.kept++;\n } catch {\n // File doesn't exist, mark for removal\n filesToRemove.push(filepath);\n result.removed++;\n logger.debug(` Removing stale entry: ${filepath}`);\n }\n }\n\n // Remove stale index files\n for (const filepath of filesToRemove) {\n const indexFilePath = path.join(\n indexPath,\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n try {\n await fs.unlink(indexFilePath);\n } catch {\n // Index file may not exist, that's okay\n }\n }\n\n // Update manifest with only valid files\n manifest.files = updatedFiles;\n manifest.lastUpdated = new Date().toISOString();\n await writeModuleManifest(rootDir, moduleId, manifest, config);\n\n // Clean up empty directories in the index\n await cleanupEmptyDirectories(indexPath);\n\n return result;\n}\n\n/**\n * Recursively remove empty directories\n */\nasync function cleanupEmptyDirectories(dir: string): Promise<boolean> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n // Process subdirectories first\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subDir = path.join(dir, entry.name);\n await cleanupEmptyDirectories(subDir);\n }\n }\n\n // Check if directory is now empty (re-read after potential subdirectory removal)\n const remainingEntries = await fs.readdir(dir);\n\n // Don't remove the root index directory or manifest files\n if (remainingEntries.length === 0) {\n await fs.rmdir(dir);\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the current status of the index\n * @param rootDir - Root directory of the project\n * @returns Index status information\n */\nexport async function getIndexStatus(rootDir: string): Promise<IndexStatus> {\n // Ensure absolute path\n rootDir = path.resolve(rootDir);\n\n // Load config\n const config = await loadConfig(rootDir);\n\n // Get index location (now in temp directory)\n const location = getIndexLocation(rootDir);\n const indexDir = location.indexDir;\n\n const status: IndexStatus = {\n exists: false,\n rootDir,\n indexDir,\n modules: [],\n totalFiles: 0,\n };\n\n // Check if index directory exists\n try {\n await fs.access(indexDir);\n } catch {\n return status;\n }\n\n // Try to load global manifest\n try {\n const globalManifestPath = getGlobalManifestPath(rootDir, config);\n const content = await fs.readFile(globalManifestPath, \"utf-8\");\n const globalManifest: GlobalManifest = JSON.parse(content);\n\n status.exists = true;\n status.lastUpdated = globalManifest.lastUpdated;\n\n // Load each module's manifest\n for (const moduleId of globalManifest.modules) {\n try {\n const manifest = await loadModuleManifest(rootDir, moduleId, config);\n const fileCount = Object.keys(manifest.files).length;\n\n status.modules.push({\n id: moduleId,\n fileCount,\n lastUpdated: manifest.lastUpdated,\n });\n\n status.totalFiles += fileCount;\n } catch {\n // Module manifest doesn't exist or is corrupt\n }\n }\n } catch {\n // Global manifest doesn't exist - check if there's any index data\n try {\n const entries = await fs.readdir(path.join(indexDir, \"index\"));\n if (entries.length > 0) {\n status.exists = true;\n // Try to load manifests for known modules\n for (const entry of entries) {\n try {\n const manifest = await loadModuleManifest(rootDir, entry, config);\n const fileCount = Object.keys(manifest.files).length;\n\n status.modules.push({\n id: entry,\n fileCount,\n lastUpdated: manifest.lastUpdated,\n });\n\n status.totalFiles += fileCount;\n } catch {\n // Skip\n }\n }\n }\n } catch {\n // No index directory\n }\n }\n\n return status;\n}\n\n// Re-export watcher\nexport { watchDirectory, type WatchOptions, type FileWatcher } from \"./watcher\";\n",
35
35
  "// Module registry - manages available index modules\nimport { IndexModule, ModuleRegistry, Config } from \"../types\";\n\nclass ModuleRegistryImpl implements ModuleRegistry {\n private modules = new Map<string, IndexModule>();\n\n register(module: IndexModule): void {\n // Idempotent registration: avoid noisy logs when called multiple times\n if (!this.modules.has(module.id)) {\n this.modules.set(module.id, module);\n }\n }\n\n get(id: string): IndexModule | undefined {\n return this.modules.get(id);\n }\n\n list(): IndexModule[] {\n return Array.from(this.modules.values());\n }\n\n getEnabled(config: Config): IndexModule[] {\n const enabledIds = new Set(\n config.modules.filter((m) => m.enabled).map((m) => m.id)\n );\n\n return this.list().filter((m) => enabledIds.has(m.id));\n }\n}\n\n// Global singleton registry\nexport const registry: ModuleRegistry = new ModuleRegistryImpl();\n\n// Auto-register built-in modules\nexport async function registerBuiltInModules(): Promise<void> {\n // Dynamic import to avoid circular dependencies\n const { CoreModule } = await import(\"./core\");\n const { TypeScriptModule } = await import(\"./language/typescript\");\n const { JsonModule } = await import(\"./data/json\");\n const { MarkdownModule } = await import(\"./docs/markdown\");\n\n // Register core module first (fast, language-agnostic)\n registry.register(new CoreModule());\n\n // Register language-specific modules\n registry.register(new TypeScriptModule());\n\n // Register data format modules\n registry.register(new JsonModule());\n\n // Register documentation modules\n registry.register(new MarkdownModule());\n}\n",
36
36
  "/**\n * Introspection Index Storage\n *\n * Manages file metadata for context-aware search boosting.\n * Handles saving and loading introspection data to/from disk.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport type {\n FileIntrospection,\n ProjectStructure,\n IntrospectionConfig,\n Scope,\n Config,\n} from \"../../domain/entities\";\nimport { detectProjectStructure } from \"./projectDetector\";\nimport { introspectFile } from \"../../domain/services/introspection\";\nimport { getRaggrepDir } from \"../config\";\n\n/**\n * Introspection index for a workspace.\n */\nexport class IntrospectionIndex {\n private rootDir: string;\n private structure: ProjectStructure | null = null;\n private files: Map<string, FileIntrospection> = new Map();\n private config: IntrospectionConfig = {};\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n }\n\n /**\n * Initialize by detecting project structure.\n */\n async initialize(): Promise<void> {\n this.structure = await detectProjectStructure(this.rootDir);\n\n // Try to load config overrides\n try {\n const configPath = path.join(this.rootDir, \".raggrep\", \"config.json\");\n const configContent = await fs.readFile(configPath, \"utf-8\");\n const config = JSON.parse(configContent);\n this.config = config.introspection || {};\n } catch {\n // No config or introspection section\n }\n }\n\n /**\n * Get project structure.\n */\n getStructure(): ProjectStructure | null {\n return this.structure;\n }\n\n /**\n * Introspect a file and add to index.\n */\n addFile(filepath: string, content?: string): FileIntrospection {\n if (!this.structure) {\n throw new Error(\"IntrospectionIndex not initialized\");\n }\n\n const intro = introspectFile(filepath, this.structure, content);\n\n // Apply config overrides\n this.applyOverrides(intro);\n\n this.files.set(filepath, intro);\n return intro;\n }\n\n /**\n * Get introspection for a file.\n */\n getFile(filepath: string): FileIntrospection | undefined {\n return this.files.get(filepath);\n }\n\n /**\n * Get all introspected files.\n */\n getAllFiles(): FileIntrospection[] {\n return Array.from(this.files.values());\n }\n\n /**\n * Apply config overrides to introspection.\n */\n private applyOverrides(intro: FileIntrospection): void {\n if (!this.config.projects) return;\n\n for (const [projectPath, overrides] of Object.entries(\n this.config.projects\n )) {\n if (\n intro.filepath.startsWith(projectPath + \"/\") ||\n intro.project.root === projectPath\n ) {\n if (overrides.scope) {\n intro.scope = overrides.scope as Scope;\n }\n if (overrides.framework) {\n intro.framework = overrides.framework;\n }\n break;\n }\n }\n }\n\n /**\n * Save introspection index to disk.\n */\n async save(config: Config): Promise<void> {\n const introDir = path.join(\n getRaggrepDir(this.rootDir, config),\n \"introspection\"\n );\n await fs.mkdir(introDir, { recursive: true });\n\n // Save project structure\n const projectPath = path.join(introDir, \"_project.json\");\n await fs.writeFile(\n projectPath,\n JSON.stringify(\n {\n version: \"1.0.0\",\n lastUpdated: new Date().toISOString(),\n structure: this.structure,\n },\n null,\n 2\n )\n );\n\n // Save file introspections in directory structure\n for (const [filepath, intro] of this.files) {\n const introFilePath = path.join(\n introDir,\n \"files\",\n filepath.replace(/\\.[^.]+$/, \".json\")\n );\n await fs.mkdir(path.dirname(introFilePath), { recursive: true });\n await fs.writeFile(introFilePath, JSON.stringify(intro, null, 2));\n }\n }\n\n /**\n * Load introspection index from disk.\n */\n async load(config: Config): Promise<void> {\n const introDir = path.join(\n getRaggrepDir(this.rootDir, config),\n \"introspection\"\n );\n\n try {\n // Load project structure\n const projectPath = path.join(introDir, \"_project.json\");\n const projectContent = await fs.readFile(projectPath, \"utf-8\");\n const projectData = JSON.parse(projectContent);\n this.structure = projectData.structure;\n\n // Load file introspections\n await this.loadFilesRecursive(path.join(introDir, \"files\"), \"\");\n } catch {\n // No introspection index yet\n this.structure = null;\n this.files.clear();\n }\n }\n\n /**\n * Recursively load file introspections.\n */\n private async loadFilesRecursive(\n basePath: string,\n prefix: string\n ): Promise<void> {\n try {\n const entries = await fs.readdir(basePath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(basePath, entry.name);\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n await this.loadFilesRecursive(entryPath, relativePath);\n } else if (entry.name.endsWith(\".json\")) {\n const content = await fs.readFile(entryPath, \"utf-8\");\n const intro: FileIntrospection = JSON.parse(content);\n this.files.set(intro.filepath, intro);\n }\n }\n } catch {\n // Directory doesn't exist\n }\n }\n\n /**\n * Clear the index.\n */\n clear(): void {\n this.files.clear();\n this.structure = null;\n }\n}\n",
37
37
  "/**\n * Project Structure Detection\n *\n * Auto-detects monorepo structure and project types from:\n * - Folder layout (apps/, packages/, etc.)\n * - package.json files (for TypeScript/JavaScript projects)\n *\n * This module performs file I/O to scan the filesystem.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport type {\n Project,\n ProjectType,\n ProjectStructure,\n} from \"../../domain/entities/introspection\";\n\n/** Maximum depth to scan for package.json files */\nconst MAX_SCAN_DEPTH = 4;\n\n/** Directories to skip when scanning for package.json */\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \".next\",\n \".nuxt\",\n \"coverage\",\n \".raggrep\",\n]);\n\n/**\n * Parsed information from a package.json file.\n */\ninterface PackageJsonInfo {\n name: string;\n relativePath: string;\n type: ProjectType;\n hasWorkspaces: boolean;\n}\n\n/**\n * Scan for package.json files and extract project info.\n */\nasync function scanForPackageJsons(\n rootDir: string,\n currentDir: string = \"\",\n depth: number = 0\n): Promise<PackageJsonInfo[]> {\n if (depth > MAX_SCAN_DEPTH) return [];\n\n const results: PackageJsonInfo[] = [];\n const fullDir = currentDir ? path.join(rootDir, currentDir) : rootDir;\n\n try {\n const entries = await fs.readdir(fullDir, { withFileTypes: true });\n\n // Check for package.json in current directory\n const hasPackageJson = entries.some(\n (e) => e.isFile() && e.name === \"package.json\"\n );\n\n if (hasPackageJson && currentDir) {\n const info = await parsePackageJson(rootDir, currentDir);\n if (info) results.push(info);\n }\n\n // Recursively scan subdirectories\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (SKIP_DIRS.has(entry.name)) continue;\n\n const subPath = currentDir ? `${currentDir}/${entry.name}` : entry.name;\n const subResults = await scanForPackageJsons(rootDir, subPath, depth + 1);\n results.push(...subResults);\n }\n } catch {\n // Directory not readable\n }\n\n return results;\n}\n\n/**\n * Parse a package.json file and extract project metadata.\n */\nasync function parsePackageJson(\n rootDir: string,\n relativePath: string\n): Promise<PackageJsonInfo | null> {\n try {\n const packageJsonPath = path.join(rootDir, relativePath, \"package.json\");\n const content = await fs.readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n const name = pkg.name || path.basename(relativePath);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n let type: ProjectType = \"unknown\";\n\n if (deps[\"next\"] || deps[\"react\"] || deps[\"vue\"] || deps[\"svelte\"]) {\n type = \"app\";\n } else if (\n deps[\"express\"] ||\n deps[\"fastify\"] ||\n deps[\"koa\"] ||\n deps[\"hono\"]\n ) {\n type = \"service\";\n } else if (pkg.main || pkg.exports) {\n type = \"library\";\n }\n\n const hasWorkspaces = Boolean(pkg.workspaces);\n return { name, relativePath, type, hasWorkspaces };\n } catch {\n return null;\n }\n}\n\n/**\n * Get project type from pattern directory name.\n */\nfunction getProjectType(patternDir: string): ProjectType {\n switch (patternDir) {\n case \"apps\":\n return \"app\";\n case \"packages\":\n case \"libs\":\n return \"library\";\n case \"services\":\n return \"service\";\n case \"scripts\":\n case \"tools\":\n return \"script\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Detect project structure in a workspace.\n *\n * Uses two strategies:\n * 1. Folder pattern detection (apps/, packages/, etc.)\n * 2. package.json scanning for more accurate project boundaries\n */\nexport async function detectProjectStructure(\n rootDir: string\n): Promise<ProjectStructure> {\n const projectMap = new Map<string, Project>();\n let isMonorepo = false;\n\n try {\n const entries = await fs.readdir(rootDir, { withFileTypes: true });\n const dirNames = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n // Strategy 1: Check for standard monorepo patterns\n const monorepoPatterns = [\"apps\", \"packages\", \"libs\", \"services\"];\n const hasMonorepoStructure = monorepoPatterns.some((p) =>\n dirNames.includes(p)\n );\n\n if (hasMonorepoStructure) {\n isMonorepo = true;\n\n for (const pattern of monorepoPatterns) {\n if (!dirNames.includes(pattern)) continue;\n\n const patternDir = path.join(rootDir, pattern);\n try {\n const subDirs = await fs.readdir(patternDir, { withFileTypes: true });\n\n for (const subDir of subDirs) {\n if (!subDir.isDirectory()) continue;\n\n const projectRoot = `${pattern}/${subDir.name}`;\n const type = getProjectType(pattern);\n\n projectMap.set(projectRoot, {\n name: subDir.name,\n root: projectRoot,\n type,\n });\n }\n } catch {\n // Directory doesn't exist or not readable\n }\n }\n }\n\n // Strategy 2: Scan for package.json files\n const packageJsons = await scanForPackageJsons(rootDir);\n\n for (const pkg of packageJsons) {\n if (pkg.hasWorkspaces) isMonorepo = true;\n if (packageJsons.length > 1) isMonorepo = true;\n\n projectMap.set(pkg.relativePath, {\n name: pkg.name,\n root: pkg.relativePath,\n type: pkg.type,\n });\n }\n\n // Check root package.json\n let rootType: ProjectType = \"unknown\";\n try {\n const rootPkgPath = path.join(rootDir, \"package.json\");\n const rootPkg = JSON.parse(await fs.readFile(rootPkgPath, \"utf-8\"));\n\n if (rootPkg.workspaces) isMonorepo = true;\n\n const deps = { ...rootPkg.dependencies, ...rootPkg.devDependencies };\n if (deps[\"next\"] || deps[\"react\"] || deps[\"vue\"]) {\n rootType = \"app\";\n } else if (deps[\"express\"] || deps[\"fastify\"] || deps[\"koa\"]) {\n rootType = \"service\";\n }\n } catch {\n // No package.json\n }\n\n const projects = Array.from(projectMap.values()).sort(\n (a, b) => a.root.length - b.root.length\n );\n\n return {\n projects,\n isMonorepo,\n rootType: isMonorepo ? undefined : rootType,\n };\n } catch {\n return {\n projects: [],\n isMonorepo: false,\n rootType: \"unknown\",\n };\n }\n}\n\n\n\n",
@@ -41,7 +41,7 @@
41
41
  "/**\n * Type definitions for the RAG system\n *\n * This file re-exports domain entities and defines module interfaces.\n * For new code, prefer importing directly from 'domain/entities'.\n */\n\n// Re-export all domain entities for backwards compatibility\nexport type {\n Chunk,\n ChunkType,\n FileIndex,\n FileManifestEntry,\n ModuleManifest,\n GlobalManifest,\n FileSummary,\n Tier1Manifest,\n SearchResult,\n SearchOptions,\n SearchContributions,\n CoreContribution,\n LanguageContribution,\n IntrospectionContribution,\n Config,\n ModuleConfig,\n} from \"./domain/entities\";\n\nexport {\n createChunkId,\n DEFAULT_SEARCH_OPTIONS,\n DEFAULT_IGNORE_PATHS,\n DEFAULT_EXTENSIONS,\n createDefaultConfig,\n} from \"./domain/entities\";\n\n// ============================================================================\n// Module System Interfaces\n// ============================================================================\n\nimport type {\n Config,\n FileIndex,\n SearchResult,\n SearchOptions,\n ModuleConfig,\n} from \"./domain/entities\";\n\n/**\n * Context provided to modules during indexing\n */\nimport type { FileIntrospection } from \"./domain/entities/introspection\";\n\nexport interface IndexContext {\n rootDir: string;\n config: Config;\n /** Get the content of a file */\n readFile: (filepath: string) => Promise<string>;\n /** Get file stats */\n getFileStats: (filepath: string) => Promise<{ lastModified: string }>;\n /** Get introspection data for a file (if available) */\n getIntrospection?: (filepath: string) => FileIntrospection | undefined;\n}\n\n/**\n * Context provided to modules during search\n */\nexport interface SearchContext {\n rootDir: string;\n config: Config;\n /** Load index data for a specific file */\n loadFileIndex: (filepath: string) => Promise<FileIndex | null>;\n /** List all indexed files */\n listIndexedFiles: () => Promise<string[]>;\n}\n\n/**\n * Base interface for index modules\n *\n * Modules provide different strategies for indexing and retrieving code.\n * Examples:\n * - SemanticModule: Uses text embeddings for natural language search\n * - SymbolModule: Uses TypeScript/LSP symbol information\n * - ASTModule: Uses AST-based code structure analysis\n */\nexport interface IndexModule {\n /** Unique identifier for this module */\n readonly id: string;\n\n /** Human-readable name */\n readonly name: string;\n\n /** Description of what this module indexes */\n readonly description: string;\n\n /** Version of the module (for index compatibility) */\n readonly version: string;\n\n /**\n * Index a single file\n * @returns FileIndex with module-specific data, or null if file should be skipped\n */\n indexFile(\n filepath: string,\n content: string,\n ctx: IndexContext\n ): Promise<FileIndex | null>;\n\n /**\n * Search the index with a query\n * @returns Ranked search results\n */\n search(\n query: string,\n ctx: SearchContext,\n options?: SearchOptions\n ): Promise<SearchResult[]>;\n\n /**\n * Optional: Initialize the module (e.g., load models, connect to services)\n */\n initialize?(config: ModuleConfig): Promise<void>;\n\n /**\n * Optional: Called after all files have been indexed.\n * Use for building secondary indexes (e.g., Tier 1 summaries, BM25 index).\n */\n finalize?(ctx: IndexContext): Promise<void>;\n\n /**\n * Optional: Check if this module supports a given file.\n * Used to pre-filter files before indexing to show accurate progress.\n * If not implemented, all files are passed to indexFile.\n */\n supportsFile?(filepath: string): boolean;\n\n /**\n * Optional: Cleanup resources\n */\n dispose?(): Promise<void>;\n}\n\n/**\n * Registry for managing available modules\n */\nexport interface ModuleRegistry {\n register(module: IndexModule): void;\n get(id: string): IndexModule | undefined;\n list(): IndexModule[];\n getEnabled(config: Config): IndexModule[];\n}\n",
42
42
  "/**\n * RAGgrep - Local filesystem-based RAG system for codebases\n *\n * Provides semantic search over code using local embeddings.\n *\n * @example\n * ```ts\n * import raggrep from 'raggrep';\n *\n * // Index a directory (automatically cleans up deleted files)\n * await raggrep.index('/path/to/project');\n *\n * // Search the index\n * const results = await raggrep.search('/path/to/project', 'user authentication');\n *\n * // Reset (clear) the index completely\n * await raggrep.reset('/path/to/project');\n * ```\n *\n * @example With custom logger\n * ```ts\n * import raggrep, { createLogger, createInlineLogger } from 'raggrep';\n *\n * // Create a logger (defaults to console)\n * const logger = createLogger({ verbose: true });\n *\n * // Or use inline logger for CLI-style progress\n * const inlineLogger = createInlineLogger({ verbose: false });\n *\n * await raggrep.index('/path/to/project', { logger: inlineLogger });\n * ```\n */\n\nimport { indexDirectory, cleanupIndex, resetIndex } from \"./app/indexer\";\nimport type {\n IndexResult,\n IndexOptions,\n CleanupResult,\n CleanupOptions,\n ResetResult,\n} from \"./app/indexer\";\nimport { search as searchIndex, formatSearchResults } from \"./app/search\";\nimport type { SearchOptions, SearchResult } from \"./types\";\nimport type { Logger, LoggerFactory } from \"./domain/ports\";\nimport {\n ConsoleLogger,\n InlineProgressLogger,\n SilentLogger,\n createLogger,\n createInlineLogger,\n createSilentLogger,\n} from \"./infrastructure/logger\";\n\n// Re-export types\nexport type {\n IndexResult,\n IndexOptions,\n CleanupResult,\n CleanupOptions,\n ResetResult,\n} from \"./app/indexer\";\nexport type { SearchOptions, SearchResult, Chunk, FileIndex } from \"./types\";\nexport type { Logger, LoggerFactory } from \"./domain/ports\";\n\n// Re-export logger implementations and factories\nexport {\n ConsoleLogger,\n InlineProgressLogger,\n SilentLogger,\n createLogger,\n createInlineLogger,\n createSilentLogger,\n};\n\n/**\n * Index a directory for semantic search.\n *\n * Creates a `.raggrep/` folder with the index data.\n * Automatically cleans up stale entries for deleted files.\n *\n * @param directory - Path to the directory to index\n * @param options - Index options\n * @returns Array of results per module\n *\n * @example\n * ```ts\n * // Basic indexing\n * await raggrep.index('./my-project');\n *\n * // With options\n * await raggrep.index('./my-project', {\n * model: 'bge-small-en-v1.5',\n * verbose: true\n * });\n * ```\n */\nexport async function index(\n directory: string,\n options: IndexOptions = {}\n): Promise<IndexResult[]> {\n return indexDirectory(directory, options);\n}\n\n/**\n * Search the indexed codebase.\n *\n * @param directory - Path to the indexed directory\n * @param query - Natural language search query\n * @param options - Search options\n * @returns Array of search results sorted by relevance\n *\n * @example\n * ```ts\n * // Basic search\n * const results = await raggrep.search('./my-project', 'user login');\n *\n * // With options\n * const results = await raggrep.search('./my-project', 'database query', {\n * topK: 5,\n * minScore: 0.2,\n * filePatterns: ['*.ts']\n * });\n * ```\n */\nexport async function search(\n directory: string,\n query: string,\n options: SearchOptions = {}\n): Promise<SearchResult[]> {\n return searchIndex(directory, query, options);\n}\n\n/**\n * Clean up stale index entries for files that no longer exist.\n *\n * Note: Cleanup is now automatic during indexing. This function is provided\n * for explicit cleanup without re-indexing.\n *\n * @param directory - Path to the indexed directory\n * @param options - Cleanup options\n * @returns Array of cleanup results per module\n *\n * @example\n * ```ts\n * const results = await raggrep.cleanup('./my-project');\n * console.log(`Removed ${results[0].removed} stale entries`);\n * ```\n */\nexport async function cleanup(\n directory: string,\n options: CleanupOptions = {}\n): Promise<CleanupResult[]> {\n return cleanupIndex(directory, options);\n}\n\n/**\n * Reset (completely clear) the index for a directory.\n *\n * @param directory - Path to the indexed directory\n * @returns Result with success status and removed index path\n * @throws Error if no index exists for the directory\n *\n * @example\n * ```ts\n * try {\n * const result = await raggrep.reset('./my-project');\n * console.log(`Cleared index at: ${result.indexDir}`);\n * } catch (error) {\n * console.error('No index found');\n * }\n * ```\n */\nexport async function reset(directory: string): Promise<ResetResult> {\n return resetIndex(directory);\n}\n\n/**\n * Format search results for display.\n *\n * @param results - Array of search results\n * @returns Formatted string for console output\n */\nexport { formatSearchResults };\n\n// Default export for convenient importing\nconst raggrep = {\n index,\n search,\n cleanup,\n reset,\n formatSearchResults,\n};\n\nexport default raggrep;\n"
43
43
  ],
44
- "mappings": "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",
45
- "debugId": "CD5077D1A96FC88964756E2164756E21",
44
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiHa;AAAA;AAAA,2BAAkD;AAAA,IAC7D,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc,CAAC;AAAA,IACf,YAAY,CAAC;AAAA,IACb,aAAa;AAAA,EACf;AAAA;;;ACaO,SAAS,mBAAmB,GAAW;AAAA,EAC5C,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,SAAS,CAAC;AAAA,MACZ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,IA3HW,sBAyDA;AAAA;AAAA,EAzDA,uBAAuB;AAAA,IAElC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAGA;AAAA,IAGA;AAAA,EACF;AAAA,EAWa,qBAAqB;AAAA,IAEhC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IAEA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IAEA;AAAA,EACF;AAAA;;;;EC5FA;AAAA,EAIA;AAAA;;;AChCA;AACA;AACA;AACA;AAgCA,SAAS,QAAQ,CAAC,WAA2B;AAAA,EAC3C,OACG,kBAAW,QAAQ,EACnB,OAAO,SAAS,EAChB,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AAAA;AAeT,SAAS,aAAa,CAC3B,SACA,UAAkB,gBACV;AAAA,EAER,MAAM,eAAoB,aAAQ,OAAO;AAAA,EAGzC,MAAM,cAAc,SAAS,YAAY;AAAA,EAGzC,OAAY,UAAK,mBAAmB,WAAW;AAAA;AAO1C,SAAS,gBAAgB,CAAC,SAI/B;AAAA,EACA,MAAM,eAAoB,aAAQ,OAAO;AAAA,EACzC,MAAM,cAAc,SAAS,YAAY;AAAA,EAEzC,OAAO;AAAA,IACL,UAAe,UAAK,mBAAmB,WAAW;AAAA,IAClD,aAAa;AAAA,IACb;AAAA,EACF;AAAA;AAMK,SAAS,kBAAkB,CAChC,SACA,UACA,SAAiB,gBACT;AAAA,EACR,MAAM,WAAW,cAAc,SAAS,MAAM;AAAA,EAC9C,OAAY,UAAK,UAAU,SAAS,QAAQ;AAAA;AAMvC,SAAS,qBAAqB,CACnC,SACA,UACA,SAAiB,gBACT;AAAA,EACR,MAAM,WAAW,cAAc,SAAS,MAAM;AAAA,EAC9C,OAAY,UAAK,UAAU,SAAS,UAAU,eAAe;AAAA;AAMxD,SAAS,qBAAqB,CACnC,SACA,SAAiB,gBACT;AAAA,EACR,MAAM,WAAW,cAAc,SAAS,MAAM;AAAA,EAC9C,OAAY,UAAK,UAAU,eAAe;AAAA;AAOrC,SAAS,aAAa,CAC3B,SACA,SAAiB,gBACT;AAAA,EACR,MAAM,WAAW,cAAc,SAAS,MAAM;AAAA,EAC9C,OAAY,UAAK,UAAU,aAAa;AAAA;AAU1C,eAAsB,UAAU,CAAC,SAAkC;AAAA,EACjE,MAAM,aAAa,cAAc,SAAS,cAAc;AAAA,EAExD,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAS,YAAY,OAAO;AAAA,IACrD,MAAM,cAAc,KAAK,MAAM,OAAO;AAAA,IACtC,OAAO,KAAK,mBAAmB,YAAY;AAAA,IAC3C,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAuBJ,SAAS,eAAe,CAC7B,QACA,UAC0B;AAAA,EAC1B,OAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAAA;AAM9C,SAAS,4BAA4B,CAC1C,cACiB;AAAA,EACjB,MAAM,UAAU,aAAa,WAAW,CAAC;AAAA,EACzC,MAAM,YAAa,QAAQ,kBAA6B;AAAA,EAGxD,IAAI,EAAE,aAAa,mBAAmB;AAAA,IACpC,QAAQ,KACN,4BAA4B,8CAC9B;AAAA,IACA,OAAO,EAAE,OAAO,oBAAoB;AAAA,EACtC;AAAA,EAEA,OAAO;AAAA,IACL,OAAO;AAAA,IAEP,cAAc,QAAQ,iBAAiB;AAAA,EACzC;AAAA;AAAA,IA5LW,gBAGP,mBAGO;AAAA;AAAA,EAdb;AAAA,EAQa,iBAAyB,oBAAoB;AAAA,EAGpD,oBAAyB,UAAQ,UAAO,GAAG,iBAAiB;AAAA,EAGrD,mBAAuD;AAAA,IAClE,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,EAC3B;AAAA;;;;EC1BA;AAAA;;;ACkBO,SAAS,QAAQ,CAAC,MAAwB;AAAA,EAC/C,OAAO,KACJ,YAAY,EACZ,QAAQ,YAAY,GAAG,EACvB,MAAM,KAAK,EACX,OAAO,WAAS,MAAM,SAAS,CAAC;AAAA;AAMrC,SAAS,aAAa,CAAC,MAAc,QAA0B;AAAA,EAC7D,OAAO,OAAO,OAAO,OAAK,MAAM,IAAI,EAAE;AAAA;AAAA;AA2BjC,MAAM,UAAU;AAAA,EACb,YAAgE,IAAI;AAAA,EACpE,eAAuB;AAAA,EACvB,sBAA2C,IAAI;AAAA,EAC/C,YAAoB;AAAA,EAO5B,YAAY,CAAC,WAAiC;AAAA,IAC5C,IAAI,cAAc,KAAK,eAAe,KAAK;AAAA,IAE3C,WAAW,OAAO,WAAW;AAAA,MAC3B,MAAM,SAAS,IAAI,UAAU,SAAS,IAAI,OAAO;AAAA,MACjD,KAAK,UAAU,IAAI,IAAI,IAAI,EAAE,SAAS,IAAI,SAAS,OAAO,CAAC;AAAA,MAC3D,eAAe,OAAO;AAAA,MACtB,KAAK;AAAA,MAGL,MAAM,cAAc,IAAI,IAAI,MAAM;AAAA,MAClC,WAAW,QAAQ,aAAa;AAAA,QAC9B,MAAM,QAAQ,KAAK,oBAAoB,IAAI,IAAI,KAAK;AAAA,QACpD,KAAK,oBAAoB,IAAI,MAAM,QAAQ,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA,KAAK,eAAe,KAAK,YAAY,IAAI,cAAc,KAAK,YAAY;AAAA;AAAA,EAMlE,GAAG,CAAC,MAAsB;AAAA,IAChC,MAAM,UAAU,KAAK,oBAAoB,IAAI,IAAI,KAAK;AAAA,IACtD,IAAI,YAAY;AAAA,MAAG,OAAO;AAAA,IAG1B,OAAO,KAAK,IAAI,KAAK,KAAK,YAAY,UAAU,QAAQ,UAAU,IAAI;AAAA;AAAA,EAMhE,KAAK,CAAC,QAAkB,YAA8B;AAAA,IAC5D,MAAM,YAAY,OAAO;AAAA,IACzB,IAAI,QAAQ;AAAA,IAEZ,WAAW,QAAQ,YAAY;AAAA,MAC7B,MAAM,KAAK,cAAc,MAAM,MAAM;AAAA,MACrC,IAAI,OAAO;AAAA,QAAG;AAAA,MAEd,MAAM,WAAW,KAAK,IAAI,IAAI;AAAA,MAG9B,MAAM,YAAY,MAAM,UAAU;AAAA,MAClC,MAAM,cAAc,KAAK,WAAW,IAAI,SAAS,UAAU,YAAY,KAAK;AAAA,MAE5E,SAAS,YAAY,YAAY;AAAA,IACnC;AAAA,IAEA,OAAO;AAAA;AAAA,EAUT,MAAM,CAAC,OAAe,OAAe,IAAkB;AAAA,IACrD,MAAM,aAAa,SAAS,KAAK;AAAA,IACjC,IAAI,WAAW,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IAErC,MAAM,UAAwB,CAAC;AAAA,IAE/B,YAAY,MAAM,aAAa,KAAK,WAAW;AAAA,MAC7C,MAAM,QAAQ,KAAK,MAAM,QAAQ,UAAU;AAAA,MAC3C,IAAI,QAAQ,GAAG;AAAA,QACb,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,IACxC,OAAO,QAAQ,MAAM,GAAG,IAAI;AAAA;AAAA,MAM1B,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK;AAAA;AAAA,EAMd,KAAK,GAAS;AAAA,IACZ,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,oBAAoB,MAAM;AAAA,IAC/B,KAAK,eAAe;AAAA,IACpB,KAAK,YAAY;AAAA;AAAA,EASnB,WAAW,CAAC,IAAY,QAAwB;AAAA,IAC9C,KAAK,aAAa,CAAC,EAAE,IAAI,SAAS,IAAI,OAAO,CAAC,CAAC;AAAA;AAAA,EAMjD,SAAS,GAAuB;AAAA,IAC9B,MAAM,YAAsC,CAAC;AAAA,IAC7C,YAAY,MAAM,aAAa,KAAK,WAAW;AAAA,MAC7C,UAAU,MAAM;AAAA,IAClB;AAAA,IAEA,OAAO;AAAA,MACL;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,qBAAqB,OAAO,YAAY,KAAK,mBAAmB;AAAA,MAChE,WAAW,KAAK;AAAA,IAClB;AAAA;AAAA,SAMK,WAAW,CAAC,MAAqC;AAAA,IACtD,MAAM,QAAQ,IAAI;AAAA,IAClB,MAAM,eAAe,KAAK;AAAA,IAC1B,MAAM,YAAY,KAAK;AAAA,IACvB,MAAM,sBAAsB,IAAI,IAAI,OAAO,QAAQ,KAAK,mBAAmB,CAAC;AAAA,IAE5E,YAAY,IAAI,WAAW,OAAO,QAAQ,KAAK,SAAS,GAAG;AAAA,MACzD,MAAM,UAAU,IAAI,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC;AAAA,IACjD;AAAA,IAEA,OAAO;AAAA;AAEX;AAmBO,SAAS,cAAc,CAAC,OAAe,WAAmB,GAAW;AAAA,EAC1E,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC,QAAQ,WAAW,CAAC;AAAA;AAAA,IAxN1C,UAAU,KACV,SAAS;;;ACVf;AAMA,SAAS,eAAe,CAAC,UAA0B;AAAA,EACjD,MAAM,MAAW,cAAQ,QAAQ;AAAA,EACjC,OAAY,eAAS,GAAG;AAAA;AAAA,IAMb;AAAA;AAAA,0BAA0C;AAAA,IACrD;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,mCAAmC,KAAK,QAAQ;AAAA;AAAA,MAEzD,UAAU,CAAC,SAAS,UAAU,WAAW,QAAQ;AAAA,MAEjD,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,SAAS,gBAAgB,QAAQ;AAAA,QAEvC,IAAI,CAAC,OAAO,OAAO,QAAQ,SAAS,KAAK,EAAE,EAAE,SAAS,MAAM,GAAG;AAAA,UAC7D,OAAO,CAAC;AAAA,QACV;AAAA,QACA,OAAO,CAAC,OAAO,YAAY,CAAC;AAAA;AAAA,IAEhC;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,kCAAkC,KAAK,QAAQ;AAAA;AAAA,MAExD,UAAU,CAAC,SAAS,QAAQ,cAAc,aAAa,SAAS;AAAA,IAClE;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,8BAA8B,KAAK,QAAQ;AAAA;AAAA,MAEpD,UAAU,CAAC,QAAQ,OAAO,eAAe,aAAa,MAAM;AAAA,IAC9D;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa;AAAA;AAAA,MAEtB,UAAU,CAAC,SAAS,UAAU,QAAQ,SAAS;AAAA,MAC/C,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,SAAS,gBAAgB,QAAQ;AAAA,QACvC,IAAI,CAAC,OAAO,OAAO,KAAK,EAAE,EAAE,SAAS,MAAM,GAAG;AAAA,UAC5C,OAAO,CAAC;AAAA,QACV;AAAA,QACA,OAAO,CAAC,OAAO,YAAY,CAAC;AAAA;AAAA,IAEhC;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa;AAAA;AAAA,MAEtB,UAAU,CAAC,SAAS,WAAW,QAAQ,UAAU,QAAQ;AAAA,MACzD,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,SAAS,gBAAgB,QAAQ;AAAA,QACvC,IAAI,CAAC,OAAO,OAAO,KAAK,EAAE,EAAE,SAAS,MAAM,GAAG;AAAA,UAC5C,OAAO,CAAC;AAAA,QACV;AAAA,QACA,OAAO,CAAC,OAAO,YAAY,CAAC;AAAA;AAAA,IAEhC;AAAA,IAEA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa,YAAY,aAAa;AAAA;AAAA,MAE/C,UAAU,CAAC,SAAS,SAAS,QAAQ,QAAQ;AAAA,IAC/C;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa;AAAA;AAAA,MAEtB,UAAU,CAAC,SAAS,QAAQ,MAAM,UAAU,YAAY;AAAA,MACxD,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,SAAS,gBAAgB,QAAQ;AAAA,QAEvC,IAAI,UAAU,CAAC,CAAC,OAAO,OAAO,KAAK,EAAE,EAAE,SAAS,MAAM,GAAG;AAAA,UACvD,OAAO,CAAC,OAAO,YAAY,CAAC;AAAA,QAC9B;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa;AAAA;AAAA,MAEtB,UAAU,CAAC,SAAS,QAAQ,UAAU,cAAc,KAAK;AAAA,MACzD,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,SAAS,gBAAgB,QAAQ;AAAA,QACvC,IAAI,CAAC,OAAO,OAAO,KAAK,EAAE,EAAE,SAAS,MAAM,GAAG;AAAA,UAC5C,OAAO,CAAC;AAAA,QACV;AAAA,QACA,OAAO,CAAC,OAAO,YAAY,CAAC;AAAA;AAAA,IAEhC;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OACE,aAAa,YAAY,aAAa,aAAa,aAAa;AAAA;AAAA,MAGpE,UAAU,CAAC,SAAS,QAAQ,UAAU,OAAO,YAAY;AAAA,IAC3D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa;AAAA;AAAA,MAEtB,UAAU,CAAC,SAAS,UAAU,UAAU,UAAU,OAAO,OAAO;AAAA,IAClE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa;AAAA,QAC7B,OAAO,aAAa,aAAa,aAAa;AAAA;AAAA,MAEhD,UAAU,CAAC,SAAS,QAAQ,QAAQ,UAAU,UAAU,KAAK;AAAA,IAC/D;AAAA,EACF;AAAA;;;IC9Ka;AAAA;AAAA,0BAA0C;AAAA,IAIrD;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,WAAW,gBAAgB,OAAO,WAAW,YAAY,MAAM;AAAA,IAC5E;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,yBAAyB,aAAa;AAAA,MACrD,UAAU,CAAC,aAAa,YAAY,QAAQ,UAAU;AAAA,IACxD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,gBAAgB,QAAQ,QAAQ,UAAU;AAAA,IACvD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,gBAAgB,QAAQ,OAAO,UAAU;AAAA,IACtD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,eAAe,aAAa;AAAA,MAC3C,UAAU,CAAC,gBAAgB,QAAQ,OAAO,UAAU;AAAA,IACtD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,MAAM,UAAU,gBAAgB,YAAY,QAAQ,UAAU;AAAA,IAC3E;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,aAAa,aAAa;AAAA,MACzC,UAAU,CAAC,MAAM,UAAU,aAAa,YAAY,SAAS;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,cACb,aAAa,cACb,aAAa;AAAA,MACf,UAAU,CAAC,QAAQ,SAAS,cAAc,SAAS,SAAS;AAAA,IAC9D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,sBACb,SAAS,WAAW,eAAe,KACnC,SAAS,WAAW,eAAe;AAAA,MACrC,UAAU,CAAC,UAAU,OAAO,gBAAgB,YAAY,cAAc;AAAA,IACxE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,SAAS,WAAW,WAAW,cAAc;AAAA,IACpE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,SAAS,UAAU,WAAW,UAAU;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,aAAa,aAAa;AAAA,MACzC,UAAU,CAAC,UAAU,UAAU,gBAAgB,YAAY,YAAY;AAAA,IACzE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,UAAU,gBAAgB,QAAQ,UAAU;AAAA,IACnE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,OAAO,WAAW,cAAc,cAAc;AAAA,IACrE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,gBAAgB,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,UAAU,WAAW,QAAQ,UAAU;AAAA,IAC9D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,cAAc,aAAa;AAAA,MAC1C,UAAU,CAAC,UAAU,QAAQ,SAAS,iBAAiB,iBAAiB;AAAA,IAC1E;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,UAAU,WAAW,QAAQ,OAAO;AAAA,IAC3D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,eACb,aAAa,cACb,aAAa;AAAA,MACf,UAAU,CAAC,UAAU,UAAU,WAAW,QAAQ,cAAc;AAAA,IAClE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,eAAe,aAAa;AAAA,MAC3C,UAAU,CAAC,UAAU,QAAQ,WAAW,cAAc,MAAM;AAAA,IAC9D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,SAAS,cAAc,UAAU,OAAO;AAAA,IAC/D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,mBACZ,SAAS,WAAW,WAAW,KAAK,SAAS,SAAS,OAAO;AAAA,MAChE,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,cAAc,UAAU,YAAY,MAAM,YAAY,OAAO;AAAA,IAC1E;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,eACb,aAAa,kBACb,aAAa,mBACb,aAAa,oBACb,aAAa,mBACb,aAAa,oBACb,aAAa,sBACb,aAAa,uBACb,aAAa;AAAA,MACf,UAAU,CAAC,UAAU,WAAW,QAAQ,SAAS,cAAc;AAAA,IACjE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,iBACb,aAAa,oBACb,aAAa,qBACb,aAAa,sBACb,aAAa,qBACb,aAAa,sBACb,aAAa,wBACb,aAAa,yBACb,aAAa;AAAA,MACf,UAAU,CAAC,YAAY,cAAc,UAAU,cAAc,OAAO;AAAA,IACtE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,gBAAgB,aAAa;AAAA,MAC5C,UAAU,CAAC,SAAS,WAAW,cAAc,QAAQ,QAAQ;AAAA,IAC/D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,oBACb,aAAa,oBACb,aAAa;AAAA,MACf,UAAU,CAAC,QAAQ,WAAW,SAAS,cAAc,KAAK;AAAA,IAC5D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,uBACb,aAAa,uBACZ,SAAS,WAAW,UAAU,MAC5B,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,KAAK;AAAA,MACxD,UAAU,CAAC,WAAW,WAAW,SAAS,WAAW,SAAS;AAAA,IAChE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,sBACb,aAAa,sBACb,aAAa;AAAA,MACf,UAAU,CAAC,UAAU,WAAW,SAAS,OAAO,QAAQ;AAAA,IAC1D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,uBACb,aAAa,uBACb,aAAa;AAAA,MACf,UAAU,CAAC,WAAW,WAAW,SAAS,MAAM;AAAA,IAClD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,oBACb,aAAa,oBACb,aAAa,qBACb,aAAa,qBACb,aAAa;AAAA,MACf,UAAU,CAAC,QAAQ,WAAW,QAAQ,aAAa,QAAQ;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,sBACb,aAAa,sBACb,aAAa;AAAA,MACf,UAAU,CAAC,UAAU,WAAW,QAAQ,aAAa,QAAQ;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,0BACb,aAAa;AAAA,MACf,UAAU,CAAC,cAAc,WAAW,OAAO,cAAc,cAAc;AAAA,IACzE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,uBACb,aAAa,uBACb,aAAa;AAAA,MACf,UAAU,CAAC,WAAW,WAAW,OAAO,cAAc,cAAc;AAAA,IACtE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,wBACb,aAAa,wBACb,aAAa,yBACb,aAAa;AAAA,MACf,UAAU,CAAC,YAAY,OAAO,WAAW,WAAW,QAAQ;AAAA,IAC9D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,uBACb,aAAa,wBACb,aAAa,wBACb,aAAa,gBACb,aAAa;AAAA,MACf,UAAU,CAAC,WAAW,OAAO,WAAW,YAAY;AAAA,IACtD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,UACb,aAAa,gBACb,aAAa,sBACb,aAAa,qBACb,aAAa,eACb,SAAS,WAAW,OAAO;AAAA,MAC7B,UAAU,CAAC,eAAe,OAAO,aAAa,WAAW,QAAQ;AAAA,IACnE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,kBACb,aAAa,iBACb,aAAa;AAAA,MACf,UAAU,CAAC,eAAe,OAAO,WAAW,YAAY,OAAO;AAAA,IACjE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,gBAAgB,SAAS,WAAW,aAAa;AAAA,MAChE,UAAU,CAAC,UAAU,aAAa,SAAS,cAAc,OAAO;AAAA,IAClE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,wBACb,aAAa,yBACb,aAAa,iBACb,aAAa,kBACb,SAAS,WAAW,iBAAiB;AAAA,MACvC,UAAU,CAAC,UAAU,WAAW,cAAc,YAAY,YAAY;AAAA,IACxE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,oBAAoB,KAAK,SAAS,SAAS,MAAM;AAAA,MACrE,UAAU,CAAC,UAAU,WAAW,MAAM,MAAM,YAAY,YAAY;AAAA,IACtE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,cAAc,WAAW,YAAY;AAAA,IAC5D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,WAAW,cAAc,WAAW,WAAW;AAAA,IAC5D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,OAAO,UAAU,mBAAmB,UAAU;AAAA,IAC3D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,OAAO,cAAc,mBAAmB,cAAc;AAAA,IACnE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,YAAY,MAAM,eAC3B,SAAS,YAAY,MAAM;AAAA,MAC7B,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,YAAY,MAAM,kBAC3B,SAAS,YAAY,MAAM;AAAA,MAC7B,UAAU,CAAC,aAAa,WAAW,YAAY,WAAW,UAAU;AAAA,IACtE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,YAAY,MAAM,qBAC3B,SAAS,YAAY,MAAM;AAAA,MAC7B,UAAU,CAAC,gBAAgB,gBAAgB,cAAc,aAAa;AAAA,IACxE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,YAAY,MAAM,aAC3B,SAAS,YAAY,MAAM,gBAC3B,SAAS,YAAY,MAAM;AAAA,MAC7B,UAAU,CAAC,WAAW,SAAS,aAAa,OAAO;AAAA,IACrD;AAAA,EACF;AAAA;;;IC9jBM,mBAoNO;AAAA;AAAA,EApNP,oBAAsC;AAAA,IAI1C;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,oBACb,aAAa,qBACb,aAAa;AAAA,MACf,UAAU,CAAC,UAAU,QAAQ,UAAU,aAAa,UAAU;AAAA,IAChE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,SAAS,cAAc,cAAc;AAAA,IAC5D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,gBAAgB,aAAa,iBAC1C,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,UAAU,WAAW,YAAY,YAAY;AAAA,MAClE,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,sBAAsB;AAAA,QACnD,IAAI,OAAO;AAAA,UACT,MAAM,WAAW,MAAM,GACpB,MAAM,GAAG,EACT,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAAA,UACzD,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,QAC5C;AAAA,QACA,IAAI,aAAa,oBAAoB,aAAa,iBAAiB;AAAA,UACjE,OAAO,CAAC,QAAQ,MAAM;AAAA,QACxB;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,cAAc,aAAa,eACxC,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,QAAQ,SAAS,QAAQ,YAAY;AAAA,MAC1D,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,oBAAoB;AAAA,QACjD,IAAI,OAAO;AAAA,UACT,MAAM,WAAW,MAAM,GACpB,MAAM,GAAG,EACT,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC,EAChC,IAAI,CAAC,MAAM,EAAE,QAAQ,eAAe,IAAI,CAAC;AAAA,UAC5C,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,QAC5C;AAAA,QACA,IAAI,aAAa,kBAAkB,aAAa,eAAe;AAAA,UAC7D,OAAO,CAAC,QAAQ,SAAS,MAAM;AAAA,QACjC;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,iBAAiB,aAAa,kBAC3C,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,WAAW,YAAY,YAAY,SAAS;AAAA,IACnE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,eAAe,aAAa,gBACzC,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,SAAS,YAAY,YAAY,OAAO;AAAA,IAC/D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,mBAAmB,aAAa,oBAC7C,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,OAAO,aAAa,WAAW,OAAO;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,kBAAkB,aAAa,mBAC5C,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,YAAY,WAAW,YAAY;AAAA,IAC1D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,cAAc,aAAa,gBACxC,SAAS,SAAS,OAAO,KAAK,SAAS,WAAW,MAAM;AAAA,MAC3D,UAAU,CAAC,UAAU,OAAO,SAAS,WAAW,YAAY,MAAM;AAAA,MAClE,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,0BAA0B;AAAA,QACvD,IAAI,OAAO;AAAA,UACT,MAAM,WAAW,MAAM,GACpB,MAAM,GAAG,EACT,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC,EAChC,IAAI,CAAC,MAAM,EAAE,QAAQ,eAAe,IAAI,CAAC;AAAA,UAC5C,OAAO,CAAC,OAAO,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAAA,QACxD;AAAA,QACA,OAAO,CAAC,KAAK;AAAA;AAAA,IAEjB;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,mBAAmB,aAAa;AAAA,MAC/C,UAAU,CAAC,UAAU,cAAc,QAAQ,WAAW,aAAa;AAAA,IACrE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,sBAAsB,aAAa;AAAA,MAClD,UAAU,CAAC,UAAU,SAAS,UAAU,YAAY,OAAO;AAAA,IAC7D;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,aAAa,KAAK,SAAS,WAAW,YAAY;AAAA,MACtE,UAAU,CAAC,UAAU,OAAO,SAAS,WAAW,YAAY,cAAc;AAAA,MAC1E,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,QAAQ,SAAS,MAAM,4BAA4B;AAAA,QACzD,IAAI,OAAO;AAAA,UACT,MAAM,WAAW,MAAM,GACpB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,QAAQ,eAAe,IAAI,CAAC;AAAA,UAC5C,OAAO,CAAC,OAAO,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAAA,QACxD;AAAA,QACA,OAAO,CAAC,KAAK;AAAA;AAAA,IAEjB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,mBAAmB,aAAa,oBAC7C,SAAS,SAAS,SAAS,KAAK,SAAS,WAAW,QAAQ;AAAA,MAC/D,UAAU,CAAC,UAAU,YAAY,QAAQ,QAAQ,QAAQ,cAAc;AAAA,IACzE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,cACf,aAAa,cAAc,aAAa,eACxC,SAAS,SAAS,SAAS,KAAK,SAAS,WAAW,QAAQ;AAAA,MAC/D,UAAU,CAAC,UAAU,OAAO,WAAW,YAAY,cAAc;AAAA,IACnE;AAAA,EACF;AAAA,EAKa,kBAAwC;AAAA,IACnD,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,CAAC,aAAa;AAAA,MAEpB,OACE,aAAa,oBACb,aAAa,qBACb,aAAa,oBACb,SAAS,SAAS,YAAY,KAC9B,SAAS,SAAS,cAAc;AAAA;AAAA,IAGpC,aAAa;AAAA,EACf;AAAA;;;ICjOM,mBAkIO;AAAA;AAAA,EAlIP,oBAAsC;AAAA,IAI1C;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,UAAU,WAAW,UAAU;AAAA,IACtD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,gBACZ,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS;AAAA,MACjE,UAAU,CAAC,UAAU,UAAU,YAAY,UAAU,SAAS,OAAO;AAAA,IACvE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,UAAU,eACzB,cAAc,SAAS,cAAc,WACrC,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS,MAC/D,CAAC,SAAS,SAAS,cAAc,KACjC,aAAa,eACb,CAAC,SAAS,WAAW,GAAG;AAAA,MAC1B,UAAU,CAAC,UAAU,YAAY,WAAW,SAAS,YAAY,QAAQ;AAAA,MACzE,iBAAiB,CAAC,aAAa;AAAA,QAE7B,MAAM,QAAQ,SAAS,MAAM,wBAAwB;AAAA,QACrD,IAAI,OAAO;AAAA,UACT,MAAM,OAAO,MAAM,GAAG,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,UAC9D,IAAI,QAAQ,CAAC,CAAC,UAAU,QAAQ,OAAO,EAAE,SAAS,IAAI,GAAG;AAAA,YACvD,OAAO,CAAC,KAAK,YAAY,CAAC;AAAA,UAC5B;AAAA,QACF;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,cACZ,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS;AAAA,MACjE,UAAU,CAAC,UAAU,QAAQ,UAAU,OAAO,aAAa,MAAM;AAAA,IACnE;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,eACZ,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS;AAAA,MACjE,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,qBAAqB,KACvC,SAAS,WAAW,oBAAoB;AAAA,MAC1C,UAAU,CAAC,UAAU,aAAa,SAAS,KAAK;AAAA,IAClD;AAAA,IAKA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,aAAa,cACZ,SAAS,SAAS,UAAU,KAAK,SAAS,WAAW,SAAS;AAAA,MACjE,UAAU,CAAC,UAAU,QAAQ,kBAAkB,SAAS,OAAO;AAAA,IACjE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,aAAa;AAAA,MAC5C,UAAU,CAAC,UAAU,QAAQ,UAAU,aAAa,OAAO;AAAA,IAC7D;AAAA,EACF;AAAA,EAKa,kBAAwC;AAAA,IACnD,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,CAAC,aAAa;AAAA,MAEpB,OACE,aAAa,iBACb,SAAS,WAAW,SAAS,KAC7B,SAAS,SAAS,UAAU;AAAA;AAAA,IAGhC,aAAa;AAAA,EACf;AAAA;;;ACnIO,SAAS,0BAA0B,GAAG;AAAA,EAC3C,OAAO,mBAAmB,QAAQ,CAAC,MAAM,EAAE,WAAW;AAAA;AAAA,IAT3C;AAAA;AAAA,EAPb;AAAA,EACA;AAAA,EA0BA;AAAA,EACA;AAAA,EArBa,qBAA6C;AAAA,IACxD;AAAA,IACA;AAAA,EACF;AAAA;;;ACDA;AA6FO,SAAS,cAAc,GAAqB;AAAA,EACjD,OAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG,2BAA2B;AAAA,IAC9B,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA;AASK,SAAS,qBAAqB,CAAC,UAA4B;AAAA,EAChE,MAAM,cAAc,eAAe;AAAA,EACnC,MAAM,WAAgB,eAAS,QAAQ;AAAA,EACvC,MAAM,YAAiB,cAAQ,QAAQ;AAAA,EACvC,MAAM,WAAW,IAAI;AAAA,EAErB,WAAW,cAAc,aAAa;AAAA,IACpC,IAAI;AAAA,MACF,IAAI,WAAW,MAAM,UAAU,UAAU,SAAS,GAAG;AAAA,QAEnD,WAAW,WAAW,WAAW,UAAU;AAAA,UACzC,SAAS,IAAI,QAAQ,YAAY,CAAC;AAAA,QACpC;AAAA,QAGA,IAAI,WAAW,iBAAiB;AAAA,UAC9B,MAAM,aAAa,WAAW,gBAAgB,QAAQ;AAAA,UACtD,WAAW,MAAM,YAAY;AAAA,YAC3B,IAAI,MAAM,GAAG,SAAS,GAAG;AAAA,cACvB,SAAS,IAAI,GAAG,YAAY,CAAC;AAAA,YAC/B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EAEA,OAAO,MAAM,KAAK,QAAQ;AAAA;AAAA,IAtHtB,2BAqCA;AAAA;AAAA,EApDN;AAAA,EACA;AAAA,EACA;AAAA,EA0KA;AAAA,EACA;AAAA,EACA;AAAA,EA/JM,4BAA8C;AAAA,IAClD;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAAa,SAAS,SAAS,OAAO;AAAA,MACxD,UAAU,CAAC,SAAS,gBAAgB,cAAc,aAAa;AAAA,IACjE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,SAAS,WAAW,KAAK,aAAa;AAAA,MACjD,UAAU,CAAC,SAAS,eAAe,cAAc,YAAY;AAAA,MAC7D,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,QAAQ,SAAS,MAAM,qBAAqB;AAAA,QAClD,IAAI;AAAA,UAAO,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC;AAAA,QACzC,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,SAAS,KAAK,SAAS,WAAW,QAAQ;AAAA,MAC9D,UAAU,CAAC,SAAS,aAAa;AAAA,IACnC;AAAA,EACF;AAAA,EAKM,sBAAwC;AAAA,IAC5C;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,aAChB,SAAS,SAAS,QAAQ,KAC1B,SAAS,SAAS,QAAQ,KAC1B,SAAS,SAAS,QAAQ;AAAA,MAC5B,UAAU,CAAC,QAAQ,QAAQ,WAAW;AAAA,MACtC,iBAAiB,CAAC,aAAa;AAAA,QAC7B,MAAM,QAAQ,SAAS,MAAM,wBAAwB;AAAA,QACrD,IAAI;AAAA,UAAO,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC;AAAA,QACzC,OAAO,CAAC;AAAA;AAAA,IAEZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,OAAO,CAAC,aACN,SAAS,SAAS,aAAa,KAC/B,SAAS,SAAS,QAAQ,KAC1B,SAAS,SAAS,SAAS,KAC3B,SAAS,WAAW,YAAY,KAChC,SAAS,WAAW,OAAO,KAC3B,SAAS,WAAW,QAAQ;AAAA,MAC9B,UAAU,CAAC,QAAQ,SAAS;AAAA,IAC9B;AAAA,EACF;AAAA;;;AClGA;AAiNO,SAAS,cAAc,CAC5B,UACA,WACA,aACmB;AAAA,EACnB,MAAM,iBAAiB,SAAS,QAAQ,OAAO,GAAG;AAAA,EAClD,MAAM,WAAW,eAAe,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EACrE,MAAM,WAAW,SAAS,SAAS,SAAS,MAAM;AAAA,EAClD,MAAM,MAAW,cAAQ,QAAQ;AAAA,EAEjC,MAAM,UAAU,mBAAmB,gBAAgB,SAAS;AAAA,EAC5D,MAAM,WAAW,sBAAsB,QAAQ;AAAA,EAC/C,MAAM,QAAQ,YAAY,UAAU,QAAQ;AAAA,EAC5C,MAAM,SAAS,aAAa,QAAQ;AAAA,EACpC,MAAM,QAAQ,YAAY,UAAU,SAAS,KAAK;AAAA,EAClD,MAAM,YAAY,cAAc,gBAAgB,WAAW,IAAI;AAAA,EAE/D,OAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,SAAS,SAAS;AAAA,IACzB,cAAc,SAAS,MAAM,GAAG,EAAE;AAAA,EACpC;AAAA;AAMK,SAAS,uBAAuB,CAAC,OAAoC;AAAA,EAC1E,MAAM,WAAqB,CAAC;AAAA,EAG5B,MAAM,WAAgB,eAAS,MAAM,QAAQ;AAAA,EAC7C,MAAM,qBAAqB,SAAS,QAAQ,YAAY,EAAE;AAAA,EAC1D,MAAM,gBAAgB,mBACnB,MAAM,OAAO,EACb,QAAQ,CAAC,SAAS,KAAK,MAAM,WAAW,CAAC,EACzC,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,EAChC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAAA,EACnC,SAAS,KAAK,GAAG,aAAa;AAAA,EAC9B,SAAS,KAAK,mBAAmB,YAAY,CAAC;AAAA,EAG9C,IAAI,MAAM,QAAQ,QAAQ,MAAM,QAAQ,SAAS,QAAQ;AAAA,IACvD,SAAS,KAAK,MAAM,QAAQ,KAAK,YAAY,CAAC;AAAA,EAChD;AAAA,EAGA,IAAI,MAAM,UAAU;AAAA,IAAW,SAAS,KAAK,MAAM,KAAK;AAAA,EACxD,IAAI,MAAM;AAAA,IAAO,SAAS,KAAK,MAAM,KAAK;AAAA,EAC1C,IAAI,MAAM;AAAA,IAAQ,SAAS,KAAK,MAAM,MAAM;AAAA,EAC5C,IAAI,MAAM,aAAa;AAAA,IAAW,SAAS,KAAK,MAAM,QAAQ;AAAA,EAC9D,IAAI,MAAM;AAAA,IAAW,SAAS,KAAK,MAAM,SAAS;AAAA,EAGlD,MAAM,eAAe,IAAI,IAAI,CAAC,OAAO,OAAO,OAAO,CAAC;AAAA,EACpD,WAAW,WAAW,MAAM,cAAc;AAAA,IACxC,IAAI,CAAC,aAAa,IAAI,QAAQ,YAAY,CAAC,KAAK,QAAQ,SAAS,GAAG;AAAA,MAClE,SAAS,KAAK,QAAQ,YAAY,CAAC;AAAA,IACrC;AAAA,EACF;AAAA,EAGA,MAAM,qBAAqB,sBAAsB,MAAM,QAAQ;AAAA,EAC/D,SAAS,KAAK,GAAG,kBAAkB;AAAA,EAEnC,OAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAAA;AAMvB,SAAS,mBAAmB,CAAC,MAAqB;AAAA,EACvD,MAAM,YAAY,KAAK,YAAY;AAAA,EAEnC,YAAY,OAAO,aAAa,OAAO,QAAQ,cAAc,GAAG;AAAA,IAC9D,IAAI,UAAU;AAAA,MAAW;AAAA,IACzB,WAAW,WAAW,UAAU;AAAA,MAC9B,IAAI,UAAU,SAAS,OAAO,GAAG;AAAA,QAC/B,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMF,SAAS,kBAAkB,CAChC,UACA,WACS;AAAA,EACT,MAAM,iBAAiB,SAAS,QAAQ,OAAO,GAAG;AAAA,EAClD,MAAM,UAAqB,CAAC;AAAA,EAG5B,WAAW,WAAW,UAAU,UAAU;AAAA,IACxC,IACE,mBAAmB,QAAQ,QAC3B,eAAe,WAAW,QAAQ,OAAO,GAAG,GAC5C;AAAA,MACA,QAAQ,KAAK,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,SAAS,GAAG;AAAA,IACtB,OAAO,QAAQ,OAAO,CAAC,MAAM,YAC3B,QAAQ,KAAK,SAAS,KAAK,KAAK,SAAS,UAAU,IACrD;AAAA,EACF;AAAA,EAGA,aAAa,SAAS,UAAU,kBAAkB;AAAA,IAChD,MAAM,QAAQ,eAAe,MAAM,OAAO;AAAA,IAC1C,IAAI,OAAO;AAAA,MACT,OAAO,EAAE,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI,KAAK;AAAA,IAChD;AAAA,EACF;AAAA,EAGA,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,MAAM,UAAU,YAAY,UAAU;AAAA;AA8EzE,SAAS,WAAW,CAAC,UAAoB,UAAsC;AAAA,EAC7E,MAAM,gBAAgB,SAAS,YAAY;AAAA,EAC3C,YAAY,OAAO,aAAa,OAAO,QAAQ,cAAc,GAAG;AAAA,IAC9D,WAAW,WAAW,UAAU;AAAA,MAC9B,IAAI,cAAc,SAAS,OAAO;AAAA,QAAG,OAAO;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,SAAS,IAAI,SAAS,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,IAC7C,MAAM,UAAU,SAAS,GAAG,YAAY;AAAA,IACxC,YAAY,OAAO,aAAa,OAAO,QAAQ,cAAc,GAAG;AAAA,MAC9D,IAAI,SAAS,SAAS,OAAO;AAAA,QAAG,OAAO;AAAA,IACzC;AAAA,EACF;AAAA,EAEA;AAAA;AAGF,SAAS,YAAY,CAAC,UAAwC;AAAA,EAC5D,MAAM,eAAe,IAAI,IAAI;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,OAAO,OAAO,cAAc,EAAE,KAAK;AAAA,EACxC,CAAC;AAAA,EAED,WAAW,WAAW,UAAU;AAAA,IAC9B,MAAM,eAAe,QAAQ,YAAY;AAAA,IACzC,IAAI,aAAa,IAAI,YAAY;AAAA,MAAG;AAAA,IAEpC,IAAI,gBAAgB,SAAS,YAAY;AAAA,MAAG,OAAO;AAAA,IAEnD,WAAW,UAAU,iBAAiB;AAAA,MACpC,IAAI,aAAa,WAAW,MAAM,KAAK,aAAa,SAAS,MAAM,GAAG;AAAA,QACpE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA;AAGF,SAAS,WAAW,CAClB,UACA,SACA,OACO;AAAA,EACP,MAAM,eAAe,oBAAoB,QAAQ,IAAI;AAAA,EACrD,IAAI,iBAAiB;AAAA,IAAW,OAAO;AAAA,EAEvC,IAAI,OAAO;AAAA,IACT,QAAQ;AAAA,WACD;AAAA,WACA;AAAA,WACA;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,WACA;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA;AAAA,EAEb;AAAA,EAEA,WAAW,WAAW,UAAU;AAAA,IAC9B,MAAM,eAAe,QAAQ,YAAY;AAAA,IACzC,IAAI,CAAC,UAAU,OAAO,SAAS,EAAE,SAAS,YAAY;AAAA,MAAG,OAAO;AAAA,IAChE,IAAI,CAAC,UAAU,OAAO,YAAY,IAAI,EAAE,SAAS,YAAY;AAAA,MAC3D,OAAO;AAAA,IACT,IAAI,CAAC,UAAU,UAAU,OAAO,MAAM,EAAE,SAAS,YAAY;AAAA,MAC3D,OAAO;AAAA,EACX;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,eAAe,CAAC,SAAqC;AAAA,EAC5D,YAAY,WAAW,eAAe,OAAO,QAAQ,oBAAoB,GAAG;AAAA,IAC1E,WAAW,aAAa,YAAY;AAAA,MAClC,IACE,QAAQ,SAAS,SAAS,WAAW,KACrC,QAAQ,SAAS,SAAS,WAAW,KACrC,QAAQ,SAAS,YAAY,WAAW,KACxC,QAAQ,SAAS,YAAY,WAAW,GACxC;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAAA,IA9eI,gBAkCA,iBA0DA,sBAcA,uBA8BA,gBAgCA;AAAA;AAAA,EAjLN;AAAA,EASM,iBAA2C;AAAA,IAC/C,YAAY,CAAC,cAAc,OAAO,UAAU,SAAS,SAAS;AAAA,IAC9D,SAAS,CAAC,WAAW,SAAS,WAAW,YAAY,SAAS;AAAA,IAC9D,YAAY,CAAC,cAAc,QAAQ,OAAO,SAAS,aAAa;AAAA,IAChE,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,CAAC,QAAQ,SAAS,UAAU,WAAW,UAAU,KAAK;AAAA,IAC5D,QAAQ,CAAC,UAAU,iBAAiB,UAAU;AAAA,IAC9C,YAAY,CAAC,cAAc,aAAa;AAAA,IACxC,QAAQ,CAAC,QAAQ;AAAA,IACjB,gBAAgB,CAAC,kBAAkB,OAAO;AAAA,IAC1C,aAAa,CAAC,eAAe,KAAK;AAAA,IAClC,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,CAAC,QAAQ,SAAS,QAAQ,SAAS,aAAa,KAAK;AAAA,EAC7D;AAAA,EAKM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAKM,uBAAiD;AAAA,IACrD,QAAQ,CAAC,QAAQ,OAAO;AAAA,IACxB,SAAS,CAAC,SAAS;AAAA,IACnB,SAAS,CAAC,SAAS;AAAA,IACnB,OAAO,CAAC,OAAO;AAAA,IACf,KAAK,CAAC,KAAK;AAAA,IACX,SAAS,CAAC,WAAW;AAAA,IACrB,QAAQ,CAAC,UAAU;AAAA,IACnB,KAAK,CAAC,KAAK;AAAA,EACb;AAAA,EAKM,wBAAgD;AAAA,IACpD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EAKM,iBAA0C;AAAA,IAC9C,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,UAAU,UAAU,SAAS,OAAO,QAAQ,SAAS,QAAQ;AAAA,IACtE,SAAS,CAAC,WAAW,SAAS,OAAO,YAAY,SAAS,UAAU,OAAO;AAAA,IAC3E,SAAS,CAAC;AAAA,EACZ;AAAA,EAKM,mBAID;AAAA,IACH,EAAE,SAAS,kBAAkB,MAAM,OAAO,cAAc,UAAU;AAAA,IAClE,EAAE,SAAS,sBAAsB,MAAM,WAAW,cAAc,SAAS;AAAA,IACzE,EAAE,SAAS,kBAAkB,MAAM,WAAW,cAAc,SAAS;AAAA,IACrE,EAAE,SAAS,sBAAsB,MAAM,WAAW,cAAc,UAAU;AAAA,IAC1E,EAAE,SAAS,qBAAqB,MAAM,UAAU,cAAc,UAAU;AAAA,IACxE,EAAE,SAAS,mBAAmB,MAAM,UAAU,cAAc,UAAU;AAAA,EACxE;AAAA;;;AC/BO,SAAS,cAAc,CAAC,SAAoC;AAAA,EACjE,MAAM,UAA6B,CAAC;AAAA,EACpC,MAAM,cAAc,IAAI;AAAA,EAGxB,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,EAEhC,aAAa,MAAM,SAAS,cAAc,iBAAiB;AAAA,IAEzD,QAAQ,YAAY;AAAA,IAEpB,IAAI;AAAA,IACJ,QAAQ,QAAQ,QAAQ,KAAK,OAAO,OAAO,MAAM;AAAA,MAC/C,MAAM,OAAO,MAAM;AAAA,MACnB,MAAM,YAAY,GAAG,QAAQ;AAAA,MAG7B,IAAI,YAAY,IAAI,SAAS;AAAA,QAAG;AAAA,MAChC,YAAY,IAAI,SAAS;AAAA,MAGzB,MAAM,cAAc,QAAQ,UAAU,GAAG,MAAM,KAAK;AAAA,MACpD,MAAM,OAAO,YAAY,MAAM;AAAA,CAAI,EAAE;AAAA,MAErC,QAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAGA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAAA;AASxC,SAAS,iBAAiB,CAAC,SAAsC;AAAA,EACtE,MAAM,WAAW,IAAI;AAAA,EAErB,WAAW,UAAU,SAAS;AAAA,IAE5B,SAAS,IAAI,OAAO,KAAK,YAAY,CAAC;AAAA,IAGtC,MAAM,QAAQ,OAAO,KAClB,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,yBAAyB,OAAO,EACxC,YAAY,EACZ,MAAM,KAAK;AAAA,IAEd,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,KAAK,SAAS,GAAG;AAAA,QACnB,SAAS,IAAI,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,KAAK,QAAQ;AAAA;AAAA,IAhNtB;AAAA;AAAA,oBAID;AAAA,IAEH;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAGA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAGA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAGA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IAGA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;;;;;;;ACtJA;AACA;AAAA;AA2DO,MAAM,WAAkC;AAAA,EACpC,KAAK;AAAA,EACL,OAAO;AAAA,EACP,cAAc;AAAA,EACd,UAAU;AAAA,EAKnB,YAAY,CAAC,WAA4B;AAAA,IACvC,OAAO;AAAA;AAAA,EAGD,cAA6C,IAAI;AAAA,EACjD,YAA8B;AAAA,EAC9B,UAAkB;AAAA,OAEpB,WAAU,CAAC,SAAsC;AAAA,OAOjD,UAAS,CACb,UACA,SACA,KAC2B;AAAA,IAC3B,KAAK,UAAU,IAAI;AAAA,IAGnB,MAAM,UAAU,eAAe,OAAO;AAAA,IACtC,MAAM,iBAAiB,kBAAkB,OAAO;AAAA,IAGhD,MAAM,gBAAgB,SAAS,OAAO;AAAA,IAGtC,MAAM,QAAQ,IAAI,mBAAmB,QAAQ;AAAA,IAC7C,MAAM,gBAAgB,QAAQ,wBAAwB,KAAK,IAAI,CAAC;AAAA,IAEhE,MAAM,YAAY;AAAA,MAChB,GAAG,IAAI,IAAI,CAAC,GAAG,eAAe,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAAA,IACpE;AAAA,IAGA,MAAM,SAAS,KAAK,aAAa,UAAU,SAAS,OAAO;AAAA,IAG3D,MAAM,QAAQ,MAAM,IAAI,aAAa,QAAQ;AAAA,IAG7C,KAAK,YAAY,IAAI,UAAU;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAAA,IAGD,MAAM,aAA6B;AAAA,MACjC;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IAEA,OAAO;AAAA,MACL;AAAA,MACA,cAAc,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA;AAAA,EAMM,YAAY,CAClB,UACA,SACA,SACS;AAAA,IACT,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,IAChC,MAAM,SAAkB,CAAC;AAAA,IAGzB,SACM,QAAQ,EACZ,QAAQ,MAAM,QACd,SAAS,kBAAkB,eAC3B;AAAA,MACA,MAAM,MAAM,KAAK,IAAI,QAAQ,iBAAiB,MAAM,MAAM;AAAA,MAC1D,MAAM,aAAa,MAAM,MAAM,OAAO,GAAG;AAAA,MACzC,MAAM,eAAe,WAAW,KAAK;AAAA,CAAI;AAAA,MAGzC,MAAM,eAAe,QAAQ,OAC3B,CAAC,MAAM,EAAE,QAAQ,QAAQ,KAAK,EAAE,QAAQ,GAC1C;AAAA,MAGA,IAAI,YAAuB;AAAA,MAC3B,IAAI;AAAA,MACJ,IAAI,aAAa;AAAA,MAEjB,IAAI,aAAa,SAAS,GAAG;AAAA,QAC3B,MAAM,gBAAgB,aAAa;AAAA,QACnC,YAAY,KAAK,sBAAsB,cAAc,IAAI;AAAA,QACzD,YAAY,cAAc;AAAA,QAC1B,aAAa,cAAc;AAAA,MAC7B;AAAA,MAEA,MAAM,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,MAE5C,OAAO,KAAK;AAAA,QACV,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,QAAQ;AAAA,QACnB,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,MAGD,IAAI,OAAO,MAAM;AAAA,QAAQ;AAAA,IAC3B;AAAA,IAEA,OAAO;AAAA;AAAA,EAMD,qBAAqB,CAAC,YAA+B;AAAA,IAC3D,QAAQ;AAAA,WACD;AAAA,WACA;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA,WACJ;AAAA,QACH,OAAO;AAAA;AAAA,QAEP,OAAO;AAAA;AAAA;AAAA,OAOP,SAAQ,CAAC,KAAkC;AAAA,IAC/C,MAAM,SAAS,IAAI;AAAA,IACnB,MAAM,UAAe,WACnB,cAAc,IAAI,SAAS,MAAM,GACjC,SACA,MACF;AAAA,IAGA,MAAS,UAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IAG3C,KAAK,YAAY,IAAI;AAAA,IACrB,YAAY,UAAU,UAAU,KAAK,aAAa;AAAA,MAChD,KAAK,UAAU,YAAY,UAAU,MAAM,MAAM;AAAA,IACnD;AAAA,IAGA,MAAM,kBAAkB;AAAA,MACtB,SAAS,KAAK;AAAA,MACd,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,MACpC,OAAO,OAAO,YAAY,KAAK,WAAW;AAAA,MAC1C,UAAU,KAAK,UAAU,UAAU;AAAA,IACrC;AAAA,IAEA,MAAS,cACF,WAAK,SAAS,cAAc,GACjC,KAAK,UAAU,iBAAiB,MAAM,CAAC,CACzC;AAAA;AAAA,OAMI,OAAM,CACV,OACA,KACA,SACyB;AAAA,IACzB,MAAM,SAAS,IAAI;AAAA,IACnB,MAAM,OAAO,SAAS,QAAQ;AAAA,IAC9B,MAAM,WAAW,SAAS,YAAY;AAAA,IAGtC,IAAI,KAAK,YAAY,SAAS,GAAG;AAAA,MAC/B,MAAM,KAAK,gBAAgB,IAAI,SAAS,MAAM;AAAA,IAChD;AAAA,IAEA,IAAI,CAAC,KAAK,aAAa,KAAK,YAAY,SAAS,GAAG;AAAA,MAClD,OAAO,CAAC;AAAA,IACV;AAAA,IAGA,MAAM,cAAc,SAAS,KAAK;AAAA,IAGlC,MAAM,cAAc,KAAK,UAAU,OAAO,OAAO,OAAO,CAAC;AAAA,IACzD,MAAM,aAAa,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAAA,IAGlE,MAAM,gBAAgB,KAAK,kBAAkB,WAAW;AAAA,IAGxD,MAAM,UAA0B,CAAC;AAAA,IAEjC,WAAW,YAAY,KAAK,YAAY,KAAK,GAAG;AAAA,MAC9C,MAAM,QAAQ,KAAK,YAAY,IAAI,QAAQ;AAAA,MAC3C,MAAM,YAAY,WAAW,IAAI,QAAQ,KAAK;AAAA,MAC9C,MAAM,cAAc,cAAc,IAAI,QAAQ,KAAK;AAAA,MAGnD,IAAI,cAAc,KAAK,gBAAgB;AAAA,QAAG;AAAA,MAG1C,MAAM,gBAAgB,MAAM,eAAe,SAAS,IAAI,MAAM;AAAA,MAE9D,IAAI,iBAAiB,UAAU;AAAA,QAE7B,MAAM,YAAY,MAAM,IAAI,cAAc,QAAQ;AAAA,QAClD,IAAI,CAAC;AAAA,UAAW;AAAA,QAGhB,MAAM,YAAY,KAAK,cACrB,UAAU,QACV,aACA,MAAM,OACR;AAAA,QAEA,QAAQ,KAAK;AAAA,UACX;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,UAAU,KAAK;AAAA,UACf,SAAS;AAAA,YACP,WAAW,eAAe,SAAS;AAAA,YACnC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAGA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;AAAA;AAAA,EAMxD,iBAAiB,CAAC,aAA4C;AAAA,IACpE,MAAM,UAAU,IAAI;AAAA,IAEpB,YAAY,UAAU,UAAU,KAAK,aAAa;AAAA,MAChD,IAAI,aAAa;AAAA,MAEjB,WAAW,UAAU,MAAM,SAAS;AAAA,QAClC,MAAM,aAAa,OAAO,KAAK,YAAY;AAAA,QAC3C,MAAM,cAAc,kBAAkB,CAAC,MAAM,CAAC;AAAA,QAE9C,WAAW,SAAS,aAAa;AAAA,UAE/B,IAAI,eAAe,OAAO;AAAA,YACxB,cAAc,OAAO,aAAa,IAAM;AAAA,UAC1C,EAEK,SAAI,WAAW,SAAS,KAAK,KAAK,MAAM,SAAS,UAAU,GAAG;AAAA,YACjE,cAAc,OAAO,aAAa,MAAM;AAAA,UAC1C,EAEK,SAAI,YAAY,KAAK,CAAC,MAAM,MAAM,KAAK,GAAG;AAAA,YAC7C,cAAc,OAAO,aAAa,MAAM;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,MAEA,IAAI,aAAa,GAAG;AAAA,QAElB,QAAQ,IAAI,UAAU,KAAK,IAAI,GAAG,aAAa,YAAY,MAAM,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAMD,aAAa,CACnB,QACA,aACA,SACO;AAAA,IACP,IAAI,YAAY,OAAO;AAAA,IACvB,IAAI,YAAY;AAAA,IAEhB,WAAW,SAAS,QAAQ;AAAA,MAC1B,IAAI,QAAQ;AAAA,MACZ,MAAM,eAAe,MAAM,QAAQ,YAAY;AAAA,MAG/C,WAAW,SAAS,aAAa;AAAA,QAC/B,IAAI,aAAa,SAAS,KAAK,GAAG;AAAA,UAChC,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,MAAM;AAAA,QACd,MAAM,YAAY,MAAM,KAAK,YAAY;AAAA,QACzC,WAAW,SAAS,aAAa;AAAA,UAC/B,IAAI,UAAU,SAAS,KAAK,GAAG;AAAA,YAC7B,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,YAAY;AAAA,QACpB,SAAS;AAAA,MACX;AAAA,MAEA,IAAI,QAAQ,WAAW;AAAA,QACrB,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAMK,gBAAe,CAAC,SAAiB,QAA4B;AAAA,IACzE,MAAM,UAAe,WAAK,cAAc,SAAS,MAAM,GAAG,SAAS,MAAM;AAAA,IACzE,MAAM,cAAmB,WAAK,SAAS,cAAc;AAAA,IAErD,IAAI;AAAA,MACF,MAAM,UAAU,MAAS,aAAS,aAAa,OAAO;AAAA,MACtD,MAAM,OAAO,KAAK,MAAM,OAAO;AAAA,MAG/B,KAAK,cAAc,IAAI,IAAI,OAAO,QAAQ,KAAK,KAAK,CAAC;AAAA,MAGrD,IAAI,KAAK,UAAU;AAAA,QACjB,KAAK,YAAY,UAAU,YAAY,KAAK,QAAQ;AAAA,MACtD;AAAA,MACA,OAAO,OAAO;AAAA,MAEd,KAAK,cAAc,IAAI;AAAA,MACvB,KAAK,YAAY;AAAA;AAAA;AAAA,OAIf,QAAO,GAAkB;AAAA,IAC7B,KAAK,YAAY,MAAM;AAAA,IACvB,KAAK,YAAY;AAAA;AAErB;AAAA,IArZM,oBAAoB,KAGpB,gBAAgB,IAGhB,kBAAkB,IAGlB,gBAAgB;AAAA;AAAA,EAlBtB;AAAA,EACA;AAAA,EACA;AAAA;;;AC7BA;AAAA;AAAA;AAAA;AAKA;AACA;AAAA;AA+CO,MAAM,8BAA2D;AAAA,EAC9D,WAA6C;AAAA,EAC7C;AAAA,EACA,iBAAiB;AAAA,EACjB,cAAoC;AAAA,EAE5C,WAAW,CAAC,QAAmC;AAAA,IAC7C,KAAK,SAAS;AAAA,MACZ,OAAO,QAAQ,SAAS;AAAA,MACxB,cAAc,QAAQ,gBAAgB;AAAA,MACtC,QAAQ,QAAQ;AAAA,IAClB;AAAA;AAAA,OAGI,WAAU,CAAC,QAAyC;AAAA,IACxD,IAAI,QAAQ;AAAA,MAEV,IAAI,OAAO,UAAU,KAAK,OAAO,OAAO;AAAA,QACtC,KAAK,WAAW;AAAA,MAClB;AAAA,MACA,KAAK,SAAS,KAAK,KAAK,WAAW,OAAO;AAAA,IAC5C;AAAA,IAEA,MAAM,KAAK,eAAe;AAAA;AAAA,OAGd,eAAc,GAAkB;AAAA,IAC5C,IAAI,KAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,IAGA,IAAI,KAAK,kBAAkB,KAAK,aAAa;AAAA,MAC3C,OAAO,KAAK;AAAA,IACd;AAAA,IAEA,KAAK,iBAAiB;AAAA,IAEtB,KAAK,eAAe,YAAY;AAAA,MAC9B,MAAM,UAAU,kBAAiB,KAAK,OAAO;AAAA,MAC7C,MAAM,SAAS,KAAK,OAAO;AAAA,MAC3B,MAAM,eAAe,KAAK,OAAO,gBAAgB,CAAC,CAAC;AAAA,MAGnD,MAAM,WAAW,MAAM,cAAc,KAAK,OAAO,KAAK;AAAA,MAGtD,IAAI,eAAe;AAAA,MAEnB,IAAI;AAAA,QACF,KAAK,WAAW,MAAM,SAAS,sBAAsB,SAAS;AAAA,UAE5D,mBACE,gBAAgB,CAAC,WACb,CAAC,aAIK;AAAA,YACJ,IAAI,SAAS,WAAW,cAAc,SAAS,MAAM;AAAA,cAEnD,IAAI,CAAC,cAAc;AAAA,gBACjB,eAAe;AAAA,gBACf,IAAI,QAAQ;AAAA,kBACV,OAAO,KACL,gCAAgC,KAAK,OAAO,OAC9C;AAAA,gBACF,EAAO;AAAA,kBACL,QAAQ,IACN;AAAA,6BAAgC,KAAK,OAAO,OAC9C;AAAA,kBACA,QAAQ,IAAI,YAAY,WAAW;AAAA;AAAA,cAEvC;AAAA,cACA,MAAM,MAAM,SAAS,WACjB,KAAK,MAAM,SAAS,QAAQ,IAC5B;AAAA,cAEJ,IAAI,QAAQ;AAAA,gBACV,OAAO,SACL,iBAAiB,SAAS,SAAS,MACrC;AAAA,cACF,EAAO;AAAA,gBACL,QAAQ,OAAO,MACb,mBAAmB,SAAS,SAAS,SACvC;AAAA;AAAA,YAEJ,EAAO,SAAI,SAAS,WAAW,UAAU,SAAS,MAAM;AAAA,cACtD,IAAI,QAAQ;AAAA,gBACV,OAAO,cAAc;AAAA,gBACrB,OAAO,KAAK,gBAAgB,SAAS,MAAM;AAAA,cAC7C,EAAO,SAAI,cAAc;AAAA,gBACvB,QAAQ,OAAO,MACb,kBAAkB,SAAS;AAAA,CAC7B;AAAA,cACF;AAAA,YACF;AAAA,cAEF;AAAA,QACR,CAAC;AAAA,QAGD,IAAI,cAAc;AAAA,UAChB,IAAI,QAAQ;AAAA,YACV,OAAO,cAAc;AAAA,YACrB,OAAO,KAAK,gBAAgB,KAAK,OAAO,OAAO;AAAA,UACjD,EAAO;AAAA,YACL,QAAQ,IAAI;AAAA,CAAkB;AAAA;AAAA,QAElC;AAAA,QACA,OAAO,OAAO;AAAA,QACd,KAAK,WAAW;AAAA,QAChB,IAAI,QAAQ;AAAA,UACV,OAAO,cAAc;AAAA,QACvB;AAAA,QACA,MAAM,IAAI,MAAM,mCAAmC,OAAO;AAAA,gBAC1D;AAAA,QACA,KAAK,iBAAiB;AAAA,QACtB,KAAK,cAAc;AAAA;AAAA,OAEpB;AAAA,IAEH,OAAO,KAAK;AAAA;AAAA,OAGR,aAAY,CAAC,MAAiC;AAAA,IAClD,MAAM,KAAK,eAAe;AAAA,IAE1B,IAAI,CAAC,KAAK,UAAU;AAAA,MAClB,MAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,IAEA,MAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AAAA,MACvC,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AAAA,IAED,OAAO,MAAM,KAAK,OAAO,IAAoB;AAAA;AAAA,OAGzC,cAAa,CAAC,OAAsC;AAAA,IACxD,IAAI,MAAM,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IAEhC,MAAM,KAAK,eAAe;AAAA,IAE1B,IAAI,CAAC,KAAK,UAAU;AAAA,MAClB,MAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,IAEA,MAAM,UAAsB,CAAC;AAAA,IAG7B,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK,YAAY;AAAA,MACjD,MAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,UAAU;AAAA,MAE3C,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,IAAI,OAAO,SAAS;AAAA,QACxB,MAAM,SAAS,MAAM,KAAK,SAAU,MAAM;AAAA,UACxC,SAAS;AAAA,UACT,WAAW;AAAA,QACb,CAAC;AAAA,QACD,OAAO,MAAM,KAAK,OAAO,IAAoB;AAAA,OAC9C,CACH;AAAA,MAEA,QAAQ,KAAK,GAAG,OAAO;AAAA,IACzB;AAAA,IAEA,OAAO;AAAA;AAAA,EAGT,YAAY,GAAW;AAAA,IACrB,OAAO,qBAAqB,KAAK,OAAO;AAAA;AAAA,EAG1C,YAAY,GAAW;AAAA,IACrB,OAAO,KAAK,OAAO;AAAA;AAAA,OAGf,QAAO,GAAkB;AAAA,IAC7B,KAAK,WAAW;AAAA;AAEpB;AAYA,eAAsB,aAAa,CACjC,OACkB;AAAA,EAClB,MAAM,UAAU,kBAAiB;AAAA,EAGjC,MAAM,YAAiB,WAAK,WAAW,OAAO;AAAA,EAE9C,IAAI;AAAA,IACF,MAAM,MAAK,MAAa;AAAA,IAExB,MAAM,WAAgB,WAAK,WAAW,QAAQ,sBAAsB;AAAA,IACpE,MAAM,IAAG,OAAO,QAAQ;AAAA,IACxB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAmBJ,SAAS,mBAAmB,CAAC,QAAwC;AAAA,EAC1E,MAAM,YAAY,KAAK,iBAAiB,OAAO;AAAA,EAG/C,IACE,UAAU,UAAU,aAAa,SACjC,UAAU,WAAW,aAAa,QAClC;AAAA,IACA,iBAAiB;AAAA,EACnB;AAAA,EAEA,eAAe;AAAA;AAMV,SAAS,kBAAkB,GAAoB;AAAA,EACpD,OAAO,KAAK,aAAa;AAAA;AAM3B,eAAe,oBAAoB,GAA2C;AAAA,EAC5E,IAAI,CAAC,gBAAgB;AAAA,IACnB,iBAAiB,IAAI,8BAA8B,YAAY;AAAA,IAC/D,MAAM,eAAe,WAAW;AAAA,EAClC;AAAA,EACA,OAAO;AAAA;AAMT,eAAsB,YAAY,CAAC,MAAiC;AAAA,EAClE,MAAM,WAAW,MAAM,qBAAqB;AAAA,EAC5C,OAAO,SAAS,aAAa,IAAI;AAAA;AAMnC,eAAsB,aAAa,CAAC,OAAsC;AAAA,EACxE,MAAM,WAAW,MAAM,qBAAqB;AAAA,EAC5C,OAAO,SAAS,cAAc,KAAK;AAAA;AAAA,IAnT/B,WAOO,mBASA,sBASP,aAAa,IAmOf,iBAAuD,MACvD;AAAA;AAAA,EA7PE,YAAiB,WAAQ,YAAQ,GAAG,UAAU,WAAW,QAAQ;AAAA,EAGvE,IAAI,WAAW;AAAA,EACf,IAAI,mBAAmB;AAAA,EAGV,oBAAuD;AAAA,IAClE,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,EAC3B;AAAA,EAGa,uBAA2D;AAAA,IACtE,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,EAC3B;AAAA,EAuOI,eAAgC;AAAA,IAClC,OAAO;AAAA,IACP,cAAc;AAAA,IACd,QAAQ;AAAA,EACV;AAAA;;;;ECrRA;AAAA;;;AC6CO,SAAS,eAAe,CAC7B,SACA,MACA,cAAsB,IACZ;AAAA,EACV,MAAM,WAAW,IAAI;AAAA,EAGrB,IAAI,MAAM;AAAA,IACR,SAAS,IAAI,KAAK,YAAY,CAAC;AAAA,IAG/B,MAAM,QAAQ,KAAK,MAAM,WAAW,EAAE,IAAI,OAAK,EAAE,YAAY,CAAC;AAAA,IAC9D,MAAM,QAAQ,OAAK,EAAE,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC;AAAA,EACpD;AAAA,EAGA,MAAM,kBAAkB;AAAA,EACxB,IAAI;AAAA,EAEJ,QAAQ,QAAQ,gBAAgB,KAAK,OAAO,OAAO,MAAM;AAAA,IACvD,MAAM,OAAO,MAAM,GAAG,YAAY;AAAA,IAGlC,IAAI,CAAC,gBAAgB,IAAI,IAAI,KAAK,KAAK,SAAS,GAAG;AAAA,MACjD,SAAS,IAAI,IAAI;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,KAAK,QAAQ,EAAE,MAAM,GAAG,WAAW;AAAA;AAMlD,SAAS,eAAe,CAAC,KAAuB;AAAA,EAC9C,OAAO,IAEJ,QAAQ,mBAAmB,OAAO,EAElC,QAAQ,SAAS,GAAG,EACpB,MAAM,KAAK,EACX,IAAI,OAAK,EAAE,YAAY,CAAC,EACxB,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA;AActB,SAAS,mBAAmB,CAAC,UAA4B;AAAA,EAC9D,MAAM,WAAW,IAAI;AAAA,EAGrB,MAAM,iBAAiB,SAAS,QAAQ,YAAY,EAAE;AAAA,EACtD,MAAM,WAAW,eAAe,MAAM,OAAO;AAAA,EAE7C,WAAW,WAAW,UAAU;AAAA,IAC9B,IAAI,QAAQ,SAAS;AAAA,MAAG;AAAA,IAGxB,MAAM,QAAQ,QAAQ,YAAY;AAAA,IAClC,IAAI,CAAC,gBAAgB,IAAI,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,MACnD,SAAS,IAAI,KAAK;AAAA,IACpB;AAAA,IAGA,MAAM,QAAQ,gBAAgB,OAAO;AAAA,IACrC,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,CAAC,gBAAgB,IAAI,IAAI,KAAK,KAAK,SAAS,GAAG;AAAA,QACjD,SAAS,IAAI,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,KAAK,QAAQ;AAAA;AA8BrB,SAAS,gBAAgB,CAAC,UAA+B;AAAA,EAC9D,MAAM,iBAAiB,SAAS,QAAQ,YAAY,EAAE;AAAA,EACtD,MAAM,cAAc,eAAe,MAAM,OAAO;AAAA,EAChD,MAAM,WAAW,YAAY,YAAY,SAAS;AAAA,EAClD,MAAM,cAAc,YAAY,MAAM,GAAG,EAAE;AAAA,EAG3C,MAAM,WAAW,oBAAoB,QAAQ;AAAA,EAG7C,IAAI;AAAA,EACJ,MAAM,WAAW,CAAC,GAAG,aAAa,QAAQ,EAAE,IAAI,OAAK,EAAE,YAAY,CAAC,EAAE,KAAK,GAAG;AAAA,EAC9E,MAAM,gBAAgB,SAAS,YAAY;AAAA,EAE3C,YAAY,WAAW,aAAa,OAAO,QAAQ,eAAc,GAAG;AAAA,IAClE,WAAW,WAAW,UAAU;AAAA,MAE9B,IAAI,cAAc,SAAS,OAAO,GAAG;AAAA,QACnC,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MAEA,IAAI,YAAY,KAAK,OAAK,EAAE,YAAY,MAAM,OAAO,GAAG;AAAA,QACtD,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI;AAAA,MAAO;AAAA,EACb;AAAA,EAKA,IAAI;AAAA,EACJ,MAAM,kBAAkB,IAAI,IAAI,OAAO,OAAO,eAAc,EAAE,KAAK,CAAC;AAAA,EAGpE,MAAM,mBAAmB,CAAC,GAAG,WAAW,EAAE,QAAQ;AAAA,EAClD,WAAW,WAAW,kBAAkB;AAAA,IACtC,MAAM,QAAQ,QAAQ,YAAY;AAAA,IAElC,IAAI,CAAC,OAAO,OAAO,OAAO,YAAY,SAAS,EAAE,SAAS,KAAK;AAAA,MAAG;AAAA,IAElE,IAAI,gBAAgB,IAAI,KAAK;AAAA,MAAG;AAAA,IAEhC,IAAI,MAAM,SAAS,GAAG;AAAA,MACpB,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,OAAO,YAAY;AAAA,IACnB;AAAA,EACF;AAAA;AAUK,SAAS,6BAA6B,CAAC,aAAkC;AAAA,EAC9E,MAAM,QAAkB,CAAC;AAAA,EAEzB,IAAI,YAAY,QAAQ;AAAA,IACtB,MAAM,KAAK,YAAY,MAAM;AAAA,EAC/B;AAAA,EAEA,IAAI,YAAY,OAAO;AAAA,IACrB,MAAM,KAAK,YAAY,KAAK;AAAA,EAC9B;AAAA,EAGA,MAAM,sBAAsB,YAAY,SACrC,MAAM,EAAE,EACR,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,CAAC,OAAO,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAAA,EAE/E,IAAI,oBAAoB,SAAS,GAAG;AAAA,IAClC,MAAM,KAAK,GAAG,oBAAoB,IAAI,OAAK,EAAE,YAAY,CAAC,CAAC;AAAA,EAC7D;AAAA,EAEA,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO;AAAA,EAG/B,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAAA,EACjC,OAAO,IAAI,OAAO,KAAK,GAAG;AAAA;AAAA,IAnPf,iBAkBA;AAAA;AAAA,EAlBA,kBAAkB,IAAI,IAAI;AAAA,IAErC;AAAA,IAAS;AAAA,IAAO;AAAA,IAAO;AAAA,IAAY;AAAA,IAAS;AAAA,IAAa;AAAA,IAAQ;AAAA,IACjE;AAAA,IAAU;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAC/D;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAa;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAO;AAAA,IAC3D;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAY;AAAA,IAAO;AAAA,IAAS;AAAA,IACvD;AAAA,IAAS;AAAA,IAAU;AAAA,IAAc;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAM;AAAA,IACzD;AAAA,IAAU;AAAA,IAAU;AAAA,IAAW;AAAA,IAAO;AAAA,IAAW;AAAA,IAAS;AAAA,IAC1D;AAAA,IAAU;AAAA,IAAW;AAAA,IAAa;AAAA,IAAU;AAAA,IAAY;AAAA,IACxD;AAAA,IAAc;AAAA,IAAW;AAAA,IAAS;AAAA,IAAO;AAAA,IAAO;AAAA,IAEhD;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,EAC3D,CAAC;AAAA,EAMY,kBAA2C;AAAA,IACtD,YAAc,CAAC,cAAc,eAAe,WAAW,YAAY,SAAS,UAAU,KAAK;AAAA,IAC3F,SAAW,CAAC,WAAW,YAAY,WAAW,YAAY,aAAa;AAAA,IACvE,YAAc,CAAC,cAAc,gBAAgB,QAAQ,SAAS,OAAO,SAAS,SAAS;AAAA,IACvF,OAAS,CAAC,SAAS,UAAU,UAAU,YAAY,UAAU,SAAS;AAAA,IACtE,MAAQ,CAAC,QAAQ,SAAS,WAAW,aAAa,UAAU,WAAW,UAAU,QAAQ;AAAA,IACzF,QAAU,CAAC,UAAU,WAAW,iBAAiB,UAAU;AAAA,IAC3D,YAAc,CAAC,cAAc,eAAe,eAAe,cAAc;AAAA,IACzE,QAAU,CAAC,UAAU,QAAQ,UAAU;AAAA,IACvC,gBAAkB,CAAC,kBAAkB,SAAS,YAAY,UAAU;AAAA,IACpE,cAAgB,CAAC,gBAAgB,QAAQ,SAAS,aAAa,cAAc,IAAI;AAAA,IACjF,MAAQ,CAAC,QAAQ,SAAS,QAAQ,SAAS,aAAa,UAAU;AAAA,EACpE;AAAA;;;AC1BO,SAAS,gBAAgB,CAAC,GAAa,GAAqB;AAAA,EACjE,IAAI,EAAE,WAAW,EAAE,QAAQ;AAAA,IACzB,MAAM,IAAI,MAAM,2BAA2B,EAAE,aAAa,EAAE,QAAQ;AAAA,EACtE;AAAA,EAEA,IAAI,aAAa;AAAA,EACjB,IAAI,QAAQ;AAAA,EACZ,IAAI,QAAQ;AAAA,EAEZ,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,KAAK;AAAA,IACjC,cAAc,EAAE,KAAK,EAAE;AAAA,IACvB,SAAS,EAAE,KAAK,EAAE;AAAA,IAClB,SAAS,EAAE,KAAK,EAAE;AAAA,EACpB;AAAA,EAEA,MAAM,YAAY,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK;AAAA,EAEpD,IAAI,cAAc;AAAA,IAAG,OAAO;AAAA,EAE5B,OAAO,aAAa;AAAA;;;AC3BtB;AA6EO,SAAS,iBAAiB,CAAC,YAAmC;AAAA,EACnE,MAAM,wBAAwB,WAAW,KAAK,CAAC,SAC7C,qBAAqB,SAAS,IAAI,CACpC;AAAA,EACA,MAAM,uBAAuB,WAAW,KAAK,CAAC,SAC5C,oBAAoB,SAAS,IAAI,CACnC;AAAA,EAIA,IAAI,sBAAsB;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,uBAAuB;AAAA,IACzB,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;AASF,SAAS,iBAAiB,CAAC,OAAyB;AAAA,EACzD,OAAO,MACJ,YAAY,EACZ,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA;AAUxB,SAAS,gBAAgB,CAAC,UAA2B;AAAA,EAC1D,MAAM,MAAW,cAAQ,QAAQ,EAAE,YAAY;AAAA,EAC/C,OAAO,uBAAuB,SAAS,GAAG;AAAA;AAMrC,SAAS,SAAS,CAAC,UAA2B;AAAA,EACnD,MAAM,MAAW,cAAQ,QAAQ,EAAE,YAAY;AAAA,EAC/C,OAAO,eAAe,SAAS,GAAG;AAAA;AAoB7B,SAAS,sBAAsB,CACpC,UACA,YACQ;AAAA,EACR,MAAM,eAAe,iBAAiB,QAAQ;AAAA,EAC9C,MAAM,QAAQ,UAAU,QAAQ;AAAA,EAEhC,MAAM,SAAS,kBAAkB,UAAU;AAAA,EAG3C,IAAI,WAAW,kBAAkB;AAAA,IAC/B,IAAI,cAAc;AAAA,MAChB,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,iBAAiB;AAAA,IAC9B,IAAI,OAAO;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,EACT;AAAA,EAGA,OAAO;AAAA;AAAA,IAzKI,sBAgBA,qBAqBA,wBAcA;AAAA;AAAA,EAnDA,uBAAuB;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAGa,sBAAsB;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAGa,yBAAyB;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAGa,iBAAiB,CAAC,OAAO,QAAQ,MAAM;AAAA;;;ACC7C,SAAS,qBAAqB,CACnC,SACA,UAA2B,CAAC,GACf;AAAA,EACb;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,4BAA4B;AAAA,MAC1B;AAAA,EAEJ,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,EAChC,MAAM,SAAsB,CAAC;AAAA,EAG7B,IAAI,MAAM,UAAU,2BAA2B;AAAA,IAC7C,OAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,WAAW;AAAA,QACX,SAAS,MAAM;AAAA,QACf,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAGA,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK,YAAY,SAAS;AAAA,IAC1D,MAAM,SAAS,KAAK,IAAI,IAAI,WAAW,MAAM,MAAM;AAAA,IACnD,OAAO,KAAK;AAAA,MACV,SAAS,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK;AAAA,CAAI;AAAA,MACzC,WAAW,IAAI;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,IAED,IAAI,UAAU,MAAM;AAAA,MAAQ;AAAA,EAC9B;AAAA,EAEA,OAAO;AAAA;AA4BF,SAAS,eAAe,CAC7B,UACA,WACA,SACQ;AAAA,EACR,MAAM,WAAW,SAAS,QAAQ,UAAU,GAAG,EAAE,QAAQ,OAAO,GAAG;AAAA,EACnE,OAAO,GAAG,YAAY,aAAa;AAAA;AAAA,IA5FxB,qBAAqB,IAGrB,kBAAkB;;;;EC/B/B;AAAA,EAaA;AAAA;;;ACrBA;AAiCO,SAAS,mBAAmB,CACjC,SACA,UACe;AAAA,EACf,OAAO,gBAAgB,SAAS,QAAQ;AAAA;AAS1C,SAAS,eAAe,CAAC,SAAiB,UAAiC;AAAA,EACzE,MAAM,SAAwB,CAAC;AAAA,EAC/B,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,EAGhC,MAAM,aAAgB,oBACpB,UACA,SACG,gBAAa,QAChB,MACA,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,MAAM,IAC9C,cAAW,MACX,cAAW,EACpB;AAAA,EAKA,SAAS,cAAc,CAAC,MAGtB;AAAA,IACA,MAAM,QAAQ,WAAW,8BAA8B,KAAK,SAAS,CAAC;AAAA,IACtE,MAAM,MAAM,WAAW,8BAA8B,KAAK,OAAO,CAAC;AAAA,IAClE,OAAO;AAAA,MACL,WAAW,MAAM,OAAO;AAAA,MACxB,SAAS,IAAI,OAAO;AAAA,IACtB;AAAA;AAAA,EAMF,SAAS,WAAW,CAAC,MAAuB;AAAA,IAC1C,OAAO,KAAK,QAAQ,UAAU;AAAA;AAAA,EAMhC,SAAS,UAAU,CAAC,MAAwB;AAAA,IAC1C,IAAI,CAAI,oBAAiB,IAAI;AAAA,MAAG,OAAO;AAAA,IACvC,MAAM,YAAe,gBAAa,IAAI;AAAA,IACtC,OACE,WAAW,KAAK,CAAC,MAAM,EAAE,SAAY,cAAW,aAAa,KAAK;AAAA;AAAA,EAOtE,SAAS,QAAQ,CAAC,MAAmC;AAAA,IACnD,MAAM,aAAgB,2BAAwB,IAAI;AAAA,IAClD,IAAI,WAAW,WAAW;AAAA,MAAG;AAAA,IAE7B,OAAO,WAAW,IAAI,CAAC,QAAQ,IAAI,QAAQ,UAAU,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA;AAAA,EAMnE,SAAS,eAAe,CAAC,MAAmC;AAAA,IAC1D,IAAO,yBAAsB,IAAI,KAAK,KAAK,MAAM;AAAA,MAC/C,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,IAAO,uBAAoB,IAAI,KAAQ,gBAAa,KAAK,IAAI,GAAG;AAAA,MAC9D,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,IAAO,yBAAsB,IAAI,KAAQ,gBAAa,KAAK,IAAI,GAAG;AAAA,MAChE,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA;AAAA;AAAA,EAMF,SAAS,KAAK,CAAC,MAAqB;AAAA,IAClC,QAAQ,WAAW,YAAY,eAAe,IAAI;AAAA,IAGlD,IAAO,yBAAsB,IAAI,KAAK,KAAK,MAAM;AAAA,MAC/C,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,uBAAoB,IAAI,GAAG;AAAA,MAChC,WAAW,QAAQ,KAAK,gBAAgB,cAAc;AAAA,QACpD,IACE,KAAK,gBACD,mBAAgB,KAAK,WAAW,KAC/B,wBAAqB,KAAK,WAAW,IAC1C;AAAA,UACA,MAAM,OAAU,gBAAa,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AAAA,UAC3D,OAAO,KAAK;AAAA,YACV,SAAS,YAAY,IAAI;AAAA,YACzB;AAAA,YACA;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA,YAAY,WAAW,IAAI;AAAA,YAC3B,OAAO,SAAS,IAAI;AAAA,UACtB,CAAC;AAAA,UACD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAGA,IAAO,sBAAmB,IAAI,KAAK,KAAK,MAAM;AAAA,MAC5C,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,0BAAuB,IAAI,GAAG;AAAA,MACnC,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,0BAAuB,IAAI,GAAG;AAAA,MACnC,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,qBAAkB,IAAI,GAAG;AAAA,MAC9B,OAAO,KAAK;AAAA,QACV,SAAS,YAAY,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,YAAY,WAAW,IAAI;AAAA,QAC3B,OAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAGA,IAAO,uBAAoB,IAAI,KAAK,WAAW,IAAI,GAAG;AAAA,MACpD,WAAW,QAAQ,KAAK,gBAAgB,cAAc;AAAA,QAEpD,IACE,KAAK,gBACD,mBAAgB,KAAK,WAAW,KAC/B,wBAAqB,KAAK,WAAW,IAC1C;AAAA,UACA;AAAA,QACF;AAAA,QACA,MAAM,OAAU,gBAAa,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AAAA,QAC3D,OAAO,KAAK;AAAA,UACV,SAAS,YAAY,IAAI;AAAA,UACzB;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,YAAY;AAAA,UACZ,OAAO,SAAS,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,IAGG,gBAAa,MAAM,KAAK;AAAA;AAAA,EAI1B,gBAAa,YAAY,KAAK;AAAA,EAIjC,IAAI,OAAO,WAAW,GAAG;AAAA,IACvB,MAAM,SAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,IAChC,OAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,WAAW;AAAA,QACX,SAAS,OAAM;AAAA,QACf,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAUF,SAAS,gBAAe,CAC7B,UACA,WACA,SACQ;AAAA,EACR,MAAM,WAAW,SAAS,QAAQ,UAAU,GAAG,EAAE,QAAQ,OAAO,GAAG;AAAA,EACnE,OAAO,GAAG,YAAY,aAAa;AAAA;AAAA;;;;ECjRrC;AAAA;;;ACNA;AACA;AAAA;AAUO,MAAM,cAAc;AAAA,EACjB,OAAiC;AAAA,EACjC,gBAA0C,IAAI;AAAA,EAC9C,YAA8B;AAAA,EAC9B;AAAA,EACA;AAAA,EAER,WAAW,CAAC,UAAkB,UAAkB;AAAA,IAC9C,KAAK,eAAoB,WAAK,UAAU,SAAS,UAAU,UAAU;AAAA,IACrE,KAAK,WAAW;AAAA;AAAA,OAMZ,WAAU,GAAkB;AAAA,IAChC,IAAI;AAAA,MACF,MAAM,KAAK,KAAK;AAAA,MAChB,MAAM;AAAA,MAEN,KAAK,OAAO;AAAA,QACV,SAAS;AAAA,QACT,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,QACpC,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,QACX,UAAU;AAAA,UACR,cAAc;AAAA,UACd,qBAAqB,CAAC;AAAA,UACtB,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA,KAAK,YAAY,IAAI;AAAA;AAAA;AAAA,EAOzB,OAAO,CAAC,SAA4B;AAAA,IAClC,KAAK,cAAc,IAAI,QAAQ,UAAU,OAAO;AAAA;AAAA,EAMlD,UAAU,CAAC,UAA2B;AAAA,IACpC,OAAO,KAAK,cAAc,OAAO,QAAQ;AAAA;AAAA,EAM3C,cAAc,GAAS;AAAA,IACrB,KAAK,YAAY,IAAI;AAAA,IAGrB,YAAY,UAAU,YAAY,KAAK,eAAe;AAAA,MACpD,MAAM,UAAU;AAAA,QACd,GAAG,QAAQ;AAAA,QACX,GAAG,QAAQ;AAAA,QACX,GAAG,oBAAoB,QAAQ;AAAA,MACjC,EAAE,KAAK,GAAG;AAAA,MAEV,KAAK,UAAU,aAAa,CAAC,EAAE,IAAI,UAAU,QAAQ,CAAC,CAAC;AAAA,IACzD;AAAA,IAGA,IAAI,KAAK,MAAM;AAAA,MACb,KAAK,KAAK,YAAY,KAAK,cAAc;AAAA,MACzC,KAAK,KAAK,SAAS,YAAY,KAAK,cAAc;AAAA,IACpD;AAAA;AAAA,EAMF,cAAc,CAAC,OAAe,gBAAwB,IAAc;AAAA,IAClE,IAAI,CAAC,KAAK,WAAW;AAAA,MACnB,OAAO,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC;AAAA,IAC7C;AAAA,IAEA,MAAM,UAAU,KAAK,UAAU,OAAO,OAAO,aAAa;AAAA,IAC1D,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA;AAAA,EAMhC,WAAW,GAAa;AAAA,IACtB,OAAO,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC;AAAA;AAAA,EAM7C,cAAc,CAAC,UAA2C;AAAA,IACxD,OAAO,KAAK,cAAc,IAAI,QAAQ;AAAA;AAAA,OAMlC,KAAI,GAAkB;AAAA,IAC1B,IAAI,CAAC,KAAK;AAAA,MAAM,MAAM,IAAI,MAAM,uBAAuB;AAAA,IAGvD,KAAK,KAAK,cAAc,IAAI,KAAK,EAAE,YAAY;AAAA,IAC/C,KAAK,KAAK,YAAY,KAAK,cAAc;AAAA,IAGzC,MAAS,UAAM,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,IAGrD,MAAM,WAAgB,WAAK,KAAK,cAAc,YAAY;AAAA,IAC1D,MAAS,cAAU,UAAU,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,IAG/D,YAAY,UAAU,YAAY,KAAK,eAAe;AAAA,MACpD,MAAM,cAAc,KAAK,mBAAmB,QAAQ;AAAA,MACpD,MAAS,UAAW,cAAQ,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MAC7D,MAAS,cAAU,aAAa,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,IAClE;AAAA;AAAA,OAMI,KAAI,GAAkB;AAAA,IAE1B,MAAM,WAAgB,WAAK,KAAK,cAAc,YAAY;AAAA,IAC1D,MAAM,cAAc,MAAS,aAAS,UAAU,OAAO;AAAA,IACvD,KAAK,OAAO,KAAK,MAAM,WAAW;AAAA,IAGlC,KAAK,cAAc,MAAM;AAAA,IACzB,MAAM,KAAK,2BAA2B,KAAK,YAAY;AAAA,IAGvD,KAAK,eAAe;AAAA;AAAA,OAMR,2BAA0B,CAAC,KAA4B;AAAA,IACnE,IAAI;AAAA,MACF,MAAM,UAAU,MAAS,YAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,MAE7D,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,WAAgB,WAAK,KAAK,MAAM,IAAI;AAAA,QAE1C,IAAI,MAAM,YAAY,GAAG;AAAA,UACvB,MAAM,KAAK,2BAA2B,QAAQ;AAAA,QAChD,EAAO,SAAI,MAAM,KAAK,SAAS,OAAO,KAAK,MAAM,SAAS,cAAc;AAAA,UACtE,IAAI;AAAA,YACF,MAAM,UAAU,MAAS,aAAS,UAAU,OAAO;AAAA,YACnD,MAAM,UAAU,KAAK,MAAM,OAAO;AAAA,YAClC,IAAI,QAAQ,UAAU;AAAA,cACpB,KAAK,cAAc,IAAI,QAAQ,UAAU,OAAO;AAAA,YAClD;AAAA,YACA,MAAM;AAAA,QAGV;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,EAQF,kBAAkB,CAAC,UAA0B;AAAA,IACnD,MAAM,WAAW,SAAS,QAAQ,YAAY,OAAO;AAAA,IACrD,OAAY,WAAK,KAAK,cAAc,QAAQ;AAAA;AAAA,OAMxC,kBAAiB,CAAC,UAAiC;AAAA,IACvD,IAAI;AAAA,MACF,MAAS,WAAO,KAAK,mBAAmB,QAAQ,CAAC;AAAA,MACjD,MAAM;AAAA,IAGR,KAAK,cAAc,OAAO,QAAQ;AAAA;AAAA,OAM9B,OAAM,GAAqB;AAAA,IAC/B,IAAI;AAAA,MACF,MAAM,WAAgB,WAAK,KAAK,cAAc,YAAY;AAAA,MAC1D,MAAS,WAAO,QAAQ;AAAA,MACxB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,MAOP,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,cAAc;AAAA;AAAA,EAM5B,KAAK,GAAS;AAAA,IACZ,KAAK,cAAc,MAAM;AAAA,IACzB,IAAI,KAAK,MAAM;AAAA,MACb,KAAK,KAAK,YAAY;AAAA,MACtB,KAAK,KAAK,WAAW;AAAA,QACnB,cAAc;AAAA,QACd,qBAAqB,CAAC;AAAA,QACtB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,KAAK,YAAY,IAAI;AAAA;AAEzB;AAAA;AAAA,EAzOA;AAAA;;;;ECTA;AAAA,EACA;AAAA;;;;;;;;;;;;ACMA;AAgEO,SAAS,gBAAgB,CAAC,UAA2B;AAAA,EAC1D,MAAM,MAAW,cAAQ,QAAQ,EAAE,YAAY;AAAA,EAC/C,OAAO,sBAAsB,SAAS,GAAG;AAAA;AAU3C,SAAS,uBAAuB,CAAC,OAAsB;AAAA,EACrD,QAAQ,MAAM;AAAA,SACP;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,SACA;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,SACA;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,SACA;AAAA;AAAA,MAEH,OAAO;AAAA;AAAA;AAQb,SAAS,oBAAoB,CAAC,OAAsB;AAAA,EAClD,OAAO,MAAM,aAAa,OAAO;AAAA;AAAA;AAa5B,MAAM,iBAAwC;AAAA,EAC1C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,cACP;AAAA,EACO,UAAU;AAAA,EAEnB,YAAY,CAAC,UAA2B;AAAA,IACtC,OAAO,iBAAiB,QAAQ;AAAA;AAAA,EAG1B,kBAA0C;AAAA,EAC1C,gBAAsC;AAAA,EACtC,mBAA6C,IAAI;AAAA,EACjD,UAAkB;AAAA,EAClB,SAA6B;AAAA,OAE/B,WAAU,CAAC,QAAqC;AAAA,IAEpD,KAAK,kBAAkB,6BAA6B,MAAM;AAAA,IAG1D,KAAK,SAAS,OAAO,SAAS;AAAA,IAG9B,IAAI,KAAK,QAAQ;AAAA,MACf,KAAK,kBAAkB;AAAA,WAClB,KAAK;AAAA,QACR,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,IAGA,oBAAoB,KAAK,eAAe;AAAA,IAGxC,KAAK,iBAAiB,MAAM;AAAA;AAAA,OAGxB,UAAS,CACb,UACA,SACA,KAC2B;AAAA,IAE3B,IAAI,CAAC,iBAAiB,QAAQ,GAAG;AAAA,MAC/B,OAAO;AAAA,IACT;AAAA,IAGA,KAAK,UAAU,IAAI;AAAA,IAGnB,MAAM,eAAe,oBAAoB,SAAS,QAAQ;AAAA,IAE1D,IAAI,aAAa,WAAW,GAAG;AAAA,MAC7B,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,cAAc,iBAAiB,QAAQ;AAAA,IAC7C,MAAM,aAAa,8BAA8B,WAAW;AAAA,IAI5D,MAAM,gBAAgB,aAAa,IAAI,CAAC,MAAM;AAAA,MAE5C,MAAM,aAAa,EAAE,OAAO,GAAG,EAAE,WAAW;AAAA,MAC5C,OAAO,GAAG,cAAc,aAAa,EAAE;AAAA,KACxC;AAAA,IACD,MAAM,aAAa,MAAM,cAAc,aAAa;AAAA,IAGpD,MAAM,SAAkB,aAAa,IAAI,CAAC,QAAQ;AAAA,MAChD,IAAI,iBAAgB,UAAU,GAAG,WAAW,GAAG,OAAO;AAAA,MACtD,SAAS,GAAG;AAAA,MACZ,WAAW,GAAG;AAAA,MACd,SAAS,GAAG;AAAA,MACZ,MAAM,GAAG;AAAA,MACT,MAAM,GAAG;AAAA,MACT,YAAY,GAAG;AAAA,MACf,OAAO,GAAG;AAAA,IACZ,EAAE;AAAA,IAGF,MAAM,aAAa,KAAK,kBAAkB,SAAS,QAAQ;AAAA,IAE3D,MAAM,QAAQ,MAAM,IAAI,aAAa,QAAQ;AAAA,IAC7C,MAAM,gBAAgB,mBAAmB;AAAA,IAEzC,MAAM,aAAiC;AAAA,MACrC;AAAA,MACA,gBAAgB,cAAc;AAAA,IAChC;AAAA,IAGA,MAAM,aAAa;AAAA,MACjB,GAAG,IAAI,IAAI,aAAa,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AAAA,IAC9C;AAAA,IACA,MAAM,UAAU,aACb,OAAO,CAAC,OAAO,GAAG,cAAc,GAAG,IAAI,EACvC,IAAI,CAAC,OAAO,GAAG,IAAK;AAAA,IAGvB,MAAM,cAAc,IAAI;AAAA,IACxB,WAAW,MAAM,cAAc;AAAA,MAC7B,MAAM,WAAW,gBAAgB,GAAG,SAAS,GAAG,IAAI;AAAA,MACpD,SAAS,QAAQ,CAAC,MAAM,YAAY,IAAI,CAAC,CAAC;AAAA,IAC5C;AAAA,IAEA,YAAY,SAAS,QAAQ,CAAC,MAAM,YAAY,IAAI,CAAC,CAAC;AAAA,IAEtD,MAAM,cAA2B;AAAA,MAC/B;AAAA,MACA,YAAY,OAAO;AAAA,MACnB;AAAA,MACA,UAAU,MAAM,KAAK,WAAW;AAAA,MAChC;AAAA,MACA,cAAc,MAAM;AAAA,MAEpB,aAAa;AAAA,QACX,UAAU,YAAY;AAAA,QACtB,OAAO,YAAY;AAAA,QACnB,QAAQ,YAAY;AAAA,QACpB,OAAO,YAAY;AAAA,MACrB;AAAA,IACF;AAAA,IAGA,KAAK,iBAAiB,IAAI,UAAU,WAAW;AAAA,IAE/C,OAAO;AAAA,MACL;AAAA,MACA,cAAc,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,OAMI,SAAQ,CAAC,KAAkC;AAAA,IAC/C,MAAM,WAAW,cAAc,IAAI,SAAS,IAAI,MAAM;AAAA,IAGtD,KAAK,gBAAgB,IAAI,cAAc,UAAU,KAAK,EAAE;AAAA,IACxD,MAAM,KAAK,cAAc,WAAW;AAAA,IAGpC,YAAY,UAAU,YAAY,KAAK,kBAAkB;AAAA,MACvD,KAAK,cAAc,QAAQ,OAAO;AAAA,IACpC;AAAA,IAGA,KAAK,cAAc,eAAe;AAAA,IAGlC,MAAM,KAAK,cAAc,KAAK;AAAA,IAG9B,KAAK,iBAAiB,MAAM;AAAA;AAAA,OAexB,OAAM,CACV,OACA,KACA,UAAyB,CAAC,GACD;AAAA,IACzB;AAAA,MACE,OAAO;AAAA,MACP,WAAW;AAAA,MACX;AAAA,QACE;AAAA,IAGJ,MAAM,WAAW,cAAc,IAAI,SAAS,IAAI,MAAM;AAAA,IACtD,MAAM,gBAAgB,IAAI,cAAc,UAAU,KAAK,EAAE;AAAA,IAIzD,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,MAAM,cAAc,WAAW;AAAA,MAC/B,WAAW,cAAc,YAAY;AAAA,MACrC,MAAM;AAAA,MAEN,WAAW,MAAM,IAAI,iBAAiB;AAAA;AAAA,IAIxC,IAAI,gBAAgB;AAAA,IACpB,IAAI,gBAAgB,aAAa,SAAS,GAAG;AAAA,MAC3C,gBAAgB,SAAS,OAAO,CAAC,aAAa;AAAA,QAC5C,OAAO,aAAa,KAAK,CAAC,YAAY;AAAA,UACpC,IAAI,QAAQ,WAAW,IAAI,GAAG;AAAA,YAC5B,MAAM,MAAM,QAAQ,MAAM,CAAC;AAAA,YAC3B,OAAO,SAAS,SAAS,GAAG;AAAA,UAC9B;AAAA,UACA,OAAO,SAAS,SAAS,OAAO;AAAA,SACjC;AAAA,OACF;AAAA,IACH;AAAA,IAGA,MAAM,iBAAiB,MAAM,aAAa,KAAK;AAAA,IAI/C,MAAM,YAAY,IAAI;AAAA,IACtB,MAAM,gBAID,CAAC;AAAA,IAEN,WAAW,YAAY,eAAe;AAAA,MACpC,MAAM,YAAY,MAAM,IAAI,cAAc,QAAQ;AAAA,MAClD,IAAI,CAAC;AAAA,QAAW;AAAA,MAEhB,MAAM,aAAa,UAAU;AAAA,MAC7B,IAAI,CAAC,YAAY;AAAA,QAAY;AAAA,MAE7B,SAAS,IAAI,EAAG,IAAI,UAAU,OAAO,QAAQ,KAAK;AAAA,QAChD,MAAM,QAAQ,UAAU,OAAO;AAAA,QAC/B,MAAM,YAAY,WAAW,WAAW;AAAA,QAExC,IAAI,CAAC;AAAA,UAAW;AAAA,QAEhB,cAAc,KAAK;AAAA,UACjB,UAAU,UAAU;AAAA,UACpB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QAGD,UAAU,aAAa,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,MAAM,QAAQ,CAAC,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,IAGA,MAAM,cAAc,UAAU,OAAO,OAAO,OAAO,CAAC;AAAA,IACpD,MAAM,aAAa,IAAI;AAAA,IAEvB,WAAW,UAAU,aAAa;AAAA,MAChC,WAAW,IAAI,OAAO,IAAI,eAAe,OAAO,OAAO,CAAC,CAAC;AAAA,IAC3D;AAAA,IAGA,MAAM,aAAa,kBAAkB,KAAK;AAAA,IAG1C,MAAM,aAAa,IAAI;AAAA,IACvB,WAAW,YAAY,eAAe;AAAA,MACpC,MAAM,UAAU,cAAc,eAAe,QAAQ;AAAA,MACrD,IAAI,SAAS,aAAa;AAAA,QACxB,IAAI,QAAQ;AAAA,QACZ,MAAM,OAAM,QAAQ;AAAA,QAGpB,IACE,KAAI,UACJ,WAAW,KACT,CAAC,MAAM,KAAI,OAAQ,SAAS,CAAC,KAAK,EAAE,SAAS,KAAI,MAAO,CAC1D,GACA;AAAA,UACA,SAAS;AAAA,QACX;AAAA,QAGA,IACE,KAAI,SACJ,WAAW,KACT,CAAC,MAAM,KAAI,MAAO,SAAS,CAAC,KAAK,EAAE,SAAS,KAAI,KAAM,CACxD,GACA;AAAA,UACA,SAAS;AAAA,QACX;AAAA,QAGA,MAAM,eAAe,KAAI,SAAS,KAAK,CAAC,QACtC,WAAW,KACT,CAAC,MACC,IAAI,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,IAAI,YAAY,CAAC,CACjE,CACF;AAAA,QACA,IAAI,cAAc;AAAA,UAChB,SAAS;AAAA,QACX;AAAA,QAEA,WAAW,IAAI,UAAU,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,IAGA,MAAM,UAA0B,CAAC;AAAA,IAEjC,aAAa,UAAU,OAAO,eAAe,eAAe;AAAA,MAC1D,MAAM,gBAAgB,iBAAiB,gBAAgB,SAAS;AAAA,MAChE,MAAM,YAAY,WAAW,IAAI,MAAM,EAAE,KAAK;AAAA,MAC9C,MAAM,YAAY,WAAW,IAAI,QAAQ,KAAK;AAAA,MAG9C,MAAM,gBAAgB,uBAAuB,UAAU,UAAU;AAAA,MACjE,MAAM,iBAAiB,wBAAwB,KAAK;AAAA,MACpD,MAAM,cAAc,qBAAqB,KAAK;AAAA,MAC9C,MAAM,aACJ,YAAY,gBAAgB,iBAAiB;AAAA,MAG/C,MAAM,cACJ,kBAAkB,gBAAgB,cAAc,YAAY;AAAA,MAE9D,IAAI,eAAe,YAAY,YAAY,KAAK;AAAA,QAC9C,QAAQ,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,UAAU,KAAK;AAAA,UACf,SAAS;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAGA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,IACxC,OAAO,QAAQ,MAAM,GAAG,IAAI;AAAA;AAAA,EAGtB,iBAAiB,CAAC,SAAiB,UAA4B;AAAA,IACrE,MAAM,aAAuB,CAAC;AAAA,IAG9B,MAAM,cAAc;AAAA,IACpB,MAAM,eAAe;AAAA,IAErB,IAAI;AAAA,IACJ,QAAQ,QAAQ,YAAY,KAAK,OAAO,OAAO,MAAM;AAAA,MACnD,MAAM,aAAa,MAAM;AAAA,MACzB,IAAI,WAAW,WAAW,GAAG,GAAG;AAAA,QAC9B,MAAM,MAAW,cAAQ,QAAQ;AAAA,QACjC,MAAM,WAAgB,gBAAe,WAAK,KAAK,UAAU,CAAC;AAAA,QAC1D,WAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,IAEA,QAAQ,QAAQ,aAAa,KAAK,OAAO,OAAO,MAAM;AAAA,MACpD,MAAM,aAAa,MAAM;AAAA,MACzB,IAAI,WAAW,WAAW,GAAG,GAAG;AAAA,QAC9B,MAAM,MAAW,cAAQ,QAAQ;AAAA,QACjC,MAAM,WAAgB,gBAAe,WAAK,KAAK,UAAU,CAAC;AAAA,QAC1D,WAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAEX;AAAA,IArca,qBAAoB,MAGpB,iBAAgB,IAGvB,kBAAkB,KAGlB,cAAc,KAGP,uBAoBA;AAAA;AAAA,EA1Db;AAAA,EAMA;AAAA,EAUA;AAAA,EAIA;AAAA,EACA;AAAA,EAiBa,wBAAwB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAWa,eAAe;AAAA;;;;;;;;;;;;ACtE5B;AAmDO,SAAS,UAAU,CAAC,UAA2B;AAAA,EACpD,MAAM,MAAW,eAAQ,QAAQ,EAAE,YAAY;AAAA,EAC/C,OAAO,gBAAgB,SAAS,GAAG;AAAA;AASrC,SAAS,eAAe,CAAC,KAAc,SAAS,IAAc;AAAA,EAC5D,MAAM,OAAiB,CAAC;AAAA,EAExB,IAAI,QAAQ,QAAQ,QAAQ,WAAW;AAAA,IACrC,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAM,QAAQ,GAAG,GAAG;AAAA,IACtB,IAAI,QAAQ,CAAC,MAAM,UAAU;AAAA,MAC3B,KAAK,KAAK,GAAG,gBAAgB,MAAM,GAAG,UAAU,QAAQ,CAAC;AAAA,KAC1D;AAAA,EACH,EAAO,SAAI,OAAO,QAAQ,UAAU;AAAA,IAClC,YAAY,KAAK,UAAU,OAAO,QAAQ,GAA8B,GAAG;AAAA,MACzE,MAAM,UAAU,SAAS,GAAG,UAAU,QAAQ;AAAA,MAC9C,KAAK,KAAK,GAAG;AAAA,MACb,KAAK,KAAK,GAAG,gBAAgB,OAAO,OAAO,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,mBAAmB,CAAC,SAA2B;AAAA,EACtD,IAAI;AAAA,IACF,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,IACjC,MAAM,OAAO,gBAAgB,MAAM;AAAA,IAGnC,MAAM,eAAyB,CAAC;AAAA,IAChC,MAAM,iBAAiB,CAAC,QAAuB;AAAA,MAC7C,IAAI,OAAO,QAAQ,UAAU;AAAA,QAE3B,MAAM,QAAQ,IACX,QAAQ,mBAAmB,OAAO,EAClC,YAAY,EACZ,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,QAC7B,aAAa,KAAK,GAAG,KAAK;AAAA,MAC5B,EAAO,SAAI,MAAM,QAAQ,GAAG,GAAG;AAAA,QAC7B,IAAI,QAAQ,cAAc;AAAA,MAC5B,EAAO,SAAI,OAAO,OAAO,QAAQ,UAAU;AAAA,QACzC,OAAO,OAAO,GAA8B,EAAE,QAAQ,cAAc;AAAA,MACtE;AAAA;AAAA,IAEF,eAAe,MAAM;AAAA,IAErB,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;AAAA,IAC9C,MAAM;AAAA,IAEN,OAAO,CAAC;AAAA;AAAA;AAAA;AAcL,MAAM,WAAkC;AAAA,EACpC,KAAK;AAAA,EACL,OAAO;AAAA,EACP,cAAc;AAAA,EACd,UAAU;AAAA,EAEnB,YAAY,CAAC,UAA2B;AAAA,IACtC,OAAO,WAAW,QAAQ;AAAA;AAAA,EAGpB,kBAA0C;AAAA,EAC1C,gBAAsC;AAAA,EACtC,mBAA6C,IAAI;AAAA,EACjD,UAAkB;AAAA,EAClB,SAA6B;AAAA,OAE/B,WAAU,CAAC,QAAqC;AAAA,IACpD,KAAK,kBAAkB,6BAA6B,MAAM;AAAA,IAC1D,KAAK,SAAS,OAAO,SAAS;AAAA,IAE9B,IAAI,KAAK,QAAQ;AAAA,MACf,KAAK,kBAAkB;AAAA,WAClB,KAAK;AAAA,QACR,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,IAEA,oBAAoB,KAAK,eAAe;AAAA,IACxC,KAAK,iBAAiB,MAAM;AAAA;AAAA,OAGxB,UAAS,CACb,UACA,SACA,KAC2B;AAAA,IAE3B,IAAI,CAAC,WAAW,QAAQ,GAAG;AAAA,MACzB,OAAO;AAAA,IACT;AAAA,IAEA,KAAK,UAAU,IAAI;AAAA,IAGnB,MAAM,aAAa,sBAAsB,SAAS;AAAA,MAChD,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAAA,IAED,IAAI,WAAW,WAAW,GAAG;AAAA,MAC3B,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,gBAAgB,WAAW,IAAI,CAAC,MAAM;AAAA,MAE1C,MAAM,WAAgB,gBAAS,QAAQ;AAAA,MACvC,OAAO,GAAG,aAAa,EAAE;AAAA,KAC1B;AAAA,IACD,MAAM,aAAa,MAAM,cAAc,aAAa;AAAA,IAGpD,MAAM,SAAkB,WAAW,IAAI,CAAC,IAAI,OAAO;AAAA,MACjD,IAAI,gBAAgB,UAAU,GAAG,WAAW,GAAG,OAAO;AAAA,MACtD,SAAS,GAAG;AAAA,MACZ,WAAW,GAAG;AAAA,MACd,SAAS,GAAG;AAAA,MACZ,MAAM,GAAG;AAAA,IACX,EAAE;AAAA,IAGF,MAAM,WAAW,iBACd,MAAM;AAAA,MACL,IAAI;AAAA,QACF,OAAO,KAAK,MAAM,OAAO;AAAA,QACzB,MAAM;AAAA,QACN,OAAO,CAAC;AAAA;AAAA,OAET,CACL;AAAA,IAEA,MAAM,QAAQ,MAAM,IAAI,aAAa,QAAQ;AAAA,IAC7C,MAAM,gBAAgB,mBAAmB;AAAA,IAEzC,MAAM,aAA6B;AAAA,MACjC;AAAA,MACA,gBAAgB,cAAc;AAAA,MAC9B;AAAA,IACF;AAAA,IAGA,MAAM,WAAW,oBAAoB,OAAO;AAAA,IAE5C,MAAM,cAA2B;AAAA,MAC/B;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,YAAY,CAAC,MAAM;AAAA,MACnB;AAAA,MACA,SAAS,CAAC;AAAA,MACV,cAAc,MAAM;AAAA,IACtB;AAAA,IAEA,KAAK,iBAAiB,IAAI,UAAU,WAAW;AAAA,IAE/C,OAAO;AAAA,MACL;AAAA,MACA,cAAc,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA;AAAA,OAGI,SAAQ,CAAC,KAAkC;AAAA,IAC/C,MAAM,WAAW,cAAc,IAAI,SAAS,IAAI,MAAM;AAAA,IAEtD,KAAK,gBAAgB,IAAI,cAAc,UAAU,KAAK,EAAE;AAAA,IACxD,MAAM,KAAK,cAAc,WAAW;AAAA,IAEpC,YAAY,UAAU,YAAY,KAAK,kBAAkB;AAAA,MACvD,KAAK,cAAc,QAAQ,OAAO;AAAA,IACpC;AAAA,IAEA,KAAK,cAAc,eAAe;AAAA,IAClC,MAAM,KAAK,cAAc,KAAK;AAAA,IAC9B,KAAK,iBAAiB,MAAM;AAAA;AAAA,OAGxB,OAAM,CACV,OACA,KACA,UAAyB,CAAC,GACD;AAAA,IACzB;AAAA,MACE,OAAO;AAAA,MACP,WAAW;AAAA,MACX;AAAA,QACE;AAAA,IAEJ,MAAM,WAAW,cAAc,IAAI,SAAS,IAAI,MAAM;AAAA,IACtD,MAAM,gBAAgB,IAAI,cAAc,UAAU,KAAK,EAAE;AAAA,IAEzD,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,MAAM,cAAc,WAAW;AAAA,MAC/B,WAAW,cAAc,YAAY;AAAA,MACrC,MAAM;AAAA,MACN,WAAW,MAAM,IAAI,iBAAiB;AAAA;AAAA,IAIxC,IAAI,gBAAgB,SAAS,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;AAAA,IAExD,IAAI,gBAAgB,aAAa,SAAS,GAAG;AAAA,MAC3C,gBAAgB,cAAc,OAAO,CAAC,aAAa;AAAA,QACjD,OAAO,aAAa,KAAK,CAAC,YAAY;AAAA,UACpC,IAAI,QAAQ,WAAW,IAAI,GAAG;AAAA,YAC5B,MAAM,MAAM,QAAQ,MAAM,CAAC;AAAA,YAC3B,OAAO,SAAS,SAAS,GAAG;AAAA,UAC9B;AAAA,UACA,OAAO,SAAS,SAAS,OAAO;AAAA,SACjC;AAAA,OACF;AAAA,IACH;AAAA,IAEA,MAAM,iBAAiB,MAAM,aAAa,KAAK;AAAA,IAC/C,MAAM,YAAY,IAAI;AAAA,IACtB,MAAM,gBAID,CAAC;AAAA,IAEN,WAAW,YAAY,eAAe;AAAA,MACpC,MAAM,YAAY,MAAM,IAAI,cAAc,QAAQ;AAAA,MAClD,IAAI,CAAC;AAAA,QAAW;AAAA,MAEhB,MAAM,aAAa,UAAU;AAAA,MAC7B,IAAI,CAAC,YAAY;AAAA,QAAY;AAAA,MAE7B,SAAS,IAAI,EAAG,IAAI,UAAU,OAAO,QAAQ,KAAK;AAAA,QAChD,MAAM,QAAQ,UAAU,OAAO;AAAA,QAC/B,MAAM,YAAY,WAAW,WAAW;AAAA,QAExC,IAAI,CAAC;AAAA,UAAW;AAAA,QAEhB,cAAc,KAAK;AAAA,UACjB,UAAU,UAAU;AAAA,UACpB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QAED,UAAU,aAAa,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,MAAM,QAAQ,CAAC,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,IAEA,MAAM,cAAc,UAAU,OAAO,OAAO,OAAO,CAAC;AAAA,IACpD,MAAM,aAAa,IAAI;AAAA,IAEvB,WAAW,UAAU,aAAa;AAAA,MAChC,WAAW,IAAI,OAAO,IAAI,eAAe,OAAO,OAAO,CAAC,CAAC;AAAA,IAC3D;AAAA,IAEA,MAAM,aAAa,kBAAkB,KAAK;AAAA,IAC1C,MAAM,UAA0B,CAAC;AAAA,IAEjC,aAAa,UAAU,OAAO,eAAe,eAAe;AAAA,MAC1D,MAAM,gBAAgB,iBAAiB,gBAAgB,SAAS;AAAA,MAChE,MAAM,YAAY,WAAW,IAAI,MAAM,EAAE,KAAK;AAAA,MAE9C,MAAM,cACJ,mBAAkB,gBAAgB,eAAc;AAAA,MAElD,IAAI,eAAe,YAAY,YAAY,KAAK;AAAA,QAC9C,QAAQ,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,UAAU,KAAK;AAAA,UACf,SAAS;AAAA,YACP;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,IACxC,OAAO,QAAQ,MAAM,GAAG,IAAI;AAAA;AAEhC;AAAA,IApUa,qBAAoB,MAGpB,iBAAgB,IAGvB,mBAAkB,KAGlB,eAAc,KAGP,iBAWA;AAAA;AAAA,EA9Cb;AAAA,EAMA;AAAA,EAQA;AAAA,EAIA;AAAA,EAiBa,kBAAkB,CAAC,OAAO;AAAA,EAW1B,gBAAe;AAAA;;;;;;;;;;;;ACzD5B;AAkDO,SAAS,cAAc,CAAC,UAA2B;AAAA,EACxD,MAAM,MAAW,eAAQ,QAAQ,EAAE,YAAY;AAAA,EAC/C,OAAO,oBAAoB,SAAS,GAAG;AAAA;AAyBzC,SAAS,qBAAqB,CAAC,SAAoC;AAAA,EACjE,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,EAChC,MAAM,WAA8B,CAAC;AAAA,EAErC,IAAI,iBAAyC;AAAA,EAC7C,IAAI,iBAA2B,CAAC;AAAA,EAChC,IAAI,YAAY;AAAA,EAEhB,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,MAAM,OAAO,MAAM;AAAA,IACnB,MAAM,eAAe,KAAK,MAAM,mBAAmB;AAAA,IAEnD,IAAI,cAAc;AAAA,MAEhB,IAAI,gBAAgB;AAAA,QAClB,eAAe,UAAU,eAAe,KAAK;AAAA,CAAI,EAAE,KAAK;AAAA,QACxD,eAAe,UAAU;AAAA,QACzB,IAAI,eAAe,WAAW,eAAe,SAAS;AAAA,UACpD,SAAS,KAAK,cAAc;AAAA,QAC9B;AAAA,MACF,EAAO,SAAI,eAAe,SAAS,GAAG;AAAA,QAEpC,SAAS,KAAK;AAAA,UACZ,SAAS;AAAA,UACT,OAAO;AAAA,UACP,SAAS,eAAe,KAAK;AAAA,CAAI,EAAE,KAAK;AAAA,UACxC,WAAW;AAAA,UACX,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,MAGA,iBAAiB;AAAA,QACf,SAAS,aAAa;AAAA,QACtB,OAAO,aAAa,GAAG;AAAA,QACvB,SAAS;AAAA,QACT,WAAW,IAAI;AAAA,QACf,SAAS,MAAM;AAAA,MACjB;AAAA,MACA,iBAAiB,CAAC;AAAA,IACpB,EAAO;AAAA,MACL,eAAe,KAAK,IAAI;AAAA;AAAA,EAE5B;AAAA,EAGA,IAAI,gBAAgB;AAAA,IAClB,eAAe,UAAU,eAAe,KAAK;AAAA,CAAI,EAAE,KAAK;AAAA,IACxD,eAAe,UAAU,MAAM;AAAA,IAC/B,IAAI,eAAe,WAAW,eAAe,SAAS;AAAA,MACpD,SAAS,KAAK,cAAc;AAAA,IAC9B;AAAA,EACF,EAAO,SAAI,eAAe,SAAS,GAAG;AAAA,IAEpC,SAAS,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS,eAAe,KAAK;AAAA,CAAI,EAAE,KAAK;AAAA,MACxC,WAAW;AAAA,MACX,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,uBAAuB,CAAC,SAA2B;AAAA,EAC1D,MAAM,WAAqB,CAAC;AAAA,EAG5B,MAAM,iBAAiB,QAAQ,SAAS,mBAAmB;AAAA,EAC3D,WAAW,SAAS,gBAAgB;AAAA,IAClC,MAAM,UAAU,MAAM,GAAG,YAAY;AAAA,IACrC,MAAM,QAAQ,QAAQ,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAC7D,SAAS,KAAK,GAAG,KAAK;AAAA,EACxB;AAAA,EAGA,MAAM,kBAAkB,QAAQ,SAAS,0BAA0B;AAAA,EACnE,WAAW,SAAS,iBAAiB;AAAA,IACnC,MAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,IAAI,YAAY;AAAA,IACtD,MAAM,QAAQ,KAAK,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAC1D,SAAS,KAAK,GAAG,KAAK;AAAA,EACxB;AAAA,EAGA,MAAM,cAAc,QAAQ,SAAS,YAAY;AAAA,EACjD,WAAW,SAAS,aAAa;AAAA,IAC/B,MAAM,OAAO,MAAM,GAAG,YAAY;AAAA,IAClC,IAAI,KAAK,SAAS,KAAK,KAAK,SAAS,IAAI;AAAA,MACvC,SAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAAA,EAGA,MAAM,cAAc,QAAQ,SAAS,eAAe;AAAA,EACpD,WAAW,SAAS,aAAa;AAAA,IAC/B,MAAM,OAAO,MAAM,GAAG,YAAY;AAAA,IAClC,MAAM,QAAQ,KAAK,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAC1D,SAAS,KAAK,GAAG,KAAK;AAAA,EACxB;AAAA,EAEA,OAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAAA;AAAA;AAavB,MAAM,eAAsC;AAAA,EACxC,KAAK;AAAA,EACL,OAAO;AAAA,EACP,cACP;AAAA,EACO,UAAU;AAAA,EAEnB,YAAY,CAAC,UAA2B;AAAA,IACtC,OAAO,eAAe,QAAQ;AAAA;AAAA,EAGxB,kBAA0C;AAAA,EAC1C,gBAAsC;AAAA,EACtC,mBAA6C,IAAI;AAAA,EACjD,UAAkB;AAAA,EAClB,SAA6B;AAAA,OAE/B,WAAU,CAAC,QAAqC;AAAA,IACpD,KAAK,kBAAkB,6BAA6B,MAAM;AAAA,IAC1D,KAAK,SAAS,OAAO,SAAS;AAAA,IAE9B,IAAI,KAAK,QAAQ;AAAA,MACf,KAAK,kBAAkB;AAAA,WAClB,KAAK;AAAA,QACR,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,IAEA,oBAAoB,KAAK,eAAe;AAAA,IACxC,KAAK,iBAAiB,MAAM;AAAA;AAAA,OAGxB,UAAS,CACb,UACA,SACA,KAC2B;AAAA,IAE3B,IAAI,CAAC,eAAe,QAAQ,GAAG;AAAA,MAC7B,OAAO;AAAA,IACT;AAAA,IAEA,KAAK,UAAU,IAAI;AAAA,IAGnB,MAAM,WAAW,sBAAsB,OAAO;AAAA,IAE9C,IAAI,SAAS,WAAW,GAAG;AAAA,MACzB,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,gBAAgB,SAAS,IAAI,CAAC,MAAM;AAAA,MACxC,MAAM,WAAgB,gBAAS,QAAQ;AAAA,MACvC,MAAM,iBAAiB,EAAE,UAAU,GAAG,EAAE,cAAc;AAAA,MACtD,OAAO,GAAG,YAAY,iBAAiB,EAAE;AAAA,KAC1C;AAAA,IACD,MAAM,aAAa,MAAM,cAAc,aAAa;AAAA,IAGpD,MAAM,SAAkB,SAAS,IAAI,CAAC,SAAS,OAAO;AAAA,MACpD,IAAI,gBAAgB,UAAU,QAAQ,WAAW,QAAQ,OAAO;AAAA,MAChE,SAAS,QAAQ,UACb,MAAM,QAAQ;AAAA;AAAA,EAAc,QAAQ,YACpC,QAAQ;AAAA,MACZ,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,QAAQ,WAAW;AAAA,IAC3B,EAAE;AAAA,IAGF,MAAM,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,IAEvE,MAAM,QAAQ,MAAM,IAAI,aAAa,QAAQ;AAAA,IAC7C,MAAM,gBAAgB,mBAAmB;AAAA,IAEzC,MAAM,aAAiC;AAAA,MACrC;AAAA,MACA,gBAAgB,cAAc;AAAA,MAC9B;AAAA,IACF;AAAA,IAGA,MAAM,WAAW,wBAAwB,OAAO;AAAA,IAEhD,MAAM,cAA2B;AAAA,MAC/B;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,YAAY,CAAC,OAAO;AAAA,MACpB;AAAA,MACA,SAAS;AAAA,MACT,cAAc,MAAM;AAAA,IACtB;AAAA,IAEA,KAAK,iBAAiB,IAAI,UAAU,WAAW;AAAA,IAE/C,OAAO;AAAA,MACL;AAAA,MACA,cAAc,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA;AAAA,OAGI,SAAQ,CAAC,KAAkC;AAAA,IAC/C,MAAM,WAAW,cAAc,IAAI,SAAS,IAAI,MAAM;AAAA,IAEtD,KAAK,gBAAgB,IAAI,cAAc,UAAU,KAAK,EAAE;AAAA,IACxD,MAAM,KAAK,cAAc,WAAW;AAAA,IAEpC,YAAY,UAAU,YAAY,KAAK,kBAAkB;AAAA,MACvD,KAAK,cAAc,QAAQ,OAAO;AAAA,IACpC;AAAA,IAEA,KAAK,cAAc,eAAe;AAAA,IAClC,MAAM,KAAK,cAAc,KAAK;AAAA,IAC9B,KAAK,iBAAiB,MAAM;AAAA;AAAA,OAGxB,OAAM,CACV,OACA,KACA,UAAyB,CAAC,GACD;AAAA,IACzB;AAAA,MACE,OAAO;AAAA,MACP,WAAW;AAAA,MACX;AAAA,QACE;AAAA,IAEJ,MAAM,WAAW,cAAc,IAAI,SAAS,IAAI,MAAM;AAAA,IACtD,MAAM,gBAAgB,IAAI,cAAc,UAAU,KAAK,EAAE;AAAA,IAEzD,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,MAAM,cAAc,WAAW;AAAA,MAC/B,WAAW,cAAc,YAAY;AAAA,MACrC,MAAM;AAAA,MACN,WAAW,MAAM,IAAI,iBAAiB;AAAA;AAAA,IAIxC,IAAI,gBAAgB,SAAS,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;AAAA,IAE5D,IAAI,gBAAgB,aAAa,SAAS,GAAG;AAAA,MAC3C,gBAAgB,cAAc,OAAO,CAAC,aAAa;AAAA,QACjD,OAAO,aAAa,KAAK,CAAC,YAAY;AAAA,UACpC,IAAI,QAAQ,WAAW,IAAI,GAAG;AAAA,YAC5B,MAAM,MAAM,QAAQ,MAAM,CAAC;AAAA,YAC3B,OAAO,SAAS,SAAS,GAAG;AAAA,UAC9B;AAAA,UACA,OAAO,SAAS,SAAS,OAAO;AAAA,SACjC;AAAA,OACF;AAAA,IACH;AAAA,IAEA,MAAM,iBAAiB,MAAM,aAAa,KAAK;AAAA,IAC/C,MAAM,YAAY,IAAI;AAAA,IACtB,MAAM,gBAID,CAAC;AAAA,IAEN,WAAW,YAAY,eAAe;AAAA,MACpC,MAAM,YAAY,MAAM,IAAI,cAAc,QAAQ;AAAA,MAClD,IAAI,CAAC;AAAA,QAAW;AAAA,MAEhB,MAAM,aAAa,UAAU;AAAA,MAC7B,IAAI,CAAC,YAAY;AAAA,QAAY;AAAA,MAE7B,SAAS,IAAI,EAAG,IAAI,UAAU,OAAO,QAAQ,KAAK;AAAA,QAChD,MAAM,QAAQ,UAAU,OAAO;AAAA,QAC/B,MAAM,YAAY,WAAW,WAAW;AAAA,QAExC,IAAI,CAAC;AAAA,UAAW;AAAA,QAEhB,cAAc,KAAK;AAAA,UACjB,UAAU,UAAU;AAAA,UACpB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QAED,UAAU,aAAa,CAAC,EAAE,IAAI,MAAM,IAAI,SAAS,MAAM,QAAQ,CAAC,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,IAEA,MAAM,cAAc,UAAU,OAAO,OAAO,OAAO,CAAC;AAAA,IACpD,MAAM,aAAa,IAAI;AAAA,IAEvB,WAAW,UAAU,aAAa;AAAA,MAChC,WAAW,IAAI,OAAO,IAAI,eAAe,OAAO,OAAO,CAAC,CAAC;AAAA,IAC3D;AAAA,IAEA,MAAM,aAAa,kBAAkB,KAAK;AAAA,IAC1C,MAAM,UAA0B,CAAC;AAAA,IAEjC,aAAa,UAAU,OAAO,eAAe,eAAe;AAAA,MAC1D,MAAM,gBAAgB,iBAAiB,gBAAgB,SAAS;AAAA,MAChE,MAAM,YAAY,WAAW,IAAI,MAAM,EAAE,KAAK;AAAA,MAG9C,IAAI,WAAW;AAAA,MACf,IACE,WAAW,KAAK,CAAC,MACf;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,SAAS,CAAC,CACd,GACA;AAAA,QACA,WAAW;AAAA,MACb;AAAA,MAEA,MAAM,cACJ,mBAAkB,gBAAgB,eAAc,YAAY;AAAA,MAE9D,IAAI,eAAe,YAAY,YAAY,KAAK;AAAA,QAC9C,QAAQ,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,UAAU,KAAK;AAAA,UACf,SAAS;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,IACxC,OAAO,QAAQ,MAAM,GAAG,IAAI;AAAA;AAEhC;AAAA,IApZa,qBAAoB,MAGpB,iBAAgB,IAGvB,mBAAkB,KAGlB,eAAc,KAGP,qBAWA;AAAA;AAAA,EA7Cb;AAAA,EAMA;AAAA,EAOA;AAAA,EAIA;AAAA,EAiBa,sBAAsB,CAAC,OAAO,MAAM;AAAA,EAWpC,gBAAe;AAAA;;;ACxD5B;AAZA;AACA;AACA;AACA;;;ACDA,MAAM,mBAA6C;AAAA,EACzC,UAAU,IAAI;AAAA,EAEtB,QAAQ,CAAC,QAA2B;AAAA,IAElC,IAAI,CAAC,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG;AAAA,MAChC,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;AAAA,IACpC;AAAA;AAAA,EAGF,GAAG,CAAC,IAAqC;AAAA,IACvC,OAAO,KAAK,QAAQ,IAAI,EAAE;AAAA;AAAA,EAG5B,IAAI,GAAkB;AAAA,IACpB,OAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA;AAAA,EAGzC,UAAU,CAAC,QAA+B;AAAA,IACxC,MAAM,aAAa,IAAI,IACrB,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CACzD;AAAA,IAEA,OAAO,KAAK,KAAK,EAAE,OAAO,CAAC,MAAM,WAAW,IAAI,EAAE,EAAE,CAAC;AAAA;AAEzD;AAGO,IAAM,WAA2B,IAAI;AAG5C,eAAsB,sBAAsB,GAAkB;AAAA,EAE5D,QAAQ,4BAAe;AAAA,EACvB,QAAQ,wCAAqB;AAAA,EAC7B,QAAQ,4BAAe;AAAA,EACvB,QAAQ,oCAAmB;AAAA,EAG3B,SAAS,SAAS,IAAI,WAAY;AAAA,EAGlC,SAAS,SAAS,IAAI,iBAAkB;AAAA,EAGxC,SAAS,SAAS,IAAI,WAAY;AAAA,EAGlC,SAAS,SAAS,IAAI,eAAgB;AAAA;;;AC5CxC;AACA;;;ACEA;AACA;AAQA,IAAM,iBAAiB;AAGvB,IAAM,YAAY,IAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAeD,eAAe,mBAAmB,CAChC,SACA,aAAqB,IACrB,QAAgB,GACY;AAAA,EAC5B,IAAI,QAAQ;AAAA,IAAgB,OAAO,CAAC;AAAA,EAEpC,MAAM,UAA6B,CAAC;AAAA,EACpC,MAAM,UAAU,aAAkB,YAAK,SAAS,UAAU,IAAI;AAAA,EAE9D,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAGjE,MAAM,iBAAiB,QAAQ,KAC7B,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS,cAClC;AAAA,IAEA,IAAI,kBAAkB,YAAY;AAAA,MAChC,MAAM,OAAO,MAAM,iBAAiB,SAAS,UAAU;AAAA,MACvD,IAAI;AAAA,QAAM,QAAQ,KAAK,IAAI;AAAA,IAC7B;AAAA,IAGA,WAAW,SAAS,SAAS;AAAA,MAC3B,IAAI,CAAC,MAAM,YAAY;AAAA,QAAG;AAAA,MAC1B,IAAI,UAAU,IAAI,MAAM,IAAI;AAAA,QAAG;AAAA,MAE/B,MAAM,UAAU,aAAa,GAAG,cAAc,MAAM,SAAS,MAAM;AAAA,MACnE,MAAM,aAAa,MAAM,oBAAoB,SAAS,SAAS,QAAQ,CAAC;AAAA,MACxE,QAAQ,KAAK,GAAG,UAAU;AAAA,IAC5B;AAAA,IACA,MAAM;AAAA,EAIR,OAAO;AAAA;AAMT,eAAe,gBAAgB,CAC7B,SACA,cACiC;AAAA,EACjC,IAAI;AAAA,IACF,MAAM,kBAAuB,YAAK,SAAS,cAAc,cAAc;AAAA,IACvE,MAAM,UAAU,MAAS,aAAS,iBAAiB,OAAO;AAAA,IAC1D,MAAM,MAAM,KAAK,MAAM,OAAO;AAAA,IAE9B,MAAM,OAAO,IAAI,QAAa,gBAAS,YAAY;AAAA,IACnD,MAAM,OAAO,KAAK,IAAI,iBAAiB,IAAI,gBAAgB;AAAA,IAC3D,IAAI,OAAoB;AAAA,IAExB,IAAI,KAAK,WAAW,KAAK,YAAY,KAAK,UAAU,KAAK,WAAW;AAAA,MAClE,OAAO;AAAA,IACT,EAAO,SACL,KAAK,cACL,KAAK,cACL,KAAK,UACL,KAAK,SACL;AAAA,MACA,OAAO;AAAA,IACT,EAAO,SAAI,IAAI,QAAQ,IAAI,SAAS;AAAA,MAClC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,gBAAgB,QAAQ,IAAI,UAAU;AAAA,IAC5C,OAAO,EAAE,MAAM,cAAc,MAAM,cAAc;AAAA,IACjD,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAOX,SAAS,cAAc,CAAC,YAAiC;AAAA,EACvD,QAAQ;AAAA,SACD;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,SACA;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,SACA;AAAA,MACH,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAWb,eAAsB,sBAAsB,CAC1C,SAC2B;AAAA,EAC3B,MAAM,aAAa,IAAI;AAAA,EACvB,IAAI,aAAa;AAAA,EAEjB,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IACjE,MAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAGzE,MAAM,mBAAmB,CAAC,QAAQ,YAAY,QAAQ,UAAU;AAAA,IAChE,MAAM,uBAAuB,iBAAiB,KAAK,CAAC,MAClD,SAAS,SAAS,CAAC,CACrB;AAAA,IAEA,IAAI,sBAAsB;AAAA,MACxB,aAAa;AAAA,MAEb,WAAW,WAAW,kBAAkB;AAAA,QACtC,IAAI,CAAC,SAAS,SAAS,OAAO;AAAA,UAAG;AAAA,QAEjC,MAAM,aAAkB,YAAK,SAAS,OAAO;AAAA,QAC7C,IAAI;AAAA,UACF,MAAM,UAAU,MAAS,YAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,UAEpE,WAAW,UAAU,SAAS;AAAA,YAC5B,IAAI,CAAC,OAAO,YAAY;AAAA,cAAG;AAAA,YAE3B,MAAM,cAAc,GAAG,WAAW,OAAO;AAAA,YACzC,MAAM,OAAO,eAAe,OAAO;AAAA,YAEnC,WAAW,IAAI,aAAa;AAAA,cAC1B,MAAM,OAAO;AAAA,cACb,MAAM;AAAA,cACN;AAAA,YACF,CAAC;AAAA,UACH;AAAA,UACA,MAAM;AAAA,MAGV;AAAA,IACF;AAAA,IAGA,MAAM,eAAe,MAAM,oBAAoB,OAAO;AAAA,IAEtD,WAAW,OAAO,cAAc;AAAA,MAC9B,IAAI,IAAI;AAAA,QAAe,aAAa;AAAA,MACpC,IAAI,aAAa,SAAS;AAAA,QAAG,aAAa;AAAA,MAE1C,WAAW,IAAI,IAAI,cAAc;AAAA,QAC/B,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,IAGA,IAAI,WAAwB;AAAA,IAC5B,IAAI;AAAA,MACF,MAAM,cAAmB,YAAK,SAAS,cAAc;AAAA,MACrD,MAAM,UAAU,KAAK,MAAM,MAAS,aAAS,aAAa,OAAO,CAAC;AAAA,MAElE,IAAI,QAAQ;AAAA,QAAY,aAAa;AAAA,MAErC,MAAM,OAAO,KAAK,QAAQ,iBAAiB,QAAQ,gBAAgB;AAAA,MACnE,IAAI,KAAK,WAAW,KAAK,YAAY,KAAK,QAAQ;AAAA,QAChD,WAAW;AAAA,MACb,EAAO,SAAI,KAAK,cAAc,KAAK,cAAc,KAAK,QAAQ;AAAA,QAC5D,WAAW;AAAA,MACb;AAAA,MACA,MAAM;AAAA,IAIR,MAAM,WAAW,MAAM,KAAK,WAAW,OAAO,CAAC,EAAE,KAC/C,CAAC,GAAG,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,MACnC;AAAA,IAEA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU,aAAa,YAAY;AAAA,IACrC;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,MACL,UAAU,CAAC;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAAA;AAAA;;;AD7NJ;AACA;AAAA;AAKO,MAAM,mBAAmB;AAAA,EACtB;AAAA,EACA,YAAqC;AAAA,EACrC,QAAwC,IAAI;AAAA,EAC5C,SAA8B,CAAC;AAAA,EAEvC,WAAW,CAAC,SAAiB;AAAA,IAC3B,KAAK,UAAU;AAAA;AAAA,OAMX,WAAU,GAAkB;AAAA,IAChC,KAAK,YAAY,MAAM,uBAAuB,KAAK,OAAO;AAAA,IAG1D,IAAI;AAAA,MACF,MAAM,aAAkB,YAAK,KAAK,SAAS,YAAY,aAAa;AAAA,MACpE,MAAM,gBAAgB,MAAS,aAAS,YAAY,OAAO;AAAA,MAC3D,MAAM,SAAS,KAAK,MAAM,aAAa;AAAA,MACvC,KAAK,SAAS,OAAO,iBAAiB,CAAC;AAAA,MACvC,MAAM;AAAA;AAAA,EAQV,YAAY,GAA4B;AAAA,IACtC,OAAO,KAAK;AAAA;AAAA,EAMd,OAAO,CAAC,UAAkB,SAAqC;AAAA,IAC7D,IAAI,CAAC,KAAK,WAAW;AAAA,MACnB,MAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,IAEA,MAAM,QAAQ,eAAe,UAAU,KAAK,WAAW,OAAO;AAAA,IAG9D,KAAK,eAAe,KAAK;AAAA,IAEzB,KAAK,MAAM,IAAI,UAAU,KAAK;AAAA,IAC9B,OAAO;AAAA;AAAA,EAMT,OAAO,CAAC,UAAiD;AAAA,IACvD,OAAO,KAAK,MAAM,IAAI,QAAQ;AAAA;AAAA,EAMhC,WAAW,GAAwB;AAAA,IACjC,OAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA;AAAA,EAM/B,cAAc,CAAC,OAAgC;AAAA,IACrD,IAAI,CAAC,KAAK,OAAO;AAAA,MAAU;AAAA,IAE3B,YAAY,aAAa,cAAc,OAAO,QAC5C,KAAK,OAAO,QACd,GAAG;AAAA,MACD,IACE,MAAM,SAAS,WAAW,cAAc,GAAG,KAC3C,MAAM,QAAQ,SAAS,aACvB;AAAA,QACA,IAAI,UAAU,OAAO;AAAA,UACnB,MAAM,QAAQ,UAAU;AAAA,QAC1B;AAAA,QACA,IAAI,UAAU,WAAW;AAAA,UACvB,MAAM,YAAY,UAAU;AAAA,QAC9B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA,OAMI,KAAI,CAAC,QAA+B;AAAA,IACxC,MAAM,WAAgB,YACpB,cAAc,KAAK,SAAS,MAAM,GAClC,eACF;AAAA,IACA,MAAS,UAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAG5C,MAAM,cAAmB,YAAK,UAAU,eAAe;AAAA,IACvD,MAAS,cACP,aACA,KAAK,UACH;AAAA,MACE,SAAS;AAAA,MACT,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,MACpC,WAAW,KAAK;AAAA,IAClB,GACA,MACA,CACF,CACF;AAAA,IAGA,YAAY,UAAU,UAAU,KAAK,OAAO;AAAA,MAC1C,MAAM,gBAAqB,YACzB,UACA,SACA,SAAS,QAAQ,YAAY,OAAO,CACtC;AAAA,MACA,MAAS,UAAW,eAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MAC/D,MAAS,cAAU,eAAe,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,IAClE;AAAA;AAAA,OAMI,KAAI,CAAC,QAA+B;AAAA,IACxC,MAAM,WAAgB,YACpB,cAAc,KAAK,SAAS,MAAM,GAClC,eACF;AAAA,IAEA,IAAI;AAAA,MAEF,MAAM,cAAmB,YAAK,UAAU,eAAe;AAAA,MACvD,MAAM,iBAAiB,MAAS,aAAS,aAAa,OAAO;AAAA,MAC7D,MAAM,cAAc,KAAK,MAAM,cAAc;AAAA,MAC7C,KAAK,YAAY,YAAY;AAAA,MAG7B,MAAM,KAAK,mBAAwB,YAAK,UAAU,OAAO,GAAG,EAAE;AAAA,MAC9D,MAAM;AAAA,MAEN,KAAK,YAAY;AAAA,MACjB,KAAK,MAAM,MAAM;AAAA;AAAA;AAAA,OAOP,mBAAkB,CAC9B,UACA,QACe;AAAA,IACf,IAAI;AAAA,MACF,MAAM,UAAU,MAAS,YAAQ,UAAU,EAAE,eAAe,KAAK,CAAC;AAAA,MAElE,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,YAAiB,YAAK,UAAU,MAAM,IAAI;AAAA,QAChD,MAAM,eAAe,SAAS,GAAG,UAAU,MAAM,SAAS,MAAM;AAAA,QAEhE,IAAI,MAAM,YAAY,GAAG;AAAA,UACvB,MAAM,KAAK,mBAAmB,WAAW,YAAY;AAAA,QACvD,EAAO,SAAI,MAAM,KAAK,SAAS,OAAO,GAAG;AAAA,UACvC,MAAM,UAAU,MAAS,aAAS,WAAW,OAAO;AAAA,UACpD,MAAM,QAA2B,KAAK,MAAM,OAAO;AAAA,UACnD,KAAK,MAAM,IAAI,MAAM,UAAU,KAAK;AAAA,QACtC;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,EAQV,KAAK,GAAS;AAAA,IACZ,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,YAAY;AAAA;AAErB;;AExLO,MAAM,cAAgC;AAAA,EACnC;AAAA,EAER,WAAW,CAAC,SAAyB;AAAA,IACnC,KAAK,UAAU,SAAS,WAAW;AAAA;AAAA,EAGrC,IAAI,CAAC,SAAuB;AAAA,IAC1B,QAAQ,IAAI,OAAO;AAAA;AAAA,EAGrB,IAAI,CAAC,SAAuB;AAAA,IAC1B,QAAQ,KAAK,OAAO;AAAA;AAAA,EAGtB,KAAK,CAAC,SAAuB;AAAA,IAC3B,QAAQ,MAAM,OAAO;AAAA;AAAA,EAGvB,KAAK,CAAC,SAAuB;AAAA,IAC3B,IAAI,KAAK,SAAS;AAAA,MAChB,QAAQ,IAAI,OAAO;AAAA,IACrB;AAAA;AAAA,EAGF,QAAQ,CAAC,SAAuB;AAAA,IAE9B,QAAQ,IAAI,OAAO;AAAA;AAAA,EAGrB,aAAa,GAAS;AAGxB;AAAA;AAOO,MAAM,qBAAuC;AAAA,EAC1C;AAAA,EACA,qBAAqB;AAAA,EACrB,cAAc;AAAA,EAEtB,WAAW,CAAC,SAAyB;AAAA,IACnC,KAAK,UAAU,SAAS,WAAW;AAAA;AAAA,EAGrC,IAAI,CAAC,SAAuB;AAAA,IAC1B,KAAK,cAAc;AAAA,IACnB,QAAQ,IAAI,OAAO;AAAA;AAAA,EAGrB,IAAI,CAAC,SAAuB;AAAA,IAC1B,KAAK,cAAc;AAAA,IACnB,QAAQ,KAAK,OAAO;AAAA;AAAA,EAGtB,KAAK,CAAC,SAAuB;AAAA,IAC3B,KAAK,cAAc;AAAA,IACnB,QAAQ,MAAM,OAAO;AAAA;AAAA,EAGvB,KAAK,CAAC,SAAuB;AAAA,IAC3B,IAAI,KAAK,SAAS;AAAA,MAChB,KAAK,cAAc;AAAA,MACnB,QAAQ,IAAI,OAAO;AAAA,IACrB;AAAA;AAAA,EAGF,QAAQ,CAAC,SAAuB;AAAA,IAE9B,QAAQ,OAAO,MAAM,KAAK,SAAS;AAAA,IAEnC,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,qBAAqB,QAAQ,MAAM;AAAA,IACpE,IAAI,UAAU,GAAG;AAAA,MACf,QAAQ,OAAO,MAAM,IAAI,OAAO,OAAO,CAAC;AAAA,IAC1C;AAAA,IACA,KAAK,qBAAqB,QAAQ;AAAA,IAClC,KAAK,cAAc;AAAA;AAAA,EAGrB,aAAa,GAAS;AAAA,IACpB,IAAI,KAAK,eAAe,KAAK,qBAAqB,GAAG;AAAA,MAEnD,QAAQ,OAAO,MAAM,OAAO,IAAI,OAAO,KAAK,kBAAkB,IAAI,IAAI;AAAA,MACtE,KAAK,qBAAqB;AAAA,MAC1B,KAAK,cAAc;AAAA,IACrB;AAAA;AAEJ;AAAA;AAMO,MAAM,aAA+B;AAAA,EAC1C,IAAI,GAAS;AAAA,EACb,IAAI,GAAS;AAAA,EACb,KAAK,GAAS;AAAA,EACd,KAAK,GAAS;AAAA,EACd,QAAQ,GAAS;AAAA,EACjB,aAAa,GAAS;AACxB;AAMO,SAAS,YAAY,CAAC,SAAiC;AAAA,EAC5D,OAAO,IAAI,cAAc,OAAO;AAAA;AAO3B,SAAS,kBAAkB,CAAC,SAAiC;AAAA,EAClE,OAAO,IAAI,qBAAqB,OAAO;AAAA;AAOlC,SAAS,kBAAkB,GAAW;AAAA,EAC3C,OAAO,IAAI;AAAA;;AC5Ib;AAEA;;;AL4BA,eAAe,WAAiB,CAC9B,OACA,WACA,aAGA;AAAA,EACA,MAAM,UAEF,IAAI,MAAM,MAAM,MAAM;AAAA,EAC1B,IAAI,YAAY;AAAA,EAEhB,eAAe,MAAM,GAAkB;AAAA,IACrC,OAAO,YAAY,MAAM,QAAQ;AAAA,MAC/B,MAAM,QAAQ;AAAA,MACd,MAAM,OAAO,MAAM;AAAA,MACnB,IAAI;AAAA,QACF,MAAM,QAAQ,MAAM,UAAU,MAAM,KAAK;AAAA,QACzC,QAAQ,SAAS,EAAE,SAAS,MAAM,MAAM;AAAA,QACxC,OAAO,OAAO;AAAA,QACd,QAAQ,SAAS,EAAE,SAAS,OAAO,MAAM;AAAA;AAAA,IAE7C;AAAA;AAAA,EAIF,MAAM,UAAU,MAAM,KAAK,IAAI,aAAa,MAAM,MAAM,CAAC,EACtD,KAAK,IAAI,EACT,IAAI,MAAM,OAAO,CAAC;AAAA,EAErB,MAAM,QAAQ,IAAI,OAAO;AAAA,EACzB,OAAO;AAAA;AAYT,IAAM,uBAAuB;AAc7B,SAAS,cAAc,CAAC,IAAoB;AAAA,EAC1C,IAAI,KAAK,MAAM;AAAA,IACb,OAAO,GAAG;AAAA,EACZ;AAAA,EACA,MAAM,UAAU,KAAK;AAAA,EACrB,IAAI,UAAU,IAAI;AAAA,IAChB,OAAO,GAAG,QAAQ,QAAQ,CAAC;AAAA,EAC7B;AAAA,EACA,MAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AAAA,EACvC,MAAM,mBAAmB,UAAU;AAAA,EACnC,OAAO,GAAG,YAAY,iBAAiB,QAAQ,CAAC;AAAA;AAalD,SAAS,qBAAqB,GAAW;AAAA,EACvC,MAAM,WAAc,SAAK,EAAE;AAAA,EAM3B,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,WAAW,IAAI,CAAC,CAAC;AAAA,EAErE,OAAO;AAAA;AAIT,IAAM,sBAAsB,sBAAsB;AAsDlD,eAAsB,cAAc,CAClC,SACA,UAAwB,CAAC,GACD;AAAA,EACxB,MAAM,UAAU,QAAQ,WAAW;AAAA,EACnC,MAAM,QAAQ,QAAQ,SAAS;AAAA,EAC/B,MAAM,cAAc,QAAQ,eAAe;AAAA,EAG3C,MAAM,SAAiB,QAAQ,SAC3B,QAAQ,SACR,QACA,mBAAmB,IACnB,aAAa,EAAE,QAAQ,CAAC;AAAA,EAG5B,UAAe,eAAQ,OAAO;AAAA,EAG9B,MAAM,WAAW,iBAAiB,OAAO;AAAA,EACzC,OAAO,KAAK,uBAAuB,SAAS;AAAA,EAC5C,OAAO,KAAK,mBAAmB,SAAS,UAAU;AAAA,EAClD,OAAO,MAAM,gBAAgB,aAAa;AAAA,EAG1C,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,gBAAgB,IAAI,mBAAmB,OAAO;AAAA,EACpD,MAAM,cAAc,WAAW;AAAA,EAC/B,MAAM,YAAY,cAAc,aAAa;AAAA,EAC7C,IAAI,WAAW,YAAY;AAAA,IACzB,OAAO,MACL,0BAA0B,UAAU,SAAS,iBAC/C;AAAA,EACF;AAAA,EAGA,MAAM,uBAAuB;AAAA,EAG7B,MAAM,iBAAiB,SAAS,WAAW,MAAM;AAAA,EAEjD,IAAI,eAAe,WAAW,GAAG;AAAA,IAC/B,OAAO,KAAK,+CAA+C;AAAA,IAC3D,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,OAAO,KAAK,oBAAoB,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG;AAAA,EAG5E,MAAM,QAAQ,MAAM,UAAU,SAAS,MAAM;AAAA,EAC7C,OAAO,KAAK,SAAS,MAAM,uBAAuB;AAAA,EAGlD,MAAM,eAAe,KAAK,IAAI;AAAA,EAG9B,MAAM,UAAyB,CAAC;AAAA,EAEhC,WAAW,UAAU,gBAAgB;AAAA,IACnC,MAAM,cAAc,KAAK,IAAI;AAAA,IAC7B,OAAO,KAAK;AAAA,GAAM,OAAO,4BAA4B;AAAA,IAGrD,MAAM,eAAe,gBAAgB,QAAQ,OAAO,EAAE;AAAA,IACtD,IAAI,OAAO,cAAc,cAAc;AAAA,MAErC,MAAM,sBAAsB,KAAK,aAAa;AAAA,MAC9C,IAAI,QAAQ,SAAS,OAAO,OAAO,uBAAuB;AAAA,QACxD,oBAAoB,UAAU;AAAA,aACzB,oBAAoB;AAAA,UACvB,gBAAgB,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,MAEA,oBAAoB,UAAU;AAAA,WACzB,oBAAoB;AAAA,QACvB;AAAA,MACF;AAAA,MACA,MAAM,OAAO,WAAW,mBAAmB;AAAA,IAC7C;AAAA,IAGA,MAAM,cAAc,OAAO,eACvB,MAAM,OAAO,CAAC,MAAM,OAAO,aAAc,CAAC,CAAC,IAC3C;AAAA,IAEJ,OAAO,KAAK,gBAAgB,YAAY,iBAAiB;AAAA,IAEzD,MAAM,SAAS,MAAM,gBACnB,SACA,aACA,QACA,QACA,SACA,eACA,QACA,WACF;AAAA,IACA,QAAQ,KAAK,MAAM;AAAA,IAGnB,IAAI,OAAO,UAAU;AAAA,MACnB,OAAO,KAAK,IAAI,OAAO,qCAAqC;AAAA,MAC5D,MAAM,MAAoB;AAAA,QACxB;AAAA,QACA;AAAA,QACA,UAAU,OAAO,aAAqB;AAAA,UACpC,MAAM,WAAgB,kBAAW,QAAQ,IACrC,WACK,YAAK,SAAS,QAAQ;AAAA,UAC/B,OAAU,aAAS,UAAU,OAAO;AAAA;AAAA,QAEtC,cAAc,OAAO,aAAqB;AAAA,UACxC,MAAM,WAAgB,kBAAW,QAAQ,IACrC,WACK,YAAK,SAAS,QAAQ;AAAA,UAC/B,MAAM,QAAQ,MAAS,SAAK,QAAQ;AAAA,UACpC,OAAO,EAAE,cAAc,MAAM,MAAM,YAAY,EAAE;AAAA;AAAA,MAErD;AAAA,MACA,MAAM,OAAO,SAAS,GAAG;AAAA,IAC3B;AAAA,IAEA,MAAM,iBAAiB,KAAK,IAAI,IAAI;AAAA,IACpC,OAAO,aAAa;AAAA,IAEpB,OAAO,KACL,IAAI,OAAO,mBAAmB,OAAO,oBACnC,OAAO,oBACI,OAAO,kBAAkB,eAAe,cAAc,IACrE;AAAA,EACF;AAAA,EAGA,MAAM,cAAc,KAAK,MAAM;AAAA,EAG/B,MAAM,kBAAkB,KAAK,IAAI,IAAI;AAAA,EACrC,OAAO,KAAK;AAAA,uBAA0B,eAAe,eAAe,GAAG;AAAA,EAGvE,MAAM,eAAe,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,CAAC;AAAA,EAClE,MAAM,eAAe,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,CAAC;AAAA,EAClE,MAAM,cAAc,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAAA,EAChE,OAAO,KACL,UAAU,yBAAyB,yBAAyB,oBAC9D;AAAA,EAGA,MAAM,qBAAqB,SAAS,gBAAgB,MAAM;AAAA,EAE1D,OAAO;AAAA;AAOT,eAAe,wBAAwB,CAAC,SAAmC;AAAA,EACzE,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EACvC,MAAM,qBAAqB,sBAAsB,SAAS,MAAM;AAAA,EAEhE,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,aAAS,oBAAoB,OAAO;AAAA,IAC7D,MAAM,WAA2B,KAAK,MAAM,OAAO;AAAA,IAGnD,OAAO,SAAS,YAAY;AAAA,IAC5B,MAAM;AAAA,IAEN,OAAO;AAAA;AAAA;AAOX,eAAe,WAAW,CAAC,SAAgC;AAAA,EACzD,MAAM,WAAW,cAAc,OAAO;AAAA,EAEtC,IAAI;AAAA,IACF,MAAS,OAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACtD,MAAM;AAAA;AAsBV,eAAsB,UAAU,CAAC,SAAuC;AAAA,EAEtE,UAAe,eAAQ,OAAO;AAAA,EAG9B,MAAM,SAAS,MAAM,eAAe,OAAO;AAAA,EAE3C,IAAI,CAAC,OAAO,QAAQ;AAAA,IAClB,MAAM,IAAI,MAAM,sBAAsB,SAAS;AAAA,EACjD;AAAA,EAGA,MAAM,YAAY,OAAO;AAAA,EAEzB,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,OAAO;AAAA,EACnB;AAAA;AAiBF,eAAsB,gBAAgB,CACpC,SACA,UAAwB,CAAC,GACG;AAAA,EAC5B,MAAM,UAAU,QAAQ,WAAW;AAAA,EACnC,MAAM,QAAQ,QAAQ,SAAS;AAAA,EAG/B,MAAM,SAAiB,QAAQ,SAC3B,QAAQ,SACR,QACA,mBAAmB,IACnB,aAAa,EAAE,QAAQ,CAAC;AAAA,EAG5B,UAAe,eAAQ,OAAO;AAAA,EAG9B,MAAM,SAAS,MAAM,eAAe,OAAO;AAAA,EAE3C,IAAI,CAAC,OAAO,QAAQ;AAAA,IAElB,OAAO,KAAK;AAAA,CAAqC;AAAA,IACjD,MAAM,UAAU,MAAM,eAAe,SAAS,KAAK,SAAS,OAAO,CAAC;AAAA,IACpE,MAAM,gBAAe,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,CAAC;AAAA,IAClE,OAAO,EAAE,SAAS,eAAc,SAAS,GAAG,WAAW,EAAE;AAAA,EAC3D;AAAA,EAGA,MAAM,oBAAoB,MAAM,yBAAyB,OAAO;AAAA,EAChE,IAAI,CAAC,mBAAmB;AAAA,IAEtB,OAAO,KAAK;AAAA,CAA6C;AAAA,IACzD,MAAM,YAAY,OAAO;AAAA,IACzB,MAAM,UAAU,MAAM,eAAe,SAAS,KAAK,SAAS,OAAO,CAAC;AAAA,IACpE,MAAM,gBAAe,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,CAAC;AAAA,IAClE,OAAO,EAAE,SAAS,eAAc,SAAS,GAAG,WAAW,EAAE;AAAA,EAC3D;AAAA,EAGA,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,uBAAuB;AAAA,EAG7B,MAAM,iBAAiB,SAAS,WAAW,MAAM;AAAA,EAEjD,IAAI,eAAe,WAAW,GAAG;AAAA,IAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,EAAE;AAAA,EAChD;AAAA,EAGA,MAAM,gBAAgB,IAAI,mBAAmB,OAAO;AAAA,EACpD,MAAM,cAAc,WAAW;AAAA,EAG/B,MAAM,eAAe,MAAM,UAAU,SAAS,MAAM;AAAA,EACpD,MAAM,iBAAiB,IAAI,IACzB,aAAa,IAAI,CAAC,MAAW,gBAAS,SAAS,CAAC,CAAC,CACnD;AAAA,EAEA,IAAI,eAAe;AAAA,EACnB,IAAI,eAAe;AAAA,EACnB,IAAI,iBAAiB;AAAA,EAErB,WAAW,UAAU,gBAAgB;AAAA,IAEnC,MAAM,eAAe,gBAAgB,QAAQ,OAAO,EAAE;AAAA,IACtD,IAAI,OAAO,cAAc,cAAc;AAAA,MACrC,MAAM,sBAAsB,KAAK,aAAa;AAAA,MAC9C,IAAI,QAAQ,SAAS,OAAO,OAAO,uBAAuB;AAAA,QACxD,oBAAoB,UAAU;AAAA,aACzB,oBAAoB;AAAA,UACvB,gBAAgB,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,MAEA,oBAAoB,UAAU;AAAA,WACzB,oBAAoB;AAAA,QACvB;AAAA,MACF;AAAA,MACA,MAAM,OAAO,WAAW,mBAAmB;AAAA,IAC7C;AAAA,IAGA,MAAM,WAAW,MAAM,mBAAmB,SAAS,OAAO,IAAI,MAAM;AAAA,IACpE,MAAM,YAAY,mBAAmB,SAAS,OAAO,IAAI,MAAM;AAAA,IAG/D,MAAM,gBAA0B,CAAC;AAAA,IACjC,WAAW,YAAY,OAAO,KAAK,SAAS,KAAK,GAAG;AAAA,MAClD,IAAI,CAAC,eAAe,IAAI,QAAQ,GAAG;AAAA,QACjC,cAAc,KAAK,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,IAGA,WAAW,YAAY,eAAe;AAAA,MACpC,OAAO,MAAM,qBAAqB,UAAU;AAAA,MAE5C,MAAM,gBAAqB,YACzB,WACA,SAAS,QAAQ,YAAY,OAAO,CACtC;AAAA,MACA,IAAI;AAAA,QACF,MAAS,WAAO,aAAa;AAAA,QAC7B,MAAM;AAAA,MAIR,MAAM,mBAAwB,YAC5B,WACA,YACA,SAAS,QAAQ,YAAY,OAAO,CACtC;AAAA,MACA,IAAI;AAAA,QACF,MAAS,WAAO,gBAAgB;AAAA,QAChC,MAAM;AAAA,MAGR,OAAO,SAAS,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,MAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA,UAAU,OAAO,aAAqB;AAAA,QACpC,MAAM,WAAgB,kBAAW,QAAQ,IACrC,WACK,YAAK,SAAS,QAAQ;AAAA,QAC/B,OAAU,aAAS,UAAU,OAAO;AAAA;AAAA,MAEtC,cAAc,OAAO,aAAqB;AAAA,QACxC,MAAM,WAAgB,kBAAW,QAAQ,IACrC,WACK,YAAK,SAAS,QAAQ;AAAA,QAC/B,MAAM,QAAQ,MAAS,SAAK,QAAQ;AAAA,QACpC,OAAO,EAAE,cAAc,MAAM,MAAM,YAAY,EAAE;AAAA;AAAA,MAEnD,kBAAkB,CAAC,aAAqB,cAAc,QAAQ,QAAQ;AAAA,IACxE;AAAA,IAEA,MAAM,aAAa,aAAa;AAAA,IAChC,SAAS,IAAI,EAAG,IAAI,aAAa,QAAQ,KAAK;AAAA,MAC5C,MAAM,WAAW,aAAa;AAAA,MAC9B,MAAM,eAAoB,gBAAS,SAAS,QAAQ;AAAA,MACpD,MAAM,WAAW,IAAI,IAAI,KAAK;AAAA,MAE9B,IAAI;AAAA,QACF,MAAM,QAAQ,MAAS,SAAK,QAAQ;AAAA,QACpC,MAAM,eAAe,MAAM,MAAM,YAAY;AAAA,QAG7C,MAAM,gBAAgB,SAAS,MAAM;AAAA,QACrC,IAAI,iBAAiB,cAAc,iBAAiB,cAAc;AAAA,UAChE;AAAA,UACA;AAAA,QACF;AAAA,QAGA,OAAO,SAAS,KAAK,sBAAsB,cAAc;AAAA,QAEzD,MAAM,UAAU,MAAS,aAAS,UAAU,OAAO;AAAA,QACnD,cAAc,QAAQ,cAAc,OAAO;AAAA,QAE3C,MAAM,YAAY,MAAM,OAAO,UAAU,cAAc,SAAS,GAAG;AAAA,QAEnE,IAAI,WAAW;AAAA,UACb,MAAM,eACJ,SACA,OAAO,IACP,cACA,WACA,MACF;AAAA,UACA,SAAS,MAAM,gBAAgB;AAAA,YAC7B;AAAA,YACA,YAAY,UAAU,OAAO;AAAA,UAC/B;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,OAAO;AAAA,QACd,OAAO,cAAc;AAAA,QACrB,OAAO,MAAM,KAAK,2BAA2B,iBAAiB,OAAO;AAAA;AAAA,IAEzE;AAAA,IAGA,OAAO,cAAc;AAAA,IAGrB,IAAI,eAAe,KAAK,eAAe,GAAG;AAAA,MACxC,SAAS,cAAc,IAAI,KAAK,EAAE,YAAY;AAAA,MAC9C,MAAM,oBAAoB,SAAS,OAAO,IAAI,UAAU,MAAM;AAAA,MAG9D,IAAI,OAAO,UAAU;AAAA,QACnB,MAAM,OAAO,SAAS,GAAG;AAAA,MAC3B;AAAA,IACF;AAAA,IAGA,IAAI,eAAe,GAAG;AAAA,MACpB,MAAM,wBAAwB,SAAS;AAAA,IACzC;AAAA,EACF;AAAA,EAGA,IAAI,eAAe,GAAG;AAAA,IACpB,MAAM,cAAc,KAAK,MAAM;AAAA,EACjC;AAAA,EAGA,IAAI,eAAe,KAAK,eAAe,GAAG;AAAA,IACxC,MAAM,qBAAqB,SAAS,gBAAgB,MAAM;AAAA,EAC5D;AAAA,EAEA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA;AAiBF,eAAe,eAAe,CAC5B,SACA,OACA,QACA,QACA,SACA,eACA,QACA,cAAsB,qBACA;AAAA,EACtB,MAAM,SAAsB;AAAA,IAC1B,UAAU,OAAO;AAAA,IACjB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EAGA,MAAM,WAAW,MAAM,mBAAmB,SAAS,OAAO,IAAI,MAAM;AAAA,EACpE,MAAM,YAAY,mBAAmB,SAAS,OAAO,IAAI,MAAM;AAAA,EAG/D,MAAM,iBAAiB,IAAI,IAAI,MAAM,IAAI,CAAC,MAAW,gBAAS,SAAS,CAAC,CAAC,CAAC;AAAA,EAG1E,MAAM,gBAA0B,CAAC;AAAA,EACjC,WAAW,YAAY,OAAO,KAAK,SAAS,KAAK,GAAG;AAAA,IAClD,IAAI,CAAC,eAAe,IAAI,QAAQ,GAAG;AAAA,MACjC,cAAc,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,IAAI,cAAc,SAAS,GAAG;AAAA,IAC5B,OAAO,KAAK,cAAc,cAAc,yBAAyB;AAAA,IACjE,WAAW,YAAY,eAAe;AAAA,MACpC,OAAO,MAAM,iBAAiB,UAAU;AAAA,MAExC,MAAM,gBAAqB,YACzB,WACA,SAAS,QAAQ,YAAY,OAAO,CACtC;AAAA,MACA,IAAI;AAAA,QACF,MAAS,WAAO,aAAa;AAAA,QAC7B,MAAM;AAAA,MAIR,MAAM,mBAAwB,YAC5B,WACA,YACA,SAAS,QAAQ,YAAY,OAAO,CACtC;AAAA,MACA,IAAI;AAAA,QACF,MAAS,WAAO,gBAAgB;AAAA,QAChC,MAAM;AAAA,MAGR,OAAO,SAAS,MAAM;AAAA,IACxB;AAAA,IAEA,MAAM,wBAAwB,SAAS;AAAA,EACzC;AAAA,EAGA,MAAM,MAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA,UAAU,OAAO,aAAqB;AAAA,MACpC,MAAM,WAAgB,kBAAW,QAAQ,IACrC,WACK,YAAK,SAAS,QAAQ;AAAA,MAC/B,OAAU,aAAS,UAAU,OAAO;AAAA;AAAA,IAEtC,cAAc,OAAO,aAAqB;AAAA,MACxC,MAAM,WAAgB,kBAAW,QAAQ,IACrC,WACK,YAAK,SAAS,QAAQ;AAAA,MAC/B,MAAM,QAAQ,MAAS,SAAK,QAAQ;AAAA,MACpC,OAAO,EAAE,cAAc,MAAM,MAAM,YAAY,EAAE;AAAA;AAAA,IAEnD,kBAAkB,CAAC,aAAqB,cAAc,QAAQ,QAAQ;AAAA,EACxE;AAAA,EAEA,MAAM,aAAa,MAAM;AAAA,EAGzB,IAAI,iBAAiB;AAAA,EAGrB,MAAM,cAAc,OAClB,UACA,WAC+B;AAAA,IAC/B,MAAM,eAAoB,gBAAS,SAAS,QAAQ;AAAA,IAEpD,IAAI;AAAA,MACF,MAAM,QAAQ,MAAS,SAAK,QAAQ;AAAA,MACpC,MAAM,eAAe,MAAM,MAAM,YAAY;AAAA,MAG7C,MAAM,gBAAgB,SAAS,MAAM;AAAA,MACrC,IAAI,iBAAiB,cAAc,iBAAiB,cAAc;AAAA,QAChE;AAAA,QACA,OAAO,MACL,MAAM,kBAAkB,uBAAuB,0BACjD;AAAA,QACA,OAAO,EAAE,cAAc,QAAQ,UAAU;AAAA,MAC3C;AAAA,MAGA,MAAM,UAAU,MAAS,aAAS,UAAU,OAAO;AAAA,MAGnD,cAAc,QAAQ,cAAc,OAAO;AAAA,MAG3C;AAAA,MACA,OAAO,SACL,MAAM,kBAAkB,2BAA2B,cACrD;AAAA,MAEA,MAAM,YAAY,MAAM,OAAO,UAAU,cAAc,SAAS,GAAG;AAAA,MAEnE,IAAI,CAAC,WAAW;AAAA,QACd,OAAO,MACL,MAAM,kBAAkB,uBAAuB,0BACjD;AAAA,QACA,OAAO,EAAE,cAAc,QAAQ,UAAU;AAAA,MAC3C;AAAA,MAGA,MAAM,eAAe,SAAS,OAAO,IAAI,cAAc,WAAW,MAAM;AAAA,MAExE,OAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,YAAY,UAAU,OAAO;AAAA,MAC/B;AAAA,MACA,OAAO,OAAO;AAAA,MACd;AAAA,MACA,OAAO,EAAE,cAAc,QAAQ,SAAS,MAAM;AAAA;AAAA;AAAA,EAKlD,OAAO,MAAM,wBAAwB,aAAa;AAAA,EAClD,MAAM,UAAU,MAAM,YAAY,OAAO,aAAa,WAAW;AAAA,EAGjE,OAAO,cAAc;AAAA,EAGrB,WAAW,QAAQ,SAAS;AAAA,IAC1B,IAAI,CAAC,KAAK,SAAS;AAAA,MAEjB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IAEA,MAAM,aAAa,KAAK;AAAA,IACxB,QAAQ,WAAW;AAAA,WACZ;AAAA,QACH,SAAS,MAAM,WAAW,gBAAgB;AAAA,UACxC,cAAc,WAAW;AAAA,UACzB,YAAY,WAAW;AAAA,QACzB;AAAA,QACA,OAAO;AAAA,QACP;AAAA,WACG;AAAA,QACH,OAAO;AAAA,QACP;AAAA,WACG;AAAA,QACH,OAAO,MACL,oBAAoB,WAAW,iBAAiB,WAAW,OAC7D;AAAA,QACA,OAAO;AAAA,QACP;AAAA;AAAA,EAEN;AAAA,EAGA,SAAS,cAAc,IAAI,KAAK,EAAE,YAAY;AAAA,EAC9C,MAAM,oBAAoB,SAAS,OAAO,IAAI,UAAU,MAAM;AAAA,EAE9D,OAAO;AAAA;AAGT,eAAe,SAAS,CAAC,SAAiB,QAAmC;AAAA,EAC3E,MAAM,WAAW,OAAO,WAAW,IAAI,CAAC,QAAQ,OAAO,KAAK;AAAA,EAC5D,MAAM,iBAAiB,OAAO,YAAY,IAAI,CAAC,MAAM,MAAM,MAAM;AAAA,EAEjE,MAAM,QAAkB,CAAC;AAAA,EACzB,WAAW,WAAW,UAAU;AAAA,IAC9B,MAAM,UAAU,MAAM,KAAK,SAAS;AAAA,MAClC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AAAA,IACD,MAAM,KAAK,GAAG,OAAO;AAAA,EACvB;AAAA,EAEA,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAAA;AAG3B,eAAe,kBAAkB,CAC/B,SACA,UACA,QACyB;AAAA,EACzB,MAAM,eAAe,sBAAsB,SAAS,UAAU,MAAM;AAAA,EAEpE,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,aAAS,cAAc,OAAO;AAAA,IACvD,OAAO,KAAK,MAAM,OAAO;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,MACpC,OAAO,CAAC;AAAA,IACV;AAAA;AAAA;AAIJ,eAAe,mBAAmB,CAChC,SACA,UACA,UACA,QACe;AAAA,EACf,MAAM,eAAe,sBAAsB,SAAS,UAAU,MAAM;AAAA,EACpE,MAAS,UAAW,eAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9D,MAAS,cAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA;AAGpE,eAAe,cAAc,CAC3B,SACA,UACA,UACA,WACA,QACe;AAAA,EACf,MAAM,YAAY,mBAAmB,SAAS,UAAU,MAAM;AAAA,EAC9D,MAAM,gBAAqB,YACzB,WACA,SAAS,QAAQ,YAAY,OAAO,CACtC;AAAA,EAEA,MAAS,UAAW,eAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/D,MAAS,cAAU,eAAe,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA;AAGtE,eAAe,oBAAoB,CACjC,SACA,SACA,QACe;AAAA,EACf,MAAM,eAAe,sBAAsB,SAAS,MAAM;AAAA,EAE1D,MAAM,WAA2B;AAAA,IAC/B,SAAS;AAAA,IACT,aAAa,IAAI,KAAK,EAAE,YAAY;AAAA,IACpC,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EAClC;AAAA,EAEA,MAAS,UAAW,eAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9D,MAAS,cAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA;AAmBpE,eAAsB,YAAY,CAChC,SACA,UAA0B,CAAC,GACD;AAAA,EAC1B,MAAM,UAAU,QAAQ,WAAW;AAAA,EAGnC,MAAM,SAAiB,QAAQ,UAAU,aAAa,EAAE,QAAQ,CAAC;AAAA,EAGjE,UAAe,eAAQ,OAAO;AAAA,EAE9B,OAAO,KAAK,yBAAyB,SAAS;AAAA,EAG9C,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,uBAAuB;AAAA,EAG7B,MAAM,iBAAiB,SAAS,WAAW,MAAM;AAAA,EAEjD,IAAI,eAAe,WAAW,GAAG;AAAA,IAC/B,OAAO,KAAK,qBAAqB;AAAA,IACjC,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,UAA2B,CAAC;AAAA,EAElC,WAAW,UAAU,gBAAgB;AAAA,IACnC,OAAO,KAAK;AAAA,GAAM,OAAO,qCAAqC;AAAA,IAE9D,MAAM,SAAS,MAAM,mBAAmB,SAAS,OAAO,IAAI,QAAQ,MAAM;AAAA,IAC1E,QAAQ,KAAK,MAAM;AAAA,IAEnB,OAAO,KACL,IAAI,OAAO,iBAAiB,OAAO,+BAA+B,OAAO,oBAC3E;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,eAAe,kBAAkB,CAC/B,SACA,UACA,QACA,QACwB;AAAA,EACxB,MAAM,SAAwB;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EAGA,MAAM,WAAW,MAAM,mBAAmB,SAAS,UAAU,MAAM;AAAA,EACnE,MAAM,YAAY,mBAAmB,SAAS,UAAU,MAAM;AAAA,EAE9D,MAAM,gBAA0B,CAAC;AAAA,EACjC,MAAM,eAAwC,CAAC;AAAA,EAG/C,YAAY,UAAU,UAAU,OAAO,QAAQ,SAAS,KAAK,GAAG;AAAA,IAC9D,MAAM,WAAgB,YAAK,SAAS,QAAQ;AAAA,IAE5C,IAAI;AAAA,MACF,MAAS,WAAO,QAAQ;AAAA,MAExB,aAAa,YAAY;AAAA,MACzB,OAAO;AAAA,MACP,MAAM;AAAA,MAEN,cAAc,KAAK,QAAQ;AAAA,MAC3B,OAAO;AAAA,MACP,OAAO,MAAM,2BAA2B,UAAU;AAAA;AAAA,EAEtD;AAAA,EAGA,WAAW,YAAY,eAAe;AAAA,IACpC,MAAM,gBAAqB,YACzB,WACA,SAAS,QAAQ,YAAY,OAAO,CACtC;AAAA,IACA,IAAI;AAAA,MACF,MAAS,WAAO,aAAa;AAAA,MAC7B,MAAM;AAAA,EAGV;AAAA,EAGA,SAAS,QAAQ;AAAA,EACjB,SAAS,cAAc,IAAI,KAAK,EAAE,YAAY;AAAA,EAC9C,MAAM,oBAAoB,SAAS,UAAU,UAAU,MAAM;AAAA,EAG7D,MAAM,wBAAwB,SAAS;AAAA,EAEvC,OAAO;AAAA;AAMT,eAAe,uBAAuB,CAAC,KAA+B;AAAA,EACpE,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IAG7D,WAAW,SAAS,SAAS;AAAA,MAC3B,IAAI,MAAM,YAAY,GAAG;AAAA,QACvB,MAAM,SAAc,YAAK,KAAK,MAAM,IAAI;AAAA,QACxC,MAAM,wBAAwB,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,IAGA,MAAM,mBAAmB,MAAS,YAAQ,GAAG;AAAA,IAG7C,IAAI,iBAAiB,WAAW,GAAG;AAAA,MACjC,MAAS,UAAM,GAAG;AAAA,MAClB,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AASX,eAAsB,cAAc,CAAC,SAAuC;AAAA,EAE1E,UAAe,eAAQ,OAAO;AAAA,EAG9B,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,WAAW,iBAAiB,OAAO;AAAA,EACzC,MAAM,WAAW,SAAS;AAAA,EAE1B,MAAM,SAAsB;AAAA,IAC1B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,CAAC;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EAGA,IAAI;AAAA,IACF,MAAS,WAAO,QAAQ;AAAA,IACxB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,EAIT,IAAI;AAAA,IACF,MAAM,qBAAqB,sBAAsB,SAAS,MAAM;AAAA,IAChE,MAAM,UAAU,MAAS,aAAS,oBAAoB,OAAO;AAAA,IAC7D,MAAM,iBAAiC,KAAK,MAAM,OAAO;AAAA,IAEzD,OAAO,SAAS;AAAA,IAChB,OAAO,cAAc,eAAe;AAAA,IAGpC,WAAW,YAAY,eAAe,SAAS;AAAA,MAC7C,IAAI;AAAA,QACF,MAAM,WAAW,MAAM,mBAAmB,SAAS,UAAU,MAAM;AAAA,QACnE,MAAM,YAAY,OAAO,KAAK,SAAS,KAAK,EAAE;AAAA,QAE9C,OAAO,QAAQ,KAAK;AAAA,UAClB,IAAI;AAAA,UACJ;AAAA,UACA,aAAa,SAAS;AAAA,QACxB,CAAC;AAAA,QAED,OAAO,cAAc;AAAA,QACrB,MAAM;AAAA,IAGV;AAAA,IACA,MAAM;AAAA,IAEN,IAAI;AAAA,MACF,MAAM,UAAU,MAAS,YAAa,YAAK,UAAU,OAAO,CAAC;AAAA,MAC7D,IAAI,QAAQ,SAAS,GAAG;AAAA,QACtB,OAAO,SAAS;AAAA,QAEhB,WAAW,SAAS,SAAS;AAAA,UAC3B,IAAI;AAAA,YACF,MAAM,WAAW,MAAM,mBAAmB,SAAS,OAAO,MAAM;AAAA,YAChE,MAAM,YAAY,OAAO,KAAK,SAAS,KAAK,EAAE;AAAA,YAE9C,OAAO,QAAQ,KAAK;AAAA,cAClB,IAAI;AAAA,cACJ;AAAA,cACA,aAAa,SAAS;AAAA,YACxB,CAAC;AAAA,YAED,OAAO,cAAc;AAAA,YACrB,MAAM;AAAA,QAGV;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,EAKV,OAAO;AAAA;;;AMzpCT;AACA;;;ACyBA;;;ADdA;AAYA,eAAsB,MAAM,CAC1B,SACA,OACA,UAAyB,CAAC,GACD;AAAA,EAEzB,UAAe,eAAQ,OAAO;AAAA,EAG9B,MAAM,cAAc,QAAQ,eAAe,uBAAuB;AAAA,EAClE,IAAI,aAAa;AAAA,IACf,MAAM,iBAAiB,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,EACjD;AAAA,EAEA,QAAQ,IAAI,mBAAmB,QAAQ;AAAA,EAGvC,MAAM,SAAS,MAAM,WAAW,OAAO;AAAA,EAGvC,MAAM,uBAAuB;AAAA,EAG7B,MAAM,iBAAiB,MAAM,mBAAmB,SAAS,MAAM;AAAA,EAE/D,IAAI,CAAC,kBAAkB,eAAe,QAAQ,WAAW,GAAG;AAAA,IAC1D,QAAQ,IAAI,4CAA4C;AAAA,IACxD,OAAO,CAAC;AAAA,EACV;AAAA,EAGA,MAAM,kBAAiC,CAAC;AAAA,EAExC,WAAW,YAAY,eAAe,SAAS;AAAA,IAC7C,MAAM,SAAS,SAAS,IAAI,QAAQ;AAAA,IACpC,MAAM,eAAe,gBAAgB,QAAQ,QAAQ;AAAA,IAErD,IAAI,UAAU,cAAc,SAAS;AAAA,MAEnC,IAAI,OAAO,YAAY;AAAA,QACrB,MAAM,OAAO,WAAW,YAAY;AAAA,MACtC;AAAA,MACA,gBAAgB,KAAK,MAAM;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,IAAI,gBAAgB,WAAW,GAAG;AAAA,IAChC,QAAQ,IAAI,wCAAwC;AAAA,IACpD,OAAO,CAAC;AAAA,EACV;AAAA,EAGA,MAAM,aAA6B,CAAC;AAAA,EAEpC,WAAW,UAAU,iBAAiB;AAAA,IACpC,MAAM,MAAM,oBAAoB,SAAS,OAAO,IAAI,MAAM;AAAA,IAC1D,MAAM,gBAAgB,MAAM,OAAO,OAAO,OAAO,KAAK,OAAO;AAAA,IAC7D,WAAW,KAAK,GAAG,aAAa;AAAA,EAClC;AAAA,EAGA,IAAI,kBAAkB;AAAA,EACtB,IAAI,QAAQ,cAAc,QAAQ,WAAW,SAAS,GAAG;AAAA,IACvD,MAAM,oBAAoB,QAAQ,WAAW,IAAI,CAAC,MAChD,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE,CAC5D;AAAA,IACA,kBAAkB,WAAW,OAAO,CAAC,WAAW;AAAA,MAC9C,MAAM,iBAAiB,OAAO,SAAS,QAAQ,OAAO,GAAG;AAAA,MACzD,OAAO,kBAAkB,KACvB,CAAC,WACC,eAAe,WAAW,SAAS,GAAG,KACtC,mBAAmB,UACnB,eAAe,WAAW,OAAO,SAAS,GAAG,KAC7C,mBAAmB,OAAO,MAC9B;AAAA,KACD;AAAA,EACH;AAAA,EAGA,gBAAgB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,EAGhD,MAAM,OAAO,QAAQ,QAAQ;AAAA,EAC7B,OAAO,gBAAgB,MAAM,GAAG,IAAI;AAAA;AAMtC,SAAS,mBAAmB,CAC1B,SACA,UACA,QACe;AAAA,EACf,MAAM,YAAY,mBAAmB,SAAS,UAAU,MAAM;AAAA,EAE9D,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IAEA,eAAe,OAAO,aAAgD;AAAA,MAGpE,MAAM,eAAe,YAAY,KAAK,QAAQ;AAAA,MAC9C,MAAM,gBAAgB,eACb,YAAK,WAAW,SAAS,QAAQ,YAAY,OAAO,CAAC,IACrD,YAAK,WAAW,WAAW,OAAO;AAAA,MAE3C,IAAI;AAAA,QACF,MAAM,UAAU,MAAS,aAAS,eAAe,OAAO;AAAA,QACxD,OAAO,KAAK,MAAM,OAAO;AAAA,QACzB,MAAM;AAAA,QACN,OAAO;AAAA;AAAA;AAAA,IAIX,kBAAkB,YAA+B;AAAA,MAC/C,MAAM,QAAkB,CAAC;AAAA,MACzB,MAAM,kBAAkB,WAAW,OAAO,SAAS;AAAA,MAGnD,OAAO,MACJ,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,KAAK,CAAC,EAAE,SAAS,eAAe,CAAC,EACjE,IAAI,CAAC,MAAM;AAAA,QACV,MAAM,YAAgB,gBAAS,WAAW,CAAC;AAAA,QAE3C,OAAO,UAAS,QAAQ,WAAW,EAAE;AAAA,OACtC;AAAA;AAAA,EAEP;AAAA;AAGF,eAAe,iBAAiB,CAC9B,KACA,OACA,UACe;AAAA,EACf,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,YAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IAE7D,WAAW,SAAS,SAAS;AAAA,MAC3B,MAAM,WAAgB,YAAK,KAAK,MAAM,IAAI;AAAA,MAE1C,IAAI,MAAM,YAAY,GAAG;AAAA,QACvB,MAAM,kBAAkB,UAAU,OAAO,QAAQ;AAAA,MACnD,EAAO,SAAI,MAAM,OAAO,GAAG;AAAA,QACzB,MAAM,KAAK,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,IACA,MAAM;AAAA;AAKV,eAAe,kBAAkB,CAC/B,SACA,QACgC;AAAA,EAChC,MAAM,eAAe,sBAAsB,SAAS,MAAM;AAAA,EAE1D,IAAI;AAAA,IACF,MAAM,UAAU,MAAS,aAAS,cAAc,OAAO;AAAA,IACvD,OAAO,KAAK,MAAM,OAAO;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAOX,SAAS,gBAAgB,CAAC,UAA0B;AAAA,EAClD,QAAQ;AAAA,SACD;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA;AAAA,MAGP,IAAI,SAAS,WAAW,WAAW,GAAG;AAAA,QACpC,MAAM,OAAO,SAAS,QAAQ,aAAa,EAAE;AAAA,QAC7C,OAAO,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,MACpD;AAAA,MACA,OAAO;AAAA;AAAA;AASN,SAAS,mBAAmB,CAAC,SAAiC;AAAA,EACnE,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS,SAAS,QAAQ;AAAA;AAAA;AAAA,EAE9B,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK;AAAA,IACvC,MAAM,SAAS,QAAQ;AAAA,IACvB,QAAQ,UAAU;AAAA,IAGlB,MAAM,WAAW,GAAG,OAAO,YAAY,MAAM,aAAa,MAAM;AAAA,IAChE,MAAM,WAAW,MAAM,OAAO,KAAK,MAAM,UAAU;AAAA,IAEnD,UAAU,GAAG,IAAI,MAAM,WAAW;AAAA;AAAA,IAClC,UAAU,cAAc,OAAO,QAAQ,KAAK,QAAQ,CAAC,cACnD,MAAM;AAAA,IAIR,UAAU,UAAU,iBAAiB,OAAO,QAAQ;AAAA,IAGpD,IAAI,MAAM,YAAY;AAAA,MACpB,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA;AAAA,IAGV,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,CAAI,EAAE,MAAM,GAAG,CAAC;AAAA,IAClD,WAAW,QAAQ,OAAO;AAAA,MACxB,MAAM,cAAc,KAAK,UAAU,GAAG,EAAE;AAAA,MACxC,UAAU,SAAS,cAAc,KAAK,SAAS,KAAK,QAAQ;AAAA;AAAA,IAC9D;AAAA,IAEA,UAAU;AAAA;AAAA,EACZ;AAAA,EAEA,OAAO;AAAA;;;AEhKT,eAAsB,KAAK,CACzB,WACA,UAAwB,CAAC,GACD;AAAA,EACxB,OAAO,eAAe,WAAW,OAAO;AAAA;AAwB1C,eAAsB,OAAM,CAC1B,WACA,OACA,UAAyB,CAAC,GACD;AAAA,EACzB,OAAO,OAAY,WAAW,OAAO,OAAO;AAAA;AAmB9C,eAAsB,OAAO,CAC3B,WACA,UAA0B,CAAC,GACD;AAAA,EAC1B,OAAO,aAAa,WAAW,OAAO;AAAA;AAoBxC,eAAsB,KAAK,CAAC,WAAyC;AAAA,EACnE,OAAO,WAAW,SAAS;AAAA;AAY7B,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAe;",
45
+ "debugId": "4915A936C06DA9B864756E2164756E21",
46
46
  "names": []
47
47
  }