@metigan/angular 1.0.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 (48) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +581 -0
  3. package/dist/LICENSE +22 -0
  4. package/dist/README.md +581 -0
  5. package/dist/esm2022/metigan-angular.mjs +5 -0
  6. package/dist/esm2022/public-api.mjs +21 -0
  7. package/dist/esm2022/src/lib/audiences.service.mjs +157 -0
  8. package/dist/esm2022/src/lib/config.mjs +30 -0
  9. package/dist/esm2022/src/lib/contacts.service.mjs +267 -0
  10. package/dist/esm2022/src/lib/email.service.mjs +267 -0
  11. package/dist/esm2022/src/lib/errors.mjs +40 -0
  12. package/dist/esm2022/src/lib/forms.service.mjs +180 -0
  13. package/dist/esm2022/src/lib/http-client.service.mjs +111 -0
  14. package/dist/esm2022/src/lib/metigan.module.mjs +67 -0
  15. package/dist/esm2022/src/lib/metigan.service.mjs +72 -0
  16. package/dist/esm2022/src/lib/templates.service.mjs +85 -0
  17. package/dist/esm2022/src/lib/types.mjs +6 -0
  18. package/dist/fesm2022/metigan-angular.mjs +1241 -0
  19. package/dist/fesm2022/metigan-angular.mjs.map +1 -0
  20. package/dist/index.d.ts +5 -0
  21. package/dist/public-api.d.ts +15 -0
  22. package/dist/src/lib/audiences.service.d.ts +62 -0
  23. package/dist/src/lib/config.d.ts +28 -0
  24. package/dist/src/lib/contacts.service.d.ts +80 -0
  25. package/dist/src/lib/email.service.d.ts +44 -0
  26. package/dist/src/lib/errors.d.ts +24 -0
  27. package/dist/src/lib/forms.service.d.ts +67 -0
  28. package/dist/src/lib/http-client.service.d.ts +46 -0
  29. package/dist/src/lib/metigan.module.d.ts +27 -0
  30. package/dist/src/lib/metigan.service.d.ts +27 -0
  31. package/dist/src/lib/templates.service.d.ts +36 -0
  32. package/dist/src/lib/types.d.ts +329 -0
  33. package/examples/basic.component.ts +113 -0
  34. package/ng-package.json +8 -0
  35. package/package.json +68 -0
  36. package/public-api.ts +26 -0
  37. package/src/lib/audiences.service.ts +230 -0
  38. package/src/lib/config.ts +35 -0
  39. package/src/lib/contacts.service.ts +377 -0
  40. package/src/lib/email.service.ts +286 -0
  41. package/src/lib/errors.ts +45 -0
  42. package/src/lib/forms.service.ts +263 -0
  43. package/src/lib/http-client.service.ts +156 -0
  44. package/src/lib/metigan.module.ts +55 -0
  45. package/src/lib/metigan.service.ts +80 -0
  46. package/src/lib/templates.service.ts +103 -0
  47. package/src/lib/types.ts +398 -0
  48. package/tsconfig.json +38 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metigan-angular.mjs","sources":["../../src/lib/errors.ts","../../src/lib/config.ts","../../src/lib/http-client.service.ts","../../src/lib/email.service.ts","../../src/lib/forms.service.ts","../../src/lib/contacts.service.ts","../../src/lib/audiences.service.ts","../../src/lib/templates.service.ts","../../src/lib/metigan.service.ts","../../src/lib/metigan.module.ts","../../src/lib/types.ts","../../public-api.ts","../../metigan-angular.ts"],"sourcesContent":["/**\r\n * Custom error classes for Metigan SDK\r\n */\r\n\r\n/**\r\n * Base error class for all Metigan errors\r\n */\r\nexport class MetiganError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'MetiganError';\r\n Object.setPrototypeOf(this, MetiganError.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * Validation error - thrown when input validation fails\r\n */\r\nexport class ValidationError extends MetiganError {\r\n public field?: string;\r\n\r\n constructor(message: string, field?: string) {\r\n super(message);\r\n this.name = 'ValidationError';\r\n this.field = field;\r\n Object.setPrototypeOf(this, ValidationError.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * API error - thrown when API request fails\r\n */\r\nexport class ApiError extends MetiganError {\r\n public statusCode?: number;\r\n public status?: number;\r\n\r\n constructor(message: string, statusCode?: number) {\r\n super(message);\r\n this.name = 'ApiError';\r\n this.statusCode = statusCode || statusCode;\r\n this.status = statusCode;\r\n Object.setPrototypeOf(this, ApiError.prototype);\r\n }\r\n}\r\n\r\n","/**\r\n * Metigan Library Configuration\r\n * Central configuration file for all modules\r\n */\r\n\r\n/**\r\n * Default API URL for Metigan services\r\n * All API calls are routed through this single endpoint\r\n * \r\n * Can be overridden with METIGAN_API_URL environment variable for testing\r\n */\r\nexport const API_URL = (typeof process !== 'undefined' && process.env?.['METIGAN_API_URL']) \r\n || 'https://api.metigan.com';\r\n\r\n/**\r\n * SDK Version\r\n */\r\nexport const SDK_VERSION = '1.0.0';\r\n\r\n/**\r\n * Default timeout for API requests (in milliseconds)\r\n */\r\nexport const DEFAULT_TIMEOUT = 30000;\r\n\r\n/**\r\n * Default retry configuration\r\n */\r\nexport const DEFAULT_RETRY_COUNT = 3;\r\nexport const DEFAULT_RETRY_DELAY = 1000;\r\n\r\n/**\r\n * Maximum file size for attachments (7MB)\r\n */\r\nexport const MAX_FILE_SIZE = 7 * 1024 * 1024;\r\n\r\n","/**\r\n * HTTP Client Service for Metigan SDK\r\n * Wraps Angular HttpClient with retry logic and error handling\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpParams, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, throwError, timer } from 'rxjs';\r\nimport { catchError, retryWhen, mergeMap, map } from 'rxjs/operators';\r\nimport { ApiError, MetiganError } from './errors';\r\n\r\nexport interface HttpOptions {\r\n headers?: HttpHeaders | { [header: string]: string | string[] };\r\n params?: HttpParams | { [param: string]: any };\r\n timeout?: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetiganHttpClient {\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * Make GET request with retry logic\r\n */\r\n get<T>(url: string, options?: HttpOptions, retryCount: number = 3, retryDelay: number = 1000): Observable<T> {\r\n const opts = this.buildOptions(options);\r\n \r\n return (this.http.get<T>(url, opts) as Observable<T>).pipe(\r\n map((response: T) => response),\r\n retryWhen(errors =>\r\n errors.pipe(\r\n mergeMap((error: HttpErrorResponse, index: number) => {\r\n if (index < retryCount && this.shouldRetry(error)) {\r\n return timer(retryDelay * (index + 1));\r\n }\r\n return throwError(() => error);\r\n })\r\n )\r\n ),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Make POST request with retry logic\r\n */\r\n post<T>(url: string, body: any, options?: HttpOptions, retryCount: number = 3, retryDelay: number = 1000): Observable<T> {\r\n const opts = this.buildOptions(options);\r\n \r\n return (this.http.post<T>(url, body, opts) as Observable<T>).pipe(\r\n map((response: T) => response),\r\n retryWhen(errors =>\r\n errors.pipe(\r\n mergeMap((error: HttpErrorResponse, index: number) => {\r\n if (index < retryCount && this.shouldRetry(error)) {\r\n return timer(retryDelay * (index + 1));\r\n }\r\n return throwError(() => error);\r\n })\r\n )\r\n ),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Make PUT request with retry logic\r\n */\r\n put<T>(url: string, body: any, options?: HttpOptions, retryCount: number = 3, retryDelay: number = 1000): Observable<T> {\r\n const opts = this.buildOptions(options);\r\n \r\n return (this.http.put<T>(url, body, opts) as Observable<T>).pipe(\r\n map((response: T) => response),\r\n retryWhen(errors =>\r\n errors.pipe(\r\n mergeMap((error: HttpErrorResponse, index: number) => {\r\n if (index < retryCount && this.shouldRetry(error)) {\r\n return timer(retryDelay * (index + 1));\r\n }\r\n return throwError(() => error);\r\n })\r\n )\r\n ),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Make DELETE request with retry logic\r\n */\r\n delete<T>(url: string, options?: HttpOptions, retryCount: number = 3, retryDelay: number = 1000): Observable<T> {\r\n const opts = this.buildOptions(options);\r\n \r\n return (this.http.delete<T>(url, opts) as Observable<T>).pipe(\r\n map((response: T) => response),\r\n retryWhen(errors =>\r\n errors.pipe(\r\n mergeMap((error: HttpErrorResponse, index: number) => {\r\n if (index < retryCount && this.shouldRetry(error)) {\r\n return timer(retryDelay * (index + 1));\r\n }\r\n return throwError(() => error);\r\n })\r\n )\r\n ),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Build HTTP options with timeout\r\n */\r\n private buildOptions(options?: HttpOptions): any {\r\n const opts: any = {\r\n observe: 'body' as const\r\n };\r\n \r\n if (options?.headers) {\r\n opts.headers = options.headers;\r\n }\r\n \r\n if (options?.params) {\r\n opts.params = options.params;\r\n }\r\n\r\n // Angular HttpClient doesn't support timeout directly\r\n // Timeout should be handled at the interceptor level if needed\r\n \r\n return opts;\r\n }\r\n\r\n /**\r\n * Determine if error should trigger retry\r\n */\r\n private shouldRetry(error: HttpErrorResponse): boolean {\r\n // Retry on server errors (5xx) or network errors\r\n return error.status >= 500 || error.status === 0 || !error.status;\r\n }\r\n\r\n /**\r\n * Handle HTTP errors\r\n */\r\n private handleError = (error: HttpErrorResponse): Observable<never> => {\r\n if (error.error instanceof ErrorEvent) {\r\n // Client-side error\r\n return throwError(() => new MetiganError(`Network error: ${error.error.message}`));\r\n } else {\r\n // Server-side error\r\n const message = error.error?.message || error.error?.error || `Request failed with status ${error.status}`;\r\n return throwError(() => new ApiError(message, error.status));\r\n }\r\n };\r\n}\r\n\r\n","/**\r\n * Metigan Email Service\r\n * Service for sending emails through the Metigan API\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { MetiganHttpClient } from './http-client.service';\r\nimport { API_URL, DEFAULT_TIMEOUT, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY, MAX_FILE_SIZE } from './config';\r\nimport { ValidationError, MetiganError } from './errors';\r\nimport { EmailOptions, EmailApiResponse, EmailSuccessResponse, EmailAttachment } from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetiganEmailService {\r\n private apiKey: string = '';\r\n private apiUrl: string = API_URL;\r\n private timeout: number = DEFAULT_TIMEOUT;\r\n private retryCount: number = DEFAULT_RETRY_COUNT;\r\n private retryDelay: number = DEFAULT_RETRY_DELAY;\r\n\r\n constructor(private http: MetiganHttpClient) {}\r\n\r\n /**\r\n * Initialize the service with API key and options\r\n */\r\n initialize(apiKey: string, options?: { apiUrl?: string; timeout?: number; retryCount?: number; retryDelay?: number }): void {\r\n if (!apiKey) {\r\n throw new MetiganError('API key is required');\r\n }\r\n\r\n this.apiKey = apiKey;\r\n this.apiUrl = options?.apiUrl || API_URL;\r\n this.timeout = options?.timeout || DEFAULT_TIMEOUT;\r\n this.retryCount = options?.retryCount || DEFAULT_RETRY_COUNT;\r\n this.retryDelay = options?.retryDelay || DEFAULT_RETRY_DELAY;\r\n }\r\n\r\n /**\r\n * Validate email address format\r\n */\r\n private validateEmail(email: string): boolean {\r\n if (!email || typeof email !== 'string') return false;\r\n const parts = email.split('@');\r\n if (parts.length !== 2) return false;\r\n if (parts[0].length === 0) return false;\r\n const domainParts = parts[1].split('.');\r\n if (domainParts.length < 2) return false;\r\n if (domainParts.some(part => part.length === 0)) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Extract email address from \"Name <email>\" format\r\n */\r\n private extractEmailAddress(from: string): string {\r\n if (!from) return '';\r\n const angleMatch = from.match(/<([^>]+)>/);\r\n if (angleMatch) {\r\n return angleMatch[1].trim();\r\n }\r\n return from.trim();\r\n }\r\n\r\n /**\r\n * Validate email options\r\n */\r\n private validateOptions(options: EmailOptions): void {\r\n if (!options.from) {\r\n throw new ValidationError('Sender email (from) is required');\r\n }\r\n\r\n if (!options.recipients || !Array.isArray(options.recipients) || options.recipients.length === 0) {\r\n throw new ValidationError('Recipients must be a non-empty array');\r\n }\r\n\r\n if (!options.subject) {\r\n throw new ValidationError('Subject is required');\r\n }\r\n\r\n if (!options.content && !options.templateId) {\r\n throw new ValidationError('Either content or templateId is required');\r\n }\r\n\r\n const fromEmail = this.extractEmailAddress(options.from);\r\n if (!this.validateEmail(fromEmail)) {\r\n throw new ValidationError(`Invalid sender email format: ${fromEmail}`);\r\n }\r\n\r\n for (const recipient of options.recipients) {\r\n const recipientEmail = this.extractEmailAddress(recipient);\r\n if (!this.validateEmail(recipientEmail)) {\r\n throw new ValidationError(`Invalid recipient email format: ${recipientEmail}`);\r\n }\r\n }\r\n\r\n if (options.cc) {\r\n for (const cc of options.cc) {\r\n const ccEmail = this.extractEmailAddress(cc);\r\n if (!this.validateEmail(ccEmail)) {\r\n throw new ValidationError(`Invalid CC email format: ${ccEmail}`);\r\n }\r\n }\r\n }\r\n\r\n if (options.bcc) {\r\n for (const bcc of options.bcc) {\r\n const bccEmail = this.extractEmailAddress(bcc);\r\n if (!this.validateEmail(bccEmail)) {\r\n throw new ValidationError(`Invalid BCC email format: ${bccEmail}`);\r\n }\r\n }\r\n }\r\n\r\n if (options.replyTo) {\r\n const replyToEmail = this.extractEmailAddress(options.replyTo);\r\n if (!this.validateEmail(replyToEmail)) {\r\n throw new ValidationError(`Invalid reply-to email format: ${replyToEmail}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Process attachments for FormData\r\n */\r\n private async processAttachments(attachments: File[] | EmailAttachment[]): Promise<FormData> {\r\n const formData = new FormData();\r\n\r\n for (const file of attachments) {\r\n if (file instanceof File) {\r\n if (file.size > MAX_FILE_SIZE) {\r\n throw new MetiganError(`File ${file.name} exceeds the maximum size of 7MB`);\r\n }\r\n formData.append('files', file);\r\n } else {\r\n const attachment = file as EmailAttachment;\r\n \r\n // Convert content to Blob\r\n let blob: Blob;\r\n if (attachment.content instanceof ArrayBuffer) {\r\n blob = new Blob([attachment.content], { type: attachment.contentType });\r\n } else if (attachment.content instanceof Uint8Array) {\r\n blob = new Blob([attachment.content], { type: attachment.contentType });\r\n } else if (typeof attachment.content === 'string') {\r\n // Base64 string\r\n const byteCharacters = atob(attachment.content);\r\n const byteNumbers = new Array(byteCharacters.length);\r\n for (let i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n const byteArray = new Uint8Array(byteNumbers);\r\n blob = new Blob([byteArray], { type: attachment.contentType });\r\n } else {\r\n throw new MetiganError('Invalid attachment content type');\r\n }\r\n\r\n if (blob.size > MAX_FILE_SIZE) {\r\n throw new MetiganError(`File ${attachment.filename} exceeds the maximum size of 7MB`);\r\n }\r\n\r\n const fileObj = new File([blob], attachment.filename, { type: attachment.contentType });\r\n formData.append('files', fileObj);\r\n }\r\n }\r\n\r\n return formData;\r\n }\r\n\r\n /**\r\n * Send an email\r\n */\r\n sendEmail(options: EmailOptions): Observable<EmailSuccessResponse> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n try {\r\n this.validateOptions(options);\r\n } catch (error) {\r\n return throwError(() => error);\r\n }\r\n\r\n const headers = {\r\n 'x-api-key': this.apiKey,\r\n 'User-Agent': 'AngularSDK/1.0'\r\n };\r\n\r\n // If attachments, use FormData\r\n if (options.attachments && options.attachments.length > 0) {\r\n return new Observable(observer => {\r\n this.processAttachments(options.attachments!).then(formData => {\r\n formData.append('from', options.from);\r\n formData.append('recipients', JSON.stringify(options.recipients));\r\n formData.append('subject', options.subject);\r\n \r\n if (options.templateId) {\r\n formData.append('useTemplate', 'true');\r\n formData.append('templateId', options.templateId);\r\n } else if (options.content) {\r\n formData.append('content', options.content);\r\n }\r\n\r\n if (options.cc && options.cc.length > 0) {\r\n formData.append('cc', JSON.stringify(options.cc));\r\n }\r\n\r\n if (options.bcc && options.bcc.length > 0) {\r\n formData.append('bcc', JSON.stringify(options.bcc));\r\n }\r\n\r\n if (options.replyTo) {\r\n formData.append('replyTo', options.replyTo);\r\n }\r\n\r\n const httpOptions = {\r\n headers: headers\r\n };\r\n\r\n this.http.post<EmailApiResponse>(`${this.apiUrl}/api/email/send`, formData, httpOptions, this.retryCount, this.retryDelay)\r\n .pipe(\r\n map(response => {\r\n if ('success' in response && response.success) {\r\n return response as EmailSuccessResponse;\r\n } else {\r\n throw new MetiganError((response as any).message || 'Failed to send email');\r\n }\r\n })\r\n )\r\n .subscribe({\r\n next: (response) => observer.next(response),\r\n error: (error) => observer.error(error),\r\n complete: () => observer.complete()\r\n });\r\n }).catch(error => observer.error(error));\r\n });\r\n } else {\r\n // No attachments, use JSON\r\n const body = {\r\n from: options.from,\r\n recipients: options.recipients,\r\n subject: options.subject\r\n };\r\n\r\n if (options.templateId) {\r\n (body as any).useTemplate = 'true';\r\n (body as any).templateId = options.templateId;\r\n } else if (options.content) {\r\n (body as any).content = options.content;\r\n }\r\n\r\n if (options.cc && options.cc.length > 0) {\r\n (body as any).cc = options.cc;\r\n }\r\n\r\n if (options.bcc && options.bcc.length > 0) {\r\n (body as any).bcc = options.bcc;\r\n }\r\n\r\n if (options.replyTo) {\r\n (body as any).replyTo = options.replyTo;\r\n }\r\n\r\n const httpOptions = {\r\n headers: {\r\n ...headers,\r\n 'Content-Type': 'application/json'\r\n }\r\n };\r\n\r\n return this.http.post<EmailApiResponse>(`${this.apiUrl}/api/email/send`, body, httpOptions, this.retryCount, this.retryDelay)\r\n .pipe(\r\n map(response => {\r\n if ('success' in response && response.success) {\r\n return response as EmailSuccessResponse;\r\n } else {\r\n throw new MetiganError((response as any).message || 'Failed to send email');\r\n }\r\n })\r\n );\r\n }\r\n }\r\n}\r\n\r\n\r\n","/**\r\n * Metigan Forms Service\r\n * Service for form management and submissions\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { MetiganHttpClient } from './http-client.service';\r\nimport { API_URL, DEFAULT_TIMEOUT, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY } from './config';\r\nimport { ValidationError, MetiganError } from './errors';\r\nimport {\r\n FormConfig,\r\n FormSubmissionOptions,\r\n FormSubmissionResponse,\r\n FormListResponse,\r\n PaginationOptions\r\n} from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetiganFormsService {\r\n private apiKey: string = '';\r\n private apiUrl: string = API_URL;\r\n private timeout: number = DEFAULT_TIMEOUT;\r\n private retryCount: number = DEFAULT_RETRY_COUNT;\r\n private retryDelay: number = DEFAULT_RETRY_DELAY;\r\n\r\n constructor(private http: MetiganHttpClient) {}\r\n\r\n /**\r\n * Initialize the service with API key and options\r\n */\r\n initialize(apiKey: string, options?: { apiUrl?: string; timeout?: number; retryCount?: number; retryDelay?: number }): void {\r\n if (!apiKey) {\r\n throw new MetiganError('API key is required');\r\n }\r\n\r\n this.apiKey = apiKey;\r\n this.apiUrl = options?.apiUrl || API_URL;\r\n this.timeout = options?.timeout || DEFAULT_TIMEOUT;\r\n this.retryCount = options?.retryCount || DEFAULT_RETRY_COUNT;\r\n this.retryDelay = options?.retryDelay || DEFAULT_RETRY_DELAY;\r\n }\r\n\r\n /**\r\n * Get default headers\r\n */\r\n private getHeaders() {\r\n return {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': this.apiKey,\r\n 'User-Agent': 'AngularSDK/1.0'\r\n };\r\n }\r\n\r\n /**\r\n * Submit form data\r\n */\r\n submit(options: FormSubmissionOptions): Observable<FormSubmissionResponse> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!options.formId) {\r\n return throwError(() => new ValidationError('Form ID is required'));\r\n }\r\n\r\n if (!options.data || Object.keys(options.data).length === 0) {\r\n return throwError(() => new ValidationError('Submission data is required'));\r\n }\r\n\r\n const body = {\r\n formId: options.formId,\r\n data: options.data\r\n };\r\n\r\n return this.http.post<FormSubmissionResponse>(\r\n `${this.apiUrl}/api/submissions`,\r\n body,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Get form by ID or slug\r\n */\r\n getForm(formIdOrSlug: string): Observable<FormConfig> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!formIdOrSlug) {\r\n return throwError(() => new ValidationError('Form ID or slug is required'));\r\n }\r\n\r\n return this.http.get<FormConfig>(\r\n `${this.apiUrl}/api/forms/${formIdOrSlug}`,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Get public form by slug\r\n */\r\n getPublicForm(slug: string): Observable<FormConfig> {\r\n if (!slug) {\r\n return throwError(() => new ValidationError('Form slug is required'));\r\n }\r\n\r\n // Public forms don't require API key\r\n return this.http.get<FormConfig>(\r\n `${this.apiUrl}/f/${slug}/api`,\r\n {},\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * List all forms\r\n */\r\n listForms(options?: PaginationOptions): Observable<FormListResponse> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n let params = new HttpParams();\r\n if (options?.page) {\r\n params = params.set('page', options.page.toString());\r\n }\r\n if (options?.limit) {\r\n params = params.set('limit', options.limit.toString());\r\n }\r\n\r\n return this.http.get<FormListResponse>(\r\n `${this.apiUrl}/api/forms`,\r\n {\r\n headers: this.getHeaders(),\r\n params: params\r\n },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Create a new form\r\n */\r\n createForm(config: Omit<FormConfig, 'id'>): Observable<FormConfig> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!config.title) {\r\n return throwError(() => new ValidationError('Form title is required'));\r\n }\r\n\r\n if (!config.fields || config.fields.length === 0) {\r\n return throwError(() => new ValidationError('At least one field is required'));\r\n }\r\n\r\n return this.http.post<FormConfig>(\r\n `${this.apiUrl}/api/forms`,\r\n config,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Update an existing form\r\n */\r\n updateForm(formId: string, config: Partial<FormConfig>): Observable<FormConfig> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!formId) {\r\n return throwError(() => new ValidationError('Form ID is required'));\r\n }\r\n\r\n return this.http.put<FormConfig>(\r\n `${this.apiUrl}/api/forms/${formId}`,\r\n config,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Delete a form\r\n */\r\n deleteForm(formId: string): Observable<void> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!formId) {\r\n return throwError(() => new ValidationError('Form ID is required'));\r\n }\r\n\r\n return this.http.delete<void>(\r\n `${this.apiUrl}/api/forms/${formId}`,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Get form analytics\r\n */\r\n getAnalytics(formId: string): Observable<any> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!formId) {\r\n return throwError(() => new ValidationError('Form ID is required'));\r\n }\r\n\r\n return this.http.get<any>(\r\n `${this.apiUrl}/api/forms/${formId}/analytics`,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Publish a form\r\n */\r\n publishForm(formId: string, slug: string): Observable<{ publishedUrl: string; slug: string }> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!formId) {\r\n return throwError(() => new ValidationError('Form ID is required'));\r\n }\r\n\r\n if (!slug) {\r\n return throwError(() => new ValidationError('Slug is required'));\r\n }\r\n\r\n return this.http.post<{ publishedUrl: string; slug: string }>(\r\n `${this.apiUrl}/api/forms/${formId}/publish`,\r\n { slug },\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n}\r\n\r\n","/**\r\n * Metigan Contacts Service\r\n * Service for contact/subscriber management\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { MetiganHttpClient } from './http-client.service';\r\nimport { API_URL, DEFAULT_TIMEOUT, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY } from './config';\r\nimport { ValidationError, MetiganError } from './errors';\r\nimport {\r\n Contact,\r\n CreateContactOptions,\r\n UpdateContactOptions,\r\n ContactListFilters,\r\n ContactListResponse,\r\n BulkContactResult\r\n} from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetiganContactsService {\r\n private apiKey: string = '';\r\n private apiUrl: string = API_URL;\r\n private timeout: number = DEFAULT_TIMEOUT;\r\n private retryCount: number = DEFAULT_RETRY_COUNT;\r\n private retryDelay: number = DEFAULT_RETRY_DELAY;\r\n\r\n constructor(private http: MetiganHttpClient) {}\r\n\r\n /**\r\n * Initialize the service with API key and options\r\n */\r\n initialize(apiKey: string, options?: { apiUrl?: string; timeout?: number; retryCount?: number; retryDelay?: number }): void {\r\n if (!apiKey) {\r\n throw new MetiganError('API key is required');\r\n }\r\n\r\n this.apiKey = apiKey;\r\n this.apiUrl = options?.apiUrl || API_URL;\r\n this.timeout = options?.timeout || DEFAULT_TIMEOUT;\r\n this.retryCount = options?.retryCount || DEFAULT_RETRY_COUNT;\r\n this.retryDelay = options?.retryDelay || DEFAULT_RETRY_DELAY;\r\n }\r\n\r\n /**\r\n * Get default headers\r\n */\r\n private getHeaders() {\r\n return {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': this.apiKey,\r\n 'User-Agent': 'AngularSDK/1.0'\r\n };\r\n }\r\n\r\n /**\r\n * Validate email format\r\n */\r\n private validateEmail(email: string): boolean {\r\n if (!email || typeof email !== 'string') return false;\r\n const parts = email.split('@');\r\n if (parts.length !== 2) return false;\r\n if (parts[0].length === 0) return false;\r\n const domainParts = parts[1].split('.');\r\n if (domainParts.length < 2) return false;\r\n if (domainParts.some(part => part.length === 0)) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Create a new contact\r\n */\r\n create(options: CreateContactOptions): Observable<Contact> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!options.email || !this.validateEmail(options.email)) {\r\n return throwError(() => new ValidationError('Valid email is required'));\r\n }\r\n\r\n if (!options.audienceId) {\r\n return throwError(() => new ValidationError('Audience ID is required'));\r\n }\r\n\r\n return this.http.post<Contact>(\r\n `${this.apiUrl}/api/contacts`,\r\n options,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Get contact by ID\r\n */\r\n get(contactId: string): Observable<Contact> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!contactId) {\r\n return throwError(() => new ValidationError('Contact ID is required'));\r\n }\r\n\r\n return this.http.get<Contact>(\r\n `${this.apiUrl}/api/contacts/${contactId}`,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Get contact by email\r\n */\r\n getByEmail(email: string, audienceId: string): Observable<Contact> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!email || !this.validateEmail(email)) {\r\n return throwError(() => new ValidationError('Valid email is required'));\r\n }\r\n\r\n if (!audienceId) {\r\n return throwError(() => new ValidationError('Audience ID is required'));\r\n }\r\n\r\n let params = new HttpParams();\r\n params = params.set('email', email);\r\n params = params.set('audienceId', audienceId);\r\n\r\n return this.http.get<Contact>(\r\n `${this.apiUrl}/api/contacts`,\r\n {\r\n headers: this.getHeaders(),\r\n params: params\r\n },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Update a contact\r\n */\r\n update(contactId: string, options: UpdateContactOptions): Observable<Contact> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!contactId) {\r\n return throwError(() => new ValidationError('Contact ID is required'));\r\n }\r\n\r\n return this.http.put<Contact>(\r\n `${this.apiUrl}/api/contacts/${contactId}`,\r\n options,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Delete a contact\r\n */\r\n delete(contactId: string): Observable<void> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!contactId) {\r\n return throwError(() => new ValidationError('Contact ID is required'));\r\n }\r\n\r\n return this.http.delete<void>(\r\n `${this.apiUrl}/api/contacts/${contactId}`,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * List contacts with filters\r\n */\r\n list(filters?: ContactListFilters): Observable<ContactListResponse> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n let params = new HttpParams();\r\n if (filters?.audienceId) {\r\n params = params.set('audienceId', filters.audienceId);\r\n }\r\n if (filters?.status) {\r\n params = params.set('status', filters.status);\r\n }\r\n if (filters?.tag) {\r\n params = params.set('tag', filters.tag);\r\n }\r\n if (filters?.search) {\r\n params = params.set('search', filters.search);\r\n }\r\n if (filters?.page) {\r\n params = params.set('page', filters.page.toString());\r\n }\r\n if (filters?.limit) {\r\n params = params.set('limit', filters.limit.toString());\r\n }\r\n\r\n return this.http.get<ContactListResponse>(\r\n `${this.apiUrl}/api/contacts`,\r\n {\r\n headers: this.getHeaders(),\r\n params: params\r\n },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Search contacts\r\n */\r\n search(query: string, audienceId?: string): Observable<Contact[]> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!query) {\r\n return throwError(() => new ValidationError('Search query is required'));\r\n }\r\n\r\n let params = new HttpParams();\r\n params = params.set('search', query);\r\n if (audienceId) {\r\n params = params.set('audienceId', audienceId);\r\n }\r\n\r\n return this.http.get<Contact[]>(\r\n `${this.apiUrl}/api/contacts/search`,\r\n {\r\n headers: this.getHeaders(),\r\n params: params\r\n },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Bulk import contacts\r\n */\r\n bulkImport(contacts: CreateContactOptions[], audienceId: string): Observable<BulkContactResult> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!contacts || contacts.length === 0) {\r\n return throwError(() => new ValidationError('Contacts array is required'));\r\n }\r\n\r\n if (!audienceId) {\r\n return throwError(() => new ValidationError('Audience ID is required'));\r\n }\r\n\r\n return this.http.post<BulkContactResult>(\r\n `${this.apiUrl}/api/contacts/bulk`,\r\n { contacts, audienceId },\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Subscribe a contact\r\n */\r\n subscribe(contactId: string): Observable<Contact> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!contactId) {\r\n return throwError(() => new ValidationError('Contact ID is required'));\r\n }\r\n\r\n return this.http.post<Contact>(\r\n `${this.apiUrl}/api/contacts/${contactId}/subscribe`,\r\n {},\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Unsubscribe a contact\r\n */\r\n unsubscribe(contactId: string): Observable<Contact> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!contactId) {\r\n return throwError(() => new ValidationError('Contact ID is required'));\r\n }\r\n\r\n return this.http.post<Contact>(\r\n `${this.apiUrl}/api/contacts/${contactId}/unsubscribe`,\r\n {},\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Add tags to a contact\r\n */\r\n addTags(contactId: string, tags: string[]): Observable<Contact> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!contactId) {\r\n return throwError(() => new ValidationError('Contact ID is required'));\r\n }\r\n\r\n if (!tags || tags.length === 0) {\r\n return throwError(() => new ValidationError('Tags array is required'));\r\n }\r\n\r\n return this.http.post<Contact>(\r\n `${this.apiUrl}/api/contacts/${contactId}/tags`,\r\n { tags },\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Remove tags from a contact\r\n */\r\n removeTags(contactId: string, tags: string[]): Observable<Contact> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!contactId) {\r\n return throwError(() => new ValidationError('Contact ID is required'));\r\n }\r\n\r\n if (!tags || tags.length === 0) {\r\n return throwError(() => new ValidationError('Tags array is required'));\r\n }\r\n\r\n return this.http.delete<Contact>(\r\n `${this.apiUrl}/api/contacts/${contactId}/tags`,\r\n {\r\n headers: this.getHeaders(),\r\n params: { tags: tags.join(',') }\r\n },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n}\r\n\r\n","/**\r\n * Metigan Audiences Service\r\n * Service for audience/list management\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { MetiganHttpClient } from './http-client.service';\r\nimport { API_URL, DEFAULT_TIMEOUT, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY } from './config';\r\nimport { ValidationError, MetiganError } from './errors';\r\nimport {\r\n Audience,\r\n CreateAudienceOptions,\r\n UpdateAudienceOptions,\r\n AudienceListResponse,\r\n AudienceStats,\r\n PaginationOptions\r\n} from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetiganAudiencesService {\r\n private apiKey: string = '';\r\n private apiUrl: string = API_URL;\r\n private timeout: number = DEFAULT_TIMEOUT;\r\n private retryCount: number = DEFAULT_RETRY_COUNT;\r\n private retryDelay: number = DEFAULT_RETRY_DELAY;\r\n\r\n constructor(private http: MetiganHttpClient) {}\r\n\r\n /**\r\n * Initialize the service with API key and options\r\n */\r\n initialize(apiKey: string, options?: { apiUrl?: string; timeout?: number; retryCount?: number; retryDelay?: number }): void {\r\n if (!apiKey) {\r\n throw new MetiganError('API key is required');\r\n }\r\n\r\n this.apiKey = apiKey;\r\n this.apiUrl = options?.apiUrl || API_URL;\r\n this.timeout = options?.timeout || DEFAULT_TIMEOUT;\r\n this.retryCount = options?.retryCount || DEFAULT_RETRY_COUNT;\r\n this.retryDelay = options?.retryDelay || DEFAULT_RETRY_DELAY;\r\n }\r\n\r\n /**\r\n * Get default headers\r\n */\r\n private getHeaders() {\r\n return {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': this.apiKey,\r\n 'User-Agent': 'AngularSDK/1.0'\r\n };\r\n }\r\n\r\n /**\r\n * Create a new audience\r\n */\r\n create(options: CreateAudienceOptions): Observable<Audience> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!options.name) {\r\n return throwError(() => new ValidationError('Audience name is required'));\r\n }\r\n\r\n return this.http.post<Audience>(\r\n `${this.apiUrl}/api/audiences`,\r\n options,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Get audience by ID\r\n */\r\n get(audienceId: string): Observable<Audience> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!audienceId) {\r\n return throwError(() => new ValidationError('Audience ID is required'));\r\n }\r\n\r\n return this.http.get<Audience>(\r\n `${this.apiUrl}/api/audiences/${audienceId}`,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Update an audience\r\n */\r\n update(audienceId: string, options: UpdateAudienceOptions): Observable<Audience> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!audienceId) {\r\n return throwError(() => new ValidationError('Audience ID is required'));\r\n }\r\n\r\n return this.http.put<Audience>(\r\n `${this.apiUrl}/api/audiences/${audienceId}`,\r\n options,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Delete an audience\r\n */\r\n delete(audienceId: string): Observable<void> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!audienceId) {\r\n return throwError(() => new ValidationError('Audience ID is required'));\r\n }\r\n\r\n return this.http.delete<void>(\r\n `${this.apiUrl}/api/audiences/${audienceId}`,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * List all audiences\r\n */\r\n list(options?: PaginationOptions): Observable<AudienceListResponse> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n let params = new HttpParams();\r\n if (options?.page) {\r\n params = params.set('page', options.page.toString());\r\n }\r\n if (options?.limit) {\r\n params = params.set('limit', options.limit.toString());\r\n }\r\n\r\n return this.http.get<AudienceListResponse>(\r\n `${this.apiUrl}/api/audiences`,\r\n {\r\n headers: this.getHeaders(),\r\n params: params\r\n },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Get audience statistics\r\n */\r\n getStats(audienceId: string): Observable<AudienceStats> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!audienceId) {\r\n return throwError(() => new ValidationError('Audience ID is required'));\r\n }\r\n\r\n return this.http.get<AudienceStats>(\r\n `${this.apiUrl}/api/audiences/${audienceId}/stats`,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Clean audience (remove bounced/unsubscribed contacts)\r\n */\r\n clean(audienceId: string): Observable<{ removed: number }> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!audienceId) {\r\n return throwError(() => new ValidationError('Audience ID is required'));\r\n }\r\n\r\n return this.http.post<{ removed: number }>(\r\n `${this.apiUrl}/api/audiences/${audienceId}/clean`,\r\n {},\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Merge audiences (source into target)\r\n */\r\n merge(sourceAudienceId: string, targetAudienceId: string): Observable<Audience> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!sourceAudienceId || !targetAudienceId) {\r\n return throwError(() => new ValidationError('Source and target audience IDs are required'));\r\n }\r\n\r\n return this.http.post<Audience>(\r\n `${this.apiUrl}/api/audiences/${sourceAudienceId}/merge`,\r\n { targetAudienceId },\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n}\r\n\r\n","/**\r\n * Metigan Templates Service\r\n * Service for managing email templates\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { MetiganHttpClient } from './http-client.service';\r\nimport { API_URL, DEFAULT_TIMEOUT, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY } from './config';\r\nimport { ValidationError, MetiganError } from './errors';\r\nimport {\r\n EmailTemplate,\r\n EmailTemplateListResponse,\r\n PaginationOptions\r\n} from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetiganTemplatesService {\r\n private apiKey: string = '';\r\n private apiUrl: string = API_URL;\r\n private timeout: number = DEFAULT_TIMEOUT;\r\n private retryCount: number = DEFAULT_RETRY_COUNT;\r\n private retryDelay: number = DEFAULT_RETRY_DELAY;\r\n\r\n constructor(private http: MetiganHttpClient) {}\r\n\r\n /**\r\n * Initialize the service with API key and options\r\n */\r\n initialize(apiKey: string, options?: { apiUrl?: string; timeout?: number; retryCount?: number; retryDelay?: number }): void {\r\n if (!apiKey) {\r\n throw new MetiganError('API key is required');\r\n }\r\n\r\n this.apiKey = apiKey;\r\n this.apiUrl = options?.apiUrl || API_URL;\r\n this.timeout = options?.timeout || DEFAULT_TIMEOUT;\r\n this.retryCount = options?.retryCount || DEFAULT_RETRY_COUNT;\r\n this.retryDelay = options?.retryDelay || DEFAULT_RETRY_DELAY;\r\n }\r\n\r\n /**\r\n * Get default headers\r\n */\r\n private getHeaders() {\r\n return {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': this.apiKey,\r\n 'User-Agent': 'AngularSDK/1.0'\r\n };\r\n }\r\n\r\n /**\r\n * List all templates\r\n */\r\n list(options?: PaginationOptions): Observable<EmailTemplateListResponse> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n let params = new HttpParams();\r\n if (options?.page) {\r\n params = params.set('page', options.page.toString());\r\n }\r\n if (options?.limit) {\r\n params = params.set('limit', options.limit.toString());\r\n }\r\n\r\n return this.http.get<EmailTemplateListResponse>(\r\n `${this.apiUrl}/api/templates`,\r\n {\r\n headers: this.getHeaders(),\r\n params: params\r\n },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n\r\n /**\r\n * Get template by ID\r\n */\r\n get(templateId: string): Observable<EmailTemplate> {\r\n if (!this.apiKey) {\r\n return throwError(() => new MetiganError('Service not initialized. Call initialize() first.'));\r\n }\r\n\r\n if (!templateId) {\r\n return throwError(() => new ValidationError('Template ID is required'));\r\n }\r\n\r\n return this.http.get<EmailTemplate>(\r\n `${this.apiUrl}/api/templates/${templateId}`,\r\n { headers: this.getHeaders() },\r\n this.retryCount,\r\n this.retryDelay\r\n );\r\n }\r\n}\r\n\r\n","/**\r\n * Main Metigan Service\r\n * Unified service that provides access to all Metigan modules\r\n */\r\n\r\nimport { Injectable, Inject, Optional } from '@angular/core';\r\nimport { MetiganEmailService } from './email.service';\r\nimport { MetiganFormsService } from './forms.service';\r\nimport { MetiganContactsService } from './contacts.service';\r\nimport { MetiganAudiencesService } from './audiences.service';\r\nimport { MetiganTemplatesService } from './templates.service';\r\nimport { MetiganError } from './errors';\r\nimport { MetiganClientOptions } from './types';\r\n\r\nexport const METIGAN_CONFIG = 'METIGAN_CONFIG';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetiganService {\r\n public readonly email: MetiganEmailService;\r\n public readonly forms: MetiganFormsService;\r\n public readonly contacts: MetiganContactsService;\r\n public readonly audiences: MetiganAudiencesService;\r\n public readonly templates: MetiganTemplatesService;\r\n\r\n private initialized: boolean = false;\r\n\r\n constructor(\r\n emailService: MetiganEmailService,\r\n formsService: MetiganFormsService,\r\n contactsService: MetiganContactsService,\r\n audiencesService: MetiganAudiencesService,\r\n templatesService: MetiganTemplatesService,\r\n @Optional() @Inject(METIGAN_CONFIG) config?: MetiganClientOptions\r\n ) {\r\n this.email = emailService;\r\n this.forms = formsService;\r\n this.contacts = contactsService;\r\n this.audiences = audiencesService;\r\n this.templates = templatesService;\r\n\r\n // Auto-initialize if config is provided via injection\r\n if (config) {\r\n this.initialize(config);\r\n }\r\n }\r\n\r\n /**\r\n * Initialize all services with API key and options\r\n */\r\n initialize(options: MetiganClientOptions): void {\r\n if (!options.apiKey) {\r\n throw new MetiganError('API key is required');\r\n }\r\n\r\n const serviceOptions = {\r\n apiUrl: options.apiUrl,\r\n timeout: options.timeout,\r\n retryCount: options.retryCount,\r\n retryDelay: options.retryDelay\r\n };\r\n\r\n this.email.initialize(options.apiKey, serviceOptions);\r\n this.forms.initialize(options.apiKey, serviceOptions);\r\n this.contacts.initialize(options.apiKey, serviceOptions);\r\n this.audiences.initialize(options.apiKey, serviceOptions);\r\n this.templates.initialize(options.apiKey, serviceOptions);\r\n\r\n this.initialized = true;\r\n }\r\n\r\n /**\r\n * Check if services are initialized\r\n */\r\n isInitialized(): boolean {\r\n return this.initialized;\r\n }\r\n}\r\n\r\n","/**\r\n * Metigan Angular Module\r\n * Import this module in your Angular app to use Metigan services\r\n */\r\n\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { MetiganService, METIGAN_CONFIG } from './metigan.service';\r\nimport { MetiganHttpClient } from './http-client.service';\r\nimport { MetiganEmailService } from './email.service';\r\nimport { MetiganFormsService } from './forms.service';\r\nimport { MetiganContactsService } from './contacts.service';\r\nimport { MetiganAudiencesService } from './audiences.service';\r\nimport { MetiganTemplatesService } from './templates.service';\r\nimport { MetiganClientOptions } from './types';\r\n\r\n@NgModule({\r\n imports: [HttpClientModule],\r\n providers: [\r\n MetiganHttpClient,\r\n MetiganEmailService,\r\n MetiganFormsService,\r\n MetiganContactsService,\r\n MetiganAudiencesService,\r\n MetiganTemplatesService,\r\n MetiganService\r\n ]\r\n})\r\nexport class MetiganModule {\r\n /**\r\n * Configure Metigan with API key and options\r\n * Call this in your root module's imports\r\n * \r\n * @example\r\n * ```typescript\r\n * imports: [\r\n * MetiganModule.forRoot({\r\n * apiKey: 'your-api-key'\r\n * })\r\n * ]\r\n * ```\r\n */\r\n static forRoot(config: MetiganClientOptions): ModuleWithProviders<MetiganModule> {\r\n return {\r\n ngModule: MetiganModule,\r\n providers: [\r\n {\r\n provide: METIGAN_CONFIG,\r\n useValue: config\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n\r\n","/**\r\n * Type definitions for Metigan Angular SDK\r\n * @version 1.0.0\r\n */\r\n\r\n// ============================================\r\n// EMAIL TYPES\r\n// ============================================\r\n\r\n/**\r\n * Email attachment interface for Angular\r\n */\r\nexport interface EmailAttachment {\r\n content: ArrayBuffer | Uint8Array | string;\r\n filename: string;\r\n contentType: string;\r\n}\r\n\r\n/**\r\n * Email options interface\r\n */\r\nexport interface EmailOptions {\r\n /** Sender email address (or Name <email>) */\r\n from: string;\r\n /** List of recipient email addresses */\r\n recipients: string[];\r\n /** Email subject */\r\n subject: string;\r\n /** Email content (HTML supported) - Required if not using templateId */\r\n content?: string;\r\n /** Template ID for using pre-created templates (optional) */\r\n templateId?: string;\r\n /** Optional file attachments */\r\n attachments?: File[] | EmailAttachment[];\r\n /** Optional CC recipients */\r\n cc?: string[];\r\n /** Optional BCC recipients */\r\n bcc?: string[];\r\n /** Optional reply-to address */\r\n replyTo?: string;\r\n}\r\n\r\n/**\r\n * API response interface for successful email\r\n */\r\nexport interface EmailSuccessResponse {\r\n success: true;\r\n message: string;\r\n successfulEmails: {\r\n recipient: string;\r\n trackingId: string;\r\n }[];\r\n failedEmails: {\r\n recipient: string;\r\n error: string;\r\n }[];\r\n recipientCount: number;\r\n emailsRemaining: number;\r\n}\r\n\r\n/**\r\n * API error response interfaces\r\n */\r\nexport interface EmailErrorResponse {\r\n error: string;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Union type for all possible API responses\r\n */\r\nexport type EmailApiResponse = EmailSuccessResponse | EmailErrorResponse;\r\n\r\n// ============================================\r\n// FORM TYPES\r\n// ============================================\r\n\r\n/**\r\n * Form field types\r\n */\r\nexport type FormFieldType = \r\n | 'text'\r\n | 'email'\r\n | 'number'\r\n | 'textarea'\r\n | 'select'\r\n | 'checkbox'\r\n | 'radio'\r\n | 'date'\r\n | 'phone'\r\n | 'url'\r\n | 'file'\r\n | 'step'\r\n | 'password'\r\n | 'rating'\r\n | 'slider'\r\n | 'heading'\r\n | 'image-choice'\r\n | 'matrix';\r\n\r\n/**\r\n * Form field configuration\r\n */\r\nexport interface FormFieldConfig {\r\n id: string;\r\n type: FormFieldType;\r\n label: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n helpText?: string;\r\n options?: string[];\r\n imageUrls?: string[];\r\n defaultValue?: string | number | boolean;\r\n}\r\n\r\n/**\r\n * Form settings\r\n */\r\nexport interface FormSettings {\r\n successMessage?: string;\r\n processingMessage?: string;\r\n redirectUrl?: string;\r\n notifyEmail?: string;\r\n enableCaptcha?: boolean;\r\n storeResponses?: boolean;\r\n allowMultipleSubmissions?: boolean;\r\n showProgressBar?: boolean;\r\n}\r\n\r\n/**\r\n * Complete form configuration\r\n */\r\nexport interface FormConfig {\r\n id?: string;\r\n title: string;\r\n description?: string;\r\n coverImage?: string;\r\n fields: FormFieldConfig[];\r\n audienceId?: string;\r\n settings?: FormSettings;\r\n published?: boolean;\r\n publishedUrl?: string;\r\n slug?: string;\r\n analytics?: {\r\n views: number;\r\n submissions: number;\r\n conversionRate?: number;\r\n };\r\n createdAt?: Date;\r\n updatedAt?: Date;\r\n}\r\n\r\n/**\r\n * Form submission data\r\n */\r\nexport interface FormSubmissionData {\r\n [fieldId: string]: any;\r\n}\r\n\r\n/**\r\n * Form submission options\r\n */\r\nexport interface FormSubmissionOptions {\r\n formId: string;\r\n data: FormSubmissionData;\r\n}\r\n\r\n/**\r\n * Form submission response\r\n */\r\nexport interface FormSubmissionResponse {\r\n success: boolean;\r\n message: string;\r\n submissionId?: string;\r\n}\r\n\r\n/**\r\n * Form list response\r\n */\r\nexport interface FormListResponse {\r\n forms: FormConfig[];\r\n pagination: {\r\n total: number;\r\n page: number;\r\n limit: number;\r\n pages: number;\r\n };\r\n}\r\n\r\n// ============================================\r\n// CONTACT TYPES\r\n// ============================================\r\n\r\n/**\r\n * Contact status\r\n */\r\nexport type ContactStatus = 'subscribed' | 'unsubscribed' | 'pending' | 'bounced' | 'complained';\r\n\r\n/**\r\n * Contact data\r\n */\r\nexport interface Contact {\r\n id?: string;\r\n email: string;\r\n firstName?: string;\r\n lastName?: string;\r\n phone?: string;\r\n status: ContactStatus;\r\n audienceId: string;\r\n tags?: string[];\r\n customFields?: Record<string, any>;\r\n createdAt?: Date;\r\n updatedAt?: Date;\r\n}\r\n\r\n/**\r\n * Contact creation options\r\n */\r\nexport interface CreateContactOptions {\r\n email: string;\r\n firstName?: string;\r\n lastName?: string;\r\n phone?: string;\r\n audienceId: string;\r\n tags?: string[];\r\n customFields?: Record<string, any>;\r\n status?: ContactStatus;\r\n}\r\n\r\n/**\r\n * Contact update options\r\n */\r\nexport interface UpdateContactOptions {\r\n firstName?: string;\r\n lastName?: string;\r\n phone?: string;\r\n tags?: string[];\r\n customFields?: Record<string, any>;\r\n status?: ContactStatus;\r\n}\r\n\r\n/**\r\n * Contact list filters\r\n */\r\nexport interface ContactListFilters {\r\n audienceId?: string;\r\n status?: ContactStatus;\r\n tag?: string;\r\n search?: string;\r\n page?: number;\r\n limit?: number;\r\n}\r\n\r\n/**\r\n * Contact list response\r\n */\r\nexport interface ContactListResponse {\r\n contacts: Contact[];\r\n pagination: {\r\n total: number;\r\n page: number;\r\n limit: number;\r\n pages: number;\r\n };\r\n}\r\n\r\n/**\r\n * Bulk contact operation result\r\n */\r\nexport interface BulkContactResult {\r\n success: boolean;\r\n imported: number;\r\n failed: number;\r\n errors?: { email: string; error: string }[];\r\n}\r\n\r\n// ============================================\r\n// AUDIENCE TYPES\r\n// ============================================\r\n\r\n/**\r\n * Audience data\r\n */\r\nexport interface Audience {\r\n id?: string;\r\n name: string;\r\n description?: string;\r\n count: number;\r\n createdAt?: Date;\r\n updatedAt?: Date;\r\n}\r\n\r\n/**\r\n * Audience creation options\r\n */\r\nexport interface CreateAudienceOptions {\r\n name: string;\r\n description?: string;\r\n}\r\n\r\n/**\r\n * Audience update options\r\n */\r\nexport interface UpdateAudienceOptions {\r\n name?: string;\r\n description?: string;\r\n}\r\n\r\n/**\r\n * Audience list response\r\n */\r\nexport interface AudienceListResponse {\r\n audiences: Audience[];\r\n pagination: {\r\n total: number;\r\n page: number;\r\n limit: number;\r\n pages: number;\r\n };\r\n}\r\n\r\n/**\r\n * Audience statistics\r\n */\r\nexport interface AudienceStats {\r\n total: number;\r\n subscribed: number;\r\n unsubscribed: number;\r\n pending: number;\r\n bounced: number;\r\n complained: number;\r\n growthRate?: number;\r\n}\r\n\r\n// ============================================\r\n// TEMPLATE TYPES\r\n// ============================================\r\n\r\n/**\r\n * Email template data\r\n */\r\nexport interface EmailTemplate {\r\n id: string;\r\n name: string;\r\n subject: string;\r\n components?: any[];\r\n styles?: any;\r\n createdAt?: Date;\r\n updatedAt?: Date;\r\n}\r\n\r\n/**\r\n * Email template list response\r\n */\r\nexport interface EmailTemplateListResponse {\r\n templates: EmailTemplate[];\r\n pagination: {\r\n total: number;\r\n page: number;\r\n limit: number;\r\n pages: number;\r\n };\r\n}\r\n\r\n// ============================================\r\n// COMMON TYPES\r\n// ============================================\r\n\r\n/**\r\n * Pagination options\r\n */\r\nexport interface PaginationOptions {\r\n page?: number;\r\n limit?: number;\r\n}\r\n\r\n/**\r\n * Client options for Metigan\r\n */\r\nexport interface MetiganClientOptions {\r\n /** API Key */\r\n apiKey: string;\r\n /** User ID for logging */\r\n userId?: string;\r\n /** Disable logging */\r\n disableLogs?: boolean;\r\n /** Request timeout in ms */\r\n timeout?: number;\r\n /** Number of retries */\r\n retryCount?: number;\r\n /** Delay between retries in ms */\r\n retryDelay?: number;\r\n /** Enable debug mode */\r\n debug?: boolean;\r\n /** Custom API URL */\r\n apiUrl?: string;\r\n}\r\n\r\n","/**\r\n * Public API for @metigan/angular\r\n * Export all public classes, services, and types\r\n */\r\n\r\n// Services\r\nexport { MetiganService, METIGAN_CONFIG } from './src/lib/metigan.service';\r\nexport { MetiganEmailService } from './src/lib/email.service';\r\nexport { MetiganFormsService } from './src/lib/forms.service';\r\nexport { MetiganContactsService } from './src/lib/contacts.service';\r\nexport { MetiganAudiencesService } from './src/lib/audiences.service';\r\nexport { MetiganTemplatesService } from './src/lib/templates.service';\r\nexport { MetiganHttpClient } from './src/lib/http-client.service';\r\n\r\n// Module\r\nexport { MetiganModule } from './src/lib/metigan.module';\r\n\r\n// Errors\r\nexport { MetiganError, ValidationError, ApiError } from './src/lib/errors';\r\n\r\n// Types\r\nexport * from './src/lib/types';\r\n\r\n// Config\r\nexport { API_URL, SDK_VERSION, DEFAULT_TIMEOUT, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY, MAX_FILE_SIZE } from './src/lib/config';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.MetiganHttpClient"],"mappings":";;;;;;;AAAA;;AAEG;AAEH;;AAEG;AACG,MAAO,YAAa,SAAQ,KAAK,CAAA;AACrC,IAAA,WAAA,CAAY,OAAe,EAAA;QACzB,KAAK,CAAC,OAAO,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,cAAc;QAC1B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC;IACrD;AACD;AAED;;AAEG;AACG,MAAO,eAAgB,SAAQ,YAAY,CAAA;AACxC,IAAA,KAAK;IAEZ,WAAA,CAAY,OAAe,EAAE,KAAc,EAAA;QACzC,KAAK,CAAC,OAAO,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,iBAAiB;AAC7B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC;IACxD;AACD;AAED;;AAEG;AACG,MAAO,QAAS,SAAQ,YAAY,CAAA;AACjC,IAAA,UAAU;AACV,IAAA,MAAM;IAEb,WAAA,CAAY,OAAe,EAAE,UAAmB,EAAA;QAC9C,KAAK,CAAC,OAAO,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,UAAU;AACtB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,UAAU;AAC1C,QAAA,IAAI,CAAC,MAAM,GAAG,UAAU;QACxB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;IACjD;AACD;;AC3CD;;;AAGG;AAEH;;;;;AAKG;AACI,MAAM,OAAO,GAAG,CAAC,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,GAAG,iBAAiB,CAAC;AACrF,OAAA;AAEL;;AAEG;AACI,MAAM,WAAW,GAAG;AAE3B;;AAEG;AACI,MAAM,eAAe,GAAG;AAE/B;;AAEG;AACI,MAAM,mBAAmB,GAAG;AAC5B,MAAM,mBAAmB,GAAG;AAEnC;;AAEG;MACU,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG;;ACjCxC;;;AAGG;MAiBU,iBAAiB,CAAA;AACR,IAAA,IAAA;AAApB,IAAA,WAAA,CAAoB,IAAgB,EAAA;QAAhB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAe;AAEvC;;AAEG;IACH,GAAG,CAAI,GAAW,EAAE,OAAqB,EAAE,UAAA,GAAqB,CAAC,EAAE,UAAA,GAAqB,IAAI,EAAA;QAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAEvC,QAAA,OAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,IAAI,CAAmB,CAAC,IAAI,CACxD,GAAG,CAAC,CAAC,QAAW,KAAK,QAAQ,CAAC,EAC9B,SAAS,CAAC,MAAM,IACd,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,CAAC,KAAwB,EAAE,KAAa,KAAI;YACnD,IAAI,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;gBACjD,OAAO,KAAK,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACxC;AACA,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH,CACF,EACD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAC7B;IACH;AAEA;;AAEG;IACH,IAAI,CAAI,GAAW,EAAE,IAAS,EAAE,OAAqB,EAAE,UAAA,GAAqB,CAAC,EAAE,UAAA,GAAqB,IAAI,EAAA;QACtG,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAEvC,QAAA,OAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAmB,CAAC,IAAI,CAC/D,GAAG,CAAC,CAAC,QAAW,KAAK,QAAQ,CAAC,EAC9B,SAAS,CAAC,MAAM,IACd,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,CAAC,KAAwB,EAAE,KAAa,KAAI;YACnD,IAAI,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;gBACjD,OAAO,KAAK,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACxC;AACA,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH,CACF,EACD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAC7B;IACH;AAEA;;AAEG;IACH,GAAG,CAAI,GAAW,EAAE,IAAS,EAAE,OAAqB,EAAE,UAAA,GAAqB,CAAC,EAAE,UAAA,GAAqB,IAAI,EAAA;QACrG,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAEvC,QAAA,OAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAmB,CAAC,IAAI,CAC9D,GAAG,CAAC,CAAC,QAAW,KAAK,QAAQ,CAAC,EAC9B,SAAS,CAAC,MAAM,IACd,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,CAAC,KAAwB,EAAE,KAAa,KAAI;YACnD,IAAI,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;gBACjD,OAAO,KAAK,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACxC;AACA,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH,CACF,EACD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAC7B;IACH;AAEA;;AAEG;IACH,MAAM,CAAI,GAAW,EAAE,OAAqB,EAAE,UAAA,GAAqB,CAAC,EAAE,UAAA,GAAqB,IAAI,EAAA;QAC7F,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAEvC,QAAA,OAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAI,GAAG,EAAE,IAAI,CAAmB,CAAC,IAAI,CAC3D,GAAG,CAAC,CAAC,QAAW,KAAK,QAAQ,CAAC,EAC9B,SAAS,CAAC,MAAM,IACd,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,CAAC,KAAwB,EAAE,KAAa,KAAI;YACnD,IAAI,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;gBACjD,OAAO,KAAK,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACxC;AACA,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH,CACF,EACD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAC7B;IACH;AAEA;;AAEG;AACK,IAAA,YAAY,CAAC,OAAqB,EAAA;AACxC,QAAA,MAAM,IAAI,GAAQ;AAChB,YAAA,OAAO,EAAE;SACV;AAED,QAAA,IAAI,OAAO,EAAE,OAAO,EAAE;AACpB,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;QAChC;AAEA,QAAA,IAAI,OAAO,EAAE,MAAM,EAAE;AACnB,YAAA,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;QAC9B;;;AAKA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACK,IAAA,WAAW,CAAC,KAAwB,EAAA;;AAE1C,QAAA,OAAO,KAAK,CAAC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;IACnE;AAEA;;AAEG;AACK,IAAA,WAAW,GAAG,CAAC,KAAwB,KAAuB;AACpE,QAAA,IAAI,KAAK,CAAC,KAAK,YAAY,UAAU,EAAE;;AAErC,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,CAAA,eAAA,EAAkB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC,CAAC;QACpF;aAAO;;AAEL,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,CAAA,2BAAA,EAA8B,KAAK,CAAC,MAAM,EAAE;AAC1G,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9D;AACF,IAAA,CAAC;wGArIU,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACnBD;;;AAGG;MAaU,mBAAmB,CAAA;AAOV,IAAA,IAAA;IANZ,MAAM,GAAW,EAAE;IACnB,MAAM,GAAW,OAAO;IACxB,OAAO,GAAW,eAAe;IACjC,UAAU,GAAW,mBAAmB;IACxC,UAAU,GAAW,mBAAmB;AAEhD,IAAA,WAAA,CAAoB,IAAuB,EAAA;QAAvB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAsB;AAE9C;;AAEG;IACH,UAAU,CAAC,MAAc,EAAE,OAAyF,EAAA;QAClH,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC;QAC/C;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,eAAe;QAClD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;QAC5D,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;IAC9D;AAEA;;AAEG;AACK,IAAA,aAAa,CAAC,KAAa,EAAA;AACjC,QAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QACvC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,KAAK;AACxC,QAAA,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,KAAK;AAC7D,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACK,IAAA,mBAAmB,CAAC,IAAY,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAC1C,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAC7B;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB;AAEA;;AAEG;AACK,IAAA,eAAe,CAAC,OAAqB,EAAA;AAC3C,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjB,YAAA,MAAM,IAAI,eAAe,CAAC,iCAAiC,CAAC;QAC9D;QAEA,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAChG,YAAA,MAAM,IAAI,eAAe,CAAC,sCAAsC,CAAC;QACnE;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACpB,YAAA,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC;QAClD;QAEA,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAC3C,YAAA,MAAM,IAAI,eAAe,CAAC,0CAA0C,CAAC;QACvE;QAEA,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;AAClC,YAAA,MAAM,IAAI,eAAe,CAAC,gCAAgC,SAAS,CAAA,CAAE,CAAC;QACxE;AAEA,QAAA,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE;YAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAC1D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;AACvC,gBAAA,MAAM,IAAI,eAAe,CAAC,mCAAmC,cAAc,CAAA,CAAE,CAAC;YAChF;QACF;AAEA,QAAA,IAAI,OAAO,CAAC,EAAE,EAAE;AACd,YAAA,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,EAAE,EAAE;gBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;AAChC,oBAAA,MAAM,IAAI,eAAe,CAAC,4BAA4B,OAAO,CAAA,CAAE,CAAC;gBAClE;YACF;QACF;AAEA,QAAA,IAAI,OAAO,CAAC,GAAG,EAAE;AACf,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;AACjC,oBAAA,MAAM,IAAI,eAAe,CAAC,6BAA6B,QAAQ,CAAA,CAAE,CAAC;gBACpE;YACF;QACF;AAEA,QAAA,IAAI,OAAO,CAAC,OAAO,EAAE;YACnB,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;AACrC,gBAAA,MAAM,IAAI,eAAe,CAAC,kCAAkC,YAAY,CAAA,CAAE,CAAC;YAC7E;QACF;IACF;AAEA;;AAEG;IACK,MAAM,kBAAkB,CAAC,WAAuC,EAAA;AACtE,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAE/B,QAAA,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;AAC9B,YAAA,IAAI,IAAI,YAAY,IAAI,EAAE;AACxB,gBAAA,IAAI,IAAI,CAAC,IAAI,GAAG,aAAa,EAAE;oBAC7B,MAAM,IAAI,YAAY,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAC,IAAI,CAAA,gCAAA,CAAkC,CAAC;gBAC7E;AACA,gBAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;YAChC;iBAAO;gBACL,MAAM,UAAU,GAAG,IAAuB;;AAG1C,gBAAA,IAAI,IAAU;AACd,gBAAA,IAAI,UAAU,CAAC,OAAO,YAAY,WAAW,EAAE;AAC7C,oBAAA,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;gBACzE;AAAO,qBAAA,IAAI,UAAU,CAAC,OAAO,YAAY,UAAU,EAAE;AACnD,oBAAA,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;gBACzE;AAAO,qBAAA,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,EAAE;;oBAEjD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;oBAC/C,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;AACpD,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAC9C,WAAW,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;oBAC/C;AACA,oBAAA,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC;AAC7C,oBAAA,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;gBAChE;qBAAO;AACL,oBAAA,MAAM,IAAI,YAAY,CAAC,iCAAiC,CAAC;gBAC3D;AAEA,gBAAA,IAAI,IAAI,CAAC,IAAI,GAAG,aAAa,EAAE;oBAC7B,MAAM,IAAI,YAAY,CAAC,CAAA,KAAA,EAAQ,UAAU,CAAC,QAAQ,CAAA,gCAAA,CAAkC,CAAC;gBACvF;gBAEA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;AACvF,gBAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;YACnC;QACF;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,OAAqB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QAC/B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC;AAEA,QAAA,MAAM,OAAO,GAAG;YACd,WAAW,EAAE,IAAI,CAAC,MAAM;AACxB,YAAA,YAAY,EAAE;SACf;;AAGD,QAAA,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AACzD,YAAA,OAAO,IAAI,UAAU,CAAC,QAAQ,IAAG;AAC/B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAG;oBAC5D,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;AACrC,oBAAA,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBACjE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;AAE3C,oBAAA,IAAI,OAAO,CAAC,UAAU,EAAE;AACtB,wBAAA,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC;wBACtC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC;oBACnD;AAAO,yBAAA,IAAI,OAAO,CAAC,OAAO,EAAE;wBAC1B,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;oBAC7C;AAEA,oBAAA,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACvC,wBAAA,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACnD;AAEA,oBAAA,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,wBAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACrD;AAEA,oBAAA,IAAI,OAAO,CAAC,OAAO,EAAE;wBACnB,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;oBAC7C;AAEA,oBAAA,MAAM,WAAW,GAAG;AAClB,wBAAA,OAAO,EAAE;qBACV;oBAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAmB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,eAAA,CAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU;AACtH,yBAAA,IAAI,CACH,GAAG,CAAC,QAAQ,IAAG;wBACb,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE;AAC7C,4BAAA,OAAO,QAAgC;wBACzC;6BAAO;4BACL,MAAM,IAAI,YAAY,CAAE,QAAgB,CAAC,OAAO,IAAI,sBAAsB,CAAC;wBAC7E;AACF,oBAAA,CAAC,CAAC;AAEH,yBAAA,SAAS,CAAC;wBACT,IAAI,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;wBAC3C,KAAK,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;AACvC,wBAAA,QAAQ,EAAE,MAAM,QAAQ,CAAC,QAAQ;AAClC,qBAAA,CAAC;AACN,gBAAA,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1C,YAAA,CAAC,CAAC;QACJ;aAAO;;AAEL,YAAA,MAAM,IAAI,GAAG;gBACX,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO,EAAE,OAAO,CAAC;aAClB;AAED,YAAA,IAAI,OAAO,CAAC,UAAU,EAAE;AACrB,gBAAA,IAAY,CAAC,WAAW,GAAG,MAAM;AACjC,gBAAA,IAAY,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU;YAC/C;AAAO,iBAAA,IAAI,OAAO,CAAC,OAAO,EAAE;AACzB,gBAAA,IAAY,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;YACzC;AAEA,YAAA,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACtC,gBAAA,IAAY,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE;YAC/B;AAEA,YAAA,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;AACxC,gBAAA,IAAY,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG;YACjC;AAEA,YAAA,IAAI,OAAO,CAAC,OAAO,EAAE;AAClB,gBAAA,IAAY,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;YACzC;AAEA,YAAA,MAAM,WAAW,GAAG;AAClB,gBAAA,OAAO,EAAE;AACP,oBAAA,GAAG,OAAO;AACV,oBAAA,cAAc,EAAE;AACjB;aACF;YAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAmB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,eAAA,CAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU;AACzH,iBAAA,IAAI,CACH,GAAG,CAAC,QAAQ,IAAG;gBACb,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE;AAC7C,oBAAA,OAAO,QAAgC;gBACzC;qBAAO;oBACL,MAAM,IAAI,YAAY,CAAE,QAAgB,CAAC,OAAO,IAAI,sBAAsB,CAAC;gBAC7E;YACF,CAAC,CAAC,CACH;QACL;IACF;wGA1QW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACfD;;;AAGG;MAmBU,mBAAmB,CAAA;AAOV,IAAA,IAAA;IANZ,MAAM,GAAW,EAAE;IACnB,MAAM,GAAW,OAAO;IACxB,OAAO,GAAW,eAAe;IACjC,UAAU,GAAW,mBAAmB;IACxC,UAAU,GAAW,mBAAmB;AAEhD,IAAA,WAAA,CAAoB,IAAuB,EAAA;QAAvB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAsB;AAE9C;;AAEG;IACH,UAAU,CAAC,MAAc,EAAE,OAAyF,EAAA;QAClH,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC;QAC/C;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,eAAe;QAClD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;QAC5D,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;IAC9D;AAEA;;AAEG;IACK,UAAU,GAAA;QAChB,OAAO;AACL,YAAA,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAI,CAAC,MAAM;AACxB,YAAA,YAAY,EAAE;SACf;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,OAA8B,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnB,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACrE;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3D,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,6BAA6B,CAAC,CAAC;QAC7E;AAEA,QAAA,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC;SACf;AAED,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,gBAAA,CAAkB,EAChC,IAAI,EACJ,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,OAAO,CAAC,YAAoB,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,6BAA6B,CAAC,CAAC;QAC7E;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,WAAA,EAAc,YAAY,EAAE,EAC1C,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,IAAY,EAAA;QACxB,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,uBAAuB,CAAC,CAAC;QACvE;;QAGA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,GAAA,EAAM,IAAI,MAAM,EAC9B,EAAE,EACF,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,OAA2B,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC7B,QAAA,IAAI,OAAO,EAAE,IAAI,EAAE;AACjB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtD;AACA,QAAA,IAAI,OAAO,EAAE,KAAK,EAAE;AAClB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxD;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,UAAA,CAAY,EAC1B;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC1B,YAAA,MAAM,EAAE;SACT,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,MAA8B,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACjB,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YAChD,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,gCAAgC,CAAC,CAAC;QAChF;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,UAAA,CAAY,EAC1B,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,UAAU,CAAC,MAAc,EAAE,MAA2B,EAAA;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACrE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,EACpC,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,MAAc,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACrE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CACrB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,WAAA,EAAc,MAAM,EAAE,EACpC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,MAAc,EAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACrE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,WAAA,EAAc,MAAM,YAAY,EAC9C,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,WAAW,CAAC,MAAc,EAAE,IAAY,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACrE;QAEA,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,kBAAkB,CAAC,CAAC;QAClE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,WAAA,EAAc,MAAM,CAAA,QAAA,CAAU,EAC5C,EAAE,IAAI,EAAE,EACR,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;wGA9OW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACrBD;;;AAGG;MAoBU,sBAAsB,CAAA;AAOb,IAAA,IAAA;IANZ,MAAM,GAAW,EAAE;IACnB,MAAM,GAAW,OAAO;IACxB,OAAO,GAAW,eAAe;IACjC,UAAU,GAAW,mBAAmB;IACxC,UAAU,GAAW,mBAAmB;AAEhD,IAAA,WAAA,CAAoB,IAAuB,EAAA;QAAvB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAsB;AAE9C;;AAEG;IACH,UAAU,CAAC,MAAc,EAAE,OAAyF,EAAA;QAClH,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC;QAC/C;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,eAAe;QAClD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;QAC5D,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;IAC9D;AAEA;;AAEG;IACK,UAAU,GAAA;QAChB,OAAO;AACL,YAAA,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAI,CAAC,MAAM;AACxB,YAAA,YAAY,EAAE;SACf;IACH;AAEA;;AAEG;AACK,IAAA,aAAa,CAAC,KAAa,EAAA;AACjC,QAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QACvC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,KAAK;AACxC,QAAA,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,KAAK;AAC7D,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,OAA6B,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxD,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YACvB,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,aAAA,CAAe,EAC7B,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,GAAG,CAAC,SAAiB,EAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,EAAiB,SAAS,EAAE,EAC1C,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,UAAU,CAAC,KAAa,EAAE,UAAkB,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;YACxC,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;QAEA,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;QAC7B,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;QACnC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC;QAE7C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,aAAA,CAAe,EAC7B;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC1B,YAAA,MAAM,EAAE;SACT,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,MAAM,CAAC,SAAiB,EAAE,OAA6B,EAAA;AACrD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAE,EAC1C,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,SAAiB,EAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CACrB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,EAAiB,SAAS,EAAE,EAC1C,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,OAA4B,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC7B,QAAA,IAAI,OAAO,EAAE,UAAU,EAAE;YACvB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC;QACvD;AACA,QAAA,IAAI,OAAO,EAAE,MAAM,EAAE;YACnB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;QAC/C;AACA,QAAA,IAAI,OAAO,EAAE,GAAG,EAAE;YAChB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC;QACzC;AACA,QAAA,IAAI,OAAO,EAAE,MAAM,EAAE;YACnB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;QAC/C;AACA,QAAA,IAAI,OAAO,EAAE,IAAI,EAAE;AACjB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtD;AACA,QAAA,IAAI,OAAO,EAAE,KAAK,EAAE;AAClB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxD;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,aAAA,CAAe,EAC7B;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC1B,YAAA,MAAM,EAAE;SACT,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,MAAM,CAAC,KAAa,EAAE,UAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;QAC1E;AAEA,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;QAC7B,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;QACpC,IAAI,UAAU,EAAE;YACd,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC;QAC/C;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,oBAAA,CAAsB,EACpC;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC1B,YAAA,MAAM,EAAE;SACT,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,UAAU,CAAC,QAAgC,EAAE,UAAkB,EAAA;AAC7D,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACtC,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,4BAA4B,CAAC,CAAC;QAC5E;QAEA,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,kBAAA,CAAoB,EAClC,EAAE,QAAQ,EAAE,UAAU,EAAE,EACxB,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,SAAiB,EAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,EAAiB,SAAS,CAAA,UAAA,CAAY,EACpD,EAAE,EACF,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,SAAiB,EAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,EAAiB,SAAS,CAAA,YAAA,CAAc,EACtD,EAAE,EACF,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,OAAO,CAAC,SAAiB,EAAE,IAAc,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;QAEA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,EAAiB,SAAS,CAAA,KAAA,CAAO,EAC/C,EAAE,IAAI,EAAE,EACR,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,UAAU,CAAC,SAAiB,EAAE,IAAc,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;QAEA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACxE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CACrB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,EAAiB,SAAS,OAAO,EAC/C;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SAC/B,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;wGA/VW,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACtBD;;;AAGG;MAoBU,uBAAuB,CAAA;AAOd,IAAA,IAAA;IANZ,MAAM,GAAW,EAAE;IACnB,MAAM,GAAW,OAAO;IACxB,OAAO,GAAW,eAAe;IACjC,UAAU,GAAW,mBAAmB;IACxC,UAAU,GAAW,mBAAmB;AAEhD,IAAA,WAAA,CAAoB,IAAuB,EAAA;QAAvB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAsB;AAE9C;;AAEG;IACH,UAAU,CAAC,MAAc,EAAE,OAAyF,EAAA;QAClH,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC;QAC/C;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,eAAe;QAClD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;QAC5D,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;IAC9D;AAEA;;AAEG;IACK,UAAU,GAAA;QAChB,OAAO;AACL,YAAA,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAI,CAAC,MAAM;AACxB,YAAA,YAAY,EAAE;SACf;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,OAA8B,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACjB,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,2BAA2B,CAAC,CAAC;QAC3E;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,CAAgB,EAC9B,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,GAAG,CAAC,UAAkB,EAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,eAAA,EAAkB,UAAU,EAAE,EAC5C,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,MAAM,CAAC,UAAkB,EAAE,OAA8B,EAAA;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAE,EAC5C,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,UAAkB,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CACrB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,eAAA,EAAkB,UAAU,EAAE,EAC5C,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,OAA2B,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC7B,QAAA,IAAI,OAAO,EAAE,IAAI,EAAE;AACjB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtD;AACA,QAAA,IAAI,OAAO,EAAE,KAAK,EAAE;AAClB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxD;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,CAAgB,EAC9B;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC1B,YAAA,MAAM,EAAE;SACT,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,UAAkB,EAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,eAAA,EAAkB,UAAU,QAAQ,EAClD,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,KAAK,CAAC,UAAkB,EAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,eAAA,EAAkB,UAAU,CAAA,MAAA,CAAQ,EAClD,EAAE,EACF,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;IACH,KAAK,CAAC,gBAAwB,EAAE,gBAAwB,EAAA;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,EAAE;YAC1C,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,6CAA6C,CAAC,CAAC;QAC7F;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,eAAA,EAAkB,gBAAgB,CAAA,MAAA,CAAQ,EACxD,EAAE,gBAAgB,EAAE,EACpB,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;wGA5MW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;4FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACtBD;;;AAGG;MAiBU,uBAAuB,CAAA;AAOd,IAAA,IAAA;IANZ,MAAM,GAAW,EAAE;IACnB,MAAM,GAAW,OAAO;IACxB,OAAO,GAAW,eAAe;IACjC,UAAU,GAAW,mBAAmB;IACxC,UAAU,GAAW,mBAAmB;AAEhD,IAAA,WAAA,CAAoB,IAAuB,EAAA;QAAvB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAsB;AAE9C;;AAEG;IACH,UAAU,CAAC,MAAc,EAAE,OAAyF,EAAA;QAClH,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC;QAC/C;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,eAAe;QAClD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;QAC5D,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB;IAC9D;AAEA;;AAEG;IACK,UAAU,GAAA;QAChB,OAAO;AACL,YAAA,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAI,CAAC,MAAM;AACxB,YAAA,YAAY,EAAE;SACf;IACH;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,OAA2B,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;AAEA,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAC7B,QAAA,IAAI,OAAO,EAAE,IAAI,EAAE;AACjB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtD;AACA,QAAA,IAAI,OAAO,EAAE,KAAK,EAAE;AAClB,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxD;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,cAAA,CAAgB,EAC9B;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC1B,YAAA,MAAM,EAAE;SACT,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;AAEA;;AAEG;AACH,IAAA,GAAG,CAAC,UAAkB,EAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,mDAAmD,CAAC,CAAC;QAChG;QAEA,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACzE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,eAAA,EAAkB,UAAU,EAAE,EAC5C,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC9B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB;IACH;wGAhFW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;4FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACnBD;;;AAGG;AAWI,MAAM,cAAc,GAAG;MAKjB,cAAc,CAAA;AACT,IAAA,KAAK;AACL,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,SAAS;IAEjB,WAAW,GAAY,KAAK;IAEpC,WAAA,CACE,YAAiC,EACjC,YAAiC,EACjC,eAAuC,EACvC,gBAAyC,EACzC,gBAAyC,EACL,MAA6B,EAAA;AAEjE,QAAA,IAAI,CAAC,KAAK,GAAG,YAAY;AACzB,QAAA,IAAI,CAAC,KAAK,GAAG,YAAY;AACzB,QAAA,IAAI,CAAC,QAAQ,GAAG,eAAe;AAC/B,QAAA,IAAI,CAAC,SAAS,GAAG,gBAAgB;AACjC,QAAA,IAAI,CAAC,SAAS,GAAG,gBAAgB;;QAGjC,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACzB;IACF;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,OAA6B,EAAA;AACtC,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACnB,YAAA,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC;QAC/C;AAEA,QAAA,MAAM,cAAc,GAAG;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC;SACrB;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC;QACxD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC;AAEzD,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;IACzB;AAEA;;AAEG;IACH,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,WAAW;IACzB;AA1DW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,6LAeH,cAAc,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAfzB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAgBI;;0BAAY,MAAM;2BAAC,cAAc;;;AClCtC;;;AAGG;MAyBU,aAAa,CAAA;AACxB;;;;;;;;;;;;AAYG;IACH,OAAO,OAAO,CAAC,MAA4B,EAAA;QACzC,OAAO;AACL,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,OAAO,EAAE,cAAc;AACvB,oBAAA,QAAQ,EAAE;AACX;AACF;SACF;IACH;wGAxBW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YAXd,gBAAgB,CAAA,EAAA,CAAA;AAWf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,EAAA,SAAA,EAVb;YACT,iBAAiB;YACjB,mBAAmB;YACnB,mBAAmB;YACnB,sBAAsB;YACtB,uBAAuB;YACvB,uBAAuB;YACvB;AACD,SAAA,EAAA,OAAA,EAAA,CATS,gBAAgB,CAAA,EAAA,CAAA;;4FAWf,aAAa,EAAA,UAAA,EAAA,CAAA;kBAZzB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,gBAAgB,CAAC;AAC3B,oBAAA,SAAS,EAAE;wBACT,iBAAiB;wBACjB,mBAAmB;wBACnB,mBAAmB;wBACnB,sBAAsB;wBACtB,uBAAuB;wBACvB,uBAAuB;wBACvB;AACD;AACF,iBAAA;;;AC3BD;;;AAGG;;ACHH;;;AAGG;AAEH;;ACLA;;AAEG;;;;"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@metigan/angular" />
5
+ export * from './public-api';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Public API for @metigan/angular
3
+ * Export all public classes, services, and types
4
+ */
5
+ export { MetiganService, METIGAN_CONFIG } from './src/lib/metigan.service';
6
+ export { MetiganEmailService } from './src/lib/email.service';
7
+ export { MetiganFormsService } from './src/lib/forms.service';
8
+ export { MetiganContactsService } from './src/lib/contacts.service';
9
+ export { MetiganAudiencesService } from './src/lib/audiences.service';
10
+ export { MetiganTemplatesService } from './src/lib/templates.service';
11
+ export { MetiganHttpClient } from './src/lib/http-client.service';
12
+ export { MetiganModule } from './src/lib/metigan.module';
13
+ export { MetiganError, ValidationError, ApiError } from './src/lib/errors';
14
+ export * from './src/lib/types';
15
+ export { API_URL, SDK_VERSION, DEFAULT_TIMEOUT, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY, MAX_FILE_SIZE } from './src/lib/config';
@@ -0,0 +1,62 @@
1
+ import { Observable } from 'rxjs';
2
+ import { MetiganHttpClient } from './http-client.service';
3
+ import { Audience, CreateAudienceOptions, UpdateAudienceOptions, AudienceListResponse, AudienceStats, PaginationOptions } from './types';
4
+ import * as i0 from "@angular/core";
5
+ export declare class MetiganAudiencesService {
6
+ private http;
7
+ private apiKey;
8
+ private apiUrl;
9
+ private timeout;
10
+ private retryCount;
11
+ private retryDelay;
12
+ constructor(http: MetiganHttpClient);
13
+ /**
14
+ * Initialize the service with API key and options
15
+ */
16
+ initialize(apiKey: string, options?: {
17
+ apiUrl?: string;
18
+ timeout?: number;
19
+ retryCount?: number;
20
+ retryDelay?: number;
21
+ }): void;
22
+ /**
23
+ * Get default headers
24
+ */
25
+ private getHeaders;
26
+ /**
27
+ * Create a new audience
28
+ */
29
+ create(options: CreateAudienceOptions): Observable<Audience>;
30
+ /**
31
+ * Get audience by ID
32
+ */
33
+ get(audienceId: string): Observable<Audience>;
34
+ /**
35
+ * Update an audience
36
+ */
37
+ update(audienceId: string, options: UpdateAudienceOptions): Observable<Audience>;
38
+ /**
39
+ * Delete an audience
40
+ */
41
+ delete(audienceId: string): Observable<void>;
42
+ /**
43
+ * List all audiences
44
+ */
45
+ list(options?: PaginationOptions): Observable<AudienceListResponse>;
46
+ /**
47
+ * Get audience statistics
48
+ */
49
+ getStats(audienceId: string): Observable<AudienceStats>;
50
+ /**
51
+ * Clean audience (remove bounced/unsubscribed contacts)
52
+ */
53
+ clean(audienceId: string): Observable<{
54
+ removed: number;
55
+ }>;
56
+ /**
57
+ * Merge audiences (source into target)
58
+ */
59
+ merge(sourceAudienceId: string, targetAudienceId: string): Observable<Audience>;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetiganAudiencesService, never>;
61
+ static ɵprov: i0.ɵɵInjectableDeclaration<MetiganAudiencesService>;
62
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Metigan Library Configuration
3
+ * Central configuration file for all modules
4
+ */
5
+ /**
6
+ * Default API URL for Metigan services
7
+ * All API calls are routed through this single endpoint
8
+ *
9
+ * Can be overridden with METIGAN_API_URL environment variable for testing
10
+ */
11
+ export declare const API_URL: string;
12
+ /**
13
+ * SDK Version
14
+ */
15
+ export declare const SDK_VERSION = "1.0.0";
16
+ /**
17
+ * Default timeout for API requests (in milliseconds)
18
+ */
19
+ export declare const DEFAULT_TIMEOUT = 30000;
20
+ /**
21
+ * Default retry configuration
22
+ */
23
+ export declare const DEFAULT_RETRY_COUNT = 3;
24
+ export declare const DEFAULT_RETRY_DELAY = 1000;
25
+ /**
26
+ * Maximum file size for attachments (7MB)
27
+ */
28
+ export declare const MAX_FILE_SIZE: number;
@@ -0,0 +1,80 @@
1
+ import { Observable } from 'rxjs';
2
+ import { MetiganHttpClient } from './http-client.service';
3
+ import { Contact, CreateContactOptions, UpdateContactOptions, ContactListFilters, ContactListResponse, BulkContactResult } from './types';
4
+ import * as i0 from "@angular/core";
5
+ export declare class MetiganContactsService {
6
+ private http;
7
+ private apiKey;
8
+ private apiUrl;
9
+ private timeout;
10
+ private retryCount;
11
+ private retryDelay;
12
+ constructor(http: MetiganHttpClient);
13
+ /**
14
+ * Initialize the service with API key and options
15
+ */
16
+ initialize(apiKey: string, options?: {
17
+ apiUrl?: string;
18
+ timeout?: number;
19
+ retryCount?: number;
20
+ retryDelay?: number;
21
+ }): void;
22
+ /**
23
+ * Get default headers
24
+ */
25
+ private getHeaders;
26
+ /**
27
+ * Validate email format
28
+ */
29
+ private validateEmail;
30
+ /**
31
+ * Create a new contact
32
+ */
33
+ create(options: CreateContactOptions): Observable<Contact>;
34
+ /**
35
+ * Get contact by ID
36
+ */
37
+ get(contactId: string): Observable<Contact>;
38
+ /**
39
+ * Get contact by email
40
+ */
41
+ getByEmail(email: string, audienceId: string): Observable<Contact>;
42
+ /**
43
+ * Update a contact
44
+ */
45
+ update(contactId: string, options: UpdateContactOptions): Observable<Contact>;
46
+ /**
47
+ * Delete a contact
48
+ */
49
+ delete(contactId: string): Observable<void>;
50
+ /**
51
+ * List contacts with filters
52
+ */
53
+ list(filters?: ContactListFilters): Observable<ContactListResponse>;
54
+ /**
55
+ * Search contacts
56
+ */
57
+ search(query: string, audienceId?: string): Observable<Contact[]>;
58
+ /**
59
+ * Bulk import contacts
60
+ */
61
+ bulkImport(contacts: CreateContactOptions[], audienceId: string): Observable<BulkContactResult>;
62
+ /**
63
+ * Subscribe a contact
64
+ */
65
+ subscribe(contactId: string): Observable<Contact>;
66
+ /**
67
+ * Unsubscribe a contact
68
+ */
69
+ unsubscribe(contactId: string): Observable<Contact>;
70
+ /**
71
+ * Add tags to a contact
72
+ */
73
+ addTags(contactId: string, tags: string[]): Observable<Contact>;
74
+ /**
75
+ * Remove tags from a contact
76
+ */
77
+ removeTags(contactId: string, tags: string[]): Observable<Contact>;
78
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetiganContactsService, never>;
79
+ static ɵprov: i0.ɵɵInjectableDeclaration<MetiganContactsService>;
80
+ }
@@ -0,0 +1,44 @@
1
+ import { Observable } from 'rxjs';
2
+ import { MetiganHttpClient } from './http-client.service';
3
+ import { EmailOptions, EmailSuccessResponse } from './types';
4
+ import * as i0 from "@angular/core";
5
+ export declare class MetiganEmailService {
6
+ private http;
7
+ private apiKey;
8
+ private apiUrl;
9
+ private timeout;
10
+ private retryCount;
11
+ private retryDelay;
12
+ constructor(http: MetiganHttpClient);
13
+ /**
14
+ * Initialize the service with API key and options
15
+ */
16
+ initialize(apiKey: string, options?: {
17
+ apiUrl?: string;
18
+ timeout?: number;
19
+ retryCount?: number;
20
+ retryDelay?: number;
21
+ }): void;
22
+ /**
23
+ * Validate email address format
24
+ */
25
+ private validateEmail;
26
+ /**
27
+ * Extract email address from "Name <email>" format
28
+ */
29
+ private extractEmailAddress;
30
+ /**
31
+ * Validate email options
32
+ */
33
+ private validateOptions;
34
+ /**
35
+ * Process attachments for FormData
36
+ */
37
+ private processAttachments;
38
+ /**
39
+ * Send an email
40
+ */
41
+ sendEmail(options: EmailOptions): Observable<EmailSuccessResponse>;
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetiganEmailService, never>;
43
+ static ɵprov: i0.ɵɵInjectableDeclaration<MetiganEmailService>;
44
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Custom error classes for Metigan SDK
3
+ */
4
+ /**
5
+ * Base error class for all Metigan errors
6
+ */
7
+ export declare class MetiganError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ /**
11
+ * Validation error - thrown when input validation fails
12
+ */
13
+ export declare class ValidationError extends MetiganError {
14
+ field?: string;
15
+ constructor(message: string, field?: string);
16
+ }
17
+ /**
18
+ * API error - thrown when API request fails
19
+ */
20
+ export declare class ApiError extends MetiganError {
21
+ statusCode?: number;
22
+ status?: number;
23
+ constructor(message: string, statusCode?: number);
24
+ }
@@ -0,0 +1,67 @@
1
+ import { Observable } from 'rxjs';
2
+ import { MetiganHttpClient } from './http-client.service';
3
+ import { FormConfig, FormSubmissionOptions, FormSubmissionResponse, FormListResponse, PaginationOptions } from './types';
4
+ import * as i0 from "@angular/core";
5
+ export declare class MetiganFormsService {
6
+ private http;
7
+ private apiKey;
8
+ private apiUrl;
9
+ private timeout;
10
+ private retryCount;
11
+ private retryDelay;
12
+ constructor(http: MetiganHttpClient);
13
+ /**
14
+ * Initialize the service with API key and options
15
+ */
16
+ initialize(apiKey: string, options?: {
17
+ apiUrl?: string;
18
+ timeout?: number;
19
+ retryCount?: number;
20
+ retryDelay?: number;
21
+ }): void;
22
+ /**
23
+ * Get default headers
24
+ */
25
+ private getHeaders;
26
+ /**
27
+ * Submit form data
28
+ */
29
+ submit(options: FormSubmissionOptions): Observable<FormSubmissionResponse>;
30
+ /**
31
+ * Get form by ID or slug
32
+ */
33
+ getForm(formIdOrSlug: string): Observable<FormConfig>;
34
+ /**
35
+ * Get public form by slug
36
+ */
37
+ getPublicForm(slug: string): Observable<FormConfig>;
38
+ /**
39
+ * List all forms
40
+ */
41
+ listForms(options?: PaginationOptions): Observable<FormListResponse>;
42
+ /**
43
+ * Create a new form
44
+ */
45
+ createForm(config: Omit<FormConfig, 'id'>): Observable<FormConfig>;
46
+ /**
47
+ * Update an existing form
48
+ */
49
+ updateForm(formId: string, config: Partial<FormConfig>): Observable<FormConfig>;
50
+ /**
51
+ * Delete a form
52
+ */
53
+ deleteForm(formId: string): Observable<void>;
54
+ /**
55
+ * Get form analytics
56
+ */
57
+ getAnalytics(formId: string): Observable<any>;
58
+ /**
59
+ * Publish a form
60
+ */
61
+ publishForm(formId: string, slug: string): Observable<{
62
+ publishedUrl: string;
63
+ slug: string;
64
+ }>;
65
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetiganFormsService, never>;
66
+ static ɵprov: i0.ɵɵInjectableDeclaration<MetiganFormsService>;
67
+ }
@@ -0,0 +1,46 @@
1
+ import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export interface HttpOptions {
5
+ headers?: HttpHeaders | {
6
+ [header: string]: string | string[];
7
+ };
8
+ params?: HttpParams | {
9
+ [param: string]: any;
10
+ };
11
+ timeout?: number;
12
+ }
13
+ export declare class MetiganHttpClient {
14
+ private http;
15
+ constructor(http: HttpClient);
16
+ /**
17
+ * Make GET request with retry logic
18
+ */
19
+ get<T>(url: string, options?: HttpOptions, retryCount?: number, retryDelay?: number): Observable<T>;
20
+ /**
21
+ * Make POST request with retry logic
22
+ */
23
+ post<T>(url: string, body: any, options?: HttpOptions, retryCount?: number, retryDelay?: number): Observable<T>;
24
+ /**
25
+ * Make PUT request with retry logic
26
+ */
27
+ put<T>(url: string, body: any, options?: HttpOptions, retryCount?: number, retryDelay?: number): Observable<T>;
28
+ /**
29
+ * Make DELETE request with retry logic
30
+ */
31
+ delete<T>(url: string, options?: HttpOptions, retryCount?: number, retryDelay?: number): Observable<T>;
32
+ /**
33
+ * Build HTTP options with timeout
34
+ */
35
+ private buildOptions;
36
+ /**
37
+ * Determine if error should trigger retry
38
+ */
39
+ private shouldRetry;
40
+ /**
41
+ * Handle HTTP errors
42
+ */
43
+ private handleError;
44
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetiganHttpClient, never>;
45
+ static ɵprov: i0.ɵɵInjectableDeclaration<MetiganHttpClient>;
46
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Metigan Angular Module
3
+ * Import this module in your Angular app to use Metigan services
4
+ */
5
+ import { ModuleWithProviders } from '@angular/core';
6
+ import { MetiganClientOptions } from './types';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common/http";
9
+ export declare class MetiganModule {
10
+ /**
11
+ * Configure Metigan with API key and options
12
+ * Call this in your root module's imports
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * imports: [
17
+ * MetiganModule.forRoot({
18
+ * apiKey: 'your-api-key'
19
+ * })
20
+ * ]
21
+ * ```
22
+ */
23
+ static forRoot(config: MetiganClientOptions): ModuleWithProviders<MetiganModule>;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetiganModule, never>;
25
+ static ɵmod: i0.ɵɵNgModuleDeclaration<MetiganModule, never, [typeof i1.HttpClientModule], never>;
26
+ static ɵinj: i0.ɵɵInjectorDeclaration<MetiganModule>;
27
+ }