fluxmail 0.3.0 → 0.4.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 (83) hide show
  1. package/README.md +15 -55
  2. package/dist/accounts/gmailConnection.d.ts +5 -1
  3. package/dist/accounts/gmailConnection.d.ts.map +1 -1
  4. package/dist/accounts/gmailConnection.js +14 -2
  5. package/dist/accounts/gmailConnection.js.map +1 -1
  6. package/dist/accounts/googleAuth.js +1 -1
  7. package/dist/accounts/googleAuth.js.map +1 -1
  8. package/dist/accounts/microsoftAuth.d.ts +21 -0
  9. package/dist/accounts/microsoftAuth.d.ts.map +1 -0
  10. package/dist/accounts/microsoftAuth.js +220 -0
  11. package/dist/accounts/microsoftAuth.js.map +1 -0
  12. package/dist/accounts/registry.d.ts +21 -8
  13. package/dist/accounts/registry.d.ts.map +1 -1
  14. package/dist/accounts/registry.js +190 -24
  15. package/dist/accounts/registry.js.map +1 -1
  16. package/dist/cli.d.ts +7 -0
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +857 -647
  19. package/dist/cli.js.map +1 -1
  20. package/dist/config.d.ts +102 -2
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +114 -14
  23. package/dist/config.js.map +1 -1
  24. package/dist/context.d.ts +2 -0
  25. package/dist/context.d.ts.map +1 -1
  26. package/dist/context.js +7 -1
  27. package/dist/context.js.map +1 -1
  28. package/dist/http/admin.d.ts +21 -0
  29. package/dist/http/admin.d.ts.map +1 -0
  30. package/dist/http/admin.js +618 -0
  31. package/dist/http/admin.js.map +1 -0
  32. package/dist/http/app.d.ts +2 -0
  33. package/dist/http/app.d.ts.map +1 -1
  34. package/dist/http/app.js +322 -42
  35. package/dist/http/app.js.map +1 -1
  36. package/dist/http/rest.d.ts +28 -0
  37. package/dist/http/rest.d.ts.map +1 -0
  38. package/dist/http/rest.js +1130 -0
  39. package/dist/http/rest.js.map +1 -0
  40. package/dist/index.d.ts +3 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +3 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/licensing/refresher.d.ts +23 -7
  45. package/dist/licensing/refresher.d.ts.map +1 -1
  46. package/dist/licensing/refresher.js +93 -37
  47. package/dist/licensing/refresher.js.map +1 -1
  48. package/dist/mcp/buildServer.d.ts.map +1 -1
  49. package/dist/mcp/buildServer.js +1 -1
  50. package/dist/mcp/buildServer.js.map +1 -1
  51. package/dist/permissions.d.ts +15 -4
  52. package/dist/permissions.d.ts.map +1 -1
  53. package/dist/permissions.js +61 -12
  54. package/dist/permissions.js.map +1 -1
  55. package/dist/service/emailService.d.ts +15 -8
  56. package/dist/service/emailService.d.ts.map +1 -1
  57. package/dist/service/emailService.js +42 -17
  58. package/dist/service/emailService.js.map +1 -1
  59. package/dist/storage/adminAudit.d.ts +14 -0
  60. package/dist/storage/adminAudit.d.ts.map +1 -0
  61. package/dist/storage/adminAudit.js +32 -0
  62. package/dist/storage/adminAudit.js.map +1 -0
  63. package/dist/storage/apiKeys.d.ts +25 -7
  64. package/dist/storage/apiKeys.d.ts.map +1 -1
  65. package/dist/storage/apiKeys.js +104 -12
  66. package/dist/storage/apiKeys.js.map +1 -1
  67. package/dist/storage/db.d.ts +486 -0
  68. package/dist/storage/db.d.ts.map +1 -1
  69. package/dist/storage/db.js +171 -8
  70. package/dist/storage/db.js.map +1 -1
  71. package/dist/storage/gmailConnectionGrants.d.ts +9 -0
  72. package/dist/storage/gmailConnectionGrants.d.ts.map +1 -1
  73. package/dist/storage/gmailConnectionGrants.js +30 -7
  74. package/dist/storage/gmailConnectionGrants.js.map +1 -1
  75. package/dist/storage/members.d.ts +7 -4
  76. package/dist/storage/members.d.ts.map +1 -1
  77. package/dist/storage/members.js +34 -8
  78. package/dist/storage/members.js.map +1 -1
  79. package/dist/storage/restIdempotency.d.ts +28 -0
  80. package/dist/storage/restIdempotency.d.ts.map +1 -0
  81. package/dist/storage/restIdempotency.js +47 -0
  82. package/dist/storage/restIdempotency.js.map +1 -0
  83. package/package.json +10 -8
@@ -1,16 +1,37 @@
1
1
  import { createHash, randomBytes } from 'node:crypto';
2
2
  import { eq } from 'drizzle-orm';
3
+ import { EmailError } from '@fluxmail/core';
3
4
  import { apiKeys } from './db.js';
4
5
  import { getMember } from './members.js';
5
- import { deserializePermissionPolicy, FULL_PERMISSION_POLICY, normalizePermissionPolicy, serializeCustomCapabilities, } from '../permissions.js';
6
+ import { deserializePermissionPolicy, FULL_PERMISSION_POLICY, normalizePermissionPolicy, serializeCustomCapabilities, serializeSupplementalCapabilities, hasCapability, } from '../permissions.js';
7
+ function uniqueAccountIds(accountIds) {
8
+ return [...new Set(accountIds)];
9
+ }
10
+ function serializeAccountIds(accountIds) {
11
+ return accountIds === null ? null : JSON.stringify(uniqueAccountIds(accountIds));
12
+ }
13
+ function deserializeAccountIds(value) {
14
+ if (value === null)
15
+ return null;
16
+ const parsed = JSON.parse(value);
17
+ if (!Array.isArray(parsed) || !parsed.every((item) => typeof item === 'string')) {
18
+ throw new Error('API key account scope must be a JSON array of strings.');
19
+ }
20
+ return uniqueAccountIds(parsed);
21
+ }
6
22
  function hashKey(key) {
7
23
  return createHash('sha256').update(key).digest('hex');
8
24
  }
9
25
  /** Returns the plaintext key exactly once; only its hash is stored. */
10
- export function createApiKey(db, name, memberId, permissions = FULL_PERMISSION_POLICY) {
11
- if (memberId)
12
- getMember(db, memberId);
26
+ export function createApiKey(db, name, memberId, permissions = FULL_PERMISSION_POLICY, accountIds = null) {
27
+ if (!memberId) {
28
+ throw new EmailError('invalid_request', 'A member is required when creating an API key.');
29
+ }
30
+ const member = getMember(db, memberId);
13
31
  const policy = normalizePermissionPolicy(permissions);
32
+ if (member.role !== 'admin' && policy.capabilities.some((capability) => capability.startsWith('admin.'))) {
33
+ throw new EmailError('permission_denied', 'Administrative capabilities can only be issued to an admin member.');
34
+ }
14
35
  const id = `key_${randomBytes(8).toString('hex')}`;
15
36
  const key = `fmk_${randomBytes(24).toString('hex')}`;
16
37
  const createdAt = Date.now();
@@ -20,9 +41,11 @@ export function createApiKey(db, name, memberId, permissions = FULL_PERMISSION_P
20
41
  name,
21
42
  keyHash: hashKey(key),
22
43
  createdAt,
23
- memberId: memberId ?? null,
44
+ memberId,
24
45
  permissionProfile: policy.profile,
25
46
  customCapabilities: serializeCustomCapabilities(policy),
47
+ supplementalCapabilities: serializeSupplementalCapabilities(policy),
48
+ accountIds: serializeAccountIds(accountIds),
26
49
  })
27
50
  .run();
28
51
  return {
@@ -32,15 +55,17 @@ export function createApiKey(db, name, memberId, permissions = FULL_PERMISSION_P
32
55
  name,
33
56
  createdAt,
34
57
  lastUsedAt: null,
35
- memberId: memberId ?? null,
58
+ memberId,
36
59
  permissionProfile: policy.profile,
37
60
  capabilities: policy.capabilities,
61
+ supplementalCapabilities: policy.supplementalCapabilities,
62
+ accountIds: accountIds === null ? null : uniqueAccountIds(accountIds),
38
63
  },
39
64
  };
40
65
  }
41
66
  /**
42
- * Verify a key, record its use, and return the scope it authorizes. Callers must
43
- * honour `memberId`: a member-scoped key may only reach shared or owned mailboxes.
67
+ * Verify a key, record its use, and return its live member role and mailbox
68
+ * narrowing. Memberless migrated keys authenticate for management only.
44
69
  */
45
70
  export function authenticateApiKey(db, key) {
46
71
  const row = db
@@ -52,13 +77,15 @@ export function authenticateApiKey(db, key) {
52
77
  return null;
53
78
  let permissions;
54
79
  try {
55
- permissions = deserializePermissionPolicy(row.permissionProfile, row.customCapabilities);
80
+ permissions = deserializePermissionPolicy(row.permissionProfile, row.customCapabilities, row.supplementalCapabilities);
81
+ const accountIds = deserializeAccountIds(row.accountIds);
82
+ const member = row.memberId ? getMember(db, row.memberId) : null;
83
+ db.update(apiKeys).set({ lastUsedAt: Date.now() }).where(eq(apiKeys.id, row.id)).run();
84
+ return { keyId: row.id, memberId: row.memberId, role: member?.role ?? null, permissions, accountIds };
56
85
  }
57
86
  catch {
58
87
  return null;
59
88
  }
60
- db.update(apiKeys).set({ lastUsedAt: Date.now() }).where(eq(apiKeys.id, row.id)).run();
61
- return { memberId: row.memberId, permissions };
62
89
  }
63
90
  export function verifyApiKey(db, key) {
64
91
  return authenticateApiKey(db, key) !== null;
@@ -69,7 +96,8 @@ export function listApiKeys(db) {
69
96
  .from(apiKeys)
70
97
  .all()
71
98
  .map((r) => {
72
- const permissions = deserializePermissionPolicy(r.permissionProfile, r.customCapabilities);
99
+ const permissions = deserializePermissionPolicy(r.permissionProfile, r.customCapabilities, r.supplementalCapabilities);
100
+ const accountIds = deserializeAccountIds(r.accountIds);
73
101
  return {
74
102
  id: r.id,
75
103
  name: r.name,
@@ -78,21 +106,85 @@ export function listApiKeys(db) {
78
106
  memberId: r.memberId,
79
107
  permissionProfile: permissions.profile,
80
108
  capabilities: permissions.capabilities,
109
+ supplementalCapabilities: permissions.supplementalCapabilities,
110
+ accountIds,
81
111
  };
82
112
  });
83
113
  }
114
+ export function updateApiKeyAccounts(db, id, accountIds) {
115
+ const result = db
116
+ .update(apiKeys)
117
+ .set({ accountIds: serializeAccountIds(accountIds) })
118
+ .where(eq(apiKeys.id, id))
119
+ .run();
120
+ return result.changes > 0;
121
+ }
84
122
  export function updateApiKeyPermissions(db, id, permissions) {
85
123
  const policy = normalizePermissionPolicy(permissions);
124
+ const existing = db.select().from(apiKeys).where(eq(apiKeys.id, id)).get();
125
+ if (!existing)
126
+ return false;
127
+ const member = existing.memberId ? getMember(db, existing.memberId) : null;
128
+ if (member && member.role !== 'admin' && policy.capabilities.some((capability) => capability.startsWith('admin.'))) {
129
+ throw new EmailError('permission_denied', 'Administrative capabilities can only be issued to an admin member.');
130
+ }
86
131
  const result = db
87
132
  .update(apiKeys)
88
133
  .set({
89
134
  permissionProfile: policy.profile,
90
135
  customCapabilities: serializeCustomCapabilities(policy),
136
+ supplementalCapabilities: serializeSupplementalCapabilities(policy),
91
137
  })
92
138
  .where(eq(apiKeys.id, id))
93
139
  .run();
94
140
  return result.changes > 0;
95
141
  }
142
+ /** Replace requested key fields in one write after all validation succeeds. */
143
+ export function updateApiKey(db, id, update) {
144
+ const existing = db.select().from(apiKeys).where(eq(apiKeys.id, id)).get();
145
+ if (!existing)
146
+ return undefined;
147
+ const policy = update.permissions ? normalizePermissionPolicy(update.permissions) : undefined;
148
+ const member = existing.memberId ? getMember(db, existing.memberId) : null;
149
+ if (policy && member && member.role !== 'admin' && policy.capabilities.some((item) => item.startsWith('admin.'))) {
150
+ throw new EmailError('permission_denied', 'Administrative capabilities can only be issued to an admin member.');
151
+ }
152
+ db.update(apiKeys)
153
+ .set({
154
+ ...(policy
155
+ ? {
156
+ permissionProfile: policy.profile,
157
+ customCapabilities: serializeCustomCapabilities(policy),
158
+ supplementalCapabilities: serializeSupplementalCapabilities(policy),
159
+ }
160
+ : {}),
161
+ ...(update.accountIds !== undefined ? { accountIds: serializeAccountIds(update.accountIds) } : {}),
162
+ })
163
+ .where(eq(apiKeys.id, id))
164
+ .run();
165
+ return listApiKeys(db).find((key) => key.id === id);
166
+ }
167
+ export function isUsableRootKey(db, id) {
168
+ const row = db.select().from(apiKeys).where(eq(apiKeys.id, id)).get();
169
+ if (!row)
170
+ return false;
171
+ try {
172
+ const permissions = deserializePermissionPolicy(row.permissionProfile, row.customCapabilities, row.supplementalCapabilities);
173
+ if (!hasCapability(permissions, 'admin.api_keys'))
174
+ return false;
175
+ return row.memberId === null || getMember(db, row.memberId).role === 'admin';
176
+ }
177
+ catch {
178
+ return false;
179
+ }
180
+ }
181
+ export function countUsableRootKeys(db, excludingId) {
182
+ return db
183
+ .select({ id: apiKeys.id })
184
+ .from(apiKeys)
185
+ .all()
186
+ .filter((row) => row.id !== excludingId && isUsableRootKey(db, row.id)).length;
187
+ }
96
188
  export function revokeApiKey(db, id) {
97
189
  const result = db.delete(apiKeys).where(eq(apiKeys.id, id)).run();
98
190
  return result.changes > 0;
@@ -1 +1 @@
1
- {"version":3,"file":"apiKeys.js","sourceRoot":"","sources":["../../src/storage/apiKeys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apiKeys.js","sourceRoot":"","sources":["../../src/storage/apiKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAmB,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,SAAS,EAAmB,MAAM,cAAc,CAAC;AAC1D,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,iCAAiC,EACjC,aAAa,GAKd,MAAM,mBAAmB,CAAC;AAgB3B,SAAS,gBAAgB,CAAC,UAA6B;IACrD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,mBAAmB,CAAC,UAAoC;IAC/D,OAAO,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAoB;IACjD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAC1B,EAAc,EACd,IAAY,EACZ,QAAiB,EACjB,cAAgC,sBAAsB,EACtD,aAAuC,IAAI;IAE3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,gDAAgD,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACzG,MAAM,IAAI,UAAU,CAAC,mBAAmB,EAAE,oEAAoE,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC;QACN,EAAE;QACF,IAAI;QACJ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;QACrB,SAAS;QACT,QAAQ;QACR,iBAAiB,EAAE,MAAM,CAAC,OAAO;QACjC,kBAAkB,EAAE,2BAA2B,CAAC,MAAM,CAAC;QACvD,wBAAwB,EAAE,iCAAiC,CAAC,MAAM,CAAC;QACnE,UAAU,EAAE,mBAAmB,CAAC,UAAU,CAAC;KAC5C,CAAC;SACD,GAAG,EAAE,CAAC;IACT,OAAO;QACL,GAAG;QACH,IAAI,EAAE;YACJ,EAAE;YACF,IAAI;YACJ,SAAS;YACT,UAAU,EAAE,IAAI;YAChB,QAAQ;YACR,iBAAiB,EAAE,MAAM,CAAC,OAAO;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,wBAAwB,EAAE,MAAM,CAAC,wBAAwB;YACzD,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC;SACtE;KACF,CAAC;AACJ,CAAC;AAaD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAc,EAAE,GAAW;IAC5D,MAAM,GAAG,GAAG,EAAE;SACX,MAAM,EAAE;SACR,IAAI,CAAC,OAAO,CAAC;SACb,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;SACxC,GAAG,EAAE,CAAC;IACT,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,WAA6B,CAAC;IAClC,IAAI,CAAC;QACH,WAAW,GAAG,2BAA2B,CACvC,GAAG,CAAC,iBAAiB,EACrB,GAAG,CAAC,kBAAkB,EACtB,GAAG,CAAC,wBAAwB,CAC7B,CAAC;QACF,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACvF,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IACxG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAc,EAAE,GAAW;IACtD,OAAO,kBAAkB,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAc;IACxC,OAAO,EAAE;SACN,MAAM,EAAE;SACR,IAAI,CAAC,OAAO,CAAC;SACb,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,WAAW,GAAG,2BAA2B,CAC7C,CAAC,CAAC,iBAAiB,EACnB,CAAC,CAAC,kBAAkB,EACpB,CAAC,CAAC,wBAAwB,CAC3B,CAAC;QACF,MAAM,UAAU,GAAG,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACvD,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,iBAAiB,EAAE,WAAW,CAAC,OAAO;YACtC,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,wBAAwB,EAAE,WAAW,CAAC,wBAAwB;YAC9D,UAAU;SACX,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAc,EAAE,EAAU,EAAE,UAAoC;IACnG,MAAM,MAAM,GAAG,EAAE;SACd,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,EAAE,UAAU,EAAE,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;SACpD,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SACzB,GAAG,EAAE,CAAC;IACT,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,EAAc,EAAE,EAAU,EAAE,WAA6B;IAC/F,MAAM,MAAM,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC3E,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACnH,MAAM,IAAI,UAAU,CAAC,mBAAmB,EAAE,oEAAoE,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,MAAM,GAAG,EAAE;SACd,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC;QACH,iBAAiB,EAAE,MAAM,CAAC,OAAO;QACjC,kBAAkB,EAAE,2BAA2B,CAAC,MAAM,CAAC;QACvD,wBAAwB,EAAE,iCAAiC,CAAC,MAAM,CAAC;KACpE,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SACzB,GAAG,EAAE,CAAC;IACT,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5B,CAAC;AAOD,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,EAAc,EAAE,EAAU,EAAE,MAAoB;IAC3E,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC3E,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACjH,MAAM,IAAI,UAAU,CAAC,mBAAmB,EAAE,oEAAoE,CAAC,CAAC;IAClH,CAAC;IACD,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC;QACH,GAAG,CAAC,MAAM;YACR,CAAC,CAAC;gBACE,iBAAiB,EAAE,MAAM,CAAC,OAAO;gBACjC,kBAAkB,EAAE,2BAA2B,CAAC,MAAM,CAAC;gBACvD,wBAAwB,EAAE,iCAAiC,CAAC,MAAM,CAAC;aACpE;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnG,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SACzB,GAAG,EAAE,CAAC;IACT,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAc,EAAE,EAAU;IACxD,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACtE,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,2BAA2B,CAC7C,GAAG,CAAC,iBAAiB,EACrB,GAAG,CAAC,kBAAkB,EACtB,GAAG,CAAC,wBAAwB,CAC7B,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,gBAAgB,CAAC;YAAE,OAAO,KAAK,CAAC;QAChE,OAAO,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAc,EAAE,WAAoB;IACtE,OAAO,EAAE;SACN,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;SAC1B,IAAI,CAAC,OAAO,CAAC;SACb,GAAG,EAAE;SACL,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,WAAW,IAAI,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAc,EAAE,EAAU;IACrD,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAClE,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5B,CAAC"}