@betterportal/auth-workos 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +18 -0
  2. package/betterportal-logo.png +0 -0
  3. package/bsb-plugin.json +23 -0
  4. package/lib/index.d.ts +2 -0
  5. package/lib/index.d.ts.map +1 -0
  6. package/lib/index.js +2 -0
  7. package/lib/index.js.map +1 -0
  8. package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.d.ts +3 -0
  9. package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.d.ts.map +1 -0
  10. package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.js +97 -0
  11. package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.js.map +1 -0
  12. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.d.ts +3 -0
  13. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.d.ts.map +1 -0
  14. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.js +3 -0
  15. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.js.map +1 -0
  16. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/GET.d.ts +5 -0
  17. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/GET.d.ts.map +1 -0
  18. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/GET.js +61 -0
  19. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/GET.js.map +1 -0
  20. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_background.monitor.GET.d.ts +5 -0
  21. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_background.monitor.GET.d.ts.map +1 -0
  22. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_background.monitor.GET.js +5 -0
  23. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_background.monitor.GET.js.map +1 -0
  24. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_nav.profile.GET.d.ts +5 -0
  25. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_nav.profile.GET.d.ts.map +1 -0
  26. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_nav.profile.GET.js +10 -0
  27. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_nav.profile.GET.js.map +1 -0
  28. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.embedded/_background.monitor.GET.d.ts +3 -0
  29. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.embedded/_background.monitor.GET.d.ts.map +1 -0
  30. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.embedded/_background.monitor.GET.js +3 -0
  31. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.embedded/_background.monitor.GET.js.map +1 -0
  32. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.d.ts +2 -0
  33. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.d.ts.map +1 -0
  34. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.js +2 -0
  35. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.js.map +1 -0
  36. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.d.ts +60 -0
  37. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.d.ts.map +1 -0
  38. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.js +154 -0
  39. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.js.map +1 -0
  40. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.d.ts +3 -0
  41. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.d.ts.map +1 -0
  42. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.js +3 -0
  43. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.js.map +1 -0
  44. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.d.ts +2 -0
  45. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.d.ts.map +1 -0
  46. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.js +2 -0
  47. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.js.map +1 -0
  48. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.d.ts +27 -0
  49. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.d.ts.map +1 -0
  50. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.js +35 -0
  51. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.js.map +1 -0
  52. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.d.ts +3 -0
  53. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.d.ts.map +1 -0
  54. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.js +3 -0
  55. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.js.map +1 -0
  56. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.d.ts +2 -0
  57. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.d.ts.map +1 -0
  58. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.js +2 -0
  59. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.js.map +1 -0
  60. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.d.ts +32 -0
  61. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.d.ts.map +1 -0
  62. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.js +78 -0
  63. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.js.map +1 -0
  64. package/lib/plugins/service-betterportal-auth-workos/index.d.ts +166 -0
  65. package/lib/plugins/service-betterportal-auth-workos/index.d.ts.map +1 -0
  66. package/lib/plugins/service-betterportal-auth-workos/index.js +575 -0
  67. package/lib/plugins/service-betterportal-auth-workos/index.js.map +1 -0
  68. package/lib/schemas/service-betterportal-auth-workos.json +138 -0
  69. package/lib/schemas/service-betterportal-auth-workos.plugin.json +151 -0
  70. package/package.json +69 -0
@@ -0,0 +1,575 @@
1
+ import { createConfigSchema, createEventSchemas } from "@bsb/base";
2
+ import * as av from "anyvali";
3
+ import { BetterPortalConfigSchema, BPService } from "@betterportal/plugin-bsb";
4
+ import { WorkOS } from "@workos-inc/node";
5
+ import { htmlResponse, jsonResponse, createBpTokenIssuer, loadOrGenerateKeyPair, publicKeyToJwk } from "@betterportal/framework";
6
+ import { resolve } from "node:path";
7
+ import { registry } from "./.bp-generated/registry.js";
8
+ const SERVICE_ID = "service.betterportal.auth.workos";
9
+ const PluginConfigSchema = av.object({
10
+ host: av.string().minLength(1).default("0.0.0.0"),
11
+ port: av.int().min(1).default(3213),
12
+ issuer: av.string().minLength(1),
13
+ audience: av.string().minLength(1).default("betterportal-runtime"),
14
+ accessTokenSeconds: av.int().min(1).default(60 * 15),
15
+ refreshTokenSeconds: av.int().min(1).default(60 * 60 * 24 * 7),
16
+ keyStorePath: av.string().minLength(1).default("./.bp-workos-state/keys.json"),
17
+ betterportal: BetterPortalConfigSchema
18
+ }, { unknownKeys: "strip" });
19
+ const Config = createConfigSchema({
20
+ name: SERVICE_ID,
21
+ description: "BetterPortal WorkOS auth service",
22
+ tags: ["betterportal", "auth", "workos"],
23
+ documentation: ["./README.md"],
24
+ image: "./betterportal-logo.png"
25
+ }, PluginConfigSchema);
26
+ const EventSchemas = createEventSchemas({
27
+ emitEvents: {},
28
+ onEvents: {},
29
+ emitReturnableEvents: {},
30
+ onReturnableEvents: {},
31
+ emitBroadcast: {},
32
+ onBroadcast: {}
33
+ });
34
+ function nonEmptyString(value) {
35
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
36
+ }
37
+ export function resolveWorkOSAppConfig(raw) {
38
+ const clientId = nonEmptyString(raw?.clientId);
39
+ const apiKey = nonEmptyString(raw?.apiKey);
40
+ if (!clientId || !apiKey)
41
+ return null;
42
+ return {
43
+ clientId,
44
+ apiKey,
45
+ provider: nonEmptyString(raw?.provider) ?? "authkit",
46
+ ...(nonEmptyString(raw?.connectionId) ? { connectionId: nonEmptyString(raw?.connectionId) } : {}),
47
+ ...(nonEmptyString(raw?.organizationId) ? { organizationId: nonEmptyString(raw?.organizationId) } : {}),
48
+ ...(nonEmptyString(raw?.domainHint) ? { domainHint: nonEmptyString(raw?.domainHint) } : {}),
49
+ ...(nonEmptyString(raw?.scopes) ? { scopes: nonEmptyString(raw?.scopes) } : {}),
50
+ ...(nonEmptyString(raw?.loginRedirectPath) ? { loginRedirectPath: nonEmptyString(raw?.loginRedirectPath) } : {}),
51
+ ...(nonEmptyString(raw?.logoutRedirectPath) ? { logoutRedirectPath: nonEmptyString(raw?.logoutRedirectPath) } : {}),
52
+ ...(nonEmptyString(raw?.roleClaimPath) ? { roleClaimPath: nonEmptyString(raw?.roleClaimPath) } : {}),
53
+ ...(nonEmptyString(raw?.webhookSecret) ? { webhookSecret: nonEmptyString(raw?.webhookSecret) } : {})
54
+ };
55
+ }
56
+ export function resolveWorkOSBrowserConfig(raw) {
57
+ const config = resolveWorkOSAppConfig(raw);
58
+ if (!config)
59
+ return null;
60
+ const { apiKey: _apiKey, ...browserConfig } = config;
61
+ return browserConfig;
62
+ }
63
+ export const WorkOSConfigSchemas = [
64
+ {
65
+ id: "workos.app",
66
+ title: "WorkOS App Config",
67
+ description: "App-scoped WorkOS AuthKit settings.",
68
+ scope: "app",
69
+ jsonSchema: {
70
+ clientId: "string",
71
+ apiKey: "string",
72
+ provider: "string",
73
+ connectionId: "string",
74
+ organizationId: "string",
75
+ domainHint: "string",
76
+ scopes: "string",
77
+ loginRedirectPath: "string",
78
+ logoutRedirectPath: "string",
79
+ roleClaimPath: "string",
80
+ webhookSecret: "string"
81
+ },
82
+ groups: [
83
+ { id: "connection", title: "Connection", description: "WorkOS AuthKit application credentials.", order: 10, optional: false },
84
+ { id: "login", title: "Login", description: "Provider routing and post-login routes.", order: 20, optional: true },
85
+ { id: "claims", title: "Claims", description: "WorkOS access-token claim paths mapped into BP roles.", order: 30, optional: true },
86
+ { id: "sync", title: "Role Sync", description: "WorkOS webhook + BP role sync settings.", order: 40, optional: true }
87
+ ],
88
+ fields: [
89
+ { key: "clientId", title: "Client ID", description: "WorkOS client ID for this BP app.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "connection", order: 10, required: true },
90
+ { key: "apiKey", title: "API Key", description: "WorkOS API key used server-side for code exchange and refresh.", scope: "app", visibility: "secret", ownership: "bp", sourceOfTruth: "bp", groupId: "connection", order: 20, required: true },
91
+ { key: "provider", title: "Provider", description: "WorkOS provider, usually authkit.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "login", order: 10, defaultValue: "authkit", required: false },
92
+ { key: "connectionId", title: "Connection ID", description: "Optional WorkOS connection to force.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "login", order: 20, required: false },
93
+ { key: "organizationId", title: "Organization ID", description: "Optional WorkOS organization to force.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "login", order: 30, required: false },
94
+ { key: "domainHint", title: "Domain Hint", description: "Optional WorkOS domain hint.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "login", order: 40, required: false },
95
+ { key: "scopes", title: "Scopes", description: "Space-separated provider scopes.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "login", order: 50, defaultValue: "openid profile email", required: false },
96
+ { key: "loginRedirectPath", title: "Logged In Route", description: "Tenant route shown after signing in when no next path is supplied.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "login", order: 60, defaultValue: "/", ui: { control: "select", optionsSource: "app.routes" }, required: false },
97
+ { key: "logoutRedirectPath", title: "Logged Out Route", description: "Tenant route shown after signing out.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "login", order: 70, defaultValue: "/", ui: { control: "select", optionsSource: "app.routes" }, required: false },
98
+ { key: "roleClaimPath", title: "Role Claim Path", description: "Dot path to roles in the WorkOS access token.", scope: "app", visibility: "protected", ownership: "bp", sourceOfTruth: "bp", groupId: "claims", order: 10, defaultValue: "roles", required: false },
99
+ { key: "webhookSecret", title: "Webhook Secret", description: "WorkOS webhook signing secret for role sync events.", scope: "app", visibility: "secret", ownership: "bp", sourceOfTruth: "bp", groupId: "sync", order: 10, required: false }
100
+ ]
101
+ }
102
+ ];
103
+ const BP_PERMISSION_PREFIX = "bp:";
104
+ const STALE_PERMISSION_PREFIX = "DEL: ";
105
+ const ROLE_EVENTS = new Set([
106
+ "role.created",
107
+ "role.updated",
108
+ "role.deleted",
109
+ "organization_role.created",
110
+ "organization_role.updated",
111
+ "organization_role.deleted"
112
+ ]);
113
+ export class Plugin extends BPService {
114
+ static Config = Config;
115
+ static EventSchemas = EventSchemas;
116
+ keyPair;
117
+ constructor(cfg) {
118
+ super({ ...cfg, eventSchemas: EventSchemas });
119
+ }
120
+ async init(obs) {
121
+ this.keyPair = loadOrGenerateKeyPair(resolve(this.config.keyStorePath));
122
+ await super.init(obs);
123
+ const jwk = publicKeyToJwk(this.keyPair.publicKeyPem, this.keyPair.kid);
124
+ this.registerAsAuthProvider({
125
+ issuer: this.config.issuer,
126
+ audience: this.config.audience,
127
+ jwksUri: `${this.config.issuer.replace(/\/+$/, "")}/.well-known/jwks.json`,
128
+ jwks: { keys: [jwk] }
129
+ });
130
+ }
131
+ definition() {
132
+ return {
133
+ manifest: {
134
+ pluginId: SERVICE_ID,
135
+ title: "BetterPortal WorkOS",
136
+ description: "WorkOS-backed auth service for BetterPortal apps.",
137
+ capabilities: ["auth", "auth.roles.sync"],
138
+ configSchemas: WorkOSConfigSchemas
139
+ },
140
+ registry
141
+ };
142
+ }
143
+ onRegistered() {
144
+ this.app.get("/.well-known/bp/config/workos-role-sync", (event) => this.renderRoleSyncFragment(event));
145
+ this.app.post("/.well-known/bp/config/workos-role-sync/permissions", (event) => this.handlePermissionSync(event));
146
+ this.app.post("/.well-known/bp/config/workos-role-sync/roles", (event) => this.handleRoleSync(event));
147
+ this.app.post("/.well-known/workos/webhooks", (event) => this.handleWorkOSWebhook(event));
148
+ }
149
+ getJwtVerifier(tenantId, appId) {
150
+ void tenantId;
151
+ void appId;
152
+ return this.tokenIssuer().verifier("access");
153
+ }
154
+ async validateTenantApp(tenantId, appId) {
155
+ if (await this.validateConfigScope(tenantId, appId))
156
+ return { allowed: true };
157
+ return {
158
+ allowed: false,
159
+ reason: `WorkOS auth service is not activated for tenant ${tenantId} app ${appId}.`
160
+ };
161
+ }
162
+ getWorkOSAppConfig(tenantId, appId) {
163
+ return resolveWorkOSAppConfig(this.getWorkOSRawConfig(tenantId, appId));
164
+ }
165
+ getAuthorizationUrl(config, input) {
166
+ return this.client(config).userManagement.getAuthorizationUrl({
167
+ provider: config.provider ?? "authkit",
168
+ clientId: config.clientId,
169
+ redirectUri: input.redirectUri,
170
+ state: input.state,
171
+ ...(config.connectionId ? { connectionId: config.connectionId } : {}),
172
+ ...(config.organizationId ? { organizationId: config.organizationId } : {}),
173
+ ...(config.domainHint ? { domainHint: config.domainHint } : {}),
174
+ ...(config.scopes ? { providerScopes: splitScopes(config.scopes) } : {})
175
+ });
176
+ }
177
+ authenticateWithCode(config, code) {
178
+ return this.client(config).userManagement.authenticateWithCode({
179
+ clientId: config.clientId,
180
+ code
181
+ });
182
+ }
183
+ refreshWorkOSToken(config, refreshToken) {
184
+ return this.client(config).userManagement.authenticateWithRefreshToken({
185
+ clientId: config.clientId,
186
+ refreshToken
187
+ });
188
+ }
189
+ async syncPermissionsToWorkOS(tenantId, appId) {
190
+ const config = this.getWorkOSAppConfig(tenantId, appId);
191
+ if (!config)
192
+ throw new Error("WorkOS app config is missing clientId or apiKey.");
193
+ const catalog = this.bpPermissionCatalog(appId);
194
+ const currentSlugs = new Set(catalog.map((entry) => entry.slug));
195
+ const client = this.client(config);
196
+ const [permissions, roles] = await Promise.all([
197
+ client.authorization.listPermissions().then((list) => list.autoPagination()),
198
+ this.listWorkOSRoles(config)
199
+ ]);
200
+ const rolePermissionSlugs = new Set(roles.flatMap((role) => role.permissions));
201
+ const bySlug = new Map(permissions.map((permission) => [permission.slug, permission]));
202
+ let created = 0;
203
+ let updated = 0;
204
+ let deleted = 0;
205
+ let deprecated = 0;
206
+ for (const entry of catalog) {
207
+ const existing = bySlug.get(entry.slug);
208
+ if (!existing) {
209
+ await client.authorization.createPermission({
210
+ slug: entry.slug,
211
+ name: entry.title,
212
+ description: entry.description
213
+ });
214
+ created++;
215
+ }
216
+ else if (existing.name !== entry.title || existing.description !== entry.description) {
217
+ await client.authorization.updatePermission(entry.slug, {
218
+ name: entry.title,
219
+ description: entry.description
220
+ });
221
+ updated++;
222
+ }
223
+ }
224
+ for (const permission of permissions) {
225
+ if (!permission.slug.startsWith(BP_PERMISSION_PREFIX) || currentSlugs.has(permission.slug))
226
+ continue;
227
+ if (rolePermissionSlugs.has(permission.slug)) {
228
+ const nextName = permission.name.startsWith(STALE_PERMISSION_PREFIX)
229
+ ? permission.name
230
+ : `${STALE_PERMISSION_PREFIX}${permission.name}`;
231
+ if (permission.name !== nextName) {
232
+ await client.authorization.updatePermission(permission.slug, {
233
+ name: nextName,
234
+ description: permission.description ?? "Removed BetterPortal permission; remove from roles before deletion."
235
+ });
236
+ deprecated++;
237
+ }
238
+ }
239
+ else {
240
+ await client.authorization.deletePermission(permission.slug);
241
+ deleted++;
242
+ }
243
+ }
244
+ return { created, updated, deleted, deprecated, current: catalog.length };
245
+ }
246
+ async syncRolesFromWorkOS(tenantId, appId) {
247
+ const config = this.getWorkOSAppConfig(tenantId, appId);
248
+ if (!config)
249
+ throw new Error("WorkOS app config is missing clientId or apiKey.");
250
+ const currentSlugs = new Set(this.bpPermissionCatalog(appId).map((entry) => entry.slug));
251
+ const roles = (await this.listWorkOSRoles(config))
252
+ .map((role) => this.toBpRole(role, currentSlugs))
253
+ .filter((role) => Boolean(role));
254
+ await this.pushRolesToConfigManager(appId, roles);
255
+ return {
256
+ roles: roles.length,
257
+ grants: roles.reduce((sum, role) => sum + role.permissions.length, 0)
258
+ };
259
+ }
260
+ issueTokenPair(input, options) {
261
+ return this.tokenIssuer().issueTokenPair(input, options);
262
+ }
263
+ getWorkOSRawConfig(tenantId, appId) {
264
+ const ticket = this.workosConfigReadTicket(tenantId);
265
+ const state = this.configStore.read(ticket);
266
+ return { ...state.tenant, ...(state.app[appId] ?? {}) };
267
+ }
268
+ workosConfigReadTicket(tenantId) {
269
+ const now = Math.floor(Date.now() / 1000);
270
+ return {
271
+ iss: SERVICE_ID,
272
+ aud: SERVICE_ID,
273
+ sub: SERVICE_ID,
274
+ iat: now,
275
+ exp: now + 60,
276
+ jti: `${tenantId}:${now}`,
277
+ realm: "control-plane",
278
+ tenantId,
279
+ serviceId: SERVICE_ID,
280
+ actions: ["config.read"]
281
+ };
282
+ }
283
+ client(config) {
284
+ return new WorkOS({ apiKey: config.apiKey, clientId: config.clientId });
285
+ }
286
+ async listWorkOSRoles(config) {
287
+ const authorization = this.client(config).authorization;
288
+ if (config.organizationId) {
289
+ const list = await authorization.listOrganizationRoles(config.organizationId);
290
+ return (list.data ?? []);
291
+ }
292
+ const list = await authorization.listEnvironmentRoles();
293
+ return (list.data ?? []);
294
+ }
295
+ bpPermissionCatalog(appId) {
296
+ const portal = this.getPortalConfig();
297
+ const app = portal?.apps.find((candidate) => candidate.id === appId);
298
+ if (!app)
299
+ return [];
300
+ return app.routes
301
+ .filter((route) => route.enabled !== false)
302
+ .flatMap((route) => permissionCatalogForRoute(route, app));
303
+ }
304
+ toBpRole(role, currentSlugs) {
305
+ const byTarget = new Map();
306
+ for (const slug of role.permissions) {
307
+ if (!currentSlugs.has(slug))
308
+ continue;
309
+ const parsed = parseBpPermissionSlug(slug);
310
+ if (!parsed)
311
+ continue;
312
+ const key = `${parsed.serviceId}\n${parsed.viewId}`;
313
+ const grant = byTarget.get(key) ?? { serviceId: parsed.serviceId, viewId: parsed.viewId, permissions: [] };
314
+ if (!grant.permissions.includes(parsed.action))
315
+ grant.permissions.push(parsed.action);
316
+ byTarget.set(key, grant);
317
+ }
318
+ const permissions = Array.from(byTarget.values());
319
+ if (permissions.length === 0)
320
+ return null;
321
+ return {
322
+ id: role.slug,
323
+ title: role.name ?? role.slug,
324
+ ...(role.description ? { description: role.description } : {}),
325
+ permissions
326
+ };
327
+ }
328
+ async pushRolesToConfigManager(appId, roles) {
329
+ const cpUrl = this.bp.controlPlaneUrl?.replace(/\/+$/, "");
330
+ const apiKey = this.bp.serviceApiKey;
331
+ if (!cpUrl || !apiKey)
332
+ throw new Error("BetterPortal controlPlaneUrl and serviceApiKey are required for role sync.");
333
+ const response = await fetch(`${cpUrl}/.well-known/bp/admin/apps/${encodeURIComponent(appId)}/auth/roles/sync`, {
334
+ method: "PUT",
335
+ headers: {
336
+ Accept: "application/json",
337
+ "content-type": "application/json",
338
+ Authorization: `Bearer ${apiKey}`
339
+ },
340
+ body: JSON.stringify({ roles })
341
+ });
342
+ if (!response.ok) {
343
+ const body = await response.text().catch(() => "");
344
+ throw new Error(`Config Manager role sync failed: ${response.status} ${body}`);
345
+ }
346
+ }
347
+ matchingConfiguredApps(event) {
348
+ const portal = this.getPortalConfig();
349
+ if (!portal)
350
+ return [];
351
+ const eventOrgId = event && typeof event === "object"
352
+ ? readNestedString(event, ["data", "organizationId"]) ?? readNestedString(event, ["data", "organization_id"])
353
+ : undefined;
354
+ return portal.apps.flatMap((app) => {
355
+ const config = this.getWorkOSAppConfig(app.tenantId, app.id);
356
+ if (!config)
357
+ return [];
358
+ if (eventOrgId && config.organizationId && config.organizationId !== eventOrgId)
359
+ return [];
360
+ return [{ tenantId: app.tenantId, appId: app.id, config }];
361
+ });
362
+ }
363
+ async renderRoleSyncFragment(event) {
364
+ const url = new URL(event.req.url, "http://betterportal.invalid");
365
+ const tenantId = url.searchParams.get("tenantId") ?? "";
366
+ const appId = url.searchParams.get("appId") ?? "";
367
+ if (!tenantId || !appId)
368
+ return htmlResponse(`<div class="alert alert-danger">tenantId and appId are required.</div>`, 400, "text/html; mode=fragment");
369
+ const config = this.getWorkOSAppConfig(tenantId, appId);
370
+ if (!config)
371
+ return htmlResponse(`<div class="alert alert-warning">WorkOS app config is missing clientId or apiKey.</div>`, 409, "text/html; mode=fragment");
372
+ const portal = this.getPortalConfig();
373
+ const app = portal?.apps.find((candidate) => candidate.id === appId);
374
+ const selfBase = requestBaseUrl(event.req);
375
+ const bpRoles = (app?.auth?.roles ?? []);
376
+ let workosRoles = [];
377
+ let error = "";
378
+ try {
379
+ workosRoles = await this.listWorkOSRoles(config);
380
+ }
381
+ catch (err) {
382
+ error = err instanceof Error ? err.message : String(err);
383
+ }
384
+ const currentSlugs = new Set(this.bpPermissionCatalog(appId).map((entry) => entry.slug));
385
+ const syncedIds = new Set(bpRoles.map((role) => role.id));
386
+ const roleRows = workosRoles
387
+ .filter((role) => role.permissions.some((permission) => currentSlugs.has(permission)))
388
+ .map((role) => `<tr><td><code>${escapeHtml(role.slug)}</code></td><td>${escapeHtml(role.name ?? role.slug)}</td><td>${role.permissions.filter((permission) => currentSlugs.has(permission)).length}</td><td>${syncedIds.has(role.slug) ? "Synced" : "Pending"}</td></tr>`)
389
+ .join("");
390
+ return htmlResponse(`
391
+ <div class="card border-0 shadow-sm">
392
+ <div class="card-body">
393
+ <div class="d-flex justify-content-between align-items-start gap-3 mb-3">
394
+ <div>
395
+ <h5 class="card-title mb-1">WorkOS Role Sync</h5>
396
+ <div class="text-secondary small">BP permissions sync to WorkOS; WorkOS roles mirror back to this app.</div>
397
+ </div>
398
+ <div class="btn-group btn-group-sm">
399
+ <button class="btn btn-outline-primary" hx-post="${selfBase}/.well-known/bp/config/workos-role-sync/permissions?tenantId=${encodeURIComponent(tenantId)}&appId=${encodeURIComponent(appId)}" hx-target="closest .card" hx-swap="outerHTML">Sync permissions</button>
400
+ <button class="btn btn-outline-primary" hx-post="${selfBase}/.well-known/bp/config/workos-role-sync/roles?tenantId=${encodeURIComponent(tenantId)}&appId=${encodeURIComponent(appId)}" hx-target="closest .card" hx-swap="outerHTML">Sync roles</button>
401
+ </div>
402
+ </div>
403
+ ${error ? `<div class="alert alert-danger">${escapeHtml(error)}</div>` : ""}
404
+ <div class="mb-2 small"><strong>BP permissions:</strong> ${currentSlugs.size} <span class="text-secondary">|</span> <strong>Mirrored BP roles:</strong> ${bpRoles.length}</div>
405
+ <div class="table-responsive">
406
+ <table class="table table-sm align-middle mb-0">
407
+ <thead><tr><th>Role slug</th><th>Name</th><th>Current BP grants</th><th>Status</th></tr></thead>
408
+ <tbody>${roleRows || `<tr><td colspan="4" class="text-secondary">No WorkOS roles with current BP permissions.</td></tr>`}</tbody>
409
+ </table>
410
+ </div>
411
+ </div>
412
+ </div>
413
+ `, 200, "text/html; mode=fragment");
414
+ }
415
+ async handlePermissionSync(event) {
416
+ const url = new URL(event.req.url, "http://betterportal.invalid");
417
+ const tenantId = url.searchParams.get("tenantId") ?? "";
418
+ const appId = url.searchParams.get("appId") ?? "";
419
+ try {
420
+ const result = await this.syncPermissionsToWorkOS(tenantId, appId);
421
+ const fragment = await this.renderRoleSyncFragment(event);
422
+ fragment.headers.set("HX-Trigger", JSON.stringify({ "bp:toast": `WorkOS permissions synced (${result.created} created, ${result.updated} updated).` }));
423
+ return fragment;
424
+ }
425
+ catch (err) {
426
+ return htmlResponse(`<div class="alert alert-danger">${escapeHtml(err instanceof Error ? err.message : String(err))}</div>`, 500, "text/html; mode=fragment");
427
+ }
428
+ }
429
+ async handleRoleSync(event) {
430
+ const url = new URL(event.req.url, "http://betterportal.invalid");
431
+ const tenantId = url.searchParams.get("tenantId") ?? "";
432
+ const appId = url.searchParams.get("appId") ?? "";
433
+ try {
434
+ const result = await this.syncRolesFromWorkOS(tenantId, appId);
435
+ const fragment = await this.renderRoleSyncFragment(event);
436
+ fragment.headers.set("HX-Trigger", JSON.stringify({ "bp:toast": `WorkOS roles synced (${result.roles} roles).` }));
437
+ return fragment;
438
+ }
439
+ catch (err) {
440
+ return htmlResponse(`<div class="alert alert-danger">${escapeHtml(err instanceof Error ? err.message : String(err))}</div>`, 500, "text/html; mode=fragment");
441
+ }
442
+ }
443
+ async handleWorkOSWebhook(event) {
444
+ const payload = await event.req.text();
445
+ const sigHeader = event.req.headers.get("workos-signature");
446
+ if (!sigHeader)
447
+ return jsonResponse({ error: "Missing WorkOS signature" }, 401);
448
+ for (const candidate of this.matchingConfiguredApps()) {
449
+ if (!candidate.config.webhookSecret)
450
+ continue;
451
+ try {
452
+ const workosEvent = await this.client(candidate.config).webhooks.constructEvent({
453
+ payload,
454
+ sigHeader,
455
+ secret: candidate.config.webhookSecret
456
+ });
457
+ if (!ROLE_EVENTS.has(workosEvent.event))
458
+ return jsonResponse({ ok: true, ignored: true });
459
+ const apps = this.matchingConfiguredApps(workosEvent);
460
+ for (const app of apps) {
461
+ await this.syncRolesFromWorkOS(app.tenantId, app.appId);
462
+ }
463
+ return jsonResponse({ ok: true, synced: apps.length });
464
+ }
465
+ catch {
466
+ // Try the next configured webhook secret.
467
+ }
468
+ }
469
+ return jsonResponse({ error: "Invalid WorkOS signature" }, 401);
470
+ }
471
+ tokenIssuer() {
472
+ return createBpTokenIssuer({
473
+ keyPair: this.keyPair,
474
+ issuer: this.config.issuer,
475
+ audience: this.config.audience,
476
+ accessTokenSeconds: this.config.accessTokenSeconds,
477
+ refreshTokenSeconds: this.config.refreshTokenSeconds
478
+ });
479
+ }
480
+ }
481
+ export { Config, EventSchemas };
482
+ export function rolesFromWorkOSAccessToken(token, roleClaimPath = "roles") {
483
+ const [, payload] = token.split(".");
484
+ if (!payload)
485
+ return [];
486
+ try {
487
+ const claims = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
488
+ return readStringArrayClaim(claims, roleClaimPath);
489
+ }
490
+ catch {
491
+ return [];
492
+ }
493
+ }
494
+ export function secondsUntilJwtExpiry(token) {
495
+ const [, payload] = token.split(".");
496
+ if (!payload)
497
+ return undefined;
498
+ try {
499
+ const parsed = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
500
+ if (typeof parsed.exp !== "number")
501
+ return undefined;
502
+ return Math.max(1, Math.floor(parsed.exp - Date.now() / 1000));
503
+ }
504
+ catch {
505
+ return undefined;
506
+ }
507
+ }
508
+ function splitScopes(value) {
509
+ return value.split(/\s+/).map((entry) => entry.trim()).filter(Boolean);
510
+ }
511
+ function readStringArrayClaim(claims, path) {
512
+ const value = path.split(".").reduce((current, segment) => {
513
+ if (!current || typeof current !== "object")
514
+ return undefined;
515
+ return current[segment];
516
+ }, claims);
517
+ if (Array.isArray(value))
518
+ return value.filter((entry) => typeof entry === "string" && entry.length > 0);
519
+ return typeof value === "string" && value.length > 0 ? [value] : [];
520
+ }
521
+ function permissionCatalogForRoute(route, app) {
522
+ const title = route.title ?? route.viewId;
523
+ return ["read", "create", "update", "delete"].map((action) => ({
524
+ slug: bpPermissionSlug(route.serviceId, route.viewId, action),
525
+ serviceId: route.serviceId,
526
+ viewId: route.viewId,
527
+ action,
528
+ title: `${title}: ${action}`,
529
+ description: `${app.title} ${title} ${action} permission`
530
+ }));
531
+ }
532
+ export function bpPermissionSlug(serviceId, viewId, action) {
533
+ return `${BP_PERMISSION_PREFIX}${serviceId}:${viewId}:${action}`;
534
+ }
535
+ export function parseBpPermissionSlug(slug) {
536
+ if (!slug.startsWith(BP_PERMISSION_PREFIX))
537
+ return null;
538
+ const parts = slug.slice(BP_PERMISSION_PREFIX.length).split(":");
539
+ if (parts.length !== 3)
540
+ return null;
541
+ const [serviceId, viewId, action] = parts;
542
+ if (!serviceId || !viewId || !isPermissionAction(action))
543
+ return null;
544
+ return { serviceId, viewId, action };
545
+ }
546
+ function isPermissionAction(value) {
547
+ return value === "read" || value === "create" || value === "update" || value === "delete";
548
+ }
549
+ function readNestedString(value, path) {
550
+ let current = value;
551
+ for (const segment of path) {
552
+ if (!current || typeof current !== "object")
553
+ return undefined;
554
+ current = current[segment];
555
+ }
556
+ return typeof current === "string" && current.length > 0 ? current : undefined;
557
+ }
558
+ function escapeHtml(value) {
559
+ return value.replace(/[&<>"']/g, (char) => ({
560
+ "&": "&amp;",
561
+ "<": "&lt;",
562
+ ">": "&gt;",
563
+ '"': "&quot;",
564
+ "'": "&#39;"
565
+ }[char]));
566
+ }
567
+ function requestBaseUrl(req) {
568
+ const url = new URL(req.url, "http://betterportal.invalid");
569
+ if (url.origin !== "http://betterportal.invalid")
570
+ return url.origin;
571
+ const host = req.headers.get("x-forwarded-host") ?? req.headers.get("host") ?? "betterportal.invalid";
572
+ const proto = req.headers.get("x-forwarded-proto") ?? "https";
573
+ return `${proto}://${host}`;
574
+ }
575
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-auth-workos/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,kBAAkB,EAEnB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,wBAAwB,EACxB,SAAS,EAEV,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAA+B,MAAM,kBAAkB,CAAC;AACvE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EAaf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,UAAU,GAAG,kCAAkC,CAAC;AAEtD,MAAM,kBAAkB,GAAG,EAAE,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACjD,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACnC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAChC,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;IAClE,kBAAkB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IACpD,mBAAmB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9D,YAAY,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC;IAC9E,YAAY,EAAE,wBAAwB;CACvC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAG7B,MAAM,MAAM,GAAG,kBAAkB,CAC/B;IACE,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,kCAAkC;IAC/C,IAAI,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC;IACxC,aAAa,EAAE,CAAC,aAAa,CAAC;IAC9B,KAAK,EAAE,yBAAyB;CACjC,EACD,kBAAkB,CACnB,CAAC;AAEF,MAAM,YAAY,GAAG,kBAAkB,CAAC;IACtC,UAAU,EAAE,EAAE;IACd,QAAQ,EAAE,EAAE;IACZ,oBAAoB,EAAE,EAAE;IACxB,kBAAkB,EAAE,EAAE;IACtB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,EAAE;CAChB,CAAC,CAAC;AAkBH,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAwC;IAC7E,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO;QACL,QAAQ;QACR,MAAM;QACN,QAAQ,EAAE,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,SAAS;QACpD,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjG,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvG,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,cAAc,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChH,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,cAAc,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAwC;IACjF,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,CAAC;IACrD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAA6B;IAC3D;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,qCAAqC;QAClD,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE;YACV,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,QAAQ;YACtB,cAAc,EAAE,QAAQ;YACxB,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,QAAQ;YAChB,iBAAiB,EAAE,QAAQ;YAC3B,kBAAkB,EAAE,QAAQ;YAC5B,aAAa,EAAE,QAAQ;YACvB,aAAa,EAAE,QAAQ;SACxB;QACD,MAAM,EAAE;YACN,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,yCAAyC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC7H,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,yCAAyC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAClH,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,uDAAuD,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAClI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,yCAAyC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;SACtH;QACD,MAAM,EAAE;YACN,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,mCAAmC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxN,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,gEAAgE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC9O,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,mCAAmC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC5O,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,sCAAsC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC/N,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,wCAAwC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;YACrO,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,8BAA8B,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;YACnN,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE;YACpP,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,oEAAoE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC/U,EAAE,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,uCAAuC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;YACpT,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,+CAA+C,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;YACnQ,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,qDAAqD,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;SAC7O;KACF;CACF,CAAC;AAwBF,MAAM,oBAAoB,GAAG,KAAK,CAAC;AACnC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AACxC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,cAAc;IACd,cAAc;IACd,cAAc;IACd,2BAA2B;IAC3B,2BAA2B;IAC3B,2BAA2B;CAC5B,CAAC,CAAC;AAEH,MAAM,OAAO,MAAO,SAAQ,SAA2D;IACrF,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;IAC3B,OAAO,CAAc;IAE7B,YAAY,GAA4E;QACtF,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAe;QACxB,IAAI,CAAC,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QACxE,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC,sBAAsB,CAAC;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,wBAAwB;YAC1E,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAyC,CAAC,EAAE;SAC5D,CAAC,CAAC;IACL,CAAC;IAES,UAAU;QAClB,OAAO;YACL,QAAQ,EAAE;gBACR,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAE,qBAAqB;gBAC5B,WAAW,EAAE,mDAAmD;gBAChE,YAAY,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBACzC,aAAa,EAAE,mBAAmB;aACnC;YACD,QAAQ;SACT,CAAC;IACJ,CAAC;IAES,YAAY;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,yCAAyC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;QACvG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qDAAqD,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QAClH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,+CAA+C,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5F,CAAC;IAES,cAAc,CAAC,QAAgB,EAAE,KAAa;QACtD,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK,CAAC;QACX,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAES,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,KAAa;QAC/D,IAAI,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9E,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,mDAAmD,QAAQ,QAAQ,KAAK,GAAG;SACpF,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,QAAgB,EAAE,KAAa;QAChD,OAAO,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,mBAAmB,CAAC,MAAuB,EAAE,KAA6C;QACxF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,mBAAmB,CAAC;YAC5D,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;YACtC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB,CAAC,MAAuB,EAAE,IAAY;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC;YAC7D,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,MAAuB,EAAE,YAAoB;QAC9D,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,4BAA4B,CAAC;YACrE,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,QAAgB,EAAE,KAAa;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7C,MAAM,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5E,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;SAC7B,CAAC,CAAC;QACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAE,WAAkC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/G,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC;oBAC1C,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,KAAK;oBACjB,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;gBACvF,MAAM,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE;oBACtD,IAAI,EAAE,KAAK,CAAC,KAAK;oBACjB,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,WAAiC,EAAE,CAAC;YAC3D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YACrG,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC;oBAClE,CAAC,CAAC,UAAU,CAAC,IAAI;oBACjB,CAAC,CAAC,GAAG,uBAAuB,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;gBACnD,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACjC,MAAM,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE;wBAC3D,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,qEAAqE;qBAC7G,CAAC,CAAC;oBACH,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC7D,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,QAAgB,EAAE,KAAa;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACjF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;aAC/C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;aAChD,MAAM,CAAC,CAAC,IAAI,EAAuB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;SACtE,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,KAWd,EAAE,OAA2C;QAC5C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAEO,kBAAkB,CAAC,QAAgB,EAAE,KAAa;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAC1D,CAAC;IAEO,sBAAsB,CAAC,QAAgB;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,OAAO;YACL,GAAG,EAAE,UAAU;YACf,GAAG,EAAE,UAAU;YACf,GAAG,EAAE,UAAU;YACf,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG,GAAG,EAAE;YACb,GAAG,EAAE,GAAG,QAAQ,IAAI,GAAG,EAAE;YACzB,KAAK,EAAE,eAAe;YACtB,QAAQ;YACR,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE,CAAC,aAAa,CAAC;SACzB,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,MAAuB;QACpC,OAAO,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,MAAuB;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;QACxD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,qBAAqB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAiB,CAAC;QAC3C,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,oBAAoB,EAAE,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAiB,CAAC;IAC3C,CAAC;IAEO,mBAAmB,CAAC,KAAa;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,MAAM;aACd,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC;aAC1C,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,yBAAyB,CAAC,KAA+B,EAAE,GAAsB,CAAC,CAAC,CAAC;IAC5G,CAAC;IAEO,QAAQ,CAAC,IAAgB,EAAE,YAAyB;QAC1D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8C,CAAC;QACvE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;YAC3G,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtF,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,IAAI;YACb,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;YAC7B,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,WAAW;SACZ,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,KAAa,EAAE,KAAoB;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;QACrH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,KAAK,8BAA8B,kBAAkB,CAAC,KAAK,CAAC,kBAAkB,EAAE;YAC9G,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,KAAe;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YACnD,CAAC,CAAC,gBAAgB,CAAC,KAAgC,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,IAAI,gBAAgB,CAAC,KAAgC,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YACnK,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,CAAC;YACvB,IAAI,UAAU,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,KAAK,UAAU;gBAAE,OAAO,EAAE,CAAC;YAC3F,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,KAAuB;QAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK;YAAE,OAAO,YAAY,CAAC,wEAAwE,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;QACxJ,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM;YAAE,OAAO,YAAY,CAAC,yFAAyF,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;QAC7J,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAmB,CAAC;QAC5D,IAAI,WAAW,GAAiB,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,WAAW;aACzB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;aACrF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,YAAY,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,YAAY,CAAC;aACzQ,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,YAAY,CAAC;;;;;;;;;iEASyC,QAAQ,gEAAgE,kBAAkB,CAAC,QAAQ,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC;iEACvI,QAAQ,0DAA0D,kBAAkB,CAAC,QAAQ,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC;;;YAGtL,KAAK,CAAC,CAAC,CAAC,mCAAmC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;qEAChB,YAAY,CAAC,IAAI,8EAA8E,OAAO,CAAC,MAAM;;;;uBAI3J,QAAQ,IAAI,mGAAmG;;;;;KAKjI,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,KAAuB;QACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC1D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,8BAA8B,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,OAAO,YAAY,EAAE,CAAC,CAAC,CAAC;YACxJ,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,YAAY,CAAC,mCAAmC,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;QAChK,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,KAAuB;QAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAC1D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,wBAAwB,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC;YACnH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,YAAY,CAAC,mCAAmC,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;QAChK,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,KAAuB;QACvD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS;YAAE,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,GAAG,CAAC,CAAC;QAChF,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa;gBAAE,SAAS;YAC9C,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;oBAC9E,OAAO;oBACP,SAAS;oBACT,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,aAAa;iBACvC,CAAC,CAAC;gBACH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;oBAAE,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;gBACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAe,CAAC,CAAC;YACtE,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,GAAG,CAAC,CAAC;IAClE,CAAC;IAEO,WAAW;QACjB,OAAO,mBAAmB,CAAC;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAClD,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;SACrD,CAAC,CAAC;IACL,CAAC;;AAGH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAEhC,MAAM,UAAU,0BAA0B,CAAC,KAAa,EAAE,aAAa,GAAG,OAAO;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA4B,CAAC;QACzG,OAAO,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAsB,CAAC;QACnG,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,oBAAoB,CAAC,MAA+B,EAAE,IAAY;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QACjE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC9D,OAAQ,OAAmC,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,EAAE,MAAM,CAAC,CAAC;IACX,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzH,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA6B,EAAE,GAAoB;IACpF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;IAC1C,OAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC;QAC7D,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM;QACN,KAAK,EAAE,GAAG,KAAK,KAAK,MAAM,EAAE;QAC5B,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,IAAI,KAAK,IAAI,MAAM,aAAa;KAC1D,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,MAAc,EAAE,MAA+B;IACjG,OAAO,GAAG,oBAAoB,GAAG,SAAS,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IAC1C,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,CAAC;AAC5F,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA8B,EAAE,IAAc;IACtE,IAAI,OAAO,GAAY,KAAK,CAAC;IAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC9D,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1C,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,OAAO;KACb,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;IAC5D,IAAI,GAAG,CAAC,MAAM,KAAK,6BAA6B;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC;IACtG,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC;IAC9D,OAAO,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC;AAC9B,CAAC"}