specweave 0.28.68 → 0.29.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 (234) hide show
  1. package/CLAUDE.md +3 -2
  2. package/README.md +19 -2
  3. package/dist/src/cli/commands/discrepancies.d.ts +89 -0
  4. package/dist/src/cli/commands/discrepancies.d.ts.map +1 -0
  5. package/dist/src/cli/commands/discrepancies.js +385 -0
  6. package/dist/src/cli/commands/discrepancies.js.map +1 -0
  7. package/dist/src/cli/commands/notifications.d.ts +70 -0
  8. package/dist/src/cli/commands/notifications.d.ts.map +1 -0
  9. package/dist/src/cli/commands/notifications.js +236 -0
  10. package/dist/src/cli/commands/notifications.js.map +1 -0
  11. package/dist/src/cli/commands/sync-logs.d.ts +54 -0
  12. package/dist/src/cli/commands/sync-logs.d.ts.map +1 -0
  13. package/dist/src/cli/commands/sync-logs.js +240 -0
  14. package/dist/src/cli/commands/sync-logs.js.map +1 -0
  15. package/dist/src/cli/commands/sync-monitor.d.ts +42 -0
  16. package/dist/src/cli/commands/sync-monitor.d.ts.map +1 -0
  17. package/dist/src/cli/commands/sync-monitor.js +191 -0
  18. package/dist/src/cli/commands/sync-monitor.js.map +1 -0
  19. package/dist/src/cli/helpers/init/brownfield-analysis.d.ts +45 -0
  20. package/dist/src/cli/helpers/init/brownfield-analysis.d.ts.map +1 -0
  21. package/dist/src/cli/helpers/init/brownfield-analysis.js +431 -0
  22. package/dist/src/cli/helpers/init/brownfield-analysis.js.map +1 -0
  23. package/dist/src/cli/helpers/init/index.d.ts +1 -0
  24. package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
  25. package/dist/src/cli/helpers/init/index.js +2 -0
  26. package/dist/src/cli/helpers/init/index.js.map +1 -1
  27. package/dist/src/cli/workers/brownfield-worker.d.ts +66 -0
  28. package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -0
  29. package/dist/src/cli/workers/brownfield-worker.js +417 -0
  30. package/dist/src/cli/workers/brownfield-worker.js.map +1 -0
  31. package/dist/src/core/background/brownfield-launcher.d.ts +86 -0
  32. package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -0
  33. package/dist/src/core/background/brownfield-launcher.js +295 -0
  34. package/dist/src/core/background/brownfield-launcher.js.map +1 -0
  35. package/dist/src/core/background/index.d.ts +2 -0
  36. package/dist/src/core/background/index.d.ts.map +1 -1
  37. package/dist/src/core/background/index.js +2 -0
  38. package/dist/src/core/background/index.js.map +1 -1
  39. package/dist/src/core/background/types.d.ts +23 -2
  40. package/dist/src/core/background/types.d.ts.map +1 -1
  41. package/dist/src/core/config/index.d.ts +1 -0
  42. package/dist/src/core/config/index.d.ts.map +1 -1
  43. package/dist/src/core/config/index.js +1 -0
  44. package/dist/src/core/config/index.js.map +1 -1
  45. package/dist/src/core/config/types.d.ts +6 -0
  46. package/dist/src/core/config/types.d.ts.map +1 -1
  47. package/dist/src/core/config/types.js.map +1 -1
  48. package/dist/src/core/dashboard/dashboard-data.d.ts +156 -0
  49. package/dist/src/core/dashboard/dashboard-data.d.ts.map +1 -0
  50. package/dist/src/core/dashboard/dashboard-data.js +191 -0
  51. package/dist/src/core/dashboard/dashboard-data.js.map +1 -0
  52. package/dist/src/core/dashboard/index.d.ts +9 -0
  53. package/dist/src/core/dashboard/index.d.ts.map +1 -0
  54. package/dist/src/core/dashboard/index.js +9 -0
  55. package/dist/src/core/dashboard/index.js.map +1 -0
  56. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts +77 -0
  57. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts.map +1 -0
  58. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js +286 -0
  59. package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js.map +1 -0
  60. package/dist/src/core/discrepancy/analyzers/index.d.ts +8 -0
  61. package/dist/src/core/discrepancy/analyzers/index.d.ts.map +1 -0
  62. package/dist/src/core/discrepancy/analyzers/index.js +8 -0
  63. package/dist/src/core/discrepancy/analyzers/index.js.map +1 -0
  64. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts +96 -0
  65. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts.map +1 -0
  66. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js +247 -0
  67. package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js.map +1 -0
  68. package/dist/src/core/discrepancy/brownfield-manager.d.ts +88 -0
  69. package/dist/src/core/discrepancy/brownfield-manager.d.ts.map +1 -0
  70. package/dist/src/core/discrepancy/brownfield-manager.js +520 -0
  71. package/dist/src/core/discrepancy/brownfield-manager.js.map +1 -0
  72. package/dist/src/core/discrepancy/brownfield-types.d.ts +174 -0
  73. package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -0
  74. package/dist/src/core/discrepancy/brownfield-types.js +11 -0
  75. package/dist/src/core/discrepancy/brownfield-types.js.map +1 -0
  76. package/dist/src/core/discrepancy/detector.d.ts +92 -0
  77. package/dist/src/core/discrepancy/detector.d.ts.map +1 -0
  78. package/dist/src/core/discrepancy/detector.js +346 -0
  79. package/dist/src/core/discrepancy/detector.js.map +1 -0
  80. package/dist/src/core/discrepancy/increment-generator.d.ts +51 -0
  81. package/dist/src/core/discrepancy/increment-generator.d.ts.map +1 -0
  82. package/dist/src/core/discrepancy/increment-generator.js +234 -0
  83. package/dist/src/core/discrepancy/increment-generator.js.map +1 -0
  84. package/dist/src/core/discrepancy/index.d.ts +18 -0
  85. package/dist/src/core/discrepancy/index.d.ts.map +1 -0
  86. package/dist/src/core/discrepancy/index.js +24 -0
  87. package/dist/src/core/discrepancy/index.js.map +1 -0
  88. package/dist/src/core/discrepancy/severity-classifier.d.ts +81 -0
  89. package/dist/src/core/discrepancy/severity-classifier.d.ts.map +1 -0
  90. package/dist/src/core/discrepancy/severity-classifier.js +289 -0
  91. package/dist/src/core/discrepancy/severity-classifier.js.map +1 -0
  92. package/dist/src/core/discrepancy/spec-parser.d.ts +74 -0
  93. package/dist/src/core/discrepancy/spec-parser.d.ts.map +1 -0
  94. package/dist/src/core/discrepancy/spec-parser.js +213 -0
  95. package/dist/src/core/discrepancy/spec-parser.js.map +1 -0
  96. package/dist/src/core/discrepancy/update-recommender.d.ts +77 -0
  97. package/dist/src/core/discrepancy/update-recommender.d.ts.map +1 -0
  98. package/dist/src/core/discrepancy/update-recommender.js +323 -0
  99. package/dist/src/core/discrepancy/update-recommender.js.map +1 -0
  100. package/dist/src/core/living-docs/living-docs-sync.d.ts +13 -16
  101. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  102. package/dist/src/core/living-docs/living-docs-sync.js +31 -112
  103. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  104. package/dist/src/core/logs/index.d.ts +10 -0
  105. package/dist/src/core/logs/index.d.ts.map +1 -0
  106. package/dist/src/core/logs/index.js +10 -0
  107. package/dist/src/core/logs/index.js.map +1 -0
  108. package/dist/src/core/logs/log-aggregator.d.ts +130 -0
  109. package/dist/src/core/logs/log-aggregator.d.ts.map +1 -0
  110. package/dist/src/core/logs/log-aggregator.js +206 -0
  111. package/dist/src/core/logs/log-aggregator.js.map +1 -0
  112. package/dist/src/core/logs/log-exporter.d.ts +81 -0
  113. package/dist/src/core/logs/log-exporter.d.ts.map +1 -0
  114. package/dist/src/core/logs/log-exporter.js +141 -0
  115. package/dist/src/core/logs/log-exporter.js.map +1 -0
  116. package/dist/src/core/notifications/command-integration.d.ts +82 -0
  117. package/dist/src/core/notifications/command-integration.d.ts.map +1 -0
  118. package/dist/src/core/notifications/command-integration.js +80 -0
  119. package/dist/src/core/notifications/command-integration.js.map +1 -0
  120. package/dist/src/core/notifications/index.d.ts +12 -0
  121. package/dist/src/core/notifications/index.d.ts.map +1 -0
  122. package/dist/src/core/notifications/index.js +12 -0
  123. package/dist/src/core/notifications/index.js.map +1 -0
  124. package/dist/src/core/notifications/notification-display.d.ts +70 -0
  125. package/dist/src/core/notifications/notification-display.d.ts.map +1 -0
  126. package/dist/src/core/notifications/notification-display.js +177 -0
  127. package/dist/src/core/notifications/notification-display.js.map +1 -0
  128. package/dist/src/core/notifications/notification-manager.d.ts +126 -0
  129. package/dist/src/core/notifications/notification-manager.d.ts.map +1 -0
  130. package/dist/src/core/notifications/notification-manager.js +287 -0
  131. package/dist/src/core/notifications/notification-manager.js.map +1 -0
  132. package/dist/src/core/notifications/notification-types.d.ts +159 -0
  133. package/dist/src/core/notifications/notification-types.d.ts.map +1 -0
  134. package/dist/src/core/notifications/notification-types.js +93 -0
  135. package/dist/src/core/notifications/notification-types.js.map +1 -0
  136. package/dist/src/core/scheduler/index.d.ts +11 -0
  137. package/dist/src/core/scheduler/index.d.ts.map +1 -0
  138. package/dist/src/core/scheduler/index.js +11 -0
  139. package/dist/src/core/scheduler/index.js.map +1 -0
  140. package/dist/src/core/scheduler/job-scheduler.d.ts +179 -0
  141. package/dist/src/core/scheduler/job-scheduler.d.ts.map +1 -0
  142. package/dist/src/core/scheduler/job-scheduler.js +282 -0
  143. package/dist/src/core/scheduler/job-scheduler.js.map +1 -0
  144. package/dist/src/core/scheduler/schedule-persistence.d.ts +83 -0
  145. package/dist/src/core/scheduler/schedule-persistence.d.ts.map +1 -0
  146. package/dist/src/core/scheduler/schedule-persistence.js +180 -0
  147. package/dist/src/core/scheduler/schedule-persistence.js.map +1 -0
  148. package/dist/src/core/scheduler/scheduled-job.d.ts +188 -0
  149. package/dist/src/core/scheduler/scheduled-job.d.ts.map +1 -0
  150. package/dist/src/core/scheduler/scheduled-job.js +182 -0
  151. package/dist/src/core/scheduler/scheduled-job.js.map +1 -0
  152. package/dist/src/core/sync/permission-enforcer.d.ts +206 -0
  153. package/dist/src/core/sync/permission-enforcer.d.ts.map +1 -0
  154. package/dist/src/core/sync/permission-enforcer.js +268 -0
  155. package/dist/src/core/sync/permission-enforcer.js.map +1 -0
  156. package/dist/src/core/sync/sync-audit-logger.d.ts +217 -0
  157. package/dist/src/core/sync/sync-audit-logger.d.ts.map +1 -0
  158. package/dist/src/core/sync/sync-audit-logger.js +327 -0
  159. package/dist/src/core/sync/sync-audit-logger.js.map +1 -0
  160. package/dist/src/core/sync/sync-interceptor.d.ts +190 -0
  161. package/dist/src/core/sync/sync-interceptor.d.ts.map +1 -0
  162. package/dist/src/core/sync/sync-interceptor.js +224 -0
  163. package/dist/src/core/sync/sync-interceptor.js.map +1 -0
  164. package/dist/src/core/types/increment-metadata.d.ts +5 -2
  165. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  166. package/dist/src/core/types/sync-config.d.ts +267 -0
  167. package/dist/src/core/types/sync-config.d.ts.map +1 -0
  168. package/dist/src/core/types/sync-config.js +304 -0
  169. package/dist/src/core/types/sync-config.js.map +1 -0
  170. package/dist/src/hooks/index.d.ts +11 -0
  171. package/dist/src/hooks/index.d.ts.map +1 -0
  172. package/dist/src/hooks/index.js +11 -0
  173. package/dist/src/hooks/index.js.map +1 -0
  174. package/dist/src/hooks/platform.d.ts +125 -0
  175. package/dist/src/hooks/platform.d.ts.map +1 -0
  176. package/dist/src/hooks/platform.js +325 -0
  177. package/dist/src/hooks/platform.js.map +1 -0
  178. package/dist/src/hooks/processor.d.ts +20 -0
  179. package/dist/src/hooks/processor.d.ts.map +1 -0
  180. package/dist/src/hooks/processor.js +317 -0
  181. package/dist/src/hooks/processor.js.map +1 -0
  182. package/dist/src/hooks/scheduler-startup.d.ts +19 -0
  183. package/dist/src/hooks/scheduler-startup.d.ts.map +1 -0
  184. package/dist/src/hooks/scheduler-startup.js +92 -0
  185. package/dist/src/hooks/scheduler-startup.js.map +1 -0
  186. package/dist/src/hooks/session-start.d.ts +16 -0
  187. package/dist/src/hooks/session-start.d.ts.map +1 -0
  188. package/dist/src/hooks/session-start.js +92 -0
  189. package/dist/src/hooks/session-start.js.map +1 -0
  190. package/dist/src/importers/duplicate-detector.d.ts +13 -2
  191. package/dist/src/importers/duplicate-detector.d.ts.map +1 -1
  192. package/dist/src/importers/duplicate-detector.js +21 -2
  193. package/dist/src/importers/duplicate-detector.js.map +1 -1
  194. package/dist/src/importers/item-converter.d.ts +41 -2
  195. package/dist/src/importers/item-converter.d.ts.map +1 -1
  196. package/dist/src/importers/item-converter.js +225 -38
  197. package/dist/src/importers/item-converter.js.map +1 -1
  198. package/dist/src/living-docs/fs-id-allocator.d.ts +7 -0
  199. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  200. package/dist/src/living-docs/fs-id-allocator.js +30 -4
  201. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  202. package/dist/src/sync/ado-sync-wrapper.d.ts +137 -0
  203. package/dist/src/sync/ado-sync-wrapper.d.ts.map +1 -0
  204. package/dist/src/sync/ado-sync-wrapper.js +148 -0
  205. package/dist/src/sync/ado-sync-wrapper.js.map +1 -0
  206. package/dist/src/sync/github-sync-wrapper.d.ts +195 -0
  207. package/dist/src/sync/github-sync-wrapper.d.ts.map +1 -0
  208. package/dist/src/sync/github-sync-wrapper.js +220 -0
  209. package/dist/src/sync/github-sync-wrapper.js.map +1 -0
  210. package/dist/src/sync/jira-sync-wrapper.d.ts +155 -0
  211. package/dist/src/sync/jira-sync-wrapper.d.ts.map +1 -0
  212. package/dist/src/sync/jira-sync-wrapper.js +175 -0
  213. package/dist/src/sync/jira-sync-wrapper.js.map +1 -0
  214. package/dist/src/utils/feature-id-derivation.d.ts +58 -0
  215. package/dist/src/utils/feature-id-derivation.d.ts.map +1 -0
  216. package/dist/src/utils/feature-id-derivation.js +77 -0
  217. package/dist/src/utils/feature-id-derivation.js.map +1 -0
  218. package/package.json +1 -1
  219. package/plugins/specweave/commands/specweave-discrepancies.md +141 -0
  220. package/plugins/specweave/commands/specweave-discrepancy-to-increment.md +160 -0
  221. package/plugins/specweave/commands/specweave-jobs.md +45 -2
  222. package/plugins/specweave/commands/specweave-notifications.md +92 -0
  223. package/plugins/specweave/commands/specweave-sync-logs.md +131 -0
  224. package/plugins/specweave/commands/specweave-sync-monitor.md +57 -0
  225. package/plugins/specweave/hooks/hooks.json +3 -3
  226. package/plugins/specweave/hooks/lib/scheduler-startup.sh +72 -0
  227. package/plugins/specweave/hooks/universal/dispatcher.mjs +246 -0
  228. package/plugins/specweave/hooks/universal/session-start.cmd +16 -0
  229. package/plugins/specweave/hooks/universal/session-start.ps1 +16 -0
  230. package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +14 -5
  231. package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +5 -2
  232. package/plugins/specweave/skills/discrepancy-viewer.md +154 -0
  233. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +34 -0
  234. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +51 -0
@@ -0,0 +1,520 @@
1
+ /**
2
+ * Brownfield Discrepancy Manager
3
+ *
4
+ * Manages persistent storage and lifecycle of brownfield discrepancies.
5
+ * Uses batched folder structure for scalability (supports 10,000+ discrepancies).
6
+ *
7
+ * @module core/discrepancy/brownfield-manager
8
+ */
9
+ import * as fs from 'node:fs';
10
+ import * as path from 'node:path';
11
+ import { consoleLogger } from '../../utils/logger.js';
12
+ /** Batch size for folder organization (100 discrepancies per folder) */
13
+ const BATCH_SIZE = 100;
14
+ /** Default index structure */
15
+ const DEFAULT_INDEX = {
16
+ version: '1.0.0',
17
+ stats: {
18
+ total: 0,
19
+ pending: 0,
20
+ inProgress: 0,
21
+ resolved: 0,
22
+ ignored: 0,
23
+ byType: {
24
+ 'missing-docs': 0,
25
+ 'stale-docs': 0,
26
+ 'code-doc-mismatch': 0,
27
+ 'knowledge-gap': 0,
28
+ 'orphan-doc': 0,
29
+ 'missing-adr': 0,
30
+ },
31
+ byPriority: {
32
+ critical: 0,
33
+ high: 0,
34
+ medium: 0,
35
+ low: 0,
36
+ },
37
+ },
38
+ lastUpdated: new Date().toISOString(),
39
+ };
40
+ /**
41
+ * Manages brownfield discrepancies with persistent storage.
42
+ */
43
+ export class BrownfieldDiscrepancyManager {
44
+ constructor(projectPath, options = {}) {
45
+ this.index = null;
46
+ this.projectPath = projectPath;
47
+ this.basePath = path.join(projectPath, '.specweave', 'discrepancies');
48
+ this.logger = options.logger ?? consoleLogger;
49
+ }
50
+ /**
51
+ * Initialize folder structure if needed.
52
+ */
53
+ async ensureFolderStructure() {
54
+ const folders = [
55
+ this.basePath,
56
+ path.join(this.basePath, 'pending'),
57
+ path.join(this.basePath, 'in-progress'),
58
+ path.join(this.basePath, 'resolved'),
59
+ ];
60
+ for (const folder of folders) {
61
+ if (!fs.existsSync(folder)) {
62
+ fs.mkdirSync(folder, { recursive: true });
63
+ this.logger.log(`Created discrepancy folder: ${folder}`);
64
+ }
65
+ }
66
+ // Initialize index if not exists
67
+ const indexPath = path.join(this.basePath, 'index.json');
68
+ if (!fs.existsSync(indexPath)) {
69
+ // Clear cache to ensure fresh index
70
+ this.index = null;
71
+ await this.saveIndex({ ...DEFAULT_INDEX, lastUpdated: new Date().toISOString() });
72
+ }
73
+ }
74
+ /**
75
+ * Create a new discrepancy with auto-generated ID.
76
+ */
77
+ async createDiscrepancy(data) {
78
+ await this.ensureFolderStructure();
79
+ const id = await this.getNextId();
80
+ const discrepancy = {
81
+ ...data,
82
+ id,
83
+ };
84
+ await this.saveDiscrepancy(discrepancy);
85
+ await this.updateIndex();
86
+ this.logger.log(`Created discrepancy: ${id}`);
87
+ return discrepancy;
88
+ }
89
+ /**
90
+ * Get a discrepancy by ID.
91
+ */
92
+ async getDiscrepancy(id) {
93
+ const filePath = await this.findDiscrepancyPath(id);
94
+ if (!filePath || !fs.existsSync(filePath)) {
95
+ return null;
96
+ }
97
+ try {
98
+ const content = fs.readFileSync(filePath, 'utf-8');
99
+ return JSON.parse(content);
100
+ }
101
+ catch (error) {
102
+ this.logger.error(`Failed to read discrepancy ${id}:`, error);
103
+ return null;
104
+ }
105
+ }
106
+ /**
107
+ * Update a discrepancy.
108
+ */
109
+ async updateDiscrepancy(id, updates) {
110
+ const discrepancy = await this.getDiscrepancy(id);
111
+ if (!discrepancy) {
112
+ this.logger.warn(`Discrepancy not found: ${id}`);
113
+ return null;
114
+ }
115
+ const oldStatus = discrepancy.status;
116
+ const updated = {
117
+ ...discrepancy,
118
+ ...updates,
119
+ lastChecked: new Date().toISOString(),
120
+ };
121
+ // Handle status change (move between folders)
122
+ if (updates.status && updates.status !== oldStatus) {
123
+ await this.moveDiscrepancy(updated, updates.status);
124
+ }
125
+ else {
126
+ await this.saveDiscrepancy(updated);
127
+ }
128
+ await this.updateIndex();
129
+ this.logger.log(`Updated discrepancy: ${id}`);
130
+ return updated;
131
+ }
132
+ /**
133
+ * Delete a discrepancy.
134
+ */
135
+ async deleteDiscrepancy(id) {
136
+ const filePath = await this.findDiscrepancyPath(id);
137
+ if (!filePath || !fs.existsSync(filePath)) {
138
+ return false;
139
+ }
140
+ try {
141
+ fs.unlinkSync(filePath);
142
+ await this.updateIndex();
143
+ this.logger.log(`Deleted discrepancy: ${id}`);
144
+ return true;
145
+ }
146
+ catch (error) {
147
+ this.logger.error(`Failed to delete discrepancy ${id}:`, error);
148
+ return false;
149
+ }
150
+ }
151
+ /**
152
+ * List discrepancies with optional filtering.
153
+ */
154
+ async listDiscrepancies(filter) {
155
+ await this.ensureFolderStructure();
156
+ const discrepancies = [];
157
+ // Determine which status folders to search
158
+ // Note: 'ignored' discrepancies are stored in 'pending' folder with status='ignored'
159
+ // So we only scan unique folders and filter by status at read time
160
+ const statuses = filter?.statuses
161
+ || (filter?.status ? [filter.status] : ['pending', 'in-progress', 'resolved']);
162
+ for (const status of statuses) {
163
+ const statusFolder = this.getStatusFolder(status);
164
+ if (!fs.existsSync(statusFolder))
165
+ continue;
166
+ // For resolved, we need to scan YYYY-MM subfolders
167
+ if (status === 'resolved') {
168
+ const monthFolders = fs.readdirSync(statusFolder, { withFileTypes: true })
169
+ .filter(d => d.isDirectory())
170
+ .map(d => path.join(statusFolder, d.name));
171
+ for (const monthFolder of monthFolders) {
172
+ const files = fs.readdirSync(monthFolder).filter(f => f.endsWith('.json'));
173
+ for (const file of files) {
174
+ const disc = this.readDiscrepancyFile(path.join(monthFolder, file));
175
+ if (disc && this.matchesFilter(disc, filter)) {
176
+ discrepancies.push(disc);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ else {
182
+ // Scan batch folders (0001-0100, 0101-0200, etc.)
183
+ const batchFolders = fs.readdirSync(statusFolder, { withFileTypes: true })
184
+ .filter(d => d.isDirectory())
185
+ .map(d => path.join(statusFolder, d.name));
186
+ for (const batchFolder of batchFolders) {
187
+ const files = fs.readdirSync(batchFolder).filter(f => f.endsWith('.json'));
188
+ for (const file of files) {
189
+ const disc = this.readDiscrepancyFile(path.join(batchFolder, file));
190
+ if (disc && this.matchesFilter(disc, filter)) {
191
+ discrepancies.push(disc);
192
+ }
193
+ }
194
+ }
195
+ }
196
+ }
197
+ // Sort by priority (critical first), then by detected date (newest first)
198
+ const priorityOrder = {
199
+ critical: 0,
200
+ high: 1,
201
+ medium: 2,
202
+ low: 3,
203
+ };
204
+ discrepancies.sort((a, b) => {
205
+ const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
206
+ if (priorityDiff !== 0)
207
+ return priorityDiff;
208
+ return new Date(b.detectedAt).getTime() - new Date(a.detectedAt).getTime();
209
+ });
210
+ // Apply pagination
211
+ const offset = filter?.offset ?? 0;
212
+ const limit = filter?.limit ?? discrepancies.length;
213
+ return discrepancies.slice(offset, offset + limit);
214
+ }
215
+ /**
216
+ * Get summary statistics.
217
+ */
218
+ async getStats() {
219
+ const index = await this.loadIndex();
220
+ return index.stats;
221
+ }
222
+ /**
223
+ * Link discrepancy to an increment.
224
+ * Returns true if successfully linked, false if discrepancy not found.
225
+ */
226
+ async linkToIncrement(discrepancyId, incrementId) {
227
+ const result = await this.updateDiscrepancy(discrepancyId, {
228
+ status: 'in-progress',
229
+ incrementId,
230
+ });
231
+ return result !== null;
232
+ }
233
+ /**
234
+ * Resolve a discrepancy.
235
+ */
236
+ async resolveDiscrepancy(id, resolution) {
237
+ await this.updateDiscrepancy(id, {
238
+ status: 'resolved',
239
+ resolution,
240
+ });
241
+ }
242
+ /**
243
+ * Ignore a discrepancy.
244
+ */
245
+ async ignoreDiscrepancy(id, reason) {
246
+ await this.updateDiscrepancy(id, {
247
+ status: 'ignored',
248
+ resolution: {
249
+ type: 'false-positive',
250
+ resolvedAt: new Date().toISOString(),
251
+ resolvedBy: 'user',
252
+ notes: reason,
253
+ },
254
+ });
255
+ }
256
+ /**
257
+ * Create multiple discrepancies in batch.
258
+ */
259
+ async createBatch(discrepancies) {
260
+ const created = [];
261
+ for (const data of discrepancies) {
262
+ const disc = await this.createDiscrepancy(data);
263
+ created.push(disc);
264
+ }
265
+ return created;
266
+ }
267
+ /**
268
+ * Archive resolved discrepancies to YYYY-MM folders.
269
+ */
270
+ async archiveResolved() {
271
+ const inProgressFolder = path.join(this.basePath, 'in-progress');
272
+ const resolvedFolder = path.join(this.basePath, 'resolved');
273
+ if (!fs.existsSync(resolvedFolder)) {
274
+ fs.mkdirSync(resolvedFolder, { recursive: true });
275
+ }
276
+ let archivedCount = 0;
277
+ // Find all resolved discrepancies in in-progress folder
278
+ if (fs.existsSync(inProgressFolder)) {
279
+ const files = this.getAllJsonFiles(inProgressFolder);
280
+ for (const file of files) {
281
+ const disc = this.readDiscrepancyFile(file);
282
+ if (disc && disc.status === 'resolved') {
283
+ // Move to resolved/YYYY-MM/
284
+ const resolvedDate = disc.resolution?.resolvedAt
285
+ ? new Date(disc.resolution.resolvedAt)
286
+ : new Date();
287
+ const monthFolder = path.join(resolvedFolder, `${resolvedDate.getFullYear()}-${String(resolvedDate.getMonth() + 1).padStart(2, '0')}`);
288
+ if (!fs.existsSync(monthFolder)) {
289
+ fs.mkdirSync(monthFolder, { recursive: true });
290
+ }
291
+ const destPath = path.join(monthFolder, `${disc.id}.json`);
292
+ fs.renameSync(file, destPath);
293
+ archivedCount++;
294
+ }
295
+ }
296
+ }
297
+ if (archivedCount > 0) {
298
+ await this.updateIndex();
299
+ this.logger.log(`Archived ${archivedCount} resolved discrepancies`);
300
+ }
301
+ return archivedCount;
302
+ }
303
+ /**
304
+ * Get the batch folder name for a numeric ID.
305
+ * Example: 1-100 → "0001-0100", 101-200 → "0101-0200"
306
+ */
307
+ getBatchFolder(numericId) {
308
+ const batchStart = Math.floor((numericId - 1) / BATCH_SIZE) * BATCH_SIZE + 1;
309
+ const batchEnd = batchStart + BATCH_SIZE - 1;
310
+ return `${String(batchStart).padStart(4, '0')}-${String(batchEnd).padStart(4, '0')}`;
311
+ }
312
+ // ─────────────────────────────────────────────────────────────
313
+ // Private methods
314
+ // ─────────────────────────────────────────────────────────────
315
+ async getNextId() {
316
+ const index = await this.loadIndex();
317
+ const nextNum = index.stats.total + 1;
318
+ return `DISC-${String(nextNum).padStart(4, '0')}`;
319
+ }
320
+ getStatusFolder(status) {
321
+ const folderMap = {
322
+ pending: 'pending',
323
+ 'in-progress': 'in-progress',
324
+ resolved: 'resolved',
325
+ ignored: 'pending', // Ignored stays in pending folder with status flag
326
+ };
327
+ return path.join(this.basePath, folderMap[status]);
328
+ }
329
+ async saveDiscrepancy(discrepancy) {
330
+ const numericId = parseInt(discrepancy.id.replace('DISC-', ''), 10);
331
+ const statusFolder = this.getStatusFolder(discrepancy.status);
332
+ const batchFolder = path.join(statusFolder, this.getBatchFolder(numericId));
333
+ if (!fs.existsSync(batchFolder)) {
334
+ fs.mkdirSync(batchFolder, { recursive: true });
335
+ }
336
+ const filePath = path.join(batchFolder, `${discrepancy.id}.json`);
337
+ fs.writeFileSync(filePath, JSON.stringify(discrepancy, null, 2));
338
+ }
339
+ async moveDiscrepancy(discrepancy, newStatus) {
340
+ const oldPath = await this.findDiscrepancyPath(discrepancy.id);
341
+ // Update the discrepancy object
342
+ discrepancy.status = newStatus;
343
+ discrepancy.lastChecked = new Date().toISOString();
344
+ // Delete from old location
345
+ if (oldPath && fs.existsSync(oldPath)) {
346
+ fs.unlinkSync(oldPath);
347
+ }
348
+ // Save to new location
349
+ if (newStatus === 'resolved') {
350
+ // Resolved goes to YYYY-MM folder
351
+ const resolvedDate = discrepancy.resolution?.resolvedAt
352
+ ? new Date(discrepancy.resolution.resolvedAt)
353
+ : new Date();
354
+ const monthFolder = path.join(this.basePath, 'resolved', `${resolvedDate.getFullYear()}-${String(resolvedDate.getMonth() + 1).padStart(2, '0')}`);
355
+ if (!fs.existsSync(monthFolder)) {
356
+ fs.mkdirSync(monthFolder, { recursive: true });
357
+ }
358
+ const filePath = path.join(monthFolder, `${discrepancy.id}.json`);
359
+ fs.writeFileSync(filePath, JSON.stringify(discrepancy, null, 2));
360
+ }
361
+ else {
362
+ // Other statuses use batched folders
363
+ await this.saveDiscrepancy(discrepancy);
364
+ }
365
+ }
366
+ async findDiscrepancyPath(id) {
367
+ const numericId = parseInt(id.replace('DISC-', ''), 10);
368
+ const batchFolder = this.getBatchFolder(numericId);
369
+ const fileName = `${id}.json`;
370
+ // Check all status folders
371
+ const checkPaths = [
372
+ path.join(this.basePath, 'pending', batchFolder, fileName),
373
+ path.join(this.basePath, 'in-progress', batchFolder, fileName),
374
+ ];
375
+ for (const checkPath of checkPaths) {
376
+ if (fs.existsSync(checkPath)) {
377
+ return checkPath;
378
+ }
379
+ }
380
+ // Check resolved (scan all YYYY-MM folders)
381
+ const resolvedFolder = path.join(this.basePath, 'resolved');
382
+ if (fs.existsSync(resolvedFolder)) {
383
+ const monthFolders = fs.readdirSync(resolvedFolder, { withFileTypes: true })
384
+ .filter(d => d.isDirectory());
385
+ for (const monthFolder of monthFolders) {
386
+ const checkPath = path.join(resolvedFolder, monthFolder.name, fileName);
387
+ if (fs.existsSync(checkPath)) {
388
+ return checkPath;
389
+ }
390
+ }
391
+ }
392
+ return null;
393
+ }
394
+ readDiscrepancyFile(filePath) {
395
+ try {
396
+ const content = fs.readFileSync(filePath, 'utf-8');
397
+ return JSON.parse(content);
398
+ }
399
+ catch {
400
+ return null;
401
+ }
402
+ }
403
+ getAllJsonFiles(folder) {
404
+ const files = [];
405
+ const entries = fs.readdirSync(folder, { withFileTypes: true });
406
+ for (const entry of entries) {
407
+ const fullPath = path.join(folder, entry.name);
408
+ if (entry.isDirectory()) {
409
+ files.push(...this.getAllJsonFiles(fullPath));
410
+ }
411
+ else if (entry.name.endsWith('.json')) {
412
+ files.push(fullPath);
413
+ }
414
+ }
415
+ return files;
416
+ }
417
+ matchesFilter(disc, filter) {
418
+ if (!filter)
419
+ return true;
420
+ if (filter.module && disc.module !== filter.module)
421
+ return false;
422
+ if (filter.type && disc.type !== filter.type)
423
+ return false;
424
+ if (filter.types && !filter.types.includes(disc.type))
425
+ return false;
426
+ if (filter.priority && disc.priority !== filter.priority)
427
+ return false;
428
+ if (filter.priorities && !filter.priorities.includes(disc.priority))
429
+ return false;
430
+ if (filter.minConfidence !== undefined && disc.confidence < filter.minConfidence)
431
+ return false;
432
+ if (filter.incrementId && disc.incrementId !== filter.incrementId)
433
+ return false;
434
+ return true;
435
+ }
436
+ async loadIndex() {
437
+ if (this.index)
438
+ return this.index;
439
+ const indexPath = path.join(this.basePath, 'index.json');
440
+ if (!fs.existsSync(indexPath)) {
441
+ return { ...DEFAULT_INDEX };
442
+ }
443
+ try {
444
+ const content = fs.readFileSync(indexPath, 'utf-8');
445
+ this.index = JSON.parse(content);
446
+ return this.index;
447
+ }
448
+ catch {
449
+ return { ...DEFAULT_INDEX };
450
+ }
451
+ }
452
+ async saveIndex(index) {
453
+ // Note: Don't call ensureFolderStructure here to avoid circular dependency
454
+ // Folder structure is ensured before any operation that calls saveIndex
455
+ if (!fs.existsSync(this.basePath)) {
456
+ fs.mkdirSync(this.basePath, { recursive: true });
457
+ }
458
+ const indexPath = path.join(this.basePath, 'index.json');
459
+ fs.writeFileSync(indexPath, JSON.stringify(index, null, 2));
460
+ this.index = index;
461
+ }
462
+ async updateIndex() {
463
+ const stats = {
464
+ total: 0,
465
+ pending: 0,
466
+ inProgress: 0,
467
+ resolved: 0,
468
+ ignored: 0,
469
+ byType: {
470
+ 'missing-docs': 0,
471
+ 'stale-docs': 0,
472
+ 'code-doc-mismatch': 0,
473
+ 'knowledge-gap': 0,
474
+ 'orphan-doc': 0,
475
+ 'missing-adr': 0,
476
+ },
477
+ byPriority: {
478
+ critical: 0,
479
+ high: 0,
480
+ medium: 0,
481
+ low: 0,
482
+ },
483
+ };
484
+ // Count all discrepancies
485
+ const statusFolders = ['pending', 'in-progress', 'resolved'];
486
+ for (const status of statusFolders) {
487
+ const folder = this.getStatusFolder(status);
488
+ if (!fs.existsSync(folder))
489
+ continue;
490
+ const files = this.getAllJsonFiles(folder);
491
+ for (const file of files) {
492
+ const disc = this.readDiscrepancyFile(file);
493
+ if (!disc)
494
+ continue;
495
+ stats.total++;
496
+ stats.byType[disc.type]++;
497
+ stats.byPriority[disc.priority]++;
498
+ switch (disc.status) {
499
+ case 'pending':
500
+ stats.pending++;
501
+ break;
502
+ case 'in-progress':
503
+ stats.inProgress++;
504
+ break;
505
+ case 'resolved':
506
+ stats.resolved++;
507
+ break;
508
+ case 'ignored':
509
+ stats.ignored++;
510
+ break;
511
+ }
512
+ }
513
+ }
514
+ const index = await this.loadIndex();
515
+ index.stats = stats;
516
+ index.lastUpdated = new Date().toISOString();
517
+ await this.saveIndex(index);
518
+ }
519
+ }
520
+ //# sourceMappingURL=brownfield-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brownfield-manager.js","sourceRoot":"","sources":["../../../../src/core/discrepancy/brownfield-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAU,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAc9D,wEAAwE;AACxE,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,8BAA8B;AAC9B,MAAM,aAAa,GAA+B;IAChD,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE;QACL,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;QACb,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;QACV,MAAM,EAAE;YACN,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,CAAC;YAClB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;SACjB;QACD,UAAU,EAAE;YACV,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,CAAC;SACP;KACF;IACD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;CACtC,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,4BAA4B;IAMvC,YACE,WAAmB,EACnB,UAA+B,EAAE;QAJ3B,UAAK,GAAsC,IAAI,CAAC;QAMtD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB;QACzB,MAAM,OAAO,GAAG;YACd,IAAI,CAAC,QAAQ;YACb,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;SACrC,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,oCAAoC;YACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,aAAa,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,IAAiC;QACvD,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEnC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,WAAW,GAA0B;YACzC,GAAG,IAAI;YACP,EAAE;SACH,CAAC;QAEF,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAEzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA0B,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,EAAU,EACV,OAAoC;QAEpC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC;QACrC,MAAM,OAAO,GAA0B;YACrC,GAAG,WAAW;YACd,GAAG,OAAO;YACV,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,8CAA8C;QAC9C,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,EAAU;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,MAAoC;QAC1D,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEnC,MAAM,aAAa,GAA4B,EAAE,CAAC;QAElD,2CAA2C;QAC3C,qFAAqF;QACrF,mEAAmE;QACnE,MAAM,QAAQ,GAAkC,MAAM,EAAE,QAAQ;eAC3D,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;QAEjF,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;gBAAE,SAAS;YAE3C,mDAAmD;YACnD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC1B,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;qBACvE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;qBAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAE7C,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;oBACvC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC3E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;wBACpE,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;4BAC7C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC3B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,kDAAkD;gBAClD,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;qBACvE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;qBAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAE7C,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;oBACvC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC3E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;wBACpE,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;4BAC7C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC3B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,MAAM,aAAa,GAAkD;YACnE,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,CAAC;SACP,CAAC;QAEF,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3E,IAAI,YAAY,KAAK,CAAC;gBAAE,OAAO,YAAY,CAAC;YAC5C,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,aAAa,CAAC,MAAM,CAAC;QACpD,OAAO,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,aAAqB,EAAE,WAAmB;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;YACzD,MAAM,EAAE,aAAa;YACrB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,MAAM,KAAK,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,EAAU,EACV,UAA2C;QAE3C,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE;YAC/B,MAAM,EAAE,UAAU;YAClB,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,EAAU,EAAE,MAAc;QAChD,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE;YAC/B,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE;gBACV,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,UAAU,EAAE,MAAM;gBAClB,KAAK,EAAE,MAAM;aACd;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,aAA4C;QAE5C,MAAM,OAAO,GAA4B,EAAE,CAAC;QAE5C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACjE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,wDAAwD;QACxD,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBACvC,4BAA4B;oBAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU;wBAC9C,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;wBACtC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;oBACf,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,cAAc,EACd,GAAG,YAAY,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACxF,CAAC;oBAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBAChC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACjD,CAAC;oBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3D,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAC9B,aAAa,EAAE,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,aAAa,yBAAyB,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,SAAiB;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;QAC7C,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACvF,CAAC;IAED,gEAAgE;IAChE,kBAAkB;IAClB,gEAAgE;IAExD,KAAK,CAAC,SAAS;QACrB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QACtC,OAAO,QAAQ,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACpD,CAAC;IAEO,eAAe,CAAC,MAAmC;QACzD,MAAM,SAAS,GAAgD;YAC7D,OAAO,EAAE,SAAS;YAClB,aAAa,EAAE,aAAa;YAC5B,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,SAAS,EAAE,mDAAmD;SACxE,CAAC;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,WAAkC;QAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,WAAkC,EAClC,SAAsC;QAEtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAE/D,gCAAgC;QAChC,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;QAC/B,WAAW,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAEnD,2BAA2B;QAC3B,IAAI,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,uBAAuB;QACvB,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,kCAAkC;YAClC,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,EAAE,UAAU;gBACrD,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC;gBAC7C,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,IAAI,CAAC,QAAQ,EACb,UAAU,EACV,GAAG,YAAY,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACxF,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;YAClE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,EAAU;QAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,GAAG,EAAE,OAAO,CAAC;QAE9B,2BAA2B;QAC3B,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC;YAC1D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAC;SAC/D,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;iBACzE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAEhC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACxE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,mBAAmB,CAAC,QAAgB;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA0B,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,MAAc;QACpC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,aAAa,CACnB,IAA2B,EAC3B,MAAoC;QAEpC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACjE,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC3D,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACpE,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACvE,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAClF,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QAC/F,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAEhF,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QAElC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA+B,CAAC;YAC/D,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAiC;QACvD,2EAA2E;QAC3E,wEAAwE;QACxE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACzD,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,KAAK,GAA+B;YACxC,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;YACV,MAAM,EAAE;gBACN,cAAc,EAAE,CAAC;gBACjB,YAAY,EAAE,CAAC;gBACf,mBAAmB,EAAE,CAAC;gBACtB,eAAe,EAAE,CAAC;gBAClB,YAAY,EAAE,CAAC;gBACf,aAAa,EAAE,CAAC;aACjB;YACD,UAAU,EAAE;gBACV,QAAQ,EAAE,CAAC;gBACX,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC;gBACT,GAAG,EAAE,CAAC;aACP;SACF,CAAC;QAEF,0BAA0B;QAC1B,MAAM,aAAa,GAAkC,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;QAC5F,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,SAAS;YAErC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAEpB,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAElC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpB,KAAK,SAAS;wBACZ,KAAK,CAAC,OAAO,EAAE,CAAC;wBAChB,MAAM;oBACR,KAAK,aAAa;wBAChB,KAAK,CAAC,UAAU,EAAE,CAAC;wBACnB,MAAM;oBACR,KAAK,UAAU;wBACb,KAAK,CAAC,QAAQ,EAAE,CAAC;wBACjB,MAAM;oBACR,KAAK,SAAS;wBACZ,KAAK,CAAC,OAAO,EAAE,CAAC;wBAChB,MAAM;gBACV,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF"}