patchwork-os 0.2.0-beta.6.canary.21 → 0.2.0-beta.6.canary.23

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 (41) hide show
  1. package/dist/connectorRoutes.js +384 -0
  2. package/dist/connectorRoutes.js.map +1 -1
  3. package/dist/connectors/airtable.d.ts +108 -0
  4. package/dist/connectors/airtable.js +396 -0
  5. package/dist/connectors/airtable.js.map +1 -0
  6. package/dist/connectors/connectorRegistry.js +63 -0
  7. package/dist/connectors/connectorRegistry.js.map +1 -1
  8. package/dist/connectors/elasticsearch.d.ts +141 -0
  9. package/dist/connectors/elasticsearch.js +601 -0
  10. package/dist/connectors/elasticsearch.js.map +1 -0
  11. package/dist/connectors/figma.d.ts +130 -0
  12. package/dist/connectors/figma.js +387 -0
  13. package/dist/connectors/figma.js.map +1 -0
  14. package/dist/connectors/gmail.js +9 -0
  15. package/dist/connectors/gmail.js.map +1 -1
  16. package/dist/connectors/googleDrive.d.ts +12 -0
  17. package/dist/connectors/googleDrive.js +27 -0
  18. package/dist/connectors/googleDrive.js.map +1 -1
  19. package/dist/connectors/mongodb.d.ts +139 -0
  20. package/dist/connectors/mongodb.js +455 -0
  21. package/dist/connectors/mongodb.js.map +1 -0
  22. package/dist/connectors/postgres.d.ts +127 -0
  23. package/dist/connectors/postgres.js +512 -0
  24. package/dist/connectors/postgres.js.map +1 -0
  25. package/dist/connectors/redis.d.ts +140 -0
  26. package/dist/connectors/redis.js +571 -0
  27. package/dist/connectors/redis.js.map +1 -0
  28. package/dist/connectors/sendgrid.d.ts +102 -0
  29. package/dist/connectors/sendgrid.js +423 -0
  30. package/dist/connectors/sendgrid.js.map +1 -0
  31. package/dist/connectors/twilio.d.ts +118 -0
  32. package/dist/connectors/twilio.js +475 -0
  33. package/dist/connectors/twilio.js.map +1 -0
  34. package/dist/connectors/webflow.d.ts +118 -0
  35. package/dist/connectors/webflow.js +393 -0
  36. package/dist/connectors/webflow.js.map +1 -0
  37. package/dist/recipes/tools/gmail.js +27 -5
  38. package/dist/recipes/tools/gmail.js.map +1 -1
  39. package/dist/recipes/tools/googleDrive.js +64 -0
  40. package/dist/recipes/tools/googleDrive.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,601 @@
1
+ /**
2
+ * Elasticsearch connector — read-only access to ES clusters via @elastic/elasticsearch.
3
+ *
4
+ * Auth precedence:
5
+ * 1. cloudId + apiKey (Elastic Cloud)
6
+ * 2. node + apiKey (self-hosted with API key)
7
+ * 3. node + username + password (basic auth)
8
+ *
9
+ * Tools (READ-ONLY): listIndices, describeIndex, search, count, aggregate, clusterHealth.
10
+ *
11
+ * Query guard: every search/aggregate body is walked and rejected if it contains
12
+ * `script`, `script_fields`, or `script_score` keys at any depth, or top-level
13
+ * keys outside a strict allowlist. Defense against arbitrary code execution
14
+ * via Painless scripting.
15
+ *
16
+ * Driver is loaded lazily so the bridge boots even when `@elastic/elasticsearch`
17
+ * is not installed. Use `__setEsModuleForTest` in tests to inject a stub.
18
+ */
19
+ import { BaseConnector, } from "./baseConnector.js";
20
+ import { deleteSecretJsonSync, getSecretJsonSync, storeSecretJsonSync, } from "./tokenStorage.js";
21
+ // ------------------------------------------------------------------ lazy driver
22
+ let _esModule = null;
23
+ let _esModulePromise = null;
24
+ /**
25
+ * Test hook — inject a stub `@elastic/elasticsearch` module so tests don't
26
+ * need the real driver installed. Pass `null` to reset.
27
+ */
28
+ export function __setEsModuleForTest(mod) {
29
+ _esModule = mod;
30
+ _esModulePromise = null;
31
+ }
32
+ async function loadEsModule() {
33
+ if (_esModule)
34
+ return _esModule;
35
+ if (_esModulePromise)
36
+ return _esModulePromise;
37
+ _esModulePromise = (async () => {
38
+ try {
39
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
+ // @ts-expect-error — optional peer dep; resolved at runtime
41
+ const mod = (await import("@elastic/elasticsearch"));
42
+ _esModule = mod;
43
+ return _esModule;
44
+ }
45
+ catch (err) {
46
+ throw new Error("@elastic/elasticsearch driver not installed. Run: npm install @elastic/elasticsearch");
47
+ }
48
+ })();
49
+ return _esModulePromise;
50
+ }
51
+ // ------------------------------------------------------------------ token helpers
52
+ export function loadTokens() {
53
+ // Env override for CI/headless
54
+ const node = process.env.ELASTICSEARCH_NODE;
55
+ const apiKey = process.env.ELASTICSEARCH_API_KEY;
56
+ const username = process.env.ELASTICSEARCH_USERNAME;
57
+ const password = process.env.ELASTICSEARCH_PASSWORD;
58
+ const cloudId = process.env.ELASTICSEARCH_CLOUD_ID;
59
+ if (cloudId && apiKey) {
60
+ return {
61
+ cloudId,
62
+ apiKey,
63
+ connected_at: new Date().toISOString(),
64
+ };
65
+ }
66
+ if (node && (apiKey || (username && password))) {
67
+ return {
68
+ node,
69
+ apiKey,
70
+ username,
71
+ password,
72
+ connected_at: new Date().toISOString(),
73
+ };
74
+ }
75
+ return getSecretJsonSync("elasticsearch");
76
+ }
77
+ export function saveTokens(tokens) {
78
+ storeSecretJsonSync("elasticsearch", tokens);
79
+ }
80
+ export function clearTokens() {
81
+ deleteSecretJsonSync("elasticsearch");
82
+ }
83
+ // ------------------------------------------------------------------ query guard
84
+ const ALLOWED_TOP_LEVEL_KEYS = new Set([
85
+ "query",
86
+ "aggs",
87
+ "aggregations",
88
+ "sort",
89
+ "_source",
90
+ "size",
91
+ "from",
92
+ "track_total_hits",
93
+ "highlight",
94
+ "fields",
95
+ "stored_fields",
96
+ "min_score",
97
+ "post_filter",
98
+ "search_after",
99
+ ]);
100
+ const SCRIPT_KEY_RE = /^script(_fields|_score)?$/i;
101
+ /**
102
+ * Recursive walker — returns null when safe, error string when rejected.
103
+ * Rejects any object containing keys matching `script`, `script_fields`, or
104
+ * `script_score` (case-insensitive) at any depth, including inside arrays.
105
+ */
106
+ export function isReadOnlyEsQuery(obj) {
107
+ const reason = walkForScript(obj);
108
+ if (reason)
109
+ return { ok: false, reason };
110
+ return { ok: true };
111
+ }
112
+ function walkForScript(node) {
113
+ if (node === null || node === undefined)
114
+ return null;
115
+ if (Array.isArray(node)) {
116
+ for (const item of node) {
117
+ const r = walkForScript(item);
118
+ if (r)
119
+ return r;
120
+ }
121
+ return null;
122
+ }
123
+ if (typeof node === "object") {
124
+ for (const key of Object.keys(node)) {
125
+ if (SCRIPT_KEY_RE.test(key)) {
126
+ return `Disallowed key '${key}' — scripted queries are blocked`;
127
+ }
128
+ const r = walkForScript(node[key]);
129
+ if (r)
130
+ return r;
131
+ }
132
+ }
133
+ return null;
134
+ }
135
+ /**
136
+ * Validate a full search body — checks top-level allowlist + script walker.
137
+ */
138
+ export function validateSearchBody(body) {
139
+ for (const key of Object.keys(body)) {
140
+ if (!ALLOWED_TOP_LEVEL_KEYS.has(key)) {
141
+ return { ok: false, reason: `Disallowed top-level key '${key}'` };
142
+ }
143
+ }
144
+ return isReadOnlyEsQuery(body);
145
+ }
146
+ // ------------------------------------------------------------------ size cap
147
+ const MAX_SIZE = 100;
148
+ const MAX_AGG_SIZE = 1000;
149
+ // ------------------------------------------------------------------ connector
150
+ export class ElasticsearchConnector extends BaseConnector {
151
+ providerName = "elasticsearch";
152
+ cachedTokens = null;
153
+ client = null;
154
+ getOAuthConfig() {
155
+ return null;
156
+ }
157
+ async authenticate() {
158
+ const tokens = loadTokens();
159
+ if (!tokens) {
160
+ throw new Error("Elasticsearch not connected. Set ELASTICSEARCH_NODE + (ELASTICSEARCH_API_KEY or ELASTICSEARCH_USERNAME/PASSWORD), or use ELASTICSEARCH_CLOUD_ID + ELASTICSEARCH_API_KEY.");
161
+ }
162
+ this.cachedTokens = tokens;
163
+ // Surface a sentinel token — the real "auth" lives in the ES client itself.
164
+ const tag = tokens.cloudId ?? tokens.node ?? "elasticsearch";
165
+ return { token: `es:${tag}` };
166
+ }
167
+ /**
168
+ * Build (or return cached) ES client based on stored credentials.
169
+ * Auth precedence: cloudId+apiKey > node+apiKey > node+username+password.
170
+ */
171
+ async getClient() {
172
+ if (this.client)
173
+ return this.client;
174
+ const tokens = this.cachedTokens ?? loadTokens();
175
+ if (!tokens) {
176
+ throw new Error("Elasticsearch not connected.");
177
+ }
178
+ this.cachedTokens = tokens;
179
+ const mod = await loadEsModule();
180
+ let opts;
181
+ if (tokens.cloudId && tokens.apiKey) {
182
+ opts = { cloud: { id: tokens.cloudId }, auth: { apiKey: tokens.apiKey } };
183
+ }
184
+ else if (tokens.node && tokens.apiKey) {
185
+ opts = { node: tokens.node, auth: { apiKey: tokens.apiKey } };
186
+ }
187
+ else if (tokens.node && tokens.username && tokens.password) {
188
+ opts = {
189
+ node: tokens.node,
190
+ auth: { username: tokens.username, password: tokens.password },
191
+ };
192
+ }
193
+ else {
194
+ throw new Error("Elasticsearch credentials incomplete — need cloudId+apiKey, node+apiKey, or node+username+password.");
195
+ }
196
+ this.client = new mod.Client(opts);
197
+ return this.client;
198
+ }
199
+ async disconnect() {
200
+ if (this.client) {
201
+ try {
202
+ await this.client.close();
203
+ }
204
+ catch {
205
+ /* best effort */
206
+ }
207
+ this.client = null;
208
+ }
209
+ }
210
+ async healthCheck() {
211
+ try {
212
+ const client = await this.getClient();
213
+ await client.ping();
214
+ return { ok: true };
215
+ }
216
+ catch (err) {
217
+ return { ok: false, error: this.normalizeError(err) };
218
+ }
219
+ }
220
+ normalizeError(error) {
221
+ // Elastic ResponseError carries statusCode
222
+ if (error && typeof error === "object") {
223
+ const name = error.name;
224
+ const statusCode = error.statusCode ??
225
+ error.meta?.statusCode;
226
+ if (name === "ConnectionError" || name === "TimeoutError") {
227
+ return {
228
+ code: "network_error",
229
+ message: `Cannot reach Elasticsearch: ${error.message ?? "connection error"}`,
230
+ retryable: true,
231
+ };
232
+ }
233
+ if (typeof statusCode === "number") {
234
+ if (statusCode === 401) {
235
+ return {
236
+ code: "auth_expired",
237
+ message: "Elasticsearch credentials rejected (401)",
238
+ retryable: false,
239
+ suggestedAction: "Reconnect: patchwork connect elasticsearch",
240
+ };
241
+ }
242
+ if (statusCode === 403) {
243
+ return {
244
+ code: "permission_denied",
245
+ message: "Elasticsearch user lacks permission for this resource",
246
+ retryable: false,
247
+ };
248
+ }
249
+ if (statusCode === 404) {
250
+ return {
251
+ code: "not_found",
252
+ message: "Elasticsearch index or resource not found",
253
+ retryable: false,
254
+ };
255
+ }
256
+ if (statusCode === 429) {
257
+ return {
258
+ code: "rate_limited",
259
+ message: "Elasticsearch rate-limited the request",
260
+ retryable: true,
261
+ };
262
+ }
263
+ if (statusCode >= 500) {
264
+ return {
265
+ code: "provider_error",
266
+ message: `Elasticsearch error: HTTP ${statusCode}`,
267
+ retryable: true,
268
+ };
269
+ }
270
+ }
271
+ }
272
+ if (error instanceof Error) {
273
+ if (error.message.includes("ENOTFOUND") ||
274
+ error.message.includes("ECONNREFUSED") ||
275
+ error.message.includes("ETIMEDOUT")) {
276
+ return {
277
+ code: "network_error",
278
+ message: `Cannot reach Elasticsearch: ${error.message}`,
279
+ retryable: true,
280
+ };
281
+ }
282
+ }
283
+ return {
284
+ code: "provider_error",
285
+ message: error instanceof Error ? error.message : String(error),
286
+ retryable: false,
287
+ };
288
+ }
289
+ getStatus() {
290
+ const tokens = loadTokens();
291
+ return {
292
+ id: "elasticsearch",
293
+ status: tokens ? "connected" : "disconnected",
294
+ lastSync: tokens?.connected_at,
295
+ workspace: tokens?.cloudId ?? tokens?.node,
296
+ };
297
+ }
298
+ // ---------------------------------------------------------------- read ops
299
+ async listIndices() {
300
+ const result = await this.apiCall(async () => {
301
+ const client = await this.getClient();
302
+ return client.cat.indices({
303
+ format: "json",
304
+ h: "index,docs.count,store.size,health",
305
+ });
306
+ });
307
+ if ("error" in result)
308
+ throw new Error(result.error.message);
309
+ return result.data;
310
+ }
311
+ async describeIndex(index) {
312
+ if (!index || typeof index !== "string") {
313
+ throw new Error("describeIndex: index name required");
314
+ }
315
+ const result = await this.apiCall(async () => {
316
+ const client = await this.getClient();
317
+ const [mapping, settings] = await Promise.all([
318
+ client.indices.getMapping({ index }),
319
+ client.indices.getSettings({ index }),
320
+ ]);
321
+ return { mapping, settings };
322
+ });
323
+ if ("error" in result)
324
+ throw new Error(result.error.message);
325
+ return result.data;
326
+ }
327
+ async search(index, query, size = 10, from = 0, sort, _source) {
328
+ if (!index || typeof index !== "string") {
329
+ throw new Error("search: index name required");
330
+ }
331
+ if (!query || typeof query !== "object") {
332
+ throw new Error("search: query body must be an object");
333
+ }
334
+ const guard = isReadOnlyEsQuery(query);
335
+ if (!guard.ok)
336
+ throw new Error(`search rejected: ${guard.reason}`);
337
+ if (sort) {
338
+ const g2 = isReadOnlyEsQuery(sort);
339
+ if (!g2.ok)
340
+ throw new Error(`search rejected (sort): ${g2.reason}`);
341
+ }
342
+ const cappedSize = Math.max(0, Math.min(size, MAX_SIZE));
343
+ const cappedFrom = Math.max(0, from | 0);
344
+ const body = {
345
+ query,
346
+ size: cappedSize,
347
+ from: cappedFrom,
348
+ };
349
+ if (sort !== undefined)
350
+ body.sort = sort;
351
+ if (_source !== undefined)
352
+ body._source = _source;
353
+ const result = await this.apiCall(async () => {
354
+ const client = await this.getClient();
355
+ return client.search({ index, body });
356
+ });
357
+ if ("error" in result)
358
+ throw new Error(result.error.message);
359
+ return result.data;
360
+ }
361
+ async count(index, query) {
362
+ if (!index || typeof index !== "string") {
363
+ throw new Error("count: index name required");
364
+ }
365
+ const body = {};
366
+ if (query) {
367
+ const guard = isReadOnlyEsQuery(query);
368
+ if (!guard.ok)
369
+ throw new Error(`count rejected: ${guard.reason}`);
370
+ body.query = query;
371
+ }
372
+ const result = await this.apiCall(async () => {
373
+ const client = await this.getClient();
374
+ return client.count({ index, body });
375
+ });
376
+ if ("error" in result)
377
+ throw new Error(result.error.message);
378
+ return result.data;
379
+ }
380
+ async aggregate(index, aggs, query) {
381
+ if (!index || typeof index !== "string") {
382
+ throw new Error("aggregate: index name required");
383
+ }
384
+ if (!aggs || typeof aggs !== "object") {
385
+ throw new Error("aggregate: aggs body must be an object");
386
+ }
387
+ const guard = isReadOnlyEsQuery(aggs);
388
+ if (!guard.ok)
389
+ throw new Error(`aggregate rejected: ${guard.reason}`);
390
+ if (query) {
391
+ const g2 = isReadOnlyEsQuery(query);
392
+ if (!g2.ok)
393
+ throw new Error(`aggregate rejected (query): ${g2.reason}`);
394
+ }
395
+ const body = {
396
+ aggs,
397
+ size: 0, // aggregation-only — no hits
398
+ };
399
+ if (query)
400
+ body.query = query;
401
+ const result = await this.apiCall(async () => {
402
+ const client = await this.getClient();
403
+ return client.search({ index, body });
404
+ });
405
+ if ("error" in result)
406
+ throw new Error(result.error.message);
407
+ return result.data;
408
+ }
409
+ async clusterHealth() {
410
+ const result = await this.apiCall(async () => {
411
+ const client = await this.getClient();
412
+ return client.cluster.health();
413
+ });
414
+ if ("error" in result)
415
+ throw new Error(result.error.message);
416
+ return result.data;
417
+ }
418
+ }
419
+ // ------------------------------------------------------------------ singleton
420
+ let _instance = null;
421
+ export function getElasticsearchConnector() {
422
+ if (!_instance)
423
+ _instance = new ElasticsearchConnector();
424
+ return _instance;
425
+ }
426
+ export async function resetElasticsearchConnector() {
427
+ if (_instance) {
428
+ await _instance.disconnect();
429
+ }
430
+ _instance = null;
431
+ }
432
+ // Convenience re-export
433
+ export { loadTokens as isConnected };
434
+ // Expose query-guard constants for test introspection
435
+ export const __testing = {
436
+ ALLOWED_TOP_LEVEL_KEYS,
437
+ MAX_SIZE,
438
+ MAX_AGG_SIZE,
439
+ };
440
+ /**
441
+ * POST /connections/elasticsearch/connect
442
+ * Body: { cloudId?, node?, apiKey?, username?, password? }
443
+ * Validates credential combo + pings the cluster, then stores the tokens.
444
+ */
445
+ export async function handleElasticsearchConnect(body) {
446
+ let parsed;
447
+ try {
448
+ parsed = JSON.parse(body);
449
+ }
450
+ catch {
451
+ return {
452
+ status: 400,
453
+ contentType: "application/json",
454
+ body: JSON.stringify({ ok: false, error: "Invalid JSON body" }),
455
+ };
456
+ }
457
+ const cloudId = typeof parsed.cloudId === "string" ? parsed.cloudId : undefined;
458
+ const node = typeof parsed.node === "string" ? parsed.node : undefined;
459
+ const apiKey = typeof parsed.apiKey === "string" ? parsed.apiKey : undefined;
460
+ const username = typeof parsed.username === "string" ? parsed.username : undefined;
461
+ const password = typeof parsed.password === "string" ? parsed.password : undefined;
462
+ // Validate credential combos (precedence enforced here too)
463
+ let credsOk = false;
464
+ if (cloudId && apiKey)
465
+ credsOk = true;
466
+ else if (node && apiKey)
467
+ credsOk = true;
468
+ else if (node && username && password)
469
+ credsOk = true;
470
+ if (!credsOk) {
471
+ return {
472
+ status: 400,
473
+ contentType: "application/json",
474
+ body: JSON.stringify({
475
+ ok: false,
476
+ error: "Must provide one of: (cloudId + apiKey), (node + apiKey), or (node + username + password).",
477
+ }),
478
+ };
479
+ }
480
+ // Validate node URL shape (https:// required for non-loopback)
481
+ if (node) {
482
+ try {
483
+ const u = new URL(node);
484
+ if (u.protocol !== "https:" && u.protocol !== "http:") {
485
+ return {
486
+ status: 400,
487
+ contentType: "application/json",
488
+ body: JSON.stringify({
489
+ ok: false,
490
+ error: "node must be an http(s):// URL",
491
+ }),
492
+ };
493
+ }
494
+ }
495
+ catch {
496
+ return {
497
+ status: 400,
498
+ contentType: "application/json",
499
+ body: JSON.stringify({
500
+ ok: false,
501
+ error: "node URL is malformed",
502
+ }),
503
+ };
504
+ }
505
+ }
506
+ // Persist + verify
507
+ const tokens = {
508
+ cloudId,
509
+ node,
510
+ apiKey,
511
+ username,
512
+ password,
513
+ connected_at: new Date().toISOString(),
514
+ };
515
+ saveTokens(tokens);
516
+ await resetElasticsearchConnector();
517
+ try {
518
+ const conn = getElasticsearchConnector();
519
+ const check = await conn.healthCheck();
520
+ if (!check.ok) {
521
+ // Roll back stored tokens — verification failed
522
+ clearTokens();
523
+ await resetElasticsearchConnector();
524
+ return {
525
+ status: 401,
526
+ contentType: "application/json",
527
+ body: JSON.stringify({
528
+ ok: false,
529
+ error: check.error?.message ?? "Elasticsearch ping failed",
530
+ }),
531
+ };
532
+ }
533
+ return {
534
+ status: 200,
535
+ contentType: "application/json",
536
+ body: JSON.stringify({
537
+ ok: true,
538
+ target: cloudId ?? node,
539
+ connectedAt: tokens.connected_at,
540
+ }),
541
+ };
542
+ }
543
+ catch (err) {
544
+ clearTokens();
545
+ await resetElasticsearchConnector();
546
+ return {
547
+ status: 500,
548
+ contentType: "application/json",
549
+ body: JSON.stringify({
550
+ ok: false,
551
+ error: err instanceof Error ? err.message : String(err),
552
+ }),
553
+ };
554
+ }
555
+ }
556
+ /**
557
+ * POST /connections/elasticsearch/test
558
+ * Verifies stored credentials with ping().
559
+ */
560
+ export async function handleElasticsearchTest() {
561
+ const tokens = loadTokens();
562
+ if (!tokens) {
563
+ return {
564
+ status: 400,
565
+ contentType: "application/json",
566
+ body: JSON.stringify({ ok: false, error: "Elasticsearch not connected" }),
567
+ };
568
+ }
569
+ try {
570
+ const connector = getElasticsearchConnector();
571
+ const check = await connector.healthCheck();
572
+ return {
573
+ status: check.ok ? 200 : 401,
574
+ contentType: "application/json",
575
+ body: JSON.stringify(check.ok ? { ok: true } : { ok: false, error: check.error?.message }),
576
+ };
577
+ }
578
+ catch (err) {
579
+ return {
580
+ status: 500,
581
+ contentType: "application/json",
582
+ body: JSON.stringify({
583
+ ok: false,
584
+ error: err instanceof Error ? err.message : String(err),
585
+ }),
586
+ };
587
+ }
588
+ }
589
+ /**
590
+ * DELETE /connections/elasticsearch
591
+ */
592
+ export async function handleElasticsearchDisconnect() {
593
+ clearTokens();
594
+ await resetElasticsearchConnector();
595
+ return {
596
+ status: 200,
597
+ contentType: "application/json",
598
+ body: JSON.stringify({ ok: true }),
599
+ };
600
+ }
601
+ //# sourceMappingURL=elasticsearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elasticsearch.js","sourceRoot":"","sources":["../../src/connectors/elasticsearch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAEL,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAsC3B,iFAAiF;AAEjF,IAAI,SAAS,GAAwB,IAAI,CAAC;AAC1C,IAAI,gBAAgB,GAAiC,IAAI,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAwB;IAC3D,SAAS,GAAG,GAAG,CAAC;IAChB,gBAAgB,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAC9C,gBAAgB,GAAG,CAAC,KAAK,IAAI,EAAE;QAC7B,IAAI,CAAC;YACH,8DAA8D;YAC9D,4DAA4D;YAC5D,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAQ,CAAC;YAC5D,SAAS,GAAG,GAAmB,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,mFAAmF;AAEnF,MAAM,UAAU,UAAU;IACxB,+BAA+B;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACnD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,OAAO;YACL,OAAO;YACP,MAAM;YACN,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO;YACL,IAAI;YACJ,MAAM;YACN,QAAQ;YACR,QAAQ;YACR,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC;IACJ,CAAC;IACD,OAAO,iBAAiB,CAAsB,eAAe,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAA2B;IACpD,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,oBAAoB,CAAC,eAAe,CAAC,CAAC;AACxC,CAAC;AAED,iFAAiF;AAEjF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,OAAO;IACP,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,kBAAkB;IAClB,WAAW;IACX,QAAQ;IACR,eAAe;IACf,WAAW;IACX,aAAa;IACb,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,4BAA4B,CAAC;AAEnD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAY;IAEZ,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACzC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAA+B,CAAC,EAAE,CAAC;YAC/D,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,mBAAmB,GAAG,kCAAkC,CAAC;YAClE,CAAC;YACD,MAAM,CAAC,GAAG,aAAa,CAAE,IAAgC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA6B;IAK9D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,GAAG,GAAG,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,+EAA+E;AAE/E,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IAC9C,YAAY,GAAG,eAAe,CAAC;IAC9B,YAAY,GAA+B,IAAI,CAAC;IAClD,MAAM,GAAwB,IAAI,CAAC;IAEjC,cAAc;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,0KAA0K,CAC3K,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,4EAA4E;QAC5E,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,eAAe,CAAC;QAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,CAAC;IAChC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,SAAS;QACrB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,UAAU,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,YAAY,EAAE,CAAC;QAEjC,IAAI,IAA6B,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5E,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAChE,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7D,IAAI,GAAG;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;aAC/D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,iBAAiB;YACnB,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,CAAC;IACH,CAAC;IAED,cAAc,CAAC,KAAc;QAC3B,2CAA2C;QAC3C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;YAC/C,MAAM,UAAU,GACb,KAAiC,CAAC,UAAU;gBAC5C,KAA4C,CAAC,IAAI,EAAE,UAAU,CAAC;YAEjE,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC1D,OAAO;oBACL,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,+BACN,KAA8B,CAAC,OAAO,IAAI,kBAC7C,EAAE;oBACF,SAAS,EAAE,IAAI;iBAChB,CAAC;YACJ,CAAC;YAED,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACnC,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;oBACvB,OAAO;wBACL,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,0CAA0C;wBACnD,SAAS,EAAE,KAAK;wBAChB,eAAe,EAAE,4CAA4C;qBAC9D,CAAC;gBACJ,CAAC;gBACD,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;oBACvB,OAAO;wBACL,IAAI,EAAE,mBAAmB;wBACzB,OAAO,EAAE,uDAAuD;wBAChE,SAAS,EAAE,KAAK;qBACjB,CAAC;gBACJ,CAAC;gBACD,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;oBACvB,OAAO;wBACL,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,2CAA2C;wBACpD,SAAS,EAAE,KAAK;qBACjB,CAAC;gBACJ,CAAC;gBACD,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;oBACvB,OAAO;wBACL,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,wCAAwC;wBACjD,SAAS,EAAE,IAAI;qBAChB,CAAC;gBACJ,CAAC;gBACD,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;oBACtB,OAAO;wBACL,IAAI,EAAE,gBAAgB;wBACtB,OAAO,EAAE,6BAA6B,UAAU,EAAE;wBAClD,SAAS,EAAE,IAAI;qBAChB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IACE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACnC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;gBACtC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EACnC,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,+BAA+B,KAAK,CAAC,OAAO,EAAE;oBACvD,SAAS,EAAE,IAAI;iBAChB,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/D,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,SAAS;QACP,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,OAAO;YACL,EAAE,EAAE,eAAe;YACnB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;YAC7C,QAAQ,EAAE,MAAM,EAAE,YAAY;YAC9B,SAAS,EAAE,MAAM,EAAE,OAAO,IAAI,MAAM,EAAE,IAAI;SAC3C,CAAC;IACJ,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;gBACxB,MAAM,EAAE,MAAM;gBACd,CAAC,EAAE,oCAAoC;aACxC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,KAAa;QAEb,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC5C,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC;gBACpC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC;aACtC,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,KAA8B,EAC9B,IAAI,GAAG,EAAE,EACT,IAAI,GAAG,CAAC,EACR,IAAc,EACd,OAAiB;QAEjB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,IAAI,GAA4B;YACpC,KAAK;YACL,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;SACjB,CAAC;QACF,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACzC,IAAI,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CACT,KAAa,EACb,KAA+B;QAE/B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,SAAS,CACb,KAAa,EACb,IAA6B,EAC7B,KAA+B;QAE/B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,IAAI,GAA4B;YACpC,IAAI;YACJ,IAAI,EAAE,CAAC,EAAE,6BAA6B;SACvC,CAAC;QACF,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;CACF;AAED,+EAA+E;AAE/E,IAAI,SAAS,GAAkC,IAAI,CAAC;AAEpD,MAAM,UAAU,yBAAyB;IACvC,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,sBAAsB,EAAE,CAAC;IACzD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;IACD,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED,wBAAwB;AACxB,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,CAAC;AAErC,sDAAsD;AACtD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,sBAAsB;IACtB,QAAQ;IACR,YAAY;CACb,CAAC;AAmBF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAY;IAEZ,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;SAChE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GACX,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,QAAQ,GACZ,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,MAAM,QAAQ,GACZ,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpE,4DAA4D;IAC5D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,IAAI,MAAM;QAAE,OAAO,GAAG,IAAI,CAAC;SACjC,IAAI,IAAI,IAAI,MAAM;QAAE,OAAO,GAAG,IAAI,CAAC;SACnC,IAAI,IAAI,IAAI,QAAQ,IAAI,QAAQ;QAAE,OAAO,GAAG,IAAI,CAAC;IAEtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,EAAE,EAAE,KAAK;gBACT,KAAK,EACH,4FAA4F;aAC/F,CAAC;SACH,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACtD,OAAO;oBACL,MAAM,EAAE,GAAG;oBACX,WAAW,EAAE,kBAAkB;oBAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,gCAAgC;qBACxC,CAAC;iBACH,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,WAAW,EAAE,kBAAkB;gBAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,uBAAuB;iBAC/B,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAwB;QAClC,OAAO;QACP,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACvC,CAAC;IACF,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,MAAM,2BAA2B,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,yBAAyB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YACd,gDAAgD;YAChD,WAAW,EAAE,CAAC;YACd,MAAM,2BAA2B,EAAE,CAAC;YACpC,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,WAAW,EAAE,kBAAkB;gBAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,2BAA2B;iBAC3D,CAAC;aACH,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,OAAO,IAAI,IAAI;gBACvB,WAAW,EAAE,MAAM,CAAC,YAAY;aACjC,CAAC;SACH,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,MAAM,2BAA2B,EAAE,CAAC;QACpC,OAAO;YACL,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;SACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,yBAAyB,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YAC5B,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CACrE;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;SACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B;IACjD,WAAW,EAAE,CAAC;IACd,MAAM,2BAA2B,EAAE,CAAC;IACpC,OAAO;QACL,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;KACnC,CAAC;AACJ,CAAC"}