ai-mind-map 1.1.0

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.
Files changed (154) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +554 -0
  3. package/dist/change-tracker/change-log.d.ts +160 -0
  4. package/dist/change-tracker/change-log.d.ts.map +1 -0
  5. package/dist/change-tracker/change-log.js +507 -0
  6. package/dist/change-tracker/change-log.js.map +1 -0
  7. package/dist/change-tracker/diff-engine.d.ts +149 -0
  8. package/dist/change-tracker/diff-engine.d.ts.map +1 -0
  9. package/dist/change-tracker/diff-engine.js +530 -0
  10. package/dist/change-tracker/diff-engine.js.map +1 -0
  11. package/dist/change-tracker/watcher.d.ts +137 -0
  12. package/dist/change-tracker/watcher.d.ts.map +1 -0
  13. package/dist/change-tracker/watcher.js +300 -0
  14. package/dist/change-tracker/watcher.js.map +1 -0
  15. package/dist/cli.d.ts +20 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +937 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config.d.ts +38 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +222 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/context/compressor.d.ts +49 -0
  24. package/dist/context/compressor.d.ts.map +1 -0
  25. package/dist/context/compressor.js +769 -0
  26. package/dist/context/compressor.js.map +1 -0
  27. package/dist/context/progressive-disclosure.d.ts +71 -0
  28. package/dist/context/progressive-disclosure.d.ts.map +1 -0
  29. package/dist/context/progressive-disclosure.js +470 -0
  30. package/dist/context/progressive-disclosure.js.map +1 -0
  31. package/dist/context/token-budget.d.ts +121 -0
  32. package/dist/context/token-budget.d.ts.map +1 -0
  33. package/dist/context/token-budget.js +282 -0
  34. package/dist/context/token-budget.js.map +1 -0
  35. package/dist/index.d.ts +13 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +944 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/install.d.ts +66 -0
  40. package/dist/install.d.ts.map +1 -0
  41. package/dist/install.js +946 -0
  42. package/dist/install.js.map +1 -0
  43. package/dist/knowledge-graph/architecture.d.ts +213 -0
  44. package/dist/knowledge-graph/architecture.d.ts.map +1 -0
  45. package/dist/knowledge-graph/architecture.js +585 -0
  46. package/dist/knowledge-graph/architecture.js.map +1 -0
  47. package/dist/knowledge-graph/cypher.d.ts +113 -0
  48. package/dist/knowledge-graph/cypher.d.ts.map +1 -0
  49. package/dist/knowledge-graph/cypher.js +1051 -0
  50. package/dist/knowledge-graph/cypher.js.map +1 -0
  51. package/dist/knowledge-graph/dead-code.d.ts +121 -0
  52. package/dist/knowledge-graph/dead-code.d.ts.map +1 -0
  53. package/dist/knowledge-graph/dead-code.js +331 -0
  54. package/dist/knowledge-graph/dead-code.js.map +1 -0
  55. package/dist/knowledge-graph/flow-analyzer.d.ts +167 -0
  56. package/dist/knowledge-graph/flow-analyzer.d.ts.map +1 -0
  57. package/dist/knowledge-graph/flow-analyzer.js +739 -0
  58. package/dist/knowledge-graph/flow-analyzer.js.map +1 -0
  59. package/dist/knowledge-graph/graph.d.ts +291 -0
  60. package/dist/knowledge-graph/graph.d.ts.map +1 -0
  61. package/dist/knowledge-graph/graph.js +978 -0
  62. package/dist/knowledge-graph/graph.js.map +1 -0
  63. package/dist/knowledge-graph/index.d.ts +17 -0
  64. package/dist/knowledge-graph/index.d.ts.map +1 -0
  65. package/dist/knowledge-graph/index.js +14 -0
  66. package/dist/knowledge-graph/index.js.map +1 -0
  67. package/dist/knowledge-graph/indexer.d.ts +112 -0
  68. package/dist/knowledge-graph/indexer.d.ts.map +1 -0
  69. package/dist/knowledge-graph/indexer.js +506 -0
  70. package/dist/knowledge-graph/indexer.js.map +1 -0
  71. package/dist/knowledge-graph/pagerank.d.ts +141 -0
  72. package/dist/knowledge-graph/pagerank.d.ts.map +1 -0
  73. package/dist/knowledge-graph/pagerank.js +493 -0
  74. package/dist/knowledge-graph/pagerank.js.map +1 -0
  75. package/dist/knowledge-graph/parser.d.ts +55 -0
  76. package/dist/knowledge-graph/parser.d.ts.map +1 -0
  77. package/dist/knowledge-graph/parser.js +1090 -0
  78. package/dist/knowledge-graph/parser.js.map +1 -0
  79. package/dist/knowledge-graph/snapshot.d.ts +107 -0
  80. package/dist/knowledge-graph/snapshot.d.ts.map +1 -0
  81. package/dist/knowledge-graph/snapshot.js +435 -0
  82. package/dist/knowledge-graph/snapshot.js.map +1 -0
  83. package/dist/memory/decision-log.d.ts +151 -0
  84. package/dist/memory/decision-log.d.ts.map +1 -0
  85. package/dist/memory/decision-log.js +482 -0
  86. package/dist/memory/decision-log.js.map +1 -0
  87. package/dist/memory/persistent-memory.d.ts +182 -0
  88. package/dist/memory/persistent-memory.d.ts.map +1 -0
  89. package/dist/memory/persistent-memory.js +579 -0
  90. package/dist/memory/persistent-memory.js.map +1 -0
  91. package/dist/memory/session-memory.d.ts +165 -0
  92. package/dist/memory/session-memory.d.ts.map +1 -0
  93. package/dist/memory/session-memory.js +382 -0
  94. package/dist/memory/session-memory.js.map +1 -0
  95. package/dist/stress-test.d.ts +10 -0
  96. package/dist/stress-test.d.ts.map +1 -0
  97. package/dist/stress-test.js +258 -0
  98. package/dist/stress-test.js.map +1 -0
  99. package/dist/tools/advanced-tools.d.ts +32 -0
  100. package/dist/tools/advanced-tools.d.ts.map +1 -0
  101. package/dist/tools/advanced-tools.js +480 -0
  102. package/dist/tools/advanced-tools.js.map +1 -0
  103. package/dist/tools/change-tools.d.ts +76 -0
  104. package/dist/tools/change-tools.d.ts.map +1 -0
  105. package/dist/tools/change-tools.js +93 -0
  106. package/dist/tools/change-tools.js.map +1 -0
  107. package/dist/tools/context-tools.d.ts +68 -0
  108. package/dist/tools/context-tools.d.ts.map +1 -0
  109. package/dist/tools/context-tools.js +141 -0
  110. package/dist/tools/context-tools.js.map +1 -0
  111. package/dist/tools/debug-tools.d.ts +25 -0
  112. package/dist/tools/debug-tools.d.ts.map +1 -0
  113. package/dist/tools/debug-tools.js +286 -0
  114. package/dist/tools/debug-tools.js.map +1 -0
  115. package/dist/tools/evolving-tools.d.ts +23 -0
  116. package/dist/tools/evolving-tools.d.ts.map +1 -0
  117. package/dist/tools/evolving-tools.js +207 -0
  118. package/dist/tools/evolving-tools.js.map +1 -0
  119. package/dist/tools/flow-tools.d.ts +24 -0
  120. package/dist/tools/flow-tools.d.ts.map +1 -0
  121. package/dist/tools/flow-tools.js +265 -0
  122. package/dist/tools/flow-tools.js.map +1 -0
  123. package/dist/tools/graph-tools.d.ts +71 -0
  124. package/dist/tools/graph-tools.d.ts.map +1 -0
  125. package/dist/tools/graph-tools.js +165 -0
  126. package/dist/tools/graph-tools.js.map +1 -0
  127. package/dist/tools/memory-tools.d.ts +62 -0
  128. package/dist/tools/memory-tools.d.ts.map +1 -0
  129. package/dist/tools/memory-tools.js +195 -0
  130. package/dist/tools/memory-tools.js.map +1 -0
  131. package/dist/tools/smart-tools.d.ts +23 -0
  132. package/dist/tools/smart-tools.d.ts.map +1 -0
  133. package/dist/tools/smart-tools.js +482 -0
  134. package/dist/tools/smart-tools.js.map +1 -0
  135. package/dist/tools/snapshot-tools.d.ts +19 -0
  136. package/dist/tools/snapshot-tools.d.ts.map +1 -0
  137. package/dist/tools/snapshot-tools.js +149 -0
  138. package/dist/tools/snapshot-tools.js.map +1 -0
  139. package/dist/types.d.ts +181 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +45 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/utils/logger.d.ts +59 -0
  144. package/dist/utils/logger.d.ts.map +1 -0
  145. package/dist/utils/logger.js +142 -0
  146. package/dist/utils/logger.js.map +1 -0
  147. package/dist/utils/token-counter.d.ts +51 -0
  148. package/dist/utils/token-counter.d.ts.map +1 -0
  149. package/dist/utils/token-counter.js +181 -0
  150. package/dist/utils/token-counter.js.map +1 -0
  151. package/install.ps1 +321 -0
  152. package/install.sh +345 -0
  153. package/package.json +94 -0
  154. package/setup.bat +62 -0
@@ -0,0 +1,585 @@
1
+ /**
2
+ * AI Mind Map — Architecture Analysis
3
+ *
4
+ * Analyzes the structural architecture of a codebase by examining the knowledge
5
+ * graph, file system patterns, and dependency manifests. Produces a comprehensive
6
+ * report covering languages, packages, entry points, routes, hotspots, layers,
7
+ * test coverage, dependencies, complexity metrics, and code patterns.
8
+ *
9
+ * Inspired by codebase-memory-mcp's `get_architecture` tool.
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ // ============================================================
14
+ // Well-Known Layer Patterns
15
+ // ============================================================
16
+ /**
17
+ * Common architectural layer patterns to detect in directory structures.
18
+ * Each entry maps a human-readable layer name to glob-like directory patterns.
19
+ */
20
+ const LAYER_PATTERNS = [
21
+ { name: 'Controllers', patterns: [/[/\\]controllers?[/\\]/i, /[/\\]handlers?[/\\]/i, /[/\\]api[/\\]/i] },
22
+ { name: 'Services', patterns: [/[/\\]services?[/\\]/i, /[/\\]providers?[/\\]/i] },
23
+ { name: 'Models', patterns: [/[/\\]models?[/\\]/i, /[/\\]entities[/\\]/i, /[/\\]schemas?[/\\]/i] },
24
+ { name: 'Repositories', patterns: [/[/\\]repositories[/\\]/i, /[/\\]repos?[/\\]/i, /[/\\]dao[/\\]/i, /[/\\]data[/\\]/i] },
25
+ { name: 'Middleware', patterns: [/[/\\]middleware[/\\]/i, /[/\\]middlewares[/\\]/i] },
26
+ { name: 'Routes', patterns: [/[/\\]routes?[/\\]/i, /[/\\]routing[/\\]/i] },
27
+ { name: 'Utils', patterns: [/[/\\]utils?[/\\]/i, /[/\\]helpers?[/\\]/i, /[/\\]lib[/\\]/i, /[/\\]common[/\\]/i, /[/\\]shared[/\\]/i] },
28
+ { name: 'Config', patterns: [/[/\\]config[/\\]/i, /[/\\]configuration[/\\]/i, /[/\\]settings[/\\]/i] },
29
+ { name: 'Components', patterns: [/[/\\]components?[/\\]/i, /[/\\]widgets?[/\\]/i] },
30
+ { name: 'Views', patterns: [/[/\\]views?[/\\]/i, /[/\\]pages?[/\\]/i, /[/\\]screens?[/\\]/i, /[/\\]templates?[/\\]/i] },
31
+ { name: 'Hooks', patterns: [/[/\\]hooks?[/\\]/i] },
32
+ { name: 'Store', patterns: [/[/\\]store[/\\]/i, /[/\\]stores?[/\\]/i, /[/\\]state[/\\]/i, /[/\\]redux[/\\]/i, /[/\\]vuex[/\\]/i] },
33
+ { name: 'Types', patterns: [/[/\\]types?[/\\]/i, /[/\\]interfaces[/\\]/i, /[/\\]typings[/\\]/i] },
34
+ { name: 'Tests', patterns: [/[/\\]tests?[/\\]/i, /[/\\]__tests__[/\\]/i, /[/\\]spec[/\\]/i] },
35
+ { name: 'Migrations', patterns: [/[/\\]migrations?[/\\]/i, /[/\\]seeds?[/\\]/i] },
36
+ { name: 'Assets', patterns: [/[/\\]assets?[/\\]/i, /[/\\]static[/\\]/i, /[/\\]public[/\\]/i] },
37
+ ];
38
+ /**
39
+ * Package manifest file names and their ecosystems.
40
+ */
41
+ const MANIFEST_FILES = [
42
+ { filename: 'package.json', ecosystem: 'npm' },
43
+ { filename: 'requirements.txt', ecosystem: 'pip' },
44
+ { filename: 'pyproject.toml', ecosystem: 'pip' },
45
+ { filename: 'setup.py', ecosystem: 'pip' },
46
+ { filename: 'Pipfile', ecosystem: 'pip' },
47
+ { filename: 'go.mod', ecosystem: 'go' },
48
+ { filename: 'Cargo.toml', ecosystem: 'rust' },
49
+ { filename: 'Gemfile', ecosystem: 'ruby' },
50
+ { filename: 'pom.xml', ecosystem: 'maven' },
51
+ { filename: 'build.gradle', ecosystem: 'gradle' },
52
+ { filename: 'build.gradle.kts', ecosystem: 'gradle' },
53
+ { filename: 'composer.json', ecosystem: 'php' },
54
+ { filename: 'pubspec.yaml', ecosystem: 'dart' },
55
+ { filename: 'mix.exs', ecosystem: 'elixir' },
56
+ { filename: 'Package.swift', ecosystem: 'swift' },
57
+ { filename: '*.csproj', ecosystem: 'dotnet' },
58
+ { filename: '*.sln', ecosystem: 'dotnet' },
59
+ ];
60
+ /**
61
+ * Test file patterns for identifying test files.
62
+ */
63
+ const TEST_FILE_PATTERNS = [
64
+ /\.test\.[^.]+$/i,
65
+ /\.spec\.[^.]+$/i,
66
+ /[/\\]__tests__[/\\]/i,
67
+ /[/\\]test[/\\]/i,
68
+ /[/\\]tests[/\\]/i,
69
+ /_test\.[^.]+$/i,
70
+ /Test\.[^.]+$/i,
71
+ ];
72
+ /**
73
+ * Patterns for entry-point file detection.
74
+ */
75
+ const ENTRY_POINT_PATTERNS = [
76
+ { pattern: /[/\\]index\.[^/\\]+$/i, type: 'index' },
77
+ { pattern: /[/\\]main\.[^/\\]+$/i, type: 'main' },
78
+ { pattern: /[/\\]app\.[^/\\]+$/i, type: 'app' },
79
+ { pattern: /[/\\]server\.[^/\\]+$/i, type: 'server' },
80
+ { pattern: /[/\\]cli\.[^/\\]+$/i, type: 'cli' },
81
+ { pattern: /[/\\]bin[/\\][^/\\]+$/i, type: 'cli' },
82
+ ];
83
+ // ============================================================
84
+ // ArchitectureAnalyzer Class
85
+ // ============================================================
86
+ /**
87
+ * Analyzes the architectural structure of a codebase by combining
88
+ * knowledge graph queries with file system inspection.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * const analyzer = new ArchitectureAnalyzer(graph, '/path/to/project');
93
+ * const report = analyzer.analyze();
94
+ * console.log(report.languages);
95
+ * console.log(report.hotspots);
96
+ * ```
97
+ */
98
+ export class ArchitectureAnalyzer {
99
+ graph;
100
+ /**
101
+ * Create a new ArchitectureAnalyzer.
102
+ *
103
+ * @param graph - A KnowledgeGraph instance to query
104
+ */
105
+ constructor(graph) {
106
+ this.graph = graph;
107
+ }
108
+ /**
109
+ * Run a full architecture analysis and return the report.
110
+ *
111
+ * @param projectRoot - Absolute path to the project root directory
112
+ */
113
+ analyze(projectRoot) {
114
+ const stats = this.graph.getStats();
115
+ const indexedFiles = this.graph.getIndexedFiles();
116
+ return {
117
+ analyzedAt: Date.now(),
118
+ projectRoot,
119
+ languages: this.analyzeLanguages(stats),
120
+ packages: this.detectPackages(projectRoot),
121
+ entryPoints: this.detectEntryPoints(indexedFiles),
122
+ routes: this.detectRoutes(),
123
+ hotspots: this.findHotspots(),
124
+ layers: this.detectLayers(indexedFiles),
125
+ testCoverage: this.analyzeTestCoverage(indexedFiles, stats),
126
+ dependencies: this.parseDependencies(projectRoot),
127
+ complexity: this.analyzeComplexity(stats, indexedFiles),
128
+ codePatterns: this.analyzeCodePatterns(stats),
129
+ graphStats: {
130
+ totalNodes: stats.totalNodes,
131
+ totalEdges: stats.totalEdges,
132
+ totalFiles: stats.totalFiles,
133
+ },
134
+ };
135
+ }
136
+ // ============================================================
137
+ // Analysis Methods
138
+ // ============================================================
139
+ /**
140
+ * Analyze language distribution from the graph stats.
141
+ */
142
+ analyzeLanguages(stats) {
143
+ const total = Object.values(stats.languageBreakdown).reduce((a, b) => a + b, 0);
144
+ if (total === 0)
145
+ return [];
146
+ return Object.entries(stats.languageBreakdown)
147
+ .map(([language, fileCount]) => ({
148
+ language,
149
+ fileCount,
150
+ percentage: Math.round((fileCount / total) * 10000) / 100,
151
+ }))
152
+ .sort((a, b) => b.fileCount - a.fileCount);
153
+ }
154
+ /**
155
+ * Detect package manifests in the project root.
156
+ */
157
+ detectPackages(projectRoot) {
158
+ const packages = [];
159
+ for (const manifest of MANIFEST_FILES) {
160
+ // Handle glob-like patterns (*.csproj)
161
+ if (manifest.filename.includes('*')) {
162
+ try {
163
+ const ext = manifest.filename.replace('*', '');
164
+ const entries = fs.readdirSync(projectRoot, { withFileTypes: true });
165
+ for (const entry of entries) {
166
+ if (entry.isFile() && entry.name.endsWith(ext)) {
167
+ packages.push({
168
+ type: manifest.ecosystem,
169
+ name: entry.name.replace(ext, ''),
170
+ version: null,
171
+ manifestPath: path.join(projectRoot, entry.name),
172
+ });
173
+ }
174
+ }
175
+ }
176
+ catch {
177
+ // Directory not readable
178
+ }
179
+ continue;
180
+ }
181
+ const manifestPath = path.join(projectRoot, manifest.filename);
182
+ if (!this.fileExists(manifestPath))
183
+ continue;
184
+ try {
185
+ if (manifest.filename === 'package.json') {
186
+ const content = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
187
+ packages.push({
188
+ type: 'npm',
189
+ name: content.name ?? path.basename(projectRoot),
190
+ version: content.version ?? null,
191
+ manifestPath,
192
+ });
193
+ }
194
+ else if (manifest.filename === 'go.mod') {
195
+ const content = fs.readFileSync(manifestPath, 'utf-8');
196
+ const moduleMatch = content.match(/^module\s+(.+)$/m);
197
+ packages.push({
198
+ type: 'go',
199
+ name: moduleMatch?.[1]?.trim() ?? path.basename(projectRoot),
200
+ version: null,
201
+ manifestPath,
202
+ });
203
+ }
204
+ else if (manifest.filename === 'Cargo.toml') {
205
+ const content = fs.readFileSync(manifestPath, 'utf-8');
206
+ const nameMatch = content.match(/name\s*=\s*"([^"]+)"/);
207
+ const versionMatch = content.match(/version\s*=\s*"([^"]+)"/);
208
+ packages.push({
209
+ type: 'rust',
210
+ name: nameMatch?.[1] ?? path.basename(projectRoot),
211
+ version: versionMatch?.[1] ?? null,
212
+ manifestPath,
213
+ });
214
+ }
215
+ else if (manifest.filename === 'pyproject.toml') {
216
+ const content = fs.readFileSync(manifestPath, 'utf-8');
217
+ const nameMatch = content.match(/name\s*=\s*"([^"]+)"/);
218
+ const versionMatch = content.match(/version\s*=\s*"([^"]+)"/);
219
+ packages.push({
220
+ type: 'pip',
221
+ name: nameMatch?.[1] ?? path.basename(projectRoot),
222
+ version: versionMatch?.[1] ?? null,
223
+ manifestPath,
224
+ });
225
+ }
226
+ else {
227
+ // Generic manifest — just record its existence
228
+ packages.push({
229
+ type: manifest.ecosystem,
230
+ name: path.basename(projectRoot),
231
+ version: null,
232
+ manifestPath,
233
+ });
234
+ }
235
+ }
236
+ catch {
237
+ // Failed to parse manifest — record it anyway
238
+ packages.push({
239
+ type: manifest.ecosystem,
240
+ name: path.basename(projectRoot),
241
+ version: null,
242
+ manifestPath,
243
+ });
244
+ }
245
+ }
246
+ return packages;
247
+ }
248
+ /**
249
+ * Detect entry point files among the indexed files.
250
+ */
251
+ detectEntryPoints(indexedFiles) {
252
+ const entryPoints = [];
253
+ const seen = new Set();
254
+ for (const filePath of indexedFiles) {
255
+ for (const ep of ENTRY_POINT_PATTERNS) {
256
+ if (ep.pattern.test(filePath) && !seen.has(filePath)) {
257
+ seen.add(filePath);
258
+ entryPoints.push({
259
+ filePath,
260
+ name: path.basename(filePath),
261
+ type: ep.type,
262
+ });
263
+ }
264
+ }
265
+ }
266
+ return entryPoints;
267
+ }
268
+ /**
269
+ * Detect HTTP route handlers by looking for 'route' type nodes in the graph.
270
+ */
271
+ detectRoutes() {
272
+ const routeNodes = this.graph.getNodesByType('route');
273
+ const routes = [];
274
+ for (const node of routeNodes) {
275
+ const routeInfo = this.parseRouteSignature(node.name, node.signature);
276
+ routes.push({
277
+ method: routeInfo.method,
278
+ path: routeInfo.path,
279
+ handler: node.qualifiedName,
280
+ filePath: node.filePath,
281
+ });
282
+ }
283
+ // Also scan for route-like patterns in function signatures
284
+ const functions = this.graph.getNodesByType('function');
285
+ for (const fn of functions) {
286
+ if (this.isRouteHandler(fn.signature, fn.name)) {
287
+ const routeInfo = this.parseRouteSignature(fn.name, fn.signature);
288
+ routes.push({
289
+ method: routeInfo.method,
290
+ path: routeInfo.path,
291
+ handler: fn.qualifiedName,
292
+ filePath: fn.filePath,
293
+ });
294
+ }
295
+ }
296
+ return routes;
297
+ }
298
+ /**
299
+ * Parse a route handler's name/signature to extract method and path.
300
+ */
301
+ parseRouteSignature(name, signature) {
302
+ // Express-style: app.get('/path', handler) or router.post('/path', ...)
303
+ const expressMatch = signature.match(/\.(get|post|put|delete|patch|options|head|all)\s*\(\s*['"]([^'"]+)['"]/i);
304
+ if (expressMatch) {
305
+ return { method: expressMatch[1].toUpperCase(), path: expressMatch[2] };
306
+ }
307
+ // Decorator-style: @Get('/path') or @Route('GET', '/path')
308
+ const decoratorMatch = signature.match(/@(Get|Post|Put|Delete|Patch|Options|Head)\s*\(\s*['"]([^'"]*)['"]/i);
309
+ if (decoratorMatch) {
310
+ return { method: decoratorMatch[1].toUpperCase(), path: decoratorMatch[2] || '/' };
311
+ }
312
+ // Flask-style: @app.route('/path', methods=['GET'])
313
+ const flaskMatch = signature.match(/route\s*\(\s*['"]([^'"]+)['"]/i);
314
+ if (flaskMatch) {
315
+ return { method: 'GET', path: flaskMatch[1] };
316
+ }
317
+ // Fallback: use the name and guess
318
+ const httpMethods = ['get', 'post', 'put', 'delete', 'patch'];
319
+ for (const method of httpMethods) {
320
+ if (name.toLowerCase().startsWith(method)) {
321
+ return { method: method.toUpperCase(), path: `/${name}` };
322
+ }
323
+ }
324
+ return { method: 'UNKNOWN', path: name };
325
+ }
326
+ /**
327
+ * Heuristic: does this function signature look like a route handler?
328
+ */
329
+ isRouteHandler(signature, name) {
330
+ const patterns = [
331
+ /\.(get|post|put|delete|patch)\s*\(/i,
332
+ /@(Get|Post|Put|Delete|Patch|Route)\s*\(/i,
333
+ /route\s*\(\s*['"]/i,
334
+ /\b(req|request)\s*,\s*(res|response)\b/i,
335
+ ];
336
+ return patterns.some(p => p.test(signature) || p.test(name));
337
+ }
338
+ /**
339
+ * Find the top 10 most-connected nodes (highest total degree).
340
+ */
341
+ findHotspots(limit = 10) {
342
+ const allEdges = this.graph.getAllEdges();
343
+ // Count in-degree and out-degree for each node
344
+ const inDegree = new Map();
345
+ const outDegree = new Map();
346
+ for (const edge of allEdges) {
347
+ outDegree.set(edge.sourceId, (outDegree.get(edge.sourceId) ?? 0) + 1);
348
+ inDegree.set(edge.targetId, (inDegree.get(edge.targetId) ?? 0) + 1);
349
+ }
350
+ // Combine all node IDs
351
+ const allIds = new Set(Array.from(inDegree.keys()).concat(Array.from(outDegree.keys())));
352
+ // Build degree entries
353
+ const entries = [];
354
+ allIds.forEach(id => {
355
+ const inDeg = inDegree.get(id) ?? 0;
356
+ const outDeg = outDegree.get(id) ?? 0;
357
+ entries.push({ id, inDeg, outDeg, total: inDeg + outDeg });
358
+ });
359
+ // Sort by total degree descending, take top N
360
+ entries.sort((a, b) => b.total - a.total);
361
+ const topEntries = entries.slice(0, limit);
362
+ // Fetch node details
363
+ const nodeIds = topEntries.map(e => e.id);
364
+ const nodes = this.graph.getNodesByIds(nodeIds);
365
+ const nodeMap = new Map(nodes.map(n => [n.id, n]));
366
+ const hotspots = [];
367
+ for (const entry of topEntries) {
368
+ const node = nodeMap.get(entry.id);
369
+ if (!node)
370
+ continue;
371
+ hotspots.push({
372
+ nodeId: entry.id,
373
+ name: node.name,
374
+ qualifiedName: node.qualifiedName,
375
+ filePath: node.filePath,
376
+ nodeType: node.type,
377
+ inDegree: entry.inDeg,
378
+ outDegree: entry.outDeg,
379
+ totalDegree: entry.total,
380
+ });
381
+ }
382
+ return hotspots;
383
+ }
384
+ /**
385
+ * Detect architectural layers by matching file paths to known patterns.
386
+ */
387
+ detectLayers(indexedFiles) {
388
+ const layers = [];
389
+ for (const layerDef of LAYER_PATTERNS) {
390
+ const matchingFiles = indexedFiles.filter(fp => layerDef.patterns.some(p => p.test(fp)));
391
+ if (matchingFiles.length === 0)
392
+ continue;
393
+ // Count nodes in matching files
394
+ let nodeCount = 0;
395
+ for (const fp of matchingFiles) {
396
+ const nodes = this.graph.getFileStructure(fp);
397
+ nodeCount += nodes.filter(n => n.type !== 'file').length;
398
+ }
399
+ layers.push({
400
+ name: layerDef.name,
401
+ pattern: layerDef.patterns.map(p => p.source).join(' | '),
402
+ fileCount: matchingFiles.length,
403
+ nodeCount,
404
+ filePaths: matchingFiles.slice(0, 20), // Cap to prevent huge lists
405
+ });
406
+ }
407
+ return layers.sort((a, b) => b.fileCount - a.fileCount);
408
+ }
409
+ /**
410
+ * Analyze test coverage by comparing test files to source files.
411
+ */
412
+ analyzeTestCoverage(indexedFiles, stats) {
413
+ const testFiles = indexedFiles.filter(fp => TEST_FILE_PATTERNS.some(p => p.test(fp)));
414
+ const sourceFiles = indexedFiles.filter(fp => !TEST_FILE_PATTERNS.some(p => p.test(fp)));
415
+ const testNodeCount = (stats.nodesByType['test'] ?? 0);
416
+ return {
417
+ testFiles: testFiles.length,
418
+ sourceFiles: sourceFiles.length,
419
+ testRatio: sourceFiles.length > 0
420
+ ? Math.round((testFiles.length / sourceFiles.length) * 100) / 100
421
+ : 0,
422
+ testNodeCount,
423
+ };
424
+ }
425
+ /**
426
+ * Parse external dependencies from package manifests.
427
+ */
428
+ parseDependencies(projectRoot) {
429
+ const deps = [];
430
+ // Try npm (package.json)
431
+ const packageJsonPath = path.join(projectRoot, 'package.json');
432
+ if (this.fileExists(packageJsonPath)) {
433
+ try {
434
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
435
+ this.extractNpmDeps(pkg.dependencies, 'production', deps);
436
+ this.extractNpmDeps(pkg.devDependencies, 'dev', deps);
437
+ this.extractNpmDeps(pkg.peerDependencies, 'peer', deps);
438
+ this.extractNpmDeps(pkg.optionalDependencies, 'optional', deps);
439
+ }
440
+ catch {
441
+ // Malformed package.json
442
+ }
443
+ }
444
+ // Try pip (requirements.txt)
445
+ const requirementsPath = path.join(projectRoot, 'requirements.txt');
446
+ if (this.fileExists(requirementsPath)) {
447
+ try {
448
+ const content = fs.readFileSync(requirementsPath, 'utf-8');
449
+ for (const line of content.split('\n')) {
450
+ const trimmed = line.trim();
451
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('-'))
452
+ continue;
453
+ const match = trimmed.match(/^([a-zA-Z0-9_-]+)\s*([><=!~]+\s*[\d.]+)?/);
454
+ if (match) {
455
+ deps.push({
456
+ name: match[1],
457
+ version: match[2]?.trim() ?? '*',
458
+ type: 'production',
459
+ ecosystem: 'pip',
460
+ });
461
+ }
462
+ }
463
+ }
464
+ catch {
465
+ // Malformed requirements.txt
466
+ }
467
+ }
468
+ return deps;
469
+ }
470
+ /**
471
+ * Extract npm dependencies from a dependency map.
472
+ */
473
+ extractNpmDeps(depMap, type, deps) {
474
+ if (!depMap)
475
+ return;
476
+ for (const [name, version] of Object.entries(depMap)) {
477
+ deps.push({ name, version, type, ecosystem: 'npm' });
478
+ }
479
+ }
480
+ /**
481
+ * Analyze complexity metrics from the knowledge graph.
482
+ */
483
+ analyzeComplexity(stats, indexedFiles) {
484
+ const totalFunctions = (stats.nodesByType['function'] ?? 0) + (stats.nodesByType['method'] ?? 0);
485
+ const totalClasses = stats.nodesByType['class'] ?? 0;
486
+ const totalInterfaces = stats.nodesByType['interface'] ?? 0;
487
+ const totalFiles = stats.totalFiles;
488
+ const averageFunctionsPerFile = totalFiles > 0
489
+ ? Math.round((totalFunctions / totalFiles) * 100) / 100
490
+ : 0;
491
+ // Find max functions in a single file
492
+ let maxFunctionsInFile = null;
493
+ for (const fp of indexedFiles) {
494
+ const nodes = this.graph.getFileStructure(fp);
495
+ const fnCount = nodes.filter(n => n.type === 'function' || n.type === 'method').length;
496
+ if (fnCount > 0 && (!maxFunctionsInFile || fnCount > maxFunctionsInFile.count)) {
497
+ maxFunctionsInFile = { filePath: fp, count: fnCount };
498
+ }
499
+ }
500
+ // Compute average parameters per function using all function/method nodes
501
+ const allFunctions = [
502
+ ...this.graph.getNodesByType('function'),
503
+ ...this.graph.getNodesByType('method'),
504
+ ];
505
+ let totalParams = 0;
506
+ let maxParams = null;
507
+ for (const fn of allFunctions) {
508
+ const paramCount = fn.parameters?.length ?? 0;
509
+ totalParams += paramCount;
510
+ if (!maxParams || paramCount > maxParams.count) {
511
+ maxParams = { name: fn.qualifiedName, filePath: fn.filePath, count: paramCount };
512
+ }
513
+ }
514
+ const averageParametersPerFunction = allFunctions.length > 0
515
+ ? Math.round((totalParams / allFunctions.length) * 100) / 100
516
+ : 0;
517
+ return {
518
+ averageFunctionsPerFile,
519
+ averageParametersPerFunction,
520
+ maxFunctionsInFile,
521
+ maxParametersInFunction: maxParams,
522
+ totalFunctions,
523
+ totalClasses,
524
+ totalInterfaces,
525
+ };
526
+ }
527
+ /**
528
+ * Analyze code patterns: class-heavy vs function-heavy, async prevalence, etc.
529
+ */
530
+ analyzeCodePatterns(stats) {
531
+ const totalFunctions = (stats.nodesByType['function'] ?? 0);
532
+ const totalMethods = (stats.nodesByType['method'] ?? 0);
533
+ const totalClasses = (stats.nodesByType['class'] ?? 0);
534
+ const totalCallable = totalFunctions + totalMethods;
535
+ const classHeavy = totalClasses > 0 && totalMethods > totalFunctions;
536
+ const functionHeavy = totalFunctions > totalMethods;
537
+ // Async prevalence: count async functions/methods
538
+ const allCallable = [
539
+ ...this.graph.getNodesByType('function'),
540
+ ...this.graph.getNodesByType('method'),
541
+ ];
542
+ let asyncCount = 0;
543
+ let staticCount = 0;
544
+ let exportedCount = 0;
545
+ const visibilityCounts = {};
546
+ for (const node of allCallable) {
547
+ if (node.isAsync)
548
+ asyncCount++;
549
+ if (node.isStatic)
550
+ staticCount++;
551
+ if (node.isExported)
552
+ exportedCount++;
553
+ visibilityCounts[node.visibility] = (visibilityCounts[node.visibility] ?? 0) + 1;
554
+ }
555
+ return {
556
+ classHeavy,
557
+ functionHeavy,
558
+ asyncPrevalence: totalCallable > 0
559
+ ? Math.round((asyncCount / totalCallable) * 100) / 100
560
+ : 0,
561
+ staticMethodRatio: totalCallable > 0
562
+ ? Math.round((staticCount / totalCallable) * 100) / 100
563
+ : 0,
564
+ exportedRatio: totalCallable > 0
565
+ ? Math.round((exportedCount / totalCallable) * 100) / 100
566
+ : 0,
567
+ averageVisibility: visibilityCounts,
568
+ };
569
+ }
570
+ // ============================================================
571
+ // Helpers
572
+ // ============================================================
573
+ /**
574
+ * Check if a file exists (sync, swallows errors).
575
+ */
576
+ fileExists(filePath) {
577
+ try {
578
+ return fs.statSync(filePath).isFile();
579
+ }
580
+ catch {
581
+ return false;
582
+ }
583
+ }
584
+ }
585
+ //# sourceMappingURL=architecture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../src/knowledge-graph/architecture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AA6HlC,+DAA+D;AAC/D,4BAA4B;AAC5B,+DAA+D;AAE/D;;;GAGG;AACH,MAAM,cAAc,GAA2C;IAC7D,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,yBAAyB,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,EAAE;IACxG,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,EAAE;IACjF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,EAAE;IAClG,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,yBAAyB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAE;IACzH,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,EAAE;IACrF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,EAAE;IAC1E,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,EAAE;IACrI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,CAAC,EAAE;IACtG,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,wBAAwB,EAAE,qBAAqB,CAAC,EAAE;IACnF,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,uBAAuB,CAAC,EAAE;IACvH,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,mBAAmB,CAAC,EAAE;IAClD,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,EAAE;IAClI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,oBAAoB,CAAC,EAAE;IACjG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,iBAAiB,CAAC,EAAE;IAC7F,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,CAAC,EAAE;IACjF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,EAAE;CAC/F,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAA8C;IAChE,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE;IAC9C,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE;IAClD,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE;IAChD,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE;IAC1C,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE;IACzC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;IACvC,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE;IAC7C,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;IAC1C,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE;IAC3C,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE;IACjD,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,QAAQ,EAAE;IACrD,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE;IAC/C,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE;IAC/C,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;IAC5C,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE;IACjD,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;IAC7C,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;CAC3C,CAAC;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAG;IACzB,iBAAiB;IACjB,iBAAiB;IACjB,sBAAsB;IACtB,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,oBAAoB,GAAwD;IAChF,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE;IACnD,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,EAAE;IACjD,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,KAAK,EAAE;IAC/C,EAAE,OAAO,EAAE,wBAAwB,EAAE,IAAI,EAAE,QAAQ,EAAE;IACrD,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,KAAK,EAAE;IAC/C,EAAE,OAAO,EAAE,wBAAwB,EAAE,IAAI,EAAE,KAAK,EAAE;CACnD,CAAC;AAEF,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAE/D;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,oBAAoB;IACvB,KAAK,CAAiB;IAE9B;;;;OAIG;IACH,YAAY,KAAqB;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,WAAmB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAElD,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YACvC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YAC1C,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;YACjD,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE;YAC3B,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;YAC7B,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YACvC,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC;YACjD,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC;YACvD,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAC7C,UAAU,EAAE;gBACV,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B;SACF,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAE/D;;OAEG;IACK,gBAAgB,CACtB,KAA6C;QAE7C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAChF,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE3B,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;aAC3C,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,QAAQ;YACR,SAAS;YACT,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG;SAC1D,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,WAAmB;QACxC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QAEnC,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACtC,uCAAuC;YACvC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;wBAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC/C,QAAQ,CAAC,IAAI,CAAC;gCACZ,IAAI,EAAE,QAAQ,CAAC,SAAS;gCACxB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;gCACjC,OAAO,EAAE,IAAI;gCACb,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC;6BACjD,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,yBAAyB;gBAC3B,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;gBAAE,SAAS;YAE7C,IAAI,CAAC;gBACH,IAAI,QAAQ,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;oBACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;oBACnE,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,KAAK;wBACX,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;wBAChD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;wBAChC,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;oBACvD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBACtD,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;wBAC5D,OAAO,EAAE,IAAI;wBACb,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;oBAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;oBACvD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;oBACxD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAC9D,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;wBAClD,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;wBAClC,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;oBAClD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;oBACvD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;oBACxD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAC9D,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,KAAK;wBACX,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;wBAClD,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;wBAClC,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,+CAA+C;oBAC/C,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,QAAQ,CAAC,SAAS;wBACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;wBAChC,OAAO,EAAE,IAAI;wBACb,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;gBAC9C,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,QAAQ,CAAC,SAAS;oBACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAChC,OAAO,EAAE,IAAI;oBACb,YAAY;iBACb,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,YAAsB;QAC9C,MAAM,WAAW,GAAqB,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;YACpC,KAAK,MAAM,EAAE,IAAI,oBAAoB,EAAE,CAAC;gBACtC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACnB,WAAW,CAAC,IAAI,CAAC;wBACf,QAAQ;wBACR,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBAC7B,IAAI,EAAE,EAAE,CAAC,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,OAAO,EAAE,IAAI,CAAC,aAAa;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;QACL,CAAC;QAED,2DAA2D;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACxD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;gBAClE,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,OAAO,EAAE,EAAE,CAAC,aAAa;oBACzB,QAAQ,EAAE,EAAE,CAAC,QAAQ;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,mBAAmB,CACzB,IAAY,EACZ,SAAiB;QAEjB,wEAAwE;QACxE,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAClC,yEAAyE,CAC1E,CAAC;QACF,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,CAAC;QAED,2DAA2D;QAC3D,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CACpC,oEAAoE,CACrE,CAAC;QACF,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;QACrF,CAAC;QAED,oDAAoD;QACpD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAChC,gCAAgC,CACjC,CAAC;QACF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC;QAED,mCAAmC;QACnC,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9D,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,SAAiB,EAAE,IAAY;QACpD,MAAM,QAAQ,GAAG;YACf,qCAAqC;YACrC,0CAA0C;YAC1C,oBAAoB;YACpB,yCAAyC;SAC1C,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,QAAgB,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAE1C,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE5C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CACjE,CAAC;QAEF,uBAAuB;QACvB,MAAM,OAAO,GAAmE,EAAE,CAAC;QACnF,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YAClB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,8CAA8C;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAE3C,qBAAqB;QACrB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,KAAK,CAAC,EAAE;gBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,QAAQ,EAAE,KAAK,CAAC,KAAK;gBACrB,SAAS,EAAE,KAAK,CAAC,MAAM;gBACvB,WAAW,EAAE,KAAK,CAAC,KAAK;aACzB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,YAAsB;QACzC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAC7C,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CACxC,CAAC;YAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEzC,gCAAgC;YAChC,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC9C,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;YAC3D,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBACzD,SAAS,EAAE,aAAa,CAAC,MAAM;gBAC/B,SAAS;gBACT,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,4BAA4B;aACpE,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACK,mBAAmB,CACzB,YAAsB,EACtB,KAA6C;QAE7C,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CACzC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CACzC,CAAC;QACF,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAC3C,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC1C,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAEvD,OAAO;YACL,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,WAAW,EAAE,WAAW,CAAC,MAAM;YAC/B,SAAS,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;gBAC/B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;gBACjE,CAAC,CAAC,CAAC;YACL,aAAa;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,WAAmB;QAC3C,MAAM,IAAI,GAAqB,EAAE,CAAC;QAElC,yBAAyB;QACzB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;gBAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBACtD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBACxD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,oBAAoB,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAC3D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;oBACxE,IAAI,KAAK,EAAE,CAAC;wBACV,IAAI,CAAC,IAAI,CAAC;4BACR,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;4BACd,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG;4BAChC,IAAI,EAAE,YAAY;4BAClB,SAAS,EAAE,KAAK;yBACjB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,cAAc,CACpB,MAA0C,EAC1C,IAA4B,EAC5B,IAAsB;QAEtB,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,KAA6C,EAC7C,YAAsB;QAEtB,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACjG,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QAEpC,MAAM,uBAAuB,GAAG,UAAU,GAAG,CAAC;YAC5C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACvD,CAAC,CAAC,CAAC,CAAC;QAEN,sCAAsC;QACtC,IAAI,kBAAkB,GAA+C,IAAI,CAAC;QAC1E,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;YACvF,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,kBAAkB,IAAI,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/E,kBAAkB,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YACxD,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,MAAM,YAAY,GAAG;YACnB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC;YACxC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;SACvC,CAAC;QAEF,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAA6D,IAAI,CAAC;QAE/E,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC;YAC9C,WAAW,IAAI,UAAU,CAAC;YAC1B,IAAI,CAAC,SAAS,IAAI,UAAU,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;gBAC/C,SAAS,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YACnF,CAAC;QACH,CAAC;QAED,MAAM,4BAA4B,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;YAC1D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAC7D,CAAC,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,uBAAuB;YACvB,4BAA4B;YAC5B,kBAAkB;YAClB,uBAAuB,EAAE,SAAS;YAClC,cAAc;YACd,YAAY;YACZ,eAAe;SAChB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,mBAAmB,CACzB,KAA6C;QAE7C,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;QAEpD,MAAM,UAAU,GAAG,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,cAAc,CAAC;QACrE,MAAM,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;QAEpD,kDAAkD;QAClD,MAAM,WAAW,GAAG;YAClB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC;YACxC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;SACvC,CAAC;QAEF,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,gBAAgB,GAA2B,EAAE,CAAC;QAEpD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,OAAO;gBAAE,UAAU,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ;gBAAE,WAAW,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,UAAU;gBAAE,aAAa,EAAE,CAAC;YACrC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnF,CAAC;QAED,OAAO;YACL,UAAU;YACV,aAAa;YACb,eAAe,EAAE,aAAa,GAAG,CAAC;gBAChC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;gBACtD,CAAC,CAAC,CAAC;YACL,iBAAiB,EAAE,aAAa,GAAG,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;gBACvD,CAAC,CAAC,CAAC;YACL,aAAa,EAAE,aAAa,GAAG,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;gBACzD,CAAC,CAAC,CAAC;YACL,iBAAiB,EAAE,gBAAgB;SACpC,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,UAAU;IACV,+DAA+D;IAE/D;;OAEG;IACK,UAAU,CAAC,QAAgB;QACjC,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}