@armor/zuora-mcp 0.0.0-development

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 (47) hide show
  1. package/.env.example +16 -0
  2. package/README.md +249 -0
  3. package/dist/cli.d.ts +15 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +73 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +26 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +56 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/index.d.ts +22 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +148 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/prompts.d.ts +11 -0
  16. package/dist/prompts.d.ts.map +1 -0
  17. package/dist/prompts.js +236 -0
  18. package/dist/prompts.js.map +1 -0
  19. package/dist/resources.d.ts +11 -0
  20. package/dist/resources.d.ts.map +1 -0
  21. package/dist/resources.js +526 -0
  22. package/dist/resources.js.map +1 -0
  23. package/dist/setup.d.ts +12 -0
  24. package/dist/setup.d.ts.map +1 -0
  25. package/dist/setup.js +188 -0
  26. package/dist/setup.js.map +1 -0
  27. package/dist/token-manager.d.ts +34 -0
  28. package/dist/token-manager.d.ts.map +1 -0
  29. package/dist/token-manager.js +103 -0
  30. package/dist/token-manager.js.map +1 -0
  31. package/dist/tools.d.ts +1096 -0
  32. package/dist/tools.d.ts.map +1 -0
  33. package/dist/tools.js +2841 -0
  34. package/dist/tools.js.map +1 -0
  35. package/dist/types.d.ts +758 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +5 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/zoql-helpers.d.ts +68 -0
  40. package/dist/zoql-helpers.d.ts.map +1 -0
  41. package/dist/zoql-helpers.js +154 -0
  42. package/dist/zoql-helpers.js.map +1 -0
  43. package/dist/zuora-client.d.ts +184 -0
  44. package/dist/zuora-client.d.ts.map +1 -0
  45. package/dist/zuora-client.js +583 -0
  46. package/dist/zuora-client.js.map +1 -0
  47. package/package.json +60 -0
@@ -0,0 +1,583 @@
1
+ /**
2
+ * Zuora REST API Client
3
+ * Direct REST calls via native fetch - no third-party HTTP dependencies
4
+ * Security-first: Input validation, rate limiting awareness, token lifecycle
5
+ */
6
+ import { TokenManager } from "./token-manager.js";
7
+ // Fields that must NEVER appear in debug logs (payment credentials + PII)
8
+ const SENSITIVE_FIELD_PATTERNS = [
9
+ "creditcard",
10
+ "bankaccount",
11
+ "cardnumber",
12
+ "securitycode",
13
+ "routingnumber",
14
+ "iban",
15
+ "authorization",
16
+ "password",
17
+ "secret",
18
+ "accesstoken",
19
+ "refreshtoken",
20
+ "access_token",
21
+ "client_secret",
22
+ "jti",
23
+ "gatewayresponse",
24
+ "workemail",
25
+ "email",
26
+ "firstname",
27
+ "lastname",
28
+ "address1",
29
+ "postalcode",
30
+ "phone",
31
+ "fax",
32
+ "taxid",
33
+ "vatid",
34
+ ];
35
+ export class ZuoraClient {
36
+ static DEFAULT_REQUEST_TIMEOUT_MS = 20_000;
37
+ static MAX_ATTEMPTS = 3;
38
+ static RETRYABLE_STATUS_CODES = new Set([
39
+ 429, 502, 503, 504,
40
+ ]);
41
+ static IDEMPOTENT_METHODS = new Set([
42
+ "GET",
43
+ "HEAD",
44
+ "OPTIONS",
45
+ "PUT",
46
+ "DELETE",
47
+ ]);
48
+ baseUrl;
49
+ rootUrl;
50
+ tokenManager;
51
+ debug;
52
+ constructor(config) {
53
+ this.rootUrl = config.zuoraBaseUrl;
54
+ this.baseUrl = `${config.zuoraBaseUrl}/v1`;
55
+ this.tokenManager = new TokenManager(config);
56
+ this.debug = config.debug;
57
+ }
58
+ log(message, data) {
59
+ if (!this.debug)
60
+ return;
61
+ const sanitized = data !== undefined ? this.sanitizeForLog(data) : "";
62
+ console.error(`[ZuoraClient] ${message}`, sanitized);
63
+ }
64
+ /**
65
+ * Strip sensitive fields from data before logging.
66
+ * Prevents PII and payment data from appearing in stderr/logs.
67
+ * Recurses into nested objects and arrays.
68
+ */
69
+ sanitizeForLog(data) {
70
+ if (data === null || data === undefined)
71
+ return data;
72
+ if (typeof data !== "object")
73
+ return data;
74
+ if (Array.isArray(data)) {
75
+ return data.map((item) => this.sanitizeForLog(item));
76
+ }
77
+ const sanitized = {};
78
+ for (const [key, value] of Object.entries(data)) {
79
+ const isSensitive = SENSITIVE_FIELD_PATTERNS.some((pattern) => key.toLowerCase().includes(pattern));
80
+ sanitized[key] = isSensitive
81
+ ? "[REDACTED]"
82
+ : this.sanitizeForLog(value);
83
+ }
84
+ return sanitized;
85
+ }
86
+ isIdempotentMethod(method) {
87
+ return ZuoraClient.IDEMPOTENT_METHODS.has(method);
88
+ }
89
+ async sleep(ms) {
90
+ await new Promise((resolve) => setTimeout(resolve, ms));
91
+ }
92
+ parseRetryAfterMs(response) {
93
+ const retryAfter = response.headers.get("retry-after");
94
+ if (!retryAfter)
95
+ return null;
96
+ const seconds = Number(retryAfter);
97
+ if (Number.isFinite(seconds)) {
98
+ return Math.max(0, Math.round(seconds * 1000));
99
+ }
100
+ const dateMs = Date.parse(retryAfter);
101
+ if (Number.isNaN(dateMs))
102
+ return null;
103
+ return Math.max(0, dateMs - Date.now());
104
+ }
105
+ getRetryDelayMs(attempt, response) {
106
+ const retryAfterMs = response ? this.parseRetryAfterMs(response) : null;
107
+ if (retryAfterMs !== null) {
108
+ return Math.min(retryAfterMs, 30_000);
109
+ }
110
+ const exponential = Math.min(5_000, 250 * 2 ** (attempt - 1));
111
+ const jitter = Math.floor(Math.random() * 150);
112
+ return exponential + jitter;
113
+ }
114
+ async fetchWithResilience(method, url, init) {
115
+ const normalizedMethod = method.toUpperCase();
116
+ const isIdempotent = this.isIdempotentMethod(normalizedMethod);
117
+ const canRetryByStatus = isIdempotent;
118
+ const timeoutMs = init.timeoutMs ?? ZuoraClient.DEFAULT_REQUEST_TIMEOUT_MS;
119
+ for (let attempt = 1; attempt <= ZuoraClient.MAX_ATTEMPTS; attempt++) {
120
+ const controller = new AbortController();
121
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
122
+ try {
123
+ const response = await fetch(url, {
124
+ method: normalizedMethod,
125
+ headers: init.headers,
126
+ body: init.body,
127
+ signal: controller.signal,
128
+ });
129
+ if (attempt < ZuoraClient.MAX_ATTEMPTS &&
130
+ canRetryByStatus &&
131
+ ZuoraClient.RETRYABLE_STATUS_CODES.has(response.status)) {
132
+ const delayMs = this.getRetryDelayMs(attempt, response);
133
+ this.log(`Retrying ${normalizedMethod} ${url} after status ${response.status} ` +
134
+ `(attempt ${attempt + 1}/${ZuoraClient.MAX_ATTEMPTS}) in ${delayMs}ms`);
135
+ await this.sleep(delayMs);
136
+ continue;
137
+ }
138
+ return response;
139
+ }
140
+ catch (error) {
141
+ const isTransportFailure = error instanceof Error &&
142
+ (error.name === "AbortError" || error instanceof TypeError);
143
+ if (isTransportFailure &&
144
+ isIdempotent &&
145
+ attempt < ZuoraClient.MAX_ATTEMPTS) {
146
+ const delayMs = this.getRetryDelayMs(attempt);
147
+ this.log(`Transport failure on ${normalizedMethod} ${url}, ` +
148
+ `retrying (attempt ${attempt + 1}/${ZuoraClient.MAX_ATTEMPTS}) in ${delayMs}ms`);
149
+ await this.sleep(delayMs);
150
+ continue;
151
+ }
152
+ throw error;
153
+ }
154
+ finally {
155
+ clearTimeout(timeoutId);
156
+ }
157
+ }
158
+ throw new Error("Max retry attempts exceeded");
159
+ }
160
+ /**
161
+ * Core request method. Handles auth, retry, and Zuora-specific response parsing.
162
+ * For idempotent methods, automatically retries once on 401 (token may have
163
+ * expired mid-session). Non-idempotent methods (POST) are NOT retried on 401
164
+ * to prevent duplicate financial operations.
165
+ */
166
+ async request(method, endpoint, body, extraHeaders, options) {
167
+ const base = options?.useRootUrl ? this.rootUrl : this.baseUrl;
168
+ const url = `${base}${endpoint}`;
169
+ const normalizedMethod = method.toUpperCase();
170
+ const token = await this.tokenManager.getAccessToken();
171
+ const headers = {
172
+ ...extraHeaders,
173
+ Authorization: `Bearer ${token}`,
174
+ "Content-Type": "application/json",
175
+ Accept: "application/json",
176
+ };
177
+ this.log(`${normalizedMethod} ${endpoint}`, body);
178
+ const response = await this.fetchWithResilience(normalizedMethod, url, {
179
+ headers,
180
+ body: body ? JSON.stringify(body) : undefined,
181
+ });
182
+ // Handle 401 with one token refresh retry (idempotent methods only)
183
+ if (response.status === 401 &&
184
+ this.isIdempotentMethod(normalizedMethod)) {
185
+ this.log("Received 401 on idempotent request, refreshing token and retrying");
186
+ const newToken = await this.tokenManager.forceRefresh();
187
+ headers.Authorization = `Bearer ${newToken}`;
188
+ const retryResponse = await this.fetchWithResilience(normalizedMethod, url, {
189
+ headers,
190
+ body: body ? JSON.stringify(body) : undefined,
191
+ });
192
+ return this.parseResponse(retryResponse, endpoint);
193
+ }
194
+ // For non-idempotent 401s, refresh token for next call but fail this one
195
+ if (response.status === 401) {
196
+ this.log("Received 401 on non-idempotent request, refreshing token for next call");
197
+ void this.tokenManager.forceRefresh();
198
+ }
199
+ return this.parseResponse(response, endpoint);
200
+ }
201
+ /**
202
+ * Parse Zuora API response. Handles Zuora's inconsistent response envelope:
203
+ * - Some endpoints return HTTP errors with JSON body
204
+ * - Some return 200 with { success: false } in body
205
+ */
206
+ async parseResponse(response, endpoint) {
207
+ const text = await response.text();
208
+ if (!response.ok) {
209
+ let errorMessage = `Zuora API error (${response.status}) on ${endpoint}`;
210
+ try {
211
+ const errorBody = JSON.parse(text);
212
+ if (errorBody.reasons?.length) {
213
+ errorMessage += `: ${errorBody.reasons.map((r) => r.message).join("; ")}`;
214
+ }
215
+ else if (errorBody.message) {
216
+ errorMessage += `: ${errorBody.message}`;
217
+ }
218
+ }
219
+ catch {
220
+ if (text.length > 0) {
221
+ errorMessage += `: ${text.slice(0, 500)}`;
222
+ }
223
+ }
224
+ // Scrub any accidentally leaked bearer tokens from error messages
225
+ const sanitized = errorMessage.replace(/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g, "Bearer [REDACTED]");
226
+ throw new Error(sanitized);
227
+ }
228
+ // Handle empty responses (204 No Content, etc.)
229
+ if (!text.trim()) {
230
+ if (response.status === 204) {
231
+ return {};
232
+ }
233
+ throw new Error(`Zuora API returned empty body for ${endpoint} (status ${response.status})`);
234
+ }
235
+ const data = JSON.parse(text);
236
+ // Zuora sometimes returns 200 with success: false
237
+ if (data.success === false) {
238
+ const reasons = data.reasons;
239
+ const message = reasons?.map((r) => r.message).join("; ") ?? "Unknown error";
240
+ throw new Error(`Zuora operation failed on ${endpoint}: ${message}`);
241
+ }
242
+ return data;
243
+ }
244
+ /**
245
+ * Like request<T> but returns raw text instead of JSON.
246
+ * Needed for endpoints that return XML (e.g., GET /v1/describe/{objectType}).
247
+ * Handles auth, retry on 401 for idempotent methods, same as request<T>.
248
+ */
249
+ async requestText(method, endpoint, extraHeaders) {
250
+ const url = `${this.baseUrl}${endpoint}`;
251
+ const normalizedMethod = method.toUpperCase();
252
+ const token = await this.tokenManager.getAccessToken();
253
+ const headers = {
254
+ ...extraHeaders,
255
+ Authorization: `Bearer ${token}`,
256
+ Accept: "application/xml",
257
+ };
258
+ this.log(`${normalizedMethod} ${endpoint} (text)`);
259
+ const response = await this.fetchWithResilience(normalizedMethod, url, {
260
+ headers,
261
+ });
262
+ if (response.status === 401 &&
263
+ this.isIdempotentMethod(normalizedMethod)) {
264
+ this.log("Received 401 on text request, refreshing token and retrying");
265
+ const newToken = await this.tokenManager.forceRefresh();
266
+ headers.Authorization = `Bearer ${newToken}`;
267
+ const retryResponse = await this.fetchWithResilience(normalizedMethod, url, { headers });
268
+ if (!retryResponse.ok) {
269
+ const text = await retryResponse.text();
270
+ throw new Error(`Zuora API error (${retryResponse.status}) on ${endpoint}: ${text.slice(0, 500)}`);
271
+ }
272
+ return retryResponse.text();
273
+ }
274
+ if (!response.ok) {
275
+ const text = await response.text();
276
+ throw new Error(`Zuora API error (${response.status}) on ${endpoint}: ${text.slice(0, 500)}`);
277
+ }
278
+ return response.text();
279
+ }
280
+ /**
281
+ * Extract a single XML element value by tag name.
282
+ * Returns empty string if not found.
283
+ */
284
+ static extractXmlValue(xml, tag) {
285
+ const regex = new RegExp(`<${tag}>([^<]*)</${tag}>`);
286
+ const match = regex.exec(xml);
287
+ return match?.[1] ?? "";
288
+ }
289
+ /**
290
+ * Extract a boolean XML element value by tag name.
291
+ */
292
+ static extractXmlBool(xml, tag) {
293
+ return ZuoraClient.extractXmlValue(xml, tag).toLowerCase() === "true";
294
+ }
295
+ /**
296
+ * Parse Zuora describe XML response into structured field metadata.
297
+ * The XML has a predictable <field>...</field> structure.
298
+ */
299
+ static parseDescribeXml(xml, objectType) {
300
+ const fields = [];
301
+ const fieldRegex = /<field>([\s\S]*?)<\/field>/g;
302
+ let match;
303
+ while ((match = fieldRegex.exec(xml)) !== null) {
304
+ const fieldXml = match[1];
305
+ const name = ZuoraClient.extractXmlValue(fieldXml, "name");
306
+ if (!name)
307
+ continue;
308
+ const maxlengthStr = ZuoraClient.extractXmlValue(fieldXml, "maxlength");
309
+ const maxlength = maxlengthStr ? parseInt(maxlengthStr, 10) : undefined;
310
+ fields.push({
311
+ name,
312
+ label: ZuoraClient.extractXmlValue(fieldXml, "label") || name,
313
+ type: ZuoraClient.extractXmlValue(fieldXml, "type") || "unknown",
314
+ selectable: ZuoraClient.extractXmlBool(fieldXml, "selectable"),
315
+ createable: ZuoraClient.extractXmlBool(fieldXml, "createable"),
316
+ updateable: ZuoraClient.extractXmlBool(fieldXml, "updateable"),
317
+ filterable: ZuoraClient.extractXmlBool(fieldXml, "filterable"),
318
+ custom: ZuoraClient.extractXmlBool(fieldXml, "custom"),
319
+ required: ZuoraClient.extractXmlBool(fieldXml, "required"),
320
+ ...(maxlength !== undefined && !isNaN(maxlength) ? { maxlength } : {}),
321
+ });
322
+ }
323
+ return {
324
+ objectName: objectType,
325
+ fields,
326
+ fieldCount: fields.length,
327
+ };
328
+ }
329
+ // ==================== Account Operations ====================
330
+ async getAccount(accountKey) {
331
+ return this.request("GET", `/accounts/${encodeURIComponent(accountKey)}`);
332
+ }
333
+ async getAccountSummary(accountKey) {
334
+ return this.request("GET", `/accounts/${encodeURIComponent(accountKey)}/summary`);
335
+ }
336
+ // ==================== Invoice Operations ====================
337
+ async getInvoice(invoiceId) {
338
+ return this.request("GET", `/invoices/${encodeURIComponent(invoiceId)}`);
339
+ }
340
+ async listInvoices(accountKey, page = 1, pageSize = 20) {
341
+ return this.request("GET", `/invoices?accountKey=${encodeURIComponent(accountKey)}&page=${page}&pageSize=${pageSize}`);
342
+ }
343
+ // ==================== Subscription Operations ====================
344
+ async getSubscription(subscriptionKey) {
345
+ return this.request("GET", `/subscriptions/${encodeURIComponent(subscriptionKey)}`);
346
+ }
347
+ async listSubscriptionsByAccount(accountKey) {
348
+ return this.request("GET", `/subscriptions/accounts/${encodeURIComponent(accountKey)}`);
349
+ }
350
+ // ==================== Payment Operations ====================
351
+ async getPayment(paymentId) {
352
+ return this.request("GET", `/payments/${encodeURIComponent(paymentId)}`);
353
+ }
354
+ async listPayments(page = 1, pageSize = 20) {
355
+ return this.request("GET", `/payments?page=${page}&pageSize=${pageSize}`);
356
+ }
357
+ async listPaymentsByAccount(accountKey, page = 1, pageSize = 20) {
358
+ return this.request("GET", `/payments?accountKey=${encodeURIComponent(accountKey)}&page=${page}&pageSize=${pageSize}`);
359
+ }
360
+ // ==================== ZOQL Query Operations ====================
361
+ async executeQuery(zoqlQuery) {
362
+ return this.request("POST", "/action/query", {
363
+ queryString: zoqlQuery,
364
+ });
365
+ }
366
+ async queryMore(queryLocator) {
367
+ return this.request("POST", "/action/queryMore", {
368
+ queryLocator,
369
+ });
370
+ }
371
+ // ==================== Product Catalog ====================
372
+ async listProducts(page = 1, pageSize = 20) {
373
+ return this.request("GET", `/catalog/products?page=${page}&pageSize=${pageSize}`);
374
+ }
375
+ // ==================== Invoice File Operations ====================
376
+ async getInvoiceFiles(invoiceId) {
377
+ return this.request("GET", `/invoices/${encodeURIComponent(invoiceId)}/files`);
378
+ }
379
+ // ==================== Credit Memo Operations ====================
380
+ async getCreditMemo(creditMemoId) {
381
+ return this.request("GET", `/creditmemos/${encodeURIComponent(creditMemoId)}`);
382
+ }
383
+ async listCreditMemos(accountId, page = 1, pageSize = 20) {
384
+ const accountFilter = accountId
385
+ ? `&accountId=${encodeURIComponent(accountId)}`
386
+ : "";
387
+ return this.request("GET", `/creditmemos?page=${page}&pageSize=${pageSize}${accountFilter}`);
388
+ }
389
+ // ==================== Account Search Operations ====================
390
+ static ALLOWED_SEARCH_FIELDS = new Set([
391
+ "Name", "AccountNumber", "Status", "Currency", "Balance",
392
+ ]);
393
+ static ALLOWED_OPERATORS = new Set([
394
+ "=", "!=", "LIKE", ">", "<", ">=", "<=",
395
+ ]);
396
+ async searchAccounts(field, value, operator = "=") {
397
+ if (!ZuoraClient.ALLOWED_SEARCH_FIELDS.has(field)) {
398
+ throw new Error(`Invalid search field: ${field}`);
399
+ }
400
+ if (!ZuoraClient.ALLOWED_OPERATORS.has(operator)) {
401
+ throw new Error(`Invalid operator: ${operator}`);
402
+ }
403
+ const safeValue = value.replace(/'/g, "''");
404
+ const query = `SELECT Id, AccountNumber, Name, Status, Balance, Currency FROM Account WHERE ${field} ${operator} '${safeValue}'`;
405
+ return this.request("POST", "/action/query", {
406
+ queryString: query,
407
+ });
408
+ }
409
+ // ==================== Paginated Query ====================
410
+ /**
411
+ * Execute a ZOQL query and auto-paginate through all results.
412
+ * Combines records from executeQuery + queryMore loop.
413
+ * Used by composite tools for multi-step ZOQL chains.
414
+ */
415
+ async queryAll(zoqlQuery, maxRecords = 10_000) {
416
+ const allRecords = [];
417
+ let result = await this.executeQuery(zoqlQuery);
418
+ allRecords.push(...(result.records ?? []));
419
+ while (!result.done &&
420
+ result.queryLocator &&
421
+ allRecords.length < maxRecords) {
422
+ result = await this.queryMore(result.queryLocator);
423
+ allRecords.push(...(result.records ?? []));
424
+ }
425
+ return allRecords.length > maxRecords
426
+ ? allRecords.slice(0, maxRecords)
427
+ : allRecords;
428
+ }
429
+ // ==================== Usage Operations ====================
430
+ async listUsage(accountKey, page = 1, pageSize = 20) {
431
+ return this.request("GET", `/usage/accounts/${encodeURIComponent(accountKey)}?page=${page}&pageSize=${pageSize}`);
432
+ }
433
+ // ==================== User Operations ====================
434
+ /**
435
+ * List Zuora platform users via the SCIM v2 API.
436
+ * The User object is NOT queryable via ZOQL — the SCIM endpoint is the only way.
437
+ * Lives at /scim/v2/Users (not under /v1/), so uses rootUrl.
438
+ * SCIM filter examples: status eq "Active", userName eq "user@example.com"
439
+ */
440
+ async listUsers(startIndex = 1, count = 100, filter) {
441
+ const params = new URLSearchParams({
442
+ startIndex: String(startIndex),
443
+ count: String(count),
444
+ });
445
+ if (filter) {
446
+ params.set("filter", filter);
447
+ }
448
+ return this.request("GET", `/scim/v2/Users?${params.toString()}`, undefined, { Accept: "application/scim+json" }, { useRootUrl: true });
449
+ }
450
+ /**
451
+ * Get details of a specific Zuora platform user by ID.
452
+ * Uses SCIM v2 API at /scim/v2/Users/{id} (not under /v1/).
453
+ */
454
+ async getUser(userId) {
455
+ return this.request("GET", `/scim/v2/Users/${encodeURIComponent(userId)}`, undefined, { Accept: "application/scim+json" }, { useRootUrl: true });
456
+ }
457
+ // ==================== Bill Run Operations ====================
458
+ async getBillRun(billRunId) {
459
+ return this.request("GET", `/bill-runs/${encodeURIComponent(billRunId)}`);
460
+ }
461
+ async listBillRuns(page = 1, pageSize = 20) {
462
+ return this.request("GET", `/bill-runs?page=${page}&pageSize=${pageSize}`);
463
+ }
464
+ // ==================== Contact Operations ====================
465
+ async getContact(contactId) {
466
+ return this.request("GET", `/contacts/${encodeURIComponent(contactId)}`);
467
+ }
468
+ // ==================== Describe API ====================
469
+ /**
470
+ * Get field metadata for any Zuora object type.
471
+ * Returns XML that is parsed into structured field definitions.
472
+ * Useful for discovering field names for ZOQL queries.
473
+ */
474
+ async describeObject(objectType) {
475
+ const xml = await this.requestText("GET", `/describe/${encodeURIComponent(objectType)}`);
476
+ return ZuoraClient.parseDescribeXml(xml, objectType);
477
+ }
478
+ // ==================== Write Operations (Phase 3) ====================
479
+ /**
480
+ * Create a payment in Zuora.
481
+ * Uses Idempotency-Key header to prevent duplicate payments on retries.
482
+ * POST requests are NOT retried on 401 to prevent double-charging.
483
+ */
484
+ async createPayment(request, idempotencyKey) {
485
+ return this.request("POST", "/payments", request, { "Idempotency-Key": idempotencyKey });
486
+ }
487
+ /**
488
+ * Apply an unapplied payment to one or more invoices.
489
+ * PUT is idempotent and will be retried on 401.
490
+ */
491
+ async applyPayment(paymentId, request) {
492
+ return this.request("PUT", `/payments/${encodeURIComponent(paymentId)}/apply`, request);
493
+ }
494
+ /**
495
+ * Create a draft invoice for an account.
496
+ * Uses Idempotency-Key header to prevent duplicate invoices on retries.
497
+ * POST requests are NOT retried on 401.
498
+ */
499
+ async createInvoice(request, idempotencyKey) {
500
+ return this.request("POST", "/invoices", request, { "Idempotency-Key": idempotencyKey });
501
+ }
502
+ /**
503
+ * Post a draft invoice, changing its status to Posted.
504
+ * Once posted, the invoice becomes immutable and affects account balance.
505
+ * PUT is idempotent and will be retried on 401.
506
+ */
507
+ async postInvoice(invoiceId) {
508
+ return this.request("PUT", `/invoices/${encodeURIComponent(invoiceId)}`, { status: "Posted" });
509
+ }
510
+ /**
511
+ * Cancel a subscription.
512
+ * PUT is idempotent and will be retried on 401.
513
+ */
514
+ async cancelSubscription(subscriptionKey, request) {
515
+ return this.request("PUT", `/subscriptions/${encodeURIComponent(subscriptionKey)}/cancel`, request);
516
+ }
517
+ // ==================== Advanced Operations (Phase 4) ====================
518
+ /**
519
+ * Create a new subscription for an account.
520
+ * Uses Idempotency-Key header to prevent duplicate subscriptions on retries.
521
+ * POST requests are NOT retried on 401.
522
+ */
523
+ async createSubscription(request, idempotencyKey) {
524
+ return this.request("POST", "/subscriptions", request, { "Idempotency-Key": idempotencyKey });
525
+ }
526
+ /**
527
+ * Update an existing subscription's renewal terms, auto-renew, or notes.
528
+ * PUT is idempotent and will be retried on 401.
529
+ */
530
+ async updateSubscription(subscriptionKey, request) {
531
+ return this.request("PUT", `/subscriptions/${encodeURIComponent(subscriptionKey)}`, request);
532
+ }
533
+ /**
534
+ * Create a new billing account in Zuora.
535
+ * Uses Idempotency-Key header to prevent duplicate accounts on retries.
536
+ * POST requests are NOT retried on 401.
537
+ */
538
+ async createAccount(request, idempotencyKey) {
539
+ return this.request("POST", "/accounts", request, { "Idempotency-Key": idempotencyKey });
540
+ }
541
+ /**
542
+ * Update an existing Zuora account's name, notes, autoPay, or contact info.
543
+ * PUT is idempotent and will be retried on 401.
544
+ */
545
+ async updateAccount(accountKey, request) {
546
+ return this.request("PUT", `/accounts/${encodeURIComponent(accountKey)}`, request);
547
+ }
548
+ /**
549
+ * Create a refund against a payment.
550
+ * Uses POST /v1/payments/{paymentId}/refunds (not the legacy /v1/refunds).
551
+ * Uses Idempotency-Key header to prevent duplicate refunds on retries.
552
+ * POST requests are NOT retried on 401 to prevent double refunds.
553
+ */
554
+ async createRefund(paymentId, request, idempotencyKey) {
555
+ return this.request("POST", `/payments/${encodeURIComponent(paymentId)}/refunds`, request, { "Idempotency-Key": idempotencyKey });
556
+ }
557
+ // ==================== Bill Run Write Operations ====================
558
+ /**
559
+ * Create a bill run to generate invoices for billing cycle.
560
+ * Uses Idempotency-Key header to prevent duplicate bill runs on retries.
561
+ * POST requests are NOT retried on 401 to prevent duplicate operations.
562
+ */
563
+ async createBillRun(request, idempotencyKey) {
564
+ return this.request("POST", "/bill-runs", request, { "Idempotency-Key": idempotencyKey });
565
+ }
566
+ // ==================== Contact Write Operations ====================
567
+ /**
568
+ * Create a new contact for a Zuora account.
569
+ * Uses Idempotency-Key header to prevent duplicate contacts on retries.
570
+ * POST requests are NOT retried on 401.
571
+ */
572
+ async createContact(request, idempotencyKey) {
573
+ return this.request("POST", "/contacts", request, { "Idempotency-Key": idempotencyKey });
574
+ }
575
+ /**
576
+ * Update an existing Zuora contact's information.
577
+ * PUT is idempotent and will be retried on 401.
578
+ */
579
+ async updateContact(contactId, request) {
580
+ return this.request("PUT", `/contacts/${encodeURIComponent(contactId)}`, request);
581
+ }
582
+ }
583
+ //# sourceMappingURL=zuora-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zuora-client.js","sourceRoot":"","sources":["../src/zuora-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAmDlD,0EAA0E;AAC1E,MAAM,wBAAwB,GAAG;IAC/B,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,cAAc;IACd,eAAe;IACf,MAAM;IACN,eAAe;IACf,UAAU;IACV,QAAQ;IACR,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,KAAK;IACL,iBAAiB;IACjB,WAAW;IACX,OAAO;IACP,WAAW;IACX,UAAU;IACV,UAAU;IACV,YAAY;IACZ,OAAO;IACP,KAAK;IACL,OAAO;IACP,OAAO;CACR,CAAC;AAEF,MAAM,OAAO,WAAW;IACd,MAAM,CAAU,0BAA0B,GAAG,MAAM,CAAC;IACpD,MAAM,CAAU,YAAY,GAAG,CAAC,CAAC;IACjC,MAAM,CAAU,sBAAsB,GAAG,IAAI,GAAG,CAAC;QACvD,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;KACnB,CAAC,CAAC;IACK,MAAM,CAAU,kBAAkB,GAAG,IAAI,GAAG,CAAC;QACnD,KAAK;QACL,MAAM;QACN,SAAS;QACT,KAAK;QACL,QAAQ;KACT,CAAC,CAAC;IAEc,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,YAAY,CAAe;IAC3B,KAAK,CAAU;IAEhC,YAAY,MAAc;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,GAAG,MAAM,CAAC,YAAY,KAAK,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC5B,CAAC;IAEO,GAAG,CAAC,OAAe,EAAE,IAAc;QACzC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxB,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,iBAAiB,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,IAAa;QAClC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE1C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,SAAS,GAA4B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CACvC,IAA+B,CAChC,EAAE,CAAC;YACF,MAAM,WAAW,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5D,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CACpC,CAAC;YACF,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW;gBAC1B,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,OAAO,WAAW,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,EAAU;QAC5B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEO,iBAAiB,CAAC,QAAkB;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,eAAe,CAAC,OAAe,EAAE,QAAmB;QAC1D,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QAC/C,OAAO,WAAW,GAAG,MAAM,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,MAAc,EACd,GAAW,EACX,IAIC;QAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,YAAY,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,0BAA0B,CAAC;QAE3E,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;YACrE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;YAElE,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAChC,MAAM,EAAE,gBAAgB;oBACxB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBAEH,IACE,OAAO,GAAG,WAAW,CAAC,YAAY;oBAClC,gBAAgB;oBAChB,WAAW,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EACvD,CAAC;oBACD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oBACxD,IAAI,CAAC,GAAG,CACN,YAAY,gBAAgB,IAAI,GAAG,iBAAiB,QAAQ,CAAC,MAAM,GAAG;wBACpE,YAAY,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,YAAY,QAAQ,OAAO,IAAI,CACzE,CAAC;oBACF,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBAED,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,kBAAkB,GACtB,KAAK,YAAY,KAAK;oBACtB,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,YAAY,SAAS,CAAC,CAAC;gBAE9D,IACE,kBAAkB;oBAClB,YAAY;oBACZ,OAAO,GAAG,WAAW,CAAC,YAAY,EAClC,CAAC;oBACD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;oBAC9C,IAAI,CAAC,GAAG,CACN,wBAAwB,gBAAgB,IAAI,GAAG,IAAI;wBACjD,qBAAqB,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,YAAY,QAAQ,OAAO,IAAI,CAClF,CAAC;oBACF,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,QAAgB,EAChB,IAAc,EACd,YAAqC,EACrC,OAAkC;QAElC,MAAM,IAAI,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/D,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,QAAQ,EAAE,CAAC;QACjC,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;QAEvD,MAAM,OAAO,GAA2B;YACtC,GAAG,YAAY;YACf,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,IAAI,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;QAElD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACrE,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,oEAAoE;QACpE,IACE,QAAQ,CAAC,MAAM,KAAK,GAAG;YACvB,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EACzC,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;YAC9E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YACxD,OAAO,CAAC,aAAa,GAAG,UAAU,QAAQ,EAAE,CAAC;YAE7C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAClD,gBAAgB,EAChB,GAAG,EACH;gBACE,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAC9C,CACF,CAAC;YAEF,OAAO,IAAI,CAAC,aAAa,CAAI,aAAa,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;QAED,yEAAyE;QACzE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;YACnF,KAAK,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,aAAa,CACzB,QAAkB,EAClB,QAAgB;QAEhB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,YAAY,GAAG,oBAAoB,QAAQ,CAAC,MAAM,QAAQ,QAAQ,EAAE,CAAC;YACzE,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;gBACpD,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBAC9B,YAAY,IAAI,KAAK,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5E,CAAC;qBAAM,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;oBAC7B,YAAY,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC3C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpB,YAAY,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC5C,CAAC;YACH,CAAC;YACD,kEAAkE;YAClE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CACpC,iCAAiC,EACjC,mBAAmB,CACpB,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,EAAO,CAAC;YACjB,CAAC;YACD,MAAM,IAAI,KAAK,CACb,qCAAqC,QAAQ,YAAY,QAAQ,CAAC,MAAM,GAAG,CAC5E,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAG3B,CAAC;QAEF,kDAAkD;QAClD,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,OAAO,GACX,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,WAAW,CACvB,MAAc,EACd,QAAgB,EAChB,YAAqC;QAErC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QACzC,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;QAEvD,MAAM,OAAO,GAA2B;YACtC,GAAG,YAAY;YACf,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,MAAM,EAAE,iBAAiB;SAC1B,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,IAAI,QAAQ,SAAS,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACrE,OAAO;SACR,CAAC,CAAC;QAEH,IACE,QAAQ,CAAC,MAAM,KAAK,GAAG;YACvB,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EACzC,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YACxD,OAAO,CAAC,aAAa,GAAG,UAAU,QAAQ,EAAE,CAAC;YAE7C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAClD,gBAAgB,EAChB,GAAG,EACH,EAAE,OAAO,EAAE,CACZ,CAAC;YAEF,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,oBAAoB,aAAa,CAAC,MAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAClF,CAAC;YACJ,CAAC;YACD,OAAO,aAAa,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,oBAAoB,QAAQ,CAAC,MAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC7E,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,eAAe,CAAC,GAAW,EAAE,GAAW;QACrD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,aAAa,GAAG,GAAG,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,cAAc,CAAC,GAAW,EAAE,GAAW;QACpD,OAAO,WAAW,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IACxE,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,gBAAgB,CAC7B,GAAW,EACX,UAAkB;QAElB,MAAM,MAAM,GAAyB,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,6BAA6B,CAAC;QACjD,IAAI,KAA6B,CAAC;QAElC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,YAAY,GAAG,WAAW,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACxE,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAExE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI;gBAC7D,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,SAAS;gBAChE,UAAU,EAAE,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC;gBAC9D,UAAU,EAAE,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC;gBAC9D,UAAU,EAAE,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC;gBAC9D,UAAU,EAAE,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC;gBAC9D,MAAM,EAAE,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBACtD,QAAQ,EAAE,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC1D,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvE,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,UAAU,EAAE,UAAU;YACtB,MAAM;YACN,UAAU,EAAE,MAAM,CAAC,MAAM;SAC1B,CAAC;IACJ,CAAC;IAED,+DAA+D;IAE/D,KAAK,CAAC,UAAU,CAAC,UAAkB;QACjC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,UAAkB;QAElB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,UAAU,CAAC,UAAU,CACtD,CAAC;IACJ,CAAC;IAED,+DAA+D;IAE/D,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAC7C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,UAAkB,EAClB,OAAe,CAAC,EAChB,WAAmB,EAAE;QAErB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,wBAAwB,kBAAkB,CAAC,UAAU,CAAC,SAAS,IAAI,aAAa,QAAQ,EAAE,CAC3F,CAAC;IACJ,CAAC;IAED,oEAAoE;IAEpE,KAAK,CAAC,eAAe,CACnB,eAAuB;QAEvB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,kBAAkB,kBAAkB,CAAC,eAAe,CAAC,EAAE,CACxD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,UAAkB;QAElB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,2BAA2B,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAC5D,CAAC;IACJ,CAAC;IAED,+DAA+D;IAE/D,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAC7C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,OAAe,CAAC,EAChB,WAAmB,EAAE;QAErB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,kBAAkB,IAAI,aAAa,QAAQ,EAAE,CAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,UAAkB,EAClB,OAAe,CAAC,EAChB,WAAmB,EAAE;QAErB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,wBAAwB,kBAAkB,CAAC,UAAU,CAAC,SAAS,IAAI,aAAa,QAAQ,EAAE,CAC3F,CAAC;IACJ,CAAC;IAED,kEAAkE;IAElE,KAAK,CAAC,YAAY,CAAC,SAAiB;QAClC,OAAO,IAAI,CAAC,OAAO,CAAmB,MAAM,EAAE,eAAe,EAAE;YAC7D,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAAoB;QAClC,OAAO,IAAI,CAAC,OAAO,CAAmB,MAAM,EAAE,mBAAmB,EAAE;YACjE,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,4DAA4D;IAE5D,KAAK,CAAC,YAAY,CAChB,OAAe,CAAC,EAChB,WAAmB,EAAE;QAErB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,0BAA0B,IAAI,aAAa,QAAQ,EAAE,CACtD,CAAC;IACJ,CAAC;IAED,oEAAoE;IAEpE,KAAK,CAAC,eAAe,CACnB,SAAiB;QAEjB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CACnD,CAAC;IACJ,CAAC;IAED,mEAAmE;IAEnE,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,gBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,SAAkB,EAClB,OAAe,CAAC,EAChB,WAAmB,EAAE;QAErB,MAAM,aAAa,GAAG,SAAS;YAC7B,CAAC,CAAC,cAAc,kBAAkB,CAAC,SAAS,CAAC,EAAE;YAC/C,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,qBAAqB,IAAI,aAAa,QAAQ,GAAG,aAAa,EAAE,CACjE,CAAC;IACJ,CAAC;IAED,sEAAsE;IAE9D,MAAM,CAAU,qBAAqB,GAAG,IAAI,GAAG,CAAC;QACtD,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS;KACzD,CAAC,CAAC;IACK,MAAM,CAAU,iBAAiB,GAAG,IAAI,GAAG,CAAC;QAClD,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI;KACxC,CAAC,CAAC;IAEH,KAAK,CAAC,cAAc,CAClB,KAAa,EACb,KAAa,EACb,WAAmB,GAAG;QAEtB,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,gFAAgF,KAAK,IAAI,QAAQ,KAAK,SAAS,GAAG,CAAC;QACjI,OAAO,IAAI,CAAC,OAAO,CAAmB,MAAM,EAAE,eAAe,EAAE;YAC7D,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;IAED,4DAA4D;IAE5D;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CACZ,SAAiB,EACjB,aAAqB,MAAM;QAE3B,MAAM,UAAU,GAA8B,EAAE,CAAC;QAEjD,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAChD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAE3C,OACE,CAAC,MAAM,CAAC,IAAI;YACZ,MAAM,CAAC,YAAY;YACnB,UAAU,CAAC,MAAM,GAAG,UAAU,EAC9B,CAAC;YACD,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACnD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,UAAU,CAAC,MAAM,GAAG,UAAU;YACnC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;YACjC,CAAC,CAAC,UAAU,CAAC;IACjB,CAAC;IAED,6DAA6D;IAE7D,KAAK,CAAC,SAAS,CACb,UAAkB,EAClB,OAAe,CAAC,EAChB,WAAmB,EAAE;QAErB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,mBAAmB,kBAAkB,CAAC,UAAU,CAAC,SAAS,IAAI,aAAa,QAAQ,EAAE,CACtF,CAAC;IACJ,CAAC;IAED,4DAA4D;IAE5D;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CACb,aAAqB,CAAC,EACtB,QAAgB,GAAG,EACnB,MAAe;QAEf,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;SACrB,CAAC,CAAC;QACH,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,kBAAkB,MAAM,CAAC,QAAQ,EAAE,EAAE,EACrC,SAAS,EACT,EAAE,MAAM,EAAE,uBAAuB,EAAE,EACnC,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAC9C,SAAS,EACT,EAAE,MAAM,EAAE,uBAAuB,EAAE,EACnC,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,gEAAgE;IAEhE,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,cAAc,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,OAAe,CAAC,EAChB,WAAmB,EAAE;QAErB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,mBAAmB,IAAI,aAAa,QAAQ,EAAE,CAC/C,CAAC;IACJ,CAAC;IAED,+DAA+D;IAE/D,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAC7C,CAAC;IACJ,CAAC;IAED,yDAAyD;IAEzD;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAChC,KAAK,EACL,aAAa,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAC9C,CAAC;QACF,OAAO,WAAW,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC;IAED,uEAAuE;IAEvE;;;;OAIG;IACH,KAAK,CAAC,aAAa,CACjB,OAAkC,EAClC,cAAsB;QAEtB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,WAAW,EACX,OAAO,EACP,EAAE,iBAAiB,EAAE,cAAc,EAAE,CACtC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAChB,SAAiB,EACjB,OAAiC;QAEjC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,QAAQ,EAClD,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CACjB,OAAkC,EAClC,cAAsB;QAEtB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,WAAW,EACX,OAAO,EACP,EAAE,iBAAiB,EAAE,cAAc,EAAE,CACtC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAC5C,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CACtB,eAAuB,EACvB,OAAuC;QAEvC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,kBAAkB,kBAAkB,CAAC,eAAe,CAAC,SAAS,EAC9D,OAAO,CACR,CAAC;IACJ,CAAC;IAED,0EAA0E;IAE1E;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CACtB,OAAuC,EACvC,cAAsB;QAEtB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,gBAAgB,EAChB,OAAO,EACP,EAAE,iBAAiB,EAAE,cAAc,EAAE,CACtC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CACtB,eAAuB,EACvB,OAAuC;QAEvC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,kBAAkB,kBAAkB,CAAC,eAAe,CAAC,EAAE,EACvD,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CACjB,OAAkC,EAClC,cAAsB;QAEtB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,WAAW,EACX,OAAO,EACP,EAAE,iBAAiB,EAAE,cAAc,EAAE,CACtC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,OAAkC;QAElC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAC7C,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAChB,SAAiB,EACjB,OAAiC,EACjC,cAAsB;QAEtB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,aAAa,kBAAkB,CAAC,SAAS,CAAC,UAAU,EACpD,OAAO,EACP,EAAE,iBAAiB,EAAE,cAAc,EAAE,CACtC,CAAC;IACJ,CAAC;IAED,sEAAsE;IAEtE;;;;OAIG;IACH,KAAK,CAAC,aAAa,CACjB,OAAkC,EAClC,cAAsB;QAEtB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,YAAY,EACZ,OAAO,EACP,EAAE,iBAAiB,EAAE,cAAc,EAAE,CACtC,CAAC;IACJ,CAAC;IAED,qEAAqE;IAErE;;;;OAIG;IACH,KAAK,CAAC,aAAa,CACjB,OAAkC,EAClC,cAAsB;QAEtB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,WAAW,EACX,OAAO,EACP,EAAE,iBAAiB,EAAE,cAAc,EAAE,CACtC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,SAAiB,EACjB,OAAkC;QAElC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAC5C,OAAO,CACR,CAAC;IACJ,CAAC"}