agent-nuvira 3.3.7 → 3.3.9

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 (257) hide show
  1. package/README.md +57 -50
  2. package/dist/agents/agents/planner.d.ts.map +1 -1
  3. package/dist/agents/agents/planner.js +41 -0
  4. package/dist/agents/agents/planner.js.map +1 -1
  5. package/dist/agents/agents/reasoner.d.ts.map +1 -1
  6. package/dist/agents/agents/reasoner.js +6 -0
  7. package/dist/agents/agents/reasoner.js.map +1 -1
  8. package/dist/agents/agents/runner.d.ts +6 -0
  9. package/dist/agents/agents/runner.d.ts.map +1 -1
  10. package/dist/agents/agents/runner.js +82 -5
  11. package/dist/agents/agents/runner.js.map +1 -1
  12. package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
  13. package/dist/agents/agents/writer-tool-calling.js +5 -2
  14. package/dist/agents/agents/writer-tool-calling.js.map +1 -1
  15. package/dist/agents/agents/writer.d.ts.map +1 -1
  16. package/dist/agents/agents/writer.js +8 -4
  17. package/dist/agents/agents/writer.js.map +1 -1
  18. package/dist/agents/fanout-scheduler.d.ts +72 -0
  19. package/dist/agents/fanout-scheduler.d.ts.map +1 -0
  20. package/dist/agents/fanout-scheduler.js +100 -0
  21. package/dist/agents/fanout-scheduler.js.map +1 -0
  22. package/dist/agents/orchestrator.d.ts.map +1 -1
  23. package/dist/agents/orchestrator.js +30 -1
  24. package/dist/agents/orchestrator.js.map +1 -1
  25. package/dist/agents/plan-quality.d.ts +58 -0
  26. package/dist/agents/plan-quality.d.ts.map +1 -0
  27. package/dist/agents/plan-quality.js +152 -0
  28. package/dist/agents/plan-quality.js.map +1 -0
  29. package/dist/agents/prompt-assembly.d.ts +8 -0
  30. package/dist/agents/prompt-assembly.d.ts.map +1 -1
  31. package/dist/agents/prompt-assembly.js +18 -0
  32. package/dist/agents/prompt-assembly.js.map +1 -1
  33. package/dist/agents/step-handoff.d.ts +12 -2
  34. package/dist/agents/step-handoff.d.ts.map +1 -1
  35. package/dist/agents/step-handoff.js +65 -8
  36. package/dist/agents/step-handoff.js.map +1 -1
  37. package/dist/agents/tool-calling-agent.d.ts.map +1 -1
  38. package/dist/agents/tool-calling-agent.js +18 -0
  39. package/dist/agents/tool-calling-agent.js.map +1 -1
  40. package/dist/cli/cache.d.ts.map +1 -1
  41. package/dist/cli/cache.js +34 -4
  42. package/dist/cli/cache.js.map +1 -1
  43. package/dist/cli/chat.d.ts +6 -0
  44. package/dist/cli/chat.d.ts.map +1 -1
  45. package/dist/cli/chat.js +79 -18
  46. package/dist/cli/chat.js.map +1 -1
  47. package/dist/cli/cli-program.d.ts.map +1 -1
  48. package/dist/cli/cli-program.js +6 -0
  49. package/dist/cli/cli-program.js.map +1 -1
  50. package/dist/cli/config.d.ts +10 -0
  51. package/dist/cli/config.d.ts.map +1 -1
  52. package/dist/cli/config.js +179 -1
  53. package/dist/cli/config.js.map +1 -1
  54. package/dist/cli/continuity.d.ts +61 -0
  55. package/dist/cli/continuity.d.ts.map +1 -0
  56. package/dist/cli/continuity.js +112 -0
  57. package/dist/cli/continuity.js.map +1 -0
  58. package/dist/cli/dashboard.d.ts +3 -1
  59. package/dist/cli/dashboard.d.ts.map +1 -1
  60. package/dist/cli/dashboard.js +5 -16
  61. package/dist/cli/dashboard.js.map +1 -1
  62. package/dist/cli/doctor.d.ts.map +1 -1
  63. package/dist/cli/doctor.js +48 -1
  64. package/dist/cli/doctor.js.map +1 -1
  65. package/dist/cli/execute.d.ts +8 -0
  66. package/dist/cli/execute.d.ts.map +1 -1
  67. package/dist/cli/execute.js +34 -1
  68. package/dist/cli/execute.js.map +1 -1
  69. package/dist/cli/loop-executor.d.ts +24 -0
  70. package/dist/cli/loop-executor.d.ts.map +1 -1
  71. package/dist/cli/loop-executor.js +134 -13
  72. package/dist/cli/loop-executor.js.map +1 -1
  73. package/dist/cli/website.d.ts +25 -0
  74. package/dist/cli/website.d.ts.map +1 -0
  75. package/dist/cli/website.js +58 -0
  76. package/dist/cli/website.js.map +1 -0
  77. package/dist/config/manager.d.ts.map +1 -1
  78. package/dist/config/manager.js +35 -0
  79. package/dist/config/manager.js.map +1 -1
  80. package/dist/config/process-env.d.ts.map +1 -1
  81. package/dist/config/process-env.js +20 -0
  82. package/dist/config/process-env.js.map +1 -1
  83. package/dist/config/provider-env.d.ts +2 -1
  84. package/dist/config/provider-env.d.ts.map +1 -1
  85. package/dist/config/provider-env.js +19 -2
  86. package/dist/config/provider-env.js.map +1 -1
  87. package/dist/config/service-catalog.d.ts +81 -0
  88. package/dist/config/service-catalog.d.ts.map +1 -0
  89. package/dist/config/service-catalog.js +286 -0
  90. package/dist/config/service-catalog.js.map +1 -0
  91. package/dist/config/service-probe.d.ts +27 -0
  92. package/dist/config/service-probe.d.ts.map +1 -0
  93. package/dist/config/service-probe.js +104 -0
  94. package/dist/config/service-probe.js.map +1 -0
  95. package/dist/config/types.d.ts +63 -0
  96. package/dist/config/types.d.ts.map +1 -1
  97. package/dist/context/cache.d.ts +46 -2
  98. package/dist/context/cache.d.ts.map +1 -1
  99. package/dist/context/cache.js +85 -7
  100. package/dist/context/cache.js.map +1 -1
  101. package/dist/findings/verdicts.d.ts +59 -0
  102. package/dist/findings/verdicts.d.ts.map +1 -1
  103. package/dist/findings/verdicts.js +117 -0
  104. package/dist/findings/verdicts.js.map +1 -1
  105. package/dist/forwarded.d.ts +2 -0
  106. package/dist/forwarded.d.ts.map +1 -0
  107. package/dist/forwarded.js +2 -0
  108. package/dist/forwarded.js.map +1 -0
  109. package/dist/gateway/registry.d.ts.map +1 -1
  110. package/dist/gateway/registry.js +9 -0
  111. package/dist/gateway/registry.js.map +1 -1
  112. package/dist/learning/auto-router.d.ts +30 -0
  113. package/dist/learning/auto-router.d.ts.map +1 -1
  114. package/dist/learning/auto-router.js +69 -12
  115. package/dist/learning/auto-router.js.map +1 -1
  116. package/dist/learning/context-assembly.d.ts +37 -0
  117. package/dist/learning/context-assembly.d.ts.map +1 -0
  118. package/dist/learning/context-assembly.js +63 -0
  119. package/dist/learning/context-assembly.js.map +1 -0
  120. package/dist/learning/reasoning-trace.d.ts +26 -5
  121. package/dist/learning/reasoning-trace.d.ts.map +1 -1
  122. package/dist/learning/reasoning-trace.js +21 -1
  123. package/dist/learning/reasoning-trace.js.map +1 -1
  124. package/dist/learning/session-digest.d.ts +78 -0
  125. package/dist/learning/session-digest.d.ts.map +1 -0
  126. package/dist/learning/session-digest.js +185 -0
  127. package/dist/learning/session-digest.js.map +1 -0
  128. package/dist/learning/session-recall.d.ts +135 -0
  129. package/dist/learning/session-recall.d.ts.map +1 -0
  130. package/dist/learning/session-recall.js +305 -0
  131. package/dist/learning/session-recall.js.map +1 -0
  132. package/dist/learning/session-store.d.ts +172 -0
  133. package/dist/learning/session-store.d.ts.map +1 -0
  134. package/dist/learning/session-store.js +424 -0
  135. package/dist/learning/session-store.js.map +1 -0
  136. package/dist/learning/step-checkpoint.d.ts +28 -0
  137. package/dist/learning/step-checkpoint.d.ts.map +1 -1
  138. package/dist/learning/step-checkpoint.js +90 -6
  139. package/dist/learning/step-checkpoint.js.map +1 -1
  140. package/dist/learning/working-state.d.ts +19 -0
  141. package/dist/learning/working-state.d.ts.map +1 -1
  142. package/dist/learning/working-state.js +34 -1
  143. package/dist/learning/working-state.js.map +1 -1
  144. package/dist/parity/drivers.d.ts.map +1 -1
  145. package/dist/parity/drivers.js +29 -0
  146. package/dist/parity/drivers.js.map +1 -1
  147. package/dist/parity/wire-fixtures.d.ts +88 -0
  148. package/dist/parity/wire-fixtures.d.ts.map +1 -0
  149. package/dist/parity/wire-fixtures.js +405 -0
  150. package/dist/parity/wire-fixtures.js.map +1 -0
  151. package/dist/tools/artifact-append.d.ts +23 -0
  152. package/dist/tools/artifact-append.d.ts.map +1 -1
  153. package/dist/tools/artifact-append.js +28 -0
  154. package/dist/tools/artifact-append.js.map +1 -1
  155. package/dist/tools/ask-user.d.ts +5 -0
  156. package/dist/tools/ask-user.d.ts.map +1 -1
  157. package/dist/tools/ask-user.js +51 -5
  158. package/dist/tools/ask-user.js.map +1 -1
  159. package/dist/tools/child-agent-entry.js +1 -0
  160. package/dist/tools/child-agent-entry.js.map +1 -1
  161. package/dist/tools/child-agent-runtime.d.ts +7 -0
  162. package/dist/tools/child-agent-runtime.d.ts.map +1 -1
  163. package/dist/tools/child-agent-runtime.js +116 -6
  164. package/dist/tools/child-agent-runtime.js.map +1 -1
  165. package/dist/tools/child-agent-worker.d.ts +15 -0
  166. package/dist/tools/child-agent-worker.d.ts.map +1 -0
  167. package/dist/tools/child-agent-worker.js.map +1 -0
  168. package/dist/tools/coding-tools.d.ts.map +1 -1
  169. package/dist/tools/coding-tools.js +11 -0
  170. package/dist/tools/coding-tools.js.map +1 -1
  171. package/dist/tools/finding-tool.d.ts +6 -1
  172. package/dist/tools/finding-tool.d.ts.map +1 -1
  173. package/dist/tools/finding-tool.js +15 -2
  174. package/dist/tools/finding-tool.js.map +1 -1
  175. package/dist/tools/followup-utils.d.ts +35 -0
  176. package/dist/tools/followup-utils.d.ts.map +1 -1
  177. package/dist/tools/followup-utils.js +36 -0
  178. package/dist/tools/followup-utils.js.map +1 -1
  179. package/dist/tools/loop-project-context.d.ts +4 -1
  180. package/dist/tools/loop-project-context.d.ts.map +1 -1
  181. package/dist/tools/loop-project-context.js +48 -1
  182. package/dist/tools/loop-project-context.js.map +1 -1
  183. package/dist/tools/loop-skill-hint.d.ts.map +1 -1
  184. package/dist/tools/loop-skill-hint.js +7 -0
  185. package/dist/tools/loop-skill-hint.js.map +1 -1
  186. package/dist/tools/modality/image-gen.d.ts +25 -6
  187. package/dist/tools/modality/image-gen.d.ts.map +1 -1
  188. package/dist/tools/modality/image-gen.js +46 -27
  189. package/dist/tools/modality/image-gen.js.map +1 -1
  190. package/dist/tools/modality/image-providers.d.ts +71 -0
  191. package/dist/tools/modality/image-providers.d.ts.map +1 -0
  192. package/dist/tools/modality/image-providers.js +277 -0
  193. package/dist/tools/modality/image-providers.js.map +1 -0
  194. package/dist/tools/registry.d.ts +10 -1
  195. package/dist/tools/registry.d.ts.map +1 -1
  196. package/dist/tools/registry.js +35 -8
  197. package/dist/tools/registry.js.map +1 -1
  198. package/dist/tools/run-cli.d.ts.map +1 -1
  199. package/dist/tools/run-cli.js +39 -1
  200. package/dist/tools/run-cli.js.map +1 -1
  201. package/dist/tools/run-terminal.d.ts.map +1 -1
  202. package/dist/tools/run-terminal.js +50 -6
  203. package/dist/tools/run-terminal.js.map +1 -1
  204. package/dist/tools/subagent-spawner.d.ts +8 -0
  205. package/dist/tools/subagent-spawner.d.ts.map +1 -1
  206. package/dist/tools/subagent-spawner.js +3 -0
  207. package/dist/tools/subagent-spawner.js.map +1 -1
  208. package/dist/tools/tool-loop.d.ts +55 -0
  209. package/dist/tools/tool-loop.d.ts.map +1 -1
  210. package/dist/tools/tool-loop.js +136 -0
  211. package/dist/tools/tool-loop.js.map +1 -1
  212. package/dist/tools/untrusted-content.d.ts +29 -0
  213. package/dist/tools/untrusted-content.d.ts.map +1 -0
  214. package/dist/tools/untrusted-content.js +53 -0
  215. package/dist/tools/untrusted-content.js.map +1 -0
  216. package/dist/tools/web-research.d.ts +76 -14
  217. package/dist/tools/web-research.d.ts.map +1 -1
  218. package/dist/tools/web-research.js +280 -35
  219. package/dist/tools/web-research.js.map +1 -1
  220. package/dist/utils/effect-verification.d.ts +115 -0
  221. package/dist/utils/effect-verification.d.ts.map +1 -0
  222. package/dist/utils/effect-verification.js +337 -0
  223. package/dist/utils/effect-verification.js.map +1 -0
  224. package/dist/utils/open-url.d.ts +16 -0
  225. package/dist/utils/open-url.d.ts.map +1 -0
  226. package/dist/utils/open-url.js +32 -0
  227. package/dist/utils/open-url.js.map +1 -0
  228. package/dist/utils/project-env.d.ts +146 -0
  229. package/dist/utils/project-env.d.ts.map +1 -0
  230. package/dist/utils/project-env.js +584 -0
  231. package/dist/utils/project-env.js.map +1 -0
  232. package/dist/utils/shell.d.ts +7 -0
  233. package/dist/utils/shell.d.ts.map +1 -1
  234. package/dist/utils/shell.js +2 -0
  235. package/dist/utils/shell.js.map +1 -1
  236. package/dist/web-dashboard/chat-console.d.ts +2 -0
  237. package/dist/web-dashboard/chat-console.d.ts.map +1 -1
  238. package/dist/web-dashboard/chat-console.js +7 -0
  239. package/dist/web-dashboard/chat-console.js.map +1 -1
  240. package/dist/web-dashboard/server.d.ts +3 -1
  241. package/dist/web-dashboard/server.d.ts.map +1 -1
  242. package/dist/web-dashboard/server.js +534 -8
  243. package/dist/web-dashboard/server.js.map +1 -1
  244. package/dist/web-dashboard/src/types.d.ts +150 -1
  245. package/dist/web-dashboard/src/types.d.ts.map +1 -1
  246. package/dist/web-dashboard/workspace-guard.d.ts +40 -0
  247. package/dist/web-dashboard/workspace-guard.d.ts.map +1 -0
  248. package/dist/web-dashboard/workspace-guard.js +92 -0
  249. package/dist/web-dashboard/workspace-guard.js.map +1 -0
  250. package/package.json +4 -1
  251. package/src/web-dashboard/public/assets/index-Beportyl.js +207 -0
  252. package/src/web-dashboard/public/assets/index-Beportyl.js.map +1 -0
  253. package/src/web-dashboard/public/assets/index-gtQyg9nm.css +1 -0
  254. package/src/web-dashboard/public/index.html +2 -2
  255. package/src/web-dashboard/public/assets/index-D1YFCcIZ.js +0 -207
  256. package/src/web-dashboard/public/assets/index-D1YFCcIZ.js.map +0 -1
  257. package/src/web-dashboard/public/assets/index-jkW5qcf-.css +0 -1
@@ -6,18 +6,27 @@
6
6
  * page's text to ground its answers — the single biggest "understanding"
7
7
  * capability agent-nuvira was missing (capability gap #3, 🔴 MAJOR).
8
8
  *
9
- * Backends (all OSS/free, zero cost to the user — the I-series rule):
10
- * - **DuckDuckGo HTML** (no key) — default `searchWeb` backend.
11
- * - **SearXNG** (self-host, OSS) — opt-in JSON endpoint when the user has one.
12
- * - **Jina Reader** (free tier) — page-to-markdown for `readWebPage`; falls
13
- * back to a plain fetch + naive HTML→text strip when unconfigured.
9
+ * Search backends — bring your own key (BYOK) or use the keyless default:
10
+ * - **DuckDuckGo HTML** (no key) — the always-available fallback.
11
+ * - **SearXNG** (self-host, OSS) — opt-in JSON endpoint (`SEARXNG_URL`).
12
+ * - **Brave Search** (`BRAVE_SEARCH_API_KEY`) — paid, high quality.
13
+ * - **Serper.dev** (`SERPER_API_KEY`) — paid Google SERP proxy.
14
+ * - **Tavily** (`TAVILY_API_KEY`) — paid, LLM-optimised.
15
+ * - **Google Custom Search** (`GOOGLE_CSE_API_KEY` + `GOOGLE_CSE_ID`).
14
16
  *
15
- * Availability gating: DDG needs no config so
16
- * `isWebSearchAvailable()` is true by default; SearXNG/Jina are opt-in via
17
- * env. Every fetch carries a timeout + a real browser UA (robots-aware);
18
- * results are cached in `context/cache.ts` (provider=`web`) so repeated
19
- * queries never hit the network twice. `fetchFn` is injectable for the
20
- * mocked-fetch tests (no network in tests).
17
+ * Which backend runs is resolved by {@link resolveSearchProvider}: an explicit
18
+ * `provider` option wins, then the first backend whose key is configured (in
19
+ * {@link SEARCH_BACKEND_PRIORITY} order), then SearXNG, then DuckDuckGo. When a
20
+ * keyed backend returns nothing (or errors) the call degrades to DuckDuckGo so
21
+ * `web_search` never returns empty just because one provider is down.
22
+ *
23
+ * Page reading: **Jina Reader** (free tier, `JINA_API_KEY`) for page-to-markdown;
24
+ * falls back to a plain fetch + naive HTML→text strip when unconfigured.
25
+ *
26
+ * Every fetch carries a timeout + a real browser UA (robots-aware); results are
27
+ * cached in `context/cache.ts` (provider=`web`) so repeated queries never hit
28
+ * the network twice. `fetchFn` is injectable for the mocked-fetch tests (no
29
+ * network in tests).
21
30
  */
22
31
  /** One search hit — the same {title,url,snippet} shape as web_search tools. */
23
32
  export interface WebSearchResult {
@@ -25,9 +34,16 @@ export interface WebSearchResult {
25
34
  url: string;
26
35
  snippet: string;
27
36
  }
37
+ /** A concrete search backend id. */
38
+ export type SearchProvider = 'brave' | 'serper' | 'tavily' | 'google-cse' | 'searxng' | 'duckduckgo';
28
39
  export interface WebSearchOptions {
29
40
  /** Max hits to return (default 5). */
30
41
  maxResults?: number;
42
+ /**
43
+ * Explicit backend override. When omitted the first AVAILABLE backend in
44
+ * {@link SEARCH_BACKEND_PRIORITY} order is used. Unknown values are ignored.
45
+ */
46
+ provider?: string;
31
47
  /** SearXNG self-hosted JSON endpoint, e.g. http://localhost:8888/search. */
32
48
  searxngUrl?: string;
33
49
  /** Injectable fetch (tests stub it; defaults to global fetch). */
@@ -43,6 +59,41 @@ export interface ReadPageOptions {
43
59
  /** Fetch timeout in ms (default 20_000). */
44
60
  timeoutMs?: number;
45
61
  }
62
+ /**
63
+ * A search backend descriptor. `keyEnvVars` lists every env var that can carry
64
+ * the credential (first set wins); plain names are checked alongside the
65
+ * `NUVIRA_`/`BUFF_` prefixed forms so both a bare export and the nuvira-style
66
+ * override work.
67
+ */
68
+ interface SearchBackend {
69
+ id: SearchProvider;
70
+ label: string;
71
+ /** Env vars that can supply the key (empty = keyless). */
72
+ keyEnvVars: string[];
73
+ /** Extra required env var (e.g. Google CSE also needs the engine id). */
74
+ extraEnvVars?: string[];
75
+ /** True when an API key is required. */
76
+ requiresKey: boolean;
77
+ /** Cost note for diagnostics. */
78
+ free: boolean;
79
+ }
80
+ /** The catalog — single source of backend metadata. */
81
+ export declare const SEARCH_BACKENDS: Record<SearchProvider, SearchBackend>;
82
+ /**
83
+ * Auto-selection order when no explicit provider is configured. A user who set
84
+ * several keys gets the highest-quality one; `searxng` and `duckduckgo` are the
85
+ * keyless tail so a search always works.
86
+ */
87
+ export declare const SEARCH_BACKEND_PRIORITY: readonly SearchProvider[];
88
+ /** Is a specific backend usable right now (key/endpoint present)? */
89
+ export declare function isBackendAvailable(provider: SearchProvider, options?: WebSearchOptions): boolean;
90
+ /**
91
+ * Which backend will actually run. Explicit `provider` (when known) wins, then
92
+ * the first available backend in priority order. Never throws.
93
+ */
94
+ export declare function resolveSearchProvider(options?: WebSearchOptions): SearchProvider;
95
+ /** Every backend id with a configured key/endpoint (for CLI + dashboard). */
96
+ export declare function availableSearchBackends(options?: WebSearchOptions): SearchProvider[];
46
97
  /** DDG needs no key → web search is available out of the box. */
47
98
  export declare function isWebSearchAvailable(): boolean;
48
99
  /**
@@ -53,10 +104,20 @@ export declare function isWebSearchAvailable(): boolean;
53
104
  export declare function parseDuckDuckGoHtml(html: string, maxResults: number): WebSearchResult[];
54
105
  /** SearXNG JSON → the same result shape (format=json returns `results[]`). */
55
106
  export declare function parseSearxngJson(json: unknown, maxResults: number): WebSearchResult[];
107
+ /** Brave Search `{ web: { results: [{ title, url, description }] } }`. */
108
+ export declare function parseBraveJson(json: unknown, maxResults: number): WebSearchResult[];
109
+ /** Serper.dev `{ organic: [{ title, link, snippet }] }`. */
110
+ export declare function parseSerperJson(json: unknown, maxResults: number): WebSearchResult[];
111
+ /** Tavily `{ results: [{ title, url, content }] }`. */
112
+ export declare function parseTavilyJson(json: unknown, maxResults: number): WebSearchResult[];
113
+ /** Google Custom Search `{ items: [{ title, link, snippet }] }`. */
114
+ export declare function parseGoogleCseJson(json: unknown, maxResults: number): WebSearchResult[];
56
115
  /**
57
- * Search the web. Preferred backend: SearXNG when `searxngUrl` is configured;
58
- * otherwise DuckDuckGo HTML (no key). Results cached in context/cache.ts
59
- * (provider=`web`) keyed by backend+query.
116
+ * Search the web. Backend: an explicit `provider` option, else the first
117
+ * AVAILABLE backend in priority order (Brave → Serper → Tavily → Google CSE →
118
+ * SearXNG → DuckDuckGo). When a keyed backend yields nothing, the query is
119
+ * retried once on the keyless DuckDuckGo fallback. Results cached in
120
+ * context/cache.ts (provider=`web`) keyed by backend+query.
60
121
  */
61
122
  export declare function searchWeb(query: string, options?: WebSearchOptions): Promise<WebSearchResult[]>;
62
123
  /**
@@ -71,4 +132,5 @@ export declare function readWebPage(url: string, options?: ReadPageOptions): Pro
71
132
  * cloud metadata (169.254.169.254) and internal services are unreachable.
72
133
  */
73
134
  export declare function isAllowedReadUrl(url: string): boolean;
135
+ export {};
74
136
  //# sourceMappingURL=web-research.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-research.d.ts","sourceRoot":"","sources":["../../src/tools/web-research.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqCD,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE,CAyBvF;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE,CAQrF;AAID;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,EAAE,CAAC,CAuC5B;AAID;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyC7F;AAoBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAwBrD"}
1
+ {"version":3,"file":"web-research.d.ts","sourceRoot":"","sources":["../../src/tools/web-research.ts"],"names":[],"mappings":"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"}
@@ -6,18 +6,27 @@
6
6
  * page's text to ground its answers — the single biggest "understanding"
7
7
  * capability agent-nuvira was missing (capability gap #3, 🔴 MAJOR).
8
8
  *
9
- * Backends (all OSS/free, zero cost to the user — the I-series rule):
10
- * - **DuckDuckGo HTML** (no key) — default `searchWeb` backend.
11
- * - **SearXNG** (self-host, OSS) — opt-in JSON endpoint when the user has one.
12
- * - **Jina Reader** (free tier) — page-to-markdown for `readWebPage`; falls
13
- * back to a plain fetch + naive HTML→text strip when unconfigured.
9
+ * Search backends — bring your own key (BYOK) or use the keyless default:
10
+ * - **DuckDuckGo HTML** (no key) — the always-available fallback.
11
+ * - **SearXNG** (self-host, OSS) — opt-in JSON endpoint (`SEARXNG_URL`).
12
+ * - **Brave Search** (`BRAVE_SEARCH_API_KEY`) — paid, high quality.
13
+ * - **Serper.dev** (`SERPER_API_KEY`) — paid Google SERP proxy.
14
+ * - **Tavily** (`TAVILY_API_KEY`) — paid, LLM-optimised.
15
+ * - **Google Custom Search** (`GOOGLE_CSE_API_KEY` + `GOOGLE_CSE_ID`).
14
16
  *
15
- * Availability gating: DDG needs no config so
16
- * `isWebSearchAvailable()` is true by default; SearXNG/Jina are opt-in via
17
- * env. Every fetch carries a timeout + a real browser UA (robots-aware);
18
- * results are cached in `context/cache.ts` (provider=`web`) so repeated
19
- * queries never hit the network twice. `fetchFn` is injectable for the
20
- * mocked-fetch tests (no network in tests).
17
+ * Which backend runs is resolved by {@link resolveSearchProvider}: an explicit
18
+ * `provider` option wins, then the first backend whose key is configured (in
19
+ * {@link SEARCH_BACKEND_PRIORITY} order), then SearXNG, then DuckDuckGo. When a
20
+ * keyed backend returns nothing (or errors) the call degrades to DuckDuckGo so
21
+ * `web_search` never returns empty just because one provider is down.
22
+ *
23
+ * Page reading: **Jina Reader** (free tier, `JINA_API_KEY`) for page-to-markdown;
24
+ * falls back to a plain fetch + naive HTML→text strip when unconfigured.
25
+ *
26
+ * Every fetch carries a timeout + a real browser UA (robots-aware); results are
27
+ * cached in `context/cache.ts` (provider=`web`) so repeated queries never hit
28
+ * the network twice. `fetchFn` is injectable for the mocked-fetch tests (no
29
+ * network in tests).
21
30
  */
22
31
  import { getCache } from '../context/cache.js';
23
32
  import { envBuff } from '../config/paths.js';
@@ -25,6 +34,111 @@ import { envBuff } from '../config/paths.js';
25
34
  const BROWSER_UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36';
26
35
  const DEFAULT_SEARCH_TTL = 6 * 3600; // 6h — search results drift slowly
27
36
  const DEFAULT_PAGE_TTL = 24 * 3600; // 24h — page text is stable
37
+ /** The catalog — single source of backend metadata. */
38
+ export const SEARCH_BACKENDS = {
39
+ brave: {
40
+ id: 'brave',
41
+ label: 'Brave Search',
42
+ keyEnvVars: ['BRAVE_SEARCH_API_KEY', 'BRAVE_API_KEY'],
43
+ requiresKey: true,
44
+ free: false,
45
+ },
46
+ serper: {
47
+ id: 'serper',
48
+ label: 'Serper.dev',
49
+ keyEnvVars: ['SERPER_API_KEY'],
50
+ requiresKey: true,
51
+ free: false,
52
+ },
53
+ tavily: {
54
+ id: 'tavily',
55
+ label: 'Tavily',
56
+ keyEnvVars: ['TAVILY_API_KEY'],
57
+ requiresKey: true,
58
+ free: false,
59
+ },
60
+ 'google-cse': {
61
+ id: 'google-cse',
62
+ label: 'Google Custom Search',
63
+ keyEnvVars: ['GOOGLE_CSE_API_KEY', 'GOOGLE_API_KEY'],
64
+ extraEnvVars: ['GOOGLE_CSE_ID', 'GOOGLE_CSE_CX'],
65
+ requiresKey: true,
66
+ free: false,
67
+ },
68
+ searxng: {
69
+ id: 'searxng',
70
+ label: 'SearXNG (self-hosted)',
71
+ keyEnvVars: [],
72
+ requiresKey: false,
73
+ free: true,
74
+ },
75
+ duckduckgo: {
76
+ id: 'duckduckgo',
77
+ label: 'DuckDuckGo (keyless)',
78
+ keyEnvVars: [],
79
+ requiresKey: false,
80
+ free: true,
81
+ },
82
+ };
83
+ /**
84
+ * Auto-selection order when no explicit provider is configured. A user who set
85
+ * several keys gets the highest-quality one; `searxng` and `duckduckgo` are the
86
+ * keyless tail so a search always works.
87
+ */
88
+ export const SEARCH_BACKEND_PRIORITY = [
89
+ 'brave',
90
+ 'serper',
91
+ 'tavily',
92
+ 'google-cse',
93
+ 'searxng',
94
+ 'duckduckgo',
95
+ ];
96
+ /** Read the first non-empty value among names (prefixed + plain). */
97
+ function keyFromEnv(names) {
98
+ for (const name of names) {
99
+ const value = (envBuff(name) ?? process.env[name])?.trim();
100
+ if (value)
101
+ return value;
102
+ }
103
+ return undefined;
104
+ }
105
+ /** Resolve the effective SearXNG endpoint (explicit option or env). */
106
+ function searxngEndpoint(options) {
107
+ return options.searxngUrl || envBuff('SEARXNG_URL');
108
+ }
109
+ /** Is a specific backend usable right now (key/endpoint present)? */
110
+ export function isBackendAvailable(provider, options = {}) {
111
+ const backend = SEARCH_BACKENDS[provider];
112
+ if (!backend)
113
+ return false;
114
+ if (provider === 'duckduckgo')
115
+ return true;
116
+ if (provider === 'searxng')
117
+ return Boolean(searxngEndpoint(options));
118
+ if (!keyFromEnv(backend.keyEnvVars))
119
+ return false;
120
+ if (backend.extraEnvVars && !keyFromEnv(backend.extraEnvVars))
121
+ return false;
122
+ return true;
123
+ }
124
+ /**
125
+ * Which backend will actually run. Explicit `provider` (when known) wins, then
126
+ * the first available backend in priority order. Never throws.
127
+ */
128
+ export function resolveSearchProvider(options = {}) {
129
+ const explicit = options.provider;
130
+ if (explicit && SEARCH_BACKENDS[explicit])
131
+ return explicit;
132
+ for (const id of SEARCH_BACKEND_PRIORITY) {
133
+ if (isBackendAvailable(id, options))
134
+ return id;
135
+ }
136
+ return 'duckduckgo';
137
+ }
138
+ /** Every backend id with a configured key/endpoint (for CLI + dashboard). */
139
+ export function availableSearchBackends(options = {}) {
140
+ return SEARCH_BACKEND_PRIORITY.filter((id) => isBackendAvailable(id, options));
141
+ }
28
142
  // ─── Fetch helper ───────────────────────────────────────────────────────────
29
143
  /** fetch with timeout + browser UA. Aborts via AbortSignal.timeout when free. */
30
144
  async function fetchWithTimeout(url, init, timeoutMs, fetchFn) {
@@ -36,7 +150,7 @@ async function fetchWithTimeout(url, init, timeoutMs, fetchFn) {
36
150
  signal: controller.signal,
37
151
  headers: {
38
152
  'User-Agent': BROWSER_UA,
39
- Accept: 'text/html,application/xhtml+xml,text/plain,*/*;q=0.8',
153
+ Accept: 'text/html,application/xhtml+xml,application/json,text/plain,*/*;q=0.8',
40
154
  ...(init.headers || {}),
41
155
  },
42
156
  });
@@ -95,20 +209,161 @@ export function parseSearxngJson(json, maxResults) {
95
209
  .slice(0, maxResults)
96
210
  .map((r) => ({ title: r.title, url: r.url, snippet: (r.content || '').trim() }));
97
211
  }
212
+ // ─── Hosted-backend JSON parsers (one per provider shape) ───────────────────
213
+ /** Shared cleanup: strip tags/entities from a provider snippet. */
214
+ function cleanSnippet(value) {
215
+ if (typeof value !== 'string')
216
+ return '';
217
+ return stripTags(decodeEntities(value)).trim();
218
+ }
219
+ /** Brave Search `{ web: { results: [{ title, url, description }] } }`. */
220
+ export function parseBraveJson(json, maxResults) {
221
+ const arr = json?.web?.results;
222
+ if (!Array.isArray(arr))
223
+ return [];
224
+ return arr
225
+ .filter((r) => r && r.title && r.url)
226
+ .slice(0, maxResults)
227
+ .map((r) => ({ title: cleanSnippet(r.title), url: r.url, snippet: cleanSnippet(r.description) }));
228
+ }
229
+ /** Serper.dev `{ organic: [{ title, link, snippet }] }`. */
230
+ export function parseSerperJson(json, maxResults) {
231
+ const arr = json?.organic;
232
+ if (!Array.isArray(arr))
233
+ return [];
234
+ return arr
235
+ .filter((r) => r && r.title && r.link)
236
+ .slice(0, maxResults)
237
+ .map((r) => ({ title: cleanSnippet(r.title), url: r.link, snippet: cleanSnippet(r.snippet) }));
238
+ }
239
+ /** Tavily `{ results: [{ title, url, content }] }`. */
240
+ export function parseTavilyJson(json, maxResults) {
241
+ const arr = json?.results;
242
+ if (!Array.isArray(arr))
243
+ return [];
244
+ return arr
245
+ .filter((r) => r && r.title && r.url)
246
+ .slice(0, maxResults)
247
+ .map((r) => ({ title: cleanSnippet(r.title), url: r.url, snippet: cleanSnippet(r.content) }));
248
+ }
249
+ /** Google Custom Search `{ items: [{ title, link, snippet }] }`. */
250
+ export function parseGoogleCseJson(json, maxResults) {
251
+ const arr = json?.items;
252
+ if (!Array.isArray(arr))
253
+ return [];
254
+ return arr
255
+ .filter((r) => r && r.title && r.link)
256
+ .slice(0, maxResults)
257
+ .map((r) => ({ title: cleanSnippet(r.title), url: r.link, snippet: cleanSnippet(r.snippet) }));
258
+ }
259
+ // ─── Backend runners ────────────────────────────────────────────────────────
260
+ /** DuckDuckGo HTML lite (no key). */
261
+ async function runDuckDuckGo(query, maxResults, timeoutMs, fetchFn) {
262
+ const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
263
+ const res = await fetchWithTimeout(url, {}, timeoutMs, fetchFn);
264
+ if (!res.ok)
265
+ return [];
266
+ return parseDuckDuckGoHtml(await res.text(), maxResults);
267
+ }
268
+ /** SearXNG self-hosted JSON endpoint. */
269
+ async function runSearxng(query, maxResults, endpoint, timeoutMs, fetchFn) {
270
+ const url = `${endpoint.replace(/\/$/, '')}/search?q=${encodeURIComponent(query)}&format=json`;
271
+ const res = await fetchWithTimeout(url, {}, timeoutMs, fetchFn);
272
+ if (!res.ok)
273
+ return [];
274
+ return parseSearxngJson(await res.json(), maxResults);
275
+ }
276
+ /** Brave Search API (`X-Subscription-Token`). */
277
+ async function runBrave(query, maxResults, timeoutMs, fetchFn) {
278
+ const key = keyFromEnv(SEARCH_BACKENDS.brave.keyEnvVars);
279
+ if (!key)
280
+ return [];
281
+ const count = Math.min(maxResults, 20);
282
+ const url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${count}`;
283
+ const res = await fetchWithTimeout(url, { headers: { 'X-Subscription-Token': key, Accept: 'application/json' } }, timeoutMs, fetchFn);
284
+ if (!res.ok)
285
+ return [];
286
+ return parseBraveJson(await res.json(), maxResults);
287
+ }
288
+ /** Serper.dev Google SERP proxy (`X-API-KEY`, POST {q}). */
289
+ async function runSerper(query, maxResults, timeoutMs, fetchFn) {
290
+ const key = keyFromEnv(SEARCH_BACKENDS.serper.keyEnvVars);
291
+ if (!key)
292
+ return [];
293
+ const res = await fetchWithTimeout('https://google.serper.dev/search', {
294
+ method: 'POST',
295
+ headers: { 'X-API-KEY': key, 'content-type': 'application/json' },
296
+ body: JSON.stringify({ q: query, num: maxResults }),
297
+ }, timeoutMs, fetchFn);
298
+ if (!res.ok)
299
+ return [];
300
+ return parseSerperJson(await res.json(), maxResults);
301
+ }
302
+ /** Tavily (`Authorization: Bearer`, POST {query}). */
303
+ async function runTavily(query, maxResults, timeoutMs, fetchFn) {
304
+ const key = keyFromEnv(SEARCH_BACKENDS.tavily.keyEnvVars);
305
+ if (!key)
306
+ return [];
307
+ const res = await fetchWithTimeout('https://api.tavily.com/search', {
308
+ method: 'POST',
309
+ headers: { Authorization: `Bearer ${key}`, 'content-type': 'application/json' },
310
+ body: JSON.stringify({ query, max_results: maxResults, search_depth: 'basic' }),
311
+ }, timeoutMs, fetchFn);
312
+ if (!res.ok)
313
+ return [];
314
+ return parseTavilyJson(await res.json(), maxResults);
315
+ }
316
+ /** Google Custom Search JSON API (`key` + `cx`). */
317
+ async function runGoogleCse(query, maxResults, timeoutMs, fetchFn) {
318
+ const key = keyFromEnv(SEARCH_BACKENDS['google-cse'].keyEnvVars);
319
+ const cx = keyFromEnv(SEARCH_BACKENDS['google-cse'].extraEnvVars ?? []);
320
+ if (!key || !cx)
321
+ return [];
322
+ const num = Math.min(maxResults, 10);
323
+ const url = `https://www.googleapis.com/customsearch/v1?key=${encodeURIComponent(key)}&cx=${encodeURIComponent(cx)}&q=${encodeURIComponent(query)}&num=${num}`;
324
+ const res = await fetchWithTimeout(url, {}, timeoutMs, fetchFn);
325
+ if (!res.ok)
326
+ return [];
327
+ return parseGoogleCseJson(await res.json(), maxResults);
328
+ }
329
+ /** Dispatch a query to one concrete backend. */
330
+ async function runBackend(provider, query, options, fetchFn, timeoutMs) {
331
+ const maxResults = options.maxResults ?? 5;
332
+ switch (provider) {
333
+ case 'brave':
334
+ return runBrave(query, maxResults, timeoutMs, fetchFn);
335
+ case 'serper':
336
+ return runSerper(query, maxResults, timeoutMs, fetchFn);
337
+ case 'tavily':
338
+ return runTavily(query, maxResults, timeoutMs, fetchFn);
339
+ case 'google-cse':
340
+ return runGoogleCse(query, maxResults, timeoutMs, fetchFn);
341
+ case 'searxng': {
342
+ const endpoint = searxngEndpoint(options);
343
+ if (!endpoint)
344
+ return [];
345
+ return runSearxng(query, maxResults, endpoint, timeoutMs, fetchFn);
346
+ }
347
+ case 'duckduckgo':
348
+ default:
349
+ return runDuckDuckGo(query, maxResults, timeoutMs, fetchFn);
350
+ }
351
+ }
98
352
  // ─── searchWeb ──────────────────────────────────────────────────────────────
99
353
  /**
100
- * Search the web. Preferred backend: SearXNG when `searxngUrl` is configured;
101
- * otherwise DuckDuckGo HTML (no key). Results cached in context/cache.ts
102
- * (provider=`web`) keyed by backend+query.
354
+ * Search the web. Backend: an explicit `provider` option, else the first
355
+ * AVAILABLE backend in priority order (Brave → Serper → Tavily → Google CSE →
356
+ * SearXNG → DuckDuckGo). When a keyed backend yields nothing, the query is
357
+ * retried once on the keyless DuckDuckGo fallback. Results cached in
358
+ * context/cache.ts (provider=`web`) keyed by backend+query.
103
359
  */
104
360
  export async function searchWeb(query, options = {}) {
105
361
  const fetchFn = options.fetchFn || globalThis.fetch.bind(globalThis);
106
- const maxResults = options.maxResults ?? 5;
107
362
  const timeoutMs = options.timeoutMs ?? 15_000;
363
+ const provider = resolveSearchProvider(options);
108
364
  const cache = getCache();
109
- const backend = options.searxngUrl ? 'searxng' : 'duckduckgo';
110
- const cacheKey = `${backend}:${query}`;
111
- const cached = await cache.get(cacheKey, 'web', backend);
365
+ const cacheKey = `${provider}:${query}`;
366
+ const cached = await cache.get(cacheKey, 'web', provider);
112
367
  if (cached) {
113
368
  try {
114
369
  return JSON.parse(cached);
@@ -117,27 +372,17 @@ export async function searchWeb(query, options = {}) {
117
372
  }
118
373
  let results = [];
119
374
  try {
120
- if (options.searxngUrl) {
121
- const url = `${options.searxngUrl.replace(/\/$/, '')}/search?q=${encodeURIComponent(query)}&format=json`;
122
- const res = await fetchWithTimeout(url, {}, timeoutMs, fetchFn);
123
- if (res.ok) {
124
- const json = await res.json();
125
- results = parseSearxngJson(json, maxResults);
126
- }
127
- }
128
- if (results.length === 0) {
129
- const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
130
- const res = await fetchWithTimeout(url, {}, timeoutMs, fetchFn);
131
- if (res.ok) {
132
- const html = await res.text();
133
- results = parseDuckDuckGoHtml(html, maxResults);
134
- }
375
+ results = await runBackend(provider, query, options, fetchFn, timeoutMs);
376
+ // Keyed backend down or empty → degrade to the keyless fallback so a
377
+ // `web_search` never silently returns nothing because one provider failed.
378
+ if (results.length === 0 && provider !== 'duckduckgo') {
379
+ results = await runDuckDuckGo(query, options.maxResults ?? 5, timeoutMs, fetchFn);
135
380
  }
136
381
  }
137
382
  catch {
138
383
  return []; // network failure → empty, never throw into the tool loop
139
384
  }
140
- await cache.set(cacheKey, JSON.stringify(results), 'web', backend, DEFAULT_SEARCH_TTL);
385
+ await cache.set(cacheKey, JSON.stringify(results), 'web', provider, DEFAULT_SEARCH_TTL);
141
386
  return results;
142
387
  }
143
388
  // ─── readWebPage ────────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"web-research.js","sourceRoot":"","sources":["../../src/tools/web-research.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-research.js","sourceRoot":"","sources":["../../src/tools/web-research.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AA6C1C,uEAAuE;AACvE,MAAM,UAAU,GACd,mHAAmH,CAAC;AAEtH,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,mCAAmC;AACxE,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,4BAA4B;AAuBhE,uDAAuD;AACvD,MAAM,CAAC,MAAM,eAAe,GAA0C;IACpE,KAAK,EAAE;QACL,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,CAAC,sBAAsB,EAAE,eAAe,CAAC;QACrD,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,KAAK;KACZ;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE,CAAC,gBAAgB,CAAC;QAC9B,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,KAAK;KACZ;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,CAAC,gBAAgB,CAAC;QAC9B,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,KAAK;KACZ;IACD,YAAY,EAAE;QACZ,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,sBAAsB;QAC7B,UAAU,EAAE,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;QACpD,YAAY,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC;QAChD,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,KAAK;KACZ;IACD,OAAO,EAAE;QACP,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,uBAAuB;QAC9B,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,KAAK;QAClB,IAAI,EAAE,IAAI;KACX;IACD,UAAU,EAAE;QACV,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,sBAAsB;QAC7B,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,KAAK;QAClB,IAAI,EAAE,IAAI;KACX;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA8B;IAChE,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,YAAY;CACb,CAAC;AAEF,qEAAqE;AACrE,SAAS,UAAU,CAAC,KAAe;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAC3D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uEAAuE;AACvE,SAAS,eAAe,CAAC,OAAyB;IAChD,OAAO,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;AACtD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,kBAAkB,CAAC,QAAwB,EAAE,UAA4B,EAAE;IACzF,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAA4B,EAAE;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAsC,CAAC;IAChE,IAAI,QAAQ,IAAI,eAAe,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3D,KAAK,MAAM,EAAE,IAAI,uBAAuB,EAAE,CAAC;QACzC,IAAI,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CAAC,UAA4B,EAAE;IACpE,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,+EAA+E;AAE/E,iFAAiF;AACjF,KAAK,UAAU,gBAAgB,CAC7B,GAAW,EACX,IAAiB,EACjB,SAAiB,EACjB,OAAqB;IAErB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,GAAG,EAAE;YACxB,GAAG,IAAI;YACP,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACP,YAAY,EAAE,UAAU;gBACxB,MAAM,EAAE,uEAAuE;gBAC/E,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;aACxB;SACF,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,iEAAiE;AACjE,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,UAAkB;IAClE,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,6EAA6E,CAAC;IAC/F,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;YAAE,SAAS;QAChC,iDAAiD;QACjD,uEAAuE;QACvE,2CAA2C;QAC3C,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,4EAA4E;IAC5E,MAAM,SAAS,GAAG,gEAAgE,CAAC;IACnF,IAAI,YAAoC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5E,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvE,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,IAAa,EAAE,UAAkB;IAChE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,GAAG,GAAI,IAAgF,CAAC,OAAO,CAAC;IACtG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,GAAG;SACP,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;SACpC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAe,EAAE,GAAG,EAAE,CAAC,CAAC,GAAa,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACzG,CAAC;AAED,+EAA+E;AAE/E,mEAAmE;AACnE,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzC,OAAO,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,IAAa,EAAE,UAAkB;IAC9D,MAAM,GAAG,GAAI,IAA8F,EAAE,GAAG,EAAE,OAAO,CAAC;IAC1H,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,GAAG;SACP,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;SACpC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAa,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAChH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,UAAkB;IAC/D,MAAM,GAAG,GAAI,IAAiF,EAAE,OAAO,CAAC;IACxG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,GAAG;SACP,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC;SACrC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,IAAc,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7G,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,UAAkB;IAC/D,MAAM,GAAG,GAAI,IAAgF,EAAE,OAAO,CAAC;IACvG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,GAAG;SACP,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;SACpC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAa,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5G,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CAAC,IAAa,EAAE,UAAkB;IAClE,MAAM,GAAG,GAAI,IAA+E,EAAE,KAAK,CAAC;IACpG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,GAAG;SACP,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC;SACrC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,IAAc,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7G,CAAC;AAED,+EAA+E;AAE/E,qCAAqC;AACrC,KAAK,UAAU,aAAa,CAC1B,KAAa,EACb,UAAkB,EAClB,SAAiB,EACjB,OAAqB;IAErB,MAAM,GAAG,GAAG,uCAAuC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/E,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,yCAAyC;AACzC,KAAK,UAAU,UAAU,CACvB,KAAa,EACb,UAAkB,EAClB,QAAgB,EAChB,SAAiB,EACjB,OAAqB;IAErB,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC;IAC/F,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED,iDAAiD;AACjD,KAAK,UAAU,QAAQ,CACrB,KAAa,EACb,UAAkB,EAClB,SAAiB,EACjB,OAAqB;IAErB,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,oDAAoD,kBAAkB,CAAC,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC;IAC3G,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAChC,GAAG,EACH,EAAE,OAAO,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EACxE,SAAS,EACT,OAAO,CACR,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;AACtD,CAAC;AAED,4DAA4D;AAC5D,KAAK,UAAU,SAAS,CACtB,KAAa,EACb,UAAkB,EAClB,SAAiB,EACjB,OAAqB;IAErB,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAChC,kCAAkC,EAClC;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE;QACjE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;KACpD,EACD,SAAS,EACT,OAAO,CACR,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC;AAED,sDAAsD;AACtD,KAAK,UAAU,SAAS,CACtB,KAAa,EACb,UAAkB,EAClB,SAAiB,EACjB,OAAqB;IAErB,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAChC,+BAA+B,EAC/B;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;KAChF,EACD,SAAS,EACT,OAAO,CACR,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC;AAED,oDAAoD;AACpD,KAAK,UAAU,YAAY,CACzB,KAAa,EACb,UAAkB,EAClB,SAAiB,EACjB,OAAqB;IAErB,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,kDAAkD,kBAAkB,CAAC,GAAG,CAAC,OAAO,kBAAkB,CAAC,EAAE,CAAC,MAAM,kBAAkB,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;IAC/J,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,gDAAgD;AAChD,KAAK,UAAU,UAAU,CACvB,QAAwB,EACxB,KAAa,EACb,OAAyB,EACzB,OAAqB,EACrB,SAAiB;IAEjB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IAC3C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACzD,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC1D,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC1D,KAAK,YAAY;YACf,OAAO,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7D,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,CAAC;YACzB,OAAO,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,YAAY,CAAC;QAClB;YACE,OAAO,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAa,EACb,UAA4B,EAAE;IAE9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAsB,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,GAAsB,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACzE,qEAAqE;QACrE,2EAA2E;QAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YACtD,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,0DAA0D;IACvE,CAAC;IAED,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,UAA2B,EAAE;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAE9C,0EAA0E;IAC1E,2EAA2E;IAC3E,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,4IAA4I,CAAC;IACtJ,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE7C,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACzC,IAAI,CAAC;QACH,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAChC,qBAAqB,GAAG,EAAE,EAC1B,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,EAAE,EAAE,EAAE,EACnD,SAAS,EACT,OAAO,CACR,CAAC;YACF,IAAI,GAAG,CAAC,EAAE;gBAAE,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAChE,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,0DAA0D;IACvE,CAAC;IAED,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,+EAA+E;AAE/E;;;GAGG;AACH,SAAS,kBAAkB,CAAC,MAAc;IACxC,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9E,IAAI,OAAO,CAAC,mBAAmB,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IACxF,wEAAwE;IACxE,qDAAqD;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACxE,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YAClI,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,4EAA4E;IAC5E,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAE/E,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,CAAC;SACL,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,wEAAwE;IACxE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}