kirograph 0.27.2 → 0.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (788) hide show
  1. package/README.md +14 -7
  2. package/dist/bin/commands/annotations.js +56 -0
  3. package/dist/bin/commands/annotations.js.map +7 -0
  4. package/dist/bin/commands/ast-rewrite.js +55 -0
  5. package/dist/bin/commands/ast-rewrite.js.map +7 -0
  6. package/dist/bin/commands/bench.js +103 -0
  7. package/dist/bin/commands/bench.js.map +7 -0
  8. package/dist/bin/commands/branch.js +133 -0
  9. package/dist/bin/commands/branch.js.map +7 -0
  10. package/dist/bin/commands/changelog.js +55 -0
  11. package/dist/bin/commands/changelog.js.map +7 -0
  12. package/dist/bin/commands/commit-context.js +55 -0
  13. package/dist/bin/commands/commit-context.js.map +7 -0
  14. package/dist/bin/commands/complexity.js +60 -0
  15. package/dist/bin/commands/complexity.js.map +7 -0
  16. package/dist/bin/commands/cost.js +146 -0
  17. package/dist/bin/commands/cost.js.map +7 -0
  18. package/dist/bin/commands/dependency-depth.js +55 -0
  19. package/dist/bin/commands/dependency-depth.js.map +7 -0
  20. package/dist/bin/commands/diff-context.js +55 -0
  21. package/dist/bin/commands/diff-context.js.map +7 -0
  22. package/dist/bin/commands/distribution.js +56 -0
  23. package/dist/bin/commands/distribution.js.map +7 -0
  24. package/dist/bin/commands/doc-coverage.js +56 -0
  25. package/dist/bin/commands/doc-coverage.js.map +7 -0
  26. package/dist/bin/commands/doctor.js +202 -0
  27. package/dist/bin/commands/doctor.js.map +7 -0
  28. package/dist/bin/commands/dsm.js +56 -0
  29. package/dist/bin/commands/dsm.js.map +7 -0
  30. package/dist/bin/commands/gini.js +55 -0
  31. package/dist/bin/commands/gini.js.map +7 -0
  32. package/dist/bin/commands/god-class.js +56 -0
  33. package/dist/bin/commands/god-class.js.map +7 -0
  34. package/dist/bin/commands/health.js +55 -0
  35. package/dist/bin/commands/health.js.map +7 -0
  36. package/dist/bin/commands/help.js +224 -45
  37. package/dist/bin/commands/help.js.map +2 -2
  38. package/dist/bin/commands/inheritance-depth.js +56 -0
  39. package/dist/bin/commands/inheritance-depth.js.map +7 -0
  40. package/dist/bin/commands/insert-at.js +55 -0
  41. package/dist/bin/commands/insert-at.js.map +7 -0
  42. package/dist/bin/commands/largest.js +56 -0
  43. package/dist/bin/commands/largest.js.map +7 -0
  44. package/dist/bin/commands/manifest.js +158 -0
  45. package/dist/bin/commands/manifest.js.map +7 -0
  46. package/dist/bin/commands/module-api.js +57 -0
  47. package/dist/bin/commands/module-api.js.map +7 -0
  48. package/dist/bin/commands/monitor.js +91 -0
  49. package/dist/bin/commands/monitor.js.map +7 -0
  50. package/dist/bin/commands/multi-replace.js +66 -0
  51. package/dist/bin/commands/multi-replace.js.map +7 -0
  52. package/dist/bin/commands/pr-context.js +55 -0
  53. package/dist/bin/commands/pr-context.js.map +7 -0
  54. package/dist/bin/commands/query.js +19 -1
  55. package/dist/bin/commands/query.js.map +3 -3
  56. package/dist/bin/commands/rank.js +56 -0
  57. package/dist/bin/commands/rank.js.map +7 -0
  58. package/dist/bin/commands/read.js +1 -1
  59. package/dist/bin/commands/read.js.map +2 -2
  60. package/dist/bin/commands/recursion.js +56 -0
  61. package/dist/bin/commands/recursion.js.map +7 -0
  62. package/dist/bin/commands/rename-preview.js +56 -0
  63. package/dist/bin/commands/rename-preview.js.map +7 -0
  64. package/dist/bin/commands/session.js +60 -0
  65. package/dist/bin/commands/session.js.map +7 -0
  66. package/dist/bin/commands/simplify-scan.js +56 -0
  67. package/dist/bin/commands/simplify-scan.js.map +7 -0
  68. package/dist/bin/commands/str-replace.js +55 -0
  69. package/dist/bin/commands/str-replace.js.map +7 -0
  70. package/dist/bin/commands/test-coverage.js +59 -0
  71. package/dist/bin/commands/test-coverage.js.map +7 -0
  72. package/dist/bin/commands/test-map.js +56 -0
  73. package/dist/bin/commands/test-map.js.map +7 -0
  74. package/dist/bin/commands/test-risk.js +59 -0
  75. package/dist/bin/commands/test-risk.js.map +7 -0
  76. package/dist/bin/commands/unused-imports.js +55 -0
  77. package/dist/bin/commands/unused-imports.js.map +7 -0
  78. package/dist/bin/commands/upgrade.js +78 -0
  79. package/dist/bin/commands/upgrade.js.map +7 -0
  80. package/dist/bin/installer/common.js +5 -1
  81. package/dist/bin/installer/common.js.map +2 -2
  82. package/dist/bin/installer/config-prompt.js +239 -93
  83. package/dist/bin/installer/config-prompt.js.map +3 -3
  84. package/dist/bin/installer/index.js +38 -6
  85. package/dist/bin/installer/index.js.map +2 -2
  86. package/dist/bin/installer/instructions.js +7 -11
  87. package/dist/bin/installer/instructions.js.map +2 -2
  88. package/dist/bin/installer/mcp.js.map +2 -2
  89. package/dist/bin/installer/steering.js +531 -100
  90. package/dist/bin/installer/steering.js.map +2 -2
  91. package/dist/bin/installer/targets/kiro.js +7 -3
  92. package/dist/bin/installer/targets/kiro.js.map +2 -2
  93. package/dist/bin/kirograph.js +73 -1
  94. package/dist/bin/kirograph.js.map +3 -3
  95. package/dist/config.js +26 -8
  96. package/dist/config.js.map +2 -2
  97. package/dist/core/branch-manager.js +111 -0
  98. package/dist/core/branch-manager.js.map +7 -0
  99. package/dist/core/pipeline.js +3 -3
  100. package/dist/core/pipeline.js.map +2 -2
  101. package/dist/db/database.js +34 -7
  102. package/dist/db/database.js.map +2 -2
  103. package/dist/db/schema.sql +7 -1
  104. package/dist/extraction/complexity.js +116 -0
  105. package/dist/extraction/complexity.js.map +7 -0
  106. package/dist/extraction/extractor.js +52 -1
  107. package/dist/extraction/extractor.js.map +2 -2
  108. package/dist/graph/git-context.js +229 -0
  109. package/dist/graph/git-context.js.map +7 -0
  110. package/dist/index.js +4 -2
  111. package/dist/index.js.map +2 -2
  112. package/dist/mcp/handler.js +446 -0
  113. package/dist/mcp/handler.js.map +7 -0
  114. package/dist/mcp/handlers/architecture.js +297 -0
  115. package/dist/mcp/handlers/architecture.js.map +7 -0
  116. package/dist/mcp/handlers/branch.js +175 -0
  117. package/dist/mcp/handlers/branch.js.map +7 -0
  118. package/dist/mcp/handlers/code-health.js +563 -0
  119. package/dist/mcp/handlers/code-health.js.map +7 -0
  120. package/dist/mcp/handlers/complexity.js +267 -0
  121. package/dist/mcp/handlers/complexity.js.map +7 -0
  122. package/dist/mcp/handlers/core.js +611 -0
  123. package/dist/mcp/handlers/core.js.map +7 -0
  124. package/dist/mcp/handlers/data.js +337 -0
  125. package/dist/mcp/handlers/data.js.map +7 -0
  126. package/dist/mcp/handlers/docs.js +159 -0
  127. package/dist/mcp/handlers/docs.js.map +7 -0
  128. package/dist/mcp/handlers/edit-primitives.js +200 -0
  129. package/dist/mcp/handlers/edit-primitives.js.map +7 -0
  130. package/dist/mcp/handlers/git-context.js +286 -0
  131. package/dist/mcp/handlers/git-context.js.map +7 -0
  132. package/dist/mcp/handlers/memory.js +363 -0
  133. package/dist/mcp/handlers/memory.js.map +7 -0
  134. package/dist/mcp/handlers/patterns.js +310 -0
  135. package/dist/mcp/handlers/patterns.js.map +7 -0
  136. package/dist/mcp/handlers/security.js +699 -0
  137. package/dist/mcp/handlers/security.js.map +7 -0
  138. package/dist/mcp/handlers/utils.js +97 -0
  139. package/dist/mcp/handlers/utils.js.map +7 -0
  140. package/dist/mcp/handlers/watchmen.js +104 -0
  141. package/dist/mcp/handlers/watchmen.js.map +7 -0
  142. package/dist/mcp/handlers/wiki.js +242 -0
  143. package/dist/mcp/handlers/wiki.js.map +7 -0
  144. package/dist/mcp/server.js +72 -3
  145. package/dist/mcp/server.js.map +2 -2
  146. package/dist/mcp/tool-names.js +94 -7
  147. package/dist/mcp/tool-names.js.map +2 -2
  148. package/dist/mcp/tools.js +445 -3210
  149. package/dist/mcp/tools.js.map +3 -3
  150. package/dist/types.js.map +2 -2
  151. package/package.json +36 -10
  152. package/dist/architecture/index.d.ts +0 -11
  153. package/dist/architecture/index.d.ts.map +0 -1
  154. package/dist/architecture/layers/csharp.d.ts +0 -6
  155. package/dist/architecture/layers/csharp.d.ts.map +0 -1
  156. package/dist/architecture/layers/dart.d.ts +0 -10
  157. package/dist/architecture/layers/dart.d.ts.map +0 -1
  158. package/dist/architecture/layers/elixir.d.ts +0 -6
  159. package/dist/architecture/layers/elixir.d.ts.map +0 -1
  160. package/dist/architecture/layers/go.d.ts +0 -7
  161. package/dist/architecture/layers/go.d.ts.map +0 -1
  162. package/dist/architecture/layers/index.d.ts +0 -30
  163. package/dist/architecture/layers/index.d.ts.map +0 -1
  164. package/dist/architecture/layers/java.d.ts +0 -7
  165. package/dist/architecture/layers/java.d.ts.map +0 -1
  166. package/dist/architecture/layers/ocaml.d.ts +0 -6
  167. package/dist/architecture/layers/ocaml.d.ts.map +0 -1
  168. package/dist/architecture/layers/python.d.ts +0 -7
  169. package/dist/architecture/layers/python.d.ts.map +0 -1
  170. package/dist/architecture/layers/ruby.d.ts +0 -6
  171. package/dist/architecture/layers/ruby.d.ts.map +0 -1
  172. package/dist/architecture/layers/rust.d.ts +0 -6
  173. package/dist/architecture/layers/rust.d.ts.map +0 -1
  174. package/dist/architecture/layers/scala.d.ts +0 -6
  175. package/dist/architecture/layers/scala.d.ts.map +0 -1
  176. package/dist/architecture/layers/solidity.d.ts +0 -6
  177. package/dist/architecture/layers/solidity.d.ts.map +0 -1
  178. package/dist/architecture/layers/types.d.ts +0 -2
  179. package/dist/architecture/layers/types.d.ts.map +0 -1
  180. package/dist/architecture/layers/typescript.d.ts +0 -9
  181. package/dist/architecture/layers/typescript.d.ts.map +0 -1
  182. package/dist/architecture/layers/vue.d.ts +0 -6
  183. package/dist/architecture/layers/vue.d.ts.map +0 -1
  184. package/dist/architecture/manifest/cargo.d.ts +0 -3
  185. package/dist/architecture/manifest/cargo.d.ts.map +0 -1
  186. package/dist/architecture/manifest/csproj.d.ts +0 -3
  187. package/dist/architecture/manifest/csproj.d.ts.map +0 -1
  188. package/dist/architecture/manifest/elm.d.ts +0 -3
  189. package/dist/architecture/manifest/elm.d.ts.map +0 -1
  190. package/dist/architecture/manifest/go.d.ts +0 -3
  191. package/dist/architecture/manifest/go.d.ts.map +0 -1
  192. package/dist/architecture/manifest/gradle.d.ts +0 -3
  193. package/dist/architecture/manifest/gradle.d.ts.map +0 -1
  194. package/dist/architecture/manifest/index.d.ts +0 -12
  195. package/dist/architecture/manifest/index.d.ts.map +0 -1
  196. package/dist/architecture/manifest/maven.d.ts +0 -3
  197. package/dist/architecture/manifest/maven.d.ts.map +0 -1
  198. package/dist/architecture/manifest/npm.d.ts +0 -3
  199. package/dist/architecture/manifest/npm.d.ts.map +0 -1
  200. package/dist/architecture/manifest/ocaml.d.ts +0 -3
  201. package/dist/architecture/manifest/ocaml.d.ts.map +0 -1
  202. package/dist/architecture/manifest/python.d.ts +0 -3
  203. package/dist/architecture/manifest/python.d.ts.map +0 -1
  204. package/dist/architecture/manifest/scala.d.ts +0 -3
  205. package/dist/architecture/manifest/scala.d.ts.map +0 -1
  206. package/dist/architecture/manifest/types.d.ts +0 -2
  207. package/dist/architecture/manifest/types.d.ts.map +0 -1
  208. package/dist/architecture/types.d.ts +0 -91
  209. package/dist/architecture/types.d.ts.map +0 -1
  210. package/dist/banner.d.ts +0 -6
  211. package/dist/banner.d.ts.map +0 -1
  212. package/dist/banner.js +0 -67
  213. package/dist/banner.js.map +0 -1
  214. package/dist/bin/banner.d.ts +0 -6
  215. package/dist/bin/banner.d.ts.map +0 -1
  216. package/dist/bin/commands/affected.d.ts +0 -3
  217. package/dist/bin/commands/affected.d.ts.map +0 -1
  218. package/dist/bin/commands/architecture.d.ts +0 -3
  219. package/dist/bin/commands/architecture.d.ts.map +0 -1
  220. package/dist/bin/commands/attack-surface.d.ts +0 -3
  221. package/dist/bin/commands/attack-surface.d.ts.map +0 -1
  222. package/dist/bin/commands/benchmark.d.ts +0 -9
  223. package/dist/bin/commands/benchmark.d.ts.map +0 -1
  224. package/dist/bin/commands/budget.d.ts +0 -6
  225. package/dist/bin/commands/budget.d.ts.map +0 -1
  226. package/dist/bin/commands/caveman.d.ts +0 -7
  227. package/dist/bin/commands/caveman.d.ts.map +0 -1
  228. package/dist/bin/commands/communities.d.ts +0 -3
  229. package/dist/bin/commands/communities.d.ts.map +0 -1
  230. package/dist/bin/commands/compression.d.ts +0 -7
  231. package/dist/bin/commands/compression.d.ts.map +0 -1
  232. package/dist/bin/commands/configure-mcp.js +0 -104
  233. package/dist/bin/commands/configure-mcp.js.map +0 -7
  234. package/dist/bin/commands/context.d.ts +0 -3
  235. package/dist/bin/commands/context.d.ts.map +0 -1
  236. package/dist/bin/commands/coupling.d.ts +0 -3
  237. package/dist/bin/commands/coupling.d.ts.map +0 -1
  238. package/dist/bin/commands/dashboard.d.ts +0 -3
  239. package/dist/bin/commands/dashboard.d.ts.map +0 -1
  240. package/dist/bin/commands/data.d.ts +0 -3
  241. package/dist/bin/commands/data.d.ts.map +0 -1
  242. package/dist/bin/commands/dead-code.d.ts +0 -3
  243. package/dist/bin/commands/dead-code.d.ts.map +0 -1
  244. package/dist/bin/commands/dep-confusion.d.ts +0 -3
  245. package/dist/bin/commands/dep-confusion.d.ts.map +0 -1
  246. package/dist/bin/commands/docs.d.ts +0 -3
  247. package/dist/bin/commands/docs.d.ts.map +0 -1
  248. package/dist/bin/commands/exec.d.ts +0 -11
  249. package/dist/bin/commands/exec.d.ts.map +0 -1
  250. package/dist/bin/commands/export.d.ts +0 -3
  251. package/dist/bin/commands/export.d.ts.map +0 -1
  252. package/dist/bin/commands/files.d.ts +0 -3
  253. package/dist/bin/commands/files.d.ts.map +0 -1
  254. package/dist/bin/commands/flows.d.ts +0 -3
  255. package/dist/bin/commands/flows.d.ts.map +0 -1
  256. package/dist/bin/commands/gain.d.ts +0 -6
  257. package/dist/bin/commands/gain.d.ts.map +0 -1
  258. package/dist/bin/commands/help.d.ts +0 -11
  259. package/dist/bin/commands/help.d.ts.map +0 -1
  260. package/dist/bin/commands/hotspots.d.ts +0 -3
  261. package/dist/bin/commands/hotspots.d.ts.map +0 -1
  262. package/dist/bin/commands/index.d.ts +0 -3
  263. package/dist/bin/commands/index.d.ts.map +0 -1
  264. package/dist/bin/commands/init.d.ts +0 -3
  265. package/dist/bin/commands/init.d.ts.map +0 -1
  266. package/dist/bin/commands/install.d.ts +0 -3
  267. package/dist/bin/commands/install.d.ts.map +0 -1
  268. package/dist/bin/commands/licenses.d.ts +0 -3
  269. package/dist/bin/commands/licenses.d.ts.map +0 -1
  270. package/dist/bin/commands/mark-dirty.d.ts +0 -3
  271. package/dist/bin/commands/mark-dirty.d.ts.map +0 -1
  272. package/dist/bin/commands/memory.d.ts +0 -16
  273. package/dist/bin/commands/memory.d.ts.map +0 -1
  274. package/dist/bin/commands/package.d.ts +0 -3
  275. package/dist/bin/commands/package.d.ts.map +0 -1
  276. package/dist/bin/commands/path.d.ts +0 -3
  277. package/dist/bin/commands/path.d.ts.map +0 -1
  278. package/dist/bin/commands/pattern.d.ts +0 -3
  279. package/dist/bin/commands/pattern.d.ts.map +0 -1
  280. package/dist/bin/commands/qdrant.d.ts +0 -3
  281. package/dist/bin/commands/qdrant.d.ts.map +0 -1
  282. package/dist/bin/commands/qdrant.js +0 -159
  283. package/dist/bin/commands/qdrant.js.map +0 -1
  284. package/dist/bin/commands/query.d.ts +0 -3
  285. package/dist/bin/commands/query.d.ts.map +0 -1
  286. package/dist/bin/commands/reachability.d.ts +0 -3
  287. package/dist/bin/commands/reachability.d.ts.map +0 -1
  288. package/dist/bin/commands/read.d.ts +0 -6
  289. package/dist/bin/commands/read.d.ts.map +0 -1
  290. package/dist/bin/commands/refactor.d.ts +0 -3
  291. package/dist/bin/commands/refactor.d.ts.map +0 -1
  292. package/dist/bin/commands/remediation.d.ts +0 -3
  293. package/dist/bin/commands/remediation.d.ts.map +0 -1
  294. package/dist/bin/commands/sbom.d.ts +0 -3
  295. package/dist/bin/commands/sbom.d.ts.map +0 -1
  296. package/dist/bin/commands/security-ci-report.d.ts +0 -9
  297. package/dist/bin/commands/security-ci-report.d.ts.map +0 -1
  298. package/dist/bin/commands/security-export.d.ts +0 -2
  299. package/dist/bin/commands/security-export.d.ts.map +0 -1
  300. package/dist/bin/commands/security-flows.d.ts +0 -3
  301. package/dist/bin/commands/security-flows.d.ts.map +0 -1
  302. package/dist/bin/commands/security-secrets.d.ts +0 -3
  303. package/dist/bin/commands/security-secrets.d.ts.map +0 -1
  304. package/dist/bin/commands/security.d.ts +0 -3
  305. package/dist/bin/commands/security.d.ts.map +0 -1
  306. package/dist/bin/commands/serve.d.ts +0 -3
  307. package/dist/bin/commands/serve.d.ts.map +0 -1
  308. package/dist/bin/commands/snapshot.d.ts +0 -3
  309. package/dist/bin/commands/snapshot.d.ts.map +0 -1
  310. package/dist/bin/commands/staleness.d.ts +0 -3
  311. package/dist/bin/commands/staleness.d.ts.map +0 -1
  312. package/dist/bin/commands/status.d.ts +0 -3
  313. package/dist/bin/commands/status.d.ts.map +0 -1
  314. package/dist/bin/commands/stop.d.ts +0 -3
  315. package/dist/bin/commands/stop.d.ts.map +0 -1
  316. package/dist/bin/commands/stop.js +0 -81
  317. package/dist/bin/commands/stop.js.map +0 -1
  318. package/dist/bin/commands/supply-chain.d.ts +0 -3
  319. package/dist/bin/commands/supply-chain.d.ts.map +0 -1
  320. package/dist/bin/commands/surprising.d.ts +0 -3
  321. package/dist/bin/commands/surprising.d.ts.map +0 -1
  322. package/dist/bin/commands/sync-if-dirty.d.ts +0 -3
  323. package/dist/bin/commands/sync-if-dirty.d.ts.map +0 -1
  324. package/dist/bin/commands/sync.d.ts +0 -3
  325. package/dist/bin/commands/sync.d.ts.map +0 -1
  326. package/dist/bin/commands/typesense.d.ts +0 -3
  327. package/dist/bin/commands/typesense.d.ts.map +0 -1
  328. package/dist/bin/commands/typesense.js +0 -126
  329. package/dist/bin/commands/typesense.js.map +0 -1
  330. package/dist/bin/commands/uninit.d.ts +0 -4
  331. package/dist/bin/commands/uninit.d.ts.map +0 -1
  332. package/dist/bin/commands/unlock.d.ts +0 -3
  333. package/dist/bin/commands/unlock.d.ts.map +0 -1
  334. package/dist/bin/commands/utils.d.ts +0 -17
  335. package/dist/bin/commands/utils.d.ts.map +0 -1
  336. package/dist/bin/commands/vex.d.ts +0 -3
  337. package/dist/bin/commands/vex.d.ts.map +0 -1
  338. package/dist/bin/commands/vuln-suppress.d.ts +0 -3
  339. package/dist/bin/commands/vuln-suppress.d.ts.map +0 -1
  340. package/dist/bin/commands/vulns.d.ts +0 -3
  341. package/dist/bin/commands/vulns.d.ts.map +0 -1
  342. package/dist/bin/installer/archive.d.ts +0 -47
  343. package/dist/bin/installer/archive.d.ts.map +0 -1
  344. package/dist/bin/installer/auto-detect.d.ts +0 -16
  345. package/dist/bin/installer/auto-detect.d.ts.map +0 -1
  346. package/dist/bin/installer/caveman.d.ts +0 -12
  347. package/dist/bin/installer/caveman.d.ts.map +0 -1
  348. package/dist/bin/installer/cli-agent.d.ts +0 -20
  349. package/dist/bin/installer/cli-agent.d.ts.map +0 -1
  350. package/dist/bin/installer/common.d.ts +0 -36
  351. package/dist/bin/installer/common.d.ts.map +0 -1
  352. package/dist/bin/installer/config-prompt.d.ts +0 -13
  353. package/dist/bin/installer/config-prompt.d.ts.map +0 -1
  354. package/dist/bin/installer/dashboard.d.ts +0 -3
  355. package/dist/bin/installer/dashboard.d.ts.map +0 -1
  356. package/dist/bin/installer/detect.d.ts +0 -30
  357. package/dist/bin/installer/detect.d.ts.map +0 -1
  358. package/dist/bin/installer/hooks.d.ts +0 -8
  359. package/dist/bin/installer/hooks.d.ts.map +0 -1
  360. package/dist/bin/installer/index.d.ts +0 -12
  361. package/dist/bin/installer/index.d.ts.map +0 -1
  362. package/dist/bin/installer/instructions.d.ts +0 -14
  363. package/dist/bin/installer/instructions.d.ts.map +0 -1
  364. package/dist/bin/installer/mcp.d.ts +0 -5
  365. package/dist/bin/installer/mcp.d.ts.map +0 -1
  366. package/dist/bin/installer/prompts.d.ts +0 -45
  367. package/dist/bin/installer/prompts.d.ts.map +0 -1
  368. package/dist/bin/installer/qdrant-dashboard.d.ts +0 -4
  369. package/dist/bin/installer/qdrant-dashboard.d.ts.map +0 -1
  370. package/dist/bin/installer/steering.d.ts +0 -17
  371. package/dist/bin/installer/steering.d.ts.map +0 -1
  372. package/dist/bin/installer/targets/aider.d.ts +0 -6
  373. package/dist/bin/installer/targets/aider.d.ts.map +0 -1
  374. package/dist/bin/installer/targets/amp.d.ts +0 -6
  375. package/dist/bin/installer/targets/amp.d.ts.map +0 -1
  376. package/dist/bin/installer/targets/antigravity.d.ts +0 -13
  377. package/dist/bin/installer/targets/antigravity.d.ts.map +0 -1
  378. package/dist/bin/installer/targets/augment.d.ts +0 -6
  379. package/dist/bin/installer/targets/augment.d.ts.map +0 -1
  380. package/dist/bin/installer/targets/claude.d.ts +0 -6
  381. package/dist/bin/installer/targets/claude.d.ts.map +0 -1
  382. package/dist/bin/installer/targets/cline.d.ts +0 -13
  383. package/dist/bin/installer/targets/cline.d.ts.map +0 -1
  384. package/dist/bin/installer/targets/codex.d.ts +0 -6
  385. package/dist/bin/installer/targets/codex.d.ts.map +0 -1
  386. package/dist/bin/installer/targets/continue.d.ts +0 -12
  387. package/dist/bin/installer/targets/continue.d.ts.map +0 -1
  388. package/dist/bin/installer/targets/copilot-cli.d.ts +0 -12
  389. package/dist/bin/installer/targets/copilot-cli.d.ts.map +0 -1
  390. package/dist/bin/installer/targets/copilot.d.ts +0 -6
  391. package/dist/bin/installer/targets/copilot.d.ts.map +0 -1
  392. package/dist/bin/installer/targets/cursor.d.ts +0 -6
  393. package/dist/bin/installer/targets/cursor.d.ts.map +0 -1
  394. package/dist/bin/installer/targets/devin.d.ts +0 -13
  395. package/dist/bin/installer/targets/devin.d.ts.map +0 -1
  396. package/dist/bin/installer/targets/gemini-cli.d.ts +0 -16
  397. package/dist/bin/installer/targets/gemini-cli.d.ts.map +0 -1
  398. package/dist/bin/installer/targets/generic.d.ts +0 -59
  399. package/dist/bin/installer/targets/generic.d.ts.map +0 -1
  400. package/dist/bin/installer/targets/goose.d.ts +0 -6
  401. package/dist/bin/installer/targets/goose.d.ts.map +0 -1
  402. package/dist/bin/installer/targets/index.d.ts +0 -11
  403. package/dist/bin/installer/targets/index.d.ts.map +0 -1
  404. package/dist/bin/installer/targets/junie.d.ts +0 -13
  405. package/dist/bin/installer/targets/junie.d.ts.map +0 -1
  406. package/dist/bin/installer/targets/kilo.d.ts +0 -12
  407. package/dist/bin/installer/targets/kilo.d.ts.map +0 -1
  408. package/dist/bin/installer/targets/kiro.d.ts +0 -5
  409. package/dist/bin/installer/targets/kiro.d.ts.map +0 -1
  410. package/dist/bin/installer/targets/opencode.d.ts +0 -13
  411. package/dist/bin/installer/targets/opencode.d.ts.map +0 -1
  412. package/dist/bin/installer/targets/openhands.d.ts +0 -6
  413. package/dist/bin/installer/targets/openhands.d.ts.map +0 -1
  414. package/dist/bin/installer/targets/qoder.d.ts +0 -12
  415. package/dist/bin/installer/targets/qoder.d.ts.map +0 -1
  416. package/dist/bin/installer/targets/qwen.d.ts +0 -12
  417. package/dist/bin/installer/targets/qwen.d.ts.map +0 -1
  418. package/dist/bin/installer/targets/replit.d.ts +0 -6
  419. package/dist/bin/installer/targets/replit.d.ts.map +0 -1
  420. package/dist/bin/installer/targets/roo.d.ts +0 -13
  421. package/dist/bin/installer/targets/roo.d.ts.map +0 -1
  422. package/dist/bin/installer/targets/tabnine.d.ts +0 -6
  423. package/dist/bin/installer/targets/tabnine.d.ts.map +0 -1
  424. package/dist/bin/installer/targets/trae.d.ts +0 -6
  425. package/dist/bin/installer/targets/trae.d.ts.map +0 -1
  426. package/dist/bin/installer/targets/warp.d.ts +0 -12
  427. package/dist/bin/installer/targets/warp.d.ts.map +0 -1
  428. package/dist/bin/installer/targets/windsurf.d.ts +0 -13
  429. package/dist/bin/installer/targets/windsurf.d.ts.map +0 -1
  430. package/dist/bin/kirograph.d.ts +0 -6
  431. package/dist/bin/kirograph.d.ts.map +0 -1
  432. package/dist/bin/progress.d.ts +0 -29
  433. package/dist/bin/progress.d.ts.map +0 -1
  434. package/dist/bin/ui.d.ts +0 -11
  435. package/dist/bin/ui.d.ts.map +0 -1
  436. package/dist/compression/filters/aws.d.ts +0 -9
  437. package/dist/compression/filters/aws.d.ts.map +0 -1
  438. package/dist/compression/filters/docker.d.ts +0 -6
  439. package/dist/compression/filters/docker.d.ts.map +0 -1
  440. package/dist/compression/filters/files.d.ts +0 -6
  441. package/dist/compression/filters/files.d.ts.map +0 -1
  442. package/dist/compression/filters/generic.d.ts +0 -7
  443. package/dist/compression/filters/generic.d.ts.map +0 -1
  444. package/dist/compression/filters/git.d.ts +0 -6
  445. package/dist/compression/filters/git.d.ts.map +0 -1
  446. package/dist/compression/filters/github.d.ts +0 -6
  447. package/dist/compression/filters/github.d.ts.map +0 -1
  448. package/dist/compression/filters/lint.d.ts +0 -6
  449. package/dist/compression/filters/lint.d.ts.map +0 -1
  450. package/dist/compression/filters/misc.d.ts +0 -6
  451. package/dist/compression/filters/misc.d.ts.map +0 -1
  452. package/dist/compression/filters/package.d.ts +0 -6
  453. package/dist/compression/filters/package.d.ts.map +0 -1
  454. package/dist/compression/filters/test.d.ts +0 -6
  455. package/dist/compression/filters/test.d.ts.map +0 -1
  456. package/dist/compression/index.d.ts +0 -29
  457. package/dist/compression/index.d.ts.map +0 -1
  458. package/dist/compression/naive-cost.d.ts +0 -26
  459. package/dist/compression/naive-cost.d.ts.map +0 -1
  460. package/dist/compression/tracker.d.ts +0 -155
  461. package/dist/compression/tracker.d.ts.map +0 -1
  462. package/dist/compression/types.d.ts +0 -49
  463. package/dist/compression/types.d.ts.map +0 -1
  464. package/dist/config.d.ts +0 -138
  465. package/dist/config.d.ts.map +0 -1
  466. package/dist/context/index.d.ts +0 -61
  467. package/dist/context/index.d.ts.map +0 -1
  468. package/dist/core/file-tree.d.ts +0 -15
  469. package/dist/core/file-tree.d.ts.map +0 -1
  470. package/dist/core/lock-manager.d.ts +0 -22
  471. package/dist/core/lock-manager.d.ts.map +0 -1
  472. package/dist/core/pipeline.d.ts +0 -40
  473. package/dist/core/pipeline.d.ts.map +0 -1
  474. package/dist/core/snapshot.d.ts +0 -58
  475. package/dist/core/snapshot.d.ts.map +0 -1
  476. package/dist/data/filters.d.ts +0 -23
  477. package/dist/data/filters.d.ts.map +0 -1
  478. package/dist/data/indexer.d.ts +0 -25
  479. package/dist/data/indexer.d.ts.map +0 -1
  480. package/dist/data/linker.d.ts +0 -37
  481. package/dist/data/linker.d.ts.map +0 -1
  482. package/dist/data/linker.test.js +0 -60
  483. package/dist/data/linker.test.js.map +0 -7
  484. package/dist/data/lint.d.ts +0 -27
  485. package/dist/data/lint.d.ts.map +0 -1
  486. package/dist/data/parsers/__fixtures__/pdf-inspector-stub.js +0 -41
  487. package/dist/data/parsers/__fixtures__/pdf-inspector-stub.js.map +0 -7
  488. package/dist/data/parsers/csv.d.ts +0 -11
  489. package/dist/data/parsers/csv.d.ts.map +0 -1
  490. package/dist/data/parsers/excel.d.ts +0 -10
  491. package/dist/data/parsers/excel.d.ts.map +0 -1
  492. package/dist/data/parsers/index.d.ts +0 -28
  493. package/dist/data/parsers/index.d.ts.map +0 -1
  494. package/dist/data/parsers/json-array.d.ts +0 -9
  495. package/dist/data/parsers/json-array.d.ts.map +0 -1
  496. package/dist/data/parsers/jsonl.d.ts +0 -9
  497. package/dist/data/parsers/jsonl.d.ts.map +0 -1
  498. package/dist/data/parsers/parquet.d.ts +0 -10
  499. package/dist/data/parsers/parquet.d.ts.map +0 -1
  500. package/dist/data/parsers/pdf.test.js +0 -125
  501. package/dist/data/parsers/pdf.test.js.map +0 -7
  502. package/dist/data/profiler.d.ts +0 -29
  503. package/dist/data/profiler.d.ts.map +0 -1
  504. package/dist/data/queries.d.ts +0 -95
  505. package/dist/data/queries.d.ts.map +0 -1
  506. package/dist/data/types.d.ts +0 -103
  507. package/dist/data/types.d.ts.map +0 -1
  508. package/dist/db/database.d.ts +0 -190
  509. package/dist/db/database.d.ts.map +0 -1
  510. package/dist/docs/formats/asciidoc.d.ts +0 -9
  511. package/dist/docs/formats/asciidoc.d.ts.map +0 -1
  512. package/dist/docs/formats/html.d.ts +0 -10
  513. package/dist/docs/formats/html.d.ts.map +0 -1
  514. package/dist/docs/formats/index.d.ts +0 -31
  515. package/dist/docs/formats/index.d.ts.map +0 -1
  516. package/dist/docs/formats/markdown.d.ts +0 -11
  517. package/dist/docs/formats/markdown.d.ts.map +0 -1
  518. package/dist/docs/formats/openapi.d.ts +0 -17
  519. package/dist/docs/formats/openapi.d.ts.map +0 -1
  520. package/dist/docs/formats/org.d.ts +0 -9
  521. package/dist/docs/formats/org.d.ts.map +0 -1
  522. package/dist/docs/formats/plaintext.d.ts +0 -11
  523. package/dist/docs/formats/plaintext.d.ts.map +0 -1
  524. package/dist/docs/formats/rdoc.d.ts +0 -10
  525. package/dist/docs/formats/rdoc.d.ts.map +0 -1
  526. package/dist/docs/formats/rst.d.ts +0 -11
  527. package/dist/docs/formats/rst.d.ts.map +0 -1
  528. package/dist/docs/indexer.d.ts +0 -49
  529. package/dist/docs/indexer.d.ts.map +0 -1
  530. package/dist/docs/linker.d.ts +0 -30
  531. package/dist/docs/linker.d.ts.map +0 -1
  532. package/dist/docs/lint.d.ts +0 -27
  533. package/dist/docs/lint.d.ts.map +0 -1
  534. package/dist/docs/queries.d.ts +0 -78
  535. package/dist/docs/queries.d.ts.map +0 -1
  536. package/dist/docs/section-id.d.ts +0 -48
  537. package/dist/docs/section-id.d.ts.map +0 -1
  538. package/dist/docs/summarizer.d.ts +0 -13
  539. package/dist/docs/summarizer.d.ts.map +0 -1
  540. package/dist/docs/types.d.ts +0 -71
  541. package/dist/docs/types.d.ts.map +0 -1
  542. package/dist/docs/vectors.d.ts +0 -54
  543. package/dist/docs/vectors.d.ts.map +0 -1
  544. package/dist/errors.d.ts +0 -49
  545. package/dist/errors.d.ts.map +0 -1
  546. package/dist/extraction/extractor.d.ts +0 -29
  547. package/dist/extraction/extractor.d.ts.map +0 -1
  548. package/dist/extraction/grammars.d.ts +0 -54
  549. package/dist/extraction/grammars.d.ts.map +0 -1
  550. package/dist/extraction/languages.d.ts +0 -9
  551. package/dist/extraction/languages.d.ts.map +0 -1
  552. package/dist/extraction/notebook.d.ts +0 -14
  553. package/dist/extraction/notebook.d.ts.map +0 -1
  554. package/dist/frameworks/amplify.d.ts +0 -9
  555. package/dist/frameworks/amplify.d.ts.map +0 -1
  556. package/dist/frameworks/angular.d.ts +0 -9
  557. package/dist/frameworks/angular.d.ts.map +0 -1
  558. package/dist/frameworks/ansible.d.ts +0 -8
  559. package/dist/frameworks/ansible.d.ts.map +0 -1
  560. package/dist/frameworks/cloudformation.d.ts +0 -9
  561. package/dist/frameworks/cloudformation.d.ts.map +0 -1
  562. package/dist/frameworks/csharp.d.ts +0 -8
  563. package/dist/frameworks/csharp.d.ts.map +0 -1
  564. package/dist/frameworks/docker.d.ts +0 -9
  565. package/dist/frameworks/docker.d.ts.map +0 -1
  566. package/dist/frameworks/elixir.d.ts +0 -6
  567. package/dist/frameworks/elixir.d.ts.map +0 -1
  568. package/dist/frameworks/express.d.ts +0 -8
  569. package/dist/frameworks/express.d.ts.map +0 -1
  570. package/dist/frameworks/flutter.d.ts +0 -12
  571. package/dist/frameworks/flutter.d.ts.map +0 -1
  572. package/dist/frameworks/go.d.ts +0 -8
  573. package/dist/frameworks/go.d.ts.map +0 -1
  574. package/dist/frameworks/iac.d.ts +0 -10
  575. package/dist/frameworks/iac.d.ts.map +0 -1
  576. package/dist/frameworks/index.d.ts +0 -44
  577. package/dist/frameworks/index.d.ts.map +0 -1
  578. package/dist/frameworks/java.d.ts +0 -8
  579. package/dist/frameworks/java.d.ts.map +0 -1
  580. package/dist/frameworks/kubernetes.d.ts +0 -9
  581. package/dist/frameworks/kubernetes.d.ts.map +0 -1
  582. package/dist/frameworks/laravel.d.ts +0 -9
  583. package/dist/frameworks/laravel.d.ts.map +0 -1
  584. package/dist/frameworks/pulumi.d.ts +0 -9
  585. package/dist/frameworks/pulumi.d.ts.map +0 -1
  586. package/dist/frameworks/python.d.ts +0 -10
  587. package/dist/frameworks/python.d.ts.map +0 -1
  588. package/dist/frameworks/react.d.ts +0 -9
  589. package/dist/frameworks/react.d.ts.map +0 -1
  590. package/dist/frameworks/ruby.d.ts +0 -8
  591. package/dist/frameworks/ruby.d.ts.map +0 -1
  592. package/dist/frameworks/rust.d.ts +0 -8
  593. package/dist/frameworks/rust.d.ts.map +0 -1
  594. package/dist/frameworks/scala.d.ts +0 -6
  595. package/dist/frameworks/scala.d.ts.map +0 -1
  596. package/dist/frameworks/solidity.d.ts +0 -6
  597. package/dist/frameworks/solidity.d.ts.map +0 -1
  598. package/dist/frameworks/svelte.d.ts +0 -8
  599. package/dist/frameworks/svelte.d.ts.map +0 -1
  600. package/dist/frameworks/swift.d.ts +0 -10
  601. package/dist/frameworks/swift.d.ts.map +0 -1
  602. package/dist/frameworks/terraform.d.ts +0 -14
  603. package/dist/frameworks/terraform.d.ts.map +0 -1
  604. package/dist/frameworks/types.d.ts +0 -37
  605. package/dist/frameworks/types.d.ts.map +0 -1
  606. package/dist/frameworks/vue.d.ts +0 -7
  607. package/dist/frameworks/vue.d.ts.map +0 -1
  608. package/dist/graph/communities.d.ts +0 -43
  609. package/dist/graph/communities.d.ts.map +0 -1
  610. package/dist/graph/flows.d.ts +0 -55
  611. package/dist/graph/flows.d.ts.map +0 -1
  612. package/dist/graph/queries.d.ts +0 -53
  613. package/dist/graph/queries.d.ts.map +0 -1
  614. package/dist/graph/refactor.d.ts +0 -43
  615. package/dist/graph/refactor.d.ts.map +0 -1
  616. package/dist/graph/traversal.d.ts +0 -35
  617. package/dist/graph/traversal.d.ts.map +0 -1
  618. package/dist/index.d.ts +0 -134
  619. package/dist/index.d.ts.map +0 -1
  620. package/dist/installer/index.d.ts +0 -10
  621. package/dist/installer/index.d.ts.map +0 -1
  622. package/dist/installer/index.js +0 -526
  623. package/dist/installer/index.js.map +0 -1
  624. package/dist/mcp/cache.d.ts +0 -69
  625. package/dist/mcp/cache.d.ts.map +0 -1
  626. package/dist/mcp/read-modes.d.ts +0 -31
  627. package/dist/mcp/read-modes.d.ts.map +0 -1
  628. package/dist/mcp/server.d.ts +0 -17
  629. package/dist/mcp/server.d.ts.map +0 -1
  630. package/dist/mcp/tool-names.d.ts +0 -2
  631. package/dist/mcp/tool-names.d.ts.map +0 -1
  632. package/dist/mcp/tools.d.ts +0 -49
  633. package/dist/mcp/tools.d.ts.map +0 -1
  634. package/dist/mcp/transport.d.ts +0 -29
  635. package/dist/mcp/transport.d.ts.map +0 -1
  636. package/dist/memory/compress.d.ts +0 -19
  637. package/dist/memory/compress.d.ts.map +0 -1
  638. package/dist/memory/database.d.ts +0 -92
  639. package/dist/memory/database.d.ts.map +0 -1
  640. package/dist/memory/index.d.ts +0 -71
  641. package/dist/memory/index.d.ts.map +0 -1
  642. package/dist/memory/symbols.d.ts +0 -21
  643. package/dist/memory/symbols.d.ts.map +0 -1
  644. package/dist/memory/types.d.ts +0 -78
  645. package/dist/memory/types.d.ts.map +0 -1
  646. package/dist/memory/vectors.d.ts +0 -43
  647. package/dist/memory/vectors.d.ts.map +0 -1
  648. package/dist/patterns/graph.d.ts +0 -16
  649. package/dist/patterns/graph.d.ts.map +0 -1
  650. package/dist/patterns/index.d.ts +0 -4
  651. package/dist/patterns/index.d.ts.map +0 -1
  652. package/dist/patterns/indexer.d.ts +0 -15
  653. package/dist/patterns/indexer.d.ts.map +0 -1
  654. package/dist/patterns/loader.d.ts +0 -18
  655. package/dist/patterns/loader.d.ts.map +0 -1
  656. package/dist/patterns/runner.d.ts +0 -42
  657. package/dist/patterns/runner.d.ts.map +0 -1
  658. package/dist/patterns/types.d.ts +0 -27
  659. package/dist/patterns/types.d.ts.map +0 -1
  660. package/dist/resolution/bridges/android-rn.d.ts +0 -13
  661. package/dist/resolution/bridges/android-rn.d.ts.map +0 -1
  662. package/dist/resolution/bridges/expo-modules.d.ts +0 -10
  663. package/dist/resolution/bridges/expo-modules.d.ts.map +0 -1
  664. package/dist/resolution/bridges/flutter-channel.d.ts +0 -14
  665. package/dist/resolution/bridges/flutter-channel.d.ts.map +0 -1
  666. package/dist/resolution/bridges/index.d.ts +0 -40
  667. package/dist/resolution/bridges/index.d.ts.map +0 -1
  668. package/dist/resolution/bridges/native-events.d.ts +0 -10
  669. package/dist/resolution/bridges/native-events.d.ts.map +0 -1
  670. package/dist/resolution/bridges/native-views.d.ts +0 -13
  671. package/dist/resolution/bridges/native-views.d.ts.map +0 -1
  672. package/dist/resolution/bridges/react-native.d.ts +0 -9
  673. package/dist/resolution/bridges/react-native.d.ts.map +0 -1
  674. package/dist/resolution/bridges/swift-objc.d.ts +0 -14
  675. package/dist/resolution/bridges/swift-objc.d.ts.map +0 -1
  676. package/dist/resolution/bridges/turbomodules.d.ts +0 -10
  677. package/dist/resolution/bridges/turbomodules.d.ts.map +0 -1
  678. package/dist/resolution/index.d.ts +0 -81
  679. package/dist/resolution/index.d.ts.map +0 -1
  680. package/dist/resolution/name-matcher.d.ts +0 -25
  681. package/dist/resolution/name-matcher.d.ts.map +0 -1
  682. package/dist/scripts/postinstall.js +0 -64
  683. package/dist/search/query-utils.d.ts +0 -21
  684. package/dist/search/query-utils.d.ts.map +0 -1
  685. package/dist/search/searcher.d.ts +0 -15
  686. package/dist/search/searcher.d.ts.map +0 -1
  687. package/dist/security/attack-surface.d.ts +0 -46
  688. package/dist/security/attack-surface.d.ts.map +0 -1
  689. package/dist/security/context-warnings.d.ts +0 -40
  690. package/dist/security/context-warnings.d.ts.map +0 -1
  691. package/dist/security/data-flows.d.ts +0 -33
  692. package/dist/security/data-flows.d.ts.map +0 -1
  693. package/dist/security/dep-confusion.d.ts +0 -23
  694. package/dist/security/dep-confusion.d.ts.map +0 -1
  695. package/dist/security/errors.d.ts +0 -16
  696. package/dist/security/errors.d.ts.map +0 -1
  697. package/dist/security/export/fix-suggestions.d.ts +0 -21
  698. package/dist/security/export/fix-suggestions.d.ts.map +0 -1
  699. package/dist/security/export/sbom.d.ts +0 -33
  700. package/dist/security/export/sbom.d.ts.map +0 -1
  701. package/dist/security/export/serialization.d.ts +0 -62
  702. package/dist/security/export/serialization.d.ts.map +0 -1
  703. package/dist/security/export/vex.d.ts +0 -58
  704. package/dist/security/export/vex.d.ts.map +0 -1
  705. package/dist/security/index.d.ts +0 -21
  706. package/dist/security/index.d.ts.map +0 -1
  707. package/dist/security/integrator.d.ts +0 -63
  708. package/dist/security/integrator.d.ts.map +0 -1
  709. package/dist/security/license.d.ts +0 -33
  710. package/dist/security/license.d.ts.map +0 -1
  711. package/dist/security/manifest/adapter.d.ts +0 -92
  712. package/dist/security/manifest/adapter.d.ts.map +0 -1
  713. package/dist/security/manifest/parser.d.ts +0 -73
  714. package/dist/security/manifest/parser.d.ts.map +0 -1
  715. package/dist/security/manifest/plugins/cargo.d.ts +0 -11
  716. package/dist/security/manifest/plugins/cargo.d.ts.map +0 -1
  717. package/dist/security/manifest/plugins/composer.d.ts +0 -11
  718. package/dist/security/manifest/plugins/composer.d.ts.map +0 -1
  719. package/dist/security/manifest/plugins/go.d.ts +0 -12
  720. package/dist/security/manifest/plugins/go.d.ts.map +0 -1
  721. package/dist/security/manifest/plugins/gradle.d.ts +0 -12
  722. package/dist/security/manifest/plugins/gradle.d.ts.map +0 -1
  723. package/dist/security/manifest/plugins/hex.d.ts +0 -11
  724. package/dist/security/manifest/plugins/hex.d.ts.map +0 -1
  725. package/dist/security/manifest/plugins/maven.d.ts +0 -11
  726. package/dist/security/manifest/plugins/maven.d.ts.map +0 -1
  727. package/dist/security/manifest/plugins/npm.d.ts +0 -11
  728. package/dist/security/manifest/plugins/npm.d.ts.map +0 -1
  729. package/dist/security/manifest/plugins/nuget.d.ts +0 -12
  730. package/dist/security/manifest/plugins/nuget.d.ts.map +0 -1
  731. package/dist/security/manifest/plugins/pip.d.ts +0 -11
  732. package/dist/security/manifest/plugins/pip.d.ts.map +0 -1
  733. package/dist/security/manifest/plugins/pubspec.d.ts +0 -11
  734. package/dist/security/manifest/plugins/pubspec.d.ts.map +0 -1
  735. package/dist/security/manifest/plugins/pyproject.d.ts +0 -3
  736. package/dist/security/manifest/plugins/pyproject.d.ts.map +0 -1
  737. package/dist/security/manifest/plugins/rubygems.d.ts +0 -11
  738. package/dist/security/manifest/plugins/rubygems.d.ts.map +0 -1
  739. package/dist/security/manifest/plugins/swift.d.ts +0 -11
  740. package/dist/security/manifest/plugins/swift.d.ts.map +0 -1
  741. package/dist/security/owasp.d.ts +0 -16
  742. package/dist/security/owasp.d.ts.map +0 -1
  743. package/dist/security/pipeline.d.ts +0 -37
  744. package/dist/security/pipeline.d.ts.map +0 -1
  745. package/dist/security/reachability.d.ts +0 -67
  746. package/dist/security/reachability.d.ts.map +0 -1
  747. package/dist/security/remediation.d.ts +0 -51
  748. package/dist/security/remediation.d.ts.map +0 -1
  749. package/dist/security/secrets.d.ts +0 -38
  750. package/dist/security/secrets.d.ts.map +0 -1
  751. package/dist/security/staleness.d.ts +0 -43
  752. package/dist/security/staleness.d.ts.map +0 -1
  753. package/dist/security/supply-chain.d.ts +0 -34
  754. package/dist/security/supply-chain.d.ts.map +0 -1
  755. package/dist/security/suppressions.d.ts +0 -18
  756. package/dist/security/suppressions.d.ts.map +0 -1
  757. package/dist/security/types.d.ts +0 -144
  758. package/dist/security/types.d.ts.map +0 -1
  759. package/dist/security/vuln/client.d.ts +0 -90
  760. package/dist/security/vuln/client.d.ts.map +0 -1
  761. package/dist/security/vuln/epss-client.d.ts +0 -26
  762. package/dist/security/vuln/epss-client.d.ts.map +0 -1
  763. package/dist/security/vuln/index.d.ts +0 -6
  764. package/dist/security/vuln/index.d.ts.map +0 -1
  765. package/dist/security/vuln/osv-adapter.d.ts +0 -58
  766. package/dist/security/vuln/osv-adapter.d.ts.map +0 -1
  767. package/dist/security/vuln/types.d.ts +0 -29
  768. package/dist/security/vuln/types.d.ts.map +0 -1
  769. package/dist/sync/index.d.ts +0 -35
  770. package/dist/sync/index.d.ts.map +0 -1
  771. package/dist/types.d.ts +0 -137
  772. package/dist/types.d.ts.map +0 -1
  773. package/dist/utils.d.ts +0 -52
  774. package/dist/utils.d.ts.map +0 -1
  775. package/dist/vectors/index.d.ts +0 -79
  776. package/dist/vectors/index.d.ts.map +0 -1
  777. package/dist/vectors/lancedb-index.d.ts +0 -50
  778. package/dist/vectors/lancedb-index.d.ts.map +0 -1
  779. package/dist/vectors/orama-index.d.ts +0 -54
  780. package/dist/vectors/orama-index.d.ts.map +0 -1
  781. package/dist/vectors/pglite-index.d.ts +0 -53
  782. package/dist/vectors/pglite-index.d.ts.map +0 -1
  783. package/dist/vectors/qdrant-index.d.ts +0 -77
  784. package/dist/vectors/qdrant-index.d.ts.map +0 -1
  785. package/dist/vectors/typesense-index.d.ts +0 -75
  786. package/dist/vectors/typesense-index.d.ts.map +0 -1
  787. package/dist/vectors/vec-index.d.ts +0 -52
  788. package/dist/vectors/vec-index.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/mcp/tools.ts"],
4
- "sourcesContent": ["/**\n * KiroGraph MCP Tool Definitions + Handlers\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { execSync } from 'child_process';\nimport KiroGraph, { findNearestKiroGraphRoot } from '../index';\nimport type { NodeKind } from '../types';\nimport { logError } from '../errors';\nimport { compress, estimateTokens, detectCommandFamily } from '../compression/index';\nimport { TokenTracker } from '../compression/tracker';\nexport { KIROGRAPH_TOOL_NAMES } from './tool-names';\n\nconst MAX_OUTPUT = 15_000;\n\nfunction truncate(s: string): string {\n return s.length > MAX_OUTPUT ? s.slice(0, MAX_OUTPUT) + '\\n\u2026[truncated]' : s;\n}\n\n/** Estimate how many tokens reading the full files would cost (chars / 4 heuristic). */\nfunction estimateFileTokens(projectRoot: string, filePaths: string[]): number {\n let total = 0;\n for (const fp of filePaths) {\n try {\n const fullPath = path.isAbsolute(fp) ? fp : path.join(projectRoot, fp);\n const stat = fs.statSync(fullPath);\n total += Math.round(stat.size / 4);\n } catch {\n // File may not exist or be unreadable \u2014 skip\n }\n }\n return total;\n}\n\nfunction clampLimit(value: number | undefined, defaultValue: number): number {\n const n = typeof value === 'number' ? value : defaultValue;\n return Math.max(1, Math.min(100, Math.round(n)));\n}\n\n/** Map internal kind values to human-readable MCP response kinds. */\nfunction mapKind(kind: string): string {\n if (kind === 'type_alias') return 'type';\n return kind;\n}\n\n/** Write a session marker so hooks can detect MCP was consulted. */\nfunction writeSessionMarker(projectRoot: string): void {\n try {\n const hash = crypto.createHash('sha256').update(projectRoot).digest('hex').slice(0, 16);\n fs.writeFileSync(`/tmp/kirograph-consulted-${hash}`, String(Date.now()));\n } catch { /* best-effort */ }\n}\n\n/** Format a timestamp as a human-readable relative age. */\nfunction formatAge(timestamp: number): string {\n const diff = Date.now() - timestamp;\n const minutes = Math.floor(diff / 60000);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, { type: string; description: string; enum?: string[]; default?: unknown }>;\n required?: string[];\n };\n}\n\nexport const tools: ToolDefinition[] = [\n {\n name: 'kirograph_search',\n description: 'Quick symbol search by name. Returns locations only (no code). Use kirograph_context for comprehensive task context.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Symbol name or partial name (e.g., \"auth\", \"signIn\", \"UserService\")' },\n kind: {\n type: 'string',\n description: 'Filter by node kind',\n enum: ['function', 'method', 'class', 'interface', 'type_alias', 'variable', 'route', 'component'],\n },\n limit: { type: 'number', description: 'Max results 1-100 (default: 10)', default: 10 },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_context',\n description: 'Build comprehensive context for a task or feature request.',\n inputSchema: {\n type: 'object',\n properties: {\n task: { type: 'string', description: 'Task description or feature name' },\n maxNodes: { type: 'number', description: 'Max symbols to include', default: 20 },\n includeCode: { type: 'boolean', description: 'Include code snippets. Deprecated \u2014 prefer detail.', default: true },\n detail: {\n type: 'string',\n description: 'Code verbosity: full, signatures, or summary',\n enum: ['full', 'signatures', 'summary'],\n default: 'full',\n },\n projectPath: { type: 'string' },\n },\n required: ['task'],\n },\n },\n {\n name: 'kirograph_callers',\n description: 'Find all functions/methods that call a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find callers for' },\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_callees',\n description: 'Find all functions/methods that a specific symbol calls.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find callees for' },\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_impact',\n description: 'Analyze what code would be affected by changing a symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to analyze impact for' },\n depth: { type: 'number', description: 'Traversal depth (default: 2)', default: 2 },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_node',\n description: 'Get details about a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to look up' },\n includeCode: { type: 'boolean', description: 'Include full source code. Deprecated \u2014 prefer detail.', default: false },\n detail: {\n type: 'string',\n description: 'Output level: summary, signatures, or full',\n enum: ['summary', 'signatures', 'full'],\n default: 'summary',\n },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_status',\n description: 'Check index health and statistics.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_files',\n description: 'List indexed file structure with optional filtering.',\n inputSchema: {\n type: 'object',\n properties: {\n filterPath: { type: 'string', description: 'Filter by directory path prefix (e.g., \"src/\")' },\n pattern: { type: 'string', description: 'Filter by glob pattern (e.g., \"**/*.ts\")' },\n maxDepth: { type: 'number', description: 'Max directory depth to traverse' },\n format: {\n type: 'string',\n description: 'Output format: \"tree\" (default, visual tree), \"flat\" (one path per line), \"grouped\" (grouped by directory), \"compact\" (rtk-style summary with counts)',\n enum: ['tree', 'flat', 'grouped', 'compact'],\n default: 'tree',\n },\n includeMetadata: { type: 'boolean', description: 'Include language and symbol count', default: true },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_dead_code',\n description: 'Find symbols with no incoming references (potential dead code). Only includes unexported symbols.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 50)', default: 50 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_circular_deps',\n description: 'Find circular import dependencies in the codebase.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_path',\n description: 'Find the shortest path between two symbols in the graph.',\n inputSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source symbol name' },\n to: { type: 'string', description: 'Target symbol name' },\n projectPath: { type: 'string' },\n },\n required: ['from', 'to'],\n },\n },\n {\n name: 'kirograph_architecture',\n description: 'Show high-level architecture: packages, layers, dependencies.',\n inputSchema: {\n type: 'object',\n properties: {\n level: {\n type: 'string',\n description: 'packages, layers, or both',\n enum: ['packages', 'layers', 'both'],\n default: 'both',\n },\n includeFiles: { type: 'boolean', description: 'Include per-file package/layer assignments', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_coupling',\n description: 'Package coupling metrics: Ca, Ce, and instability (Ce/(Ca+Ce)).',\n inputSchema: {\n type: 'object',\n properties: {\n sortBy: {\n type: 'string',\n description: 'Sort by instability, ca, ce, or name',\n enum: ['instability', 'afferent', 'efferent'],\n default: 'instability',\n },\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_package',\n description: 'Drill into a package: files, exports, and dependencies.',\n inputSchema: {\n type: 'object',\n properties: {\n package: { type: 'string', description: 'Package name or path (partial match accepted)' },\n includeFiles: { type: 'boolean', description: 'List files in the package (default: true)', default: true },\n projectPath: { type: 'string' },\n },\n required: ['package'],\n },\n },\n {\n name: 'kirograph_hotspots',\n description: 'Find the most-connected symbols in the codebase by total edge degree (incoming + outgoing). Useful for identifying load-bearing code, core abstractions, or blast-radius hot zones.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_surprising',\n description: 'Find non-obvious cross-file connections: direct edges between symbols in structurally distant parts of the codebase. High-score pairs indicate unexpected coupling worth investigating.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_diff',\n description: 'Compare current graph against a saved snapshot.',\n inputSchema: {\n type: 'object',\n properties: {\n snapshot: { type: 'string', description: 'Snapshot label; omit for latest' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_snapshot_save',\n description: 'Save a snapshot of the current graph state. Snapshots can be compared with kirograph_diff to track structural changes over time.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Label for the snapshot (default: timestamp-based label)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_snapshot_list',\n description: 'List all saved graph snapshots with their labels, timestamps, and symbol/edge counts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_type_hierarchy',\n description: 'Traverse base and derived types of a class or interface.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Class or interface name' },\n direction: {\n type: 'string',\n description: 'up=base, down=derived, both=all',\n enum: ['up', 'down', 'both'],\n default: 'both',\n },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_exec',\n description: 'Run a shell command with token-optimized, noise-filtered output.',\n inputSchema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Shell command to execute' },\n cwd: { type: 'string', description: 'Working directory' },\n level: {\n type: 'string',\n description: 'Compression level: \"normal\" (balanced), \"aggressive\" (more compact), \"ultra\" (maximum compression)',\n enum: ['normal', 'aggressive', 'ultra'],\n default: 'normal',\n },\n timeout: { type: 'number', description: 'Timeout in seconds', default: 60 },\n projectPath: { type: 'string' },\n },\n required: ['command'],\n },\n },\n {\n name: 'kirograph_gain',\n description: 'Show token savings from graph tools and shell compression.',\n inputSchema: {\n type: 'object',\n properties: {\n period: {\n type: 'string',\n description: 'Time window: session, hour, day, week, all',\n enum: ['session', 'today', 'week', 'all'],\n default: 'session',\n },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_read',\n description: 'Read a file with caching; unchanged files return cache marker.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path to read (absolute or relative to project root)' },\n mode: {\n type: 'string',\n description: 'Read mode: \"full\" (default), \"map\" (structure overview), \"signatures\" (function signatures), \"diff\" (changes since last read), \"lines\" (line range), \"imports\", \"exports\"',\n enum: ['full', 'map', 'signatures', 'diff', 'lines', 'imports', 'exports'],\n default: 'full',\n },\n start: { type: 'number', description: 'Start line (for lines mode)' },\n end: { type: 'number', description: 'End line (for lines mode)' },\n noCache: { type: 'boolean', description: 'Force fresh read, bypass cache', default: false },\n projectPath: { type: 'string' },\n },\n required: ['path'],\n },\n },\n {\n name: 'kirograph_retrieve',\n description: 'Retrieve cached file content by path (CCR \u2014 Cached Content Retrieval). Returns the full content stored in the session cache, or reads and caches the file if not yet seen. Use after kirograph_read returns a \"[cached: file unchanged]\" marker to get the actual content without a redundant filesystem read.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path to retrieve (absolute or relative to project root)' },\n projectPath: { type: 'string' },\n },\n required: ['path'],\n },\n },\n {\n name: 'kirograph_compress',\n description: 'Compress text via rtk shell filters or caveman grammar engine.',\n inputSchema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Text to compress' },\n command: { type: 'string', description: 'Shell command text came from (selects rtk engine)' },\n level: {\n type: 'string',\n description: 'Compression intensity: \"lite\" / \"normal\" (light), \"full\" / \"aggressive\" (default), \"ultra\" (maximum)',\n enum: ['lite', 'normal', 'full', 'aggressive', 'ultra'],\n default: 'full',\n },\n },\n required: ['text'],\n },\n },\n {\n name: 'kirograph_budget',\n description: 'Show session context budget: tokens used, remaining, utilization.',\n inputSchema: {\n type: 'object',\n properties: {\n reset: { type: 'boolean', description: 'Reset session budget counters', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_flows',\n description: 'Trace execution flows from entry points through the call graph.',\n inputSchema: {\n type: 'object',\n properties: {\n entryPoint: { type: 'string', description: 'Symbol to trace; omit to auto-detect' },\n maxFlows: { type: 'number', description: 'Max number of flows to return (default 10)' },\n maxDepth: { type: 'number', description: 'Max call chain depth (default 10)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_communities',\n description: 'Detect clusters of related symbols via graph community detection.',\n inputSchema: {\n type: 'object',\n properties: {\n resolution: { type: 'number', description: 'Granularity 0.1\u20132.0; higher=more smaller clusters' },\n limit: { type: 'number', description: 'Max communities to return (default 15)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_refactor',\n description: 'Rename preview (all references) or function summarization.',\n inputSchema: {\n type: 'object',\n properties: {\n mode: { type: 'string', description: 'rename=preview references, summarize=summary', enum: ['rename', 'suggest'] },\n symbol: { type: 'string', description: 'Symbol name (required for rename mode)' },\n limit: { type: 'number', description: 'Max results (default 10)' },\n projectPath: { type: 'string' },\n },\n required: ['mode'],\n },\n },\n // \u2500\u2500 Memory tools (require enableMemory=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_mem_search',\n description: 'Search project memory for decisions, errors, patterns, context.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Natural language search query' },\n kind: {\n type: 'string',\n description: 'Filter by observation kind',\n enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'],\n },\n limit: { type: 'number', description: 'Max results (default: 10)', default: 10 },\n sessionId: { type: 'string', description: 'Filter to specific session' },\n asOf: { type: 'number', description: 'Query facts valid at this timestamp (epoch ms). Filters out expired/superseded observations.' },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_mem_store',\n description: 'Store an observation in project memory.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Observation text' },\n kind: {\n type: 'string',\n description: 'Observation kind',\n enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'],\n default: 'note',\n },\n projectPath: { type: 'string' },\n topicKey: { type: 'string', description: \"Stable semantic key for this observation (e.g. 'architecture/auth-model'). Enables addressing by concept.\" },\n reviewAfter: { type: 'number', description: 'ISO date to flag for review' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_timeline',\n description: 'List recent sessions and their observations chronologically.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Number of sessions to show', default: 5 },\n sessionId: { type: 'string', description: 'Show observations for a specific session' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_status',\n description: 'Memory subsystem health: sessions, observations, embeddings, size.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Engram-parity mem tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_mem_review',\n description: 'List observations past their review_after date.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_mark_reviewed',\n description: 'Clear review_after date on an observation.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Observation ID' },\n projectPath: { type: 'string' },\n },\n required: ['id'],\n },\n },\n {\n name: 'kirograph_mem_compare',\n description: 'Establish a typed relation between two observations (supersedes, conflicts_with, compatible, scoped, related, not_conflict). Accepts observation IDs or topic_key values.',\n inputSchema: {\n type: 'object',\n properties: {\n observationA: { type: 'string', description: 'First observation ID or topic_key' },\n observationB: { type: 'string', description: 'Second observation ID or topic_key' },\n relation: { type: 'string', enum: ['supersedes', 'conflicts_with', 'compatible', 'scoped', 'related', 'not_conflict'], description: 'Relation type' },\n confidence: { type: 'number', description: 'Confidence 0.0\u20131.0 (default: 1.0)' },\n reason: { type: 'string', description: 'Explanation of the relation' },\n evidence: { type: 'string', description: 'Supporting evidence text' },\n projectPath: { type: 'string' },\n },\n required: ['observationA', 'observationB', 'relation'],\n },\n },\n {\n name: 'kirograph_mem_judge',\n description: 'Finalize a pending conflict relation \u2014 confirm, revise, or dismiss it.',\n inputSchema: {\n type: 'object',\n properties: {\n relationId: { type: 'string', description: 'Relation ID (from kirograph_mem_compare or kirograph_mem_search)' },\n relation: { type: 'string', enum: ['supersedes', 'conflicts_with', 'compatible', 'scoped', 'related', 'not_conflict'], description: 'Final relation type' },\n confidence: { type: 'number', description: 'Final confidence 0.0\u20131.0' },\n reason: { type: 'string', description: 'Reasoning' },\n evidence: { type: 'string', description: 'Supporting evidence' },\n projectPath: { type: 'string' },\n },\n required: ['relationId', 'relation', 'confidence'],\n },\n },\n {\n name: 'kirograph_mem_capture',\n description: 'Extract and store structured learnings from freeform text.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Text block with structured sections' },\n projectPath: { type: 'string' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_save_prompt',\n description: 'Save the current user prompt to session memory.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'The user prompt text to save' },\n projectPath: { type: 'string' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_suggest_topic_key',\n description: 'Suggest a stable topic_key slug for an observation.',\n inputSchema: {\n type: 'object',\n properties: {\n kind: { type: 'string', enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'], description: 'Observation kind' },\n title: { type: 'string', description: 'Short description of the observation' },\n projectPath: { type: 'string' },\n },\n required: ['kind', 'title'],\n },\n },\n {\n name: 'kirograph_mem_conflicts_scan',\n description: 'Scan recent observations for potential conflicts using FTS.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max observations to scan (default: 50)', default: 50 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_prune',\n description: 'Remove memory observations older than a given duration.',\n inputSchema: {\n type: 'object',\n properties: {\n olderThan: { type: 'string', description: 'Duration threshold e.g. \"90d\" or \"6m\"', default: '90d' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_lint',\n description: 'Health check: stale links, model mismatch, orphaned sessions.',\n inputSchema: {\n type: 'object',\n properties: {\n fix: { type: 'boolean', description: 'Auto-remove stale links', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_conflicts_list',\n description: 'List pending conflict relations needing resolution.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_conflicts_ignore',\n description: 'Dismiss a pending conflict relation as not relevant.',\n inputSchema: {\n type: 'object',\n properties: {\n relationId: { type: 'string', description: 'Relation ID to ignore (from kirograph_mem_conflicts_list)' },\n projectPath: { type: 'string' },\n },\n required: ['relationId'],\n },\n },\n // \u2500\u2500 Wiki tools (require enableWiki=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_wiki_ingest',\n description: 'Build ingest prompt for LLM to produce a WIKI_DIFF.',\n inputSchema: {\n type: 'object',\n properties: {\n source: { type: 'string', description: 'Source content to ingest (markdown, notes, ADR text, etc.)' },\n sourceName: { type: 'string', description: 'Name or path of the source', default: 'source' },\n projectPath: { type: 'string' },\n },\n required: ['source'],\n },\n },\n {\n name: 'kirograph_wiki_apply_diff',\n description: 'Apply a WIKI_DIFF to the wiki filesystem and SQLite index.',\n inputSchema: {\n type: 'object',\n properties: {\n diff: { type: 'string', description: 'WIKI_DIFF string with WIKI_DIFF_START/END blocks' },\n projectPath: { type: 'string' },\n },\n required: ['diff'],\n },\n },\n {\n name: 'kirograph_wiki_search',\n description: 'FTS over wiki pages; returns slugs, titles, previews.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', description: 'Max results (default: 5)', default: 5 },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_wiki_page',\n description: 'Retrieve full markdown of a wiki page by slug.',\n inputSchema: {\n type: 'object',\n properties: {\n slug: { type: 'string', description: 'Page slug (e.g. \"arch/auth-model\")' },\n projectPath: { type: 'string' },\n },\n required: ['slug'],\n },\n },\n {\n name: 'kirograph_wiki_lint',\n description: 'Check wiki for broken links, orphans, stale sources, contradictions.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_list',\n description: 'List all wiki pages with slug, title, source count, date.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_synthesize',\n description: 'Run local-model wiki synthesis: process the pending source queue (requires wikiSynthesisMode: \"local\").',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_init',\n description: 'Initialize the wiki: create SCHEMA.md and MANIFEST.md in .kirograph/wiki/.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_reindex',\n description: 'Rebuild the SQLite index from .kirograph/wiki/*.md files on disk.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_status',\n description: 'Show wiki subsystem stats: page count, total sources, oldest/newest page dates.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Docs tools (require enableDocs=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_docs_toc',\n description: 'Get TOC for a doc file or whole project (IDs, titles, levels, summaries).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Filter to a specific doc file (relative path). Omit for project-wide TOC.' },\n tree: { type: 'boolean', description: 'Return nested tree structure.', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_docs_search',\n description: 'Search documentation sections by query, ranked by relevance.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query (natural language or keywords)' },\n file: { type: 'string', description: 'Limit search to a specific doc file.' },\n limit: { type: 'number', description: 'Max results (default: 10)', default: 10 },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_docs_section',\n description: 'Retrieve full content of a doc section by its stable ID.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Section ID.' },\n context: { type: 'boolean', description: 'Include ancestor headings and child summaries.', default: false },\n projectPath: { type: 'string' },\n },\n required: ['id'],\n },\n },\n {\n name: 'kirograph_docs_outline',\n description: 'Get heading hierarchy for a single documentation file.',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Documentation file path (relative to project root).' },\n projectPath: { type: 'string' },\n },\n required: ['file'],\n },\n },\n {\n name: 'kirograph_docs_refs',\n description: 'Bidirectional lookup: doc section\u2194code symbol references.',\n inputSchema: {\n type: 'object',\n properties: {\n sectionId: { type: 'string', description: 'Doc section ID to find referenced symbols.' },\n nodeId: { type: 'string', description: 'Code symbol ID to find referencing doc sections.' },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Data tools (require enableData=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_data_list',\n description: 'List all indexed datasets with row/column counts and file sizes.',\n inputSchema: { type: 'object', properties: { projectPath: { type: 'string' } } },\n },\n {\n name: 'kirograph_data_describe',\n description: 'Full schema profile: types, cardinality, null%, sample values.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n column: { type: 'string', description: 'Deep-dive on a single column.' },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_query',\n description: 'Filtered row retrieval with structured operators (max 500 rows).',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n filters: { type: 'array', description: 'Array of {column, op, value} filters. Ops: eq, neq, gt, gte, lt, lte, contains, in, is_null, between' },\n columns: { type: 'array', description: 'Column projection (only return these columns)' },\n limit: { type: 'number', description: 'Max rows (default: 100, hard cap: 500)', default: 100 },\n offset: { type: 'number', description: 'Pagination offset', default: 0 },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_aggregate',\n description: 'Server-side GROUP BY aggregation: count, sum, avg, min, max.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n groupBy: { type: 'array', description: 'Columns to group by' },\n metrics: { type: 'array', description: 'Array of {column, op} metrics. Ops: count, sum, avg, min, max, count_distinct' },\n filters: { type: 'array', description: 'Optional pre-filters (same format as kirograph_data_query)' },\n projectPath: { type: 'string' },\n },\n required: ['dataset', 'groupBy', 'metrics'],\n },\n },\n {\n name: 'kirograph_data_search',\n description: 'Search column names and sample values by keyword.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n query: { type: 'string', description: 'Search keyword' },\n projectPath: { type: 'string' },\n },\n required: ['dataset', 'query'],\n },\n },\n {\n name: 'kirograph_data_join',\n description: 'SQL JOIN across two indexed datasets.',\n inputSchema: {\n type: 'object',\n properties: {\n left: { type: 'string', description: 'Left dataset ID' },\n right: { type: 'string', description: 'Right dataset ID' },\n leftColumn: { type: 'string', description: 'Join column from left dataset' },\n rightColumn: { type: 'string', description: 'Join column from right dataset' },\n type: { type: 'string', description: 'Join type: inner (default), left, right', enum: ['inner', 'left', 'right'], default: 'inner' },\n columns: { type: 'array', description: 'Column projection (prefix with dataset ID)' },\n limit: { type: 'number', description: 'Max rows (default: 100, hard cap: 500)', default: 100 },\n projectPath: { type: 'string' },\n },\n required: ['left', 'right', 'leftColumn', 'rightColumn'],\n },\n },\n {\n name: 'kirograph_data_correlations',\n description: 'Pairwise Pearson correlations between numeric columns.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n threshold: { type: 'number', description: 'Min absolute correlation to include (default: 0.3)', default: 0.3 },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_quality',\n description: 'Rank columns by data quality risk: nulls, cardinality, type issues.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_drift',\n description: 'Schema drift between last two index runs: columns, types, row counts.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_history',\n description: 'History of schema snapshots: timestamps, row/column counts, hashes.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n limit: { type: 'number', description: 'Max snapshots to return (default: 10)', default: 10 },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n // \u2500\u2500 Watchmen tools (require enableMemory=true + enableWatchmen=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_watchmen_status',\n description: 'Show watchmen status: pending observation count, synthesis threshold, and which brief files would be written on next synthesis.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_watchmen_synthesize',\n description: 'Run watchmen synthesis immediately using the local model (requires watchmenSynthesisMode: \"local\"). Processes pending observations into a workspace brief.',\n inputSchema: {\n type: 'object',\n properties: {\n force: { type: 'boolean', description: 'Run even if below threshold (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_watchmen_reset',\n description: 'Reset the watchmen synthesis counter by storing a summary observation, without running full synthesis.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Affected tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_affected',\n description: 'Find test files affected by a set of changed source files, by traversing the dependency graph.',\n inputSchema: {\n type: 'object',\n properties: {\n files: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of changed source file paths (relative to project root)',\n },\n depth: { type: 'number', description: 'Max dependency traversal depth (default: 5)', default: 5 },\n testPattern: { type: 'string', description: 'Custom glob to identify test files (optional)' },\n projectPath: { type: 'string' },\n },\n required: ['files'],\n },\n },\n // \u2500\u2500 Security tools (require enableSecurity=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_security',\n description: 'Security overview: vuln counts, verdicts, stale data warnings.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_vulns',\n description: 'List vulns with reachability verdicts, severity, affected components.',\n inputSchema: {\n type: 'object',\n properties: {\n severity: { type: 'string', description: 'Filter by severity level', enum: ['critical', 'high', 'medium', 'low'] },\n verdict: { type: 'string', description: 'Filter by reachability verdict', enum: ['affected', 'not_affected', 'under_investigation'] },\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n refresh: { type: 'boolean', description: 'Trigger fresh vulnerability enrichment before listing (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_vuln_add',\n description: 'Manually register a CVE against a dependency.',\n inputSchema: {\n type: 'object',\n properties: {\n cveId: { type: 'string', description: 'CVE identifier (e.g., \"CVE-2023-12345\")' },\n package: { type: 'string', description: 'Package name to associate the CVE with' },\n severity: { type: 'number', description: 'CVSS v3.1 base score (optional)' },\n summary: { type: 'string', description: 'Vulnerability summary (optional)' },\n fixedVersion: { type: 'string', description: 'Version that fixes the vulnerability (optional)' },\n projectPath: { type: 'string' },\n },\n required: ['cveId', 'package'],\n },\n },\n {\n name: 'kirograph_vuln_suppress',\n description: 'Suppress a CVE from vulnerability reports.',\n inputSchema: {\n type: 'object',\n properties: {\n cveId: { type: 'string', description: 'CVE identifier to suppress (e.g., \"CVE-2024-1234\")' },\n reason: { type: 'string', description: 'Reason for suppression (optional)' },\n expires: { type: 'string', description: 'Expiry date in ISO format after which the suppression is removed (e.g. \"2026-12-31\", optional)' },\n projectPath: { type: 'string' },\n },\n required: ['cveId'],\n },\n },\n {\n name: 'kirograph_sbom',\n description: 'Generate CycloneDX 1.5 SBOM JSON for the project.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_vex',\n description: 'Generate CycloneDX 1.5 VEX JSON with reachability verdicts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_reachability',\n description: 'Check reachability for a dependency or CVE.',\n inputSchema: {\n type: 'object',\n properties: {\n target: { type: 'string', description: 'Dependency name or CVE ID to check reachability for' },\n projectPath: { type: 'string' },\n },\n required: ['target'],\n },\n },\n {\n name: 'kirograph_staleness',\n description: 'Check dependency freshness against latest published versions.',\n inputSchema: {\n type: 'object',\n properties: {\n threshold: { type: 'number', description: 'Only return packages with staleness_score >= threshold (default: 0.3)', default: 0.3 },\n refresh: { type: 'boolean', description: 'Fetch latest version info from registries before listing (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_licenses',\n description: 'Show licenses and check against configured deny/warn policy.',\n inputSchema: {\n type: 'object',\n properties: {\n policy: { type: 'boolean', description: 'Return only policy violations (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_attack_surface',\n description: 'Map HTTP routes to vulnerable deps with hop count and auth status.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max routes to return (default: 20)', default: 20 },\n publicOnly: { type: 'boolean', description: 'Only return public/unauthenticated routes', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_secrets',\n description: 'Scan for hardcoded secrets with call-graph blast radius.',\n inputSchema: {\n type: 'object',\n properties: {\n includeTests: { type: 'boolean', description: 'Include test files in scan', default: false },\n severity: { type: 'string', description: 'Filter by severity: critical, high, medium, low', enum: ['critical', 'high', 'medium', 'low'] },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_security_flows',\n description: 'SAST-lite: detect SQL injection, eval, deserialize, path, crypto flows.',\n inputSchema: {\n type: 'object',\n properties: {\n type: { type: 'string', description: 'Filter by type: sql, eval, deserialize, path, crypto, all', default: 'all' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_supply_chain',\n description: 'OpenSSF Scorecard scores, maintainer count, abandoned package detection.',\n inputSchema: {\n type: 'object',\n properties: {\n threshold: { type: 'string', description: 'Minimum risk level: critical, high, medium', enum: ['critical', 'high', 'medium'] },\n refresh: { type: 'boolean', description: 'Re-fetch from APIs', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_dep_confusion',\n description: 'Detect dependency confusion: internal names in public registries.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_remediation',\n description: 'Remediation SLA tracking: overdue vulns by severity thresholds.',\n inputSchema: {\n type: 'object',\n properties: {\n overdueOnly: { type: 'boolean', description: 'Show only overdue items', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Pattern tools (require enablePatterns=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_pattern_coverage',\n description: 'OWASP Top 10 coverage report: categories covered and match counts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_pattern_save_baseline',\n description: 'Save current pattern match counts as a baseline.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Baseline label (default: \"default\")', default: 'default' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_pattern_diff',\n description: 'Diff pattern matches against a saved baseline.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Baseline label (default: \"default\")', default: 'default' },\n projectPath: { type: 'string' },\n },\n },\n },\n];\n\n/**\n * Dynamic tool definition for kirograph_live_search.\n * NOT included in the static `tools` array \u2014 injected into tools/list at runtime\n * only when config.enablePatterns === true AND @ast-grep/napi is available.\n * NOT added to KIROGRAPH_TOOL_NAMES (which is a static list for Kiro autoApprove).\n */\nexport const LIVE_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n name: 'kirograph_live_search',\n description:\n 'Run a live AST pattern search against the indexed file list using @ast-grep/napi. Finds structural code patterns (SQL injection, eval, path traversal, etc.) without needing the codebase to be re-indexed. Only available when enablePatterns: true.',\n inputSchema: {\n type: 'object' as const,\n required: ['pattern', 'language'],\n properties: {\n pattern: { type: 'string', description: 'ast-grep inline pattern (e.g. \"eval($X)\")' },\n language: { type: 'string', description: 'Language to search: javascript, typescript, python, go, rust, java, etc.' },\n limit: { type: 'number', description: 'Max results (default 20, max 100)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n};\n\nexport class ToolHandler {\n private defaultCg: KiroGraph | null;\n private connections = new Map<string, KiroGraph>();\n /** Anti-loop: track recent data_query calls per dataset for pagination detection. */\n private queryTracker = new Map<string, { offsets: number[]; lastCall: number }>();\n\n constructor(cg: KiroGraph | null) {\n this.defaultCg = cg;\n }\n\n setDefaultKiroGraph(cg: KiroGraph): void {\n this.defaultCg = cg;\n }\n\n /** Close all cached cross-project connections. */\n closeAll(): void {\n for (const cg of this.connections.values()) {\n try { cg.close(); } catch { /* ignore */ }\n }\n this.connections.clear();\n }\n\n /** Anti-loop: detect pagination patterns and warn the agent. */\n private checkPaginationLoop(dataset: string, offset: number | undefined, response: string): string {\n const now = Date.now();\n const key = dataset;\n const currentOffset = offset ?? 0;\n\n // Clean stale entries (older than 60s)\n for (const [k, v] of this.queryTracker) {\n if (now - v.lastCall > 60_000) this.queryTracker.delete(k);\n }\n\n const entry = this.queryTracker.get(key) ?? { offsets: [], lastCall: 0 };\n entry.offsets.push(currentOffset);\n entry.lastCall = now;\n\n // Keep only last 10 offsets\n if (entry.offsets.length > 10) entry.offsets = entry.offsets.slice(-10);\n this.queryTracker.set(key, entry);\n\n // Check for pagination pattern: >5 calls with incrementing offsets\n if (entry.offsets.length > 5) {\n const recent = entry.offsets.slice(-6);\n let isIncrementing = true;\n for (let i = 1; i < recent.length; i++) {\n if (recent[i]! <= recent[i - 1]!) { isIncrementing = false; break; }\n }\n if (isIncrementing) {\n return response + '\\n\\n\u26A0 Pagination detected. Consider using kirograph_data_aggregate for summary statistics instead of paginating through all rows.';\n }\n }\n\n return response;\n }\n\n private async getConnection(projectPath?: string): Promise<KiroGraph | null> {\n if (!projectPath) return this.defaultCg;\n // Normalize and validate: must be an absolute path after resolution\n const resolved = path.resolve(projectPath);\n if (!path.isAbsolute(resolved)) return null;\n if (this.connections.has(resolved)) return this.connections.get(resolved)!;\n try {\n const cg = await KiroGraph.open(resolved);\n this.connections.set(resolved, cg);\n return cg;\n } catch {\n return null;\n }\n }\n\n async handle(toolName: string, args: Record<string, unknown>): Promise<{ content: Array<{ type: 'text'; text: string }>; isError?: boolean }> {\n try {\n const text = await this.dispatch(toolName, args);\n const truncated = truncate(text);\n\n // Track graph/memory tool savings (skip exec/gain \u2014 they track themselves)\n if (toolName !== 'kirograph_exec' && toolName !== 'kirograph_gain') {\n try {\n const projectRoot = (args.projectPath as string) || this.defaultCg?.getProjectRoot() || process.cwd();\n const { estimateNaiveCost } = await Promise.resolve().then(() => require('../compression/naive-cost.js'));\n const { estimateTokens } = await Promise.resolve().then(() => require('../compression/index.js'));\n const outputTokens = estimateTokens(truncated);\n const naiveCost = estimateNaiveCost(toolName, outputTokens, args);\n if (naiveCost !== null && naiveCost > outputTokens) {\n const tracker = new TokenTracker(projectRoot);\n if (toolName.startsWith('kirograph_mem_')) {\n tracker.recordMemorySaving(toolName, outputTokens, naiveCost);\n } else if (toolName.startsWith('kirograph_docs_')) {\n tracker.recordDocsSaving(toolName, outputTokens, naiveCost);\n } else if (toolName.startsWith('kirograph_data_')) {\n tracker.recordDataSaving(toolName, outputTokens, naiveCost);\n } else {\n tracker.recordGraphSaving(toolName, outputTokens, naiveCost);\n }\n }\n } catch { /* non-critical */ }\n }\n\n return { content: [{ type: 'text', text: truncated }] };\n } catch (err) {\n logError('MCP tool error', { tool: toolName, error: err });\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };\n }\n }\n\n private async dispatch(toolName: string, args: Record<string, unknown>): Promise<string> {\n // Tools that don't require an initialized graph\n if (toolName === 'kirograph_exec') {\n const cmd = args.command as string;\n if (!cmd) return 'Error: command is required.';\n\n const projectRoot = (args.projectPath as string) || (args.cwd as string) || process.cwd();\n const execCwd = (args.cwd as string) || projectRoot;\n\n // Read default level from config if not explicitly provided\n let defaultLevel: 'normal' | 'aggressive' | 'ultra' = 'normal';\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const config = await loadConfig(projectRoot);\n if (config.shellCompressionLevel && config.shellCompressionLevel !== 'off') {\n defaultLevel = config.shellCompressionLevel as 'normal' | 'aggressive' | 'ultra';\n }\n } catch { /* no config \u2014 use default */ }\n\n const level = (args.level as 'normal' | 'aggressive' | 'ultra') ?? defaultLevel;\n const timeout = ((args.timeout as number) ?? 60) * 1000;\n\n let rawOutput: string;\n let exitCode = 0;\n try {\n rawOutput = execSync(cmd, {\n cwd: execCwd,\n timeout,\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024,\n });\n } catch (err: any) {\n // Command failed \u2014 capture output anyway\n rawOutput = (err.stdout || '') + (err.stderr || '');\n exitCode = err.status ?? 1;\n }\n\n const result = compress(cmd, rawOutput, { level, preserveErrors: exitCode !== 0 });\n\n // Track savings\n const tracker = new TokenTracker(projectRoot);\n tracker.record(cmd, result.originalTokens, result.compressedTokens, result.strategy);\n\n const header = exitCode !== 0 ? `[exit ${exitCode}] ` : '';\n const footer = result.savings > 5\n ? `\\n\\n[${result.savings}% tokens saved | ${result.originalTokens}\u2192${result.compressedTokens} | ${result.strategy}]`\n : '';\n\n return `${header}${result.output}${footer}`;\n }\n\n if (toolName === 'kirograph_gain') {\n const projectRoot = (args.projectPath as string) || process.cwd();\n const period = (args.period as string) ?? 'session';\n const tracker = new TokenTracker(projectRoot);\n const stats = tracker.getStats(period as 'session' | 'today' | 'week' | 'all');\n\n if (stats.totalCommands === 0) {\n return 'No savings recorded yet. Use kirograph tools and kirograph_exec \u2014 savings are tracked automatically.';\n }\n\n const lines = [\n `Token Savings (${period}):`,\n ` Total calls: ${stats.totalCommands}`,\n ` Tokens without KiroGraph: ~${stats.totalOriginal.toLocaleString()}`,\n ` Tokens with KiroGraph: ~${stats.totalCompressed.toLocaleString()}`,\n ` Saved: ${stats.totalSaved.toLocaleString()} tokens (${stats.savingsPercent}%)`,\n ];\n\n // Source breakdown\n if (stats.bySource.exec.count > 0 || stats.bySource.graph.count > 0 || stats.bySource.memory.count > 0 || stats.bySource.docs.count > 0) {\n lines.push('', 'By source:');\n if (stats.bySource.graph.count > 0) {\n lines.push(` Graph tools: ${stats.bySource.graph.count} calls, ~${stats.bySource.graph.saved.toLocaleString()} tokens saved (vs file reads/grep)`);\n }\n if (stats.bySource.docs.count > 0) {\n lines.push(` Docs tools: ${stats.bySource.docs.count} calls, ~${stats.bySource.docs.saved.toLocaleString()} tokens saved (vs reading full doc files)`);\n }\n if (stats.bySource.data.count > 0) {\n lines.push(` Data tools: ${stats.bySource.data.count} calls, ~${stats.bySource.data.saved.toLocaleString()} tokens saved (vs loading raw data files)`);\n }\n if (stats.bySource.exec.count > 0) {\n lines.push(` Compression: ${stats.bySource.exec.count} calls, ~${stats.bySource.exec.saved.toLocaleString()} tokens saved (vs raw output)`);\n }\n if (stats.bySource.memory.count > 0) {\n lines.push(` Memory: ${stats.bySource.memory.count} calls, ~${stats.bySource.memory.saved.toLocaleString()} tokens saved (vs re-discovering context)`);\n }\n }\n\n if (Object.keys(stats.byFamily).length > 0) {\n lines.push('', 'Top families:');\n for (const [family, data] of Object.entries(stats.byFamily).slice(0, 7)) {\n lines.push(` ${family}: ${data.count} calls, ${data.savings}% avg savings`);\n }\n }\n\n if (stats.recentCommands.length > 0) {\n lines.push('', 'Recent:');\n for (const cmd of stats.recentCommands.slice(0, 5)) {\n const tag = cmd.source === 'graph' ? '\uD83D\uDCCA' : '\u26A1';\n lines.push(` ${tag} ${cmd.command.slice(0, 40)} \u2192 ${cmd.savings}% saved`);\n }\n }\n\n return lines.join('\\n');\n }\n\n if (toolName === 'kirograph_read') {\n const filePath = args.path as string;\n if (!filePath) return 'Error: path is required.';\n\n const projectRoot = (args.projectPath as string) || process.cwd();\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(projectRoot, filePath);\n const mode = (args.mode as string) ?? 'full';\n const noCache = (args.noCache as boolean) ?? false;\n\n if (!fs.existsSync(resolvedPath)) {\n return `Error: File not found: ${resolvedPath}`;\n }\n\n const { getFileReadCache } = await Promise.resolve().then(() => require('./cache.js'));\n const { executeReadMode } = await Promise.resolve().then(() => require('./read-modes.js'));\n const cache = getFileReadCache();\n\n // For non-full modes, skip caching logic and use read-modes directly\n if (mode !== 'full') {\n // Get graph connection for map/signatures/imports/exports modes\n let cg: KiroGraph | null = null;\n try {\n cg = await this.getConnection(args.projectPath as string | undefined);\n } catch { /* no graph available */ }\n\n const result = executeReadMode({\n mode: mode as any,\n filePath: resolvedPath,\n start: args.start as number | undefined,\n end: args.end as number | undefined,\n cg,\n });\n\n // Update cache with current content for future diff mode\n cache.read(resolvedPath, true);\n\n return result.content;\n }\n\n // Full mode with caching\n const result = cache.read(resolvedPath, noCache);\n\n if (result.cached) {\n return result.content;\n }\n\n if (result.changed) {\n return `[file changed since last read]\\n\\n${result.content}`;\n }\n\n return result.content;\n }\n\n if (toolName === 'kirograph_retrieve') {\n const filePath = args.path as string;\n if (!filePath) return 'Error: path is required.';\n\n const projectRoot = (args.projectPath as string) || process.cwd();\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(projectRoot, filePath);\n\n const { getFileReadCache } = await Promise.resolve().then(() => require('./cache.js'));\n const cache = getFileReadCache();\n\n // Return cached content if we have it; otherwise read and cache\n const cached = cache.getPreviousContent(resolvedPath);\n if (cached !== undefined) {\n return cached;\n }\n\n if (!fs.existsSync(resolvedPath)) {\n return `Error: File not found: ${resolvedPath}`;\n }\n\n // Not in cache yet \u2014 do a fresh read and populate it\n const result = cache.read(resolvedPath, true);\n return result.content;\n }\n\n if (toolName === 'kirograph_compress') {\n const text = args.text as string;\n if (!text) return 'Error: text is required.';\n\n const rawLevel = (args.level as string) ?? 'full';\n const command = args.command as string | undefined;\n const { estimateTokens: est } = await Promise.resolve().then(() => require('../compression/index.js'));\n const originalTokens = est(text);\n\n let compressed: string;\n let strategy: string;\n\n if (command) {\n // Shell output \u2014 use rtk-style structural filters\n const shellLevel = rawLevel === 'ultra' ? 'ultra' : rawLevel === 'lite' || rawLevel === 'normal' ? 'normal' : 'aggressive';\n const { compress } = await Promise.resolve().then(() => require('../compression/index.js'));\n const result = compress(command, text, { level: shellLevel as any });\n compressed = result.output;\n strategy = `rtk:${result.commandFamily}:${shellLevel}`;\n } else {\n // Prose / observations \u2014 use caveman grammar\n const cavemanLevel = rawLevel === 'normal' || rawLevel === 'lite' ? 'lite' : rawLevel === 'aggressive' ? 'full' : rawLevel as any;\n const { compressObservation } = await Promise.resolve().then(() => require('../memory/compress.js'));\n const result = compressObservation(text, cavemanLevel);\n compressed = result.compressed;\n strategy = `caveman:${cavemanLevel}`;\n }\n\n const compressedTokens = est(compressed);\n const savings = originalTokens > 0 ? Math.round(((originalTokens - compressedTokens) / originalTokens) * 100) : 0;\n const footer = savings > 5\n ? `\\n\\n[${savings}% tokens saved | ${originalTokens}\u2192${compressedTokens} | ${strategy}]`\n : '';\n\n return compressed + footer;\n }\n\n if (toolName === 'kirograph_budget') {\n const projectRoot = (args.projectPath as string) || process.cwd();\n const reset = (args.reset as boolean) ?? false;\n\n const { BudgetTracker } = await Promise.resolve().then(() => require('../compression/tracker.js'));\n const budget = BudgetTracker.getInstance(projectRoot);\n\n if (reset) {\n budget.reset();\n return 'Context budget counters reset.';\n }\n\n const status = budget.getStatus();\n const lines = [\n 'Context Budget:',\n ` Tokens consumed: ${status.consumed.toLocaleString()}`,\n ` Budget limit: ${status.limit > 0 ? status.limit.toLocaleString() : 'unlimited'}`,\n ` Remaining: ${status.limit > 0 ? status.remaining.toLocaleString() : '\u221E'}`,\n ` Utilization: ${status.utilization}%`,\n ];\n\n if (status.warning) {\n lines.push(`\\n \u26A0 ${status.warning}`);\n }\n\n return lines.join('\\n');\n }\n\n const cg = await this.getConnection(args.projectPath as string | undefined);\n if (!cg) return 'KiroGraph not initialized. Run `kirograph init` in your project first.';\n\n // Write session marker so hooks can detect MCP was consulted\n writeSessionMarker(cg.getProjectRoot());\n\n switch (toolName) {\n case 'kirograph_search': {\n const limit = clampLimit(args.limit as number | undefined, 10);\n const results = cg.searchNodes(\n args.query as string,\n args.kind as NodeKind | undefined,\n limit\n );\n if (results.length === 0) return `No symbols found matching \"${args.query}\".`;\n return results.map(r =>\n `${mapKind(r.node.kind)} ${r.node.name}\\n File: ${r.node.filePath}:${r.node.startLine}\\n Qualified: ${r.node.qualifiedName}`\n ).join('\\n\\n');\n }\n\n case 'kirograph_context': {\n const detail = (args.detail as string) ?? ((args.includeCode === false) ? 'summary' : 'full');\n const ctx = await cg.buildContext(args.task as string, {\n maxNodes: (args.maxNodes as number) ?? 20,\n includeCode: detail === 'full',\n });\n const lines: string[] = [ctx.summary, ''];\n if (ctx.entryPoints.length === 0) {\n lines.push('No matching symbols found. If this is a new feature, consider using kirograph_files to explore the codebase structure.');\n } else {\n lines.push('## Entry Points');\n for (const n of ctx.entryPoints) {\n lines.push(`- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`);\n if (detail === 'full' && ctx.codeSnippets.has(n.id)) {\n lines.push('```', ctx.codeSnippets.get(n.id)!, '```');\n } else if (detail === 'signatures') {\n if ((n as any).signature) lines.push(` Signature: ${(n as any).signature}`);\n if ((n as any).docstring) lines.push(` Docs: ${(n as any).docstring}`);\n }\n }\n if (ctx.relatedNodes.length > 0) {\n lines.push('', '## Related Symbols');\n for (const n of ctx.relatedNodes.slice(0, 10)) {\n lines.push(`- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`);\n }\n }\n }\n\n // Memory integration: surface relevant observations if memory is enabled\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (config.enableMemory) {\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n // Collect qualified names from entry points and related nodes\n const qualifiedNames = [\n ...ctx.entryPoints.map((n: any) => n.qualifiedName),\n ...ctx.relatedNodes.slice(0, 5).map((n: any) => n.qualifiedName),\n ].filter(Boolean);\n\n const contextLimit = config.memoryContextLimit ?? 3;\n const contextThreshold = config.memoryContextThreshold ?? 0.3;\n\n // Try linked observations first, fall back to search\n let memResults = mem.getLinkedObservations(qualifiedNames, contextLimit, contextThreshold);\n if (memResults.length === 0) {\n // Fall back to searching by task description\n memResults = (await mem.search(args.task as string, { limit: contextLimit }))\n .filter(r => r.score >= contextThreshold);\n }\n\n if (memResults.length > 0) {\n lines.push('', '## Related Memory');\n for (const r of memResults.slice(0, contextLimit)) {\n lines.push(`- [${r.observation.kind}] ${r.observation.content}`);\n }\n }\n }\n } catch { /* memory is non-critical \u2014 don't fail context on memory errors */ }\n\n // Docs integration: surface relevant doc sections if enabled and docsContextLimit > 0\n try {\n const projectRoot2 = cg.getProjectRoot();\n const config2 = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRoot2);\n if (config2.enableDocs && config2.docsContextLimit > 0) {\n const db2 = cg.getDatabase();\n db2.applyDocsSchema();\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const docsQueries = new DocsQueries(db2.getRawDb(), projectRoot2);\n\n // Collect qualified names from entry points\n const qNames = ctx.entryPoints.map((n: any) => n.qualifiedName).filter(Boolean);\n\n if (qNames.length > 0) {\n // Find doc sections that reference these symbols\n const docRefs = docsQueries.getRefs({ qualifiedName: qNames[0] });\n const additionalRefs = qNames.slice(1, 5).flatMap(qn => docsQueries.getRefs({ qualifiedName: qn }));\n const allDocRefs = [...docRefs, ...additionalRefs];\n\n // Deduplicate by section ID and take top N\n const seenSections = new Set<string>();\n const uniqueRefs = allDocRefs.filter(r => {\n if (seenSections.has(r.sectionId)) return false;\n seenSections.add(r.sectionId);\n return r.confidence >= config2.docsContextThreshold;\n }).slice(0, config2.docsContextLimit);\n\n if (uniqueRefs.length > 0) {\n lines.push('', '## Related Documentation');\n for (const ref of uniqueRefs) {\n const section = docsQueries.getSection(ref.sectionId);\n if (section) {\n const summary = section.section.summary ?? section.section.title;\n lines.push(`- [${ref.refType}] ${summary} \u2014 ${section.section.filePath} (ID: ${ref.sectionId})`);\n }\n }\n }\n }\n }\n } catch { /* docs is non-critical */ }\n\n // Data integration: surface relevant dataset schemas if enabled and dataContextLimit > 0\n try {\n const projectRoot3 = cg.getProjectRoot();\n const config3 = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRoot3);\n if (config3.enableData && config3.dataContextLimit > 0) {\n const db3 = cg.getDatabase();\n db3.applyDataSchema();\n\n // Find datasets referenced by the entry point files\n const entryFiles = ctx.entryPoints.map((n: any) => n.filePath).filter(Boolean);\n if (entryFiles.length > 0) {\n const placeholders = entryFiles.map(() => '?').join(', ');\n const dataRefs = db3.getRawDb().all(\n `SELECT DISTINCT d.id, d.file_path, d.row_count, d.column_count\n FROM data_code_refs r JOIN data_datasets d ON r.dataset_id = d.id\n WHERE r.qualified_name IN (${placeholders})`,\n entryFiles,\n ) as any[];\n\n if (dataRefs.length > 0) {\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const dq = new DataQueries(db3.getRawDb());\n const limit = config3.dataContextLimit;\n\n lines.push('', '## Related Data');\n for (const ref of dataRefs.slice(0, limit)) {\n const info = dq.describeDataset(ref.id);\n if (info) {\n const colSummary = info.columns.map(c => `${c.name}:${c.inferredType}`).join(', ');\n lines.push(`- **${ref.id}** (${ref.file_path}) \u2014 ${ref.row_count} rows, ${ref.column_count} cols`);\n lines.push(` Schema: ${colSummary}`);\n }\n }\n }\n }\n }\n } catch { /* data is non-critical */ }\n\n // Security integration: surface vulnerability warnings if enableSecurity is true\n try {\n const projectRootSec = cg.getProjectRoot();\n const configSec = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRootSec);\n if (configSec.enableSecurity) {\n const dbSec = cg.getDatabase();\n dbSec.applySecuritySchema();\n const rawDbSec = dbSec.getRawDb();\n\n // Collect node IDs from entry points and related nodes\n const contextNodeIds = [\n ...ctx.entryPoints.map((n: any) => n.id),\n ...ctx.relatedNodes.map((n: any) => n.id),\n ].filter(Boolean);\n\n if (contextNodeIds.length > 0) {\n const { getSecurityWarningsForNodes, formatSecurityWarnings } = await Promise.resolve().then(() => require('../security/context-warnings.js'));\n const warnings = getSecurityWarningsForNodes(rawDbSec, contextNodeIds);\n\n if (warnings.length > 0) {\n // Build a name map for entry points\n const nodeNames = new Map<string, string>();\n for (const n of ctx.entryPoints) {\n nodeNames.set(n.id, n.name);\n }\n for (const n of ctx.relatedNodes) {\n nodeNames.set(n.id, n.name);\n }\n\n const secSection = formatSecurityWarnings(warnings, nodeNames);\n if (secSection) {\n lines.push(secSection);\n }\n }\n }\n }\n } catch { /* security is non-critical */ }\n\n // Pattern matches warning (when enablePatterns: true and pattern_matches table exists)\n try {\n const projectRootPat = cg.getProjectRoot();\n const configPat = await (await Promise.resolve().then(() => require('../config.js'))).loadConfig(projectRootPat);\n if ((configPat as any).enablePatterns) {\n const dbPat = cg.getDatabase();\n dbPat.applyPatternsSchema();\n const rawDbPat = dbPat.getRawDb();\n const tableExists = rawDbPat.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExists) {\n // Collect file paths from context nodes\n const contextFiles = [\n ...ctx.entryPoints.map((n: any) => n.filePath),\n ...ctx.relatedNodes.map((n: any) => n.filePath),\n ].filter(Boolean) as string[];\n const uniqueContextFiles = [...new Set(contextFiles)];\n\n if (uniqueContextFiles.length > 0) {\n const placeholders = uniqueContextFiles.map(() => '?').join(',');\n const patternRows: Array<{ file_path: string; pattern_id: string; severity: string; owasp_category: string; line: number }> =\n rawDbPat.all(\n `SELECT file_path, pattern_id, severity, owasp_category, line FROM pattern_matches WHERE file_path IN (${placeholders}) ORDER BY severity DESC LIMIT 5`,\n uniqueContextFiles\n );\n if (patternRows.length > 0) {\n const patternWarnings = patternRows.map(p =>\n `- **${p.pattern_id}** [${p.severity.toUpperCase()}/${p.owasp_category}]: ${p.file_path}:${p.line}`\n ).join('\\n');\n lines.push('', '## \u26A0 Pattern Findings', '', patternWarnings);\n if (patternRows.length === 5) lines.push('', 'More findings \u2014 run `kirograph pattern --list` to see all rules.');\n }\n }\n }\n }\n } catch { /* non-critical */ }\n\n // Context savings estimation\n const graphTokens = lines.join('\\n').length / 4; // rough token estimate\n const uniqueFiles = new Set([\n ...ctx.entryPoints.map((n: any) => n.filePath),\n ...ctx.relatedNodes.map((n: any) => n.filePath),\n ]);\n if (uniqueFiles.size > 0) {\n const naiveTokens = estimateFileTokens(cg.getProjectRoot(), [...uniqueFiles]);\n if (naiveTokens > 0) {\n const savingsPct = Math.round((1 - graphTokens / naiveTokens) * 100);\n if (savingsPct > 0) {\n lines.push('', `---`, `Context savings: ~${Math.round(graphTokens)} tokens (graph) vs ~${naiveTokens} tokens (full files) \u2014 ${savingsPct}% reduction`);\n }\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_callers': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const callers = await cg.getCallers(node.id, limit);\n if (callers.length === 0) return `No callers found for \\`${node.name}\\`.`;\n return `Callers of \\`${node.name}\\`:\\n` + callers.map(n =>\n `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`\n ).join('\\n');\n }\n\n case 'kirograph_callees': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const callees = await cg.getCallees(node.id, limit);\n if (callees.length === 0) return `\\`${node.name}\\` doesn't call any indexed symbols.`;\n return `\\`${node.name}\\` calls:\\n` + callees.map(n =>\n `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`\n ).join('\\n');\n }\n\n case 'kirograph_impact': {\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const affected = await cg.getImpactRadius(node.id, (args.depth as number) ?? 2);\n if (affected.length === 0) return `No dependents found for \\`${node.name}\\`.`;\n\n let output = `Changing \\`${node.name}\\` may affect ${affected.length} symbol(s):\\n` +\n affected.map(n => `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n\n // Memory integration: surface observations linked to the target symbol\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (config.enableMemory) {\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const contextLimit = config.memoryContextLimit ?? 3;\n const contextThreshold = config.memoryContextThreshold ?? 0.3;\n const memResults = mem.getLinkedObservations(\n [node.qualifiedName],\n contextLimit,\n contextThreshold\n );\n\n if (memResults.length > 0) {\n output += '\\n\\nRelated Memory:';\n for (const r of memResults) {\n const age = formatAge(r.observation.createdAt);\n output += `\\n- [${r.observation.kind}] ${r.observation.content} (${age})`;\n }\n }\n }\n } catch { /* memory is non-critical */ }\n\n // Check if symbol has pattern matches\n try {\n const rawDbImp = cg.getDatabase().getRawDb();\n const tableExistsImp = rawDbImp.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExistsImp) {\n const symNode = rawDbImp.get('SELECT id FROM nodes WHERE name = ? LIMIT 1', [args.symbol]);\n if (symNode) {\n const patternMatches = rawDbImp.all(\n 'SELECT pattern_id, severity, line FROM pattern_matches WHERE symbol_node_id = ?',\n [(symNode as { id: string }).id]\n ) as Array<{ pattern_id: string; severity: string; line: number }>;\n if (patternMatches.length > 0) {\n output += '\\n\\n\u26A0 This symbol has pattern matches:';\n for (const pm of patternMatches) {\n output += `\\n [${pm.severity.toUpperCase()}] ${pm.pattern_id} at line ${pm.line}`;\n }\n }\n }\n }\n } catch { /* non-critical */ }\n\n return output;\n }\n\n case 'kirograph_node': {\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const nodeDetail = (args.detail as string) ?? (args.includeCode ? 'full' : 'summary');\n const lines = [\n `${mapKind(node.kind)} \\`${node.name}\\``,\n `File: ${node.filePath}:${node.startLine}-${node.endLine}`,\n `Qualified: ${node.qualifiedName}`,\n ];\n if (nodeDetail === 'signatures' || nodeDetail === 'full') {\n if (node.signature) lines.push(`Signature: ${node.signature}`);\n if (node.docstring) lines.push(`Docs: ${node.docstring}`);\n }\n if (nodeDetail === 'full') {\n const src = cg.getNodeSource(node);\n if (src) lines.push('', '```', src, '```');\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_status': {\n const stats = await cg.getStats();\n const langLine = Object.entries(stats.filesByLanguage)\n .sort((a, b) => b[1] - a[1])\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n const dbMb = (stats.dbSizeBytes / 1024 / 1024).toFixed(2);\n const semanticLines = stats.embeddingsEnabled\n ? [\n ` Semantic search: enabled`,\n ` Semantic model: ${stats.embeddingModel}`,\n ` Semantic engine: ${\n stats.semanticEngine === 'turboquant' ? `turboquant (${stats.vecIndexCount} entries \u00B7 ANN)` :\n stats.semanticEngine === 'turbovec' ? `turbovec (${stats.vecIndexCount} entries \u00B7 ${stats.turbovecBits ?? 4} bits \u00B7 Rust/SIMD)` :\n stats.semanticEngine === 'sqlite-vec' ? `sqlite-vec (${stats.vecIndexCount} entries in ANN index)` :\n stats.semanticEngine === 'orama' ? `orama hybrid (${stats.vecIndexCount} docs in index)` :\n stats.semanticEngine === 'pglite' ? `pglite+pgvector (${stats.vecIndexCount} rows in DB)` :\n stats.semanticEngine === 'lancedb' ? `lancedb (${stats.vecIndexCount} entries in ANN index)` :\n stats.semanticEngine === 'qdrant' ? `qdrant (${stats.vecIndexCount} points in collection)` :\n stats.semanticEngine === 'typesense' ? `typesense (${stats.vecIndexCount} documents in collection)` :\n 'in-process cosine'\n }`,\n ` Embeddings: ${stats.embeddingCount} / ${stats.embeddableNodeCount || stats.nodes} embeddable symbols`,\n ...(stats.engineFallback ? [` \u26A0 Engine fallback: ${stats.engineFallback}`] : []),\n ]\n : [` Semantic search: disabled`];\n const frameworkLine = stats.frameworks.length > 0\n ? ` Frameworks: ${stats.frameworks.join(', ')}`\n : ` Frameworks: none detected`;\n const archLine = stats.architectureEnabled\n ? stats.architectureStats\n ? ` Architecture: enabled \u2014 ${stats.architectureStats.packages} packages, ${stats.architectureStats.layers} layers, ${stats.architectureStats.packageDeps} deps`\n : ` Architecture: enabled (not yet analyzed \u2014 run kirograph index)`\n : ` Architecture: disabled`;\n\n // Docs stats\n let docsLine = ' Documentation: disabled';\n try {\n const { loadConfig: loadCfg } = await Promise.resolve().then(() => require('../config.js'));\n const cfg = await loadCfg(cg.getProjectRoot());\n if (cfg.enableDocs) {\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const rawDb = db.getRawDb();\n const docFiles = rawDb.get('SELECT COUNT(DISTINCT file_path) as cnt FROM doc_sections')?.cnt ?? 0;\n const docSections = rawDb.get('SELECT COUNT(*) as cnt FROM doc_sections')?.cnt ?? 0;\n const docRefs = rawDb.get('SELECT COUNT(*) as cnt FROM doc_code_refs')?.cnt ?? 0;\n docsLine = ` Documentation: enabled \u2014 ${docFiles} files, ${docSections} sections, ${docRefs} code refs`;\n }\n } catch { /* non-critical */ }\n\n // Data stats\n let dataLine = ' Data: disabled';\n try {\n const { loadConfig: loadCfg2 } = await Promise.resolve().then(() => require('../config.js'));\n const cfg2 = await loadCfg2(cg.getProjectRoot());\n if (cfg2.enableData) {\n const rawDb2 = cg.getDatabase().getRawDb();\n cg.getDatabase().applyDataSchema();\n const datasetCount = rawDb2.get('SELECT COUNT(*) as cnt FROM data_datasets')?.cnt ?? 0;\n if (datasetCount > 0) {\n const totalRows = rawDb2.get('SELECT SUM(row_count) as total FROM data_datasets')?.total ?? 0;\n const totalCols = rawDb2.get('SELECT SUM(column_count) as total FROM data_datasets')?.total ?? 0;\n const totalSize = rawDb2.get('SELECT SUM(file_size) as total FROM data_datasets')?.total ?? 0;\n const sizeMb = (totalSize / 1024 / 1024).toFixed(2);\n dataLine = ` Data: enabled \u2014 ${datasetCount} datasets, ${totalRows.toLocaleString()} rows, ${totalCols} columns (${sizeMb} MB source)`;\n } else {\n dataLine = ` Data: enabled (no datasets indexed yet \u2014 run kirograph index)`;\n }\n }\n } catch { /* non-critical */ }\n\n // Security stats\n let securityLine = ' Security: disabled';\n try {\n const { loadConfig: loadCfgSec } = await Promise.resolve().then(() => require('../config.js'));\n const cfgSec = await loadCfgSec(cg.getProjectRoot());\n if (cfgSec.enableSecurity) {\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n const depCount = rawDb.get('SELECT COUNT(*) as cnt FROM sec_dependencies')?.cnt ?? 0;\n const vulnCount = rawDb.get('SELECT COUNT(*) as cnt FROM sec_vulnerabilities')?.cnt ?? 0;\n const affectedCount = rawDb.get(\"SELECT COUNT(*) as cnt FROM sec_reachability WHERE verdict = 'affected'\")?.cnt ?? 0;\n const staleCount = rawDb.get('SELECT COUNT(*) as cnt FROM sec_dependencies WHERE vuln_data_stale = 1')?.cnt ?? 0;\n const staleNote = staleCount > 0 ? ` \u26A0 ${staleCount} stale` : '';\n securityLine = ` Security: enabled \u2014 ${depCount} deps, ${vulnCount} vulns (${affectedCount} affected)${staleNote}`;\n }\n } catch { /* non-critical */ }\n\n // Patterns stats\n let patternsLine = ' Patterns: disabled';\n try {\n const { loadConfig: loadCfgPat } = await Promise.resolve().then(() => require('../config.js'));\n const cfgP = await loadCfgPat(cg.getProjectRoot());\n if ((cfgP as any).enablePatterns) {\n const rawDbP = cg.getDatabase().getRawDb();\n const tableExistsP = rawDbP.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExistsP) {\n const matchCount = rawDbP.get('SELECT COUNT(*) as cnt FROM pattern_matches')?.cnt ?? 0;\n const fileCount = rawDbP.get('SELECT COUNT(DISTINCT file_path) as cnt FROM pattern_matches')?.cnt ?? 0;\n const ruleCount = rawDbP.get('SELECT COUNT(DISTINCT pattern_id) as cnt FROM pattern_matches')?.cnt ?? 0;\n patternsLine = ` Patterns: enabled \u2014 ${matchCount} matches, ${ruleCount} rules triggered, ${fileCount} files`;\n } else {\n patternsLine = ` Patterns: enabled (no data yet \u2014 run kirograph index)`;\n }\n }\n } catch { /* non-critical */ }\n\n // Sync state warning\n const threshold = stats.syncWarningThreshold ?? 10;\n const pendingFiles: number = stats.pendingFiles ?? 0;\n const syncRunning: boolean = stats.syncRunning ?? false;\n const syncLines: string[] = [];\n if (syncRunning) {\n syncLines.push(` \u26A0 Sync is currently running in the background.`);\n }\n if (threshold > 0 && pendingFiles >= threshold) {\n syncLines.push(\n ` \u26A0 Index may be incomplete \u2014 ${pendingFiles} file${pendingFiles !== 1 ? 's' : ''} pending sync.` +\n (syncRunning ? ' Sync is running in background.' : ' Run `kirograph sync` to update.') +\n ` Would you like to wait before proceeding?`\n );\n }\n\n // Token savings summary\n const tracker = new TokenTracker(cg.getProjectRoot());\n const gainStats = tracker.getStats('session');\n const gainLines: string[] = [];\n if (gainStats.totalCommands > 0) {\n gainLines.push(` Compression: ${gainStats.totalCommands} commands, ${gainStats.savingsPercent}% avg savings (${gainStats.totalSaved.toLocaleString()} tokens saved this session)`);\n }\n\n return [\n `KiroGraph Status`,\n ` Project: ${cg.getProjectRoot()}`,\n ` Files indexed: ${stats.files}`,\n ` Symbols: ${stats.nodes}`,\n ` Relationships: ${stats.edges}`,\n ` By kind: ${Object.entries(stats.nodesByKind).map(([k, v]) => `${k}=${v}`).join(', ')}`,\n langLine ? ` By language: ${langLine}` : '',\n frameworkLine,\n archLine,\n docsLine,\n dataLine,\n securityLine,\n patternsLine,\n ` DB size: ${dbMb} MB`,\n ...semanticLines,\n ...syncLines,\n ...gainLines,\n ].filter(Boolean).join('\\n');\n }\n\n case 'kirograph_files': {\n const format = (args.format as string) ?? 'tree';\n const includeMetadata = args.includeMetadata !== false;\n const tree = cg.getFiles({\n filterPath: args.filterPath as string | undefined,\n pattern: args.pattern as string | undefined,\n maxDepth: args.maxDepth as number | undefined,\n });\n\n if (format === 'flat') {\n const flat: string[] = [];\n function flattenTree(nodes: import('../index').FileTreeNode[]): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const meta = includeMetadata && node.language ? ` [${node.language}${node.symbolCount ? ` \u00B7 ${node.symbolCount}` : ''}]` : '';\n flat.push(`${node.path}${meta}`);\n }\n if (node.children?.length) flattenTree(node.children);\n }\n }\n flattenTree(tree);\n return flat.length > 0 ? flat.join('\\n') : 'No indexed files found.';\n }\n\n if (format === 'grouped') {\n const groups = new Map<string, import('../index').FileTreeNode[]>();\n function groupTree(nodes: import('../index').FileTreeNode[]): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const dir = node.path.includes('/') ? node.path.slice(0, node.path.lastIndexOf('/')) : '.';\n if (!groups.has(dir)) groups.set(dir, []);\n groups.get(dir)!.push(node);\n }\n if (node.children?.length) groupTree(node.children);\n }\n }\n groupTree(tree);\n const lines: string[] = [];\n for (const [dir, files] of [...groups.entries()].sort()) {\n lines.push(`${dir}/`);\n for (const f of files) {\n const meta = includeMetadata && f.language ? ` [${f.language}${f.symbolCount ? ` \u00B7 ${f.symbolCount}` : ''}]` : '';\n lines.push(` ${f.name}${meta}`);\n }\n }\n return lines.length > 0 ? lines.join('\\n') : 'No indexed files found.';\n }\n\n if (format === 'compact') {\n // rtk-style compact: directory summary with file counts and language breakdown\n const dirStats = new Map<string, { files: number; symbols: number; langs: Map<string, number> }>();\n function compactTree(nodes: import('../index').FileTreeNode[]): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const dir = node.path.includes('/') ? node.path.slice(0, node.path.lastIndexOf('/')) : '.';\n const stat = dirStats.get(dir) || { files: 0, symbols: 0, langs: new Map() };\n stat.files++;\n stat.symbols += node.symbolCount || 0;\n if (node.language) stat.langs.set(node.language, (stat.langs.get(node.language) || 0) + 1);\n dirStats.set(dir, stat);\n }\n if (node.children?.length) compactTree(node.children);\n }\n }\n compactTree(tree);\n const totalFiles = [...dirStats.values()].reduce((s, d) => s + d.files, 0);\n const totalSymbols = [...dirStats.values()].reduce((s, d) => s + d.symbols, 0);\n const lines: string[] = [`${totalFiles} files, ${totalSymbols} symbols in ${dirStats.size} directories:\\n`];\n for (const [dir, stat] of [...dirStats.entries()].sort()) {\n const langSummary = [...stat.langs.entries()].map(([l, c]) => `${l}:${c}`).join(' ');\n lines.push(`${dir}/ (${stat.files} files, ${stat.symbols} symbols) ${langSummary}`);\n }\n return lines.join('\\n');\n }\n\n // Default: tree format\n const lines: string[] = [];\n function renderTree(nodes: import('../index').FileTreeNode[], prefix: string): void {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const isLast = i === nodes.length - 1;\n const connector = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n const childPrefix = prefix + (isLast ? ' ' : '\u2502 ');\n const meta = includeMetadata && node.type === 'file' && node.language\n ? ` [${node.language}${node.symbolCount ? ` \u00B7 ${node.symbolCount} symbols` : ''}]`\n : '';\n lines.push(`${prefix}${connector}${node.name}${meta}`);\n if (node.children?.length) renderTree(node.children, childPrefix);\n }\n }\n renderTree(tree, '');\n return lines.length > 0 ? lines.join('\\n') : 'No indexed files found.';\n }\n\n case 'kirograph_dead_code': {\n const limit = clampLimit(args.limit as number | undefined, 50);\n const dead = cg.findDeadCode(limit);\n if (dead.length === 0) return 'No dead code detected.';\n return `Potential dead code (${dead.length} unexported symbols with no incoming references):\\n` +\n dead.map(n => `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n }\n\n case 'kirograph_circular_deps': {\n const cycles = cg.findCircularDependencies();\n if (cycles.length === 0) return 'No circular dependencies found.';\n return `Found ${cycles.length} circular dependency cycle(s):\\n` +\n cycles.map((cycle, i) => `Cycle ${i + 1}: ${cycle.join(' \u2192 ')}`).join('\\n');\n }\n\n case 'kirograph_path': {\n const fromResults = cg.searchNodes(args.from as string, undefined, 3);\n const toResults = cg.searchNodes(args.to as string, undefined, 3);\n if (fromResults.length === 0) return `Symbol \"${args.from}\" not found in index.`;\n if (toResults.length === 0) return `Symbol \"${args.to}\" not found in index.`;\n const fromNode = fromResults[0].node;\n const toNode = toResults[0].node;\n const pathNodes = await cg.findPath(fromNode.id, toNode.id);\n if (pathNodes.length === 0) return `No path found between \\`${fromNode.name}\\` and \\`${toNode.name}\\`.`;\n return `Path from \\`${fromNode.name}\\` to \\`${toNode.name}\\` (${pathNodes.length} nodes):\\n` +\n pathNodes.map((n, i) => `${i + 1}. ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n }\n\n case 'kirograph_type_hierarchy': {\n const results = cg.searchNodes(args.symbol as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.symbol}\" not found in index.`;\n const node = results[0].node;\n const direction = (args.direction as 'up' | 'down' | 'both') ?? 'both';\n const hierarchy = cg.getTypeHierarchy(node.id, direction);\n if (hierarchy.length === 0) return `No type hierarchy found for \\`${node.name}\\`.`;\n return `Type hierarchy for \\`${node.name}\\` (direction: ${direction}):\\n` +\n hierarchy.map(n => `- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}:${n.startLine}`).join('\\n');\n }\n\n case 'kirograph_architecture': {\n if (!cg.isArchitectureEnabled()) {\n return 'Architecture analysis is disabled. Set enableArchitecture=true in .kirograph/config.json and re-index.';\n }\n const level = (args.level as string) ?? 'both';\n const includeFiles = args.includeFiles === true;\n const arch = cg.getArchitecture();\n\n const lines: string[] = ['# Architecture'];\n\n if ((level === 'packages' || level === 'both') && arch.packages.length > 0) {\n lines.push('\\n## Packages');\n for (const pkg of arch.packages) {\n const meta = [pkg.language, pkg.version].filter(Boolean).join(', ');\n lines.push(`- **${pkg.name}** (${pkg.path}) [${pkg.source}${meta ? ' \u00B7 ' + meta : ''}]`);\n }\n if (arch.packageDeps.length > 0) {\n lines.push('\\n## Package Dependencies');\n for (const dep of arch.packageDeps) {\n const src = arch.packages.find(p => p.id === dep.sourcePkg)?.name ?? dep.sourcePkg;\n const tgt = arch.packages.find(p => p.id === dep.targetPkg)?.name ?? dep.targetPkg;\n lines.push(`- ${src} \u2192 ${tgt} (${dep.depCount} import${dep.depCount !== 1 ? 's' : ''})`);\n }\n }\n }\n\n if ((level === 'layers' || level === 'both') && arch.layers.length > 0) {\n lines.push('\\n## Layers');\n for (const layer of arch.layers) {\n const fileCount = Object.values(arch.fileLayers).filter(fl => fl.some(l => l.layerId === layer.id)).length;\n lines.push(`- **${layer.name}** [${layer.source}] \u2014 ${fileCount} file${fileCount !== 1 ? 's' : ''}`);\n }\n if (arch.layerDeps.length > 0) {\n lines.push('\\n## Layer Dependencies');\n for (const dep of arch.layerDeps) {\n const src = dep.sourceLayer.replace('layer:', '');\n const tgt = dep.targetLayer.replace('layer:', '');\n lines.push(`- ${src} \u2192 ${tgt} (${dep.depCount})`);\n }\n }\n }\n\n if (includeFiles && (level === 'packages' || level === 'both')) {\n lines.push('\\n## File \u2192 Package');\n for (const [file, pkgIds] of Object.entries(arch.filePackages).slice(0, 50)) {\n const names = pkgIds.map(id => arch.packages.find(p => p.id === id)?.name ?? id).join(', ');\n lines.push(`- ${file}: ${names}`);\n }\n if (Object.keys(arch.filePackages).length > 50) lines.push(' \u2026(truncated)');\n }\n\n if (arch.packages.length === 0 && arch.layers.length === 0) {\n return 'No architecture data found. Run `kirograph index` with enableArchitecture=true.';\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_coupling': {\n if (!cg.isArchitectureEnabled()) {\n return 'Architecture analysis is disabled. Set enableArchitecture=true in .kirograph/config.json and re-index.';\n }\n const sortBy = (args.sortBy as string) ?? 'instability';\n const limit = clampLimit(args.limit as number | undefined, 20);\n const arch = cg.getArchitecture();\n\n if (arch.coupling.length === 0) {\n return 'No coupling data. Run `kirograph index` with enableArchitecture=true.';\n }\n\n const sorted = [...arch.coupling].sort((a, b) => {\n if (sortBy === 'afferent') return b.afferent - a.afferent;\n if (sortBy === 'efferent') return b.efferent - a.efferent;\n return b.instability - a.instability;\n }).slice(0, limit);\n\n const lines = [\n `Coupling Metrics (sorted by ${sortBy}):`,\n '',\n 'Package Ca Ce I',\n '\u2500'.repeat(52),\n ];\n\n for (const c of sorted) {\n const pkg = arch.packages.find(p => p.id === c.packageId);\n const name = (pkg?.name ?? c.packageId).slice(0, 32).padEnd(32);\n const ca = String(c.afferent).padStart(4);\n const ce = String(c.efferent).padStart(4);\n const inst = c.instability.toFixed(2).padStart(5);\n lines.push(`${name} ${ca} ${ce} ${inst}`);\n }\n\n lines.push('', 'Ca=afferent (depended on by), Ce=efferent (depends on), I=instability (Ce/(Ca+Ce))');\n return lines.join('\\n');\n }\n\n case 'kirograph_package': {\n if (!cg.isArchitectureEnabled()) {\n return 'Architecture analysis is disabled. Set enableArchitecture=true in .kirograph/config.json and re-index.';\n }\n const query = (args.package as string).toLowerCase();\n const includeFiles = args.includeFiles !== false;\n const arch = cg.getArchitecture();\n\n const pkg = arch.packages.find(p =>\n p.name.toLowerCase().includes(query) || p.path.toLowerCase().includes(query) || p.id.toLowerCase().includes(query)\n );\n if (!pkg) return `Package \"${args.package}\" not found. Use kirograph_architecture to list all packages.`;\n\n const lines = [\n `## Package: ${pkg.name}`,\n `Path: ${pkg.path}`,\n `Source: ${pkg.source}${pkg.manifestPath ? ` (${pkg.manifestPath})` : ''}`,\n ...(pkg.version ? [`Version: ${pkg.version}`] : []),\n ...(pkg.language ? [`Language: ${pkg.language}`] : []),\n ];\n\n const deps = arch.packageDeps.filter(d => d.sourcePkg === pkg.id);\n const dependents = arch.packageDeps.filter(d => d.targetPkg === pkg.id);\n const coupling = arch.coupling.find(c => c.packageId === pkg.id);\n\n if (coupling) {\n lines.push('', `Coupling: Ca=${coupling.afferent} Ce=${coupling.efferent} I=${coupling.instability.toFixed(2)}`);\n }\n\n if (deps.length > 0) {\n lines.push('', `Depends on (${deps.length}):`);\n for (const dep of deps) {\n const name = arch.packages.find(p => p.id === dep.targetPkg)?.name ?? dep.targetPkg;\n lines.push(` \u2192 ${name} (${dep.depCount} import${dep.depCount !== 1 ? 's' : ''})`);\n }\n }\n\n if (dependents.length > 0) {\n lines.push('', `Depended on by (${dependents.length}):`);\n for (const dep of dependents) {\n const name = arch.packages.find(p => p.id === dep.sourcePkg)?.name ?? dep.sourcePkg;\n lines.push(` \u2190 ${name} (${dep.depCount} import${dep.depCount !== 1 ? 's' : ''})`);\n }\n }\n\n if (pkg.externalDeps && pkg.externalDeps.length > 0) {\n lines.push('', `External deps (${pkg.externalDeps.length}): ${pkg.externalDeps.slice(0, 10).join(', ')}${pkg.externalDeps.length > 10 ? '\u2026' : ''}`);\n }\n\n if (includeFiles) {\n const files = Object.entries(arch.filePackages)\n .filter(([, ids]) => ids.includes(pkg.id))\n .map(([f]) => f)\n .sort();\n if (files.length > 0) {\n lines.push('', `Files (${files.length}):`);\n for (const f of files.slice(0, 30)) lines.push(` ${f}`);\n if (files.length > 30) lines.push(` \u2026and ${files.length - 30} more`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_hotspots': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const hotspots = cg.findHotspots(limit);\n if (hotspots.length === 0) return 'No symbols found in index.';\n const lines = [`Top ${hotspots.length} most-connected symbols (by edge degree):\\n`];\n for (const n of hotspots) {\n lines.push(`${mapKind(n.kind)} \\`${n.name}\\` \u2014 degree ${n.degree} (in: ${n.inDegree}, out: ${n.outDegree})`);\n lines.push(` File: ${n.filePath}:${n.startLine}`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_surprising': {\n const limit = clampLimit(args.limit as number | undefined, 20);\n const connections = cg.findSurprisingConnections(limit);\n if (connections.length === 0) return 'No surprising cross-file connections found.';\n const lines = [`Top ${connections.length} surprising cross-file connections:\\n`];\n for (const c of connections) {\n lines.push(`${mapKind(c.source.kind)} \\`${c.source.name}\\` ${c.kind}\u2192 ${mapKind(c.target.kind)} \\`${c.target.name}\\` (score: ${c.score.toFixed(2)})`);\n lines.push(` ${c.source.filePath} \u2192 ${c.target.filePath}`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_diff': {\n const sm = cg.createSnapshotManager();\n const snapshot = args.snapshot\n ? sm.load(args.snapshot as string)\n : sm.loadLatest();\n if (!snapshot) {\n return args.snapshot\n ? `Snapshot \"${args.snapshot}\" not found. Use \\`kirograph snapshot list\\` to see available snapshots.`\n : 'No snapshots found. Run `kirograph snapshot` to save one first.';\n }\n const diff = sm.diff(snapshot, sm.currentSnapshot());\n const fromDate = new Date(diff.from.timestamp).toISOString().slice(0, 19).replace('T', ' ');\n const lines = [\n `Graph diff: \"${diff.from.label}\" (${fromDate}) \u2192 current`,\n ``,\n `Symbols: +${diff.addedNodes.length} added, -${diff.removedNodes.length} removed`,\n `Edges: +${diff.addedEdges.length} added, -${diff.removedEdges.length} removed`,\n ];\n if (diff.addedNodes.length > 0) {\n lines.push(`\\n## Added symbols (${diff.addedNodes.length})`);\n for (const n of diff.addedNodes.slice(0, 30)) {\n lines.push(`+ ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}`);\n }\n if (diff.addedNodes.length > 30) lines.push(` \u2026and ${diff.addedNodes.length - 30} more`);\n }\n if (diff.removedNodes.length > 0) {\n lines.push(`\\n## Removed symbols (${diff.removedNodes.length})`);\n for (const n of diff.removedNodes.slice(0, 30)) {\n lines.push(`- ${mapKind(n.kind)} \\`${n.name}\\` \u2014 ${n.filePath}`);\n }\n if (diff.removedNodes.length > 30) lines.push(` \u2026and ${diff.removedNodes.length - 30} more`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_snapshot_save': {\n const sm = cg.createSnapshotManager();\n const snapshot = sm.save(args.label as string | undefined);\n return `Snapshot saved: \"${snapshot.label}\" \u2014 ${snapshot.nodeCount} symbols, ${snapshot.edgeCount} edges`;\n }\n\n case 'kirograph_snapshot_list': {\n const sm = cg.createSnapshotManager();\n const snapshots = sm.list();\n if (snapshots.length === 0) return 'No snapshots yet. Use kirograph_snapshot_save to save one first.';\n const lines = [`Saved snapshots (${snapshots.length}):\\n`];\n for (const s of snapshots) {\n const date = new Date(s.timestamp).toISOString().slice(0, 19).replace('T', ' ');\n lines.push(`- ${s.label} (${date}, ${s.nodeCount} symbols, ${s.edgeCount} edges)`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_flows': {\n const { getExecutionFlows, traceFlow, detectEntryPoints } = await Promise.resolve().then(() => require('../graph/flows.js'));\n const db = cg.getDatabase();\n\n if (args.entryPoint) {\n // Trace from a specific symbol\n const results = cg.searchNodes(args.entryPoint as string, undefined, 5);\n if (results.length === 0) return `Symbol \"${args.entryPoint}\" not found in index.`;\n const hops = traceFlow(db, results[0].node.id, (args.maxDepth as number) ?? 10);\n if (hops.length < 2) return `No outgoing call chain found from \"${args.entryPoint}\".`;\n\n const lines = [`## Execution flow from \\`${args.entryPoint}\\``, ''];\n for (let i = 0; i < hops.length; i++) {\n const hop = hops[i];\n const indent = ' '.repeat(i);\n const arrow = i === 0 ? '\u2192' : '\u21B3';\n const conf = hop.confidence && hop.confidence !== 'extracted' ? ` [${hop.confidence}]` : '';\n lines.push(`${indent}${arrow} ${hop.kind} \\`${hop.symbol}\\` \u2014 ${hop.filePath}:${hop.line}${conf}`);\n }\n return lines.join('\\n');\n }\n\n // Auto-detect entry points and trace flows\n const flows = getExecutionFlows(db, {\n maxFlows: (args.maxFlows as number) ?? 10,\n maxDepth: (args.maxDepth as number) ?? 10,\n });\n\n if (flows.length === 0) return 'No execution flows detected. The graph may be too small or have no call edges.';\n\n const lines = [`## Execution Flows (${flows.length} detected)`, ''];\n for (const flow of flows) {\n lines.push(`### \\`${flow.entryPoint}\\` (${flow.entryPointKind}) \u2014 criticality: ${flow.criticality.toFixed(2)}`);\n lines.push(`File: ${flow.entryPointFile}`, '');\n for (let i = 0; i < flow.hops.length; i++) {\n const hop = flow.hops[i];\n const indent = ' '.repeat(Math.min(i, 5));\n const arrow = i === 0 ? '\u2192' : '\u21B3';\n const conf = hop.confidence && hop.confidence !== 'extracted' ? ` [${hop.confidence}]` : '';\n lines.push(`${indent}${arrow} \\`${hop.symbol}\\` (${hop.kind}) \u2014 ${hop.filePath}:${hop.line}${conf}`);\n }\n lines.push('');\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_communities': {\n const { detectCommunities } = await Promise.resolve().then(() => require('../graph/communities.js'));\n const db = cg.getDatabase();\n const result = detectCommunities(db, {\n resolution: (args.resolution as number) ?? 1.0,\n });\n\n if (result.communities.length === 0) return 'No communities detected. The graph may be too small or have no edges.';\n\n const limit = Math.min((args.limit as number) ?? 15, result.communities.length);\n const lines = [\n `## Communities (${result.communities.length} detected, modularity: ${result.modularity.toFixed(3)})`,\n `Graph: ${result.totalNodes} nodes, ${result.totalEdges} edges`,\n '',\n ];\n\n for (const c of result.communities.slice(0, limit)) {\n lines.push(`### ${c.label} (${c.memberCount} symbols)`);\n lines.push(`- Directory: \\`${c.dominantDirectory}\\``);\n lines.push(`- Language: ${c.dominantLanguage}`);\n lines.push(`- Inter-community edges: ${c.interCommunityEdges}`);\n lines.push(`- Top members:`);\n for (const m of c.members.slice(0, 8)) {\n lines.push(` - ${m.kind} \\`${m.name}\\` \u2014 ${m.filePath}`);\n }\n if (c.memberCount > 8) lines.push(` - \u2026and ${c.memberCount - 8} more`);\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_refactor': {\n const { renamePreview, suggestRefactorings } = await Promise.resolve().then(() => require('../graph/refactor.js'));\n const db = cg.getDatabase();\n const mode = args.mode as string;\n\n if (mode === 'rename') {\n if (!args.symbol) return 'Error: \"symbol\" parameter is required for rename mode.';\n const preview = renamePreview(db, args.symbol as string);\n if (!preview) return `Symbol \"${args.symbol}\" not found in index.`;\n\n const lines = [\n `## Rename Preview: \\`${preview.symbol}\\``,\n `Kind: ${preview.kind}`,\n `Defined at: ${preview.filePath}:${preview.line}`,\n `Total references: ${preview.totalReferences}`,\n '',\n ];\n\n if (preview.references.length === 0) {\n lines.push('No references found \u2014 this symbol can be safely renamed without affecting other code.');\n } else {\n // Group by file\n const byFile = new Map<string, typeof preview.references>();\n for (const ref of preview.references) {\n if (!byFile.has(ref.filePath)) byFile.set(ref.filePath, []);\n byFile.get(ref.filePath)!.push(ref);\n }\n\n for (const [file, refs] of byFile) {\n lines.push(`### ${file} (${refs.length} references)`);\n for (const ref of refs.slice(0, 10)) {\n lines.push(`- Line ${ref.line}: \\`${ref.context}\\` (${ref.edgeKind})`);\n }\n if (refs.length > 10) lines.push(` \u2026and ${refs.length - 10} more`);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n }\n\n if (mode === 'suggest') {\n const suggestions = suggestRefactorings(db, (args.limit as number) ?? 10);\n if (suggestions.length === 0) return 'No refactoring suggestions \u2014 the codebase structure looks clean.';\n\n const lines = [`## Refactoring Suggestions (${suggestions.length})`, ''];\n for (const s of suggestions) {\n const icon = s.priority === 'high' ? '\uD83D\uDD34' : s.priority === 'medium' ? '\uD83D\uDFE1' : '\uD83D\uDFE2';\n lines.push(`${icon} **${s.type}** [${s.priority}]: ${s.description}`);\n lines.push(` Rationale: ${s.rationale}`);\n if (s.symbols.length > 0) {\n lines.push(` Symbols: ${s.symbols.slice(0, 3).join(', ')}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n return 'Unknown mode. Use \"rename\" or \"suggest\".';\n }\n\n // \u2500\u2500 Memory tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_mem_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const results = await mem.search(args.query as string, {\n limit: (args.limit as number) ?? 10,\n kind: args.kind as any,\n sessionId: args.sessionId as string | undefined,\n asOf: args.asOf as number | undefined,\n });\n\n if (results.length === 0) return `No memory observations found for \"${args.query}\".`;\n\n return results.map((r, i) => {\n const age = formatAge(r.observation.createdAt);\n const lines = [`${i + 1}. [${r.observation.kind}] ${r.observation.content} (${age})`];\n if (r.relations && r.relations.length > 0) {\n for (const rel of r.relations) {\n const other = rel.observationA === r.observation.id ? rel.observationB : rel.observationA;\n const icon = rel.relation === 'conflicts_with' ? '\u26A1' : rel.relation === 'supersedes' ? '\u21A9' : '~';\n lines.push(` ${icon} ${rel.relation} ${other} (confidence: ${rel.confidence})${rel.judgmentStatus === 'judged' ? ' (judged)' : ''}`);\n }\n }\n return lines.join('\\n');\n }).join('\\n');\n }\n\n case 'kirograph_mem_store': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const id = await mem.store({\n content: args.content as string,\n kind: (args.kind as any) ?? 'note',\n source: 'agent',\n topicKey: args.topicKey as string | undefined,\n reviewAfter: args.reviewAfter as number | undefined,\n });\n\n if (!id) return 'Observation already exists (duplicate content).';\n return `Stored observation ${id} [${(args.kind as string) ?? 'note'}]`;\n }\n\n case 'kirograph_mem_timeline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const { sessions, observations } = mem.timeline({\n limit: (args.limit as number) ?? 5,\n sessionId: args.sessionId as string | undefined,\n });\n\n if (sessions.length === 0) return 'No memory sessions found.';\n\n const lines: string[] = [];\n for (const session of sessions) {\n const start = new Date(session.startedAt).toISOString().slice(0, 16).replace('T', ' ');\n const status = session.endedAt ? 'ended' : 'active';\n const obs = observations.get(session.id) ?? [];\n lines.push(`## ${start} [${session.ide ?? 'unknown'}] (${status}, ${obs.length} observations)`);\n for (const o of obs.slice(0, 5)) {\n lines.push(` - [${o.kind}] ${o.content.slice(0, 120)}`);\n }\n if (obs.length > 5) lines.push(` \u2026and ${obs.length - 5} more`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_status': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const stats = mem.getStats();\n const lines = [\n 'KiroGraph Memory Status',\n ` Sessions: ${stats.sessions} (${stats.activeSessions} active)`,\n ` Observations: ${stats.observations}`,\n ` Symbol links: ${stats.links}`,\n ` Embeddings: ${stats.vectors} / ${stats.embeddableCount}`,\n ` Model mismatch: ${stats.modelMismatch ? '\u26A0 yes \u2014 run kirograph mem reembed' : 'no'}`,\n ` Relations: ${stats.relations} (${stats.pendingConflicts} pending)`,\n ` Caveman compression: ${config.cavemanMode !== 'off' ? config.cavemanMode : 'off (storing raw)'}`,\n ];\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_review': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const obs = mem.getObservationsForReview(args.limit as number ?? 20);\n if (obs.length === 0) return 'No overdue observations \u2014 all review_after dates are in the future.';\n const now = Date.now();\n return obs.map((o, i) => {\n const daysOverdue = Math.floor((now - (o.reviewAfter ?? now)) / 86400000);\n return `${i + 1}. [${o.kind}]${o.topicKey ? ` (${o.topicKey})` : ''} ${o.content.slice(0, 120)} \u2014 overdue by ${daysOverdue}d`;\n }).join('\\n');\n }\n\n case 'kirograph_mem_mark_reviewed': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.markReviewed(args.id as string);\n return `Observation ${args.id} marked as reviewed.`;\n }\n\n case 'kirograph_mem_compare': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const relationId = mem.compareObservations({\n observationA: args.observationA as string,\n observationB: args.observationB as string,\n relation: args.relation as any,\n confidence: args.confidence as number ?? 1.0,\n reason: args.reason as string | undefined,\n evidence: args.evidence as string | undefined,\n });\n return `Relation ${relationId} created (${args.relation}, confidence: ${args.confidence ?? 1.0}). Use kirograph_mem_judge to finalize.`;\n }\n\n case 'kirograph_mem_judge': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.judgeRelation(\n args.relationId as string,\n args.relation as any,\n args.confidence as number,\n args.reason as string | undefined,\n args.evidence as string | undefined,\n );\n return `Relation ${args.relationId} judged as [${args.relation}] (confidence: ${args.confidence}).`;\n }\n\n case 'kirograph_mem_capture': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const extracted = mem.capturePassive(args.content as string);\n if (extracted.length === 0) return 'No structured sections found. Use ## Key Learnings, ## Observations, ## Decisions, or ## Key Changes headings.';\n return `Captured ${extracted.length} observation(s):\\n` + extracted.map((e, i) => `${i + 1}. [${e.kind}] ${e.content.slice(0, 100)}${e.id ? '' : ' (duplicate)'}`).join('\\n');\n }\n\n case 'kirograph_mem_save_prompt': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const id = await mem.savePrompt(args.content as string);\n return `Prompt saved as ${id}.`;\n }\n\n case 'kirograph_mem_suggest_topic_key': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const key = mem.suggestTopicKey(args.kind as string, args.title as string);\n return `Suggested topic_key: ${key}`;\n }\n\n case 'kirograph_mem_conflicts_scan': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const candidates = mem.scanConflicts(args.limit as number ?? 50);\n if (candidates.length === 0) return 'No potential conflicts found among recent observations.';\n return `Found ${candidates.length} potential conflict(s):\\n` + candidates.map((c, i) =>\n `${i + 1}. [${c.observationA.kind}] \"${c.observationA.content.slice(0, 80)}\" \u2194 [${c.observationB.kind}] \"${c.observationB.content.slice(0, 80)}\" (similarity: ${c.similarity.toFixed(2)})`\n ).join('\\n') + '\\n\\nUse kirograph_mem_compare to establish relations.';\n }\n\n case 'kirograph_mem_prune': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const olderThan = (args.olderThan as string) ?? '90d';\n const durationMs = (() => {\n const m = olderThan.match(/^(\\d+)(d|m|w|h)$/);\n if (!m) return 90 * 86400000;\n const v = parseInt(m[1]);\n switch (m[2]) {\n case 'h': return v * 3600000;\n case 'd': return v * 86400000;\n case 'w': return v * 7 * 86400000;\n case 'm': return v * 30 * 86400000;\n default: return 90 * 86400000;\n }\n })();\n const deleted = mem.prune(durationMs);\n return `Pruned ${deleted} observation(s) older than ${olderThan}.`;\n }\n\n case 'kirograph_mem_lint': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const result = mem.lint();\n const lines = ['Memory Lint Results:'];\n lines.push(` Stale links: ${result.staleLinks}`);\n lines.push(` Model mismatch: ${result.modelMismatch ? 'yes' : 'no'}`);\n lines.push(` Stale sessions: ${result.staleSessions} (auto-closed)`);\n if (args.fix && result.staleLinks > 0) {\n const removed = mem.removeStaleLinks();\n lines.push(`\\n\u2713 Removed ${removed} stale link(s)`);\n } else if (result.staleLinks > 0) {\n lines.push(`\\nPass fix: true to remove stale links.`);\n }\n if (result.modelMismatch) {\n lines.push(`\\nRun 'kirograph mem reembed' to fix model mismatch.`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_conflicts_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const limit = clampLimit(args.limit as number | undefined, 20);\n const pending = mem.getPendingRelations(limit);\n if (pending.length === 0) return 'No pending conflict relations.';\n return `Pending relations (${pending.length}):\\n\\n` + pending.map(r =>\n `[${r.id}] ${r.relation}\\n A: ${r.observationA}\\n B: ${r.observationB}${r.reason ? `\\n Reason: ${r.reason}` : ''}`\n ).join('\\n\\n') + '\\n\\nUse kirograph_mem_conflicts_ignore to dismiss, or kirograph_mem_judge to finalize.';\n }\n\n case 'kirograph_mem_conflicts_ignore': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const relationId = args.relationId as string;\n mem.ignoreRelation(relationId);\n return `Relation \"${relationId}\" ignored.`;\n }\n\n // \u2500\u2500 Docs tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_docs_toc': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const toc = docs.getToc({ file: args.file as string | undefined, tree: args.tree as boolean | undefined });\n if (toc.length === 0) return args.file ? `No sections found in \"${args.file}\".` : 'No documentation indexed. Run kirograph index.';\n\n const lines: string[] = [];\n const renderEntry = (entry: any, indent: string) => {\n const prefix = '#'.repeat(entry.level || 1);\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${indent}${prefix} ${entry.title}${summary}`);\n lines.push(`${indent} ID: ${entry.id}`);\n if (entry.children?.length) {\n for (const child of entry.children) renderEntry(child, indent + ' ');\n }\n };\n\n if (args.tree) {\n for (const entry of toc) renderEntry(entry, '');\n } else {\n for (const entry of toc) {\n const prefix = '#'.repeat(entry.level || 1);\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${prefix} ${entry.title} [${entry.filePath}]${summary}`);\n lines.push(` ID: ${entry.id}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot, config);\n\n const results = await docs.searchSections(args.query as string, {\n file: args.file as string | undefined,\n limit: (args.limit as number) ?? 10,\n });\n\n if (results.length === 0) return `No documentation sections found matching \"${args.query}\".`;\n\n return results.map((r, i) => {\n const summary = r.section.summary ? `\\n ${r.section.summary}` : '';\n return `${i + 1}. ${r.section.title} [${r.section.filePath}]${summary}\\n ID: ${r.section.id}`;\n }).join('\\n\\n');\n }\n\n case 'kirograph_docs_section': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const result = docs.getSection(args.id as string, { context: args.context as boolean | undefined });\n if (!result) return `Section \"${args.id}\" not found.`;\n\n const lines: string[] = [];\n\n if (result.ancestors?.length) {\n lines.push('Breadcrumb: ' + result.ancestors.map(a => a.title).join(' > ') + ' > ' + result.section.title);\n lines.push('');\n }\n\n lines.push(result.content);\n\n if (result.children?.length) {\n lines.push('', '## Child sections:');\n for (const child of result.children) {\n const summary = child.summary ? ` \u2014 ${child.summary}` : '';\n lines.push(` - ${child.title}${summary} (ID: ${child.id})`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_outline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const outline = docs.getOutline(args.file as string);\n if (outline.length === 0) return `No sections found in \"${args.file}\". Is the file indexed?`;\n\n const lines: string[] = [`Outline: ${args.file}`, ''];\n const renderOutline = (entries: any[], indent: string) => {\n for (const entry of entries) {\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${indent}${'#'.repeat(entry.level || 1)} ${entry.title}${summary}`);\n if (entry.children?.length) renderOutline(entry.children, indent + ' ');\n }\n };\n renderOutline(outline, '');\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_refs': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const refs = docs.getRefs({\n sectionId: args.sectionId as string | undefined,\n qualifiedName: args.nodeId as string | undefined,\n });\n\n if (refs.length === 0) {\n if (args.sectionId) return `No code references found in section \"${args.sectionId}\".`;\n if (args.nodeId) return `No documentation sections reference \"${args.nodeId}\".`;\n return 'Provide either sectionId or nodeId to look up cross-references.';\n }\n\n return refs.map(r => {\n const direction = args.sectionId ? `\u2192 ${r.qualifiedName}` : `\u2190 ${r.sectionTitle ?? r.sectionId}`;\n return `[${r.refType}] ${direction} (confidence: ${r.confidence.toFixed(2)})`;\n }).join('\\n');\n }\n\n // \u2500\u2500 Data tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_data_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n const datasets = dq.listDatasets();\n\n if (datasets.length === 0) return 'No datasets indexed. Run kirograph index or kirograph data reindex.';\n\n return datasets.map(ds => {\n const sizeMb = (ds.fileSize / 1024 / 1024).toFixed(2);\n return `${ds.id} (${ds.format})\\n File: ${ds.filePath}\\n Rows: ${ds.rowCount.toLocaleString()} | Columns: ${ds.columnCount} | Size: ${sizeMb} MB`;\n }).join('\\n\\n');\n }\n\n case 'kirograph_data_describe': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n if (args.column) {\n const col = dq.describeColumn(args.dataset as string, args.column as string);\n if (!col) return `Column \"${args.column}\" not found in dataset \"${args.dataset}\".`;\n return [\n `Column: ${col.name}`,\n `Type: ${col.inferredType}`,\n `Nullable: ${col.nullable} (${(col.nullPct * 100).toFixed(1)}% null)`,\n `Cardinality: ${col.cardinality}`,\n col.minValue ? `Min: ${col.minValue}` : '',\n col.maxValue ? `Max: ${col.maxValue}` : '',\n col.meanValue !== null ? `Mean: ${col.meanValue.toFixed(2)}` : '',\n `Samples: ${col.sampleValues.join(', ')}`,\n ].filter(Boolean).join('\\n');\n }\n\n const result = dq.describeDataset(args.dataset as string);\n if (!result) return `Dataset \"${args.dataset}\" not found. Use kirograph_data_list to see available datasets.`;\n\n const lines = [\n `Dataset: ${result.dataset.id} (${result.dataset.format})`,\n `File: ${result.dataset.filePath}`,\n `Rows: ${result.dataset.rowCount.toLocaleString()} | Columns: ${result.dataset.columnCount}`,\n '',\n 'Columns:',\n ];\n for (const col of result.columns) {\n const nullInfo = col.nullable ? ` (${(col.nullPct * 100).toFixed(0)}% null)` : '';\n const samples = col.sampleValues.length > 0 ? ` \u2014 samples: ${col.sampleValues.slice(0, 3).join(', ')}` : '';\n const summary = col.summary ? ` [${col.summary}]` : '';\n lines.push(` ${col.name}: ${col.inferredType}${nullInfo} [${col.cardinality} distinct]${samples}${summary}`);\n }\n\n // Validation rules\n const rules = dq.validationRules(args.dataset as string);\n if (rules && rules.length > 0) {\n lines.push('', 'Validation rules:');\n for (const r of rules.slice(0, 10)) {\n lines.push(` ${r.column}: ${r.rules.join('; ')}`);\n }\n }\n\n // Sample data hints\n const hints = dq.sampleHints(args.dataset as string);\n if (hints && hints.length > 0) {\n lines.push('', 'Sample data hints:');\n for (const h of hints.slice(0, 10)) {\n lines.push(` ${h.column}: ${h.hint}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_data_query': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const result = dq.queryRows(args.dataset as string, {\n filters: args.filters as any[],\n columns: args.columns as string[],\n limit: (args.limit as number) ?? 100,\n offset: (args.offset as number) ?? 0,\n });\n\n if (!result) return `Dataset \"${args.dataset}\" not found.`;\n if (result.rows.length === 0) return `No rows match the given filters (${result.totalMatching} total in dataset).`;\n\n const header = `${result.rows.length} rows returned (${result.totalMatching} total matching):\\n`;\n const rowStrs = result.rows.slice(0, 50).map((row, i) => {\n const vals = Object.entries(row).map(([k, v]) => `${k}=${v ?? 'null'}`).join(', ');\n return ` ${i + 1}. ${vals}`;\n });\n if (result.rows.length > 50) rowStrs.push(` \u2026and ${result.rows.length - 50} more rows`);\n let response = header + rowStrs.join('\\n');\n\n // Token budget enforcement\n const maxChars = config.dataMaxResponseTokens * 4;\n if (response.length > maxChars) {\n response = response.slice(0, maxChars) + '\\n\\n[truncated: response exceeded token budget]';\n }\n\n // Anti-loop detection\n response = this.checkPaginationLoop(args.dataset as string, args.offset as number | undefined, response);\n\n return response;\n }\n\n case 'kirograph_data_aggregate': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const result = dq.aggregate(args.dataset as string, {\n groupBy: (args.groupBy as string[]) ?? [],\n metrics: (args.metrics as any[]) ?? [],\n filters: args.filters as any[],\n });\n\n if (!result) return `Dataset \"${args.dataset}\" not found.`;\n if (result.rows.length === 0) return 'No results (empty dataset or all rows filtered out).';\n\n const keys = Object.keys(result.rows[0]);\n const header = keys.join(' | ');\n const separator = keys.map(() => '---').join(' | ');\n const rows = result.rows.slice(0, 100).map(row => keys.map(k => row[k] ?? 'null').join(' | '));\n\n let response = `${header}\\n${separator}\\n${rows.join('\\n')}${result.rows.length > 100 ? `\\n\u2026and ${result.rows.length - 100} more groups` : ''}`;\n\n // Token budget enforcement\n const maxChars = config.dataMaxResponseTokens * 4;\n if (response.length > maxChars) {\n response = response.slice(0, maxChars) + '\\n\\n[truncated: response exceeded token budget]';\n }\n\n return response;\n }\n\n case 'kirograph_data_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const cols = dq.searchColumns(args.dataset as string, args.query as string);\n if (cols.length === 0) return `No columns matching \"${args.query}\" in dataset \"${args.dataset}\".`;\n\n return cols.map(c => {\n const samples = c.sampleValues.length > 0 ? ` \u2014 samples: ${c.sampleValues.slice(0, 3).join(', ')}` : '';\n return `${c.name}: ${c.inferredType} [${c.cardinality} distinct]${samples}`;\n }).join('\\n');\n }\n\n case 'kirograph_data_join': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n try {\n const result = dq.join({\n left: args.left as string,\n right: args.right as string,\n leftColumn: args.leftColumn as string,\n rightColumn: args.rightColumn as string,\n type: (args.type as any) ?? 'inner',\n columns: args.columns as string[] | undefined,\n limit: args.limit as number | undefined,\n });\n\n if (!result) return `Dataset not found. Verify both dataset IDs with kirograph_data_list.`;\n\n const joinTypeStr = String(args.type ?? 'inner').toUpperCase();\n const header = `Join: ${args.left}.${args.leftColumn} ${joinTypeStr} JOIN ${args.right}.${args.rightColumn}\\nMatching rows: ${result.totalMatching} (showing ${result.rows.length})`;\n if (result.rows.length === 0) return `${header}\\n\\nNo matching rows.`;\n\n const lines = result.rows.map(r => JSON.stringify(r));\n let response = `${header}\\n\\n${lines.join('\\n')}`;\n\n // Token budget enforcement\n const maxChars = config.dataMaxResponseTokens * 4;\n if (response.length > maxChars) {\n response = response.slice(0, maxChars) + '\\n\\n[truncated: response exceeded token budget]';\n }\n\n return response;\n } catch (err) {\n return `Error: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n case 'kirograph_data_correlations': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const pairs = dq.correlations(args.dataset as string, args.threshold as number | undefined);\n if (pairs === null) return `Dataset \"${args.dataset}\" not found.`;\n if (pairs.length === 0) return `No correlations above threshold ${args.threshold ?? 0.3} found. The dataset may have fewer than 2 numeric columns or no significant correlations.`;\n\n const lines = pairs.map(p =>\n `${p.column1} \u2194 ${p.column2}: ${p.correlation > 0 ? '+' : ''}${p.correlation.toFixed(4)} (${p.strength})`\n );\n return `Correlations for \"${args.dataset}\" (threshold: ${args.threshold ?? 0.3}):\\n\\n${lines.join('\\n')}`;\n }\n\n case 'kirograph_data_quality': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const quality = dq.quality(args.dataset as string);\n if (quality === null) return `Dataset \"${args.dataset}\" not found.`;\n if (quality.length === 0) return `No quality issues detected in \"${args.dataset}\". All columns look healthy.`;\n\n const lines = quality.map(q =>\n `${q.column} (risk: ${(q.riskScore * 100).toFixed(0)}%): ${q.issues.join('; ')}`\n );\n return `Quality report for \"${args.dataset}\" (${quality.length} columns with issues):\\n\\n${lines.join('\\n')}`;\n }\n\n case 'kirograph_data_drift': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const drift = dq.detectDrift(args.dataset as string);\n if (drift === null) return `Dataset \"${args.dataset}\" not found.`;\n if (!drift.hasDrift) {\n const rowDelta = drift.rowCountDelta !== 0\n ? ` (rows: ${drift.rowCountDelta > 0 ? '+' : ''}${drift.rowCountDelta})`\n : '';\n return `No schema drift detected for \"${args.dataset}\".${rowDelta}`;\n }\n const driftLines = [`Schema drift detected for \"${args.dataset}\":`];\n if (drift.addedColumns?.length) driftLines.push(` Added columns: ${drift.addedColumns.join(', ')}`);\n if (drift.removedColumns?.length) driftLines.push(` Removed columns: ${drift.removedColumns.join(', ')}`);\n if ((drift as any).typeChanges?.length) {\n for (const tc of (drift as any).typeChanges) {\n driftLines.push(` Type change: ${tc.column} ${tc.from} \u2192 ${tc.to}`);\n }\n }\n if (drift.rowCountDelta !== 0) driftLines.push(` Row count delta: ${drift.rowCountDelta > 0 ? '+' : ''}${drift.rowCountDelta}`);\n return driftLines.join('\\n');\n }\n\n case 'kirograph_data_history': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableData) return 'Data indexing is not enabled. Set enableData: true in .kirograph/config.json and run kirograph index.';\n\n const { DataQueries } = await Promise.resolve().then(() => require('../data/queries.js'));\n const db = cg.getDatabase();\n db.applyDataSchema();\n const dq = new DataQueries(db.getRawDb());\n\n const limit = Math.min(Number(args.limit ?? 10), 50);\n const history = dq.getHistory(args.dataset as string, limit);\n if (history === null) return `Dataset \"${args.dataset}\" not found.`;\n if (history.length === 0) return `No history snapshots for \"${args.dataset}\".`;\n\n const histLines = [`Schema history for \"${args.dataset}\" (${history.length} snapshot(s)):\\n`];\n for (const snap of history) {\n const date = new Date(snap.snapshotAt).toISOString().replace('T', ' ').slice(0, 19);\n const colNames = snap.columns.map((c: any) => c.name).join(', ');\n histLines.push(`${date} rows: ${snap.rowCount.toLocaleString()} cols: ${snap.columnCount} schema: ${colNames}`);\n }\n return histLines.join('\\n');\n }\n\n // \u2500\u2500 Watchmen tools (require enableMemory + enableWatchmen) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_watchmen_status': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n if (!config.enableWatchmen) return 'Watchmen is not enabled. Set enableWatchmen: true in .kirograph/config.json';\n\n const { WatchmenChecker } = await Promise.resolve().then(() => require('../watchmen/index.js'));\n const { MemoryDatabase } = await Promise.resolve().then(() => require('../memory/database.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const memDb = new MemoryDatabase(db.getRawDb());\n memDb.initialize();\n\n const checker = new WatchmenChecker(config.watchmenThreshold);\n const { ready, pendingCount } = checker.shouldSynthesize(memDb);\n const { targetFiles } = checker.buildReadyResponse('', pendingCount, projectRoot);\n\n const statusLines = [\n `Watchmen Status:`,\n ` Pending observations: ${pendingCount} / ${config.watchmenThreshold} threshold`,\n ` Ready to synthesize: ${ready ? 'yes' : 'no'}`,\n ` Target files:`,\n ];\n for (const f of targetFiles) statusLines.push(` \u00B7 ${f}`);\n return statusLines.join('\\n');\n }\n\n case 'kirograph_watchmen_synthesize': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory || !config.enableWatchmen) return 'Watchmen is not enabled (enableMemory + enableWatchmen required).';\n if (config.watchmenSynthesisMode !== 'local') return 'watchmenSynthesisMode is not \"local\" \u2014 use the agent hook instead.';\n\n const { WatchmenChecker } = await Promise.resolve().then(() => require('../watchmen/index.js'));\n const { MemoryDatabase } = await Promise.resolve().then(() => require('../memory/database.js'));\n const { runLocalSynthesis } = await Promise.resolve().then(() => require('../watchmen/synthesize.js'));\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const memDb = new MemoryDatabase(db.getRawDb());\n memDb.initialize();\n\n const checker = new WatchmenChecker(config.watchmenThreshold);\n const { ready, pendingCount } = checker.shouldSynthesize(memDb);\n\n if (!ready && !args.force) {\n return `Watchmen: ${pendingCount}/${config.watchmenThreshold} observations \u2014 threshold not reached. Pass force: true to run anyway.`;\n }\n\n const observations = memDb.getObservationsSinceLastSummary(50);\n if (observations.length === 0) return 'No observations to synthesize.';\n\n const readyResult = checker.buildReadyResponse('', pendingCount, projectRoot);\n const result = await runLocalSynthesis(observations, readyResult, config.watchmenLocalModel, projectRoot, true);\n\n const mgr = new MemoryManager(config, db.getRawDb(), projectRoot);\n mgr.initialize();\n await mgr.store({ content: result.summaryObservation, kind: 'summary', source: 'agent' });\n\n const synthLines = [`Watchmen synthesis complete.`];\n if (result.filesWritten.length) synthLines.push(`Brief written to: ${result.filesWritten.join(', ')}`);\n if (result.skillsWritten.length) synthLines.push(`Skills written: ${result.skillsWritten.join(', ')}`);\n if (result.skillsPruned.length) synthLines.push(`Pruned stale: ${result.skillsPruned.join(', ')}`);\n return synthLines.join('\\n');\n }\n\n case 'kirograph_watchmen_reset': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n if (!config.enableWatchmen) return 'Watchmen is not enabled.';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mgr = new MemoryManager(config, db.getRawDb(), projectRoot);\n mgr.initialize();\n\n const id = await mgr.store({ content: `Watchmen counter reset via MCP at ${new Date().toISOString()}.`, kind: 'summary', source: 'manual' });\n return id ? 'Watchmen counter reset \u2014 pending observations set back to 0.' : 'Already at zero \u2014 nothing to reset.';\n }\n\n // \u2500\u2500 Affected tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_affected': {\n const files = (args.files as string[]) ?? [];\n if (files.length === 0) return 'No files provided. Pass file paths in the \"files\" array.';\n\n const affected = cg.getAffectedTests(files, {\n depth: (args.depth as number) ?? 5,\n testPattern: args.testPattern as string | undefined,\n });\n\n if (affected.length === 0) return `No affected test files found for the provided ${files.length} changed file(s).`;\n return `Affected test files (${affected.length}) for ${files.length} changed file(s):\\n\\n` +\n affected.map(f => `- ${f}`).join('\\n');\n }\n\n // \u2500\u2500 Security tools (require enableSecurity=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_security': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n if (!config.enableArchitecture) return 'Security requires architecture analysis. Set enableArchitecture: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const depCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies`,\n ) ?? { count: 0 };\n\n const vulnCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_vulnerabilities`,\n ) ?? { count: 0 };\n\n const verdictRows: Array<{ verdict: string; count: number }> = rawDb.all(\n `SELECT verdict, COUNT(*) as count FROM sec_reachability GROUP BY verdict`,\n );\n const verdicts: Record<string, number> = {};\n for (const row of verdictRows) {\n verdicts[row.verdict] = row.count;\n }\n\n const staleCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies WHERE vuln_data_stale = 1`,\n ) ?? { count: 0 };\n\n // Count suppressed CVEs\n const { SuppressionManager: SecSuppressionManager } = await Promise.resolve().then(() => require('../security/suppressions.js'));\n const secSuppressions = new SecSuppressionManager(projectRoot);\n const allCveIds: Array<{ cve_id: string }> = rawDb.all(`SELECT cve_id FROM sec_vulnerabilities`);\n const suppressedCveCount = allCveIds.filter(r => secSuppressions.isSuppressed(r.cve_id)).length;\n const visibleVulnCount = vulnCount.count - suppressedCveCount;\n\n const lines: string[] = [\n '# Security Overview',\n '',\n `Dependencies: ${depCount.count}`,\n `Vulnerabilities: ${visibleVulnCount}${suppressedCveCount > 0 ? ` (${suppressedCveCount} suppressed)` : ''}`,\n ];\n\n if (visibleVulnCount > 0) {\n const affected = verdicts['affected'] ?? 0;\n const notAffected = verdicts['not_affected'] ?? 0;\n const underInvestigation = verdicts['under_investigation'] ?? 0;\n const pending = visibleVulnCount - affected - notAffected - underInvestigation;\n\n lines.push('', '## Reachability Verdicts', '');\n if (affected > 0) lines.push(`\u25CF Affected: ${affected}`);\n if (notAffected > 0) lines.push(`\u25CF Not affected: ${notAffected}`);\n if (underInvestigation > 0) lines.push(`\u25CF Under investigation: ${underInvestigation}`);\n if (pending > 0) lines.push(`\u25CF Pending analysis: ${pending}`);\n }\n\n if (staleCount.count > 0) {\n lines.push('', `\u26A0 ${staleCount.count} dependenc${staleCount.count === 1 ? 'y has' : 'ies have'} stale vulnerability data. Use kirograph_vulns with refresh=true to update.`);\n }\n\n // Check if vulnerability data is stale by age\n const lastVulnCheck = (rawDb.get(\n `SELECT MIN(last_vuln_check) as oldest FROM sec_dependencies WHERE last_vuln_check IS NOT NULL`,\n ) as { oldest: number | null } | undefined)?.oldest;\n if (lastVulnCheck != null) {\n const ageMs = Date.now() - lastVulnCheck;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n const maxAge = config.securityEnrichMaxAgeDays ?? 7;\n if (ageDays > maxAge) {\n lines.push('', `\u26A0 Vulnerability data is ${Math.floor(ageDays)} days old (max: ${maxAge}). Run kirograph vulns --refresh to update.`);\n }\n }\n\n // Pattern SAST findings count\n try {\n const rawDbSec = db.getRawDb();\n const tableExistsSec = rawDbSec.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExistsSec) {\n const patternCount = rawDbSec.get('SELECT COUNT(*) as cnt FROM pattern_matches')?.cnt ?? 0;\n if (patternCount > 0) {\n const critCount = rawDbSec.get(\"SELECT COUNT(*) as cnt FROM pattern_matches WHERE severity = 'critical'\")?.cnt ?? 0;\n lines.push(`SAST findings: ${patternCount} pattern matches (${critCount} critical)`);\n }\n }\n } catch { /* non-critical */ }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_vulns': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Handle refresh\n if (args.refresh === true) {\n const { OsvAdapter } = await Promise.resolve().then(() => require('../security/vuln/osv-adapter.js'));\n const { VulnerabilityDatabaseClient } = await Promise.resolve().then(() => require('../security/vuln/client.js'));\n\n const adapters = config.securityDatabases.map((dbName: string) => {\n if (dbName.toUpperCase() === 'OSV') return new OsvAdapter();\n return null;\n }).filter(Boolean) as any[];\n\n const client = new VulnerabilityDatabaseClient(adapters, db);\n await client.enrichAll();\n }\n\n // Build query\n let query = `\n SELECT\n v.node_id, v.cve_id, v.severity_score, v.fixed_version, v.summary,\n v.epss_score, v.epss_percentile, v.risk_score,\n d.package_name, d.ecosystem, d.resolved_version, d.declared_constraint,\n r.verdict\n FROM sec_vulnerabilities v\n LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'\n LEFT JOIN sec_dependencies d ON d.node_id = e.source\n LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id\n WHERE 1=1\n `;\n const params: any[] = [];\n\n // Severity filter\n if (args.severity) {\n const severityRanges: Record<string, [number, number]> = {\n critical: [9.0, 10.0],\n high: [7.0, 8.9],\n medium: [4.0, 6.9],\n low: [0.1, 3.9],\n };\n const range = severityRanges[(args.severity as string).toLowerCase()];\n if (!range) return `Invalid severity: ${args.severity}. Use: critical, high, medium, low`;\n query += ` AND v.severity_score >= ? AND v.severity_score <= ?`;\n params.push(range[0], range[1]);\n }\n\n // Verdict filter\n if (args.verdict) {\n const validVerdicts = ['affected', 'not_affected', 'under_investigation'];\n if (!validVerdicts.includes(args.verdict as string)) {\n return `Invalid verdict: ${args.verdict}. Use: affected, not_affected, under_investigation`;\n }\n query += ` AND r.verdict = ?`;\n params.push(args.verdict);\n }\n\n const limit = clampLimit(args.limit as number | undefined, 20);\n query += ` ORDER BY v.risk_score DESC NULLS LAST LIMIT ?`;\n params.push(limit);\n\n const rows: Array<{\n node_id: string;\n cve_id: string;\n severity_score: number | null;\n fixed_version: string | null;\n summary: string | null;\n epss_score: number | null;\n epss_percentile: number | null;\n risk_score: number | null;\n package_name: string | null;\n ecosystem: string | null;\n resolved_version: string | null;\n declared_constraint: string | null;\n verdict: string | null;\n }> = rawDb.all(query, params);\n\n // Deduplicate by (cve_id, package_name, ecosystem) \u2014 same CVE can appear multiple\n // times when a package is declared in multiple manifests (monorepo).\n const verdictRankMcp = (v: string | null) =>\n v === 'affected' ? 3 : v === 'under_investigation' ? 2 : v === 'not_affected' ? 1 : 0;\n const dedupMapMcp = new Map<string, typeof rows[0]>();\n for (const row of rows) {\n const key = `${row.cve_id}::${row.package_name ?? ''}::${row.ecosystem ?? ''}`;\n const ex = dedupMapMcp.get(key);\n if (!ex || verdictRankMcp(row.verdict) > verdictRankMcp(ex.verdict)) dedupMapMcp.set(key, row);\n }\n const dedupedRowsMcp = [...dedupMapMcp.values()];\n\n // Filter out suppressed CVEs\n const { SuppressionManager } = await Promise.resolve().then(() => require('../security/suppressions.js'));\n const suppressionMgr = new SuppressionManager(projectRoot);\n const suppressedCount = dedupedRowsMcp.filter(row => suppressionMgr.isSuppressed(row.cve_id)).length;\n const filteredRows = dedupedRowsMcp.filter(row => !suppressionMgr.isSuppressed(row.cve_id));\n\n if (filteredRows.length === 0) {\n const noMatch = 'No vulnerabilities found' + ((args.severity || args.verdict) ? ' matching filters.' : '.');\n return suppressedCount > 0 ? `${noMatch} (${suppressedCount} suppressed)` : noMatch;\n }\n\n const { formatFixSuggestion } = await Promise.resolve().then(() => require('../security/export/fix-suggestions.js'));\n\n const lines: string[] = [`Vulnerabilities (${filteredRows.length}${suppressedCount > 0 ? `, ${suppressedCount} suppressed` : ''}):\\n`];\n\n for (const row of filteredRows) {\n const score = row.severity_score;\n let severityLabel: string;\n if (score == null) severityLabel = 'UNKNOWN';\n else if (score >= 9.0) severityLabel = 'CRITICAL';\n else if (score >= 7.0) severityLabel = 'HIGH';\n else if (score >= 4.0) severityLabel = 'MEDIUM';\n else severityLabel = 'LOW';\n\n let verdictLabel: string;\n if (!row.verdict) verdictLabel = 'pending';\n else if (row.verdict === 'affected') verdictLabel = 'affected';\n else if (row.verdict === 'not_affected') verdictLabel = 'not affected';\n else verdictLabel = 'investigating';\n\n const pkg = row.package_name\n ? `${row.package_name}@${row.resolved_version || row.declared_constraint || '?'}`\n : 'unknown package';\n\n const epssNote = row.epss_score != null\n ? ` [EPSS: ${row.epss_score.toFixed(2)}]`\n : '';\n const riskNote = row.risk_score != null\n ? ` [Risk: ${row.risk_score.toFixed(1)}]`\n : '';\n lines.push(`${severityLabel} ${row.cve_id} ${pkg} [${verdictLabel}]${epssNote}${riskNote}`);\n\n if (row.summary && row.summary !== 'Manually registered') {\n const truncSummary = row.summary.length > 120 ? row.summary.slice(0, 120) + '\u2026' : row.summary;\n lines.push(` ${truncSummary}`);\n }\n\n if (row.fixed_version && row.ecosystem && row.package_name) {\n const fix = formatFixSuggestion(row.ecosystem, row.package_name, row.fixed_version);\n if (fix) lines.push(` ${fix}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_vuln_add': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const cveId = args.cveId as string;\n const pkgName = args.package as string;\n if (!cveId) return 'Error: cveId is required.';\n if (!pkgName) return 'Error: package is required.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Find matching Dependency_Node\n const depRow: { node_id: string; ecosystem: string } | undefined = rawDb.get(\n `SELECT node_id, ecosystem FROM sec_dependencies WHERE package_name = ?`,\n [pkgName],\n );\n\n if (!depRow) {\n return `No dependency found matching \"${pkgName}\". Run kirograph index first to discover dependencies.`;\n }\n\n // Create Vulnerability_Node\n const vulnNodeId = `vuln:${cveId}`;\n const now = Date.now();\n const severity = args.severity as number | undefined;\n const summary = (args.summary as string) ?? 'Manually registered';\n const fixedVersion = (args.fixedVersion as string) ?? null;\n\n rawDb.run(\n `INSERT OR REPLACE INTO nodes\n (id, kind, name, qualified_name, file_path, language,\n start_line, end_line, start_column, end_column,\n is_exported, is_async, is_static, is_abstract, updated_at)\n VALUES (?, 'vulnerability', ?, ?, '', 'unknown', 0, 0, 0, 0, 0, 0, 0, 0, ?)`,\n [vulnNodeId, cveId, cveId, now],\n );\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities\n (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)\n VALUES (?, ?, ?, '[]', ?, ?, 'manual')`,\n [vulnNodeId, cveId, severity ?? null, fixedVersion, summary],\n );\n\n // Create has_vulnerability edge\n rawDb.run(\n `INSERT OR IGNORE INTO edges (source, target, kind, confidence, confidence_score)\n VALUES (?, ?, 'has_vulnerability', 'extracted', 1.0)`,\n [depRow.node_id, vulnNodeId],\n );\n\n return `Registered ${cveId} against ${pkgName}.`;\n }\n\n case 'kirograph_vuln_suppress': {\n const projectRoot = cg.getProjectRoot();\n const cveId = args.cveId as string;\n if (!cveId) return 'Error: cveId is required.';\n\n const { SuppressionManager } = await Promise.resolve().then(() => require('../security/suppressions.js'));\n const manager = new SuppressionManager(projectRoot);\n manager.add(cveId, args.reason as string | undefined, args.expires as string | undefined);\n\n const reasonNote = args.reason ? ` Reason: ${args.reason}.` : '';\n const expiresNote = args.expires ? ` Expires: ${args.expires}.` : '';\n return `${cveId} suppressed.${reasonNote}${expiresNote}`;\n }\n\n case 'kirograph_sbom': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SBOMExporter } = await Promise.resolve().then(() => require('../security/export/sbom.js'));\n const exporter = new SBOMExporter(db, projectRoot);\n const json = exporter.exportJSON();\n\n return truncate(json);\n }\n\n case 'kirograph_vex': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { VEXExporter } = await Promise.resolve().then(() => require('../security/export/vex.js'));\n const exporter = new VEXExporter(db, projectRoot);\n const json = exporter.exportJSON();\n\n return truncate(json);\n }\n\n case 'kirograph_reachability': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const target = args.target as string;\n if (!target) return 'Error: target is required (dependency name or CVE ID).';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Try to find target as a CVE ID in sec_vulnerabilities\n let vulnerabilityNodeId: string | null = null;\n let targetLabel = target;\n\n const vulnRow: { node_id: string } | undefined = rawDb.get(\n `SELECT node_id FROM sec_vulnerabilities WHERE cve_id = ?`,\n [target],\n );\n\n if (vulnRow) {\n vulnerabilityNodeId = vulnRow.node_id;\n } else {\n // Try to find target as a dependency name\n const depRow: { node_id: string; package_name: string } | undefined = rawDb.get(\n `SELECT node_id, package_name FROM sec_dependencies WHERE package_name = ?`,\n [target],\n );\n\n if (depRow) {\n targetLabel = depRow.package_name;\n // Find vulnerabilities linked to this dependency\n const vulnEdge: { target: string } | undefined = rawDb.get(\n `SELECT target FROM edges WHERE source = ? AND kind = 'has_vulnerability' LIMIT 1`,\n [depRow.node_id],\n );\n\n if (vulnEdge) {\n vulnerabilityNodeId = vulnEdge.target;\n } else {\n return `No vulnerabilities found for dependency \"${target}\". The dependency exists but has no known vulnerabilities.`;\n }\n } else {\n return `Target \"${target}\" not found. Provide a valid CVE ID or dependency package name.`;\n }\n }\n\n // Run reachability analysis\n const { ReachabilityAnalyzer } = await Promise.resolve().then(() => require('../security/reachability.js'));\n const analyzer = new ReachabilityAnalyzer(db, config);\n const result = await analyzer.analyze(vulnerabilityNodeId);\n\n const lines: string[] = [\n `# Reachability: ${targetLabel}`,\n '',\n `Verdict: ${result.verdict}`,\n `Reaching entry points: ${result.reachingEntryPointCount}`,\n ];\n\n if (result.paths.length > 0) {\n lines.push('', '## Paths');\n for (const p of result.paths.slice(0, 5)) {\n lines.push(`- From ${p.entryPoint}: ${p.path.join(' \u2192 ')}`);\n }\n if (result.paths.length > 5) {\n lines.push(` \u2026and ${result.paths.length - 5} more paths`);\n }\n }\n\n if (result.unresolvedSymbols.length > 0) {\n lines.push('', '## Unresolved Symbols');\n for (const sym of result.unresolvedSymbols.slice(0, 10)) {\n lines.push(`- ${sym}`);\n }\n if (result.unresolvedSymbols.length > 10) {\n lines.push(` \u2026and ${result.unresolvedSymbols.length - 10} more`);\n }\n }\n\n // Get impact summary if affected\n if (result.verdict === 'affected') {\n const impact = await analyzer.getImpactSummary(vulnerabilityNodeId);\n if (impact) {\n lines.push('', '## Impact Summary');\n if (impact.affectedLayers.length > 0) {\n lines.push(`Affected layers: ${impact.affectedLayers.join(', ')}`);\n }\n lines.push(`Affected entry points: ${impact.affectedEntryPoints.length}`);\n lines.push(`Distinct paths: ${impact.distinctPathCount}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_staleness': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const threshold = typeof args.threshold === 'number' ? args.threshold : 0.3;\n\n // Optionally refresh staleness data from registries\n if (args.refresh === true) {\n const { StalenessChecker } = await Promise.resolve().then(() => require('../security/staleness.js'));\n const checker = new StalenessChecker(db);\n await checker.checkAll();\n }\n\n const rows: Array<{\n package_name: string;\n ecosystem: string;\n resolved_version: string | null;\n declared_constraint: string;\n latest_version: string | null;\n latest_published: number | null;\n staleness_score: number | null;\n }> = rawDb.all(\n `SELECT package_name, ecosystem, resolved_version, declared_constraint,\n latest_version, latest_published, staleness_score\n FROM sec_dependencies\n WHERE staleness_score >= ?\n ORDER BY staleness_score DESC`,\n [threshold],\n );\n\n if (rows.length === 0) {\n return `No dependencies found with staleness_score >= ${threshold}.` +\n (args.refresh ? '' : ' Use refresh=true to fetch latest version data from registries.');\n }\n\n const lines: string[] = [`Stale Dependencies (threshold: ${threshold}):\\n`];\n for (const row of rows) {\n const resolved = row.resolved_version ?? row.declared_constraint ?? '?';\n const latest = row.latest_version ?? '?';\n const score = row.staleness_score ?? 0;\n const months = row.latest_published\n ? Math.round((Date.now() - row.latest_published) / (1000 * 60 * 60 * 24 * 30))\n : null;\n const bar = '\u2588'.repeat(Math.round(score * 10)) + '\u2591'.repeat(10 - Math.round(score * 10));\n const monthsStr = months !== null ? `, ${months}mo since latest` : '';\n lines.push(`${row.package_name} (${row.ecosystem}): ${resolved} \u2192 ${latest}${monthsStr}`);\n lines.push(` ${bar} ${score.toFixed(2)}`);\n }\n\n const totalCount: { count: number } = rawDb.get(`SELECT COUNT(*) as count FROM sec_dependencies`) ?? { count: 0 };\n lines.push('', `${rows.length} of ${totalCount.count} dependencies are stale (score >= ${threshold})`);\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_licenses': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const deps: Array<{\n package_name: string;\n ecosystem: string;\n license: string | null;\n }> = rawDb.all(\n `SELECT package_name, ecosystem, license FROM sec_dependencies ORDER BY ecosystem, package_name`,\n );\n\n const { checkLicensePolicy } = await Promise.resolve().then(() => require('../security/license.js'));\n const policy = config.securityLicensePolicy;\n const violations = checkLicensePolicy(deps, policy);\n\n if (args.policy === true) {\n // Return only violations\n if (violations.length === 0) {\n return 'No license policy violations found.';\n }\n const lines: string[] = ['# License Policy Violations\\n'];\n for (const v of violations) {\n lines.push(`${v.severity.toUpperCase()} ${v.packageName} [${v.ecosystem}] ${v.license}`);\n }\n const denyCount = violations.filter(v => v.severity === 'deny').length;\n const warnCount = violations.filter(v => v.severity === 'warn').length;\n lines.push('');\n if (denyCount > 0) lines.push(`${denyCount} denied license${denyCount !== 1 ? 's' : ''}`);\n if (warnCount > 0) lines.push(`${warnCount} license warning${warnCount !== 1 ? 's' : ''}`);\n return truncate(lines.join('\\n'));\n }\n\n // Full listing\n if (deps.length === 0) {\n return 'No dependencies found. Run kirograph index first.';\n }\n\n const violationMap = new Map<string, 'deny' | 'warn'>();\n for (const v of violations) {\n violationMap.set(`${v.ecosystem}:${v.packageName}`, v.severity);\n }\n\n const lines: string[] = [`# License Report (${deps.length} dependencies)\\n`];\n\n // Violations first\n if (violations.length > 0) {\n lines.push('## Policy Violations\\n');\n for (const v of violations) {\n lines.push(`${v.severity.toUpperCase()} ${v.packageName} [${v.ecosystem}] ${v.license}`);\n }\n lines.push('');\n }\n\n lines.push('## All Dependencies\\n');\n lines.push('package | ecosystem | license | status');\n lines.push('------- | --------- | ------- | ------');\n\n for (const dep of deps) {\n const key = `${dep.ecosystem}:${dep.package_name}`;\n const violation = violationMap.get(key);\n const license = dep.license ?? '(unknown)';\n const status = violation ?? (dep.license ? 'ok' : 'unknown');\n lines.push(`${dep.package_name} | ${dep.ecosystem} | ${license} | ${status}`);\n }\n\n const denyCount = violations.filter(v => v.severity === 'deny').length;\n const warnCount = violations.filter(v => v.severity === 'warn').length;\n const unknownCount = deps.filter(d => !d.license).length;\n\n lines.push('');\n if (denyCount > 0) lines.push(`${denyCount} denied license${denyCount !== 1 ? 's' : ''}`);\n if (warnCount > 0) lines.push(`${warnCount} license warning${warnCount !== 1 ? 's' : ''}`);\n if (unknownCount > 0) lines.push(`${unknownCount} unknown license${unknownCount !== 1 ? 's' : ''}`);\n if (denyCount === 0 && warnCount === 0) lines.push('No policy violations');\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_attack_surface': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { AttackSurfaceAnalyzer } = await Promise.resolve().then(() => require('../security/attack-surface.js'));\n const analyzer = new AttackSurfaceAnalyzer(db);\n const result = await analyzer.analyze();\n\n if (result.totalRoutes === 0) {\n return 'No route nodes found in the graph. Ensure the project has been indexed with architecture analysis enabled.';\n }\n\n const limit = clampLimit(args.limit as number | undefined, 20);\n const routes = (args.publicOnly === true)\n ? result.criticalPaths.filter(r => r.exposureLevel === 'public')\n : result.criticalPaths;\n\n const lines: string[] = [\n '# Attack Surface',\n '',\n `Total routes: ${result.totalRoutes} Public: ${result.publicRoutes} Authenticated: ${result.authenticatedRoutes} Routes with vulns: ${result.routesWithVulns}`,\n '',\n ];\n\n const displayed = routes.slice(0, limit);\n if (displayed.length === 0) {\n lines.push(args.publicOnly === true\n ? 'No public routes with vulnerable dependencies found.'\n : 'No routes with vulnerable dependencies found.');\n } else {\n for (const entry of displayed) {\n const authTag = entry.isAuthenticated ? '[auth]' : '[public]';\n const riskTag = entry.riskScore > 0 ? ` risk=${entry.riskScore.toFixed(1)}` : '';\n lines.push(`${authTag} ${entry.route} (${entry.exposureLevel})${riskTag} ${entry.filePath}`);\n for (const dep of entry.vulnerableDeps.slice(0, 3)) {\n lines.push(` \u2514 ${dep.cveId} via ${dep.packageName} (${dep.hopCount} hop${dep.hopCount !== 1 ? 's' : ''}${dep.verdict ? `, ${dep.verdict}` : ''})`);\n }\n if (entry.vulnerableDeps.length > 3) {\n lines.push(` \u2514 \u2026and ${entry.vulnerableDeps.length - 3} more vulns`);\n }\n }\n if (routes.length > limit) {\n lines.push('', `\u2026and ${routes.length - limit} more routes (increase limit to see all)`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_secrets': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SecretsScanner } = await Promise.resolve().then(() => require('../security/secrets.js'));\n const scanner = new SecretsScanner(db, projectRoot);\n const result = await scanner.scan({ includeTests: args.includeTests === true });\n\n if (result.totalFindings === 0) {\n return `No secrets found. Scanned ${result.filesScanned} file${result.filesScanned !== 1 ? 's' : ''}.`;\n }\n\n let findings = result.findings;\n if (args.severity) {\n findings = findings.filter(f => f.severity === (args.severity as string));\n }\n\n if (findings.length === 0) {\n return `No secrets found matching severity \"${args.severity}\". Total findings (all severities): ${result.totalFindings}.`;\n }\n\n const lines: string[] = [\n `# Secrets Scan (${result.filesScanned} files scanned)`,\n '',\n `Found: ${result.totalFindings} Critical: ${result.criticalCount} High: ${result.highCount}`,\n '',\n ];\n\n for (const f of findings) {\n lines.push(`${f.severity.toUpperCase()} ${f.type}`);\n lines.push(` ${f.filePath}:${f.line}:${f.column} snippet: ${f.snippet}`);\n if (f.nodeName) {\n lines.push(` in function: ${f.nodeName}`);\n }\n if (f.entryPointCount > 0) {\n lines.push(` reachable from ${f.entryPointCount} entry point${f.entryPointCount !== 1 ? 's' : ''}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_security_flows': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { DataFlowAnalyzer } = await Promise.resolve().then(() => require('../security/data-flows.js'));\n const analyzer = new DataFlowAnalyzer(db);\n let findings = await analyzer.analyze();\n\n const typeFilter = (args.type as string | undefined) ?? 'all';\n const TYPE_MAP: Record<string, string> = {\n sql: 'sql-injection',\n eval: 'dangerous-eval',\n deserialize: 'unsafe-deserialize',\n path: 'path-traversal',\n crypto: 'hardcoded-crypto',\n };\n\n if (typeFilter !== 'all') {\n const mapped = TYPE_MAP[typeFilter];\n if (!mapped) return `Invalid type filter \"${typeFilter}\". Use: sql, eval, deserialize, path, crypto, all`;\n findings = findings.filter(f => f.type === mapped);\n }\n\n if (findings.length === 0) {\n return typeFilter === 'all'\n ? 'No dangerous data flows detected.'\n : `No \"${typeFilter}\" findings detected.`;\n }\n\n const lines: string[] = [\n `# Security Flows (${findings.length} finding${findings.length !== 1 ? 's' : ''})`,\n '',\n ];\n\n for (const f of findings) {\n lines.push(`${f.severity.toUpperCase()} [${f.owaspCategory}] ${f.type}`);\n lines.push(` ${f.filePath}:${f.line} symbol: ${f.symbol}`);\n lines.push(` ${f.description}`);\n lines.push(` Fix: ${f.recommendation}`);\n lines.push('');\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_supply_chain': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SupplyChainChecker } = await Promise.resolve().then(() => require('../security/supply-chain.js'));\n const checker = new SupplyChainChecker(db);\n const { results, errors } = await checker.checkAll();\n\n const RISK_ORDER: Record<string, number> = { critical: 0, high: 1, medium: 2, low: 3, unknown: 4 };\n const thresholdArg = args.threshold as string | undefined;\n const thresholdOrder = thresholdArg ? (RISK_ORDER[thresholdArg] ?? 4) : 2; // default: medium and above\n\n const filtered = results\n .filter(r => (RISK_ORDER[r.riskLevel] ?? 4) <= thresholdOrder)\n .sort((a, b) => (RISK_ORDER[a.riskLevel] ?? 4) - (RISK_ORDER[b.riskLevel] ?? 4));\n\n if (filtered.length === 0) {\n return `No supply chain risks found at threshold \"${thresholdArg ?? 'medium'}\" or above. Checked ${results.length} dependencies.`;\n }\n\n const lines: string[] = [\n `# Supply Chain Health (${filtered.length} risks, threshold: ${thresholdArg ?? 'medium'})`,\n '',\n ];\n\n for (const r of filtered) {\n const scoreStr = r.scorecardScore !== null ? ` scorecard=${r.scorecardScore.toFixed(1)}/10` : '';\n const maintainerStr = r.maintainerCount !== null ? ` maintainers=${r.maintainerCount}` : '';\n lines.push(`${r.riskLevel.toUpperCase()} ${r.packageName} (${r.ecosystem})${scoreStr}${maintainerStr}`);\n for (const reason of r.riskReasons) {\n lines.push(` \u2022 ${reason}`);\n }\n }\n\n if (errors.length > 0) {\n lines.push('', `\u26A0 ${errors.length} package${errors.length !== 1 ? 's' : ''} could not be checked (network errors)`);\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_dep_confusion': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { DepConfusionChecker } = await Promise.resolve().then(() => require('../security/dep-confusion.js'));\n const checker = new DepConfusionChecker(db);\n const findings = await checker.check();\n\n if (findings.length === 0) {\n return 'No dependency confusion vulnerabilities detected.';\n }\n\n const RISK_ORDER: Record<string, number> = { critical: 0, high: 1, medium: 2 };\n const sorted = [...findings].sort((a, b) => (RISK_ORDER[a.riskLevel] ?? 3) - (RISK_ORDER[b.riskLevel] ?? 3));\n\n const lines: string[] = [\n `# Dependency Confusion (${findings.length} finding${findings.length !== 1 ? 's' : ''})`,\n '',\n ];\n\n for (const f of sorted) {\n lines.push(`${f.riskLevel.toUpperCase()} ${f.packageName} (${f.ecosystem})`);\n lines.push(` ${f.explanation}`);\n if (f.publicExists && f.publicVersion) {\n lines.push(` Public version: ${f.publicVersion}${f.publicPublishedAt ? ` published: ${f.publicPublishedAt}` : ''}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_remediation': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableSecurity) return 'Security analysis is not enabled. Set enableSecurity: true in .kirograph/config.json and run kirograph index.';\n\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { RemediationTracker } = await Promise.resolve().then(() => require('../security/remediation.js'));\n const tracker = new RemediationTracker(db);\n let statuses = tracker.getStatus();\n\n if (args.overdueOnly === true) {\n statuses = statuses.filter(s => s.isOverdue);\n }\n\n if (statuses.length === 0) {\n return args.overdueOnly === true\n ? 'No overdue vulnerabilities found.'\n : 'No open vulnerabilities with SLA tracking data found.';\n }\n\n // Sort: overdue first, then by slaStatus, then by severity desc\n const SLA_ORDER: Record<string, number> = { overdue: 0, warning: 1, no_fix: 2, ok: 3 };\n statuses.sort((a, b) => {\n const slaA = SLA_ORDER[a.slaStatus] ?? 3;\n const slaB = SLA_ORDER[b.slaStatus] ?? 3;\n if (slaA !== slaB) return slaA - slaB;\n return (b.severity ?? 0) - (a.severity ?? 0);\n });\n\n const overdueCount = statuses.filter(s => s.isOverdue).length;\n const warningCount = statuses.filter(s => s.slaStatus === 'warning').length;\n\n const lines: string[] = [\n `# Remediation SLA (${statuses.length} open${overdueCount > 0 ? `, ${overdueCount} overdue` : ''}${warningCount > 0 ? `, ${warningCount} warning` : ''})`,\n '',\n ];\n\n for (const s of statuses) {\n const severityLabel = s.severity == null ? 'UNKNOWN'\n : s.severity >= 9 ? 'CRITICAL'\n : s.severity >= 7 ? 'HIGH'\n : s.severity >= 4 ? 'MEDIUM'\n : 'LOW';\n\n const slaTag = s.slaStatus === 'overdue' ? '[OVERDUE]'\n : s.slaStatus === 'warning' ? '[WARNING]'\n : s.slaStatus === 'no_fix' ? '[NO_FIX]'\n : '[OK]';\n\n lines.push(`${slaTag} ${severityLabel} ${s.cveId} ${s.packageName}`);\n if (s.daysOpen !== null) lines.push(` Open for ${s.daysOpen} day${s.daysOpen !== 1 ? 's' : ''}`);\n if (s.daysWithFixAvailable !== null) lines.push(` Fix available for ${s.daysWithFixAvailable} day${s.daysWithFixAvailable !== 1 ? 's' : ''}`);\n if (s.slaDeadline !== null) {\n const deadlineDate = new Date(s.slaDeadline).toISOString().slice(0, 10);\n lines.push(` SLA deadline: ${deadlineDate}`);\n }\n }\n\n return truncate(lines.join('\\n'));\n }\n\n case 'kirograph_live_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n\n if (!config.enablePatterns) {\n return 'kirograph_live_search requires enablePatterns: true in .kirograph/config.json';\n }\n\n const { PatternRunner } = await Promise.resolve().then(() => require('../patterns/runner.js'));\n const runner = new PatternRunner();\n\n if (!runner.isAvailable()) {\n return 'kirograph_live_search requires @ast-grep/napi. Run: npm install @ast-grep/napi';\n }\n\n const pattern = args.pattern as string;\n const language = args.language as string;\n const rawLimit = typeof args.limit === 'number' ? args.limit : 20;\n const limit = Math.max(1, Math.min(100, Math.round(rawLimit)));\n\n const db = cg.getDatabase();\n const rawDb = db.getRawDb();\n\n const files: Array<{ path: string }> = rawDb.all(\n 'SELECT path FROM files WHERE language = ? LIMIT 5000',\n [language],\n );\n\n const results: Array<{ filePath: string; line: number; matchText: string }> = [];\n let truncated = false;\n\n for (const file of files) {\n if (results.length >= limit) { truncated = true; break; }\n\n let content: string;\n try {\n const fullPath = path.isAbsolute(file.path) ? file.path : path.join(projectRoot, file.path);\n content = fs.readFileSync(fullPath, 'utf8');\n } catch {\n continue;\n }\n\n const matches = await runner.runInline(pattern, language, content);\n for (const m of matches) {\n if (results.length >= limit) { truncated = true; break; }\n results.push({ filePath: file.path, line: m.line, matchText: m.matchText });\n }\n }\n\n if (results.length === 0) {\n return `0 matches for '${pattern}' in ${language} files`;\n }\n\n const lines: string[] = [\n `${results.length} match${results.length !== 1 ? 'es' : ''} for '${pattern}' in ${language} files`,\n '',\n ];\n\n for (const r of results) {\n lines.push(` ${r.filePath}:${r.line}`);\n lines.push(` ${r.matchText}`);\n lines.push('');\n }\n\n if (truncated) {\n lines.push(`[truncated \u2014 showing first ${limit} results; refine your pattern or use --lang to narrow scope]`);\n }\n\n return truncate(lines.join('\\n'));\n }\n\n // \u2500\u2500 Pattern tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_pattern_coverage': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!(config as any).enablePatterns) {\n return 'Pattern analysis is not enabled. Set enablePatterns: true in .kirograph/config.json and run kirograph index.';\n }\n\n // Load all pattern rules to enumerate coverage\n const { PatternLibraryLoader } = await Promise.resolve().then(() => require('../patterns/loader.js'));\n const loader = new PatternLibraryLoader();\n const builtinPath = path.join(__dirname, '../patterns/library');\n const customPath = (config as any).patternLibraryPath as string | undefined;\n let rules: import('../patterns/types').PatternRule[] = [];\n try {\n rules = loader.load(builtinPath, customPath);\n } catch { /* no rules \u2014 continue */ }\n\n // Group rules by owaspCategory prefix (A01\u2013A10)\n const rulesByCategory = new Map<string, import('../patterns/types').PatternRule[]>();\n for (const rule of rules) {\n const prefix = rule.owaspCategory.match(/^(A\\d{2})/)?.[1] ?? rule.owaspCategory;\n if (!rulesByCategory.has(prefix)) rulesByCategory.set(prefix, []);\n rulesByCategory.get(prefix)!.push(rule);\n }\n\n // Query match counts from DB if table exists\n const db = cg.getDatabase();\n db.applyPatternsSchema();\n const rawDb = db.getRawDb();\n const matchCountsByCategory = new Map<string, number>();\n try {\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExists) {\n const rows: Array<{ owasp_category: string; cnt: number }> = rawDb.all(\n 'SELECT owasp_category, COUNT(*) as cnt FROM pattern_matches GROUP BY owasp_category'\n );\n for (const row of rows) {\n const prefix = row.owasp_category.match(/^(A\\d{2})/)?.[1] ?? row.owasp_category;\n matchCountsByCategory.set(prefix, (matchCountsByCategory.get(prefix) ?? 0) + row.cnt);\n }\n }\n } catch { /* non-critical */ }\n\n // All OWASP Top 10 categories\n const owaspTop10 = [\n 'A01', 'A02', 'A03', 'A04', 'A05',\n 'A06', 'A07', 'A08', 'A09', 'A10',\n ];\n const owaspNames: Record<string, string> = {\n A01: 'Broken Access Control',\n A02: 'Cryptographic Failures',\n A03: 'Injection',\n A04: 'Insecure Design',\n A05: 'Security Misconfiguration',\n A06: 'Vulnerable and Outdated Components',\n A07: 'Identification and Authentication Failures',\n A08: 'Software and Data Integrity Failures',\n A09: 'Security Logging and Monitoring Failures',\n A10: 'Server-Side Request Forgery',\n };\n\n const covered: string[] = [];\n const uncovered: string[] = [];\n\n const lines: string[] = [\n '# OWASP Top 10 Pattern Coverage',\n '',\n `Total rules loaded: ${rules.length}`,\n '',\n 'Category | Rules | Matches',\n '-------- | ----- | -------',\n ];\n\n for (const cat of owaspTop10) {\n const catRules = rulesByCategory.get(cat) ?? [];\n const matchCount = matchCountsByCategory.get(cat) ?? 0;\n const label = `${cat}: ${owaspNames[cat] ?? cat}`;\n if (catRules.length > 0) {\n covered.push(label);\n lines.push(`${label} | ${catRules.length} | ${matchCount}`);\n } else {\n uncovered.push(label);\n }\n }\n\n // Extra categories not in top 10\n for (const [cat, catRules] of rulesByCategory.entries()) {\n if (!owaspTop10.includes(cat)) {\n const matchCount = matchCountsByCategory.get(cat) ?? 0;\n lines.push(`${cat} | ${catRules.length} | ${matchCount}`);\n }\n }\n\n if (uncovered.length > 0) {\n lines.push('', `Uncovered categories (${uncovered.length}):`, ...uncovered.map(c => ` - ${c}`));\n }\n\n lines.push('', `Coverage: ${covered.length} / ${owaspTop10.length} OWASP Top 10 categories`);\n\n return lines.join('\\n');\n }\n\n case 'kirograph_pattern_save_baseline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!(config as any).enablePatterns) {\n return 'Pattern analysis is not enabled. Set enablePatterns: true in .kirograph/config.json and run kirograph index.';\n }\n\n const label = (args.label as string) ?? 'default';\n\n const db = cg.getDatabase();\n db.applyPatternsSchema();\n const rawDb = db.getRawDb();\n\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (!tableExists) {\n return 'No pattern_matches table found. Run kirograph index first to populate pattern data.';\n }\n\n const rows: Array<{ pattern_id: string; cnt: number }> = rawDb.all(\n 'SELECT pattern_id, COUNT(*) as cnt FROM pattern_matches GROUP BY pattern_id'\n );\n\n const baseline: Record<string, number> = {};\n for (const row of rows) {\n baseline[row.pattern_id] = row.cnt;\n }\n\n const kirographDir = path.join(projectRoot, '.kirograph');\n if (!fs.existsSync(kirographDir)) fs.mkdirSync(kirographDir, { recursive: true });\n\n const baselinePath = path.join(kirographDir, `pattern-baseline-${label}.json`);\n fs.writeFileSync(baselinePath, JSON.stringify({ label, savedAt: Date.now(), counts: baseline }, null, 2));\n\n const totalMatches = Object.values(baseline).reduce((s, c) => s + c, 0);\n return `Baseline \"${label}\" saved: ${Object.keys(baseline).length} patterns, ${totalMatches} total matches \u2192 ${baselinePath}`;\n }\n\n case 'kirograph_pattern_diff': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!(config as any).enablePatterns) {\n return 'Pattern analysis is not enabled. Set enablePatterns: true in .kirograph/config.json and run kirograph index.';\n }\n\n const label = (args.label as string) ?? 'default';\n const baselinePath = path.join(projectRoot, '.kirograph', `pattern-baseline-${label}.json`);\n\n if (!fs.existsSync(baselinePath)) {\n return `Baseline \"${label}\" not found. Run kirograph_pattern_save_baseline first.`;\n }\n\n let baseline: { label: string; savedAt: number; counts: Record<string, number> };\n try {\n baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));\n } catch {\n return `Failed to read baseline file: ${baselinePath}`;\n }\n\n const db = cg.getDatabase();\n db.applyPatternsSchema();\n const rawDb = db.getRawDb();\n\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n const currentCounts: Record<string, number> = {};\n if (tableExists) {\n const rows: Array<{ pattern_id: string; cnt: number }> = rawDb.all(\n 'SELECT pattern_id, COUNT(*) as cnt FROM pattern_matches GROUP BY pattern_id'\n );\n for (const row of rows) {\n currentCounts[row.pattern_id] = row.cnt;\n }\n }\n\n const allPatternIds = new Set([...Object.keys(baseline.counts), ...Object.keys(currentCounts)]);\n\n const newFindings: Array<{ id: string; count: number }> = [];\n const resolvedFindings: Array<{ id: string; count: number }> = [];\n const unchanged: Array<{ id: string; count: number }> = [];\n const changed: Array<{ id: string; before: number; after: number; delta: number }> = [];\n\n for (const id of allPatternIds) {\n const before = baseline.counts[id] ?? 0;\n const after = currentCounts[id] ?? 0;\n if (before === 0 && after > 0) {\n newFindings.push({ id, count: after });\n } else if (before > 0 && after === 0) {\n resolvedFindings.push({ id, count: before });\n } else if (before === after) {\n unchanged.push({ id, count: after });\n } else {\n changed.push({ id, before, after, delta: after - before });\n }\n }\n\n const savedDate = new Date(baseline.savedAt).toISOString().slice(0, 16).replace('T', ' ');\n const lines: string[] = [\n `# Pattern Diff: \"${label}\" (saved ${savedDate}) \u2192 current`,\n '',\n `NEW: ${newFindings.length} RESOLVED: ${resolvedFindings.length} CHANGED: ${changed.length} UNCHANGED: ${unchanged.length}`,\n ];\n\n if (newFindings.length > 0) {\n lines.push('', '## New Findings (not in baseline)');\n for (const f of newFindings.sort((a, b) => b.count - a.count)) {\n lines.push(` + ${f.id}: ${f.count} matches`);\n }\n }\n\n if (resolvedFindings.length > 0) {\n lines.push('', '## Resolved (in baseline, not in current)');\n for (const f of resolvedFindings.sort((a, b) => b.count - a.count)) {\n lines.push(` - ${f.id}: was ${f.count} matches`);\n }\n }\n\n if (changed.length > 0) {\n lines.push('', '## Changed');\n for (const f of changed.sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta))) {\n const sign = f.delta > 0 ? '+' : '';\n lines.push(` ~ ${f.id}: ${f.before} \u2192 ${f.after} (${sign}${f.delta})`);\n }\n }\n\n return lines.join('\\n');\n }\n\n // \u2500\u2500 Wiki tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n case 'kirograph_wiki_ingest': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initialize();\n\n const source = args.source as string ?? '';\n const sourceName = args.sourceName as string ?? 'source';\n if (!source) return 'source is required';\n\n if (config.wikiSynthesisMode === 'local') {\n wiki.queueSource(source, sourceName);\n const count = wiki.getQueueCount();\n return `Source \"${sourceName}\" queued for local wiki synthesis (${count} in queue). The agentStop hook will run \"kirograph wiki synthesize\" automatically.`;\n }\n\n const prompt = wiki.getIngestPrompt(source, sourceName);\n return `WIKI_INGEST_PROMPT\\n${prompt}\\n\\nProduce WIKI_DIFF blocks following SCHEMA.md, then call kirograph_wiki_apply_diff with the diff string.`;\n }\n\n case 'kirograph_wiki_apply_diff': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initialize();\n\n const diff = args.diff as string ?? '';\n if (!diff) return 'diff is required';\n\n const result = wiki.applyDiff(diff);\n const lines: string[] = ['\u2713 Wiki diff applied'];\n if (result.created.length) lines.push(` Created: ${result.created.join(', ')}`);\n if (result.updated.length) lines.push(` Updated: ${result.updated.join(', ')}`);\n if (result.conflictsResolved.length) lines.push(` Conflicts auto-resolved: ${result.conflictsResolved.join(', ')}`);\n if (result.conflictsPending.length) {\n lines.push(` \u26A1 Conflicts pending (${result.conflictsPending.length}):`);\n for (const c of result.conflictsPending) {\n lines.push(` ${c.page} \u00A7${c.section}: \"${c.existing}\" vs \"${c.incoming}\" (source: ${c.source})`);\n }\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_wiki_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const query = args.query as string ?? '';\n if (!query) return 'query is required';\n const limit = Math.min(Number(args.limit ?? 5), 20);\n\n const results = wiki.search(query, limit);\n if (results.length === 0) return `No wiki pages found for \"${query}\".`;\n\n const lines = [`Wiki Search: ${query}`, ''];\n for (const { page, score } of results) {\n lines.push(`[${page.slug}] ${page.title} (score: ${score.toFixed(3)})`);\n // Show first non-heading line as preview\n const preview = page.content.split('\\n').find(l => l.trim() && !l.startsWith('#'));\n if (preview) lines.push(` ${preview.trim().slice(0, 120)}`);\n lines.push('');\n }\n return lines.join('\\n').trim();\n }\n\n case 'kirograph_wiki_page': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const slug = args.slug as string ?? '';\n if (!slug) return 'slug is required';\n\n const page = wiki.getPage(slug);\n if (!page) return `Wiki page \"${slug}\" not found. Use kirograph_wiki_list to see available pages.`;\n\n return page.content;\n }\n\n case 'kirograph_wiki_lint': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const issues = wiki.lint();\n if (issues.length === 0) return '\u2713 Wiki lint passed \u2014 no issues found.';\n\n const lines = [`Wiki Lint \u2014 ${issues.length} issue(s)`, ''];\n for (const issue of issues) {\n const icon = issue.kind === 'contradiction' ? '\u26A1' : issue.kind === 'orphan' ? '\u25CB' : issue.kind === 'broken_link' ? '\uD83D\uDD17' : '\u26A0';\n lines.push(`${icon} [${issue.kind}] ${issue.slug}`);\n lines.push(` ${issue.detail}`);\n lines.push('');\n }\n return lines.join('\\n').trim();\n }\n\n case 'kirograph_wiki_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const pages = wiki.listPages();\n if (pages.length === 0) return 'Wiki is empty. Use kirograph_wiki_ingest to add pages.';\n\n const stats = wiki.getStats();\n const lines = [\n `Wiki \u2014 ${stats.pageCount} page(s), ${stats.totalSources} total sources`,\n '',\n ];\n for (const page of pages) {\n const date = new Date(page.updatedAt).toISOString().slice(0, 10);\n lines.push(` ${page.slug.padEnd(32)} ${page.title} (${page.sourceCount} src, ${date})`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_wiki_synthesize': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n if (config.wikiSynthesisMode !== 'local') return 'wikiSynthesisMode is not \"local\". This tool is for local-model synthesis only.';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initialize();\n\n const queueCount = wiki.getQueueCount();\n if (queueCount === 0) return 'Wiki queue is empty \u2014 nothing to synthesize.';\n\n const result = await wiki.synthesize(config.wikiLocalModel, true);\n const synthLines = [`Wiki synthesis complete \u2014 processed ${result.processed} source(s).`];\n if (result.created.length) synthLines.push(`Created: ${result.created.join(', ')}`);\n if (result.updated.length) synthLines.push(`Updated: ${result.updated.join(', ')}`);\n if (result.errors.length) synthLines.push(`Errors: ${result.errors.join('; ')}`);\n return synthLines.join('\\n');\n }\n\n case 'kirograph_wiki_init': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph', {\n autoResolveConflicts: (config as any).wikiAutoResolveConflicts ?? false,\n });\n wiki.initWiki();\n return 'Wiki initialized. SCHEMA.md and MANIFEST.md created in .kirograph/wiki/.';\n }\n\n case 'kirograph_wiki_reindex': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const count = wiki.reindex();\n return `Reindexed ${count} wiki page(s) from .kirograph/wiki/*.md.`;\n }\n\n case 'kirograph_wiki_status': {\n const { loadConfig } = await Promise.resolve().then(() => require('../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableWiki) return 'Wiki is not enabled. Set enableWiki: true in .kirograph/config.json';\n\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../wiki/index.js'));\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const wiki = new KiroGraphWiki(db.getRawDb(), projectRoot + '/.kirograph');\n wiki.initialize();\n\n const stats = wiki.getStats();\n const oldest = stats.oldestPage ? new Date(stats.oldestPage).toISOString().slice(0, 10) : 'n/a';\n const newest = stats.newestPage ? new Date(stats.newestPage).toISOString().slice(0, 10) : 'n/a';\n return [\n 'Wiki Status:',\n ` Pages: ${stats.pageCount}`,\n ` Total sources: ${stats.totalSources}`,\n ` Oldest page: ${oldest}`,\n ` Newest page: ${newest}`,\n ` Wiki dir: .kirograph/wiki/`,\n ].join('\\n');\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,SAAoB;AACpB,WAAsB;AACtB,aAAwB;AACxB,2BAAyB;AACzB,eAAoD;AAEpD,oBAAyB;AACzB,yBAA8D;AAC9D,qBAA6B;AAC7B,wBAAqC;AAErC,MAAM,aAAa;AAEnB,SAAS,SAAS,GAAmB;AACnC,SAAO,EAAE,SAAS,aAAa,EAAE,MAAM,GAAG,UAAU,IAAI,wBAAmB;AAC7E;AAGA,SAAS,mBAAmB,aAAqB,WAA6B;AAC5E,MAAI,QAAQ;AACZ,aAAW,MAAM,WAAW;AAC1B,QAAI;AACF,YAAM,WAAW,KAAK,WAAW,EAAE,IAAI,KAAK,KAAK,KAAK,aAAa,EAAE;AACrE,YAAM,OAAO,GAAG,SAAS,QAAQ;AACjC,eAAS,KAAK,MAAM,KAAK,OAAO,CAAC;AAAA,IACnC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAA2B,cAA8B;AAC3E,QAAM,IAAI,OAAO,UAAU,WAAW,QAAQ;AAC9C,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC;AACjD;AAGA,SAAS,QAAQ,MAAsB;AACrC,MAAI,SAAS,aAAc,QAAO;AAClC,SAAO;AACT;AAGA,SAAS,mBAAmB,aAA2B;AACrD,MAAI;AACF,UAAM,OAAO,OAAO,WAAW,QAAQ,EAAE,OAAO,WAAW,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACtF,OAAG,cAAc,4BAA4B,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,EACzE,QAAQ;AAAA,EAAoB;AAC9B;AAGA,SAAS,UAAU,WAA2B;AAC5C,QAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,QAAM,UAAU,KAAK,MAAM,OAAO,GAAK;AACvC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,MAAI,OAAO,EAAG,QAAO,GAAG,IAAI;AAC5B,QAAM,QAAQ,KAAK,MAAM,OAAO,CAAC;AACjC,MAAI,QAAQ,EAAG,QAAO,GAAG,KAAK;AAC9B,QAAM,SAAS,KAAK,MAAM,OAAO,EAAE;AACnC,SAAO,GAAG,MAAM;AAClB;AAYO,MAAM,QAA0B;AAAA,EACrC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,sEAAsE;AAAA,QAC5G,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,YAAY,UAAU,SAAS,aAAa,cAAc,YAAY,SAAS,WAAW;AAAA,QACnG;AAAA,QACA,OAAO,EAAE,MAAM,UAAU,aAAa,mCAAmC,SAAS,GAAG;AAAA,QACrF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,mCAAmC;AAAA,QACxE,UAAU,EAAE,MAAM,UAAU,aAAa,0BAA0B,SAAS,GAAG;AAAA,QAC/E,aAAa,EAAE,MAAM,WAAW,aAAa,2DAAsD,SAAS,KAAK;AAAA,QACjH,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,QAAQ,cAAc,SAAS;AAAA,UACtC,SAAS;AAAA,QACX;AAAA,QACA,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,QACzE,OAAO,EAAE,MAAM,UAAU,aAAa,mCAAmC,SAAS,GAAG;AAAA,QACrF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,QACzE,OAAO,EAAE,MAAM,UAAU,aAAa,mCAAmC,SAAS,GAAG;AAAA,QACrF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,QAC3E,OAAO,EAAE,MAAM,UAAU,aAAa,gCAAgC,SAAS,EAAE;AAAA,QACjF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,QAChE,aAAa,EAAE,MAAM,WAAW,aAAa,8DAAyD,SAAS,MAAM;AAAA,QACrH,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,WAAW,cAAc,MAAM;AAAA,UACtC,SAAS;AAAA,QACX;AAAA,QACA,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY,EAAE,MAAM,UAAU,aAAa,iDAAiD;AAAA,QAC5F,SAAS,EAAE,MAAM,UAAU,aAAa,2CAA2C;AAAA,QACnF,UAAU,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,QAC3E,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,QAAQ,QAAQ,WAAW,SAAS;AAAA,UAC3C,SAAS;AAAA,QACX;AAAA,QACA,iBAAiB,EAAE,MAAM,WAAW,aAAa,qCAAqC,SAAS,KAAK;AAAA,QACpG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,mCAAmC,SAAS,GAAG;AAAA,QACrF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,QAC1D,IAAI,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,QACxD,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ,IAAI;AAAA,IACzB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,YAAY,UAAU,MAAM;AAAA,UACnC,SAAS;AAAA,QACX;AAAA,QACA,cAAc,EAAE,MAAM,WAAW,aAAa,8CAA8C,SAAS,MAAM;AAAA,QAC3G,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,eAAe,YAAY,UAAU;AAAA,UAC5C,SAAS;AAAA,QACX;AAAA,QACA,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B,SAAS,GAAG;AAAA,QAC/E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,QACxF,cAAc,EAAE,MAAM,WAAW,aAAa,6CAA6C,SAAS,KAAK;AAAA,QACzG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,mCAAmC,SAAS,GAAG;AAAA,QACrF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,mCAAmC,SAAS,GAAG;AAAA,QACrF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,UAAU,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,QAC3E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,0DAA0D;AAAA,QAChG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,QACjE,WAAW;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,MAAM,QAAQ,MAAM;AAAA,UAC3B,SAAS;AAAA,QACX;AAAA,QACA,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,QACnE,KAAK,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,QACxD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,UAAU,cAAc,OAAO;AAAA,UACtC,SAAS;AAAA,QACX;AAAA,QACA,SAAS,EAAE,MAAM,UAAU,aAAa,sBAAsB,SAAS,GAAG;AAAA,QAC1E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,WAAW,SAAS,QAAQ,KAAK;AAAA,UACxC,SAAS;AAAA,QACX;AAAA,QACA,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,2DAA2D;AAAA,QAChG,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,QAAQ,OAAO,cAAc,QAAQ,SAAS,WAAW,SAAS;AAAA,UACzE,SAAS;AAAA,QACX;AAAA,QACA,OAAO,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,QACpE,KAAK,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,QAChE,SAAS,EAAE,MAAM,WAAW,aAAa,kCAAkC,SAAS,MAAM;AAAA,QAC1F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,+DAA+D;AAAA,QACpG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,QACxD,SAAS,EAAE,MAAM,UAAU,aAAa,oDAAoD;AAAA,QAC5F,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,QAAQ,UAAU,QAAQ,cAAc,OAAO;AAAA,UACtD,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,WAAW,aAAa,iCAAiC,SAAS,MAAM;AAAA,QACvF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,QAClF,UAAU,EAAE,MAAM,UAAU,aAAa,6CAA6C;AAAA,QACtF,UAAU,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,QAC7E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY,EAAE,MAAM,UAAU,aAAa,yDAAoD;AAAA,QAC/F,OAAO,EAAE,MAAM,UAAU,aAAa,yCAAyC;AAAA,QAC/E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,gDAAgD,MAAM,CAAC,UAAU,SAAS,EAAE;AAAA,QACjH,QAAQ,EAAE,MAAM,UAAU,aAAa,yCAAyC;AAAA,QAChF,OAAO,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,QACjE,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QACtE,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,YAAY,SAAS,WAAW,gBAAgB,WAAW,MAAM;AAAA,QAC1E;AAAA,QACA,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B,SAAS,GAAG;AAAA,QAC/E,WAAW,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,QACvE,MAAM,EAAE,MAAM,UAAU,aAAa,+FAA+F;AAAA,QACpI,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,QAC3D,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM,CAAC,YAAY,SAAS,WAAW,gBAAgB,WAAW,MAAM;AAAA,UACxE,SAAS;AAAA,QACX;AAAA,QACA,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,UAAU,EAAE,MAAM,UAAU,aAAa,4GAA4G;AAAA,QACrJ,aAAa,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,MAC5E;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,8BAA8B,SAAS,EAAE;AAAA,QAC/E,WAAW,EAAE,MAAM,UAAU,aAAa,2CAA2C;AAAA,QACrF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B,SAAS,GAAG;AAAA,QAC/E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,QACpD,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,IAAI;AAAA,IACjB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,cAAc,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,QACjF,cAAc,EAAE,MAAM,UAAU,aAAa,qCAAqC;AAAA,QAClF,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,cAAc,kBAAkB,cAAc,UAAU,WAAW,cAAc,GAAG,aAAa,gBAAgB;AAAA,QACpJ,YAAY,EAAE,MAAM,UAAU,aAAa,yCAAoC;AAAA,QAC/E,QAAQ,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,QACrE,UAAU,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,QACpE,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,gBAAgB,gBAAgB,UAAU;AAAA,IACvD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY,EAAE,MAAM,UAAU,aAAa,mEAAmE;AAAA,QAC9G,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,cAAc,kBAAkB,cAAc,UAAU,WAAW,cAAc,GAAG,aAAa,sBAAsB;AAAA,QAC1J,YAAY,EAAE,MAAM,UAAU,aAAa,gCAA2B;AAAA,QACtE,QAAQ,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QACnD,UAAU,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,QAC/D,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,cAAc,YAAY,YAAY;AAAA,IACnD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,sCAAsC;AAAA,QAC9E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,+BAA+B;AAAA,QACvE,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,YAAY,SAAS,WAAW,gBAAgB,WAAW,MAAM,GAAG,aAAa,mBAAmB;AAAA,QACnI,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,QAC7E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ,OAAO;AAAA,IAC5B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,0CAA0C,SAAS,GAAG;AAAA,QAC5F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,aAAa,yCAAyC,SAAS,MAAM;AAAA,QAClG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,KAAK,EAAE,MAAM,WAAW,aAAa,2BAA2B,SAAS,MAAM;AAAA,QAC/E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B,SAAS,GAAG;AAAA,QAC/E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY,EAAE,MAAM,UAAU,aAAa,4DAA4D;AAAA,QACvG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,YAAY;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,aAAa,6DAA6D;AAAA,QACpG,YAAY,EAAE,MAAM,UAAU,aAAa,8BAA8B,SAAS,SAAS;AAAA,QAC3F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,mDAAmD;AAAA,QACxF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,QACrD,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,SAAS,EAAE;AAAA,QAC7E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC;AAAA,QAC1E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,4EAA4E;AAAA,QACjH,MAAM,EAAE,MAAM,WAAW,aAAa,iCAAiC,SAAS,MAAM;AAAA,QACtF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,8CAA8C;AAAA,QACpF,MAAM,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,QAC5E,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B,SAAS,GAAG;AAAA,QAC/E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,UAAU,aAAa,cAAc;AAAA,QACjD,SAAS,EAAE,MAAM,WAAW,aAAa,kDAAkD,SAAS,MAAM;AAAA,QAC1G,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,IAAI;AAAA,IACjB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,sDAAsD;AAAA,QAC3F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,aAAa,6CAA6C;AAAA,QACvF,QAAQ,EAAE,MAAM,UAAU,aAAa,mDAAmD;AAAA,QAC1F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa,EAAE,MAAM,UAAU,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,EAAE,EAAE;AAAA,EACjF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,QAChF,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QACvE,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,QACrD,SAAS,EAAE,MAAM,SAAS,aAAa,uGAAuG;AAAA,QAC9I,SAAS,EAAE,MAAM,SAAS,aAAa,gDAAgD;AAAA,QACvF,OAAO,EAAE,MAAM,UAAU,aAAa,0CAA0C,SAAS,IAAI;AAAA,QAC7F,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,EAAE;AAAA,QACvE,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,QACrD,SAAS,EAAE,MAAM,SAAS,aAAa,sBAAsB;AAAA,QAC7D,SAAS,EAAE,MAAM,SAAS,aAAa,gFAAgF;AAAA,QACvH,SAAS,EAAE,MAAM,SAAS,aAAa,6DAA6D;AAAA,QACpG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,WAAW,WAAW,SAAS;AAAA,IAC5C;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,QACrD,OAAO,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,QACvD,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,WAAW,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,QACvD,OAAO,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,QACzD,YAAY,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QAC3E,aAAa,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,QAC7E,MAAM,EAAE,MAAM,UAAU,aAAa,2CAA2C,MAAM,CAAC,SAAS,QAAQ,OAAO,GAAG,SAAS,QAAQ;AAAA,QACnI,SAAS,EAAE,MAAM,SAAS,aAAa,6CAA6C;AAAA,QACpF,OAAO,EAAE,MAAM,UAAU,aAAa,0CAA0C,SAAS,IAAI;AAAA,QAC7F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ,SAAS,cAAc,aAAa;AAAA,IACzD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,QACrD,WAAW,EAAE,MAAM,UAAU,aAAa,sDAAsD,SAAS,IAAI;AAAA,QAC7G,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,QACrD,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,QAChF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,QAChF,OAAO,EAAE,MAAM,UAAU,aAAa,yCAAyC,SAAS,GAAG;AAAA,QAC3F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,WAAW,aAAa,gDAAgD,SAAS,MAAM;AAAA,QACtG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,aAAa;AAAA,QACf;AAAA,QACA,OAAO,EAAE,MAAM,UAAU,aAAa,+CAA+C,SAAS,EAAE;AAAA,QAChG,aAAa,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,QAC5F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,UAAU,EAAE,MAAM,UAAU,aAAa,4BAA4B,MAAM,CAAC,YAAY,QAAQ,UAAU,KAAK,EAAE;AAAA,QACjH,SAAS,EAAE,MAAM,UAAU,aAAa,kCAAkC,MAAM,CAAC,YAAY,gBAAgB,qBAAqB,EAAE;AAAA,QACpI,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B,SAAS,GAAG;AAAA,QAC/E,SAAS,EAAE,MAAM,WAAW,aAAa,0EAA0E,SAAS,MAAM;AAAA,QAClI,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,0CAA0C;AAAA,QAChF,SAAS,EAAE,MAAM,UAAU,aAAa,yCAAyC;AAAA,QACjF,UAAU,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,QAC3E,SAAS,EAAE,MAAM,UAAU,aAAa,mCAAmC;AAAA,QAC3E,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,QAC/F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,SAAS,SAAS;AAAA,IAC/B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,qDAAqD;AAAA,QAC3F,QAAQ,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,QAC3E,SAAS,EAAE,MAAM,UAAU,aAAa,iGAAiG;AAAA,QACzI,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,aAAa,sDAAsD;AAAA,QAC7F,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,QAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,aAAa,yEAAyE,SAAS,IAAI;AAAA,QAChI,SAAS,EAAE,MAAM,WAAW,aAAa,6EAA6E,SAAS,MAAM;AAAA,QACrI,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,WAAW,aAAa,kDAAkD,SAAS,MAAM;AAAA,QACzG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,sCAAsC,SAAS,GAAG;AAAA,QACxF,YAAY,EAAE,MAAM,WAAW,aAAa,6CAA6C,SAAS,MAAM;AAAA,QACxG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,cAAc,EAAE,MAAM,WAAW,aAAa,8BAA8B,SAAS,MAAM;AAAA,QAC3F,UAAU,EAAE,MAAM,UAAU,aAAa,mDAAmD,MAAM,CAAC,YAAY,QAAQ,UAAU,KAAK,EAAE;AAAA,QACxI,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,6DAA6D,SAAS,MAAM;AAAA,QACjH,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,aAAa,8CAA8C,MAAM,CAAC,YAAY,QAAQ,QAAQ,EAAE;AAAA,QAC7H,SAAS,EAAE,MAAM,WAAW,aAAa,sBAAsB,SAAS,MAAM;AAAA,QAC9E,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,WAAW,aAAa,2BAA2B,SAAS,MAAM;AAAA,QACvF,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC,SAAS,UAAU;AAAA,QAChG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC,SAAS,UAAU;AAAA,QAChG,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;AAQO,MAAM,8BAA8C;AAAA,EACzD,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,UAAU,CAAC,WAAW,UAAU;AAAA,IAChC,YAAY;AAAA,MACV,SAAS,EAAE,MAAM,UAAU,aAAa,4CAA4C;AAAA,MACpF,UAAU,EAAE,MAAM,UAAU,aAAa,2EAA2E;AAAA,MACpH,OAAO,EAAE,MAAM,UAAU,aAAa,qCAAqC,SAAS,GAAG;AAAA,MACvF,aAAa,EAAE,MAAM,SAAS;AAAA,IAChC;AAAA,EACF;AACF;AAEO,MAAM,YAAY;AAAA,EAMvB,YAAY,IAAsB;AAJlC,SAAQ,cAAc,oBAAI,IAAuB;AAEjD;AAAA,SAAQ,eAAe,oBAAI,IAAqD;AAG9E,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,oBAAoB,IAAqB;AACvC,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA,EAGA,WAAiB;AACf,eAAW,MAAM,KAAK,YAAY,OAAO,GAAG;AAC1C,UAAI;AAAE,WAAG,MAAM;AAAA,MAAG,QAAQ;AAAA,MAAe;AAAA,IAC3C;AACA,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA;AAAA,EAGQ,oBAAoB,SAAiB,QAA4B,UAA0B;AACjG,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,MAAM;AACZ,UAAM,gBAAgB,UAAU;AAGhC,eAAW,CAAC,GAAG,CAAC,KAAK,KAAK,cAAc;AACtC,UAAI,MAAM,EAAE,WAAW,IAAQ,MAAK,aAAa,OAAO,CAAC;AAAA,IAC3D;AAEA,UAAM,QAAQ,KAAK,aAAa,IAAI,GAAG,KAAK,EAAE,SAAS,CAAC,GAAG,UAAU,EAAE;AACvE,UAAM,QAAQ,KAAK,aAAa;AAChC,UAAM,WAAW;AAGjB,QAAI,MAAM,QAAQ,SAAS,GAAI,OAAM,UAAU,MAAM,QAAQ,MAAM,GAAG;AACtE,SAAK,aAAa,IAAI,KAAK,KAAK;AAGhC,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,YAAM,SAAS,MAAM,QAAQ,MAAM,EAAE;AACrC,UAAI,iBAAiB;AACrB,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAI,OAAO,CAAC,KAAM,OAAO,IAAI,CAAC,GAAI;AAAE,2BAAiB;AAAO;AAAA,QAAO;AAAA,MACrE;AACA,UAAI,gBAAgB;AAClB,eAAO,WAAW;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,aAAiD;AAC3E,QAAI,CAAC,YAAa,QAAO,KAAK;AAE9B,UAAM,WAAW,KAAK,QAAQ,WAAW;AACzC,QAAI,CAAC,KAAK,WAAW,QAAQ,EAAG,QAAO;AACvC,QAAI,KAAK,YAAY,IAAI,QAAQ,EAAG,QAAO,KAAK,YAAY,IAAI,QAAQ;AACxE,QAAI;AACF,YAAM,KAAK,MAAM,SAAAA,QAAU,KAAK,QAAQ;AACxC,WAAK,YAAY,IAAI,UAAU,EAAE;AACjC,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,UAAkB,MAA+G;AAC5I,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,SAAS,UAAU,IAAI;AAC/C,YAAM,YAAY,SAAS,IAAI;AAG/B,UAAI,aAAa,oBAAoB,aAAa,kBAAkB;AAClE,YAAI;AACF,gBAAM,cAAe,KAAK,eAA0B,KAAK,WAAW,eAAe,KAAK,QAAQ,IAAI;AACpG,gBAAM,EAAE,kBAAkB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,8BAA8B,CAAC;AACxG,gBAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,yBAAyB,CAAC;AAChG,gBAAM,eAAeA,gBAAe,SAAS;AAC7C,gBAAM,YAAY,kBAAkB,UAAU,cAAc,IAAI;AAChE,cAAI,cAAc,QAAQ,YAAY,cAAc;AAClD,kBAAM,UAAU,IAAI,4BAAa,WAAW;AAC5C,gBAAI,SAAS,WAAW,gBAAgB,GAAG;AACzC,sBAAQ,mBAAmB,UAAU,cAAc,SAAS;AAAA,YAC9D,WAAW,SAAS,WAAW,iBAAiB,GAAG;AACjD,sBAAQ,iBAAiB,UAAU,cAAc,SAAS;AAAA,YAC5D,WAAW,SAAS,WAAW,iBAAiB,GAAG;AACjD,sBAAQ,iBAAiB,UAAU,cAAc,SAAS;AAAA,YAC5D,OAAO;AACL,sBAAQ,kBAAkB,UAAU,cAAc,SAAS;AAAA,YAC7D;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAqB;AAAA,MAC/B;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC,EAAE;AAAA,IACxD,SAAS,KAAK;AACZ,kCAAS,kBAAkB,EAAE,MAAM,UAAU,OAAO,IAAI,CAAC;AACzD,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,UAAkB,MAAgD;AAEvF,QAAI,aAAa,kBAAkB;AACjC,YAAM,MAAM,KAAK;AACjB,UAAI,CAAC,IAAK,QAAO;AAEjB,YAAM,cAAe,KAAK,eAA2B,KAAK,OAAkB,QAAQ,IAAI;AACxF,YAAM,UAAW,KAAK,OAAkB;AAGxC,UAAI,eAAkD;AACtD,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,OAAO,yBAAyB,OAAO,0BAA0B,OAAO;AAC1E,yBAAe,OAAO;AAAA,QACxB;AAAA,MACF,QAAQ;AAAA,MAAgC;AAExC,YAAM,QAAS,KAAK,SAA+C;AACnE,YAAM,WAAY,KAAK,WAAsB,MAAM;AAEnD,UAAI;AACJ,UAAI,WAAW;AACf,UAAI;AACF,wBAAY,+BAAS,KAAK;AAAA,UACxB,KAAK;AAAA,UACL;AAAA,UACA,UAAU;AAAA,UACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,UAC9B,WAAW,KAAK,OAAO;AAAA,QACzB,CAAC;AAAA,MACH,SAAS,KAAU;AAEjB,qBAAa,IAAI,UAAU,OAAO,IAAI,UAAU;AAChD,mBAAW,IAAI,UAAU;AAAA,MAC3B;AAEA,YAAM,aAAS,6BAAS,KAAK,WAAW,EAAE,OAAO,gBAAgB,aAAa,EAAE,CAAC;AAGjF,YAAM,UAAU,IAAI,4BAAa,WAAW;AAC5C,cAAQ,OAAO,KAAK,OAAO,gBAAgB,OAAO,kBAAkB,OAAO,QAAQ;AAEnF,YAAM,SAAS,aAAa,IAAI,SAAS,QAAQ,OAAO;AACxD,YAAM,SAAS,OAAO,UAAU,IAC5B;AAAA;AAAA,GAAQ,OAAO,OAAO,oBAAoB,OAAO,cAAc,SAAI,OAAO,gBAAgB,MAAM,OAAO,QAAQ,MAC/G;AAEJ,aAAO,GAAG,MAAM,GAAG,OAAO,MAAM,GAAG,MAAM;AAAA,IAC3C;AAEA,QAAI,aAAa,kBAAkB;AACjC,YAAM,cAAe,KAAK,eAA0B,QAAQ,IAAI;AAChE,YAAM,SAAU,KAAK,UAAqB;AAC1C,YAAM,UAAU,IAAI,4BAAa,WAAW;AAC5C,YAAM,QAAQ,QAAQ,SAAS,MAA8C;AAE7E,UAAI,MAAM,kBAAkB,GAAG;AAC7B,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ;AAAA,QACZ,kBAAkB,MAAM;AAAA,QACxB,kBAAkB,MAAM,aAAa;AAAA,QACrC,gCAAgC,MAAM,cAAc,eAAe,CAAC;AAAA,QACpE,gCAAgC,MAAM,gBAAgB,eAAe,CAAC;AAAA,QACtE,YAAY,MAAM,WAAW,eAAe,CAAC,YAAY,MAAM,cAAc;AAAA,MAC/E;AAGA,UAAI,MAAM,SAAS,KAAK,QAAQ,KAAK,MAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,SAAS,OAAO,QAAQ,KAAK,MAAM,SAAS,KAAK,QAAQ,GAAG;AACvI,cAAM,KAAK,IAAI,YAAY;AAC3B,YAAI,MAAM,SAAS,MAAM,QAAQ,GAAG;AAClC,gBAAM,KAAK,kBAAkB,MAAM,SAAS,MAAM,KAAK,YAAY,MAAM,SAAS,MAAM,MAAM,eAAe,CAAC,oCAAoC;AAAA,QACpJ;AACA,YAAI,MAAM,SAAS,KAAK,QAAQ,GAAG;AACjC,gBAAM,KAAK,iBAAiB,MAAM,SAAS,KAAK,KAAK,YAAY,MAAM,SAAS,KAAK,MAAM,eAAe,CAAC,2CAA2C;AAAA,QACxJ;AACA,YAAI,MAAM,SAAS,KAAK,QAAQ,GAAG;AACjC,gBAAM,KAAK,iBAAiB,MAAM,SAAS,KAAK,KAAK,YAAY,MAAM,SAAS,KAAK,MAAM,eAAe,CAAC,2CAA2C;AAAA,QACxJ;AACA,YAAI,MAAM,SAAS,KAAK,QAAQ,GAAG;AACjC,gBAAM,KAAK,kBAAkB,MAAM,SAAS,KAAK,KAAK,YAAY,MAAM,SAAS,KAAK,MAAM,eAAe,CAAC,+BAA+B;AAAA,QAC7I;AACA,YAAI,MAAM,SAAS,OAAO,QAAQ,GAAG;AACnC,gBAAM,KAAK,aAAa,MAAM,SAAS,OAAO,KAAK,YAAY,MAAM,SAAS,OAAO,MAAM,eAAe,CAAC,2CAA2C;AAAA,QACxJ;AAAA,MACF;AAEA,UAAI,OAAO,KAAK,MAAM,QAAQ,EAAE,SAAS,GAAG;AAC1C,cAAM,KAAK,IAAI,eAAe;AAC9B,mBAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,MAAM,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG;AACvE,gBAAM,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,WAAW,KAAK,OAAO,eAAe;AAAA,QAC7E;AAAA,MACF;AAEA,UAAI,MAAM,eAAe,SAAS,GAAG;AACnC,cAAM,KAAK,IAAI,SAAS;AACxB,mBAAW,OAAO,MAAM,eAAe,MAAM,GAAG,CAAC,GAAG;AAClD,gBAAM,MAAM,IAAI,WAAW,UAAU,cAAO;AAC5C,gBAAM,KAAK,KAAK,GAAG,IAAI,IAAI,QAAQ,MAAM,GAAG,EAAE,CAAC,WAAM,IAAI,OAAO,SAAS;AAAA,QAC3E;AAAA,MACF;AAEA,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAEA,QAAI,aAAa,kBAAkB;AACjC,YAAM,WAAW,KAAK;AACtB,UAAI,CAAC,SAAU,QAAO;AAEtB,YAAM,cAAe,KAAK,eAA0B,QAAQ,IAAI;AAChE,YAAM,eAAe,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,KAAK,aAAa,QAAQ;AAC3F,YAAM,OAAQ,KAAK,QAAmB;AACtC,YAAM,UAAW,KAAK,WAAuB;AAE7C,UAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,eAAO,0BAA0B,YAAY;AAAA,MAC/C;AAEA,YAAM,EAAE,iBAAiB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,YAAY,CAAC;AACrF,YAAM,EAAE,gBAAgB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACzF,YAAM,QAAQ,iBAAiB;AAG/B,UAAI,SAAS,QAAQ;AAEnB,YAAIC,MAAuB;AAC3B,YAAI;AACF,UAAAA,MAAK,MAAM,KAAK,cAAc,KAAK,WAAiC;AAAA,QACtE,QAAQ;AAAA,QAA2B;AAEnC,cAAMC,UAAS,gBAAgB;AAAA,UAC7B;AAAA,UACA,UAAU;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,KAAK,KAAK;AAAA,UACV,IAAAD;AAAA,QACF,CAAC;AAGD,cAAM,KAAK,cAAc,IAAI;AAE7B,eAAOC,QAAO;AAAA,MAChB;AAGA,YAAM,SAAS,MAAM,KAAK,cAAc,OAAO;AAE/C,UAAI,OAAO,QAAQ;AACjB,eAAO,OAAO;AAAA,MAChB;AAEA,UAAI,OAAO,SAAS;AAClB,eAAO;AAAA;AAAA,EAAqC,OAAO,OAAO;AAAA,MAC5D;AAEA,aAAO,OAAO;AAAA,IAChB;AAEA,QAAI,aAAa,sBAAsB;AACrC,YAAM,WAAW,KAAK;AACtB,UAAI,CAAC,SAAU,QAAO;AAEtB,YAAM,cAAe,KAAK,eAA0B,QAAQ,IAAI;AAChE,YAAM,eAAe,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,KAAK,aAAa,QAAQ;AAE3F,YAAM,EAAE,iBAAiB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,YAAY,CAAC;AACrF,YAAM,QAAQ,iBAAiB;AAG/B,YAAM,SAAS,MAAM,mBAAmB,YAAY;AACpD,UAAI,WAAW,QAAW;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,eAAO,0BAA0B,YAAY;AAAA,MAC/C;AAGA,YAAM,SAAS,MAAM,KAAK,cAAc,IAAI;AAC5C,aAAO,OAAO;AAAA,IAChB;AAEA,QAAI,aAAa,sBAAsB;AACrC,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,WAAY,KAAK,SAAoB;AAC3C,YAAM,UAAU,KAAK;AACrB,YAAM,EAAE,gBAAgB,IAAI,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,yBAAyB,CAAC;AACrG,YAAM,iBAAiB,IAAI,IAAI;AAE/B,UAAI;AACJ,UAAI;AAEJ,UAAI,SAAS;AAEX,cAAM,aAAa,aAAa,UAAU,UAAU,aAAa,UAAU,aAAa,WAAW,WAAW;AAC9G,cAAM,EAAE,UAAAC,UAAS,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,yBAAyB,CAAC;AAC1F,cAAM,SAASA,UAAS,SAAS,MAAM,EAAE,OAAO,WAAkB,CAAC;AACnE,qBAAa,OAAO;AACpB,mBAAW,OAAO,OAAO,aAAa,IAAI,UAAU;AAAA,MACtD,OAAO;AAEL,cAAM,eAAe,aAAa,YAAY,aAAa,SAAS,SAAS,aAAa,eAAe,SAAS;AAClH,cAAM,EAAE,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,uBAAuB,CAAC;AACnG,cAAM,SAAS,oBAAoB,MAAM,YAAY;AACrD,qBAAa,OAAO;AACpB,mBAAW,WAAW,YAAY;AAAA,MACpC;AAEA,YAAM,mBAAmB,IAAI,UAAU;AACvC,YAAM,UAAU,iBAAiB,IAAI,KAAK,OAAQ,iBAAiB,oBAAoB,iBAAkB,GAAG,IAAI;AAChH,YAAM,SAAS,UAAU,IACrB;AAAA;AAAA,GAAQ,OAAO,oBAAoB,cAAc,SAAI,gBAAgB,MAAM,QAAQ,MACnF;AAEJ,aAAO,aAAa;AAAA,IACtB;AAEA,QAAI,aAAa,oBAAoB;AACnC,YAAM,cAAe,KAAK,eAA0B,QAAQ,IAAI;AAChE,YAAM,QAAS,KAAK,SAAqB;AAEzC,YAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,2BAA2B,CAAC;AACjG,YAAM,SAAS,cAAc,YAAY,WAAW;AAEpD,UAAI,OAAO;AACT,eAAO,MAAM;AACb,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,OAAO,UAAU;AAChC,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA,sBAAsB,OAAO,SAAS,eAAe,CAAC;AAAA,QACtD,sBAAsB,OAAO,QAAQ,IAAI,OAAO,MAAM,eAAe,IAAI,WAAW;AAAA,QACpF,sBAAsB,OAAO,QAAQ,IAAI,OAAO,UAAU,eAAe,IAAI,QAAG;AAAA,QAChF,sBAAsB,OAAO,WAAW;AAAA,MAC1C;AAEA,UAAI,OAAO,SAAS;AAClB,cAAM,KAAK;AAAA,WAAS,OAAO,OAAO,EAAE;AAAA,MACtC;AAEA,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAEA,UAAM,KAAK,MAAM,KAAK,cAAc,KAAK,WAAiC;AAC1E,QAAI,CAAC,GAAI,QAAO;AAGhB,uBAAmB,GAAG,eAAe,CAAC;AAEtC,YAAQ,UAAU;AAAA,MAChB,KAAK,oBAAoB;AACvB,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,cAAM,UAAU,GAAG;AAAA,UACjB,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,QACF;AACA,YAAI,QAAQ,WAAW,EAAG,QAAO,8BAA8B,KAAK,KAAK;AACzE,eAAO,QAAQ;AAAA,UAAI,OACjB,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI;AAAA,UAAa,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,SAAS;AAAA,eAAkB,EAAE,KAAK,aAAa;AAAA,QAC9H,EAAE,KAAK,MAAM;AAAA,MACf;AAAA,MAEA,KAAK,qBAAqB;AACxB,cAAM,SAAU,KAAK,WAAuB,KAAK,gBAAgB,QAAS,YAAY;AACtF,cAAM,MAAM,MAAM,GAAG,aAAa,KAAK,MAAgB;AAAA,UACrD,UAAW,KAAK,YAAuB;AAAA,UACvC,aAAa,WAAW;AAAA,QAC1B,CAAC;AACD,cAAM,QAAkB,CAAC,IAAI,SAAS,EAAE;AACxC,YAAI,IAAI,YAAY,WAAW,GAAG;AAChC,gBAAM,KAAK,wHAAwH;AAAA,QACrI,OAAO;AACL,gBAAM,KAAK,iBAAiB;AAC5B,qBAAW,KAAK,IAAI,aAAa;AAC/B,kBAAM,KAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,EAAE;AAC9E,gBAAI,WAAW,UAAU,IAAI,aAAa,IAAI,EAAE,EAAE,GAAG;AACnD,oBAAM,KAAK,OAAO,IAAI,aAAa,IAAI,EAAE,EAAE,GAAI,KAAK;AAAA,YACtD,WAAW,WAAW,cAAc;AAClC,kBAAK,EAAU,UAAW,OAAM,KAAK,gBAAiB,EAAU,SAAS,EAAE;AAC3E,kBAAK,EAAU,UAAW,OAAM,KAAK,WAAY,EAAU,SAAS,EAAE;AAAA,YACxE;AAAA,UACF;AACA,cAAI,IAAI,aAAa,SAAS,GAAG;AAC/B,kBAAM,KAAK,IAAI,oBAAoB;AACnC,uBAAW,KAAK,IAAI,aAAa,MAAM,GAAG,EAAE,GAAG;AAC7C,oBAAM,KAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,EAAE;AAAA,YAChF;AAAA,UACF;AAAA,QACF;AAGA,YAAI;AACF,gBAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,gBAAM,cAAc,GAAG,eAAe;AACtC,gBAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,cAAI,OAAO,cAAc;AACvB,kBAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,kBAAM,KAAK,GAAG,YAAY;AAC1B,eAAG,kBAAkB;AACrB,kBAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,gBAAI,WAAW;AAGf,kBAAM,iBAAiB;AAAA,cACrB,GAAG,IAAI,YAAY,IAAI,CAAC,MAAW,EAAE,aAAa;AAAA,cAClD,GAAG,IAAI,aAAa,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAW,EAAE,aAAa;AAAA,YACjE,EAAE,OAAO,OAAO;AAEhB,kBAAM,eAAe,OAAO,sBAAsB;AAClD,kBAAM,mBAAmB,OAAO,0BAA0B;AAG1D,gBAAI,aAAa,IAAI,sBAAsB,gBAAgB,cAAc,gBAAgB;AACzF,gBAAI,WAAW,WAAW,GAAG;AAE3B,4BAAc,MAAM,IAAI,OAAO,KAAK,MAAgB,EAAE,OAAO,aAAa,CAAC,GACxE,OAAO,OAAK,EAAE,SAAS,gBAAgB;AAAA,YAC5C;AAEA,gBAAI,WAAW,SAAS,GAAG;AACzB,oBAAM,KAAK,IAAI,mBAAmB;AAClC,yBAAW,KAAK,WAAW,MAAM,GAAG,YAAY,GAAG;AACjD,sBAAM,KAAK,MAAM,EAAE,YAAY,IAAI,KAAK,EAAE,YAAY,OAAO,EAAE;AAAA,cACjE;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAqE;AAG7E,YAAI;AACF,gBAAM,eAAe,GAAG,eAAe;AACvC,gBAAM,UAAU,OAAO,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC,GAAG,WAAW,YAAY;AAC3G,cAAI,QAAQ,cAAc,QAAQ,mBAAmB,GAAG;AACtD,kBAAM,MAAM,GAAG,YAAY;AAC3B,gBAAI,gBAAgB;AACpB,kBAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,kBAAM,cAAc,IAAI,YAAY,IAAI,SAAS,GAAG,YAAY;AAGhE,kBAAM,SAAS,IAAI,YAAY,IAAI,CAAC,MAAW,EAAE,aAAa,EAAE,OAAO,OAAO;AAE9E,gBAAI,OAAO,SAAS,GAAG;AAErB,oBAAM,UAAU,YAAY,QAAQ,EAAE,eAAe,OAAO,CAAC,EAAE,CAAC;AAChE,oBAAM,iBAAiB,OAAO,MAAM,GAAG,CAAC,EAAE,QAAQ,QAAM,YAAY,QAAQ,EAAE,eAAe,GAAG,CAAC,CAAC;AAClG,oBAAM,aAAa,CAAC,GAAG,SAAS,GAAG,cAAc;AAGjD,oBAAM,eAAe,oBAAI,IAAY;AACrC,oBAAM,aAAa,WAAW,OAAO,OAAK;AACxC,oBAAI,aAAa,IAAI,EAAE,SAAS,EAAG,QAAO;AAC1C,6BAAa,IAAI,EAAE,SAAS;AAC5B,uBAAO,EAAE,cAAc,QAAQ;AAAA,cACjC,CAAC,EAAE,MAAM,GAAG,QAAQ,gBAAgB;AAEpC,kBAAI,WAAW,SAAS,GAAG;AACzB,sBAAM,KAAK,IAAI,0BAA0B;AACzC,2BAAW,OAAO,YAAY;AAC5B,wBAAM,UAAU,YAAY,WAAW,IAAI,SAAS;AACpD,sBAAI,SAAS;AACX,0BAAM,UAAU,QAAQ,QAAQ,WAAW,QAAQ,QAAQ;AAC3D,0BAAM,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO,WAAM,QAAQ,QAAQ,QAAQ,SAAS,IAAI,SAAS,GAAG;AAAA,kBACjG;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAA6B;AAGrC,YAAI;AACF,gBAAM,eAAe,GAAG,eAAe;AACvC,gBAAM,UAAU,OAAO,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC,GAAG,WAAW,YAAY;AAC3G,cAAI,QAAQ,cAAc,QAAQ,mBAAmB,GAAG;AACtD,kBAAM,MAAM,GAAG,YAAY;AAC3B,gBAAI,gBAAgB;AAGpB,kBAAM,aAAa,IAAI,YAAY,IAAI,CAAC,MAAW,EAAE,QAAQ,EAAE,OAAO,OAAO;AAC7E,gBAAI,WAAW,SAAS,GAAG;AACzB,oBAAM,eAAe,WAAW,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AACxD,oBAAM,WAAW,IAAI,SAAS,EAAE;AAAA,gBAC9B;AAAA;AAAA,8CAE8B,YAAY;AAAA,gBAC1C;AAAA,cACF;AAEA,kBAAI,SAAS,SAAS,GAAG;AACvB,sBAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,sBAAM,KAAK,IAAI,YAAY,IAAI,SAAS,CAAC;AACzC,sBAAM,QAAQ,QAAQ;AAEtB,sBAAM,KAAK,IAAI,iBAAiB;AAChC,2BAAW,OAAO,SAAS,MAAM,GAAG,KAAK,GAAG;AAC1C,wBAAM,OAAO,GAAG,gBAAgB,IAAI,EAAE;AACtC,sBAAI,MAAM;AACR,0BAAM,aAAa,KAAK,QAAQ,IAAI,OAAK,GAAG,EAAE,IAAI,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,IAAI;AACjF,0BAAM,KAAK,OAAO,IAAI,EAAE,OAAO,IAAI,SAAS,YAAO,IAAI,SAAS,UAAU,IAAI,YAAY,OAAO;AACjG,0BAAM,KAAK,aAAa,UAAU,EAAE;AAAA,kBACtC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAA6B;AAGrC,YAAI;AACF,gBAAM,iBAAiB,GAAG,eAAe;AACzC,gBAAM,YAAY,OAAO,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC,GAAG,WAAW,cAAc;AAC/G,cAAI,UAAU,gBAAgB;AAC5B,kBAAM,QAAQ,GAAG,YAAY;AAC7B,kBAAM,oBAAoB;AAC1B,kBAAM,WAAW,MAAM,SAAS;AAGhC,kBAAM,iBAAiB;AAAA,cACrB,GAAG,IAAI,YAAY,IAAI,CAAC,MAAW,EAAE,EAAE;AAAA,cACvC,GAAG,IAAI,aAAa,IAAI,CAAC,MAAW,EAAE,EAAE;AAAA,YAC1C,EAAE,OAAO,OAAO;AAEhB,gBAAI,eAAe,SAAS,GAAG;AAC7B,oBAAM,EAAE,6BAA6B,uBAAuB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iCAAiC,CAAC;AAC7I,oBAAM,WAAW,4BAA4B,UAAU,cAAc;AAErE,kBAAI,SAAS,SAAS,GAAG;AAEvB,sBAAM,YAAY,oBAAI,IAAoB;AAC1C,2BAAW,KAAK,IAAI,aAAa;AAC/B,4BAAU,IAAI,EAAE,IAAI,EAAE,IAAI;AAAA,gBAC5B;AACA,2BAAW,KAAK,IAAI,cAAc;AAChC,4BAAU,IAAI,EAAE,IAAI,EAAE,IAAI;AAAA,gBAC5B;AAEA,sBAAM,aAAa,uBAAuB,UAAU,SAAS;AAC7D,oBAAI,YAAY;AACd,wBAAM,KAAK,UAAU;AAAA,gBACvB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAiC;AAGzC,YAAI;AACF,gBAAM,iBAAiB,GAAG,eAAe;AACzC,gBAAM,YAAY,OAAO,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC,GAAG,WAAW,cAAc;AAC/G,cAAK,UAAkB,gBAAgB;AACrC,kBAAM,QAAQ,GAAG,YAAY;AAC7B,kBAAM,oBAAoB;AAC1B,kBAAM,WAAW,MAAM,SAAS;AAChC,kBAAM,cAAc,SAAS,IAAI,8EAA8E;AAC/G,gBAAI,aAAa;AAEf,oBAAM,eAAe;AAAA,gBACnB,GAAG,IAAI,YAAY,IAAI,CAAC,MAAW,EAAE,QAAQ;AAAA,gBAC7C,GAAG,IAAI,aAAa,IAAI,CAAC,MAAW,EAAE,QAAQ;AAAA,cAChD,EAAE,OAAO,OAAO;AAChB,oBAAM,qBAAqB,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC;AAEpD,kBAAI,mBAAmB,SAAS,GAAG;AACjC,sBAAM,eAAe,mBAAmB,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAC/D,sBAAM,cACJ,SAAS;AAAA,kBACP,yGAAyG,YAAY;AAAA,kBACrH;AAAA,gBACF;AACF,oBAAI,YAAY,SAAS,GAAG;AAC1B,wBAAM,kBAAkB,YAAY;AAAA,oBAAI,OACtC,OAAO,EAAE,UAAU,OAAO,EAAE,SAAS,YAAY,CAAC,IAAI,EAAE,cAAc,MAAM,EAAE,SAAS,IAAI,EAAE,IAAI;AAAA,kBACnG,EAAE,KAAK,IAAI;AACX,wBAAM,KAAK,IAAI,8BAAyB,IAAI,eAAe;AAC3D,sBAAI,YAAY,WAAW,EAAG,OAAM,KAAK,IAAI,uEAAkE;AAAA,gBACjH;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAqB;AAG7B,cAAM,cAAc,MAAM,KAAK,IAAI,EAAE,SAAS;AAC9C,cAAM,cAAc,oBAAI,IAAI;AAAA,UAC1B,GAAG,IAAI,YAAY,IAAI,CAAC,MAAW,EAAE,QAAQ;AAAA,UAC7C,GAAG,IAAI,aAAa,IAAI,CAAC,MAAW,EAAE,QAAQ;AAAA,QAChD,CAAC;AACD,YAAI,YAAY,OAAO,GAAG;AACxB,gBAAM,cAAc,mBAAmB,GAAG,eAAe,GAAG,CAAC,GAAG,WAAW,CAAC;AAC5E,cAAI,cAAc,GAAG;AACnB,kBAAM,aAAa,KAAK,OAAO,IAAI,cAAc,eAAe,GAAG;AACnE,gBAAI,aAAa,GAAG;AAClB,oBAAM,KAAK,IAAI,OAAO,qBAAqB,KAAK,MAAM,WAAW,CAAC,uBAAuB,WAAW,+BAA0B,UAAU,aAAa;AAAA,YACvJ;AAAA,UACF;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,qBAAqB;AACxB,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,cAAM,UAAU,GAAG,YAAY,KAAK,QAAkB,QAAW,CAAC;AAClE,YAAI,QAAQ,WAAW,EAAG,QAAO,WAAW,KAAK,MAAM;AACvD,cAAM,OAAO,QAAQ,CAAC,EAAE;AACxB,cAAM,UAAU,MAAM,GAAG,WAAW,KAAK,IAAI,KAAK;AAClD,YAAI,QAAQ,WAAW,EAAG,QAAO,0BAA0B,KAAK,IAAI;AACpE,eAAO,gBAAgB,KAAK,IAAI;AAAA,IAAU,QAAQ;AAAA,UAAI,OACpD,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,QACnE,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,MAEA,KAAK,qBAAqB;AACxB,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,cAAM,UAAU,GAAG,YAAY,KAAK,QAAkB,QAAW,CAAC;AAClE,YAAI,QAAQ,WAAW,EAAG,QAAO,WAAW,KAAK,MAAM;AACvD,cAAM,OAAO,QAAQ,CAAC,EAAE;AACxB,cAAM,UAAU,MAAM,GAAG,WAAW,KAAK,IAAI,KAAK;AAClD,YAAI,QAAQ,WAAW,EAAG,QAAO,KAAK,KAAK,IAAI;AAC/C,eAAO,KAAK,KAAK,IAAI;AAAA,IAAgB,QAAQ;AAAA,UAAI,OAC/C,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,QACnE,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,MAEA,KAAK,oBAAoB;AACvB,cAAM,UAAU,GAAG,YAAY,KAAK,QAAkB,QAAW,CAAC;AAClE,YAAI,QAAQ,WAAW,EAAG,QAAO,WAAW,KAAK,MAAM;AACvD,cAAM,OAAO,QAAQ,CAAC,EAAE;AACxB,cAAM,WAAW,MAAM,GAAG,gBAAgB,KAAK,IAAK,KAAK,SAAoB,CAAC;AAC9E,YAAI,SAAS,WAAW,EAAG,QAAO,6BAA6B,KAAK,IAAI;AAExE,YAAI,SAAS,cAAc,KAAK,IAAI,iBAAiB,SAAS,MAAM;AAAA,IAClE,SAAS,IAAI,OAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI;AAGlG,YAAI;AACF,gBAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,gBAAM,cAAc,GAAG,eAAe;AACtC,gBAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,cAAI,OAAO,cAAc;AACvB,kBAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,kBAAM,KAAK,GAAG,YAAY;AAC1B,eAAG,kBAAkB;AACrB,kBAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,gBAAI,WAAW;AAEf,kBAAM,eAAe,OAAO,sBAAsB;AAClD,kBAAM,mBAAmB,OAAO,0BAA0B;AAC1D,kBAAM,aAAa,IAAI;AAAA,cACrB,CAAC,KAAK,aAAa;AAAA,cACnB;AAAA,cACA;AAAA,YACF;AAEA,gBAAI,WAAW,SAAS,GAAG;AACzB,wBAAU;AACV,yBAAW,KAAK,YAAY;AAC1B,sBAAM,MAAM,UAAU,EAAE,YAAY,SAAS;AAC7C,0BAAU;AAAA,KAAQ,EAAE,YAAY,IAAI,KAAK,EAAE,YAAY,OAAO,KAAK,GAAG;AAAA,cACxE;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAA+B;AAGvC,YAAI;AACF,gBAAM,WAAW,GAAG,YAAY,EAAE,SAAS;AAC3C,gBAAM,iBAAiB,SAAS,IAAI,8EAA8E;AAClH,cAAI,gBAAgB;AAClB,kBAAM,UAAU,SAAS,IAAI,+CAA+C,CAAC,KAAK,MAAM,CAAC;AACzF,gBAAI,SAAS;AACX,oBAAM,iBAAiB,SAAS;AAAA,gBAC9B;AAAA,gBACA,CAAE,QAA2B,EAAE;AAAA,cACjC;AACA,kBAAI,eAAe,SAAS,GAAG;AAC7B,0BAAU;AACV,2BAAW,MAAM,gBAAgB;AAC/B,4BAAU;AAAA,KAAQ,GAAG,SAAS,YAAY,CAAC,KAAK,GAAG,UAAU,YAAY,GAAG,IAAI;AAAA,gBAClF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAqB;AAE7B,eAAO;AAAA,MACT;AAAA,MAEA,KAAK,kBAAkB;AACrB,cAAM,UAAU,GAAG,YAAY,KAAK,QAAkB,QAAW,CAAC;AAClE,YAAI,QAAQ,WAAW,EAAG,QAAO,WAAW,KAAK,MAAM;AACvD,cAAM,OAAO,QAAQ,CAAC,EAAE;AACxB,cAAM,aAAc,KAAK,WAAsB,KAAK,cAAc,SAAS;AAC3E,cAAM,QAAQ;AAAA,UACZ,GAAG,QAAQ,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI;AAAA,UACpC,SAAS,KAAK,QAAQ,IAAI,KAAK,SAAS,IAAI,KAAK,OAAO;AAAA,UACxD,cAAc,KAAK,aAAa;AAAA,QAClC;AACA,YAAI,eAAe,gBAAgB,eAAe,QAAQ;AACxD,cAAI,KAAK,UAAW,OAAM,KAAK,cAAc,KAAK,SAAS,EAAE;AAC7D,cAAI,KAAK,UAAW,OAAM,KAAK,SAAS,KAAK,SAAS,EAAE;AAAA,QAC1D;AACA,YAAI,eAAe,QAAQ;AACzB,gBAAM,MAAM,GAAG,cAAc,IAAI;AACjC,cAAI,IAAK,OAAM,KAAK,IAAI,OAAO,KAAK,KAAK;AAAA,QAC3C;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,oBAAoB;AACvB,cAAM,QAAQ,MAAM,GAAG,SAAS;AAChC,cAAM,WAAW,OAAO,QAAQ,MAAM,eAAe,EAClD,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAC3B,KAAK,IAAI;AACZ,cAAM,QAAQ,MAAM,cAAc,OAAO,MAAM,QAAQ,CAAC;AACxD,cAAM,gBAAgB,MAAM,oBACxB;AAAA,UACE;AAAA,UACA,sBAAsB,MAAM,cAAc;AAAA,UAC1C,sBACE,MAAM,mBAAmB,eAAe,eAAe,MAAM,aAAa,uBAC1E,MAAM,mBAAmB,aAAe,aAAa,MAAM,aAAa,iBAAc,MAAM,gBAAgB,CAAC,0BAC7G,MAAM,mBAAmB,eAAe,eAAe,MAAM,aAAa,2BAC1E,MAAM,mBAAmB,UAAe,iBAAiB,MAAM,aAAa,oBAC5E,MAAM,mBAAmB,WAAe,oBAAoB,MAAM,aAAa,iBAC/E,MAAM,mBAAmB,YAAe,YAAY,MAAM,aAAa,2BACvE,MAAM,mBAAmB,WAAe,WAAW,MAAM,aAAa,2BACtE,MAAM,mBAAmB,cAAe,cAAc,MAAM,aAAa,8BACzE,mBACF;AAAA,UACA,sBAAsB,MAAM,cAAc,MAAM,MAAM,uBAAuB,MAAM,KAAK;AAAA,UACxF,GAAI,MAAM,iBAAiB,CAAC,6BAAwB,MAAM,cAAc,EAAE,IAAI,CAAC;AAAA,QACjF,IACA,CAAC,6BAA6B;AAClC,cAAM,gBAAgB,MAAM,WAAW,SAAS,IAC5C,iBAAiB,MAAM,WAAW,KAAK,IAAI,CAAC,KAC5C;AACJ,cAAM,WAAW,MAAM,sBACnB,MAAM,oBACJ,kCAA6B,MAAM,kBAAkB,QAAQ,cAAc,MAAM,kBAAkB,MAAM,YAAY,MAAM,kBAAkB,WAAW,UACxJ,0EACF;AAGJ,YAAI,WAAW;AACf,YAAI;AACF,gBAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AAC1F,gBAAM,MAAM,MAAM,QAAQ,GAAG,eAAe,CAAC;AAC7C,cAAI,IAAI,YAAY;AAClB,kBAAM,KAAK,GAAG,YAAY;AAC1B,eAAG,gBAAgB;AACnB,kBAAM,QAAQ,GAAG,SAAS;AAC1B,kBAAM,WAAW,MAAM,IAAI,2DAA2D,GAAG,OAAO;AAChG,kBAAM,cAAc,MAAM,IAAI,0CAA0C,GAAG,OAAO;AAClF,kBAAM,UAAU,MAAM,IAAI,2CAA2C,GAAG,OAAO;AAC/E,uBAAW,mCAA8B,QAAQ,WAAW,WAAW,cAAc,OAAO;AAAA,UAC9F;AAAA,QACF,QAAQ;AAAA,QAAqB;AAG7B,YAAI,WAAW;AACf,YAAI;AACF,gBAAM,EAAE,YAAY,SAAS,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AAC3F,gBAAM,OAAO,MAAM,SAAS,GAAG,eAAe,CAAC;AAC/C,cAAI,KAAK,YAAY;AACnB,kBAAM,SAAS,GAAG,YAAY,EAAE,SAAS;AACzC,eAAG,YAAY,EAAE,gBAAgB;AACjC,kBAAM,eAAe,OAAO,IAAI,2CAA2C,GAAG,OAAO;AACrF,gBAAI,eAAe,GAAG;AACpB,oBAAM,YAAY,OAAO,IAAI,mDAAmD,GAAG,SAAS;AAC5F,oBAAM,YAAY,OAAO,IAAI,sDAAsD,GAAG,SAAS;AAC/F,oBAAM,YAAY,OAAO,IAAI,mDAAmD,GAAG,SAAS;AAC5F,oBAAM,UAAU,YAAY,OAAO,MAAM,QAAQ,CAAC;AAClD,yBAAW,0BAAqB,YAAY,cAAc,UAAU,eAAe,CAAC,UAAU,SAAS,aAAa,MAAM;AAAA,YAC5H,OAAO;AACL,yBAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAqB;AAG7B,YAAI,eAAe;AACnB,YAAI;AACF,gBAAM,EAAE,YAAY,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AAC7F,gBAAM,SAAS,MAAM,WAAW,GAAG,eAAe,CAAC;AACnD,cAAI,OAAO,gBAAgB;AACzB,kBAAM,KAAK,GAAG,YAAY;AAC1B,eAAG,oBAAoB;AACvB,kBAAM,QAAQ,GAAG,SAAS;AAC1B,kBAAM,WAAW,MAAM,IAAI,8CAA8C,GAAG,OAAO;AACnF,kBAAM,YAAY,MAAM,IAAI,iDAAiD,GAAG,OAAO;AACvF,kBAAM,gBAAgB,MAAM,IAAI,yEAAyE,GAAG,OAAO;AACnH,kBAAM,aAAa,MAAM,IAAI,wEAAwE,GAAG,OAAO;AAC/G,kBAAM,YAAY,aAAa,IAAI,WAAM,UAAU,WAAW;AAC9D,2BAAe,8BAAyB,QAAQ,UAAU,SAAS,WAAW,aAAa,aAAa,SAAS;AAAA,UACnH;AAAA,QACF,QAAQ;AAAA,QAAqB;AAG7B,YAAI,eAAe;AACnB,YAAI;AACF,gBAAM,EAAE,YAAY,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AAC7F,gBAAM,OAAO,MAAM,WAAW,GAAG,eAAe,CAAC;AACjD,cAAK,KAAa,gBAAgB;AAChC,kBAAM,SAAS,GAAG,YAAY,EAAE,SAAS;AACzC,kBAAM,eAAe,OAAO,IAAI,8EAA8E;AAC9G,gBAAI,cAAc;AAChB,oBAAM,aAAa,OAAO,IAAI,6CAA6C,GAAG,OAAO;AACrF,oBAAM,YAAY,OAAO,IAAI,8DAA8D,GAAG,OAAO;AACrG,oBAAM,YAAY,OAAO,IAAI,+DAA+D,GAAG,OAAO;AACtG,6BAAe,8BAAyB,UAAU,aAAa,SAAS,qBAAqB,SAAS;AAAA,YACxG,OAAO;AACL,6BAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAqB;AAG7B,cAAM,YAAY,MAAM,wBAAwB;AAChD,cAAM,eAAuB,MAAM,gBAAgB;AACnD,cAAM,cAAuB,MAAM,eAAe;AAClD,cAAM,YAAsB,CAAC;AAC7B,YAAI,aAAa;AACf,oBAAU,KAAK,uDAAkD;AAAA,QACnE;AACA,YAAI,YAAY,KAAK,gBAAgB,WAAW;AAC9C,oBAAU;AAAA,YACR,2CAAiC,YAAY,QAAQ,iBAAiB,IAAI,MAAM,EAAE,oBACjF,cAAc,oCAAoC,sCACnD;AAAA,UACF;AAAA,QACF;AAGA,cAAM,UAAU,IAAI,4BAAa,GAAG,eAAe,CAAC;AACpD,cAAM,YAAY,QAAQ,SAAS,SAAS;AAC5C,cAAM,YAAsB,CAAC;AAC7B,YAAI,UAAU,gBAAgB,GAAG;AAC/B,oBAAU,KAAK,kBAAkB,UAAU,aAAa,cAAc,UAAU,cAAc,kBAAkB,UAAU,WAAW,eAAe,CAAC,6BAA6B;AAAA,QACpL;AAEA,eAAO;AAAA,UACL;AAAA,UACA,cAAc,GAAG,eAAe,CAAC;AAAA,UACjC,oBAAoB,MAAM,KAAK;AAAA,UAC/B,cAAc,MAAM,KAAK;AAAA,UACzB,oBAAoB,MAAM,KAAK;AAAA,UAC/B,cAAc,OAAO,QAAQ,MAAM,WAAW,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,UACvF,WAAW,kBAAkB,QAAQ,KAAK;AAAA,UAC1C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc,IAAI;AAAA,UAClB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,MAC7B;AAAA,MAEA,KAAK,mBAAmB;AA6EtB,YAASC,cAAT,SAAoB,OAA0C,QAAsB;AAClF,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,kBAAM,OAAO,MAAM,CAAC;AACpB,kBAAM,SAAS,MAAM,MAAM,SAAS;AACpC,kBAAM,YAAY,SAAS,wBAAS;AACpC,kBAAM,cAAc,UAAU,SAAS,SAAS;AAChD,kBAAM,OAAO,mBAAmB,KAAK,SAAS,UAAU,KAAK,WACzD,MAAM,KAAK,QAAQ,GAAG,KAAK,cAAc,SAAM,KAAK,WAAW,aAAa,EAAE,MAC9E;AACJ,kBAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,GAAG,IAAI,EAAE;AACrD,gBAAI,KAAK,UAAU,OAAQ,CAAAA,YAAW,KAAK,UAAU,WAAW;AAAA,UAClE;AAAA,QACF;AAZS,yBAAAA;AA5ET,cAAM,SAAU,KAAK,UAAqB;AAC1C,cAAM,kBAAkB,KAAK,oBAAoB;AACjD,cAAM,OAAO,GAAG,SAAS;AAAA,UACvB,YAAY,KAAK;AAAA,UACjB,SAAS,KAAK;AAAA,UACd,UAAU,KAAK;AAAA,QACjB,CAAC;AAED,YAAI,WAAW,QAAQ;AAErB,cAASC,eAAT,SAAqB,OAAgD;AACnE,uBAAW,QAAQ,OAAO;AACxB,kBAAI,KAAK,SAAS,QAAQ;AACxB,sBAAM,OAAO,mBAAmB,KAAK,WAAW,KAAK,KAAK,QAAQ,GAAG,KAAK,cAAc,SAAM,KAAK,WAAW,KAAK,EAAE,MAAM;AAC3H,qBAAK,KAAK,GAAG,KAAK,IAAI,GAAG,IAAI,EAAE;AAAA,cACjC;AACA,kBAAI,KAAK,UAAU,OAAQ,CAAAA,aAAY,KAAK,QAAQ;AAAA,YACtD;AAAA,UACF;AARS,4BAAAA;AADT,gBAAM,OAAiB,CAAC;AAUxB,UAAAA,aAAY,IAAI;AAChB,iBAAO,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI;AAAA,QAC7C;AAEA,YAAI,WAAW,WAAW;AAExB,cAASC,aAAT,SAAmB,OAAgD;AACjE,uBAAW,QAAQ,OAAO;AACxB,kBAAI,KAAK,SAAS,QAAQ;AACxB,sBAAM,MAAM,KAAK,KAAK,SAAS,GAAG,IAAI,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,YAAY,GAAG,CAAC,IAAI;AACvF,oBAAI,CAAC,OAAO,IAAI,GAAG,EAAG,QAAO,IAAI,KAAK,CAAC,CAAC;AACxC,uBAAO,IAAI,GAAG,EAAG,KAAK,IAAI;AAAA,cAC5B;AACA,kBAAI,KAAK,UAAU,OAAQ,CAAAA,WAAU,KAAK,QAAQ;AAAA,YACpD;AAAA,UACF;AATS,0BAAAA;AADT,gBAAM,SAAS,oBAAI,IAA+C;AAWlE,UAAAA,WAAU,IAAI;AACd,gBAAMC,SAAkB,CAAC;AACzB,qBAAW,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE,KAAK,GAAG;AACvD,YAAAA,OAAM,KAAK,GAAG,GAAG,GAAG;AACpB,uBAAW,KAAK,OAAO;AACrB,oBAAM,OAAO,mBAAmB,EAAE,WAAW,KAAK,EAAE,QAAQ,GAAG,EAAE,cAAc,SAAM,EAAE,WAAW,KAAK,EAAE,MAAM;AAC/G,cAAAA,OAAM,KAAK,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,YACjC;AAAA,UACF;AACA,iBAAOA,OAAM,SAAS,IAAIA,OAAM,KAAK,IAAI,IAAI;AAAA,QAC/C;AAEA,YAAI,WAAW,WAAW;AAGxB,cAASC,eAAT,SAAqB,OAAgD;AACnE,uBAAW,QAAQ,OAAO;AACxB,kBAAI,KAAK,SAAS,QAAQ;AACxB,sBAAM,MAAM,KAAK,KAAK,SAAS,GAAG,IAAI,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,YAAY,GAAG,CAAC,IAAI;AACvF,sBAAM,OAAO,SAAS,IAAI,GAAG,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,oBAAI,IAAI,EAAE;AAC3E,qBAAK;AACL,qBAAK,WAAW,KAAK,eAAe;AACpC,oBAAI,KAAK,SAAU,MAAK,MAAM,IAAI,KAAK,WAAW,KAAK,MAAM,IAAI,KAAK,QAAQ,KAAK,KAAK,CAAC;AACzF,yBAAS,IAAI,KAAK,IAAI;AAAA,cACxB;AACA,kBAAI,KAAK,UAAU,OAAQ,CAAAA,aAAY,KAAK,QAAQ;AAAA,YACtD;AAAA,UACF;AAZS,4BAAAA;AADT,gBAAM,WAAW,oBAAI,IAA4E;AAcjG,UAAAA,aAAY,IAAI;AAChB,gBAAM,aAAa,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC;AACzE,gBAAM,eAAe,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,SAAS,CAAC;AAC7E,gBAAMD,SAAkB,CAAC,GAAG,UAAU,WAAW,YAAY,eAAe,SAAS,IAAI;AAAA,CAAiB;AAC1G,qBAAW,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,SAAS,QAAQ,CAAC,EAAE,KAAK,GAAG;AACxD,kBAAM,cAAc,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG;AACnF,YAAAA,OAAM,KAAK,GAAG,GAAG,MAAM,KAAK,KAAK,WAAW,KAAK,OAAO,aAAa,WAAW,EAAE;AAAA,UACpF;AACA,iBAAOA,OAAM,KAAK,IAAI;AAAA,QACxB;AAGA,cAAM,QAAkB,CAAC;AAczB,QAAAH,YAAW,MAAM,EAAE;AACnB,eAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,MAC/C;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,cAAM,OAAO,GAAG,aAAa,KAAK;AAClC,YAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,eAAO,wBAAwB,KAAK,MAAM;AAAA,IACxC,KAAK,IAAI,OAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI;AAAA,MAChG;AAAA,MAEA,KAAK,2BAA2B;AAC9B,cAAM,SAAS,GAAG,yBAAyB;AAC3C,YAAI,OAAO,WAAW,EAAG,QAAO;AAChC,eAAO,SAAS,OAAO,MAAM;AAAA,IAC3B,OAAO,IAAI,CAAC,OAAO,MAAM,SAAS,IAAI,CAAC,KAAK,MAAM,KAAK,UAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,MAC9E;AAAA,MAEA,KAAK,kBAAkB;AACrB,cAAM,cAAc,GAAG,YAAY,KAAK,MAAgB,QAAW,CAAC;AACpE,cAAM,YAAY,GAAG,YAAY,KAAK,IAAc,QAAW,CAAC;AAChE,YAAI,YAAY,WAAW,EAAG,QAAO,WAAW,KAAK,IAAI;AACzD,YAAI,UAAU,WAAW,EAAG,QAAO,WAAW,KAAK,EAAE;AACrD,cAAM,WAAW,YAAY,CAAC,EAAE;AAChC,cAAM,SAAS,UAAU,CAAC,EAAE;AAC5B,cAAM,YAAY,MAAM,GAAG,SAAS,SAAS,IAAI,OAAO,EAAE;AAC1D,YAAI,UAAU,WAAW,EAAG,QAAO,2BAA2B,SAAS,IAAI,YAAY,OAAO,IAAI;AAClG,eAAO,eAAe,SAAS,IAAI,WAAW,OAAO,IAAI,OAAO,UAAU,MAAM;AAAA,IAC9E,UAAU,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI;AAAA,MAClH;AAAA,MAEA,KAAK,4BAA4B;AAC/B,cAAM,UAAU,GAAG,YAAY,KAAK,QAAkB,QAAW,CAAC;AAClE,YAAI,QAAQ,WAAW,EAAG,QAAO,WAAW,KAAK,MAAM;AACvD,cAAM,OAAO,QAAQ,CAAC,EAAE;AACxB,cAAM,YAAa,KAAK,aAAwC;AAChE,cAAM,YAAY,GAAG,iBAAiB,KAAK,IAAI,SAAS;AACxD,YAAI,UAAU,WAAW,EAAG,QAAO,iCAAiC,KAAK,IAAI;AAC7E,eAAO,wBAAwB,KAAK,IAAI,kBAAkB,SAAS;AAAA,IACjE,UAAU,IAAI,OAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI;AAAA,MACrG;AAAA,MAEA,KAAK,0BAA0B;AAC7B,YAAI,CAAC,GAAG,sBAAsB,GAAG;AAC/B,iBAAO;AAAA,QACT;AACA,cAAM,QAAS,KAAK,SAAoB;AACxC,cAAM,eAAe,KAAK,iBAAiB;AAC3C,cAAM,OAAO,GAAG,gBAAgB;AAEhC,cAAM,QAAkB,CAAC,gBAAgB;AAEzC,aAAK,UAAU,cAAc,UAAU,WAAW,KAAK,SAAS,SAAS,GAAG;AAC1E,gBAAM,KAAK,eAAe;AAC1B,qBAAW,OAAO,KAAK,UAAU;AAC/B,kBAAM,OAAO,CAAC,IAAI,UAAU,IAAI,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAClE,kBAAM,KAAK,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,MAAM,GAAG,OAAO,WAAQ,OAAO,EAAE,GAAG;AAAA,UACzF;AACA,cAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,kBAAM,KAAK,2BAA2B;AACtC,uBAAW,OAAO,KAAK,aAAa;AAClC,oBAAM,MAAM,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,IAAI,SAAS,GAAG,QAAQ,IAAI;AACzE,oBAAM,MAAM,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,IAAI,SAAS,GAAG,QAAQ,IAAI;AACzE,oBAAM,KAAK,KAAK,GAAG,WAAM,GAAG,KAAK,IAAI,QAAQ,UAAU,IAAI,aAAa,IAAI,MAAM,EAAE,GAAG;AAAA,YACzF;AAAA,UACF;AAAA,QACF;AAEA,aAAK,UAAU,YAAY,UAAU,WAAW,KAAK,OAAO,SAAS,GAAG;AACtE,gBAAM,KAAK,aAAa;AACxB,qBAAW,SAAS,KAAK,QAAQ;AAC/B,kBAAM,YAAY,OAAO,OAAO,KAAK,UAAU,EAAE,OAAO,QAAM,GAAG,KAAK,OAAK,EAAE,YAAY,MAAM,EAAE,CAAC,EAAE;AACpG,kBAAM,KAAK,OAAO,MAAM,IAAI,OAAO,MAAM,MAAM,YAAO,SAAS,QAAQ,cAAc,IAAI,MAAM,EAAE,EAAE;AAAA,UACrG;AACA,cAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,kBAAM,KAAK,yBAAyB;AACpC,uBAAW,OAAO,KAAK,WAAW;AAChC,oBAAM,MAAM,IAAI,YAAY,QAAQ,UAAU,EAAE;AAChD,oBAAM,MAAM,IAAI,YAAY,QAAQ,UAAU,EAAE;AAChD,oBAAM,KAAK,KAAK,GAAG,WAAM,GAAG,KAAK,IAAI,QAAQ,GAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF;AAEA,YAAI,iBAAiB,UAAU,cAAc,UAAU,SAAS;AAC9D,gBAAM,KAAK,0BAAqB;AAChC,qBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG;AAC3E,kBAAM,QAAQ,OAAO,IAAI,QAAM,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,EAAE,KAAK,IAAI;AAC1F,kBAAM,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE;AAAA,UAClC;AACA,cAAI,OAAO,KAAK,KAAK,YAAY,EAAE,SAAS,GAAI,OAAM,KAAK,qBAAgB;AAAA,QAC7E;AAEA,YAAI,KAAK,SAAS,WAAW,KAAK,KAAK,OAAO,WAAW,GAAG;AAC1D,iBAAO;AAAA,QACT;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,sBAAsB;AACzB,YAAI,CAAC,GAAG,sBAAsB,GAAG;AAC/B,iBAAO;AAAA,QACT;AACA,cAAM,SAAU,KAAK,UAAqB;AAC1C,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,cAAM,OAAO,GAAG,gBAAgB;AAEhC,YAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM;AAC/C,cAAI,WAAW,WAAY,QAAO,EAAE,WAAW,EAAE;AACjD,cAAI,WAAW,WAAY,QAAO,EAAE,WAAW,EAAE;AACjD,iBAAO,EAAE,cAAc,EAAE;AAAA,QAC3B,CAAC,EAAE,MAAM,GAAG,KAAK;AAEjB,cAAM,QAAQ;AAAA,UACZ,+BAA+B,MAAM;AAAA,UACrC;AAAA,UACA;AAAA,UACA,SAAI,OAAO,EAAE;AAAA,QACf;AAEA,mBAAW,KAAK,QAAQ;AACtB,gBAAM,MAAM,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,EAAE,SAAS;AACxD,gBAAM,QAAQ,KAAK,QAAQ,EAAE,WAAW,MAAM,GAAG,EAAE,EAAE,OAAO,EAAE;AAC9D,gBAAM,KAAK,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;AACxC,gBAAM,KAAK,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;AACxC,gBAAM,OAAO,EAAE,YAAY,QAAQ,CAAC,EAAE,SAAS,CAAC;AAChD,gBAAM,KAAK,GAAG,IAAI,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;AAAA,QAC7C;AAEA,cAAM,KAAK,IAAI,oFAAoF;AACnG,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,qBAAqB;AACxB,YAAI,CAAC,GAAG,sBAAsB,GAAG;AAC/B,iBAAO;AAAA,QACT;AACA,cAAM,QAAS,KAAK,QAAmB,YAAY;AACnD,cAAM,eAAe,KAAK,iBAAiB;AAC3C,cAAM,OAAO,GAAG,gBAAgB;AAEhC,cAAM,MAAM,KAAK,SAAS;AAAA,UAAK,OAC7B,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,KAAK,EAAE,GAAG,YAAY,EAAE,SAAS,KAAK;AAAA,QACnH;AACA,YAAI,CAAC,IAAK,QAAO,YAAY,KAAK,OAAO;AAEzC,cAAM,QAAQ;AAAA,UACZ,eAAe,IAAI,IAAI;AAAA,UACvB,SAAS,IAAI,IAAI;AAAA,UACjB,WAAW,IAAI,MAAM,GAAG,IAAI,eAAe,KAAK,IAAI,YAAY,MAAM,EAAE;AAAA,UACxE,GAAI,IAAI,UAAU,CAAC,YAAY,IAAI,OAAO,EAAE,IAAI,CAAC;AAAA,UACjD,GAAI,IAAI,WAAW,CAAC,aAAa,IAAI,QAAQ,EAAE,IAAI,CAAC;AAAA,QACtD;AAEA,cAAM,OAAO,KAAK,YAAY,OAAO,OAAK,EAAE,cAAc,IAAI,EAAE;AAChE,cAAM,aAAa,KAAK,YAAY,OAAO,OAAK,EAAE,cAAc,IAAI,EAAE;AACtE,cAAM,WAAW,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,IAAI,EAAE;AAE/D,YAAI,UAAU;AACZ,gBAAM,KAAK,IAAI,gBAAgB,SAAS,QAAQ,OAAO,SAAS,QAAQ,MAAM,SAAS,YAAY,QAAQ,CAAC,CAAC,EAAE;AAAA,QACjH;AAEA,YAAI,KAAK,SAAS,GAAG;AACnB,gBAAM,KAAK,IAAI,eAAe,KAAK,MAAM,IAAI;AAC7C,qBAAW,OAAO,MAAM;AACtB,kBAAM,OAAO,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,IAAI,SAAS,GAAG,QAAQ,IAAI;AAC1E,kBAAM,KAAK,YAAO,IAAI,KAAK,IAAI,QAAQ,UAAU,IAAI,aAAa,IAAI,MAAM,EAAE,GAAG;AAAA,UACnF;AAAA,QACF;AAEA,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,KAAK,IAAI,mBAAmB,WAAW,MAAM,IAAI;AACvD,qBAAW,OAAO,YAAY;AAC5B,kBAAM,OAAO,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,IAAI,SAAS,GAAG,QAAQ,IAAI;AAC1E,kBAAM,KAAK,YAAO,IAAI,KAAK,IAAI,QAAQ,UAAU,IAAI,aAAa,IAAI,MAAM,EAAE,GAAG;AAAA,UACnF;AAAA,QACF;AAEA,YAAI,IAAI,gBAAgB,IAAI,aAAa,SAAS,GAAG;AACnD,gBAAM,KAAK,IAAI,kBAAkB,IAAI,aAAa,MAAM,MAAM,IAAI,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,aAAa,SAAS,KAAK,WAAM,EAAE,EAAE;AAAA,QACpJ;AAEA,YAAI,cAAc;AAChB,gBAAM,QAAQ,OAAO,QAAQ,KAAK,YAAY,EAC3C,OAAO,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,SAAS,IAAI,EAAE,CAAC,EACxC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EACd,KAAK;AACR,cAAI,MAAM,SAAS,GAAG;AACpB,kBAAM,KAAK,IAAI,UAAU,MAAM,MAAM,IAAI;AACzC,uBAAW,KAAK,MAAM,MAAM,GAAG,EAAE,EAAG,OAAM,KAAK,KAAK,CAAC,EAAE;AACvD,gBAAI,MAAM,SAAS,GAAI,OAAM,KAAK,eAAU,MAAM,SAAS,EAAE,OAAO;AAAA,UACtE;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,sBAAsB;AACzB,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,cAAM,WAAW,GAAG,aAAa,KAAK;AACtC,YAAI,SAAS,WAAW,EAAG,QAAO;AAClC,cAAM,QAAQ,CAAC,OAAO,SAAS,MAAM;AAAA,CAA6C;AAClF,mBAAW,KAAK,UAAU;AACxB,gBAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,oBAAe,EAAE,MAAM,SAAS,EAAE,QAAQ,UAAU,EAAE,SAAS,GAAG;AAC3G,gBAAM,KAAK,WAAW,EAAE,QAAQ,IAAI,EAAE,SAAS,EAAE;AAAA,QACnD;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,wBAAwB;AAC3B,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,cAAM,cAAc,GAAG,0BAA0B,KAAK;AACtD,YAAI,YAAY,WAAW,EAAG,QAAO;AACrC,cAAM,QAAQ,CAAC,OAAO,YAAY,MAAM;AAAA,CAAuC;AAC/E,mBAAW,KAAK,aAAa;AAC3B,gBAAM,KAAK,GAAG,QAAQ,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,MAAM,EAAE,IAAI,UAAK,QAAQ,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,QAAQ,CAAC,CAAC,GAAG;AACpJ,gBAAM,KAAK,KAAK,EAAE,OAAO,QAAQ,WAAM,EAAE,OAAO,QAAQ,EAAE;AAAA,QAC5D;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,kBAAkB;AACrB,cAAM,KAAK,GAAG,sBAAsB;AACpC,cAAM,WAAW,KAAK,WAClB,GAAG,KAAK,KAAK,QAAkB,IAC/B,GAAG,WAAW;AAClB,YAAI,CAAC,UAAU;AACb,iBAAO,KAAK,WACR,aAAa,KAAK,QAAQ,6EAC1B;AAAA,QACN;AACA,cAAM,OAAO,GAAG,KAAK,UAAU,GAAG,gBAAgB,CAAC;AACnD,cAAM,WAAW,IAAI,KAAK,KAAK,KAAK,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AAC1F,cAAM,QAAQ;AAAA,UACZ,gBAAgB,KAAK,KAAK,KAAK,MAAM,QAAQ;AAAA,UAC7C;AAAA,UACA,aAAa,KAAK,WAAW,MAAM,YAAY,KAAK,aAAa,MAAM;AAAA,UACvE,aAAa,KAAK,WAAW,MAAM,YAAY,KAAK,aAAa,MAAM;AAAA,QACzE;AACA,YAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,gBAAM,KAAK;AAAA,oBAAuB,KAAK,WAAW,MAAM,GAAG;AAC3D,qBAAW,KAAK,KAAK,WAAW,MAAM,GAAG,EAAE,GAAG;AAC5C,kBAAM,KAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,EAAE;AAAA,UACjE;AACA,cAAI,KAAK,WAAW,SAAS,GAAI,OAAM,KAAK,eAAU,KAAK,WAAW,SAAS,EAAE,OAAO;AAAA,QAC1F;AACA,YAAI,KAAK,aAAa,SAAS,GAAG;AAChC,gBAAM,KAAK;AAAA,sBAAyB,KAAK,aAAa,MAAM,GAAG;AAC/D,qBAAW,KAAK,KAAK,aAAa,MAAM,GAAG,EAAE,GAAG;AAC9C,kBAAM,KAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,EAAE;AAAA,UACjE;AACA,cAAI,KAAK,aAAa,SAAS,GAAI,OAAM,KAAK,eAAU,KAAK,aAAa,SAAS,EAAE,OAAO;AAAA,QAC9F;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,2BAA2B;AAC9B,cAAM,KAAK,GAAG,sBAAsB;AACpC,cAAM,WAAW,GAAG,KAAK,KAAK,KAA2B;AACzD,eAAO,oBAAoB,SAAS,KAAK,YAAO,SAAS,SAAS,aAAa,SAAS,SAAS;AAAA,MACnG;AAAA,MAEA,KAAK,2BAA2B;AAC9B,cAAM,KAAK,GAAG,sBAAsB;AACpC,cAAM,YAAY,GAAG,KAAK;AAC1B,YAAI,UAAU,WAAW,EAAG,QAAO;AACnC,cAAM,QAAQ,CAAC,oBAAoB,UAAU,MAAM;AAAA,CAAM;AACzD,mBAAW,KAAK,WAAW;AACzB,gBAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AAC9E,gBAAM,KAAK,KAAK,EAAE,KAAK,MAAM,IAAI,KAAK,EAAE,SAAS,aAAa,EAAE,SAAS,SAAS;AAAA,QACpF;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,mBAAmB;AACtB,cAAM,EAAE,mBAAmB,WAAW,kBAAkB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,mBAAmB,CAAC;AAC3H,cAAM,KAAK,GAAG,YAAY;AAE1B,YAAI,KAAK,YAAY;AAEnB,gBAAM,UAAU,GAAG,YAAY,KAAK,YAAsB,QAAW,CAAC;AACtE,cAAI,QAAQ,WAAW,EAAG,QAAO,WAAW,KAAK,UAAU;AAC3D,gBAAM,OAAO,UAAU,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAK,KAAK,YAAuB,EAAE;AAC9E,cAAI,KAAK,SAAS,EAAG,QAAO,sCAAsC,KAAK,UAAU;AAEjF,gBAAMG,SAAQ,CAAC,4BAA4B,KAAK,UAAU,MAAM,EAAE;AAClE,mBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,kBAAM,MAAM,KAAK,CAAC;AAClB,kBAAM,SAAS,KAAK,OAAO,CAAC;AAC5B,kBAAM,QAAQ,MAAM,IAAI,WAAM;AAC9B,kBAAM,OAAO,IAAI,cAAc,IAAI,eAAe,cAAc,KAAK,IAAI,UAAU,MAAM;AACzF,YAAAA,OAAM,KAAK,GAAG,MAAM,GAAG,KAAK,IAAI,IAAI,IAAI,MAAM,IAAI,MAAM,aAAQ,IAAI,QAAQ,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE;AAAA,UACnG;AACA,iBAAOA,OAAM,KAAK,IAAI;AAAA,QACxB;AAGA,cAAM,QAAQ,kBAAkB,IAAI;AAAA,UAClC,UAAW,KAAK,YAAuB;AAAA,UACvC,UAAW,KAAK,YAAuB;AAAA,QACzC,CAAC;AAED,YAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,cAAM,QAAQ,CAAC,uBAAuB,MAAM,MAAM,cAAc,EAAE;AAClE,mBAAW,QAAQ,OAAO;AACxB,gBAAM,KAAK,SAAS,KAAK,UAAU,OAAO,KAAK,cAAc,yBAAoB,KAAK,YAAY,QAAQ,CAAC,CAAC,EAAE;AAC9G,gBAAM,KAAK,SAAS,KAAK,cAAc,IAAI,EAAE;AAC7C,mBAAS,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,KAAK;AACzC,kBAAM,MAAM,KAAK,KAAK,CAAC;AACvB,kBAAM,SAAS,KAAK,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC;AACzC,kBAAM,QAAQ,MAAM,IAAI,WAAM;AAC9B,kBAAM,OAAO,IAAI,cAAc,IAAI,eAAe,cAAc,KAAK,IAAI,UAAU,MAAM;AACzF,kBAAM,KAAK,GAAG,MAAM,GAAG,KAAK,MAAM,IAAI,MAAM,OAAO,IAAI,IAAI,YAAO,IAAI,QAAQ,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE;AAAA,UACrG;AACA,gBAAM,KAAK,EAAE;AAAA,QACf;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,kBAAkB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,yBAAyB,CAAC;AACnG,cAAM,KAAK,GAAG,YAAY;AAC1B,cAAM,SAAS,kBAAkB,IAAI;AAAA,UACnC,YAAa,KAAK,cAAyB;AAAA,QAC7C,CAAC;AAED,YAAI,OAAO,YAAY,WAAW,EAAG,QAAO;AAE5C,cAAM,QAAQ,KAAK,IAAK,KAAK,SAAoB,IAAI,OAAO,YAAY,MAAM;AAC9E,cAAM,QAAQ;AAAA,UACZ,mBAAmB,OAAO,YAAY,MAAM,0BAA0B,OAAO,WAAW,QAAQ,CAAC,CAAC;AAAA,UAClG,UAAU,OAAO,UAAU,WAAW,OAAO,UAAU;AAAA,UACvD;AAAA,QACF;AAEA,mBAAW,KAAK,OAAO,YAAY,MAAM,GAAG,KAAK,GAAG;AAClD,gBAAM,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,WAAW,WAAW;AACtD,gBAAM,KAAK,kBAAkB,EAAE,iBAAiB,IAAI;AACpD,gBAAM,KAAK,eAAe,EAAE,gBAAgB,EAAE;AAC9C,gBAAM,KAAK,4BAA4B,EAAE,mBAAmB,EAAE;AAC9D,gBAAM,KAAK,gBAAgB;AAC3B,qBAAW,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG;AACrC,kBAAM,KAAK,OAAO,EAAE,IAAI,MAAM,EAAE,IAAI,aAAQ,EAAE,QAAQ,EAAE;AAAA,UAC1D;AACA,cAAI,EAAE,cAAc,EAAG,OAAM,KAAK,iBAAY,EAAE,cAAc,CAAC,OAAO;AACtE,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,sBAAsB;AACzB,cAAM,EAAE,eAAe,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,sBAAsB,CAAC;AACjH,cAAM,KAAK,GAAG,YAAY;AAC1B,cAAM,OAAO,KAAK;AAElB,YAAI,SAAS,UAAU;AACrB,cAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,gBAAM,UAAU,cAAc,IAAI,KAAK,MAAgB;AACvD,cAAI,CAAC,QAAS,QAAO,WAAW,KAAK,MAAM;AAE3C,gBAAM,QAAQ;AAAA,YACZ,wBAAwB,QAAQ,MAAM;AAAA,YACtC,SAAS,QAAQ,IAAI;AAAA,YACrB,eAAe,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAAA,YAC/C,qBAAqB,QAAQ,eAAe;AAAA,YAC5C;AAAA,UACF;AAEA,cAAI,QAAQ,WAAW,WAAW,GAAG;AACnC,kBAAM,KAAK,4FAAuF;AAAA,UACpG,OAAO;AAEL,kBAAM,SAAS,oBAAI,IAAuC;AAC1D,uBAAW,OAAO,QAAQ,YAAY;AACpC,kBAAI,CAAC,OAAO,IAAI,IAAI,QAAQ,EAAG,QAAO,IAAI,IAAI,UAAU,CAAC,CAAC;AAC1D,qBAAO,IAAI,IAAI,QAAQ,EAAG,KAAK,GAAG;AAAA,YACpC;AAEA,uBAAW,CAAC,MAAM,IAAI,KAAK,QAAQ;AACjC,oBAAM,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,cAAc;AACpD,yBAAW,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG;AACnC,sBAAM,KAAK,UAAU,IAAI,IAAI,OAAO,IAAI,OAAO,OAAO,IAAI,QAAQ,GAAG;AAAA,cACvE;AACA,kBAAI,KAAK,SAAS,GAAI,OAAM,KAAK,eAAU,KAAK,SAAS,EAAE,OAAO;AAClE,oBAAM,KAAK,EAAE;AAAA,YACf;AAAA,UACF;AAEA,iBAAO,MAAM,KAAK,IAAI;AAAA,QACxB;AAEA,YAAI,SAAS,WAAW;AACtB,gBAAM,cAAc,oBAAoB,IAAK,KAAK,SAAoB,EAAE;AACxE,cAAI,YAAY,WAAW,EAAG,QAAO;AAErC,gBAAM,QAAQ,CAAC,+BAA+B,YAAY,MAAM,KAAK,EAAE;AACvE,qBAAW,KAAK,aAAa;AAC3B,kBAAM,OAAO,EAAE,aAAa,SAAS,cAAO,EAAE,aAAa,WAAW,cAAO;AAC7E,kBAAM,KAAK,GAAG,IAAI,MAAM,EAAE,IAAI,OAAO,EAAE,QAAQ,MAAM,EAAE,WAAW,EAAE;AACpE,kBAAM,KAAK,iBAAiB,EAAE,SAAS,EAAE;AACzC,gBAAI,EAAE,QAAQ,SAAS,GAAG;AACxB,oBAAM,KAAK,eAAe,EAAE,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,YAC9D;AACA,kBAAM,KAAK,EAAE;AAAA,UACf;AAEA,iBAAO,MAAM,KAAK,IAAI;AAAA,QACxB;AAEA,eAAO;AAAA,MACT;AAAA;AAAA,MAIA,KAAK,wBAAwB;AAC3B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AAEjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,kBAAkB;AACrB,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AAEf,cAAM,UAAU,MAAM,IAAI,OAAO,KAAK,OAAiB;AAAA,UACrD,OAAQ,KAAK,SAAoB;AAAA,UACjC,MAAM,KAAK;AAAA,UACX,WAAW,KAAK;AAAA,UAChB,MAAM,KAAK;AAAA,QACb,CAAC;AAED,YAAI,QAAQ,WAAW,EAAG,QAAO,qCAAqC,KAAK,KAAK;AAEhF,eAAO,QAAQ,IAAI,CAAC,GAAG,MAAM;AAC3B,gBAAM,MAAM,UAAU,EAAE,YAAY,SAAS;AAC7C,gBAAM,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,KAAK,EAAE,YAAY,OAAO,KAAK,GAAG,GAAG;AACpF,cAAI,EAAE,aAAa,EAAE,UAAU,SAAS,GAAG;AACzC,uBAAW,OAAO,EAAE,WAAW;AAC7B,oBAAM,QAAQ,IAAI,iBAAiB,EAAE,YAAY,KAAK,IAAI,eAAe,IAAI;AAC7E,oBAAM,OAAO,IAAI,aAAa,mBAAmB,WAAM,IAAI,aAAa,eAAe,WAAM;AAC7F,oBAAM,KAAK,KAAK,IAAI,IAAI,IAAI,QAAQ,IAAI,KAAK,iBAAiB,IAAI,UAAU,IAAI,IAAI,mBAAmB,WAAW,cAAc,EAAE,EAAE;AAAA,YACtI;AAAA,UACF;AACA,iBAAO,MAAM,KAAK,IAAI;AAAA,QACxB,CAAC,EAAE,KAAK,IAAI;AAAA,MACd;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AAEjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,kBAAkB;AACrB,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AAEf,cAAM,KAAK,MAAM,IAAI,MAAM;AAAA,UACzB,SAAS,KAAK;AAAA,UACd,MAAO,KAAK,QAAgB;AAAA,UAC5B,QAAQ;AAAA,UACR,UAAU,KAAK;AAAA,UACf,aAAa,KAAK;AAAA,QACpB,CAAC;AAED,YAAI,CAAC,GAAI,QAAO;AAChB,eAAO,sBAAsB,EAAE,KAAM,KAAK,QAAmB,MAAM;AAAA,MACrE;AAAA,MAEA,KAAK,0BAA0B;AAC7B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AAEjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,kBAAkB;AACrB,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AAEf,cAAM,EAAE,UAAU,aAAa,IAAI,IAAI,SAAS;AAAA,UAC9C,OAAQ,KAAK,SAAoB;AAAA,UACjC,WAAW,KAAK;AAAA,QAClB,CAAC;AAED,YAAI,SAAS,WAAW,EAAG,QAAO;AAElC,cAAM,QAAkB,CAAC;AACzB,mBAAW,WAAW,UAAU;AAC9B,gBAAM,QAAQ,IAAI,KAAK,QAAQ,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AACrF,gBAAM,SAAS,QAAQ,UAAU,UAAU;AAC3C,gBAAM,MAAM,aAAa,IAAI,QAAQ,EAAE,KAAK,CAAC;AAC7C,gBAAM,KAAK,MAAM,KAAK,KAAK,QAAQ,OAAO,SAAS,MAAM,MAAM,KAAK,IAAI,MAAM,gBAAgB;AAC9F,qBAAW,KAAK,IAAI,MAAM,GAAG,CAAC,GAAG;AAC/B,kBAAM,KAAK,QAAQ,EAAE,IAAI,KAAK,EAAE,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,UACzD;AACA,cAAI,IAAI,SAAS,EAAG,OAAM,KAAK,eAAU,IAAI,SAAS,CAAC,OAAO;AAAA,QAChE;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,wBAAwB;AAC3B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AAEjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,kBAAkB;AACrB,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AAEf,cAAM,QAAQ,IAAI,SAAS;AAC3B,cAAM,QAAQ;AAAA,UACZ;AAAA,UACA,eAAe,MAAM,QAAQ,KAAK,MAAM,cAAc;AAAA,UACtD,mBAAmB,MAAM,YAAY;AAAA,UACrC,mBAAmB,MAAM,KAAK;AAAA,UAC9B,iBAAiB,MAAM,OAAO,MAAM,MAAM,eAAe;AAAA,UACzD,qBAAqB,MAAM,gBAAgB,gDAAsC,IAAI;AAAA,UACrF,gBAAgB,MAAM,SAAS,KAAK,MAAM,gBAAgB;AAAA,UAC1D,0BAA0B,OAAO,gBAAgB,QAAQ,OAAO,cAAc,mBAAmB;AAAA,QACnG;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,wBAAwB;AAC3B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,MAAM,IAAI,yBAAyB,KAAK,SAAmB,EAAE;AACnE,YAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,cAAM,MAAM,KAAK,IAAI;AACrB,eAAO,IAAI,IAAI,CAAC,GAAG,MAAM;AACvB,gBAAM,cAAc,KAAK,OAAO,OAAO,EAAE,eAAe,QAAQ,KAAQ;AACxE,iBAAO,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,WAAW,KAAK,EAAE,QAAQ,MAAM,EAAE,IAAI,EAAE,QAAQ,MAAM,GAAG,GAAG,CAAC,sBAAiB,WAAW;AAAA,QAC5H,CAAC,EAAE,KAAK,IAAI;AAAA,MACd;AAAA,MAEA,KAAK,+BAA+B;AAClC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,YAAI,aAAa,KAAK,EAAY;AAClC,eAAO,eAAe,KAAK,EAAE;AAAA,MAC/B;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,aAAa,IAAI,oBAAoB;AAAA,UACzC,cAAc,KAAK;AAAA,UACnB,cAAc,KAAK;AAAA,UACnB,UAAU,KAAK;AAAA,UACf,YAAY,KAAK,cAAwB;AAAA,UACzC,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,eAAO,YAAY,UAAU,aAAa,KAAK,QAAQ,iBAAiB,KAAK,cAAc,CAAG;AAAA,MAChG;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,YAAI;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AACA,eAAO,YAAY,KAAK,UAAU,eAAe,KAAK,QAAQ,kBAAkB,KAAK,UAAU;AAAA,MACjG;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,YAAY,IAAI,eAAe,KAAK,OAAiB;AAC3D,YAAI,UAAU,WAAW,EAAG,QAAO;AACnC,eAAO,YAAY,UAAU,MAAM;AAAA,IAAuB,UAAU,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,EAAE,QAAQ,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,KAAK,cAAc,EAAE,EAAE,KAAK,IAAI;AAAA,MAC9K;AAAA,MAEA,KAAK,6BAA6B;AAChC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,KAAK,MAAM,IAAI,WAAW,KAAK,OAAiB;AACtD,eAAO,mBAAmB,EAAE;AAAA,MAC9B;AAAA,MAEA,KAAK,mCAAmC;AACtC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,MAAM,IAAI,gBAAgB,KAAK,MAAgB,KAAK,KAAe;AACzE,eAAO,wBAAwB,GAAG;AAAA,MACpC;AAAA,MAEA,KAAK,gCAAgC;AACnC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,aAAa,IAAI,cAAc,KAAK,SAAmB,EAAE;AAC/D,YAAI,WAAW,WAAW,EAAG,QAAO;AACpC,eAAO,SAAS,WAAW,MAAM;AAAA,IAA8B,WAAW;AAAA,UAAI,CAAC,GAAG,MAChF,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,MAAM,EAAE,aAAa,QAAQ,MAAM,GAAG,EAAE,CAAC,aAAQ,EAAE,aAAa,IAAI,MAAM,EAAE,aAAa,QAAQ,MAAM,GAAG,EAAE,CAAC,kBAAkB,EAAE,WAAW,QAAQ,CAAC,CAAC;AAAA,QACzL,EAAE,KAAK,IAAI,IAAI;AAAA,MACjB;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,YAAa,KAAK,aAAwB;AAChD,cAAM,cAAc,MAAM;AACxB,gBAAM,IAAI,UAAU,MAAM,kBAAkB;AAC5C,cAAI,CAAC,EAAG,QAAO,KAAK;AACpB,gBAAM,IAAI,SAAS,EAAE,CAAC,CAAC;AACvB,kBAAQ,EAAE,CAAC,GAAG;AAAA,YACZ,KAAK;AAAK,qBAAO,IAAI;AAAA,YACrB,KAAK;AAAK,qBAAO,IAAI;AAAA,YACrB,KAAK;AAAK,qBAAO,IAAI,IAAI;AAAA,YACzB,KAAK;AAAK,qBAAO,IAAI,KAAK;AAAA,YAC1B;AAAS,qBAAO,KAAK;AAAA,UACvB;AAAA,QACF,GAAG;AACH,cAAM,UAAU,IAAI,MAAM,UAAU;AACpC,eAAO,UAAU,OAAO,8BAA8B,SAAS;AAAA,MACjE;AAAA,MAEA,KAAK,sBAAsB;AACzB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,SAAS,IAAI,KAAK;AACxB,cAAM,QAAQ,CAAC,sBAAsB;AACrC,cAAM,KAAK,qBAAqB,OAAO,UAAU,EAAE;AACnD,cAAM,KAAK,qBAAqB,OAAO,gBAAgB,QAAQ,IAAI,EAAE;AACrE,cAAM,KAAK,qBAAqB,OAAO,aAAa,gBAAgB;AACpE,YAAI,KAAK,OAAO,OAAO,aAAa,GAAG;AACrC,gBAAM,UAAU,IAAI,iBAAiB;AACrC,gBAAM,KAAK;AAAA,iBAAe,OAAO,gBAAgB;AAAA,QACnD,WAAW,OAAO,aAAa,GAAG;AAChC,gBAAM,KAAK;AAAA,sCAAyC;AAAA,QACtD;AACA,YAAI,OAAO,eAAe;AACxB,gBAAM,KAAK;AAAA,mDAAsD;AAAA,QACnE;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,gCAAgC;AACnC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,cAAM,UAAU,IAAI,oBAAoB,KAAK;AAC7C,YAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,eAAO,sBAAsB,QAAQ,MAAM;AAAA;AAAA,IAAW,QAAQ;AAAA,UAAI,OAChE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ;AAAA,OAAU,EAAE,YAAY;AAAA,OAAU,EAAE,YAAY,GAAG,EAAE,SAAS;AAAA,YAAe,EAAE,MAAM,KAAK,EAAE;AAAA,QACrH,EAAE,KAAK,MAAM,IAAI;AAAA,MACnB;AAAA,MAEA,KAAK,kCAAkC;AACrC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAAG,WAAG,kBAAkB;AAClD,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,CAAC;AACnD,YAAI,WAAW;AACf,cAAM,aAAa,KAAK;AACxB,YAAI,eAAe,UAAU;AAC7B,eAAO,aAAa,UAAU;AAAA,MAChC;AAAA;AAAA,MAIA,KAAK,sBAAsB;AACzB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,YAAY,GAAG,SAAS,GAAG,WAAW;AAEvD,cAAM,MAAM,KAAK,OAAO,EAAE,MAAM,KAAK,MAA4B,MAAM,KAAK,KAA4B,CAAC;AACzG,YAAI,IAAI,WAAW,EAAG,QAAO,KAAK,OAAO,yBAAyB,KAAK,IAAI,OAAO;AAElF,cAAM,QAAkB,CAAC;AACzB,cAAM,cAAc,CAAC,OAAY,WAAmB;AAClD,gBAAM,SAAS,IAAI,OAAO,MAAM,SAAS,CAAC;AAC1C,gBAAM,UAAU,MAAM,UAAU,WAAM,MAAM,OAAO,KAAK;AACxD,gBAAM,KAAK,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,KAAK,GAAG,OAAO,EAAE;AACxD,gBAAM,KAAK,GAAG,MAAM,SAAS,MAAM,EAAE,EAAE;AACvC,cAAI,MAAM,UAAU,QAAQ;AAC1B,uBAAW,SAAS,MAAM,SAAU,aAAY,OAAO,SAAS,IAAI;AAAA,UACtE;AAAA,QACF;AAEA,YAAI,KAAK,MAAM;AACb,qBAAW,SAAS,IAAK,aAAY,OAAO,EAAE;AAAA,QAChD,OAAO;AACL,qBAAW,SAAS,KAAK;AACvB,kBAAM,SAAS,IAAI,OAAO,MAAM,SAAS,CAAC;AAC1C,kBAAM,UAAU,MAAM,UAAU,WAAM,MAAM,OAAO,KAAK;AACxD,kBAAM,KAAK,GAAG,MAAM,IAAI,MAAM,KAAK,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE;AACnE,kBAAM,KAAK,SAAS,MAAM,EAAE,EAAE;AAAA,UAChC;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,YAAY,GAAG,SAAS,GAAG,aAAa,MAAM;AAE/D,cAAM,UAAU,MAAM,KAAK,eAAe,KAAK,OAAiB;AAAA,UAC9D,MAAM,KAAK;AAAA,UACX,OAAQ,KAAK,SAAoB;AAAA,QACnC,CAAC;AAED,YAAI,QAAQ,WAAW,EAAG,QAAO,6CAA6C,KAAK,KAAK;AAExF,eAAO,QAAQ,IAAI,CAAC,GAAG,MAAM;AAC3B,gBAAM,UAAU,EAAE,QAAQ,UAAU;AAAA,IAAO,EAAE,QAAQ,OAAO,KAAK;AACjE,iBAAO,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,KAAK,KAAK,EAAE,QAAQ,QAAQ,IAAI,OAAO;AAAA,QAAW,EAAE,QAAQ,EAAE;AAAA,QAC9F,CAAC,EAAE,KAAK,MAAM;AAAA,MAChB;AAAA,MAEA,KAAK,0BAA0B;AAC7B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,YAAY,GAAG,SAAS,GAAG,WAAW;AAEvD,cAAM,SAAS,KAAK,WAAW,KAAK,IAAc,EAAE,SAAS,KAAK,QAA+B,CAAC;AAClG,YAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,EAAE;AAEvC,cAAM,QAAkB,CAAC;AAEzB,YAAI,OAAO,WAAW,QAAQ;AAC5B,gBAAM,KAAK,iBAAiB,OAAO,UAAU,IAAI,OAAK,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,QAAQ,OAAO,QAAQ,KAAK;AACzG,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,cAAM,KAAK,OAAO,OAAO;AAEzB,YAAI,OAAO,UAAU,QAAQ;AAC3B,gBAAM,KAAK,IAAI,oBAAoB;AACnC,qBAAW,SAAS,OAAO,UAAU;AACnC,kBAAM,UAAU,MAAM,UAAU,WAAM,MAAM,OAAO,KAAK;AACxD,kBAAM,KAAK,OAAO,MAAM,KAAK,GAAG,OAAO,SAAS,MAAM,EAAE,GAAG;AAAA,UAC7D;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,0BAA0B;AAC7B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,YAAY,GAAG,SAAS,GAAG,WAAW;AAEvD,cAAM,UAAU,KAAK,WAAW,KAAK,IAAc;AACnD,YAAI,QAAQ,WAAW,EAAG,QAAO,yBAAyB,KAAK,IAAI;AAEnE,cAAM,QAAkB,CAAC,YAAY,KAAK,IAAI,IAAI,EAAE;AACpD,cAAM,gBAAgB,CAAC,SAAgB,WAAmB;AACxD,qBAAW,SAAS,SAAS;AAC3B,kBAAM,UAAU,MAAM,UAAU,WAAM,MAAM,OAAO,KAAK;AACxD,kBAAM,KAAK,GAAG,MAAM,GAAG,IAAI,OAAO,MAAM,SAAS,CAAC,CAAC,IAAI,MAAM,KAAK,GAAG,OAAO,EAAE;AAC9E,gBAAI,MAAM,UAAU,OAAQ,eAAc,MAAM,UAAU,SAAS,IAAI;AAAA,UACzE;AAAA,QACF;AACA,sBAAc,SAAS,EAAE;AAEzB,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,YAAY,GAAG,SAAS,GAAG,WAAW;AAEvD,cAAM,OAAO,KAAK,QAAQ;AAAA,UACxB,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,QACtB,CAAC;AAED,YAAI,KAAK,WAAW,GAAG;AACrB,cAAI,KAAK,UAAW,QAAO,wCAAwC,KAAK,SAAS;AACjF,cAAI,KAAK,OAAQ,QAAO,wCAAwC,KAAK,MAAM;AAC3E,iBAAO;AAAA,QACT;AAEA,eAAO,KAAK,IAAI,OAAK;AACnB,gBAAM,YAAY,KAAK,YAAY,UAAK,EAAE,aAAa,KAAK,UAAK,EAAE,gBAAgB,EAAE,SAAS;AAC9F,iBAAO,IAAI,EAAE,OAAO,KAAK,SAAS,iBAAiB,EAAE,WAAW,QAAQ,CAAC,CAAC;AAAA,QAC5E,CAAC,EAAE,KAAK,IAAI;AAAA,MACd;AAAA;AAAA,MAIA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AACxC,cAAM,WAAW,GAAG,aAAa;AAEjC,YAAI,SAAS,WAAW,EAAG,QAAO;AAElC,eAAO,SAAS,IAAI,QAAM;AACxB,gBAAM,UAAU,GAAG,WAAW,OAAO,MAAM,QAAQ,CAAC;AACpD,iBAAO,GAAG,GAAG,EAAE,KAAK,GAAG,MAAM;AAAA,UAAc,GAAG,QAAQ;AAAA,UAAa,GAAG,SAAS,eAAe,CAAC,eAAe,GAAG,WAAW,YAAY,MAAM;AAAA,QAChJ,CAAC,EAAE,KAAK,MAAM;AAAA,MAChB;AAAA,MAEA,KAAK,2BAA2B;AAC9B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AAExC,YAAI,KAAK,QAAQ;AACf,gBAAM,MAAM,GAAG,eAAe,KAAK,SAAmB,KAAK,MAAgB;AAC3E,cAAI,CAAC,IAAK,QAAO,WAAW,KAAK,MAAM,2BAA2B,KAAK,OAAO;AAC9E,iBAAO;AAAA,YACL,WAAW,IAAI,IAAI;AAAA,YACnB,SAAS,IAAI,YAAY;AAAA,YACzB,aAAa,IAAI,QAAQ,MAAM,IAAI,UAAU,KAAK,QAAQ,CAAC,CAAC;AAAA,YAC5D,gBAAgB,IAAI,WAAW;AAAA,YAC/B,IAAI,WAAW,QAAQ,IAAI,QAAQ,KAAK;AAAA,YACxC,IAAI,WAAW,QAAQ,IAAI,QAAQ,KAAK;AAAA,YACxC,IAAI,cAAc,OAAO,SAAS,IAAI,UAAU,QAAQ,CAAC,CAAC,KAAK;AAAA,YAC/D,YAAY,IAAI,aAAa,KAAK,IAAI,CAAC;AAAA,UACzC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,QAC7B;AAEA,cAAM,SAAS,GAAG,gBAAgB,KAAK,OAAiB;AACxD,YAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,OAAO;AAE5C,cAAM,QAAQ;AAAA,UACZ,YAAY,OAAO,QAAQ,EAAE,KAAK,OAAO,QAAQ,MAAM;AAAA,UACvD,SAAS,OAAO,QAAQ,QAAQ;AAAA,UAChC,SAAS,OAAO,QAAQ,SAAS,eAAe,CAAC,eAAe,OAAO,QAAQ,WAAW;AAAA,UAC1F;AAAA,UACA;AAAA,QACF;AACA,mBAAW,OAAO,OAAO,SAAS;AAChC,gBAAM,WAAW,IAAI,WAAW,MAAM,IAAI,UAAU,KAAK,QAAQ,CAAC,CAAC,YAAY;AAC/E,gBAAM,UAAU,IAAI,aAAa,SAAS,IAAI,oBAAe,IAAI,aAAa,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK;AACzG,gBAAM,UAAU,IAAI,UAAU,KAAK,IAAI,OAAO,MAAM;AACpD,gBAAM,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,YAAY,GAAG,QAAQ,KAAK,IAAI,WAAW,aAAa,OAAO,GAAG,OAAO,EAAE;AAAA,QAC9G;AAGA,cAAM,QAAQ,GAAG,gBAAgB,KAAK,OAAiB;AACvD,YAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,gBAAM,KAAK,IAAI,mBAAmB;AAClC,qBAAW,KAAK,MAAM,MAAM,GAAG,EAAE,GAAG;AAClC,kBAAM,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,UACnD;AAAA,QACF;AAGA,cAAM,QAAQ,GAAG,YAAY,KAAK,OAAiB;AACnD,YAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,gBAAM,KAAK,IAAI,oBAAoB;AACnC,qBAAW,KAAK,MAAM,MAAM,GAAG,EAAE,GAAG;AAClC,kBAAM,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,EAAE;AAAA,UACvC;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,wBAAwB;AAC3B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AAExC,cAAM,SAAS,GAAG,UAAU,KAAK,SAAmB;AAAA,UAClD,SAAS,KAAK;AAAA,UACd,SAAS,KAAK;AAAA,UACd,OAAQ,KAAK,SAAoB;AAAA,UACjC,QAAS,KAAK,UAAqB;AAAA,QACrC,CAAC;AAED,YAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,OAAO;AAC5C,YAAI,OAAO,KAAK,WAAW,EAAG,QAAO,oCAAoC,OAAO,aAAa;AAE7F,cAAM,SAAS,GAAG,OAAO,KAAK,MAAM,mBAAmB,OAAO,aAAa;AAAA;AAC3E,cAAM,UAAU,OAAO,KAAK,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,KAAK,MAAM;AACvD,gBAAM,OAAO,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,EAAE,KAAK,IAAI;AACjF,iBAAO,KAAK,IAAI,CAAC,KAAK,IAAI;AAAA,QAC5B,CAAC;AACD,YAAI,OAAO,KAAK,SAAS,GAAI,SAAQ,KAAK,eAAU,OAAO,KAAK,SAAS,EAAE,YAAY;AACvF,YAAI,WAAW,SAAS,QAAQ,KAAK,IAAI;AAGzC,cAAM,WAAW,OAAO,wBAAwB;AAChD,YAAI,SAAS,SAAS,UAAU;AAC9B,qBAAW,SAAS,MAAM,GAAG,QAAQ,IAAI;AAAA,QAC3C;AAGA,mBAAW,KAAK,oBAAoB,KAAK,SAAmB,KAAK,QAA8B,QAAQ;AAEvG,eAAO;AAAA,MACT;AAAA,MAEA,KAAK,4BAA4B;AAC/B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AAExC,cAAM,SAAS,GAAG,UAAU,KAAK,SAAmB;AAAA,UAClD,SAAU,KAAK,WAAwB,CAAC;AAAA,UACxC,SAAU,KAAK,WAAqB,CAAC;AAAA,UACrC,SAAS,KAAK;AAAA,QAChB,CAAC;AAED,YAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,OAAO;AAC5C,YAAI,OAAO,KAAK,WAAW,EAAG,QAAO;AAErC,cAAM,OAAO,OAAO,KAAK,OAAO,KAAK,CAAC,CAAC;AACvC,cAAM,SAAS,KAAK,KAAK,KAAK;AAC9B,cAAM,YAAY,KAAK,IAAI,MAAM,KAAK,EAAE,KAAK,KAAK;AAClD,cAAM,OAAO,OAAO,KAAK,MAAM,GAAG,GAAG,EAAE,IAAI,SAAO,KAAK,IAAI,OAAK,IAAI,CAAC,KAAK,MAAM,EAAE,KAAK,KAAK,CAAC;AAE7F,YAAI,WAAW,GAAG,MAAM;AAAA,EAAK,SAAS;AAAA,EAAK,KAAK,KAAK,IAAI,CAAC,GAAG,OAAO,KAAK,SAAS,MAAM;AAAA,YAAU,OAAO,KAAK,SAAS,GAAG,iBAAiB,EAAE;AAG7I,cAAM,WAAW,OAAO,wBAAwB;AAChD,YAAI,SAAS,SAAS,UAAU;AAC9B,qBAAW,SAAS,MAAM,GAAG,QAAQ,IAAI;AAAA,QAC3C;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AAExC,cAAM,OAAO,GAAG,cAAc,KAAK,SAAmB,KAAK,KAAe;AAC1E,YAAI,KAAK,WAAW,EAAG,QAAO,wBAAwB,KAAK,KAAK,iBAAiB,KAAK,OAAO;AAE7F,eAAO,KAAK,IAAI,OAAK;AACnB,gBAAM,UAAU,EAAE,aAAa,SAAS,IAAI,oBAAe,EAAE,aAAa,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK;AACrG,iBAAO,GAAG,EAAE,IAAI,KAAK,EAAE,YAAY,KAAK,EAAE,WAAW,aAAa,OAAO;AAAA,QAC3E,CAAC,EAAE,KAAK,IAAI;AAAA,MACd;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AAExC,YAAI;AACF,gBAAM,SAAS,GAAG,KAAK;AAAA,YACrB,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,YACZ,YAAY,KAAK;AAAA,YACjB,aAAa,KAAK;AAAA,YAClB,MAAO,KAAK,QAAgB;AAAA,YAC5B,SAAS,KAAK;AAAA,YACd,OAAO,KAAK;AAAA,UACd,CAAC;AAED,cAAI,CAAC,OAAQ,QAAO;AAEpB,gBAAM,cAAc,OAAO,KAAK,QAAQ,OAAO,EAAE,YAAY;AAC7D,gBAAM,SAAS,SAAS,KAAK,IAAI,IAAI,KAAK,UAAU,IAAI,WAAW,SAAS,KAAK,KAAK,IAAI,KAAK,WAAW;AAAA,iBAAoB,OAAO,aAAa,aAAa,OAAO,KAAK,MAAM;AACjL,cAAI,OAAO,KAAK,WAAW,EAAG,QAAO,GAAG,MAAM;AAAA;AAAA;AAE9C,gBAAM,QAAQ,OAAO,KAAK,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC;AACpD,cAAI,WAAW,GAAG,MAAM;AAAA;AAAA,EAAO,MAAM,KAAK,IAAI,CAAC;AAG/C,gBAAM,WAAW,OAAO,wBAAwB;AAChD,cAAI,SAAS,SAAS,UAAU;AAC9B,uBAAW,SAAS,MAAM,GAAG,QAAQ,IAAI;AAAA,UAC3C;AAEA,iBAAO;AAAA,QACT,SAAS,KAAK;AACZ,iBAAO,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,MAEA,KAAK,+BAA+B;AAClC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AAExC,cAAM,QAAQ,GAAG,aAAa,KAAK,SAAmB,KAAK,SAA+B;AAC1F,YAAI,UAAU,KAAM,QAAO,YAAY,KAAK,OAAO;AACnD,YAAI,MAAM,WAAW,EAAG,QAAO,mCAAmC,KAAK,aAAa,GAAG;AAEvF,cAAM,QAAQ,MAAM;AAAA,UAAI,OACtB,GAAG,EAAE,OAAO,WAAM,EAAE,OAAO,KAAK,EAAE,cAAc,IAAI,MAAM,EAAE,GAAG,EAAE,YAAY,QAAQ,CAAC,CAAC,KAAK,EAAE,QAAQ;AAAA,QACxG;AACA,eAAO,qBAAqB,KAAK,OAAO,iBAAiB,KAAK,aAAa,GAAG;AAAA;AAAA,EAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MACzG;AAAA,MAEA,KAAK,0BAA0B;AAC7B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AAExC,cAAM,UAAU,GAAG,QAAQ,KAAK,OAAiB;AACjD,YAAI,YAAY,KAAM,QAAO,YAAY,KAAK,OAAO;AACrD,YAAI,QAAQ,WAAW,EAAG,QAAO,kCAAkC,KAAK,OAAO;AAE/E,cAAM,QAAQ,QAAQ;AAAA,UAAI,OACxB,GAAG,EAAE,MAAM,YAAY,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,QAChF;AACA,eAAO,uBAAuB,KAAK,OAAO,MAAM,QAAQ,MAAM;AAAA;AAAA,EAA6B,MAAM,KAAK,IAAI,CAAC;AAAA,MAC7G;AAAA,MAEA,KAAK,wBAAwB;AAC3B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AAExC,cAAM,QAAQ,GAAG,YAAY,KAAK,OAAiB;AACnD,YAAI,UAAU,KAAM,QAAO,YAAY,KAAK,OAAO;AACnD,YAAI,CAAC,MAAM,UAAU;AACnB,gBAAM,WAAW,MAAM,kBAAkB,IACrC,WAAW,MAAM,gBAAgB,IAAI,MAAM,EAAE,GAAG,MAAM,aAAa,MACnE;AACJ,iBAAO,iCAAiC,KAAK,OAAO,KAAK,QAAQ;AAAA,QACnE;AACA,cAAM,aAAa,CAAC,8BAA8B,KAAK,OAAO,IAAI;AAClE,YAAI,MAAM,cAAc,OAAQ,YAAW,KAAK,oBAAoB,MAAM,aAAa,KAAK,IAAI,CAAC,EAAE;AACnG,YAAI,MAAM,gBAAgB,OAAQ,YAAW,KAAK,sBAAsB,MAAM,eAAe,KAAK,IAAI,CAAC,EAAE;AACzG,YAAK,MAAc,aAAa,QAAQ;AACtC,qBAAW,MAAO,MAAc,aAAa;AAC3C,uBAAW,KAAK,kBAAkB,GAAG,MAAM,IAAI,GAAG,IAAI,WAAM,GAAG,EAAE,EAAE;AAAA,UACrE;AAAA,QACF;AACA,YAAI,MAAM,kBAAkB,EAAG,YAAW,KAAK,sBAAsB,MAAM,gBAAgB,IAAI,MAAM,EAAE,GAAG,MAAM,aAAa,EAAE;AAC/H,eAAO,WAAW,KAAK,IAAI;AAAA,MAC7B;AAAA,MAEA,KAAK,0BAA0B;AAC7B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,KAAK,IAAI,YAAY,GAAG,SAAS,CAAC;AAExC,cAAM,QAAQ,KAAK,IAAI,OAAO,KAAK,SAAS,EAAE,GAAG,EAAE;AACnD,cAAM,UAAU,GAAG,WAAW,KAAK,SAAmB,KAAK;AAC3D,YAAI,YAAY,KAAM,QAAO,YAAY,KAAK,OAAO;AACrD,YAAI,QAAQ,WAAW,EAAG,QAAO,6BAA6B,KAAK,OAAO;AAE1E,cAAM,YAAY,CAAC,uBAAuB,KAAK,OAAO,MAAM,QAAQ,MAAM;AAAA,CAAkB;AAC5F,mBAAW,QAAQ,SAAS;AAC1B,gBAAM,OAAO,IAAI,KAAK,KAAK,UAAU,EAAE,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE;AAClF,gBAAM,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAW,EAAE,IAAI,EAAE,KAAK,IAAI;AAC/D,oBAAU,KAAK,GAAG,IAAI,WAAW,KAAK,SAAS,eAAe,CAAC,WAAW,KAAK,WAAW,aAAa,QAAQ,EAAE;AAAA,QACnH;AACA,eAAO,UAAU,KAAK,IAAI;AAAA,MAC5B;AAAA;AAAA,MAIA,KAAK,6BAA6B;AAChC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,EAAE,gBAAgB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,sBAAsB,CAAC;AAC9F,cAAM,EAAE,eAAe,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,uBAAuB,CAAC;AAC9F,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,kBAAkB;AACrB,cAAM,QAAQ,IAAI,eAAe,GAAG,SAAS,CAAC;AAC9C,cAAM,WAAW;AAEjB,cAAM,UAAU,IAAI,gBAAgB,OAAO,iBAAiB;AAC5D,cAAM,EAAE,OAAO,aAAa,IAAI,QAAQ,iBAAiB,KAAK;AAC9D,cAAM,EAAE,YAAY,IAAI,QAAQ,mBAAmB,IAAI,cAAc,WAAW;AAEhF,cAAM,cAAc;AAAA,UAClB;AAAA,UACA,2BAA2B,YAAY,MAAM,OAAO,iBAAiB;AAAA,UACrE,2BAA2B,QAAQ,QAAQ,IAAI;AAAA,UAC/C;AAAA,QACF;AACA,mBAAW,KAAK,YAAa,aAAY,KAAK,YAAS,CAAC,EAAE;AAC1D,eAAO,YAAY,KAAK,IAAI;AAAA,MAC9B;AAAA,MAEA,KAAK,iCAAiC;AACpC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,gBAAgB,CAAC,OAAO,eAAgB,QAAO;AAC3D,YAAI,OAAO,0BAA0B,QAAS,QAAO;AAErD,cAAM,EAAE,gBAAgB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,sBAAsB,CAAC;AAC9F,cAAM,EAAE,eAAe,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,uBAAuB,CAAC;AAC9F,cAAM,EAAE,kBAAkB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,2BAA2B,CAAC;AACrG,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,kBAAkB;AACrB,cAAM,QAAQ,IAAI,eAAe,GAAG,SAAS,CAAC;AAC9C,cAAM,WAAW;AAEjB,cAAM,UAAU,IAAI,gBAAgB,OAAO,iBAAiB;AAC5D,cAAM,EAAE,OAAO,aAAa,IAAI,QAAQ,iBAAiB,KAAK;AAE9D,YAAI,CAAC,SAAS,CAAC,KAAK,OAAO;AACzB,iBAAO,aAAa,YAAY,IAAI,OAAO,iBAAiB;AAAA,QAC9D;AAEA,cAAM,eAAe,MAAM,gCAAgC,EAAE;AAC7D,YAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,cAAM,cAAc,QAAQ,mBAAmB,IAAI,cAAc,WAAW;AAC5E,cAAM,SAAS,MAAM,kBAAkB,cAAc,aAAa,OAAO,oBAAoB,aAAa,IAAI;AAE9G,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,GAAG,WAAW;AAChE,YAAI,WAAW;AACf,cAAM,IAAI,MAAM,EAAE,SAAS,OAAO,oBAAoB,MAAM,WAAW,QAAQ,QAAQ,CAAC;AAExF,cAAM,aAAa,CAAC,8BAA8B;AAClD,YAAI,OAAO,aAAa,OAAQ,YAAW,KAAK,qBAAqB,OAAO,aAAa,KAAK,IAAI,CAAC,EAAE;AACrG,YAAI,OAAO,cAAc,OAAQ,YAAW,KAAK,mBAAmB,OAAO,cAAc,KAAK,IAAI,CAAC,EAAE;AACrG,YAAI,OAAO,aAAa,OAAQ,YAAW,KAAK,iBAAiB,OAAO,aAAa,KAAK,IAAI,CAAC,EAAE;AACjG,eAAO,WAAW,KAAK,IAAI;AAAA,MAC7B;AAAA,MAEA,KAAK,4BAA4B;AAC/B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,aAAc,QAAO;AACjC,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC1F,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,kBAAkB;AACrB,cAAM,MAAM,IAAI,cAAc,QAAQ,GAAG,SAAS,GAAG,WAAW;AAChE,YAAI,WAAW;AAEf,cAAM,KAAK,MAAM,IAAI,MAAM,EAAE,SAAS,sCAAqC,oBAAI,KAAK,GAAE,YAAY,CAAC,KAAK,MAAM,WAAW,QAAQ,SAAS,CAAC;AAC3I,eAAO,KAAK,sEAAiE;AAAA,MAC/E;AAAA;AAAA,MAIA,KAAK,sBAAsB;AACzB,cAAM,QAAS,KAAK,SAAsB,CAAC;AAC3C,YAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,cAAM,WAAW,GAAG,iBAAiB,OAAO;AAAA,UAC1C,OAAQ,KAAK,SAAoB;AAAA,UACjC,aAAa,KAAK;AAAA,QACpB,CAAC;AAED,YAAI,SAAS,WAAW,EAAG,QAAO,iDAAiD,MAAM,MAAM;AAC/F,eAAO,wBAAwB,SAAS,MAAM,SAAS,MAAM,MAAM;AAAA;AAAA,IACjE,SAAS,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,MACzC;AAAA;AAAA,MAIA,KAAK,sBAAsB;AACzB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AACnC,YAAI,CAAC,OAAO,mBAAoB,QAAO;AAEvC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AACvB,cAAM,QAAQ,GAAG,SAAS;AAE1B,cAAM,WAA8B,MAAM;AAAA,UACxC;AAAA,QACF,KAAK,EAAE,OAAO,EAAE;AAEhB,cAAM,YAA+B,MAAM;AAAA,UACzC;AAAA,QACF,KAAK,EAAE,OAAO,EAAE;AAEhB,cAAM,cAAyD,MAAM;AAAA,UACnE;AAAA,QACF;AACA,cAAM,WAAmC,CAAC;AAC1C,mBAAW,OAAO,aAAa;AAC7B,mBAAS,IAAI,OAAO,IAAI,IAAI;AAAA,QAC9B;AAEA,cAAM,aAAgC,MAAM;AAAA,UAC1C;AAAA,QACF,KAAK,EAAE,OAAO,EAAE;AAGhB,cAAM,EAAE,oBAAoB,sBAAsB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,6BAA6B,CAAC;AAC/H,cAAM,kBAAkB,IAAI,sBAAsB,WAAW;AAC7D,cAAM,YAAuC,MAAM,IAAI,wCAAwC;AAC/F,cAAM,qBAAqB,UAAU,OAAO,OAAK,gBAAgB,aAAa,EAAE,MAAM,CAAC,EAAE;AACzF,cAAM,mBAAmB,UAAU,QAAQ;AAE3C,cAAM,QAAkB;AAAA,UACtB;AAAA,UACA;AAAA,UACA,iBAAiB,SAAS,KAAK;AAAA,UAC/B,oBAAoB,gBAAgB,GAAG,qBAAqB,IAAI,KAAK,kBAAkB,iBAAiB,EAAE;AAAA,QAC5G;AAEA,YAAI,mBAAmB,GAAG;AACxB,gBAAM,WAAW,SAAS,UAAU,KAAK;AACzC,gBAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAM,qBAAqB,SAAS,qBAAqB,KAAK;AAC9D,gBAAM,UAAU,mBAAmB,WAAW,cAAc;AAE5D,gBAAM,KAAK,IAAI,4BAA4B,EAAE;AAC7C,cAAI,WAAW,EAAG,OAAM,KAAK,oBAAe,QAAQ,EAAE;AACtD,cAAI,cAAc,EAAG,OAAM,KAAK,wBAAmB,WAAW,EAAE;AAChE,cAAI,qBAAqB,EAAG,OAAM,KAAK,+BAA0B,kBAAkB,EAAE;AACrF,cAAI,UAAU,EAAG,OAAM,KAAK,4BAAuB,OAAO,EAAE;AAAA,QAC9D;AAEA,YAAI,WAAW,QAAQ,GAAG;AACxB,gBAAM,KAAK,IAAI,UAAK,WAAW,KAAK,aAAa,WAAW,UAAU,IAAI,UAAU,UAAU,6EAA6E;AAAA,QAC7K;AAGA,cAAM,gBAAiB,MAAM;AAAA,UAC3B;AAAA,QACF,GAA6C;AAC7C,YAAI,iBAAiB,MAAM;AACzB,gBAAM,QAAQ,KAAK,IAAI,IAAI;AAC3B,gBAAM,UAAU,SAAS,MAAO,KAAK,KAAK;AAC1C,gBAAM,SAAS,OAAO,4BAA4B;AAClD,cAAI,UAAU,QAAQ;AACpB,kBAAM,KAAK,IAAI,gCAA2B,KAAK,MAAM,OAAO,CAAC,mBAAmB,MAAM,6CAA6C;AAAA,UACrI;AAAA,QACF;AAGA,YAAI;AACF,gBAAM,WAAW,GAAG,SAAS;AAC7B,gBAAM,iBAAiB,SAAS,IAAI,8EAA8E;AAClH,cAAI,gBAAgB;AAClB,kBAAM,eAAe,SAAS,IAAI,6CAA6C,GAAG,OAAO;AACzF,gBAAI,eAAe,GAAG;AACpB,oBAAM,YAAY,SAAS,IAAI,yEAAyE,GAAG,OAAO;AAClH,oBAAM,KAAK,kBAAkB,YAAY,qBAAqB,SAAS,YAAY;AAAA,YACrF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAqB;AAE7B,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,mBAAmB;AACtB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AACvB,cAAM,QAAQ,GAAG,SAAS;AAG1B,YAAI,KAAK,YAAY,MAAM;AACzB,gBAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iCAAiC,CAAC;AACpG,gBAAM,EAAE,4BAA4B,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,4BAA4B,CAAC;AAEhH,gBAAM,WAAW,OAAO,kBAAkB,IAAI,CAAC,WAAmB;AAChE,gBAAI,OAAO,YAAY,MAAM,MAAO,QAAO,IAAI,WAAW;AAC1D,mBAAO;AAAA,UACT,CAAC,EAAE,OAAO,OAAO;AAEjB,gBAAM,SAAS,IAAI,4BAA4B,UAAU,EAAE;AAC3D,gBAAM,OAAO,UAAU;AAAA,QACzB;AAGA,YAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYZ,cAAM,SAAgB,CAAC;AAGvB,YAAI,KAAK,UAAU;AACjB,gBAAM,iBAAmD;AAAA,YACvD,UAAU,CAAC,GAAK,EAAI;AAAA,YACpB,MAAM,CAAC,GAAK,GAAG;AAAA,YACf,QAAQ,CAAC,GAAK,GAAG;AAAA,YACjB,KAAK,CAAC,KAAK,GAAG;AAAA,UAChB;AACA,gBAAM,QAAQ,eAAgB,KAAK,SAAoB,YAAY,CAAC;AACpE,cAAI,CAAC,MAAO,QAAO,qBAAqB,KAAK,QAAQ;AACrD,mBAAS;AACT,iBAAO,KAAK,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,QAChC;AAGA,YAAI,KAAK,SAAS;AAChB,gBAAM,gBAAgB,CAAC,YAAY,gBAAgB,qBAAqB;AACxE,cAAI,CAAC,cAAc,SAAS,KAAK,OAAiB,GAAG;AACnD,mBAAO,oBAAoB,KAAK,OAAO;AAAA,UACzC;AACA,mBAAS;AACT,iBAAO,KAAK,KAAK,OAAO;AAAA,QAC1B;AAEA,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,iBAAS;AACT,eAAO,KAAK,KAAK;AAEjB,cAAM,OAcD,MAAM,IAAI,OAAO,MAAM;AAI5B,cAAM,iBAAiB,CAAC,MACtB,MAAM,aAAa,IAAI,MAAM,wBAAwB,IAAI,MAAM,iBAAiB,IAAI;AACtF,cAAM,cAAc,oBAAI,IAA4B;AACpD,mBAAW,OAAO,MAAM;AACtB,gBAAM,MAAM,GAAG,IAAI,MAAM,KAAK,IAAI,gBAAgB,EAAE,KAAK,IAAI,aAAa,EAAE;AAC5E,gBAAM,KAAK,YAAY,IAAI,GAAG;AAC9B,cAAI,CAAC,MAAM,eAAe,IAAI,OAAO,IAAI,eAAe,GAAG,OAAO,EAAG,aAAY,IAAI,KAAK,GAAG;AAAA,QAC/F;AACA,cAAM,iBAAiB,CAAC,GAAG,YAAY,OAAO,CAAC;AAG/C,cAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,6BAA6B,CAAC;AACxG,cAAM,iBAAiB,IAAI,mBAAmB,WAAW;AACzD,cAAM,kBAAkB,eAAe,OAAO,SAAO,eAAe,aAAa,IAAI,MAAM,CAAC,EAAE;AAC9F,cAAM,eAAe,eAAe,OAAO,SAAO,CAAC,eAAe,aAAa,IAAI,MAAM,CAAC;AAE1F,YAAI,aAAa,WAAW,GAAG;AAC7B,gBAAM,UAAU,8BAA+B,KAAK,YAAY,KAAK,UAAW,uBAAuB;AACvG,iBAAO,kBAAkB,IAAI,GAAG,OAAO,KAAK,eAAe,iBAAiB;AAAA,QAC9E;AAEA,cAAM,EAAE,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,uCAAuC,CAAC;AAEnH,cAAM,QAAkB,CAAC,oBAAoB,aAAa,MAAM,GAAG,kBAAkB,IAAI,KAAK,eAAe,gBAAgB,EAAE;AAAA,CAAM;AAErI,mBAAW,OAAO,cAAc;AAC9B,gBAAM,QAAQ,IAAI;AAClB,cAAI;AACJ,cAAI,SAAS,KAAM,iBAAgB;AAAA,mBAC1B,SAAS,EAAK,iBAAgB;AAAA,mBAC9B,SAAS,EAAK,iBAAgB;AAAA,mBAC9B,SAAS,EAAK,iBAAgB;AAAA,cAClC,iBAAgB;AAErB,cAAI;AACJ,cAAI,CAAC,IAAI,QAAS,gBAAe;AAAA,mBACxB,IAAI,YAAY,WAAY,gBAAe;AAAA,mBAC3C,IAAI,YAAY,eAAgB,gBAAe;AAAA,cACnD,gBAAe;AAEpB,gBAAM,MAAM,IAAI,eACZ,GAAG,IAAI,YAAY,IAAI,IAAI,oBAAoB,IAAI,uBAAuB,GAAG,KAC7E;AAEJ,gBAAM,WAAW,IAAI,cAAc,OAC/B,WAAW,IAAI,WAAW,QAAQ,CAAC,CAAC,MACpC;AACJ,gBAAM,WAAW,IAAI,cAAc,OAC/B,WAAW,IAAI,WAAW,QAAQ,CAAC,CAAC,MACpC;AACJ,gBAAM,KAAK,GAAG,aAAa,KAAK,IAAI,MAAM,KAAK,GAAG,MAAM,YAAY,IAAI,QAAQ,GAAG,QAAQ,EAAE;AAE7F,cAAI,IAAI,WAAW,IAAI,YAAY,uBAAuB;AACxD,kBAAM,eAAe,IAAI,QAAQ,SAAS,MAAM,IAAI,QAAQ,MAAM,GAAG,GAAG,IAAI,WAAM,IAAI;AACtF,kBAAM,KAAK,KAAK,YAAY,EAAE;AAAA,UAChC;AAEA,cAAI,IAAI,iBAAiB,IAAI,aAAa,IAAI,cAAc;AAC1D,kBAAM,MAAM,oBAAoB,IAAI,WAAW,IAAI,cAAc,IAAI,aAAa;AAClF,gBAAI,IAAK,OAAM,KAAK,KAAK,GAAG,EAAE;AAAA,UAChC;AAAA,QACF;AAEA,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,sBAAsB;AACzB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,QAAQ,KAAK;AACnB,cAAM,UAAU,KAAK;AACrB,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI,CAAC,QAAS,QAAO;AAErB,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AACvB,cAAM,QAAQ,GAAG,SAAS;AAG1B,cAAM,SAA6D,MAAM;AAAA,UACvE;AAAA,UACA,CAAC,OAAO;AAAA,QACV;AAEA,YAAI,CAAC,QAAQ;AACX,iBAAO,iCAAiC,OAAO;AAAA,QACjD;AAGA,cAAM,aAAa,QAAQ,KAAK;AAChC,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,WAAW,KAAK;AACtB,cAAM,UAAW,KAAK,WAAsB;AAC5C,cAAM,eAAgB,KAAK,gBAA2B;AAEtD,cAAM;AAAA,UACJ;AAAA;AAAA;AAAA;AAAA;AAAA,UAKA,CAAC,YAAY,OAAO,OAAO,GAAG;AAAA,QAChC;AAEA,cAAM;AAAA,UACJ;AAAA;AAAA;AAAA,UAGA,CAAC,YAAY,OAAO,YAAY,MAAM,cAAc,OAAO;AAAA,QAC7D;AAGA,cAAM;AAAA,UACJ;AAAA;AAAA,UAEA,CAAC,OAAO,SAAS,UAAU;AAAA,QAC7B;AAEA,eAAO,cAAc,KAAK,YAAY,OAAO;AAAA,MAC/C;AAAA,MAEA,KAAK,2BAA2B;AAC9B,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,QAAQ,KAAK;AACnB,YAAI,CAAC,MAAO,QAAO;AAEnB,cAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,6BAA6B,CAAC;AACxG,cAAM,UAAU,IAAI,mBAAmB,WAAW;AAClD,gBAAQ,IAAI,OAAO,KAAK,QAA8B,KAAK,OAA6B;AAExF,cAAM,aAAa,KAAK,SAAS,YAAY,KAAK,MAAM,MAAM;AAC9D,cAAM,cAAc,KAAK,UAAU,aAAa,KAAK,OAAO,MAAM;AAClE,eAAO,GAAG,KAAK,eAAe,UAAU,GAAG,WAAW;AAAA,MACxD;AAAA,MAEA,KAAK,kBAAkB;AACrB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AAEvB,cAAM,EAAE,aAAa,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,4BAA4B,CAAC;AACjG,cAAM,WAAW,IAAI,aAAa,IAAI,WAAW;AACjD,cAAM,OAAO,SAAS,WAAW;AAEjC,eAAO,SAAS,IAAI;AAAA,MACtB;AAAA,MAEA,KAAK,iBAAiB;AACpB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AAEvB,cAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,2BAA2B,CAAC;AAC/F,cAAM,WAAW,IAAI,YAAY,IAAI,WAAW;AAChD,cAAM,OAAO,SAAS,WAAW;AAEjC,eAAO,SAAS,IAAI;AAAA,MACtB;AAAA,MAEA,KAAK,0BAA0B;AAC7B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,OAAQ,QAAO;AAEpB,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AACvB,cAAM,QAAQ,GAAG,SAAS;AAG1B,YAAI,sBAAqC;AACzC,YAAI,cAAc;AAElB,cAAM,UAA2C,MAAM;AAAA,UACrD;AAAA,UACA,CAAC,MAAM;AAAA,QACT;AAEA,YAAI,SAAS;AACX,gCAAsB,QAAQ;AAAA,QAChC,OAAO;AAEL,gBAAM,SAAgE,MAAM;AAAA,YAC1E;AAAA,YACA,CAAC,MAAM;AAAA,UACT;AAEA,cAAI,QAAQ;AACV,0BAAc,OAAO;AAErB,kBAAM,WAA2C,MAAM;AAAA,cACrD;AAAA,cACA,CAAC,OAAO,OAAO;AAAA,YACjB;AAEA,gBAAI,UAAU;AACZ,oCAAsB,SAAS;AAAA,YACjC,OAAO;AACL,qBAAO,4CAA4C,MAAM;AAAA,YAC3D;AAAA,UACF,OAAO;AACL,mBAAO,WAAW,MAAM;AAAA,UAC1B;AAAA,QACF;AAGA,cAAM,EAAE,qBAAqB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,6BAA6B,CAAC;AAC1G,cAAM,WAAW,IAAI,qBAAqB,IAAI,MAAM;AACpD,cAAM,SAAS,MAAM,SAAS,QAAQ,mBAAmB;AAEzD,cAAM,QAAkB;AAAA,UACtB,mBAAmB,WAAW;AAAA,UAC9B;AAAA,UACA,YAAY,OAAO,OAAO;AAAA,UAC1B,0BAA0B,OAAO,uBAAuB;AAAA,QAC1D;AAEA,YAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,gBAAM,KAAK,IAAI,UAAU;AACzB,qBAAW,KAAK,OAAO,MAAM,MAAM,GAAG,CAAC,GAAG;AACxC,kBAAM,KAAK,UAAU,EAAE,UAAU,KAAK,EAAE,KAAK,KAAK,UAAK,CAAC,EAAE;AAAA,UAC5D;AACA,cAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,kBAAM,KAAK,eAAU,OAAO,MAAM,SAAS,CAAC,aAAa;AAAA,UAC3D;AAAA,QACF;AAEA,YAAI,OAAO,kBAAkB,SAAS,GAAG;AACvC,gBAAM,KAAK,IAAI,uBAAuB;AACtC,qBAAW,OAAO,OAAO,kBAAkB,MAAM,GAAG,EAAE,GAAG;AACvD,kBAAM,KAAK,KAAK,GAAG,EAAE;AAAA,UACvB;AACA,cAAI,OAAO,kBAAkB,SAAS,IAAI;AACxC,kBAAM,KAAK,eAAU,OAAO,kBAAkB,SAAS,EAAE,OAAO;AAAA,UAClE;AAAA,QACF;AAGA,YAAI,OAAO,YAAY,YAAY;AACjC,gBAAM,SAAS,MAAM,SAAS,iBAAiB,mBAAmB;AAClE,cAAI,QAAQ;AACV,kBAAM,KAAK,IAAI,mBAAmB;AAClC,gBAAI,OAAO,eAAe,SAAS,GAAG;AACpC,oBAAM,KAAK,oBAAoB,OAAO,eAAe,KAAK,IAAI,CAAC,EAAE;AAAA,YACnE;AACA,kBAAM,KAAK,0BAA0B,OAAO,oBAAoB,MAAM,EAAE;AACxE,kBAAM,KAAK,mBAAmB,OAAO,iBAAiB,EAAE;AAAA,UAC1D;AAAA,QACF;AAEA,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AACvB,cAAM,QAAQ,GAAG,SAAS;AAE1B,cAAM,YAAY,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAGxE,YAAI,KAAK,YAAY,MAAM;AACzB,gBAAM,EAAE,iBAAiB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,0BAA0B,CAAC;AACnG,gBAAM,UAAU,IAAI,iBAAiB,EAAE;AACvC,gBAAM,QAAQ,SAAS;AAAA,QACzB;AAEA,cAAM,OAQD,MAAM;AAAA,UACT;AAAA;AAAA;AAAA;AAAA;AAAA,UAKA,CAAC,SAAS;AAAA,QACZ;AAEA,YAAI,KAAK,WAAW,GAAG;AACrB,iBAAO,iDAAiD,SAAS,OAC9D,KAAK,UAAU,KAAK;AAAA,QACzB;AAEA,cAAM,QAAkB,CAAC,kCAAkC,SAAS;AAAA,CAAM;AAC1E,mBAAW,OAAO,MAAM;AACtB,gBAAM,WAAW,IAAI,oBAAoB,IAAI,uBAAuB;AACpE,gBAAM,SAAS,IAAI,kBAAkB;AACrC,gBAAM,QAAQ,IAAI,mBAAmB;AACrC,gBAAM,SAAS,IAAI,mBACf,KAAK,OAAO,KAAK,IAAI,IAAI,IAAI,qBAAqB,MAAO,KAAK,KAAK,KAAK,GAAG,IAC3E;AACJ,gBAAM,MAAM,SAAI,OAAO,KAAK,MAAM,QAAQ,EAAE,CAAC,IAAI,SAAI,OAAO,KAAK,KAAK,MAAM,QAAQ,EAAE,CAAC;AACvF,gBAAM,YAAY,WAAW,OAAO,KAAK,MAAM,oBAAoB;AACnE,gBAAM,KAAK,GAAG,IAAI,YAAY,KAAK,IAAI,SAAS,MAAM,QAAQ,WAAM,MAAM,GAAG,SAAS,EAAE;AACxF,gBAAM,KAAK,KAAK,GAAG,IAAI,MAAM,QAAQ,CAAC,CAAC,EAAE;AAAA,QAC3C;AAEA,cAAM,aAAgC,MAAM,IAAI,gDAAgD,KAAK,EAAE,OAAO,EAAE;AAChH,cAAM,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,WAAW,KAAK,qCAAqC,SAAS,GAAG;AAErG,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,sBAAsB;AACzB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AACvB,cAAM,QAAQ,GAAG,SAAS;AAE1B,cAAM,OAID,MAAM;AAAA,UACT;AAAA,QACF;AAEA,cAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,wBAAwB,CAAC;AACnG,cAAM,SAAS,OAAO;AACtB,cAAM,aAAa,mBAAmB,MAAM,MAAM;AAElD,YAAI,KAAK,WAAW,MAAM;AAExB,cAAI,WAAW,WAAW,GAAG;AAC3B,mBAAO;AAAA,UACT;AACA,gBAAMA,SAAkB,CAAC,+BAA+B;AACxD,qBAAW,KAAK,YAAY;AAC1B,YAAAA,OAAM,KAAK,GAAG,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,MAAM,EAAE,OAAO,EAAE;AAAA,UAC3F;AACA,gBAAME,aAAY,WAAW,OAAO,OAAK,EAAE,aAAa,MAAM,EAAE;AAChE,gBAAMC,aAAY,WAAW,OAAO,OAAK,EAAE,aAAa,MAAM,EAAE;AAChE,UAAAH,OAAM,KAAK,EAAE;AACb,cAAIE,aAAY,EAAG,CAAAF,OAAM,KAAK,GAAGE,UAAS,kBAAkBA,eAAc,IAAI,MAAM,EAAE,EAAE;AACxF,cAAIC,aAAY,EAAG,CAAAH,OAAM,KAAK,GAAGG,UAAS,mBAAmBA,eAAc,IAAI,MAAM,EAAE,EAAE;AACzF,iBAAO,SAASH,OAAM,KAAK,IAAI,CAAC;AAAA,QAClC;AAGA,YAAI,KAAK,WAAW,GAAG;AACrB,iBAAO;AAAA,QACT;AAEA,cAAM,eAAe,oBAAI,IAA6B;AACtD,mBAAW,KAAK,YAAY;AAC1B,uBAAa,IAAI,GAAG,EAAE,SAAS,IAAI,EAAE,WAAW,IAAI,EAAE,QAAQ;AAAA,QAChE;AAEA,cAAM,QAAkB,CAAC,qBAAqB,KAAK,MAAM;AAAA,CAAkB;AAG3E,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,KAAK,wBAAwB;AACnC,qBAAW,KAAK,YAAY;AAC1B,kBAAM,KAAK,GAAG,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,MAAM,EAAE,OAAO,EAAE;AAAA,UAC3F;AACA,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,cAAM,KAAK,uBAAuB;AAClC,cAAM,KAAK,wCAAwC;AACnD,cAAM,KAAK,wCAAwC;AAEnD,mBAAW,OAAO,MAAM;AACtB,gBAAM,MAAM,GAAG,IAAI,SAAS,IAAI,IAAI,YAAY;AAChD,gBAAM,YAAY,aAAa,IAAI,GAAG;AACtC,gBAAM,UAAU,IAAI,WAAW;AAC/B,gBAAM,SAAS,cAAc,IAAI,UAAU,OAAO;AAClD,gBAAM,KAAK,GAAG,IAAI,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,MAAM,MAAM,EAAE;AAAA,QAC9E;AAEA,cAAM,YAAY,WAAW,OAAO,OAAK,EAAE,aAAa,MAAM,EAAE;AAChE,cAAM,YAAY,WAAW,OAAO,OAAK,EAAE,aAAa,MAAM,EAAE;AAChE,cAAM,eAAe,KAAK,OAAO,OAAK,CAAC,EAAE,OAAO,EAAE;AAElD,cAAM,KAAK,EAAE;AACb,YAAI,YAAY,EAAG,OAAM,KAAK,GAAG,SAAS,kBAAkB,cAAc,IAAI,MAAM,EAAE,EAAE;AACxF,YAAI,YAAY,EAAG,OAAM,KAAK,GAAG,SAAS,mBAAmB,cAAc,IAAI,MAAM,EAAE,EAAE;AACzF,YAAI,eAAe,EAAG,OAAM,KAAK,GAAG,YAAY,mBAAmB,iBAAiB,IAAI,MAAM,EAAE,EAAE;AAClG,YAAI,cAAc,KAAK,cAAc,EAAG,OAAM,KAAK,sBAAsB;AAEzE,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,4BAA4B;AAC/B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AAEvB,cAAM,EAAE,sBAAsB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,+BAA+B,CAAC;AAC7G,cAAM,WAAW,IAAI,sBAAsB,EAAE;AAC7C,cAAM,SAAS,MAAM,SAAS,QAAQ;AAEtC,YAAI,OAAO,gBAAgB,GAAG;AAC5B,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,WAAW,KAAK,OAA6B,EAAE;AAC7D,cAAM,SAAU,KAAK,eAAe,OAChC,OAAO,cAAc,OAAO,OAAK,EAAE,kBAAkB,QAAQ,IAC7D,OAAO;AAEX,cAAM,QAAkB;AAAA,UACtB;AAAA,UACA;AAAA,UACA,iBAAiB,OAAO,WAAW,aAAa,OAAO,YAAY,oBAAoB,OAAO,mBAAmB,wBAAwB,OAAO,eAAe;AAAA,UAC/J;AAAA,QACF;AAEA,cAAM,YAAY,OAAO,MAAM,GAAG,KAAK;AACvC,YAAI,UAAU,WAAW,GAAG;AAC1B,gBAAM,KAAK,KAAK,eAAe,OAC3B,yDACA,+CAA+C;AAAA,QACrD,OAAO;AACL,qBAAW,SAAS,WAAW;AAC7B,kBAAM,UAAU,MAAM,kBAAkB,WAAW;AACnD,kBAAM,UAAU,MAAM,YAAY,IAAI,SAAS,MAAM,UAAU,QAAQ,CAAC,CAAC,KAAK;AAC9E,kBAAM,KAAK,GAAG,OAAO,IAAI,MAAM,KAAK,KAAK,MAAM,aAAa,IAAI,OAAO,KAAK,MAAM,QAAQ,EAAE;AAC5F,uBAAW,OAAO,MAAM,eAAe,MAAM,GAAG,CAAC,GAAG;AAClD,oBAAM,KAAK,YAAO,IAAI,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,QAAQ,OAAO,IAAI,aAAa,IAAI,MAAM,EAAE,GAAG,IAAI,UAAU,KAAK,IAAI,OAAO,KAAK,EAAE,GAAG;AAAA,YACpJ;AACA,gBAAI,MAAM,eAAe,SAAS,GAAG;AACnC,oBAAM,KAAK,sBAAY,MAAM,eAAe,SAAS,CAAC,aAAa;AAAA,YACrE;AAAA,UACF;AACA,cAAI,OAAO,SAAS,OAAO;AACzB,kBAAM,KAAK,IAAI,aAAQ,OAAO,SAAS,KAAK,0CAA0C;AAAA,UACxF;AAAA,QACF;AAEA,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,qBAAqB;AACxB,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AAEvB,cAAM,EAAE,eAAe,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,wBAAwB,CAAC;AAC/F,cAAM,UAAU,IAAI,eAAe,IAAI,WAAW;AAClD,cAAM,SAAS,MAAM,QAAQ,KAAK,EAAE,cAAc,KAAK,iBAAiB,KAAK,CAAC;AAE9E,YAAI,OAAO,kBAAkB,GAAG;AAC9B,iBAAO,6BAA6B,OAAO,YAAY,QAAQ,OAAO,iBAAiB,IAAI,MAAM,EAAE;AAAA,QACrG;AAEA,YAAI,WAAW,OAAO;AACtB,YAAI,KAAK,UAAU;AACjB,qBAAW,SAAS,OAAO,OAAK,EAAE,aAAc,KAAK,QAAmB;AAAA,QAC1E;AAEA,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO,uCAAuC,KAAK,QAAQ,uCAAuC,OAAO,aAAa;AAAA,QACxH;AAEA,cAAM,QAAkB;AAAA,UACtB,mBAAmB,OAAO,YAAY;AAAA,UACtC;AAAA,UACA,UAAU,OAAO,aAAa,eAAe,OAAO,aAAa,WAAW,OAAO,SAAS;AAAA,UAC5F;AAAA,QACF;AAEA,mBAAW,KAAK,UAAU;AACxB,gBAAM,KAAK,GAAG,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;AACnD,gBAAM,KAAK,KAAK,EAAE,QAAQ,IAAI,EAAE,IAAI,IAAI,EAAE,MAAM,cAAc,EAAE,OAAO,EAAE;AACzE,cAAI,EAAE,UAAU;AACd,kBAAM,KAAK,kBAAkB,EAAE,QAAQ,EAAE;AAAA,UAC3C;AACA,cAAI,EAAE,kBAAkB,GAAG;AACzB,kBAAM,KAAK,oBAAoB,EAAE,eAAe,eAAe,EAAE,oBAAoB,IAAI,MAAM,EAAE,EAAE;AAAA,UACrG;AAAA,QACF;AAEA,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,4BAA4B;AAC/B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AAEvB,cAAM,EAAE,iBAAiB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,2BAA2B,CAAC;AACpG,cAAM,WAAW,IAAI,iBAAiB,EAAE;AACxC,YAAI,WAAW,MAAM,SAAS,QAAQ;AAEtC,cAAM,aAAc,KAAK,QAA+B;AACxD,cAAM,WAAmC;AAAA,UACvC,KAAK;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM;AAAA,UACN,QAAQ;AAAA,QACV;AAEA,YAAI,eAAe,OAAO;AACxB,gBAAM,SAAS,SAAS,UAAU;AAClC,cAAI,CAAC,OAAQ,QAAO,wBAAwB,UAAU;AACtD,qBAAW,SAAS,OAAO,OAAK,EAAE,SAAS,MAAM;AAAA,QACnD;AAEA,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO,eAAe,QAClB,sCACA,OAAO,UAAU;AAAA,QACvB;AAEA,cAAM,QAAkB;AAAA,UACtB,qBAAqB,SAAS,MAAM,WAAW,SAAS,WAAW,IAAI,MAAM,EAAE;AAAA,UAC/E;AAAA,QACF;AAEA,mBAAW,KAAK,UAAU;AACxB,gBAAM,KAAK,GAAG,EAAE,SAAS,YAAY,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE,IAAI,EAAE;AACzE,gBAAM,KAAK,KAAK,EAAE,QAAQ,IAAI,EAAE,IAAI,aAAa,EAAE,MAAM,EAAE;AAC3D,gBAAM,KAAK,KAAK,EAAE,WAAW,EAAE;AAC/B,gBAAM,KAAK,UAAU,EAAE,cAAc,EAAE;AACvC,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,0BAA0B;AAC7B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AAEvB,cAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,6BAA6B,CAAC;AACxG,cAAM,UAAU,IAAI,mBAAmB,EAAE;AACzC,cAAM,EAAE,SAAS,OAAO,IAAI,MAAM,QAAQ,SAAS;AAEnD,cAAM,aAAqC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,EAAE;AACjG,cAAM,eAAe,KAAK;AAC1B,cAAM,iBAAiB,eAAgB,WAAW,YAAY,KAAK,IAAK;AAExE,cAAM,WAAW,QACd,OAAO,QAAM,WAAW,EAAE,SAAS,KAAK,MAAM,cAAc,EAC5D,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE,SAAS,KAAK,MAAM,WAAW,EAAE,SAAS,KAAK,EAAE;AAEjF,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO,6CAA6C,gBAAgB,QAAQ,uBAAuB,QAAQ,MAAM;AAAA,QACnH;AAEA,cAAM,QAAkB;AAAA,UACtB,0BAA0B,SAAS,MAAM,sBAAsB,gBAAgB,QAAQ;AAAA,UACvF;AAAA,QACF;AAEA,mBAAW,KAAK,UAAU;AACxB,gBAAM,WAAW,EAAE,mBAAmB,OAAO,cAAc,EAAE,eAAe,QAAQ,CAAC,CAAC,QAAQ;AAC9F,gBAAM,gBAAgB,EAAE,oBAAoB,OAAO,gBAAgB,EAAE,eAAe,KAAK;AACzF,gBAAM,KAAK,GAAG,EAAE,UAAU,YAAY,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,IAAI,QAAQ,GAAG,aAAa,EAAE;AACvG,qBAAW,UAAU,EAAE,aAAa;AAClC,kBAAM,KAAK,YAAO,MAAM,EAAE;AAAA,UAC5B;AAAA,QACF;AAEA,YAAI,OAAO,SAAS,GAAG;AACrB,gBAAM,KAAK,IAAI,UAAK,OAAO,MAAM,WAAW,OAAO,WAAW,IAAI,MAAM,EAAE,wCAAwC;AAAA,QACpH;AAEA,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,2BAA2B;AAC9B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AAEvB,cAAM,EAAE,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,8BAA8B,CAAC;AAC1G,cAAM,UAAU,IAAI,oBAAoB,EAAE;AAC1C,cAAM,WAAW,MAAM,QAAQ,MAAM;AAErC,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO;AAAA,QACT;AAEA,cAAM,aAAqC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,EAAE;AAC7E,cAAM,SAAS,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE,SAAS,KAAK,MAAM,WAAW,EAAE,SAAS,KAAK,EAAE;AAE3G,cAAM,QAAkB;AAAA,UACtB,2BAA2B,SAAS,MAAM,WAAW,SAAS,WAAW,IAAI,MAAM,EAAE;AAAA,UACrF;AAAA,QACF;AAEA,mBAAW,KAAK,QAAQ;AACtB,gBAAM,KAAK,GAAG,EAAE,UAAU,YAAY,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,GAAG;AAC5E,gBAAM,KAAK,KAAK,EAAE,WAAW,EAAE;AAC/B,cAAI,EAAE,gBAAgB,EAAE,eAAe;AACrC,kBAAM,KAAK,qBAAqB,EAAE,aAAa,GAAG,EAAE,oBAAoB,gBAAgB,EAAE,iBAAiB,KAAK,EAAE,EAAE;AAAA,UACtH;AAAA,QACF;AAEA,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,eAAgB,QAAO;AAEnC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AAEvB,cAAM,EAAE,mBAAmB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,4BAA4B,CAAC;AACvG,cAAM,UAAU,IAAI,mBAAmB,EAAE;AACzC,YAAI,WAAW,QAAQ,UAAU;AAEjC,YAAI,KAAK,gBAAgB,MAAM;AAC7B,qBAAW,SAAS,OAAO,OAAK,EAAE,SAAS;AAAA,QAC7C;AAEA,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO,KAAK,gBAAgB,OACxB,sCACA;AAAA,QACN;AAGA,cAAM,YAAoC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,EAAE;AACrF,iBAAS,KAAK,CAAC,GAAG,MAAM;AACtB,gBAAM,OAAO,UAAU,EAAE,SAAS,KAAK;AACvC,gBAAM,OAAO,UAAU,EAAE,SAAS,KAAK;AACvC,cAAI,SAAS,KAAM,QAAO,OAAO;AACjC,kBAAQ,EAAE,YAAY,MAAM,EAAE,YAAY;AAAA,QAC5C,CAAC;AAED,cAAM,eAAe,SAAS,OAAO,OAAK,EAAE,SAAS,EAAE;AACvD,cAAM,eAAe,SAAS,OAAO,OAAK,EAAE,cAAc,SAAS,EAAE;AAErE,cAAM,QAAkB;AAAA,UACtB,sBAAsB,SAAS,MAAM,QAAQ,eAAe,IAAI,KAAK,YAAY,aAAa,EAAE,GAAG,eAAe,IAAI,KAAK,YAAY,aAAa,EAAE;AAAA,UACtJ;AAAA,QACF;AAEA,mBAAW,KAAK,UAAU;AACxB,gBAAM,gBAAgB,EAAE,YAAY,OAAO,YACvC,EAAE,YAAY,IAAI,aAClB,EAAE,YAAY,IAAI,SAClB,EAAE,YAAY,IAAI,WAClB;AAEJ,gBAAM,SAAS,EAAE,cAAc,YAAY,cACvC,EAAE,cAAc,YAAY,cAC5B,EAAE,cAAc,WAAW,aAC3B;AAEJ,gBAAM,KAAK,GAAG,MAAM,KAAK,aAAa,KAAK,EAAE,KAAK,KAAK,EAAE,WAAW,EAAE;AACtE,cAAI,EAAE,aAAa,KAAM,OAAM,KAAK,cAAc,EAAE,QAAQ,OAAO,EAAE,aAAa,IAAI,MAAM,EAAE,EAAE;AAChG,cAAI,EAAE,yBAAyB,KAAM,OAAM,KAAK,uBAAuB,EAAE,oBAAoB,OAAO,EAAE,yBAAyB,IAAI,MAAM,EAAE,EAAE;AAC7I,cAAI,EAAE,gBAAgB,MAAM;AAC1B,kBAAM,eAAe,IAAI,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACtE,kBAAM,KAAK,mBAAmB,YAAY,EAAE;AAAA,UAC9C;AAAA,QACF;AAEA,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAE3C,YAAI,CAAC,OAAO,gBAAgB;AAC1B,iBAAO;AAAA,QACT;AAEA,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,uBAAuB,CAAC;AAC7F,cAAM,SAAS,IAAI,cAAc;AAEjC,YAAI,CAAC,OAAO,YAAY,GAAG;AACzB,iBAAO;AAAA,QACT;AAEA,cAAM,UAAU,KAAK;AACrB,cAAM,WAAW,KAAK;AACtB,cAAM,WAAW,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAC/D,cAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC;AAE7D,cAAM,KAAK,GAAG,YAAY;AAC1B,cAAM,QAAQ,GAAG,SAAS;AAE1B,cAAM,QAAiC,MAAM;AAAA,UAC3C;AAAA,UACA,CAAC,QAAQ;AAAA,QACX;AAEA,cAAM,UAAwE,CAAC;AAC/E,YAAI,YAAY;AAEhB,mBAAW,QAAQ,OAAO;AACxB,cAAI,QAAQ,UAAU,OAAO;AAAE,wBAAY;AAAM;AAAA,UAAO;AAExD,cAAI;AACJ,cAAI;AACF,kBAAM,WAAW,KAAK,WAAW,KAAK,IAAI,IAAI,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,IAAI;AAC1F,sBAAU,GAAG,aAAa,UAAU,MAAM;AAAA,UAC5C,QAAQ;AACN;AAAA,UACF;AAEA,gBAAM,UAAU,MAAM,OAAO,UAAU,SAAS,UAAU,OAAO;AACjE,qBAAW,KAAK,SAAS;AACvB,gBAAI,QAAQ,UAAU,OAAO;AAAE,0BAAY;AAAM;AAAA,YAAO;AACxD,oBAAQ,KAAK,EAAE,UAAU,KAAK,MAAM,MAAM,EAAE,MAAM,WAAW,EAAE,UAAU,CAAC;AAAA,UAC5E;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,GAAG;AACxB,iBAAO,kBAAkB,OAAO,QAAQ,QAAQ;AAAA,QAClD;AAEA,cAAM,QAAkB;AAAA,UACtB,GAAG,QAAQ,MAAM,SAAS,QAAQ,WAAW,IAAI,OAAO,EAAE,SAAS,OAAO,QAAQ,QAAQ;AAAA,UAC1F;AAAA,QACF;AAEA,mBAAW,KAAK,SAAS;AACvB,gBAAM,KAAK,IAAI,EAAE,QAAQ,IAAI,EAAE,IAAI,EAAE;AACrC,gBAAM,KAAK,MAAM,EAAE,SAAS,EAAE;AAC9B,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,YAAI,WAAW;AACb,gBAAM,KAAK,mCAA8B,KAAK,8DAA8D;AAAA,QAC9G;AAEA,eAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA;AAAA,MAIA,KAAK,8BAA8B;AACjC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAE,OAAe,gBAAgB;AACnC,iBAAO;AAAA,QACT;AAGA,cAAM,EAAE,qBAAqB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,uBAAuB,CAAC;AACpG,cAAM,SAAS,IAAI,qBAAqB;AACxC,cAAM,cAAc,KAAK,KAAK,WAAW,qBAAqB;AAC9D,cAAM,aAAc,OAAe;AACnC,YAAI,QAAmD,CAAC;AACxD,YAAI;AACF,kBAAQ,OAAO,KAAK,aAAa,UAAU;AAAA,QAC7C,QAAQ;AAAA,QAA4B;AAGpC,cAAM,kBAAkB,oBAAI,IAAuD;AACnF,mBAAW,QAAQ,OAAO;AACxB,gBAAM,SAAS,KAAK,cAAc,MAAM,WAAW,IAAI,CAAC,KAAK,KAAK;AAClE,cAAI,CAAC,gBAAgB,IAAI,MAAM,EAAG,iBAAgB,IAAI,QAAQ,CAAC,CAAC;AAChE,0BAAgB,IAAI,MAAM,EAAG,KAAK,IAAI;AAAA,QACxC;AAGA,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AACvB,cAAM,QAAQ,GAAG,SAAS;AAC1B,cAAM,wBAAwB,oBAAI,IAAoB;AACtD,YAAI;AACF,gBAAM,cAAc,MAAM,IAAI,8EAA8E;AAC5G,cAAI,aAAa;AACf,kBAAM,OAAuD,MAAM;AAAA,cACjE;AAAA,YACF;AACA,uBAAW,OAAO,MAAM;AACtB,oBAAM,SAAS,IAAI,eAAe,MAAM,WAAW,IAAI,CAAC,KAAK,IAAI;AACjE,oCAAsB,IAAI,SAAS,sBAAsB,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG;AAAA,YACtF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAqB;AAG7B,cAAM,aAAa;AAAA,UACjB;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAC5B;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,QAC9B;AACA,cAAM,aAAqC;AAAA,UACzC,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AAEA,cAAM,UAAoB,CAAC;AAC3B,cAAM,YAAsB,CAAC;AAE7B,cAAM,QAAkB;AAAA,UACtB;AAAA,UACA;AAAA,UACA,uBAAuB,MAAM,MAAM;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,mBAAW,OAAO,YAAY;AAC5B,gBAAM,WAAW,gBAAgB,IAAI,GAAG,KAAK,CAAC;AAC9C,gBAAM,aAAa,sBAAsB,IAAI,GAAG,KAAK;AACrD,gBAAM,QAAQ,GAAG,GAAG,KAAK,WAAW,GAAG,KAAK,GAAG;AAC/C,cAAI,SAAS,SAAS,GAAG;AACvB,oBAAQ,KAAK,KAAK;AAClB,kBAAM,KAAK,GAAG,KAAK,MAAM,SAAS,MAAM,MAAM,UAAU,EAAE;AAAA,UAC5D,OAAO;AACL,sBAAU,KAAK,KAAK;AAAA,UACtB;AAAA,QACF;AAGA,mBAAW,CAAC,KAAK,QAAQ,KAAK,gBAAgB,QAAQ,GAAG;AACvD,cAAI,CAAC,WAAW,SAAS,GAAG,GAAG;AAC7B,kBAAM,aAAa,sBAAsB,IAAI,GAAG,KAAK;AACrD,kBAAM,KAAK,GAAG,GAAG,MAAM,SAAS,MAAM,MAAM,UAAU,EAAE;AAAA,UAC1D;AAAA,QACF;AAEA,YAAI,UAAU,SAAS,GAAG;AACxB,gBAAM,KAAK,IAAI,yBAAyB,UAAU,MAAM,MAAM,GAAG,UAAU,IAAI,OAAK,OAAO,CAAC,EAAE,CAAC;AAAA,QACjG;AAEA,cAAM,KAAK,IAAI,aAAa,QAAQ,MAAM,MAAM,WAAW,MAAM,0BAA0B;AAE3F,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,mCAAmC;AACtC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAE,OAAe,gBAAgB;AACnC,iBAAO;AAAA,QACT;AAEA,cAAM,QAAS,KAAK,SAAoB;AAExC,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AACvB,cAAM,QAAQ,GAAG,SAAS;AAE1B,cAAM,cAAc,MAAM,IAAI,8EAA8E;AAC5G,YAAI,CAAC,aAAa;AAChB,iBAAO;AAAA,QACT;AAEA,cAAM,OAAmD,MAAM;AAAA,UAC7D;AAAA,QACF;AAEA,cAAM,WAAmC,CAAC;AAC1C,mBAAW,OAAO,MAAM;AACtB,mBAAS,IAAI,UAAU,IAAI,IAAI;AAAA,QACjC;AAEA,cAAM,eAAe,KAAK,KAAK,aAAa,YAAY;AACxD,YAAI,CAAC,GAAG,WAAW,YAAY,EAAG,IAAG,UAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAEhF,cAAM,eAAe,KAAK,KAAK,cAAc,oBAAoB,KAAK,OAAO;AAC7E,WAAG,cAAc,cAAc,KAAK,UAAU,EAAE,OAAO,SAAS,KAAK,IAAI,GAAG,QAAQ,SAAS,GAAG,MAAM,CAAC,CAAC;AAExG,cAAM,eAAe,OAAO,OAAO,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AACtE,eAAO,aAAa,KAAK,YAAY,OAAO,KAAK,QAAQ,EAAE,MAAM,cAAc,YAAY,yBAAoB,YAAY;AAAA,MAC7H;AAAA,MAEA,KAAK,0BAA0B;AAC7B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAE,OAAe,gBAAgB;AACnC,iBAAO;AAAA,QACT;AAEA,cAAM,QAAS,KAAK,SAAoB;AACxC,cAAM,eAAe,KAAK,KAAK,aAAa,cAAc,oBAAoB,KAAK,OAAO;AAE1F,YAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,iBAAO,aAAa,KAAK;AAAA,QAC3B;AAEA,YAAI;AACJ,YAAI;AACF,qBAAW,KAAK,MAAM,GAAG,aAAa,cAAc,MAAM,CAAC;AAAA,QAC7D,QAAQ;AACN,iBAAO,iCAAiC,YAAY;AAAA,QACtD;AAEA,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,oBAAoB;AACvB,cAAM,QAAQ,GAAG,SAAS;AAE1B,cAAM,cAAc,MAAM,IAAI,8EAA8E;AAC5G,cAAM,gBAAwC,CAAC;AAC/C,YAAI,aAAa;AACf,gBAAM,OAAmD,MAAM;AAAA,YAC7D;AAAA,UACF;AACA,qBAAW,OAAO,MAAM;AACtB,0BAAc,IAAI,UAAU,IAAI,IAAI;AAAA,UACtC;AAAA,QACF;AAEA,cAAM,gBAAgB,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,SAAS,MAAM,GAAG,GAAG,OAAO,KAAK,aAAa,CAAC,CAAC;AAE9F,cAAM,cAAoD,CAAC;AAC3D,cAAM,mBAAyD,CAAC;AAChE,cAAM,YAAkD,CAAC;AACzD,cAAM,UAA+E,CAAC;AAEtF,mBAAW,MAAM,eAAe;AAC9B,gBAAM,SAAS,SAAS,OAAO,EAAE,KAAK;AACtC,gBAAM,QAAQ,cAAc,EAAE,KAAK;AACnC,cAAI,WAAW,KAAK,QAAQ,GAAG;AAC7B,wBAAY,KAAK,EAAE,IAAI,OAAO,MAAM,CAAC;AAAA,UACvC,WAAW,SAAS,KAAK,UAAU,GAAG;AACpC,6BAAiB,KAAK,EAAE,IAAI,OAAO,OAAO,CAAC;AAAA,UAC7C,WAAW,WAAW,OAAO;AAC3B,sBAAU,KAAK,EAAE,IAAI,OAAO,MAAM,CAAC;AAAA,UACrC,OAAO;AACL,oBAAQ,KAAK,EAAE,IAAI,QAAQ,OAAO,OAAO,QAAQ,OAAO,CAAC;AAAA,UAC3D;AAAA,QACF;AAEA,cAAM,YAAY,IAAI,KAAK,SAAS,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AACxF,cAAM,QAAkB;AAAA,UACtB,oBAAoB,KAAK,YAAY,SAAS;AAAA,UAC9C;AAAA,UACA,QAAQ,YAAY,MAAM,eAAe,iBAAiB,MAAM,cAAc,QAAQ,MAAM,gBAAgB,UAAU,MAAM;AAAA,QAC9H;AAEA,YAAI,YAAY,SAAS,GAAG;AAC1B,gBAAM,KAAK,IAAI,mCAAmC;AAClD,qBAAW,KAAK,YAAY,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG;AAC7D,kBAAM,KAAK,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,UAAU;AAAA,UAC9C;AAAA,QACF;AAEA,YAAI,iBAAiB,SAAS,GAAG;AAC/B,gBAAM,KAAK,IAAI,2CAA2C;AAC1D,qBAAW,KAAK,iBAAiB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG;AAClE,kBAAM,KAAK,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,UAAU;AAAA,UAClD;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS,GAAG;AACtB,gBAAM,KAAK,IAAI,YAAY;AAC3B,qBAAW,KAAK,QAAQ,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,KAAK,CAAC,GAAG;AAC7E,kBAAM,OAAO,EAAE,QAAQ,IAAI,MAAM;AACjC,kBAAM,KAAK,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,WAAM,EAAE,KAAK,KAAK,IAAI,GAAG,EAAE,KAAK,GAAG;AAAA,UACxE;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA;AAAA,MAIA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,eAAe;AAAA,UACzE,sBAAuB,OAAe,4BAA4B;AAAA,QACpE,CAAC;AACD,aAAK,WAAW;AAEhB,cAAM,SAAS,KAAK,UAAoB;AACxC,cAAM,aAAa,KAAK,cAAwB;AAChD,YAAI,CAAC,OAAQ,QAAO;AAEpB,YAAI,OAAO,sBAAsB,SAAS;AACxC,eAAK,YAAY,QAAQ,UAAU;AACnC,gBAAM,QAAQ,KAAK,cAAc;AACjC,iBAAO,WAAW,UAAU,sCAAsC,KAAK;AAAA,QACzE;AAEA,cAAM,SAAS,KAAK,gBAAgB,QAAQ,UAAU;AACtD,eAAO;AAAA,EAAuB,MAAM;AAAA;AAAA;AAAA,MACtC;AAAA,MAEA,KAAK,6BAA6B;AAChC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,eAAe;AAAA,UACzE,sBAAuB,OAAe,4BAA4B;AAAA,QACpE,CAAC;AACD,aAAK,WAAW;AAEhB,cAAM,OAAO,KAAK,QAAkB;AACpC,YAAI,CAAC,KAAM,QAAO;AAElB,cAAM,SAAS,KAAK,UAAU,IAAI;AAClC,cAAM,QAAkB,CAAC,0BAAqB;AAC9C,YAAI,OAAO,QAAQ,OAAQ,OAAM,KAAK,cAAc,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAC/E,YAAI,OAAO,QAAQ,OAAQ,OAAM,KAAK,cAAc,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAC/E,YAAI,OAAO,kBAAkB,OAAQ,OAAM,KAAK,8BAA8B,OAAO,kBAAkB,KAAK,IAAI,CAAC,EAAE;AACnH,YAAI,OAAO,iBAAiB,QAAQ;AAClC,gBAAM,KAAK,+BAA0B,OAAO,iBAAiB,MAAM,IAAI;AACvE,qBAAW,KAAK,OAAO,kBAAkB;AACvC,kBAAM,KAAK,OAAO,EAAE,IAAI,QAAK,EAAE,OAAO,MAAM,EAAE,QAAQ,SAAS,EAAE,QAAQ,cAAc,EAAE,MAAM,GAAG;AAAA,UACpG;AAAA,QACF;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,aAAa;AACzE,aAAK,WAAW;AAEhB,cAAM,QAAQ,KAAK,SAAmB;AACtC,YAAI,CAAC,MAAO,QAAO;AACnB,cAAM,QAAQ,KAAK,IAAI,OAAO,KAAK,SAAS,CAAC,GAAG,EAAE;AAElD,cAAM,UAAU,KAAK,OAAO,OAAO,KAAK;AACxC,YAAI,QAAQ,WAAW,EAAG,QAAO,4BAA4B,KAAK;AAElE,cAAM,QAAQ,CAAC,gBAAgB,KAAK,IAAI,EAAE;AAC1C,mBAAW,EAAE,MAAM,MAAM,KAAK,SAAS;AACrC,gBAAM,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,aAAa,MAAM,QAAQ,CAAC,CAAC,GAAG;AAEvE,gBAAM,UAAU,KAAK,QAAQ,MAAM,IAAI,EAAE,KAAK,OAAK,EAAE,KAAK,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AACjF,cAAI,QAAS,OAAM,KAAK,KAAK,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE;AAC3D,gBAAM,KAAK,EAAE;AAAA,QACf;AACA,eAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,MAC/B;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,aAAa;AACzE,aAAK,WAAW;AAEhB,cAAM,OAAO,KAAK,QAAkB;AACpC,YAAI,CAAC,KAAM,QAAO;AAElB,cAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,YAAI,CAAC,KAAM,QAAO,cAAc,IAAI;AAEpC,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,aAAa;AACzE,aAAK,WAAW;AAEhB,cAAM,SAAS,KAAK,KAAK;AACzB,YAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,cAAM,QAAQ,CAAC,oBAAe,OAAO,MAAM,aAAa,EAAE;AAC1D,mBAAW,SAAS,QAAQ;AAC1B,gBAAM,OAAO,MAAM,SAAS,kBAAkB,WAAM,MAAM,SAAS,WAAW,WAAM,MAAM,SAAS,gBAAgB,cAAO;AAC1H,gBAAM,KAAK,GAAG,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE;AAClD,gBAAM,KAAK,KAAK,MAAM,MAAM,EAAE;AAC9B,gBAAM,KAAK,EAAE;AAAA,QACf;AACA,eAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,MAC/B;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,GAAG,eAAe;AACtC,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,aAAa;AACzE,aAAK,WAAW;AAEhB,cAAM,QAAQ,KAAK,UAAU;AAC7B,YAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,cAAM,QAAQ,KAAK,SAAS;AAC5B,cAAM,QAAQ;AAAA,UACZ,eAAU,MAAM,SAAS,aAAa,MAAM,YAAY;AAAA,UACxD;AAAA,QACF;AACA,mBAAW,QAAQ,OAAO;AACxB,gBAAM,OAAO,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC/D,gBAAM,KAAK,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC,IAAI,KAAK,KAAK,MAAM,KAAK,WAAW,SAAS,IAAI,GAAG;AAAA,QAC1F;AACA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,MAEA,KAAK,6BAA6B;AAChC,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAC/B,YAAI,OAAO,sBAAsB,QAAS,QAAO;AAEjD,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,eAAe;AAAA,UACzE,sBAAuB,OAAe,4BAA4B;AAAA,QACpE,CAAC;AACD,aAAK,WAAW;AAEhB,cAAM,aAAa,KAAK,cAAc;AACtC,YAAI,eAAe,EAAG,QAAO;AAE7B,cAAM,SAAS,MAAM,KAAK,WAAW,OAAO,gBAAgB,IAAI;AAChE,cAAM,aAAa,CAAC,4CAAuC,OAAO,SAAS,aAAa;AACxF,YAAI,OAAO,QAAQ,OAAQ,YAAW,KAAK,YAAY,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAClF,YAAI,OAAO,QAAQ,OAAQ,YAAW,KAAK,YAAY,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAClF,YAAI,OAAO,OAAO,OAAQ,YAAW,KAAK,WAAW,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAC/E,eAAO,WAAW,KAAK,IAAI;AAAA,MAC7B;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,eAAe;AAAA,UACzE,sBAAuB,OAAe,4BAA4B;AAAA,QACpE,CAAC;AACD,aAAK,SAAS;AACd,eAAO;AAAA,MACT;AAAA,MAEA,KAAK,0BAA0B;AAC7B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,aAAa;AACzE,aAAK,WAAW;AAEhB,cAAM,QAAQ,KAAK,QAAQ;AAC3B,eAAO,aAAa,KAAK;AAAA,MAC3B;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,cAAc,CAAC;AACjF,cAAM,cAAc,KAAK,eAAyB,GAAG,eAAe;AACpE,cAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,YAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,cAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kBAAkB,CAAC;AACxF,cAAM,KAAK,GAAG,YAAY;AAC1B,WAAG,gBAAgB;AACnB,cAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc,aAAa;AACzE,aAAK,WAAW;AAEhB,cAAM,QAAQ,KAAK,SAAS;AAC5B,cAAM,SAAS,MAAM,aAAa,IAAI,KAAK,MAAM,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AAC1F,cAAM,SAAS,MAAM,aAAa,IAAI,KAAK,MAAM,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AAC1F,eAAO;AAAA,UACL;AAAA,UACA,oBAAoB,MAAM,SAAS;AAAA,UACnC,oBAAoB,MAAM,YAAY;AAAA,UACtC,oBAAoB,MAAM;AAAA,UAC1B,oBAAoB,MAAM;AAAA,UAC1B;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,MAEA;AACE,eAAO,iBAAiB,QAAQ;AAAA,IACpC;AAAA,EACF;AACF;",
6
- "names": ["KiroGraph", "estimateTokens", "cg", "result", "compress", "renderTree", "flattenTree", "groupTree", "lines", "compactTree", "denyCount", "warnCount"]
4
+ "sourcesContent": ["/**\n * KiroGraph MCP Tool Definitions\n * Handler logic has been moved to src/mcp/handler.ts and src/mcp/handlers/*.ts\n */\n\nexport { KIROGRAPH_TOOL_NAMES } from './tool-names';\nexport { ToolHandler } from './handler';\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, { type: string; description?: string; enum?: string[]; default?: unknown; items?: unknown; properties?: unknown }>;\n required?: string[];\n };\n annotations?: Record<string, unknown>;\n}\n\nexport const tools: ToolDefinition[] = [\n {\n name: 'kirograph_search',\n description: 'Quick symbol search by name. Returns locations only (no code). Use kirograph_context for comprehensive task context.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Symbol name or partial name (e.g., \"auth\", \"signIn\", \"UserService\")' },\n mode: {\n type: 'string',\n description: 'Search mode: \"name\" (default, FTS prefix match) or \"similar\" (fuzzy substring match, broader results)',\n enum: ['name', 'similar'],\n default: 'name',\n },\n kind: {\n type: 'string',\n description: 'Filter by node kind',\n enum: ['function', 'method', 'class', 'interface', 'type_alias', 'variable', 'route', 'component'],\n },\n limit: { type: 'number', description: 'Max results 1-100 (default: 10)', default: 10 },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_context',\n description: 'Build comprehensive context for a task or feature request.',\n inputSchema: {\n type: 'object',\n properties: {\n task: { type: 'string', description: 'Task description or feature name' },\n maxNodes: { type: 'number', description: 'Max symbols to include', default: 20 },\n includeCode: { type: 'boolean', description: 'Include code snippets. Deprecated \u2014 prefer detail.', default: true },\n detail: {\n type: 'string',\n description: 'Code verbosity: full, signatures, or summary',\n enum: ['full', 'signatures', 'summary'],\n default: 'full',\n },\n projectPath: { type: 'string' },\n },\n required: ['task'],\n },\n },\n {\n name: 'kirograph_callers',\n description: 'Find all functions/methods that call a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find callers for' },\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_callees',\n description: 'Find all functions/methods that a specific symbol calls.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find callees for' },\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_impact',\n description: 'Analyze what code would be affected by changing a symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to analyze impact for' },\n depth: { type: 'number', description: 'Traversal depth (default: 2)', default: 2 },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_node',\n description: 'Get details about a specific symbol.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name or fully-qualified name to look up' },\n qualified: { type: 'boolean', description: 'When true, treat symbol as a fully-qualified name (exact match, bypasses FTS \u2014 use when you have the exact qualifiedName from a previous result)', default: false },\n includeCode: { type: 'boolean', description: 'Include full source code. Deprecated \u2014 prefer detail.', default: false },\n detail: {\n type: 'string',\n description: 'Output level: summary, signatures, or full',\n enum: ['summary', 'signatures', 'full'],\n default: 'summary',\n },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_status',\n description: 'Check index health and statistics.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_files',\n description: 'List indexed file structure with optional filtering.',\n inputSchema: {\n type: 'object',\n properties: {\n filterPath: { type: 'string', description: 'Filter by directory path prefix (e.g., \"src/\")' },\n pattern: { type: 'string', description: 'Filter by glob pattern (e.g., \"**/*.ts\")' },\n maxDepth: { type: 'number', description: 'Max directory depth to traverse' },\n format: {\n type: 'string',\n description: 'Output format: \"tree\" (default, visual tree), \"flat\" (one path per line), \"grouped\" (grouped by directory), \"compact\" (rtk-style summary with counts)',\n enum: ['tree', 'flat', 'grouped', 'compact'],\n default: 'tree',\n },\n includeMetadata: { type: 'boolean', description: 'Include language and symbol count', default: true },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_dead_code',\n description: 'Find symbols with no incoming references (potential dead code). Only includes unexported symbols.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 50)', default: 50 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_circular_deps',\n description: 'Find circular import dependencies in the codebase.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_path',\n description: 'Find the shortest path between two symbols in the graph.',\n inputSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source symbol name' },\n to: { type: 'string', description: 'Target symbol name' },\n projectPath: { type: 'string' },\n },\n required: ['from', 'to'],\n },\n },\n {\n name: 'kirograph_architecture',\n description: 'Show high-level architecture: packages, layers, dependencies.',\n inputSchema: {\n type: 'object',\n properties: {\n level: {\n type: 'string',\n description: 'packages, layers, or both',\n enum: ['packages', 'layers', 'both'],\n default: 'both',\n },\n includeFiles: { type: 'boolean', description: 'Include per-file package/layer assignments', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_coupling',\n description: 'Package coupling metrics: Ca, Ce, and instability (Ce/(Ca+Ce)).',\n inputSchema: {\n type: 'object',\n properties: {\n sortBy: {\n type: 'string',\n description: 'Sort by instability, ca, ce, or name',\n enum: ['instability', 'afferent', 'efferent'],\n default: 'instability',\n },\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_package',\n description: 'Drill into a package: files, exports, and dependencies.',\n inputSchema: {\n type: 'object',\n properties: {\n package: { type: 'string', description: 'Package name or path (partial match accepted)' },\n includeFiles: { type: 'boolean', description: 'List files in the package (default: true)', default: true },\n projectPath: { type: 'string' },\n },\n required: ['package'],\n },\n },\n {\n name: 'kirograph_manifest',\n description: 'Workspace manifest summary: list all packages across ecosystems with versions, external dep counts, and license. Pass package= to drill into one package. Pass ecosystem= to filter (npm, cargo, go, python, maven, gradle, csproj). Pass showDrift=true to surface packages that appear in multiple manifest files with differing versions.',\n inputSchema: {\n type: 'object',\n properties: {\n package: { type: 'string', description: 'Package name or path for a focused view (partial match accepted)' },\n ecosystem: { type: 'string', description: 'Filter by ecosystem / language (e.g. \"npm\", \"cargo\", \"go\", \"python\")' },\n showDrift: { type: 'boolean', description: 'Highlight packages declared in multiple manifests with different versions (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_hotspots',\n description: 'Find the most-connected symbols in the codebase by total edge degree (incoming + outgoing). Useful for identifying load-bearing code, core abstractions, or blast-radius hot zones.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_surprising',\n description: 'Find non-obvious cross-file connections: direct edges between symbols in structurally distant parts of the codebase. High-score pairs indicate unexpected coupling worth investigating.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results 1-100 (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_diff',\n description: 'Compare current graph against a saved snapshot.',\n inputSchema: {\n type: 'object',\n properties: {\n snapshot: { type: 'string', description: 'Snapshot label; omit for latest' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_snapshot_save',\n description: 'Save a snapshot of the current graph state. Snapshots can be compared with kirograph_diff to track structural changes over time.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Label for the snapshot (default: timestamp-based label)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_snapshot_list',\n description: 'List all saved graph snapshots with their labels, timestamps, and symbol/edge counts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_type_hierarchy',\n description: 'Traverse base and derived types of a class or interface.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Class or interface name' },\n direction: {\n type: 'string',\n description: 'up=base, down=derived, both=all',\n enum: ['up', 'down', 'both'],\n default: 'both',\n },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_module_api',\n description: 'List all exported symbols in a file or directory \u2014 the public API surface.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path (e.g. \"src/auth/service.ts\") or directory prefix (e.g. \"src/auth/\"). Omit for the whole project.' },\n limit: { type: 'number', description: 'Max results (default: 100)', default: 100 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_rename_preview',\n description: 'Show every reference site for a symbol \u2014 blast-radius preview before a rename.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find all references for' },\n projectPath: { type: 'string' },\n },\n required: ['symbol'],\n },\n },\n {\n name: 'kirograph_doc_coverage',\n description: 'Find exported symbols that are missing docstrings.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 50)', default: 50 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_god_class',\n description: 'List classes ranked by member count to identify god classes.',\n inputSchema: {\n type: 'object',\n properties: {\n threshold: { type: 'number', description: 'Member count threshold for flagging (default: 10)', default: 10 },\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_inheritance_depth',\n description: 'Show the deepest inheritance chains (BFS on extends/implements edges).',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_recursion',\n description: 'Find recursive and mutually-recursive functions (SCC on call edges).',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 30)', default: 30 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_largest',\n description: 'List symbols ranked by lines of code (end_line \u2212 start_line).',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 30)', default: 30 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_rank',\n description: 'Rank symbols by fan-in (callers) or fan-out (callees) edge count.',\n inputSchema: {\n type: 'object',\n properties: {\n by: { type: 'string', description: 'Ranking dimension: \"fan-in\" (default) or \"fan-out\"', enum: ['fan-in', 'fan-out'], default: 'fan-in' },\n limit: { type: 'number', description: 'Max results (default: 30)', default: 30 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_distribution',\n description: 'Symbol-kind breakdown (function, class, method\u2026) for a file, directory, or the whole project.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Directory or file path prefix to scope. Omit for whole project.' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_annotations',\n description: 'Decorator/annotation histogram for the whole project, or list of symbols using a specific decorator.',\n inputSchema: {\n type: 'object',\n properties: {\n decorator: { type: 'string', description: 'Decorator name to filter (e.g. \"Injectable\"). Omit for full histogram.' },\n limit: { type: 'number', description: 'Max results (default: 50)', default: 50 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_session_start',\n description: 'Save the current graph metrics as a session baseline.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_session_end',\n description: 'Diff current graph metrics against the session baseline and report per-dimension deltas.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_unused_imports',\n description: 'Find import nodes with zero resolved downstream edges (i.e. nothing in the codebase references the imported symbol).',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 50)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_gini',\n description: 'Compute the Gini inequality coefficient for a size metric (loc, fan-in, or fan-out) across all function/method nodes. Returns the coefficient plus top/bottom 5.',\n inputSchema: {\n type: 'object',\n properties: {\n metric: {\n type: 'string',\n description: 'Metric to measure: \"loc\" (lines of code), \"fan-in\" (incoming calls), \"fan-out\" (outgoing calls)',\n enum: ['loc', 'fan-in', 'fan-out'],\n default: 'loc',\n },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_dependency_depth',\n description: 'Run a Kahn topological sort on the file import graph and report each file\\'s longest path from a root (depth). Useful for spotting deeply layered dependency chains.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max files to show sorted by depth DESC (default: 20)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_exec',\n description: 'Run a shell command with token-optimized, noise-filtered output.',\n inputSchema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Shell command to execute' },\n cwd: { type: 'string', description: 'Working directory' },\n level: {\n type: 'string',\n description: 'Compression level: \"normal\" (balanced), \"aggressive\" (more compact), \"ultra\" (maximum compression)',\n enum: ['normal', 'aggressive', 'ultra'],\n default: 'normal',\n },\n timeout: { type: 'number', description: 'Timeout in seconds', default: 60 },\n projectPath: { type: 'string' },\n },\n required: ['command'],\n },\n },\n {\n name: 'kirograph_gain',\n description: 'Show token savings from graph tools and shell compression.',\n inputSchema: {\n type: 'object',\n properties: {\n period: {\n type: 'string',\n description: 'Time window: session, hour, day, week, all',\n enum: ['session', 'today', 'week', 'all'],\n default: 'session',\n },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_read',\n description: 'Read a file with caching; unchanged files return cache marker.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path to read (absolute or relative to project root)' },\n mode: {\n type: 'string',\n description: 'Read mode: \"full\" (default), \"map\" (structure overview), \"signatures\" (function signatures), \"diff\" (changes since last read), \"lines\" (line range), \"imports\", \"exports\"',\n enum: ['full', 'map', 'signatures', 'diff', 'lines', 'imports', 'exports'],\n default: 'full',\n },\n start: { type: 'number', description: 'Start line (for lines mode)' },\n end: { type: 'number', description: 'End line (for lines mode)' },\n noCache: { type: 'boolean', description: 'Force fresh read, bypass cache', default: false },\n projectPath: { type: 'string' },\n },\n required: ['path'],\n },\n },\n {\n name: 'kirograph_retrieve',\n description: 'Retrieve cached file content by path (CCR \u2014 Cached Content Retrieval). Returns the full content stored in the session cache, or reads and caches the file if not yet seen. Use after kirograph_read returns a \"[cached: file unchanged]\" marker to get the actual content without a redundant filesystem read.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path to retrieve (absolute or relative to project root)' },\n projectPath: { type: 'string' },\n },\n required: ['path'],\n },\n },\n {\n name: 'kirograph_compress',\n description: 'Compress text via rtk shell filters or caveman grammar engine.',\n inputSchema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Text to compress' },\n command: { type: 'string', description: 'Shell command text came from (selects rtk engine)' },\n level: {\n type: 'string',\n description: 'Compression intensity: \"lite\" / \"normal\" (light), \"full\" / \"aggressive\" (default), \"ultra\" (maximum)',\n enum: ['lite', 'normal', 'full', 'aggressive', 'ultra'],\n default: 'full',\n },\n },\n required: ['text'],\n },\n },\n {\n name: 'kirograph_budget',\n description: 'Show session context budget: tokens used, remaining, utilization.',\n inputSchema: {\n type: 'object',\n properties: {\n reset: { type: 'boolean', description: 'Reset session budget counters', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_flows',\n description: 'Trace execution flows from entry points through the call graph.',\n inputSchema: {\n type: 'object',\n properties: {\n entryPoint: { type: 'string', description: 'Symbol to trace; omit to auto-detect' },\n maxFlows: { type: 'number', description: 'Max number of flows to return (default 10)' },\n maxDepth: { type: 'number', description: 'Max call chain depth (default 10)' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_communities',\n description: 'Detect clusters of related symbols via graph community detection.',\n inputSchema: {\n type: 'object',\n properties: {\n resolution: { type: 'number', description: 'Granularity 0.1\u20132.0; higher=more smaller clusters' },\n limit: { type: 'number', description: 'Max communities to return (default 15)' },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Complexity tools (require enableComplexity=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_complexity',\n description: 'Rank symbols by cyclomatic complexity, cognitive complexity, or maintainability index. Requires enableComplexity: true and a re-index.',\n inputSchema: {\n type: 'object',\n properties: {\n metric: { type: 'string', description: 'Ranking metric: \"cyclomatic\" (default), \"cognitive\", or \"maintainability\"', enum: ['cyclomatic', 'cognitive', 'maintainability'], default: 'cyclomatic' },\n threshold: { type: 'number', description: 'Flag symbols above (CC/cog) or below (MI) this threshold' },\n limit: { type: 'number', description: 'Max results (default: 30)', default: 30 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_simplify_scan',\n description: 'Find functions/methods that exceed complexity, size, or maintainability thresholds \u2014 simplification candidates.',\n inputSchema: {\n type: 'object',\n properties: {\n thresholdCC: { type: 'number', description: 'Cyclomatic complexity threshold (default: 10)', default: 10 },\n thresholdMI: { type: 'number', description: 'Maintainability index lower bound \u2014 flag below this (default: 50)', default: 50 },\n thresholdLOC: { type: 'number', description: 'Lines of code threshold (default: 50)', default: 50 },\n limit: { type: 'number', description: 'Max results (default: 30)', default: 30 },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Git context tools (require enableGitContext=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_diff_context',\n description: 'Identify symbols changed in the working tree (or staged), with their callers and callees for immediate blast-radius context.',\n inputSchema: {\n type: 'object',\n properties: {\n staged: { type: 'boolean', description: 'If true, show staged changes (git diff --cached) instead of unstaged', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_commit_context',\n description: 'Structured summary of staged changes \u2014 affected symbols, diff stat, staged files. Use to craft precise commit messages.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_pr_context',\n description: 'Semantic diff between two git refs \u2014 changed symbols with callers/callees. Use to write PR descriptions.',\n inputSchema: {\n type: 'object',\n properties: {\n base: { type: 'string', description: 'Base ref (branch name, tag, or commit hash)' },\n head: { type: 'string', description: 'Head ref (default: HEAD)', default: 'HEAD' },\n projectPath: { type: 'string' },\n },\n required: ['base'],\n },\n },\n {\n name: 'kirograph_changelog',\n description: 'Human-readable semantic changelog between two git refs: commit log + affected symbols.',\n inputSchema: {\n type: 'object',\n properties: {\n ref1: { type: 'string', description: 'Start ref (older)' },\n ref2: { type: 'string', description: 'End ref (default: HEAD)', default: 'HEAD' },\n projectPath: { type: 'string' },\n },\n required: ['ref1'],\n },\n },\n {\n name: 'kirograph_test_map',\n description: 'Find test files covering a symbol, or list exported symbols with no test coverage.',\n inputSchema: {\n type: 'object',\n properties: {\n symbol: { type: 'string', description: 'Symbol name to find tests for. Omit to list all uncovered exported symbols.' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_refactor',\n description: 'Rename preview (all references) or function summarization.',\n inputSchema: {\n type: 'object',\n properties: {\n mode: { type: 'string', description: 'rename=preview references, summarize=summary', enum: ['rename', 'suggest'] },\n symbol: { type: 'string', description: 'Symbol name (required for rename mode)' },\n limit: { type: 'number', description: 'Max results (default 10)' },\n projectPath: { type: 'string' },\n },\n required: ['mode'],\n },\n },\n // \u2500\u2500 Edit primitives (require enableEditPrimitives=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_str_replace',\n description: 'Replace a unique string anchor in a file; fails if the anchor appears 0 or >1 times.',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'File path relative to project root' },\n old_str: { type: 'string', description: 'Exact string to find (must be unique in the file)' },\n new_str: { type: 'string', description: 'Replacement string' },\n projectPath: { type: 'string' },\n },\n required: ['file', 'old_str', 'new_str'],\n },\n },\n {\n name: 'kirograph_multi_str_replace',\n description: 'Apply N replacements as an all-or-nothing transaction; aborts if any anchor is ambiguous or missing.',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'File path relative to project root' },\n pairs: {\n type: 'array',\n description: 'Array of {old_str, new_str} replacement pairs applied in order',\n items: {\n type: 'object',\n properties: {\n old_str: { type: 'string', description: 'Exact string to find (must be unique)' },\n new_str: { type: 'string', description: 'Replacement string' },\n },\n },\n },\n projectPath: { type: 'string' },\n },\n required: ['file', 'pairs'],\n },\n },\n {\n name: 'kirograph_insert_at',\n description: 'Insert content before or after a unique anchor string or line number.',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'File path relative to project root' },\n anchor: { type: 'string', description: 'Unique string anchor to insert relative to (mutually exclusive with line)' },\n line: { type: 'number', description: '1-based line number to insert relative to (mutually exclusive with anchor)' },\n content: { type: 'string', description: 'Content to insert (include newline if needed)' },\n position: { type: 'string', description: '\"before\" or \"after\" the anchor/line (default: \"after\")', enum: ['before', 'after'], default: 'after' },\n projectPath: { type: 'string' },\n },\n required: ['file', 'content'],\n },\n },\n {\n name: 'kirograph_ast_grep_rewrite',\n description: 'Structural AST rewrite via ast-grep. Skipped if ast-grep is not installed.',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'File path relative to project root' },\n pattern: { type: 'string', description: 'ast-grep pattern to match' },\n rewrite: { type: 'string', description: 'ast-grep rewrite template' },\n projectPath: { type: 'string' },\n },\n required: ['file', 'pattern', 'rewrite'],\n },\n },\n // \u2500\u2500 Memory tools (require enableMemory=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_mem_search',\n description: 'Search project memory for decisions, errors, patterns, context.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Natural language search query' },\n kind: {\n type: 'string',\n description: 'Filter by observation kind',\n enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'],\n },\n limit: { type: 'number', description: 'Max results (default: 10)', default: 10 },\n sessionId: { type: 'string', description: 'Filter to specific session' },\n asOf: { type: 'number', description: 'Query facts valid at this timestamp (epoch ms). Filters out expired/superseded observations.' },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_mem_store',\n description: 'Store an observation in project memory.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Observation text' },\n kind: {\n type: 'string',\n description: 'Observation kind',\n enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'],\n default: 'note',\n },\n projectPath: { type: 'string' },\n topicKey: { type: 'string', description: \"Stable semantic key for this observation (e.g. 'architecture/auth-model'). Enables addressing by concept.\" },\n reviewAfter: { type: 'number', description: 'ISO date to flag for review' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_timeline',\n description: 'List recent sessions and their observations chronologically.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Number of sessions to show', default: 5 },\n sessionId: { type: 'string', description: 'Show observations for a specific session' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_status',\n description: 'Memory subsystem health: sessions, observations, embeddings, size.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Engram-parity mem tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_mem_review',\n description: 'List observations past their review_after date.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_mark_reviewed',\n description: 'Clear review_after date on an observation.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Observation ID' },\n projectPath: { type: 'string' },\n },\n required: ['id'],\n },\n },\n {\n name: 'kirograph_mem_compare',\n description: 'Establish a typed relation between two observations (supersedes, conflicts_with, compatible, scoped, related, not_conflict). Accepts observation IDs or topic_key values.',\n inputSchema: {\n type: 'object',\n properties: {\n observationA: { type: 'string', description: 'First observation ID or topic_key' },\n observationB: { type: 'string', description: 'Second observation ID or topic_key' },\n relation: { type: 'string', enum: ['supersedes', 'conflicts_with', 'compatible', 'scoped', 'related', 'not_conflict'], description: 'Relation type' },\n confidence: { type: 'number', description: 'Confidence 0.0\u20131.0 (default: 1.0)' },\n reason: { type: 'string', description: 'Explanation of the relation' },\n evidence: { type: 'string', description: 'Supporting evidence text' },\n projectPath: { type: 'string' },\n },\n required: ['observationA', 'observationB', 'relation'],\n },\n },\n {\n name: 'kirograph_mem_judge',\n description: 'Finalize a pending conflict relation \u2014 confirm, revise, or dismiss it.',\n inputSchema: {\n type: 'object',\n properties: {\n relationId: { type: 'string', description: 'Relation ID (from kirograph_mem_compare or kirograph_mem_search)' },\n relation: { type: 'string', enum: ['supersedes', 'conflicts_with', 'compatible', 'scoped', 'related', 'not_conflict'], description: 'Final relation type' },\n confidence: { type: 'number', description: 'Final confidence 0.0\u20131.0' },\n reason: { type: 'string', description: 'Reasoning' },\n evidence: { type: 'string', description: 'Supporting evidence' },\n projectPath: { type: 'string' },\n },\n required: ['relationId', 'relation', 'confidence'],\n },\n },\n {\n name: 'kirograph_mem_capture',\n description: 'Extract and store structured learnings from freeform text.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Text block with structured sections' },\n projectPath: { type: 'string' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_save_prompt',\n description: 'Save the current user prompt to session memory.',\n inputSchema: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'The user prompt text to save' },\n projectPath: { type: 'string' },\n },\n required: ['content'],\n },\n },\n {\n name: 'kirograph_mem_suggest_topic_key',\n description: 'Suggest a stable topic_key slug for an observation.',\n inputSchema: {\n type: 'object',\n properties: {\n kind: { type: 'string', enum: ['decision', 'error', 'pattern', 'architecture', 'summary', 'note'], description: 'Observation kind' },\n title: { type: 'string', description: 'Short description of the observation' },\n projectPath: { type: 'string' },\n },\n required: ['kind', 'title'],\n },\n },\n {\n name: 'kirograph_mem_conflicts_scan',\n description: 'Scan recent observations for potential conflicts using FTS.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max observations to scan (default: 50)', default: 50 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_prune',\n description: 'Remove memory observations older than a given duration.',\n inputSchema: {\n type: 'object',\n properties: {\n olderThan: { type: 'string', description: 'Duration threshold e.g. \"90d\" or \"6m\"', default: '90d' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_lint',\n description: 'Health check: stale links, model mismatch, orphaned sessions.',\n inputSchema: {\n type: 'object',\n properties: {\n fix: { type: 'boolean', description: 'Auto-remove stale links', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_conflicts_list',\n description: 'List pending conflict relations needing resolution.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_mem_conflicts_ignore',\n description: 'Dismiss a pending conflict relation as not relevant.',\n inputSchema: {\n type: 'object',\n properties: {\n relationId: { type: 'string', description: 'Relation ID to ignore (from kirograph_mem_conflicts_list)' },\n projectPath: { type: 'string' },\n },\n required: ['relationId'],\n },\n },\n // \u2500\u2500 Wiki tools (require enableWiki=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_wiki_ingest',\n description: 'Build ingest prompt for LLM to produce a WIKI_DIFF.',\n inputSchema: {\n type: 'object',\n properties: {\n source: { type: 'string', description: 'Source content to ingest (markdown, notes, ADR text, etc.)' },\n sourceName: { type: 'string', description: 'Name or path of the source', default: 'source' },\n projectPath: { type: 'string' },\n },\n required: ['source'],\n },\n },\n {\n name: 'kirograph_wiki_apply_diff',\n description: 'Apply a WIKI_DIFF to the wiki filesystem and SQLite index.',\n inputSchema: {\n type: 'object',\n properties: {\n diff: { type: 'string', description: 'WIKI_DIFF string with WIKI_DIFF_START/END blocks' },\n projectPath: { type: 'string' },\n },\n required: ['diff'],\n },\n },\n {\n name: 'kirograph_wiki_search',\n description: 'FTS over wiki pages; returns slugs, titles, previews.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', description: 'Max results (default: 5)', default: 5 },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_wiki_page',\n description: 'Retrieve full markdown of a wiki page by slug.',\n inputSchema: {\n type: 'object',\n properties: {\n slug: { type: 'string', description: 'Page slug (e.g. \"arch/auth-model\")' },\n projectPath: { type: 'string' },\n },\n required: ['slug'],\n },\n },\n {\n name: 'kirograph_wiki_lint',\n description: 'Check wiki for broken links, orphans, stale sources, contradictions.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_list',\n description: 'List all wiki pages with slug, title, source count, date.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_synthesize',\n description: 'Run local-model wiki synthesis: process the pending source queue (requires wikiSynthesisMode: \"local\").',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_init',\n description: 'Initialize the wiki: create SCHEMA.md and MANIFEST.md in .kirograph/wiki/.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_reindex',\n description: 'Rebuild the SQLite index from .kirograph/wiki/*.md files on disk.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_wiki_status',\n description: 'Show wiki subsystem stats: page count, total sources, oldest/newest page dates.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Docs tools (require enableDocs=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_docs_toc',\n description: 'Get TOC for a doc file or whole project (IDs, titles, levels, summaries).',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Filter to a specific doc file (relative path). Omit for project-wide TOC.' },\n tree: { type: 'boolean', description: 'Return nested tree structure.', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_docs_search',\n description: 'Search documentation sections by query, ranked by relevance.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query (natural language or keywords)' },\n file: { type: 'string', description: 'Limit search to a specific doc file.' },\n limit: { type: 'number', description: 'Max results (default: 10)', default: 10 },\n projectPath: { type: 'string' },\n },\n required: ['query'],\n },\n },\n {\n name: 'kirograph_docs_section',\n description: 'Retrieve full content of a doc section by its stable ID.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Section ID.' },\n context: { type: 'boolean', description: 'Include ancestor headings and child summaries.', default: false },\n projectPath: { type: 'string' },\n },\n required: ['id'],\n },\n },\n {\n name: 'kirograph_docs_outline',\n description: 'Get heading hierarchy for a single documentation file.',\n inputSchema: {\n type: 'object',\n properties: {\n file: { type: 'string', description: 'Documentation file path (relative to project root).' },\n projectPath: { type: 'string' },\n },\n required: ['file'],\n },\n },\n {\n name: 'kirograph_docs_refs',\n description: 'Bidirectional lookup: doc section\u2194code symbol references.',\n inputSchema: {\n type: 'object',\n properties: {\n sectionId: { type: 'string', description: 'Doc section ID to find referenced symbols.' },\n nodeId: { type: 'string', description: 'Code symbol ID to find referencing doc sections.' },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Data tools (require enableData=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_data_list',\n description: 'List all indexed datasets with row/column counts and file sizes.',\n inputSchema: { type: 'object', properties: { projectPath: { type: 'string' } } },\n },\n {\n name: 'kirograph_data_describe',\n description: 'Full schema profile: types, cardinality, null%, sample values.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n column: { type: 'string', description: 'Deep-dive on a single column.' },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_query',\n description: 'Filtered row retrieval with structured operators (max 500 rows).',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n filters: { type: 'array', description: 'Array of {column, op, value} filters. Ops: eq, neq, gt, gte, lt, lte, contains, in, is_null, between' },\n columns: { type: 'array', description: 'Column projection (only return these columns)' },\n limit: { type: 'number', description: 'Max rows (default: 100, hard cap: 500)', default: 100 },\n offset: { type: 'number', description: 'Pagination offset', default: 0 },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_aggregate',\n description: 'Server-side GROUP BY aggregation: count, sum, avg, min, max.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n groupBy: { type: 'array', description: 'Columns to group by' },\n metrics: { type: 'array', description: 'Array of {column, op} metrics. Ops: count, sum, avg, min, max, count_distinct' },\n filters: { type: 'array', description: 'Optional pre-filters (same format as kirograph_data_query)' },\n projectPath: { type: 'string' },\n },\n required: ['dataset', 'groupBy', 'metrics'],\n },\n },\n {\n name: 'kirograph_data_search',\n description: 'Search column names and sample values by keyword.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n query: { type: 'string', description: 'Search keyword' },\n projectPath: { type: 'string' },\n },\n required: ['dataset', 'query'],\n },\n },\n {\n name: 'kirograph_data_join',\n description: 'SQL JOIN across two indexed datasets.',\n inputSchema: {\n type: 'object',\n properties: {\n left: { type: 'string', description: 'Left dataset ID' },\n right: { type: 'string', description: 'Right dataset ID' },\n leftColumn: { type: 'string', description: 'Join column from left dataset' },\n rightColumn: { type: 'string', description: 'Join column from right dataset' },\n type: { type: 'string', description: 'Join type: inner (default), left, right', enum: ['inner', 'left', 'right'], default: 'inner' },\n columns: { type: 'array', description: 'Column projection (prefix with dataset ID)' },\n limit: { type: 'number', description: 'Max rows (default: 100, hard cap: 500)', default: 100 },\n projectPath: { type: 'string' },\n },\n required: ['left', 'right', 'leftColumn', 'rightColumn'],\n },\n },\n {\n name: 'kirograph_data_correlations',\n description: 'Pairwise Pearson correlations between numeric columns.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n threshold: { type: 'number', description: 'Min absolute correlation to include (default: 0.3)', default: 0.3 },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_quality',\n description: 'Rank columns by data quality risk: nulls, cardinality, type issues.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID' },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_drift',\n description: 'Schema drift between last two index runs: columns, types, row counts.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n {\n name: 'kirograph_data_history',\n description: 'History of schema snapshots: timestamps, row/column counts, hashes.',\n inputSchema: {\n type: 'object',\n properties: {\n dataset: { type: 'string', description: 'Dataset ID (from kirograph_data_list)' },\n limit: { type: 'number', description: 'Max snapshots to return (default: 10)', default: 10 },\n projectPath: { type: 'string' },\n },\n required: ['dataset'],\n },\n },\n // \u2500\u2500 Watchmen tools (require enableMemory=true + enableWatchmen=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_watchmen_status',\n description: 'Show watchmen status: pending observation count, synthesis threshold, and which brief files would be written on next synthesis.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_watchmen_synthesize',\n description: 'Run watchmen synthesis immediately using the local model (requires watchmenSynthesisMode: \"local\"). Processes pending observations into a workspace brief.',\n inputSchema: {\n type: 'object',\n properties: {\n force: { type: 'boolean', description: 'Run even if below threshold (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_watchmen_reset',\n description: 'Reset the watchmen synthesis counter by storing a summary observation, without running full synthesis.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Affected tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_affected',\n description: 'Find test files affected by a set of changed source files, by traversing the dependency graph.',\n inputSchema: {\n type: 'object',\n properties: {\n files: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of changed source file paths (relative to project root)',\n },\n depth: { type: 'number', description: 'Max dependency traversal depth (default: 5)', default: 5 },\n testPattern: { type: 'string', description: 'Custom glob to identify test files (optional)' },\n projectPath: { type: 'string' },\n },\n required: ['files'],\n },\n },\n // \u2500\u2500 Security tools (require enableSecurity=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_security',\n description: 'Security overview: vuln counts, verdicts, stale data warnings.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_vulns',\n description: 'List vulns with reachability verdicts, severity, affected components.',\n inputSchema: {\n type: 'object',\n properties: {\n severity: { type: 'string', description: 'Filter by severity level', enum: ['critical', 'high', 'medium', 'low'] },\n verdict: { type: 'string', description: 'Filter by reachability verdict', enum: ['affected', 'not_affected', 'under_investigation'] },\n limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },\n refresh: { type: 'boolean', description: 'Trigger fresh vulnerability enrichment before listing (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_vuln_add',\n description: 'Manually register a CVE against a dependency.',\n inputSchema: {\n type: 'object',\n properties: {\n cveId: { type: 'string', description: 'CVE identifier (e.g., \"CVE-2023-12345\")' },\n package: { type: 'string', description: 'Package name to associate the CVE with' },\n severity: { type: 'number', description: 'CVSS v3.1 base score (optional)' },\n summary: { type: 'string', description: 'Vulnerability summary (optional)' },\n fixedVersion: { type: 'string', description: 'Version that fixes the vulnerability (optional)' },\n projectPath: { type: 'string' },\n },\n required: ['cveId', 'package'],\n },\n },\n {\n name: 'kirograph_vuln_suppress',\n description: 'Suppress a CVE from vulnerability reports.',\n inputSchema: {\n type: 'object',\n properties: {\n cveId: { type: 'string', description: 'CVE identifier to suppress (e.g., \"CVE-2024-1234\")' },\n reason: { type: 'string', description: 'Reason for suppression (optional)' },\n expires: { type: 'string', description: 'Expiry date in ISO format after which the suppression is removed (e.g. \"2026-12-31\", optional)' },\n projectPath: { type: 'string' },\n },\n required: ['cveId'],\n },\n },\n {\n name: 'kirograph_sbom',\n description: 'Generate CycloneDX 1.5 SBOM JSON for the project.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_vex',\n description: 'Generate CycloneDX 1.5 VEX JSON with reachability verdicts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_reachability',\n description: 'Check reachability for a dependency or CVE.',\n inputSchema: {\n type: 'object',\n properties: {\n target: { type: 'string', description: 'Dependency name or CVE ID to check reachability for' },\n projectPath: { type: 'string' },\n },\n required: ['target'],\n },\n },\n {\n name: 'kirograph_staleness',\n description: 'Check dependency freshness against latest published versions.',\n inputSchema: {\n type: 'object',\n properties: {\n threshold: { type: 'number', description: 'Only return packages with staleness_score >= threshold (default: 0.3)', default: 0.3 },\n refresh: { type: 'boolean', description: 'Fetch latest version info from registries before listing (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_licenses',\n description: 'Show licenses and check against configured deny/warn policy.',\n inputSchema: {\n type: 'object',\n properties: {\n policy: { type: 'boolean', description: 'Return only policy violations (default: false)', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_attack_surface',\n description: 'Map HTTP routes to vulnerable deps with hop count and auth status.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max routes to return (default: 20)', default: 20 },\n publicOnly: { type: 'boolean', description: 'Only return public/unauthenticated routes', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_secrets',\n description: 'Scan for hardcoded secrets with call-graph blast radius.',\n inputSchema: {\n type: 'object',\n properties: {\n includeTests: { type: 'boolean', description: 'Include test files in scan', default: false },\n severity: { type: 'string', description: 'Filter by severity: critical, high, medium, low', enum: ['critical', 'high', 'medium', 'low'] },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_security_flows',\n description: 'SAST-lite: detect SQL injection, eval, deserialize, path, crypto flows.',\n inputSchema: {\n type: 'object',\n properties: {\n type: { type: 'string', description: 'Filter by type: sql, eval, deserialize, path, crypto, all', default: 'all' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_supply_chain',\n description: 'OpenSSF Scorecard scores, maintainer count, abandoned package detection.',\n inputSchema: {\n type: 'object',\n properties: {\n threshold: { type: 'string', description: 'Minimum risk level: critical, high, medium', enum: ['critical', 'high', 'medium'] },\n refresh: { type: 'boolean', description: 'Re-fetch from APIs', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_dep_confusion',\n description: 'Detect dependency confusion: internal names in public registries.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_remediation',\n description: 'Remediation SLA tracking: overdue vulns by severity thresholds.',\n inputSchema: {\n type: 'object',\n properties: {\n overdueOnly: { type: 'boolean', description: 'Show only overdue items', default: false },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Phase 3 complexity tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_health',\n description: 'Composite graph health score (0\u201310000) across complexity, dead code, coupling, and circular dependencies. Higher is better.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_dsm',\n description: 'Design Structure Matrix \u2014 dependency counts between top-level modules. Reveals architectural coupling and layering violations.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max module groups to include (default 15)', default: 15 },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_test_risk',\n description: 'Risk-ranked list of functions: complexity \u00D7 fan-in. Highest-risk functions are most likely to break when changed.',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default 20)', default: 20 },\n threshold: { type: 'number', description: 'Min risk score to include (default 0)', default: 0 },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Phase 3 git context tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_test_coverage',\n description: 'Parse lcov/Istanbul/Cobertura coverage files and show per-file coverage percentage. Sorted worst-first by default.',\n inputSchema: {\n type: 'object',\n properties: {\n sortBy: { type: 'string', description: 'Sort order: asc (worst first) or desc (best first)', enum: ['asc', 'desc'], default: 'asc' },\n limit: { type: 'number', description: 'Max results (default 30)', default: 30 },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Phase 4 branch tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_branch_list',\n description: 'List tracked branches with their DB sizes and last sync times.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_branch_diff',\n description: 'Symbols added, removed, or changed between two tracked branches.',\n inputSchema: {\n type: 'object',\n required: ['branchA'],\n properties: {\n branchA: { type: 'string', description: 'First branch name (required)' },\n branchB: { type: 'string', description: 'Second branch name (default: main)', default: 'main' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_branch_search',\n description: 'Search for symbols in a specific tracked branch graph.',\n inputSchema: {\n type: 'object',\n required: ['query', 'branch'],\n properties: {\n query: { type: 'string', description: 'Search query (symbol name, partial match)' },\n branch: { type: 'string', description: 'Branch name to search in' },\n limit: { type: 'number', description: 'Max results (default 20)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n },\n // \u2500\u2500 Pattern tools (require enablePatterns=true) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n name: 'kirograph_pattern_coverage',\n description: 'OWASP Top 10 coverage report: categories covered and match counts.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_pattern_save_baseline',\n description: 'Save current pattern match counts as a baseline.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Baseline label (default: \"default\")', default: 'default' },\n projectPath: { type: 'string' },\n },\n },\n },\n {\n name: 'kirograph_pattern_diff',\n description: 'Diff pattern matches against a saved baseline.',\n inputSchema: {\n type: 'object',\n properties: {\n label: { type: 'string', description: 'Baseline label (default: \"default\")', default: 'default' },\n projectPath: { type: 'string' },\n },\n },\n },\n];\n\n/**\n * Dynamic tool definition for kirograph_live_search.\n * NOT included in the static `tools` array \u2014 injected into tools/list at runtime\n * only when config.enablePatterns === true AND @ast-grep/napi is available.\n * NOT added to KIROGRAPH_TOOL_NAMES (which is a static list for Kiro autoApprove).\n */\nexport const LIVE_SEARCH_TOOL_DEFINITION: ToolDefinition = {\n name: 'kirograph_live_search',\n description:\n 'Run a live AST pattern search against the indexed file list using @ast-grep/napi. Finds structural code patterns (SQL injection, eval, path traversal, etc.) without needing the codebase to be re-indexed. Only available when enablePatterns: true.',\n inputSchema: {\n type: 'object' as const,\n required: ['pattern', 'language'],\n properties: {\n pattern: { type: 'string', description: 'ast-grep inline pattern (e.g. \"eval($X)\")' },\n language: { type: 'string', description: 'Language to search: javascript, typescript, python, go, rust, java, etc.' },\n limit: { type: 'number', description: 'Max results (default 20, max 100)', default: 20 },\n projectPath: { type: 'string' },\n },\n },\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
7
  }