dsh-zen-remote 2.3.10 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/CHANGELOG.md +44 -72
  2. package/README.md +94 -84
  3. package/README.zh-CN.md +90 -81
  4. package/bin/zen-remote.mjs +5 -0
  5. package/docs/interface.md +6 -6
  6. package/docs/remote-access.en.md +6 -4
  7. package/docs/remote-access.md +6 -4
  8. package/dsh-push.mjs +96 -10
  9. package/lib/adapters/dsh-better-sidebar/index.js +7 -3
  10. package/lib/adapters/dsh-better-sidebar/index.js.map +1 -1
  11. package/lib/admin-routes.js +10 -2
  12. package/lib/admin-routes.js.map +1 -1
  13. package/lib/cli/args.js +251 -0
  14. package/lib/cli/args.js.map +1 -0
  15. package/lib/cli/bootstrap.js +449 -0
  16. package/lib/cli/bootstrap.js.map +1 -0
  17. package/lib/cli/command-setup.js +484 -0
  18. package/lib/cli/command-setup.js.map +1 -0
  19. package/lib/cli/commands-client.js +359 -0
  20. package/lib/cli/commands-client.js.map +1 -0
  21. package/lib/cli/commands-host.js +1108 -0
  22. package/lib/cli/commands-host.js.map +1 -0
  23. package/lib/cli/commands-status.js +279 -0
  24. package/lib/cli/commands-status.js.map +1 -0
  25. package/lib/cli/config-writer.js +334 -0
  26. package/lib/cli/config-writer.js.map +1 -0
  27. package/lib/cli/context.js +10 -0
  28. package/lib/cli/context.js.map +1 -0
  29. package/lib/cli/i18n.js +620 -0
  30. package/lib/cli/i18n.js.map +1 -0
  31. package/lib/cli/ipc-client.js +160 -0
  32. package/lib/cli/ipc-client.js.map +1 -0
  33. package/lib/cli/ipc-server.js +464 -0
  34. package/lib/cli/ipc-server.js.map +1 -0
  35. package/lib/cli/main.js +245 -0
  36. package/lib/cli/main.js.map +1 -0
  37. package/lib/cli/qr-terminal.js +48 -0
  38. package/lib/cli/qr-terminal.js.map +1 -0
  39. package/lib/client-data/qr.js +286 -0
  40. package/lib/client-data/qr.js.map +1 -0
  41. package/lib/client-routes.js +308 -25
  42. package/lib/client-routes.js.map +1 -1
  43. package/lib/client.js +1013 -229
  44. package/lib/config.js +50 -12
  45. package/lib/config.js.map +1 -1
  46. package/lib/debug-report.js +28 -1
  47. package/lib/debug-report.js.map +1 -1
  48. package/lib/fetch-route-intercept.js +334 -26
  49. package/lib/fetch-route-intercept.js.map +1 -1
  50. package/lib/index.js +573 -366
  51. package/lib/index.js.map +1 -1
  52. package/lib/intercept.js +1833 -280
  53. package/lib/intercept.js.map +1 -1
  54. package/lib/lan-gate-server.cjs +36 -10
  55. package/lib/merge-streams.js +103 -11
  56. package/lib/merge-streams.js.map +1 -1
  57. package/lib/plugin-route-intercept.js +93 -63
  58. package/lib/plugin-route-intercept.js.map +1 -1
  59. package/lib/relay-access.js +8 -1
  60. package/lib/relay-access.js.map +1 -1
  61. package/lib/relay-client.js +133 -4
  62. package/lib/relay-client.js.map +1 -1
  63. package/lib/relay-pool.js +275 -0
  64. package/lib/relay-pool.js.map +1 -0
  65. package/lib/relay-server.js +269 -17
  66. package/lib/relay-server.js.map +1 -1
  67. package/lib/restart-fields.js +6 -4
  68. package/lib/restart-fields.js.map +1 -1
  69. package/lib/share-store.js +65 -27
  70. package/lib/share-store.js.map +1 -1
  71. package/lib/state-store.js +400 -0
  72. package/lib/state-store.js.map +1 -0
  73. package/lib/types/adapters/dsh-better-sidebar/index.d.ts +3 -2
  74. package/lib/types/adapters/dsh-better-sidebar/index.d.ts.map +1 -1
  75. package/lib/types/admin-routes.d.ts.map +1 -1
  76. package/lib/types/cli/args.d.ts +78 -0
  77. package/lib/types/cli/args.d.ts.map +1 -0
  78. package/lib/types/cli/bootstrap.d.ts +170 -0
  79. package/lib/types/cli/bootstrap.d.ts.map +1 -0
  80. package/lib/types/cli/command-setup.d.ts +72 -0
  81. package/lib/types/cli/command-setup.d.ts.map +1 -0
  82. package/lib/types/cli/commands-client.d.ts +36 -0
  83. package/lib/types/cli/commands-client.d.ts.map +1 -0
  84. package/lib/types/cli/commands-host.d.ts +82 -0
  85. package/lib/types/cli/commands-host.d.ts.map +1 -0
  86. package/lib/types/cli/commands-status.d.ts +46 -0
  87. package/lib/types/cli/commands-status.d.ts.map +1 -0
  88. package/lib/types/cli/config-writer.d.ts +92 -0
  89. package/lib/types/cli/config-writer.d.ts.map +1 -0
  90. package/lib/types/cli/context.d.ts +39 -0
  91. package/lib/types/cli/context.d.ts.map +1 -0
  92. package/lib/types/cli/i18n.d.ts +32 -0
  93. package/lib/types/cli/i18n.d.ts.map +1 -0
  94. package/lib/types/cli/ipc-client.d.ts +83 -0
  95. package/lib/types/cli/ipc-client.d.ts.map +1 -0
  96. package/lib/types/cli/ipc-server.d.ts +113 -0
  97. package/lib/types/cli/ipc-server.d.ts.map +1 -0
  98. package/lib/types/cli/main.d.ts +57 -0
  99. package/lib/types/cli/main.d.ts.map +1 -0
  100. package/lib/types/cli/qr-terminal.d.ts +17 -0
  101. package/lib/types/cli/qr-terminal.d.ts.map +1 -0
  102. package/lib/types/client/RemoteStatusIcon.d.ts.map +1 -1
  103. package/lib/types/client/current-session-report.d.ts +4 -0
  104. package/lib/types/client/current-session-report.d.ts.map +1 -1
  105. package/lib/types/client/effects/model-group-side.d.ts.map +1 -1
  106. package/lib/types/client/effects/remote-session.d.ts.map +1 -1
  107. package/lib/types/client/locales.d.ts +47 -3
  108. package/lib/types/client/locales.d.ts.map +1 -1
  109. package/lib/types/client/settings/SettingsSection.d.ts.map +1 -1
  110. package/lib/types/client/settings/settings-css.d.ts +1 -1
  111. package/lib/types/client/settings/settings-css.d.ts.map +1 -1
  112. package/lib/types/client/styles/remote-session.css.d.ts +1 -1
  113. package/lib/types/client/styles/remote-session.css.d.ts.map +1 -1
  114. package/lib/types/client/wizard/GatewayWizard.d.ts.map +1 -1
  115. package/lib/types/client/wizard/cards/ProxyCard.d.ts.map +1 -1
  116. package/lib/types/client/wizard/wizard-css.d.ts +1 -1
  117. package/lib/types/client/wizard/wizard-css.d.ts.map +1 -1
  118. package/lib/types/client-data/model-group-side.d.ts +23 -2
  119. package/lib/types/client-data/model-group-side.d.ts.map +1 -1
  120. package/lib/types/client-data/remote-status.d.ts +47 -1
  121. package/lib/types/client-data/remote-status.d.ts.map +1 -1
  122. package/lib/types/client-data/settings-form.d.ts +85 -1
  123. package/lib/types/client-data/settings-form.d.ts.map +1 -1
  124. package/lib/types/client-data/wizard.d.ts +56 -1
  125. package/lib/types/client-data/wizard.d.ts.map +1 -1
  126. package/lib/types/client-routes.d.ts +25 -1
  127. package/lib/types/client-routes.d.ts.map +1 -1
  128. package/lib/types/config.d.ts +40 -14
  129. package/lib/types/config.d.ts.map +1 -1
  130. package/lib/types/debug-report.d.ts.map +1 -1
  131. package/lib/types/fetch-route-intercept.d.ts +66 -8
  132. package/lib/types/fetch-route-intercept.d.ts.map +1 -1
  133. package/lib/types/index.d.ts +9 -2
  134. package/lib/types/index.d.ts.map +1 -1
  135. package/lib/types/intercept.d.ts +72 -10
  136. package/lib/types/intercept.d.ts.map +1 -1
  137. package/lib/types/merge-streams.d.ts +79 -1
  138. package/lib/types/merge-streams.d.ts.map +1 -1
  139. package/lib/types/plugin-route-intercept.d.ts +25 -9
  140. package/lib/types/plugin-route-intercept.d.ts.map +1 -1
  141. package/lib/types/relay-access.d.ts +3 -1
  142. package/lib/types/relay-access.d.ts.map +1 -1
  143. package/lib/types/relay-client.d.ts +23 -2
  144. package/lib/types/relay-client.d.ts.map +1 -1
  145. package/lib/types/relay-pool.d.ts +148 -0
  146. package/lib/types/relay-pool.d.ts.map +1 -0
  147. package/lib/types/relay-server.d.ts +30 -3
  148. package/lib/types/relay-server.d.ts.map +1 -1
  149. package/lib/types/restart-fields.d.ts +5 -5
  150. package/lib/types/restart-fields.d.ts.map +1 -1
  151. package/lib/types/share-store.d.ts.map +1 -1
  152. package/lib/types/state-store.d.ts +179 -0
  153. package/lib/types/state-store.d.ts.map +1 -0
  154. package/lib/types/upload-limits.d.ts +15 -0
  155. package/lib/types/upload-limits.d.ts.map +1 -1
  156. package/lib/types/virtual-id.d.ts +21 -0
  157. package/lib/types/virtual-id.d.ts.map +1 -1
  158. package/lib/types/wizard/probe.d.ts.map +1 -1
  159. package/lib/types/wizard/proxy-snippets.d.ts +3 -0
  160. package/lib/types/wizard/proxy-snippets.d.ts.map +1 -1
  161. package/lib/types/wizard/routes.d.ts +1 -0
  162. package/lib/types/wizard/routes.d.ts.map +1 -1
  163. package/lib/types/wizard/status.d.ts +9 -0
  164. package/lib/types/wizard/status.d.ts.map +1 -1
  165. package/lib/types/wizard/verify.d.ts +3 -0
  166. package/lib/types/wizard/verify.d.ts.map +1 -1
  167. package/lib/upload-limits.js +15 -0
  168. package/lib/upload-limits.js.map +1 -1
  169. package/lib/virtual-id.js +60 -0
  170. package/lib/virtual-id.js.map +1 -1
  171. package/lib/wizard/probe.js +46 -1
  172. package/lib/wizard/probe.js.map +1 -1
  173. package/lib/wizard/proxy-snippets.js +14 -1
  174. package/lib/wizard/proxy-snippets.js.map +1 -1
  175. package/lib/wizard/routes.js +23 -4
  176. package/lib/wizard/routes.js.map +1 -1
  177. package/lib/wizard/status.js +21 -0
  178. package/lib/wizard/status.js.map +1 -1
  179. package/lib/wizard/verify.js +31 -8
  180. package/lib/wizard/verify.js.map +1 -1
  181. package/package.json +8 -4
  182. package/pwa/icons/badge-96.png +0 -0
  183. package/pwa/icons/badge.svg +1 -0
  184. package/pwa/manifest.json +2 -1
  185. package/pwa/sw.js +3 -1
  186. package/scripts/check-debug-report.mjs +41 -1
  187. package/scripts/check-settings-form.mjs +14 -3
  188. package/scripts/check-settings-view.mjs +247 -0
  189. package/scripts/check-wizard-ui.mjs +37 -0
  190. package/src/adapters/dsh-better-sidebar/index.ts +7 -3
  191. package/src/admin-routes.ts +10 -2
  192. package/src/cli/args.ts +289 -0
  193. package/src/cli/bootstrap.ts +569 -0
  194. package/src/cli/command-setup.ts +540 -0
  195. package/src/cli/commands-client.ts +369 -0
  196. package/src/cli/commands-host.ts +1127 -0
  197. package/src/cli/commands-status.ts +296 -0
  198. package/src/cli/config-writer.ts +354 -0
  199. package/src/cli/context.ts +38 -0
  200. package/src/cli/i18n.ts +645 -0
  201. package/src/cli/ipc-client.ts +216 -0
  202. package/src/cli/ipc-server.ts +531 -0
  203. package/src/cli/main.ts +285 -0
  204. package/src/cli/qr-terminal.ts +49 -0
  205. package/src/client/RemoteStatusIcon.tsx +4 -1
  206. package/src/client/current-session-report.ts +28 -4
  207. package/src/client/effects/model-group-side.ts +19 -5
  208. package/src/client/effects/remote-session.ts +26 -6
  209. package/src/client/locales.ts +96 -6
  210. package/src/client/settings/SettingsSection.tsx +287 -92
  211. package/src/client/settings/settings-css.ts +18 -0
  212. package/src/client/styles/remote-session.css.ts +15 -1
  213. package/src/client/wizard/GatewayWizard.tsx +470 -109
  214. package/src/client/wizard/cards/ProxyCard.tsx +2 -1
  215. package/src/client/wizard/wizard-css.ts +23 -0
  216. package/src/client-data/model-group-side.ts +37 -10
  217. package/src/client-data/remote-status.ts +112 -17
  218. package/src/client-data/settings-form.ts +164 -8
  219. package/src/client-data/wizard.ts +112 -2
  220. package/src/client-routes.ts +334 -26
  221. package/src/config.ts +62 -16
  222. package/src/debug-report.ts +27 -1
  223. package/src/fetch-route-intercept.ts +381 -32
  224. package/src/index.ts +575 -370
  225. package/src/intercept.ts +1866 -286
  226. package/src/merge-streams.ts +155 -10
  227. package/src/plugin-route-intercept.ts +120 -71
  228. package/src/relay-access.ts +14 -3
  229. package/src/relay-client.ts +163 -5
  230. package/src/relay-pool.ts +387 -0
  231. package/src/relay-server.ts +312 -16
  232. package/src/restart-fields.ts +6 -4
  233. package/src/share-store.ts +59 -26
  234. package/src/state-store.ts +428 -0
  235. package/src/upload-limits.ts +16 -0
  236. package/src/virtual-id.ts +57 -0
  237. package/src/wizard/probe.ts +54 -2
  238. package/src/wizard/proxy-snippets.ts +17 -2
  239. package/src/wizard/routes.ts +24 -5
  240. package/src/wizard/status.ts +28 -0
  241. package/src/wizard/verify.ts +33 -11
  242. package/AGENTS.md +0 -185
  243. package/docs/adr/0001-plugin-bridge-forwards-plugin-routes.md +0 -15
  244. package/docs/adr/0002-relay-emulates-websocket.md +0 -8
@@ -0,0 +1,484 @@
1
+ /**
2
+ * CLI-5: the `setup` end-to-end wizard — the web three-step wizard
3
+ * (`GatewayWizard.tsx`) rendered onto a terminal, in one interactive /
4
+ * parametric state machine: command-line-provided answers are taken as-is,
5
+ * missing ones are asked in a TTY run and raise MissingRequiredOptionError
6
+ * in a `--yes` / headless run.
7
+ *
8
+ * Preflight (SPEC §4) runs FIRST and always: discover the plugin's IPC
9
+ * socket — when nothing live answers (or `--profile` was given explicitly)
10
+ * the multi-select profile install runs, then `ensureDshRunning` brings a
11
+ * DSH up (daemon trigger + bounded poll). Everything after that goes through
12
+ * THAT live IPC client.
13
+ *
14
+ * Step 1 is the role. Switching mirrors GatewayWizard.tsx's discipline
15
+ * exactly: host → client stops the managed Caddy / Cloudflare tunnel through
16
+ * their IPC stop routes BEFORE writing `role: 'client'`, then polls ping
17
+ * until `connects`; client → host writes `role: 'host'` and polls until
18
+ * `serves` (the row reloads under the CLI — the hot-swap socket never
19
+ * drops).
20
+ *
21
+ * Steps 2 & 3 are NOT reimplementations: the host branch drives
22
+ * `runHostIngressStartCommand` / `runHostIngressVerifyCommand` (mode
23
+ * switch cleanup, snippets, three lights, QR) and the client branch drives
24
+ * `runClientPairCommand` / `runClientUnpairCommand` (claim, handshake lights,
25
+ * removal) — the same code `host *` / `client *` use, over a synthesized
26
+ * argv. `setup`'s own additions are only the flow around them: the
27
+ * keep-current-config choice, the two-question recommendation funnel, the
28
+ * retry menu after a failed verification, the desktop-client pairing
29
+ * follow-up, and the paired-host management menu.
30
+ */
31
+ import { parseCliArgs } from './args.js';
32
+ import { ensureDshRunning, ensurePluginInstalled, MissingRequiredOptionError } from './bootstrap.js';
33
+ import { discoverCliSockets } from './ipc-client.js';
34
+ import { CLI_PROTOCOL_VERSION } from './ipc-server.js';
35
+ import { fetchBody, plainOf, serverLineText } from './commands-status.js';
36
+ import { runHostDevicePairCommand, runHostIngressStartCommand, runHostIngressVerifyCommand, writeConfigOrReport, } from './commands-host.js';
37
+ import { runClientPairCommand, runClientUnpairCommand } from './commands-client.js';
38
+ import { WIZARD_STATUS_ROUTE, WIZARD_CADDY_STOP_ROUTE, WIZARD_TUNNEL_STOP_ROUTE } from '../wizard/routes.js';
39
+ import { CLIENT_STATUS_ROUTE } from '../client-routes.js';
40
+ const INGRESS_MODES = ['caddy', 'cloudflared', 'external', 'lan'];
41
+ /** The role-switch ping poll: frequent by default, tests shrink it. */
42
+ const ROLE_POLL_INTERVAL_DEFAULT_MS = 300;
43
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
44
+ // ===========================================================================
45
+ // Small helpers
46
+ // ===========================================================================
47
+ /** A command context for one of the driven subcommands: same translator,
48
+ * interactivity, prompter and seams, fresh args from a synthesized argv. */
49
+ function commandCtx(ctx, argv, ipc) {
50
+ return {
51
+ args: parseCliArgs(argv),
52
+ ipc,
53
+ t: ctx.t,
54
+ interactive: ctx.interactive,
55
+ ...(ctx.prompter === undefined ? {} : { prompter: ctx.prompter }),
56
+ stdout: ctx.stdout,
57
+ ...(ctx.now === undefined ? {} : { now: ctx.now }),
58
+ ...(ctx.cwd === undefined ? {} : { cwd: ctx.cwd }),
59
+ ...(ctx.pollIntervalMs === undefined ? {} : { pollIntervalMs: ctx.pollIntervalMs }),
60
+ ...(ctx.abortSignal === undefined ? {} : { abortSignal: ctx.abortSignal }),
61
+ };
62
+ }
63
+ /** The user's setup options, re-issued as argv for the driven subcommands —
64
+ * the inner flows read the SAME values (`--domain`, `--cf-token`,
65
+ * `--no-wait`, …) they would have read from a direct `host` / `client`
66
+ * invocation. */
67
+ function carryOptionArgs(options) {
68
+ const argv = [];
69
+ if (options.wait !== 20)
70
+ argv.push('--wait', String(options.wait));
71
+ if (options.noWait)
72
+ argv.push('--no-wait');
73
+ if (options.domain !== undefined)
74
+ argv.push('--domain', options.domain);
75
+ if (options.cfToken !== undefined)
76
+ argv.push('--cf-token', options.cfToken);
77
+ if (options.email !== undefined)
78
+ argv.push('--email', options.email);
79
+ if (options.httpsPort !== undefined)
80
+ argv.push('--https-port', String(options.httpsPort));
81
+ if (options.publicUrl !== undefined)
82
+ argv.push('--public-url', options.publicUrl);
83
+ if (options.tunnelId !== undefined)
84
+ argv.push('--tunnel-id', options.tunnelId);
85
+ if (options.proxy !== undefined)
86
+ argv.push('--proxy', options.proxy);
87
+ if (options.hostUrl !== undefined)
88
+ argv.push('--host-url', options.hostUrl);
89
+ if (options.code !== undefined)
90
+ argv.push('--code', options.code);
91
+ if (options.name !== undefined)
92
+ argv.push('--name', options.name);
93
+ return argv;
94
+ }
95
+ /** The pool rows of a client/status answer, defensively filtered. */
96
+ function serversOfRow(body) {
97
+ const rows = body === null ? [] : Array.isArray(body.servers) ? body.servers : [];
98
+ return rows
99
+ .map((row) => plainOf(row))
100
+ .filter((row) => row !== null);
101
+ }
102
+ function poolMaxOf(body) {
103
+ return typeof body?.maxServers === 'number' ? body.maxServers : 8;
104
+ }
105
+ function textOf(row, field) {
106
+ const value = row?.[field];
107
+ return typeof value === 'string' ? value : '';
108
+ }
109
+ // ===========================================================================
110
+ // Preflight: install + launch
111
+ // ===========================================================================
112
+ /**
113
+ * SPEC §4: discovery first; install (multi-select / `--profile`) only when
114
+ * nothing live answers or `--profile` was given; then bring DSH up and hand
115
+ * back the live IPC client plus its first ping. All failures print their own
116
+ * bilingual guidance and come back as `undefined`.
117
+ */
118
+ async function preflight(ctx) {
119
+ const { t, args } = ctx;
120
+ const out = ctx.stdout;
121
+ const options = args.options;
122
+ const discover = ctx.discover ?? discoverCliSockets;
123
+ const discoverOptions = {
124
+ dshHome: ctx.dshHome,
125
+ ...(options.socket === undefined ? {} : { explicitSocket: options.socket }),
126
+ platform: ctx.platform ?? process.platform,
127
+ };
128
+ const first = await discover(discoverOptions);
129
+ if (first.live.length === 0 && first.versionMismatch.length > 0) {
130
+ const mismatched = first.versionMismatch[0];
131
+ out.write(`${t('err.protocolVersion', {
132
+ found: String(mismatched?.cliProtocolVersion ?? '?'),
133
+ expected: CLI_PROTOCOL_VERSION,
134
+ })}\n`);
135
+ return undefined;
136
+ }
137
+ // The profile the install decided on feeds the launch: with no daemon to
138
+ // auto-start, the manual guidance must name the profile the user actually
139
+ // picked, not the synthesized `web` default.
140
+ let preferredProfile = 'web';
141
+ if (first.live.length === 0 || options.profile !== undefined) {
142
+ const install = await ensurePluginInstalled({
143
+ dshHome: ctx.dshHome,
144
+ ...(options.profile === undefined ? {} : { profileFlag: options.profile }),
145
+ interactive: ctx.interactive,
146
+ ...(ctx.prompter === undefined ? {} : { prompter: ctx.prompter }),
147
+ ...(ctx.spawnCommand === undefined ? {} : { spawnCommand: ctx.spawnCommand }),
148
+ stdout: out,
149
+ t,
150
+ });
151
+ if (!install.ok)
152
+ return undefined;
153
+ if (install.preferredProfile !== undefined)
154
+ preferredProfile = install.preferredProfile;
155
+ }
156
+ const up = await ensureDshRunning({
157
+ dshHome: ctx.dshHome,
158
+ preferredProfile,
159
+ waitSeconds: options.wait,
160
+ ...(options.socket === undefined ? {} : { explicitSocket: options.socket }),
161
+ ...(ctx.platform === undefined ? {} : { platform: ctx.platform }),
162
+ ...(ctx.uid === undefined ? {} : { uid: ctx.uid }),
163
+ ...(ctx.execProbe === undefined ? {} : { execProbe: ctx.execProbe }),
164
+ discover,
165
+ ...(ctx.macosAppPath === undefined ? {} : { macosAppPath: ctx.macosAppPath }),
166
+ ...(ctx.systemUnitDir === undefined ? {} : { systemUnitDir: ctx.systemUnitDir }),
167
+ stdout: out,
168
+ t,
169
+ });
170
+ if (!up.started)
171
+ return undefined;
172
+ return { ipc: up.client, ping: up.ping };
173
+ }
174
+ // ===========================================================================
175
+ // Step 1: the role
176
+ // ===========================================================================
177
+ function printStepHeader(ctx, titleKey) {
178
+ const { t, stdout } = ctx;
179
+ stdout.write(`\n${t('setup.divider')}\n${t(titleKey)}\n${t('setup.divider')}\n`);
180
+ }
181
+ /** Resolve the target role: the flag wins (peer / garbage answered with the
182
+ * bilingual refusal), an interactive run asks with the current role
183
+ * highlighted, a headless run fails fast on the missing option. */
184
+ async function resolveTargetRole(ctx, ping) {
185
+ const { t, args } = ctx;
186
+ const requested = args.options.role;
187
+ if (requested === 'host' || requested === 'client')
188
+ return requested;
189
+ if (requested !== undefined) {
190
+ const message = requested === 'peer'
191
+ ? t('err.role.peerNotEnabled')
192
+ : t('err.role.invalid', { value: requested });
193
+ ctx.stdout.write(`${message}\n`);
194
+ return undefined;
195
+ }
196
+ if (ctx.interactive && ctx.prompter !== undefined) {
197
+ printStepHeader(ctx, 'setup.step1Title');
198
+ const picked = await ctx.prompter.selectOne(t('setup.roleQuestion'), [t('setup.roleHost'), t('setup.roleClient')], ping.role === 'client' ? 1 : 0);
199
+ return picked === 1 ? 'client' : 'host';
200
+ }
201
+ throw new MissingRequiredOptionError('role');
202
+ }
203
+ // ===========================================================================
204
+ // Steps 2 & 3, host branch
205
+ // ===========================================================================
206
+ /** The four modes' label keys, in INGRESS_MODES order. */
207
+ const MODE_LABEL_KEYS = {
208
+ caddy: 'setup.ingressCaddy',
209
+ cloudflared: 'setup.ingressCloudflared',
210
+ external: 'setup.ingressExternal',
211
+ lan: 'setup.ingressLan',
212
+ };
213
+ /** The two-question funnel: public IP + Cloudflare-hosted domain map onto
214
+ * the four modes (caddy needs both; cloudflared replaces the public IP;
215
+ * external takes a public IP with the proxy the user already owns; lan
216
+ * covers everything else). */
217
+ function recommendMode(publicIp, onCloudflare) {
218
+ if (onCloudflare)
219
+ return publicIp ? 'caddy' : 'cloudflared';
220
+ return publicIp ? 'external' : 'lan';
221
+ }
222
+ async function runHostBranch(ctx, ipc) {
223
+ const { t, args } = ctx;
224
+ const out = ctx.stdout;
225
+ const options = args.options;
226
+ // Step 2: the ingress mode. Explicit --ingress/--mode wins; otherwise the
227
+ // current effective config offers "keep and verify" as choice 0 (in a
228
+ // headless run that keep IS the answer — re-running setup on a configured
229
+ // host must not blow away the working ingress).
230
+ printStepHeader(ctx, 'setup.step2HostTitle');
231
+ const wizard = await fetchBody(() => ipc.request('GET', WIZARD_STATUS_ROUTE));
232
+ const hasIngress = (textOf(wizard, 'mode') !== '' && textOf(wizard, 'mode') !== 'off')
233
+ || textOf(wizard, 'publicUrl') !== '';
234
+ let mode = options.ingress ?? options.mode;
235
+ let keep = false;
236
+ if (mode === undefined) {
237
+ if (ctx.interactive && ctx.prompter !== undefined) {
238
+ const values = [];
239
+ const labels = [];
240
+ if (hasIngress) {
241
+ values.push('keep');
242
+ labels.push(t('setup.ingressKeep'));
243
+ }
244
+ for (const ingressMode of INGRESS_MODES) {
245
+ values.push(ingressMode);
246
+ labels.push(t(MODE_LABEL_KEYS[ingressMode]));
247
+ }
248
+ values.push('recommend');
249
+ labels.push(t('setup.ingressRecommend'));
250
+ const picked = await ctx.prompter.selectOne(t('setup.ingressQuestion'), labels, 0);
251
+ const value = values[picked];
252
+ if (value === 'keep')
253
+ keep = true;
254
+ else if (value === 'recommend') {
255
+ const publicIp = await ctx.prompter.confirm(t('setup.recommend.publicIp'), false);
256
+ const onCloudflare = await ctx.prompter.confirm(t('setup.recommend.cfDomain'), false);
257
+ mode = recommendMode(publicIp, onCloudflare);
258
+ out.write(`${t('setup.recommend.result', { mode })}\n`);
259
+ }
260
+ else {
261
+ mode = value;
262
+ }
263
+ }
264
+ else if (hasIngress) {
265
+ keep = true;
266
+ }
267
+ else {
268
+ throw new MissingRequiredOptionError('mode');
269
+ }
270
+ }
271
+ if (!keep && mode !== undefined) {
272
+ const startCode = await runHostIngressStartCommand(commandCtx(ctx, ['host', 'ingress', 'start', '--mode', mode, ...carryOptionArgs(options)], ipc));
273
+ if (startCode !== 0)
274
+ return startCode;
275
+ }
276
+ // Step 3: the three-light verification, with the interactive retry menu
277
+ // when the first two lights fail (a headless run just reports).
278
+ printStepHeader(ctx, 'setup.step3HostTitle');
279
+ while (true) {
280
+ const verifyCode = await runHostIngressVerifyCommand(commandCtx(ctx, ['host', 'ingress', 'verify', ...carryOptionArgs(options)], ipc));
281
+ if (verifyCode === 0)
282
+ break;
283
+ if (!ctx.interactive || ctx.prompter === undefined)
284
+ return verifyCode;
285
+ const picked = await ctx.prompter.selectOne(t('setup.verifyFailedOptions'), [t('setup.verifyRetry'), t('setup.verifyKeepExit')], 0);
286
+ if (picked !== 0)
287
+ return verifyCode;
288
+ }
289
+ // The desktop-client follow-up: one confirm, one minted desktop code.
290
+ if (ctx.interactive && ctx.prompter !== undefined && !options.noWait) {
291
+ if (await ctx.prompter.confirm(t('setup.desktopPairQuestion'), false)) {
292
+ await runHostDevicePairCommand(commandCtx(ctx, ['host', 'device', 'pair', '--device-role', 'desktop-client'], ipc));
293
+ }
294
+ }
295
+ // Completion summary: the wizard status as it stands NOW.
296
+ const settled = await fetchBody(() => ipc.request('GET', WIZARD_STATUS_ROUTE));
297
+ const settledMode = textOf(settled, 'mode') === '' ? 'off' : textOf(settled, 'mode');
298
+ const settledUrl = textOf(settled, 'publicUrl');
299
+ out.write(`\n${t('setup.divider')}\n`);
300
+ out.write(`${t('setup.summary.title')}\n`);
301
+ out.write(`${t('setup.summary.role', { role: 'host' })}\n`);
302
+ out.write(`${t('setup.summary.ingress', { mode: settledMode, publicUrl: settledUrl === '' ? '—' : settledUrl })}\n`);
303
+ out.write(`${t('setup.summary.hint')}\n`);
304
+ out.write(`${t('setup.divider')}\n`);
305
+ return 0;
306
+ }
307
+ // ===========================================================================
308
+ // Steps 2 & 3, client branch
309
+ // ===========================================================================
310
+ function printClientList(ctx, servers, max) {
311
+ const { t } = ctx;
312
+ ctx.stdout.write(`${t('clientList.header', { count: servers.length, max })}\n`);
313
+ if (servers.length >= max)
314
+ ctx.stdout.write(` ${t('client.limitReached')}\n`);
315
+ for (const row of servers)
316
+ ctx.stdout.write(` ${serverLineText(t, row)}\n`);
317
+ }
318
+ async function runClientBranch(ctx, ipc) {
319
+ const { t, args } = ctx;
320
+ const out = ctx.stdout;
321
+ const options = args.options;
322
+ printStepHeader(ctx, 'setup.step2ClientTitle');
323
+ // Command-line pairing answers short-circuit the menu entirely. The address
324
+ // may come as the positional (`setup <hostUrl>`) or the flag — the flag
325
+ // wins when both appear.
326
+ const hostUrl = options.hostUrl ?? args.target;
327
+ const providedPair = hostUrl !== undefined && options.code !== undefined;
328
+ const pairArgv = ['client', 'pair', ...carryOptionArgs(options)];
329
+ if (options.hostUrl === undefined && hostUrl !== undefined)
330
+ pairArgv.push('--host-url', hostUrl);
331
+ // The straight-into-pairing rule (N === 0) describes the ENTRY state; after
332
+ // a menu action the menu itself is the place to be — exiting stays the
333
+ // user's explicit choice, never an uninvited question flow.
334
+ let firstLap = true;
335
+ while (true) {
336
+ const status = await fetchBody(() => ipc.request('GET', CLIENT_STATUS_ROUTE));
337
+ const servers = serversOfRow(status);
338
+ const max = poolMaxOf(status);
339
+ // N === 0 on entry (or a fully parametric pair): straight into pairing.
340
+ if (providedPair || (firstLap && servers.length === 0)) {
341
+ const pairCode = await runClientPairCommand(commandCtx(ctx, pairArgv, ipc));
342
+ if (pairCode !== 0)
343
+ return pairCode;
344
+ if (ctx.interactive && ctx.prompter !== undefined) {
345
+ if (await ctx.prompter.confirm(t('client.addAnother'), false)) {
346
+ firstLap = false;
347
+ continue;
348
+ }
349
+ }
350
+ break;
351
+ }
352
+ firstLap = false;
353
+ printClientList(ctx, servers, max);
354
+ // N > 0 headless (no answers, nothing to do): show the list and finish.
355
+ if (!ctx.interactive || ctx.prompter === undefined)
356
+ break;
357
+ // The menu: an empty pool (everything was removed) offers add + done; a
358
+ // full pool (8/8) tops with repair / remove per SPEC; otherwise the
359
+ // four-way menu with add as the default first choice.
360
+ const atLimit = servers.length >= max;
361
+ const values = servers.length === 0 ? ['add', 'done'] : atLimit ? ['repair', 'remove', 'done'] : ['add', 'repair', 'remove', 'done'];
362
+ const labelKeys = servers.length === 0
363
+ ? ['client.menuAdd', 'client.menuDone']
364
+ : atLimit
365
+ ? ['client.menuRepair', 'client.menuRemove', 'client.menuDone']
366
+ : ['client.menuAdd', 'client.menuRepair', 'client.menuRemove', 'client.menuDone'];
367
+ const labels = labelKeys.map((key) => t(key));
368
+ const picked = await ctx.prompter.selectOne(t('client.menuTitle'), labels, 0);
369
+ const value = values[picked] ?? 'done';
370
+ if (value === 'done')
371
+ break;
372
+ if (value === 'add') {
373
+ const pairCode = await runClientPairCommand(commandCtx(ctx, pairArgv, ipc));
374
+ if (pairCode !== 0)
375
+ return pairCode;
376
+ // One more only while the pool still has room — at 8/8 the menu's
377
+ // limit branch takes over on the next lap anyway.
378
+ if (servers.length + 1 < max && ctx.interactive && ctx.prompter !== undefined) {
379
+ if (!(await ctx.prompter.confirm(t('client.addAnother'), false)))
380
+ break;
381
+ }
382
+ continue;
383
+ }
384
+ if (value === 'repair') {
385
+ const rowIndex = await ctx.prompter.selectOne(t('setup.clientRepairQuestion'), servers.map((row) => serverLineText(t, row)), 0);
386
+ const row = servers[rowIndex];
387
+ const repairUrl = textOf(row, 'serverUrl');
388
+ if (repairUrl === '')
389
+ continue;
390
+ const repairCode = await runClientPairCommand(commandCtx(ctx, [...pairArgv, '--host-url', repairUrl], ipc));
391
+ if (repairCode !== 0)
392
+ return repairCode;
393
+ continue;
394
+ }
395
+ // remove
396
+ const removeCode = await runClientUnpairCommand(commandCtx(ctx, ['client', 'unpair'], ipc));
397
+ if (removeCode !== 0)
398
+ return removeCode;
399
+ }
400
+ // Completion summary: the pool as it stands NOW.
401
+ const settled = await fetchBody(() => ipc.request('GET', CLIENT_STATUS_ROUTE));
402
+ const settledServers = serversOfRow(settled);
403
+ out.write(`\n${ctx.t('setup.divider')}\n`);
404
+ out.write(`${ctx.t('setup.summary.title')}\n`);
405
+ out.write(`${ctx.t('setup.summary.role', { role: 'client' })}\n`);
406
+ out.write(`${ctx.t('setup.summary.client', { count: settledServers.length, max: poolMaxOf(settled) })}\n`);
407
+ out.write(`${ctx.t('setup.summary.hint')}\n`);
408
+ out.write(`${ctx.t('setup.divider')}\n`);
409
+ return 0;
410
+ }
411
+ // ===========================================================================
412
+ // The whole wizard
413
+ // ===========================================================================
414
+ /**
415
+ * `dsh-zen-remote setup` — preflight, step 1 (role + switch sync), then the
416
+ * role's steps 2 & 3. Missing required answers in a headless run throw
417
+ * MissingRequiredOptionError for the entry point to render.
418
+ */
419
+ export async function runSetupCommand(ctx) {
420
+ const up = await preflight(ctx);
421
+ if (up === undefined)
422
+ return 1;
423
+ const { ipc } = up;
424
+ const { t } = ctx;
425
+ const waitSeconds = Math.max(1, ctx.args.options.wait);
426
+ const target = await resolveTargetRole(ctx, up.ping);
427
+ if (target === undefined)
428
+ return 1;
429
+ // Step 1's switch sync (GatewayWizard.tsx's discipline): the managed
430
+ // ingress processes belong to the outgoing role and are stopped before
431
+ // the config write; the polls ride out the restart-watcher reload over
432
+ // the hot-swap socket.
433
+ const pollUntil = async (want) => {
434
+ const interval = ctx.pollIntervalMs ?? ROLE_POLL_INTERVAL_DEFAULT_MS;
435
+ const deadline = Date.now() + waitSeconds * 1000;
436
+ while (true) {
437
+ try {
438
+ const current = await ipc.ping();
439
+ if (want(current))
440
+ return true;
441
+ }
442
+ catch {
443
+ // A reload window can drop one ping — the deadline decides.
444
+ }
445
+ if (Date.now() >= deadline)
446
+ return false;
447
+ await sleep(interval);
448
+ }
449
+ };
450
+ if (target === 'host') {
451
+ if (!up.ping.serves) {
452
+ ctx.stdout.write(`${t('setup.switchingToHost')}\n`);
453
+ if (!(await writeConfigOrReport(commandCtx(ctx, ['status'], ipc), { role: 'host' })))
454
+ return 1;
455
+ if (!(await pollUntil((ping) => ping.serves === true))) {
456
+ ctx.stdout.write(`${t('setup.roleSwitchTimeout', { seconds: waitSeconds })}\n`);
457
+ return 1;
458
+ }
459
+ }
460
+ return await runHostBranch(ctx, ipc);
461
+ }
462
+ if (up.ping.serves) {
463
+ ctx.stdout.write(`${t('setup.switchingToClient')}\n`);
464
+ // Best-effort stops: a refused stop must not block the role switch.
465
+ try {
466
+ await ipc.request('POST', WIZARD_CADDY_STOP_ROUTE);
467
+ }
468
+ catch { /* transport error — the stop route is gone with the process */ }
469
+ try {
470
+ await ipc.request('POST', WIZARD_TUNNEL_STOP_ROUTE);
471
+ }
472
+ catch { /* same */ }
473
+ }
474
+ if (up.ping.role !== 'client') {
475
+ if (!(await writeConfigOrReport(commandCtx(ctx, ['status'], ipc), { role: 'client' })))
476
+ return 1;
477
+ if (!(await pollUntil((ping) => ping.connects === true))) {
478
+ ctx.stdout.write(`${t('setup.roleSwitchTimeout', { seconds: waitSeconds })}\n`);
479
+ return 1;
480
+ }
481
+ }
482
+ return await runClientBranch(ctx, ipc);
483
+ }
484
+ //# sourceMappingURL=command-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-setup.js","sourceRoot":"","sources":["../../src/cli/command-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAEpG,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAItD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEzE,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAgCzD,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,CAAU,CAAA;AAE1E,uEAAuE;AACvE,MAAM,6BAA6B,GAAG,GAAG,CAAA;AAEzC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAE9F,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;4EAC4E;AAC5E,SAAS,UAAU,CAAC,GAAwB,EAAE,IAAc,EAAE,GAAiB;IAC7E,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;QACxB,GAAG;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjE,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC;QACnF,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;KAC3E,CAAA;AACH,CAAC;AAED;;;iBAGiB;AACjB,SAAS,eAAe,CAAC,OAAmB;IAC1C,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,IAAI,OAAO,CAAC,IAAI,KAAK,EAAE;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAClE,IAAI,OAAO,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACvE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3E,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IACpE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;IACzF,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACjF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9E,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IACpE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3E,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACjE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACjE,OAAO,IAAI,CAAA;AACb,CAAC;AAED,qEAAqE;AACrE,SAAS,YAAY,CAAC,IAAsB;IAC1C,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;IACjF,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SAC1B,MAAM,CAAC,CAAC,GAAG,EAAoB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,IAAsB;IACvC,OAAO,OAAO,IAAI,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,SAAS,MAAM,CAAC,GAAqB,EAAE,KAAa;IAClD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/C,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E;;;;;GAKG;AACH,KAAK,UAAU,SAAS,CAAC,GAAwB;IAC/C,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,kBAAkB,CAAA;IACnD,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3E,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;KAC3C,CAAA;IAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAA;IAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAC3C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,qBAAqB,EAAE;YACpC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,kBAAkB,IAAI,GAAG,CAAC;YACpD,QAAQ,EAAE,oBAAoB;SAC/B,CAAC,IAAI,CAAC,CAAA;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,yEAAyE;IACzE,0EAA0E;IAC1E,6CAA6C;IAC7C,IAAI,gBAAgB,GAAG,KAAK,CAAA;IAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC;YAC1C,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1E,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjE,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7E,MAAM,EAAE,GAAG;YACX,CAAC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,SAAS,CAAA;QACjC,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS;YAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAA;IACzF,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC;QAChC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,gBAAgB;QAChB,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3E,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QACpE,QAAQ;QACR,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7E,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;QAChF,MAAM,EAAE,GAAG;QACX,CAAC;KACF,CAAC,CAAA;IACF,IAAI,CAAC,EAAE,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IACjC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;AAC1C,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,eAAe,CAAC,GAAwB,EAAE,QAAgB;IACjE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IACzB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;AAClF,CAAC;AAED;;mEAEmE;AACnE,KAAK,UAAU,iBAAiB,CAAC,GAAwB,EAAE,IAAqB;IAC9E,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IACnC,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IACpE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,SAAS,KAAK,MAAM;YAClC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC;YAC9B,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QAC/C,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAA;QAChC,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClD,eAAe,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;QACxC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CACzC,CAAC,CAAC,oBAAoB,CAAC,EACvB,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAC5C,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/B,CAAA;QACD,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;IACzC,CAAC;IACD,MAAM,IAAI,0BAA0B,CAAC,MAAM,CAAC,CAAA;AAC9C,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,0DAA0D;AAC1D,MAAM,eAAe,GAA6D;IAChF,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EAAE,0BAA0B;IACvC,QAAQ,EAAE,uBAAuB;IACjC,GAAG,EAAE,kBAAkB;CACxB,CAAA;AAED;;;8BAG8B;AAC9B,SAAS,aAAa,CAAC,QAAiB,EAAE,YAAqB;IAC7D,IAAI,YAAY;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAA;IAC3D,OAAO,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAA;AACtC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAwB,EAAE,GAAiB;IACtE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAE5B,0EAA0E;IAC1E,sEAAsE;IACtE,0EAA0E;IAC1E,gDAAgD;IAChD,eAAe,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC7E,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC;WACjF,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,CAAA;IACvC,IAAI,IAAI,GAAuB,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAA;IAC9D,IAAI,IAAI,GAAG,KAAK,CAAA;IAChB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClD,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACnB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAA;YACrC,CAAC;YACD,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;gBACxB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;YAC9C,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACxB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YAClF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;YAC5B,IAAI,KAAK,KAAK,MAAM;gBAAE,IAAI,GAAG,IAAI,CAAA;iBAC5B,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE,KAAK,CAAC,CAAA;gBACjF,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE,KAAK,CAAC,CAAA;gBACrF,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBAC5C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,KAAK,CAAA;YACd,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,0BAA0B,CAAC,MAAM,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAChD,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAChG,CAAA;QACD,IAAI,SAAS,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;IACvC,CAAC;IAED,wEAAwE;IACxE,gEAAgE;IAChE,eAAe,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;IAC5C,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,MAAM,2BAA2B,CAClD,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CACjF,CAAA;QACD,IAAI,UAAU,KAAK,CAAC;YAAE,MAAK;QAC3B,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,UAAU,CAAA;QACrE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CACzC,CAAC,CAAC,2BAA2B,CAAC,EAC9B,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,CAAC,EACnD,CAAC,CACF,CAAA;QACD,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAA;IACrC,CAAC;IAED,sEAAsE;IACtE,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrE,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;YACtE,MAAM,wBAAwB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACrH,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC9E,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACpF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC/C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IACtC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC1C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;IAC3D,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAA;IACpH,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IACzC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IACpC,OAAO,CAAC,CAAA;AACV,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,SAAS,eAAe,CAAC,GAAwB,EAAE,OAA6B,EAAE,GAAW;IAC3F,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAA;IACjB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/E,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG;QAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC9E,KAAK,MAAM,GAAG,IAAI,OAAO;QAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;AAC9E,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAwB,EAAE,GAAiB;IACxE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAE5B,eAAe,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAA;IAE9C,4EAA4E;IAC5E,wEAAwE;IACxE,yBAAyB;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAA;IAC9C,MAAM,YAAY,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAA;IACxE,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;IAChE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAChG,4EAA4E;IAC5E,uEAAuE;IACvE,4DAA4D;IAC5D,IAAI,QAAQ,GAAG,IAAI,CAAA;IAEnB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAA;QAC7E,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;QACpC,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;QAE7B,wEAAwE;QACxE,IAAI,YAAY,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;YAC3E,IAAI,QAAQ,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAA;YACnC,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClD,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC9D,QAAQ,GAAG,KAAK,CAAA;oBAChB,SAAQ;gBACV,CAAC;YACH,CAAC;YACD,MAAK;QACP,CAAC;QACD,QAAQ,GAAG,KAAK,CAAA;QAEhB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;QAClC,wEAAwE;QACxE,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;YAAE,MAAK;QAEzD,wEAAwE;QACxE,oEAAoE;QACpE,sDAAsD;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAA;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;QACpI,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC;YACpC,CAAC,CAAE,CAAC,gBAAgB,EAAE,iBAAiB,CAAW;YAClD,CAAC,CAAC,OAAO;gBACP,CAAC,CAAE,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,CAAW;gBAC1E,CAAC,CAAE,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,CAAW,CAAA;QAChG,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAA;QAEtC,IAAI,KAAK,KAAK,MAAM;YAAE,MAAK;QAC3B,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;YAC3E,IAAI,QAAQ,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAA;YACnC,kEAAkE;YAClE,kDAAkD;YAClD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC9E,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,CAAC;oBAAE,MAAK;YACzE,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,CAC3C,CAAC,CAAC,4BAA4B,CAAC,EAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAC5C,CAAC,CACF,CAAA;YACD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;YAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;YAC1C,IAAI,SAAS,KAAK,EAAE;gBAAE,SAAQ;YAC9B,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAC3C,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAC7D,CAAA;YACD,IAAI,UAAU,KAAK,CAAC;gBAAE,OAAO,UAAU,CAAA;YACvC,SAAQ;QACV,CAAC;QACD,SAAS;QACT,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC3F,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAA;IACzC,CAAC;IAED,iDAAiD;IACjD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC9E,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAC5C,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC1C,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC9C,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAA;IACjE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IAC1G,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC7C,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO,CAAC,CAAA;AACV,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAwB;IAC5D,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,CAAC,CAAA;IAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAClB,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAA;IACjB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IACpD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,CAAA;IAElC,qEAAqE;IACrE,uEAAuE;IACvE,uEAAuE;IACvE,uBAAuB;IACvB,MAAM,SAAS,GAAG,KAAK,EAAE,IAAwC,EAAoB,EAAE;QACrF,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,IAAI,6BAA6B,CAAA;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,GAAG,IAAI,CAAA;QAChD,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;gBAChC,IAAI,IAAI,CAAC,OAAO,CAAC;oBAAE,OAAO,IAAI,CAAA;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,OAAO,KAAK,CAAA;YACxC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAA;QACvB,CAAC;IACH,CAAC,CAAA;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAA;YACnD,IAAI,CAAC,CAAC,MAAM,mBAAmB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAA;YAC9F,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,CAAA;gBAC/E,OAAO,CAAC,CAAA;YACV,CAAC;QACH,CAAC;QACD,OAAO,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAA;QACrD,oEAAoE;QACpE,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAA;QACpD,CAAC;QAAC,MAAM,CAAC,CAAC,+DAA+D,CAAC,CAAC;QAC3E,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;QACrD,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM,mBAAmB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAAE,OAAO,CAAC,CAAA;QAChG,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,CAAA;YAC/E,OAAO,CAAC,CAAA;QACV,CAAC;IACH,CAAC;IACD,OAAO,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC"}