@pacspace-io/sdk 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +65 -9
  2. package/dist/client.d.ts +33 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +294 -19
  5. package/dist/client.js.map +1 -1
  6. package/dist/errors/index.d.ts +24 -1
  7. package/dist/errors/index.d.ts.map +1 -1
  8. package/dist/errors/index.js +44 -4
  9. package/dist/errors/index.js.map +1 -1
  10. package/dist/index.d.ts +49 -11
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +106 -7
  13. package/dist/index.js.map +1 -1
  14. package/dist/resources/balance.d.ts +207 -13
  15. package/dist/resources/balance.d.ts.map +1 -1
  16. package/dist/resources/balance.js +356 -16
  17. package/dist/resources/balance.js.map +1 -1
  18. package/dist/resources/submission.d.ts +79 -0
  19. package/dist/resources/submission.d.ts.map +1 -0
  20. package/dist/resources/submission.js +398 -0
  21. package/dist/resources/submission.js.map +1 -0
  22. package/dist/types/balance.d.ts +489 -19
  23. package/dist/types/balance.d.ts.map +1 -1
  24. package/dist/types/config.d.ts +51 -1
  25. package/dist/types/config.d.ts.map +1 -1
  26. package/dist/types/submission.d.ts +125 -0
  27. package/dist/types/submission.d.ts.map +1 -0
  28. package/dist/types/submission.js +3 -0
  29. package/dist/types/submission.js.map +1 -0
  30. package/dist/webhooks/index.d.ts +1 -1
  31. package/dist/webhooks/index.d.ts.map +1 -1
  32. package/dist/webhooks/types.d.ts +27 -31
  33. package/dist/webhooks/types.d.ts.map +1 -1
  34. package/dist/webhooks/types.js +0 -3
  35. package/dist/webhooks/types.js.map +1 -1
  36. package/dist/webhooks/verify.d.ts +5 -0
  37. package/dist/webhooks/verify.d.ts.map +1 -1
  38. package/dist/webhooks/verify.js +19 -4
  39. package/dist/webhooks/verify.js.map +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,398 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubmissionCoordinator = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const errors_1 = require("../errors");
6
+ const PROFILE_DEFAULT_CADENCE_MS = {
7
+ daily: 86400000,
8
+ sub_daily: 21600000, // DEFAULT UNVALIDATED (6h)
9
+ immediate: 0,
10
+ };
11
+ const SHUTDOWN_SIGNALS = ['SIGINT', 'SIGTERM', 'beforeExit'];
12
+ /**
13
+ * Tenant-owned metering submission automation.
14
+ *
15
+ * This coordinator only submits tenant-produced summaries. It does not infer
16
+ * or meter raw product usage events.
17
+ */
18
+ class SubmissionCoordinator {
19
+ constructor(config) {
20
+ this.queue = new Map();
21
+ this.shutdownTracked = false;
22
+ this.timer = null;
23
+ this.running = false;
24
+ this.nextFlushAt = null;
25
+ this.activeFlush = null;
26
+ this.lastRequestAt = 0;
27
+ this.emitBatch = config.emitBatch;
28
+ const options = config.options ?? {};
29
+ this.profile = options.profile ?? 'daily';
30
+ this.enterprise = options.enterprise ?? false;
31
+ this.autoStart = options.autoStart ?? true;
32
+ this.autoFlushOnShutdown = options.autoFlushOnShutdown ?? true;
33
+ this.defaultReason = options.defaultReason ?? 'usage_summary';
34
+ const configuredCadenceMs = options.cadenceMs ?? PROFILE_DEFAULT_CADENCE_MS[this.profile];
35
+ this.cadenceMs = Math.max(0, Math.floor(configuredCadenceMs));
36
+ const configuredBatchSize = options.batchSize ?? 100;
37
+ this.batchSize = Math.min(100, Math.max(1, Math.floor(configuredBatchSize)));
38
+ const configuredRpm = options.maxRequestsPerMinute ?? 10;
39
+ this.maxRequestsPerMinute = Math.max(1, Math.floor(configuredRpm));
40
+ this.assertProfileCompatibility();
41
+ }
42
+ /**
43
+ * Enqueue one tenant-produced customer summary.
44
+ */
45
+ queueSummary(summary) {
46
+ const normalized = this.normalizeSummary(summary);
47
+ this.queue.set(normalized.key, normalized);
48
+ this.ensureShutdownHooks();
49
+ if (this.profile === 'immediate') {
50
+ void this.flushSummaries();
51
+ return normalized;
52
+ }
53
+ if (this.autoStart && !this.running) {
54
+ this.start();
55
+ }
56
+ return normalized;
57
+ }
58
+ /**
59
+ * Enqueue multiple tenant-produced summaries.
60
+ */
61
+ queueSummaries(summaries) {
62
+ return summaries.map((summary) => this.queueSummary(summary));
63
+ }
64
+ /**
65
+ * Returns queue and scheduler state.
66
+ */
67
+ getQueueState() {
68
+ return {
69
+ profile: this.profile,
70
+ cadenceMs: this.cadenceMs,
71
+ enterprise: this.enterprise,
72
+ queuedCount: this.queue.size,
73
+ isRunning: this.running,
74
+ nextFlushAt: this.nextFlushAt !== null
75
+ ? new Date(this.nextFlushAt).toISOString()
76
+ : null,
77
+ };
78
+ }
79
+ /**
80
+ * Start scheduled flushes for non-immediate profiles.
81
+ */
82
+ start() {
83
+ this.ensureShutdownHooks();
84
+ if (this.profile === 'immediate') {
85
+ this.running = true;
86
+ this.nextFlushAt = null;
87
+ return;
88
+ }
89
+ if (this.running) {
90
+ return;
91
+ }
92
+ this.running = true;
93
+ this.scheduleNextFlush(this.cadenceMs);
94
+ }
95
+ /**
96
+ * Stop scheduled flushes.
97
+ */
98
+ stop() {
99
+ this.running = false;
100
+ this.nextFlushAt = null;
101
+ if (this.timer) {
102
+ clearTimeout(this.timer);
103
+ this.timer = null;
104
+ }
105
+ if (this.queue.size === 0) {
106
+ this.untrackShutdownHooks();
107
+ }
108
+ }
109
+ /**
110
+ * Flush queued summaries immediately.
111
+ */
112
+ async flushSummaries(options) {
113
+ if (this.activeFlush) {
114
+ return this.activeFlush;
115
+ }
116
+ this.activeFlush = this.performFlush(options);
117
+ try {
118
+ return await this.activeFlush;
119
+ }
120
+ finally {
121
+ this.activeFlush = null;
122
+ }
123
+ }
124
+ /**
125
+ * Stop scheduler, flush pending work, and unregister shutdown hooks.
126
+ */
127
+ async shutdown() {
128
+ this.stop();
129
+ if (this.queue.size > 0) {
130
+ await this.flushSummaries();
131
+ }
132
+ this.untrackShutdownHooks();
133
+ }
134
+ assertProfileCompatibility() {
135
+ if (!this.enterprise &&
136
+ (this.profile === 'sub_daily' || this.profile === 'immediate')) {
137
+ throw new errors_1.PacSpaceError(`Submission profile "${this.profile}" is enterprise-only. Set enterprise: true to enable this profile.`, 0, 'INVALID_SUBMISSION_PROFILE');
138
+ }
139
+ if (this.profile !== 'immediate' && this.cadenceMs <= 0) {
140
+ throw new errors_1.PacSpaceError(`Submission profile "${this.profile}" requires cadenceMs > 0.`, 0, 'INVALID_SUBMISSION_PROFILE');
141
+ }
142
+ }
143
+ normalizeSummary(summary) {
144
+ const customerId = summary.customerId.trim();
145
+ if (!customerId) {
146
+ throw new errors_1.PacSpaceError('customerId is required for summary submission.', 0, 'INVALID_SUMMARY');
147
+ }
148
+ if (!Number.isFinite(summary.delta) || summary.delta === 0) {
149
+ throw new errors_1.PacSpaceError('delta must be a finite non-zero number for summary submission.', 0, 'INVALID_SUMMARY');
150
+ }
151
+ const windowStart = this.normalizeIso(summary.windowStart, 'windowStart');
152
+ const windowEnd = this.normalizeIso(summary.windowEnd, 'windowEnd');
153
+ if (windowEnd <= windowStart) {
154
+ throw new errors_1.PacSpaceError('windowEnd must be later than windowStart.', 0, 'INVALID_SUMMARY');
155
+ }
156
+ const key = `${customerId}|${windowStart}|${windowEnd}`;
157
+ const referenceId = summary.referenceId?.trim() || this.buildReferenceId(summary, windowStart, windowEnd);
158
+ return {
159
+ ...summary,
160
+ customerId,
161
+ windowStart,
162
+ windowEnd,
163
+ key,
164
+ referenceId,
165
+ queuedAt: new Date().toISOString(),
166
+ reason: summary.reason?.trim() || this.defaultReason,
167
+ };
168
+ }
169
+ normalizeIso(value, field) {
170
+ const parsed = new Date(value);
171
+ if (Number.isNaN(parsed.getTime())) {
172
+ throw new errors_1.PacSpaceError(`${field} must be a valid ISO-8601 timestamp.`, 0, 'INVALID_SUMMARY');
173
+ }
174
+ return parsed.toISOString();
175
+ }
176
+ buildReferenceId(summary, windowStart, windowEnd) {
177
+ const digest = (0, crypto_1.createHash)('sha256')
178
+ .update(JSON.stringify({
179
+ customerId: summary.customerId,
180
+ delta: summary.delta,
181
+ windowStart,
182
+ windowEnd,
183
+ }))
184
+ .digest('hex')
185
+ .slice(0, 48);
186
+ return `sum_${digest}`;
187
+ }
188
+ async performFlush(options) {
189
+ const startedAt = new Date().toISOString();
190
+ const maxItems = options?.maxItems !== undefined
191
+ ? Math.max(0, Math.floor(options.maxItems))
192
+ : Number.POSITIVE_INFINITY;
193
+ const selected = Array.from(this.queue.values()).slice(0, maxItems);
194
+ const failures = [];
195
+ let submitted = 0;
196
+ let replayed = 0;
197
+ let requestCount = 0;
198
+ const keysToDelete = new Set();
199
+ if (selected.length === 0) {
200
+ return {
201
+ profile: this.profile,
202
+ startedAt,
203
+ finishedAt: new Date().toISOString(),
204
+ attempted: 0,
205
+ submitted: 0,
206
+ failed: 0,
207
+ replayed: 0,
208
+ requestCount: 0,
209
+ queuedAfterFlush: this.queue.size,
210
+ failures: [],
211
+ };
212
+ }
213
+ const chunks = this.chunk(selected, this.batchSize);
214
+ for (const chunk of chunks) {
215
+ const payload = chunk.map((item) => ({
216
+ customerId: item.customerId,
217
+ delta: item.delta,
218
+ reason: item.reason ?? this.defaultReason,
219
+ referenceId: item.referenceId,
220
+ metadata: {
221
+ summaryWindowStart: item.windowStart,
222
+ summaryWindowEnd: item.windowEnd,
223
+ summaryProfile: this.profile,
224
+ submissionType: 'tenant_summary',
225
+ ...(item.metadata ?? {}),
226
+ },
227
+ }));
228
+ try {
229
+ await this.paceRequests();
230
+ requestCount++;
231
+ const response = await this.emitBatch(payload);
232
+ const indexedResults = new Map();
233
+ for (const result of response.results ?? []) {
234
+ if (typeof result.index === 'number') {
235
+ indexedResults.set(result.index, result);
236
+ }
237
+ }
238
+ for (let index = 0; index < chunk.length; index++) {
239
+ const item = chunk[index];
240
+ const result = indexedResults.get(index);
241
+ const status = String(result?.status ?? '').toUpperCase();
242
+ const isFailed = status === 'FAILED';
243
+ if (isFailed) {
244
+ failures.push({
245
+ customerId: item.customerId,
246
+ referenceId: item.referenceId,
247
+ error: String(result?.error ?? 'Batch item failed'),
248
+ });
249
+ continue;
250
+ }
251
+ submitted += 1;
252
+ if (result?.idempotent === true) {
253
+ replayed += 1;
254
+ }
255
+ keysToDelete.add(item.key);
256
+ }
257
+ }
258
+ catch (error) {
259
+ const message = error instanceof Error ? error.message : String(error);
260
+ for (const item of chunk) {
261
+ failures.push({
262
+ customerId: item.customerId,
263
+ referenceId: item.referenceId,
264
+ error: message,
265
+ });
266
+ }
267
+ }
268
+ }
269
+ for (const key of keysToDelete) {
270
+ this.queue.delete(key);
271
+ }
272
+ const finishedAt = new Date().toISOString();
273
+ if (this.queue.size === 0 && !this.running) {
274
+ this.untrackShutdownHooks();
275
+ }
276
+ return {
277
+ profile: this.profile,
278
+ startedAt,
279
+ finishedAt,
280
+ attempted: selected.length,
281
+ submitted,
282
+ failed: failures.length,
283
+ replayed,
284
+ requestCount,
285
+ queuedAfterFlush: this.queue.size,
286
+ failures,
287
+ };
288
+ }
289
+ async paceRequests() {
290
+ const minIntervalMs = Math.ceil(60000 / this.maxRequestsPerMinute);
291
+ const now = Date.now();
292
+ const waitMs = this.lastRequestAt + minIntervalMs - now;
293
+ if (waitMs > 0) {
294
+ await this.sleep(waitMs);
295
+ }
296
+ this.lastRequestAt = Date.now();
297
+ }
298
+ chunk(items, size) {
299
+ const chunks = [];
300
+ for (let index = 0; index < items.length; index += size) {
301
+ chunks.push(items.slice(index, index + size));
302
+ }
303
+ return chunks;
304
+ }
305
+ scheduleNextFlush(delayMs) {
306
+ if (!this.running || this.profile === 'immediate') {
307
+ return;
308
+ }
309
+ if (this.timer) {
310
+ clearTimeout(this.timer);
311
+ }
312
+ const safeDelay = Math.max(1, delayMs);
313
+ this.nextFlushAt = Date.now() + safeDelay;
314
+ this.timer = setTimeout(() => {
315
+ void this.onScheduledFlush();
316
+ }, safeDelay);
317
+ this.timer.unref?.();
318
+ }
319
+ async onScheduledFlush() {
320
+ this.timer = null;
321
+ if (!this.running || this.profile === 'immediate') {
322
+ return;
323
+ }
324
+ this.nextFlushAt = null;
325
+ try {
326
+ await this.flushSummaries();
327
+ }
328
+ finally {
329
+ if (this.running) {
330
+ this.scheduleNextFlush(this.cadenceMs);
331
+ }
332
+ }
333
+ }
334
+ ensureShutdownHooks() {
335
+ if (!this.autoFlushOnShutdown) {
336
+ return;
337
+ }
338
+ if (this.shutdownTracked) {
339
+ return;
340
+ }
341
+ this.trackShutdownHooks();
342
+ }
343
+ static async flushTrackedCoordinators() {
344
+ for (const coordinator of Array.from(SubmissionCoordinator.trackedCoordinators)) {
345
+ try {
346
+ await coordinator.flushSummaries();
347
+ }
348
+ catch {
349
+ // Best-effort shutdown flush. Errors are intentionally ignored.
350
+ }
351
+ }
352
+ }
353
+ trackShutdownHooks() {
354
+ if (typeof process === 'undefined' || typeof process.on !== 'function') {
355
+ return;
356
+ }
357
+ if (!SubmissionCoordinator.shutdownHooksRegistered) {
358
+ for (const signal of SHUTDOWN_SIGNALS) {
359
+ process.on(signal, SubmissionCoordinator.shutdownHandlers[signal]);
360
+ }
361
+ SubmissionCoordinator.shutdownHooksRegistered = true;
362
+ }
363
+ SubmissionCoordinator.trackedCoordinators.add(this);
364
+ this.shutdownTracked = true;
365
+ }
366
+ untrackShutdownHooks() {
367
+ SubmissionCoordinator.trackedCoordinators.delete(this);
368
+ this.shutdownTracked = false;
369
+ if (SubmissionCoordinator.trackedCoordinators.size > 0 ||
370
+ !SubmissionCoordinator.shutdownHooksRegistered ||
371
+ typeof process === 'undefined' ||
372
+ typeof process.off !== 'function') {
373
+ return;
374
+ }
375
+ for (const signal of SHUTDOWN_SIGNALS) {
376
+ process.off(signal, SubmissionCoordinator.shutdownHandlers[signal]);
377
+ }
378
+ SubmissionCoordinator.shutdownHooksRegistered = false;
379
+ }
380
+ sleep(ms) {
381
+ return new Promise((resolve) => setTimeout(resolve, ms));
382
+ }
383
+ }
384
+ exports.SubmissionCoordinator = SubmissionCoordinator;
385
+ SubmissionCoordinator.trackedCoordinators = new Set();
386
+ SubmissionCoordinator.shutdownHooksRegistered = false;
387
+ SubmissionCoordinator.shutdownHandlers = {
388
+ SIGINT: () => {
389
+ void SubmissionCoordinator.flushTrackedCoordinators();
390
+ },
391
+ SIGTERM: () => {
392
+ void SubmissionCoordinator.flushTrackedCoordinators();
393
+ },
394
+ beforeExit: () => {
395
+ void SubmissionCoordinator.flushTrackedCoordinators();
396
+ },
397
+ };
398
+ //# sourceMappingURL=submission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission.js","sourceRoot":"","sources":["../../src/resources/submission.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AACpC,sCAA0C;AAsB1C,MAAM,0BAA0B,GAAsC;IACpE,KAAK,EAAE,QAAU;IACjB,SAAS,EAAE,QAAU,EAAE,2BAA2B;IAClD,SAAS,EAAE,CAAC;CACb,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAU,CAAC;AAEtE;;;;;GAKG;AACH,MAAa,qBAAqB;IAqChC,YAAY,MAAmC;QAT9B,UAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;QACvD,oBAAe,GAAG,KAAK,CAAC;QAExB,UAAK,GAAyC,IAAI,CAAC;QACnD,YAAO,GAAG,KAAK,CAAC;QAChB,gBAAW,GAAkB,IAAI,CAAC;QAClC,gBAAW,GAAuC,IAAI,CAAC;QACvD,kBAAa,GAAG,CAAC,CAAC;QAGxB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAElC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC3C,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC;QAC/D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,eAAe,CAAC;QAE9D,MAAM,mBAAmB,GACvB,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAE9D,MAAM,mBAAmB,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAE7E,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAEnE,IAAI,CAAC,0BAA0B,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAA6B;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,SAAiC;QAC9C,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC5B,SAAS,EAAE,IAAI,CAAC,OAAO;YACvB,WAAW,EACT,IAAI,CAAC,WAAW,KAAK,IAAI;gBACvB,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE;gBAC1C,CAAC,CAAC,IAAI;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,OAA+B;QAE/B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC;QAChC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEO,0BAA0B;QAChC,IACE,CAAC,IAAI,CAAC,UAAU;YAChB,CAAC,IAAI,CAAC,OAAO,KAAK,WAAW,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,CAAC,EAC9D,CAAC;YACD,MAAM,IAAI,sBAAa,CACrB,uBAAuB,IAAI,CAAC,OAAO,oEAAoE,EACvG,CAAC,EACD,4BAA4B,CAC7B,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,sBAAa,CACrB,uBAAuB,IAAI,CAAC,OAAO,2BAA2B,EAC9D,CAAC,EACD,4BAA4B,CAC7B,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,OAA6B;QACpD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,sBAAa,CACrB,gDAAgD,EAChD,CAAC,EACD,iBAAiB,CAClB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,sBAAa,CACrB,gEAAgE,EAChE,CAAC,EACD,iBAAiB,CAClB,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACpE,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,sBAAa,CACrB,2CAA2C,EAC3C,CAAC,EACD,iBAAiB,CAClB,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QACxD,MAAM,WAAW,GACf,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAExF,OAAO;YACL,GAAG,OAAO;YACV,UAAU;YACV,WAAW;YACX,SAAS;YACT,GAAG;YACH,WAAW;YACX,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa;SACrD,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,KAAa,EAAE,KAAa;QAC/C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,sBAAa,CACrB,GAAG,KAAK,sCAAsC,EAC9C,CAAC,EACD,iBAAiB,CAClB,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEO,gBAAgB,CACtB,OAA6B,EAC7B,WAAmB,EACnB,SAAiB;QAEjB,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC;aAChC,MAAM,CACL,IAAI,CAAC,SAAS,CAAC;YACb,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW;YACX,SAAS;SACV,CAAC,CACH;aACA,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,OAAO,OAAO,MAAM,EAAE,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,OAA+B;QAE/B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,QAAQ,GACZ,OAAO,EAAE,QAAQ,KAAK,SAAS;YAC7B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3C,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAE/B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACpE,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAE3C,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS;gBACT,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,CAAC;gBACT,QAAQ,EAAE,CAAC;gBACX,YAAY,EAAE,CAAC;gBACf,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACjC,QAAQ,EAAE,EAAE;aACb,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAChD,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa;gBACzC,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,QAAQ,EAAE;oBACR,kBAAkB,EAAE,IAAI,CAAC,WAAW;oBACpC,gBAAgB,EAAE,IAAI,CAAC,SAAS;oBAChC,cAAc,EAAE,IAAI,CAAC,OAAO;oBAC5B,cAAc,EAAE,gBAAgB;oBAChC,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;iBACzB;aACF,CAAC,CAAC,CAAC;YAEJ,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1B,YAAY,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM,cAAc,GAAG,IAAI,GAAG,EAA6C,CAAC;gBAC5E,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;oBAC5C,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;wBACrC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;gBAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;oBAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,QAAQ,CAAC;oBACrC,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,IAAI,CAAC;4BACZ,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,mBAAmB,CAAC;yBACpD,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;oBACD,SAAS,IAAI,CAAC,CAAC;oBACf,IAAI,MAAM,EAAE,UAAU,KAAK,IAAI,EAAE,CAAC;wBAChC,QAAQ,IAAI,CAAC,CAAC;oBAChB,CAAC;oBACD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,QAAQ,CAAC,IAAI,CAAC;wBACZ,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,KAAK,EAAE,OAAO;qBACf,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS;YACT,UAAU;YACV,SAAS,EAAE,QAAQ,CAAC,MAAM;YAC1B,SAAS;YACT,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ;YACR,YAAY;YACZ,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACjC,QAAQ;SACT,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,KAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,GAAG,aAAa,GAAG,GAAG,CAAC;QACxD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAClC,CAAC;IAEO,KAAK,CAAI,KAAU,EAAE,IAAY;QACvC,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,iBAAiB,CAAC,OAAe;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC/B,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,wBAAwB;QAC3C,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,IAAI,CAClC,qBAAqB,CAAC,mBAAmB,CAC1C,EAAE,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,WAAW,CAAC,cAAc,EAAE,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,gEAAgE;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,kBAAkB;QACxB,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;YACvE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,CAAC;YACnD,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;gBACtC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,qBAAqB,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACvD,CAAC;QACD,qBAAqB,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEO,oBAAoB;QAC1B,qBAAqB,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAE7B,IACE,qBAAqB,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC;YAClD,CAAC,qBAAqB,CAAC,uBAAuB;YAC9C,OAAO,OAAO,KAAK,WAAW;YAC9B,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,EACjC,CAAC;YACD,OAAO;QACT,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,qBAAqB,CAAC,uBAAuB,GAAG,KAAK,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;;AAheH,sDAieC;AAheyB,yCAAmB,GAAG,IAAI,GAAG,EAAyB,AAAnC,CAAoC;AAChE,6CAAuB,GAAG,KAAK,AAAR,CAAS;AACvB,sCAAgB,GAGpC;IACF,MAAM,EAAE,GAAG,EAAE;QACX,KAAK,qBAAqB,CAAC,wBAAwB,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,GAAG,EAAE;QACZ,KAAK,qBAAqB,CAAC,wBAAwB,EAAE,CAAC;IACxD,CAAC;IACD,UAAU,EAAE,GAAG,EAAE;QACf,KAAK,qBAAqB,CAAC,wBAAwB,EAAE,CAAC;IACxD,CAAC;CACF,AAbuC,CAatC"}