@syndew/oluso-sdk 0.0.0-stage → 1.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +76 -0
- package/README.md +509 -2
- package/dist/auth/embed.global.js +210 -0
- package/dist/auth/embed.global.js.map +1 -0
- package/dist/auth/index.d.mts +535 -0
- package/dist/auth/index.d.ts +535 -0
- package/dist/auth/index.js +2118 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +2088 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/embed.global.js +448 -0
- package/dist/embed.global.js.map +1 -0
- package/dist/index.d.mts +810 -0
- package/dist/index.d.ts +810 -0
- package/dist/index.js +2127 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2095 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react.d.mts +559 -0
- package/dist/react.d.ts +559 -0
- package/dist/react.js +1674 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +1642 -0
- package/dist/react.mjs.map +1 -0
- package/package.json +72 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx","../src/client.ts","../src/journey/conditions.ts","../src/journey/styles.ts","../src/journey/webauthn.ts","../src/journey/render.ts"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type ReactNode,\n type FormEvent,\n} from 'react';\nimport { OlusoClient, OlusoError } from './client';\nimport { mountJourney, type JourneyLabels } from './journey/render';\nimport type {\n OlusoConfig,\n JourneyInfo,\n JourneyField,\n JourneySession,\n SubmissionResult,\n} from './types';\n\n// ============================================================================\n// Context & Provider\n// ============================================================================\n\ninterface OlusoContextValue {\n client: OlusoClient;\n}\n\nconst OlusoContext = createContext<OlusoContextValue | null>(null);\n\nexport interface OlusoProviderProps {\n config: OlusoConfig;\n children: ReactNode;\n}\n\n/**\n * Provider component for Oluso SDK\n *\n * @example\n * ```tsx\n * <OlusoProvider config={{ serverUrl: 'https://auth.yoursite.com', tenant: 'acme' }}>\n * <App />\n * </OlusoProvider>\n * ```\n */\nexport function OlusoProvider({ config, children }: OlusoProviderProps) {\n const client = useMemo(() => new OlusoClient(config), [config]);\n\n return (\n <OlusoContext.Provider value={{ client }}>\n {children}\n </OlusoContext.Provider>\n );\n}\n\n/**\n * Hook to access the Oluso client\n */\nexport function useOluso(): OlusoClient {\n const context = useContext(OlusoContext);\n if (!context) {\n throw new Error('useOluso must be used within an OlusoProvider');\n }\n return context.client;\n}\n\n// ============================================================================\n// useJourney Hook\n// ============================================================================\n\nexport interface UseJourneyOptions {\n /** The journey's slug (as in /journey/start/{slug}) */\n slug: string;\n /** Callback on successful submission */\n onSuccess?: (result: SubmissionResult) => void;\n /** Callback on error */\n onError?: (error: OlusoError) => void;\n /** Initial form values */\n defaultValues?: Record<string, unknown>;\n}\n\nexport interface UseJourneyResult {\n /** Journey metadata and field definitions */\n journey: JourneyInfo | null;\n /** Loading state for initial fetch */\n isLoading: boolean;\n /** Submitting state */\n isSubmitting: boolean;\n /** Error from fetch or submission */\n error: OlusoError | null;\n /** Current form values */\n values: Record<string, unknown>;\n /** Field-level errors */\n fieldErrors: Record<string, string>;\n /** Update a field value */\n setValue: (field: string, value: unknown) => void;\n /** Submit the form */\n submit: () => Promise<SubmissionResult | null>;\n /** Reset the form */\n reset: () => void;\n}\n\n/**\n * Hook for working with a journey (headless)\n *\n * @example\n * ```tsx\n * function WaitlistForm() {\n * const { journey, values, setValue, submit, isSubmitting, fieldErrors } = useJourney({\n * slug: 'waitlist',\n * onSuccess: () => alert('Thanks for signing up!'),\n * });\n *\n * if (!journey) return <div>Loading...</div>;\n *\n * return (\n * <form onSubmit={(e) => { e.preventDefault(); submit(); }}>\n * {journey.fields.map((field) => (\n * <div key={field.name}>\n * <label>{field.label}</label>\n * <input\n * type={field.type}\n * value={values[field.name] as string || ''}\n * onChange={(e) => setValue(field.name, e.target.value)}\n * />\n * {fieldErrors[field.name] && <span>{fieldErrors[field.name]}</span>}\n * </div>\n * ))}\n * <button type=\"submit\" disabled={isSubmitting}>\n * {isSubmitting ? 'Submitting...' : 'Submit'}\n * </button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useJourney(options: UseJourneyOptions): UseJourneyResult {\n const client = useOluso();\n const [journey, setJourney] = useState<JourneyInfo | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<OlusoError | null>(null);\n const [values, setValues] = useState<Record<string, unknown>>(options.defaultValues || {});\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n\n // Fetch journey on mount\n useEffect(() => {\n let cancelled = false;\n\n async function fetchJourney() {\n try {\n setIsLoading(true);\n setError(null);\n const data = await client.getJourney(options.slug);\n if (!cancelled) {\n setJourney(data);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof OlusoError ? err : new OlusoError(String(err), 0));\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n fetchJourney();\n\n return () => {\n cancelled = true;\n };\n }, [client, options.slug]);\n\n const setValue = useCallback((field: string, value: unknown) => {\n setValues((prev) => ({ ...prev, [field]: value }));\n // Clear field error when value changes\n setFieldErrors((prev) => {\n if (prev[field]) {\n const { [field]: _, ...rest } = prev;\n return rest;\n }\n return prev;\n });\n }, []);\n\n const submit = useCallback(async (): Promise<SubmissionResult | null> => {\n if (!journey) return null;\n\n try {\n setIsSubmitting(true);\n setError(null);\n setFieldErrors({});\n\n const result = await client.submit(options.slug, values);\n\n if (result.success) {\n options.onSuccess?.(result);\n }\n\n return result;\n } catch (err) {\n const olusError = err instanceof OlusoError ? err : new OlusoError(String(err), 0);\n setError(olusError);\n if (olusError.fieldErrors) {\n setFieldErrors(olusError.fieldErrors);\n }\n options.onError?.(olusError);\n return null;\n } finally {\n setIsSubmitting(false);\n }\n }, [client, journey, options, values]);\n\n const reset = useCallback(() => {\n setValues(options.defaultValues || {});\n setFieldErrors({});\n setError(null);\n }, [options.defaultValues]);\n\n return {\n journey,\n isLoading,\n isSubmitting,\n error,\n values,\n fieldErrors,\n setValue,\n submit,\n reset,\n };\n}\n\n// ============================================================================\n// Pre-built Form Components\n// ============================================================================\n\nexport interface JourneyFormProps {\n /** The journey's slug (as in /journey/start/{slug}) */\n slug: string;\n /** Callback on successful submission */\n onSuccess?: (result: SubmissionResult) => void;\n /** Callback on error */\n onError?: (error: OlusoError) => void;\n /** Custom class name */\n className?: string;\n /** Custom submit button text */\n submitText?: string;\n /** Custom loading text */\n loadingText?: string;\n /** Render custom field */\n renderField?: (field: JourneyField, props: FieldRenderProps) => ReactNode;\n /** Render custom submit button */\n renderSubmit?: (props: { isSubmitting: boolean; onClick: () => void }) => ReactNode;\n /** Show success message instead of form after submission */\n showSuccessMessage?: boolean;\n /** Custom success message component */\n renderSuccess?: (result: SubmissionResult) => ReactNode;\n}\n\nexport interface FieldRenderProps {\n value: unknown;\n onChange: (value: unknown) => void;\n error?: string;\n}\n\n/**\n * Pre-built form component that renders a journey form\n *\n * @example\n * ```tsx\n * <JourneyForm\n * slug=\"waitlist\"\n * onSuccess={() => console.log('Submitted!')}\n * submitText=\"Join Waitlist\"\n * />\n * ```\n */\nexport function JourneyForm({\n slug,\n onSuccess,\n onError,\n className,\n submitText = 'Submit',\n loadingText = 'Loading...',\n renderField,\n renderSubmit,\n showSuccessMessage = true,\n renderSuccess,\n}: JourneyFormProps) {\n const {\n journey,\n isLoading,\n isSubmitting,\n error,\n values,\n fieldErrors,\n setValue,\n submit,\n } = useJourney({ slug, onSuccess, onError });\n\n const [submitted, setSubmitted] = useState<SubmissionResult | null>(null);\n\n const handleSubmit = useCallback(async (e: FormEvent) => {\n e.preventDefault();\n const result = await submit();\n if (result?.success && showSuccessMessage) {\n setSubmitted(result);\n }\n }, [submit, showSuccessMessage]);\n\n if (isLoading) {\n return <div className={className}>{loadingText}</div>;\n }\n\n if (!journey) {\n return <div className={className}>Journey not found</div>;\n }\n\n if (submitted) {\n if (renderSuccess) {\n return <>{renderSuccess(submitted)}</>;\n }\n return (\n <div className={className}>\n <p>{submitted.message || 'Thank you for your submission!'}</p>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className={className}>\n {journey.fields.map((field) => {\n const fieldProps: FieldRenderProps = {\n value: values[field.name],\n onChange: (value) => setValue(field.name, value),\n error: fieldErrors[field.name],\n };\n\n if (renderField) {\n return <React.Fragment key={field.name}>{renderField(field, fieldProps)}</React.Fragment>;\n }\n\n return (\n <DefaultField key={field.name} field={field} {...fieldProps} />\n );\n })}\n\n {error && !error.fieldErrors && (\n <div style={{ color: 'red', marginBottom: '1rem' }}>\n {error.message}\n </div>\n )}\n\n {renderSubmit ? (\n renderSubmit({ isSubmitting, onClick: () => submit() })\n ) : (\n <button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? 'Submitting...' : submitText}\n </button>\n )}\n </form>\n );\n}\n\n// ============================================================================\n// Default Field Component\n// ============================================================================\n\ninterface DefaultFieldProps extends FieldRenderProps {\n field: JourneyField;\n}\n\nfunction DefaultField({ field, value, onChange, error }: DefaultFieldProps) {\n const id = `oluso-field-${field.name}`;\n\n const inputProps = {\n id,\n name: field.name,\n required: field.required,\n placeholder: field.placeholder,\n 'aria-describedby': field.description ? `${id}-desc` : undefined,\n 'aria-invalid': !!error,\n };\n\n let input: ReactNode;\n\n switch (field.type) {\n case 'textarea':\n input = (\n <textarea\n {...inputProps}\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n rows={4}\n />\n );\n break;\n\n case 'select':\n input = (\n <select\n {...inputProps}\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">Select...</option>\n {field.options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n break;\n\n case 'checkbox':\n input = (\n <input\n {...inputProps}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n );\n break;\n\n case 'radio':\n input = (\n <div role=\"radiogroup\">\n {field.options?.map((opt) => (\n <label key={opt.value}>\n <input\n type=\"radio\"\n name={field.name}\n value={opt.value}\n checked={value === opt.value}\n onChange={(e) => onChange(e.target.value)}\n />\n {opt.label}\n </label>\n ))}\n </div>\n );\n break;\n\n default:\n input = (\n <input\n {...inputProps}\n type={field.type}\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n minLength={field.validation?.minLength}\n maxLength={field.validation?.maxLength}\n pattern={field.validation?.pattern}\n min={field.validation?.min}\n max={field.validation?.max}\n />\n );\n }\n\n return (\n <div style={{ marginBottom: '1rem' }}>\n <label htmlFor={id} style={{ display: 'block', marginBottom: '0.25rem' }}>\n {field.label}\n {field.required && <span style={{ color: 'red' }}> *</span>}\n </label>\n {input}\n {field.description && (\n <small id={`${id}-desc`} style={{ display: 'block', color: '#666' }}>\n {field.description}\n </small>\n )}\n {error && (\n <small style={{ display: 'block', color: 'red' }}>\n {error}\n </small>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Journey Component (any journey, step by step)\n// ============================================================================\n\nexport interface JourneyProps {\n /** Start this journey by slug (a waitlist, a contact form, a survey, a sign-up) */\n slug?: string;\n /** Input for the first step */\n data?: Record<string, unknown>;\n /** Continue a session your backend started, e.g. for the signed-in user */\n session?: JourneySession;\n /** Start the session yourself, e.g. a sign-in journey with PKCE */\n start?: () => Promise<JourneySession>;\n onStep?: (session: JourneySession) => void;\n onComplete?: (session: JourneySession) => void | Promise<void>;\n onError?: (error: Error, session?: JourneySession) => void;\n onRedirect?: (url: string, session: JourneySession) => void;\n showCompletion?: boolean;\n theme?: 'light' | 'dark' | 'auto';\n unstyled?: boolean;\n labels?: Partial<JourneyLabels>;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Render any journey in place and run it step by step: forms with uploads, sign-in with MFA or passkeys,\n * verification codes, consent. Uses the client from OlusoProvider.\n *\n * @example\n * ```tsx\n * <Journey slug=\"contact-us\" onComplete={() => setSent(true)} />\n * ```\n */\nexport function Journey({ className, style, ...options }: JourneyProps) {\n const client = useOluso();\n const host = useRef<HTMLDivElement>(null);\n const latest = useRef(options);\n latest.current = options;\n\n useEffect(() => {\n if (!host.current) return;\n const mount = mountJourney(host.current, {\n client,\n slug: options.slug,\n data: options.data,\n session: options.session,\n start: options.start,\n showCompletion: options.showCompletion,\n theme: options.theme,\n unstyled: options.unstyled,\n labels: options.labels,\n onStep: (s) => latest.current.onStep?.(s),\n onComplete: (s) => latest.current.onComplete?.(s),\n onError: (e, s) => latest.current.onError?.(e, s),\n onRedirect: latest.current.onRedirect ? (url, s) => latest.current.onRedirect?.(url, s) : undefined,\n });\n return () => mount.destroy();\n // A new journey (slug or session) starts a new run; callbacks are read through the ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, options.slug, options.session?.sessionId]);\n\n return <div ref={host} className={className} style={style} />;\n}\n\n// ============================================================================\n// Iframe Embed Component\n// ============================================================================\n\nexport interface JourneyEmbedProps {\n /** The journey's slug (as in /journey/start/{slug}) */\n slug: string;\n /** Width of the iframe */\n width?: string | number;\n /** Height of the iframe */\n height?: string | number;\n /** Theme */\n theme?: 'light' | 'dark';\n /** Hide the header */\n hideHeader?: boolean;\n /** Custom class name */\n className?: string;\n /** Custom style */\n style?: React.CSSProperties;\n /** Callback when journey completes (via postMessage) */\n onComplete?: (result: SubmissionResult) => void;\n}\n\n/**\n * Embed a journey via iframe\n *\n * @example\n * ```tsx\n * <JourneyEmbed\n * slug=\"waitlist\"\n * height={400}\n * onComplete={(result) => console.log('Submitted!', result)}\n * />\n * ```\n */\nexport function JourneyEmbed({\n slug,\n width = '100%',\n height = 500,\n theme,\n hideHeader,\n className,\n style,\n onComplete,\n}: JourneyEmbedProps) {\n const client = useOluso();\n const src = client.getEmbedUrl(slug, { theme, hideHeader });\n\n useEffect(() => {\n if (!onComplete) return;\n\n const handleMessage = (event: MessageEvent) => {\n // Verify origin matches server URL\n if (!client.getJourneyUrl(slug).startsWith(event.origin)) {\n return;\n }\n\n if (event.data?.type === 'oluso:complete') {\n onComplete(event.data.result);\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [client, slug, onComplete]);\n\n return (\n <iframe\n src={src}\n width={width}\n height={height}\n className={className}\n style={{\n border: 'none',\n ...style,\n }}\n title={`Oluso Journey: ${slug}`}\n allow=\"clipboard-write; camera; microphone\"\n />\n );\n}\n","import type {\n OlusoConfig,\n JourneyInfo,\n SubmissionResult,\n JourneySession,\n StepResult,\n OlusoEvent,\n OlusoEventListener,\n OlusoEventType,\n} from './types';\n\n/**\n * Oluso SDK Client\n *\n * @example\n * ```typescript\n * const oluso = new OlusoClient({\n * serverUrl: 'https://auth.oluso.io',\n * tenant: 'acme',\n * });\n *\n * // Get journey info (form fields, etc.)\n * const journey = await oluso.getJourney('waitlist');\n *\n * // Submit data\n * const result = await oluso.submit('waitlist', {\n * email: 'user@example.com',\n * name: 'John Doe',\n * });\n * ```\n */\nexport class OlusoClient {\n private config: Required<Pick<OlusoConfig, 'serverUrl'>> & OlusoConfig;\n private fetchFn: typeof fetch;\n private listeners: Map<OlusoEventType | '*', Set<OlusoEventListener>> = new Map();\n\n constructor(config: OlusoConfig) {\n if (!config.serverUrl) {\n throw new Error('serverUrl is required');\n }\n\n this.config = {\n ...config,\n serverUrl: config.serverUrl.replace(/\\/$/, ''), // Remove trailing slash\n };\n this.fetchFn = config.fetch || globalThis.fetch.bind(globalThis);\n }\n\n /**\n * Get journey information including form fields. Journeys are named by slug.\n */\n async getJourney(slug: string): Promise<JourneyInfo> {\n const response = await this.request<JourneyInfo>(`/api/public/journeys/${encodeURIComponent(slug)}`);\n return response;\n }\n\n /**\n * Submit data to a data collection journey (waitlist, contact, survey, etc.)\n */\n async submit(\n slug: string,\n data: Record<string, unknown>,\n options?: {\n /** Client-side metadata */\n metadata?: Record<string, string>;\n /** Honeypot field for spam detection */\n honeypot?: string;\n }\n ): Promise<SubmissionResult> {\n try {\n const result = await this.request<SubmissionResult>(`/api/public/journeys/${encodeURIComponent(slug)}/submit`, {\n method: 'POST',\n body: {\n data,\n metadata: {\n ...options?.metadata,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n },\n honeypot: options?.honeypot,\n },\n });\n\n this.emit({\n type: 'submission:success',\n slug,\n data: result,\n });\n\n return result;\n } catch (error) {\n this.emit({\n type: 'submission:error',\n slug,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n throw error;\n }\n }\n\n /**\n * Start a multi-step journey and run its first step. Without data the session's `step`\n * is the first step to render; with data, that is the first step's input.\n */\n async startJourney(slug: string, data?: Record<string, unknown>): Promise<JourneySession> {\n const session = await this.request<JourneySession>(\n `/api/public/journeys/${encodeURIComponent(slug)}/start`,\n { method: 'POST', body: { data } }\n );\n\n this.emit({\n type: 'journey:started',\n slug: session.slug,\n sessionId: session.sessionId,\n data: session,\n });\n\n return session;\n }\n\n /**\n * Start a sign-in (or any authentication) journey for a public client. When the session completes it carries an\n * authorization code, redeemed at the token endpoint with the PKCE verifier and redirect_uri \"postmessage\". Use\n * this when your app keeps its own tokens; OlusoAuth.mountSignIn does the whole round trip for you.\n */\n async startAuthJourney(slug: string, auth: { clientId: string; codeChallenge: string; scope?: string }, data?: Record<string, unknown>): Promise<JourneySession> {\n const session = await this.request<JourneySession>(\n `/api/public/journeys/${encodeURIComponent(slug)}/start`,\n {\n method: 'POST',\n body: { data, clientId: auth.clientId, codeChallenge: auth.codeChallenge, codeChallengeMethod: 'S256', scope: auth.scope },\n }\n );\n\n this.emit({ type: 'journey:started', slug: session.slug, sessionId: session.sessionId, data: session });\n return session;\n }\n\n /**\n * Submit input (or an action such as \"resend\") for the session's current step.\n * The result is the session afterwards: the next step to render, or the completion.\n */\n async submitStep(\n sessionId: string,\n data?: Record<string, unknown>,\n action?: string\n ): Promise<StepResult> {\n const result = await this.request<StepResult>(\n `/api/public/journeys/sessions/${encodeURIComponent(sessionId)}/step`,\n { method: 'POST', body: { data, action } }\n );\n\n this.emit({\n type: result.completed ? 'journey:completed' : result.success ? 'journey:step' : 'journey:error',\n slug: result.slug,\n sessionId,\n data: result,\n });\n\n return result;\n }\n\n /**\n * Submit the current step the way a form posts it: every field, files under their field's name, and the\n * clicked button's name and value. Use this for steps with file fields; `action` is a step action such as \"init\".\n */\n async submitStepForm(sessionId: string, form: FormData, action?: string): Promise<StepResult> {\n if (action) form.set('__journey_action', action);\n const result = await this.request<StepResult>(\n `/api/public/journeys/sessions/${encodeURIComponent(sessionId)}/step`,\n { method: 'POST', body: form }\n );\n\n this.emit({\n type: result.completed ? 'journey:completed' : result.success ? 'journey:step' : 'journey:error',\n slug: result.slug,\n sessionId,\n data: result,\n });\n\n return result;\n }\n\n /** The server this client talks to */\n get serverUrl(): string {\n return this.config.serverUrl;\n }\n\n /**\n * Get where a multi-step session stands (status, current step), without running it\n */\n async getSession(sessionId: string): Promise<JourneySession> {\n return this.request<JourneySession>(`/api/public/journeys/sessions/${encodeURIComponent(sessionId)}`);\n }\n\n /**\n * URL of the hosted journey page (/journey/start/{slug}) to redirect to\n */\n getJourneyUrl(slug: string, options?: {\n redirectUri?: string;\n state?: string;\n }): string {\n const params = new URLSearchParams();\n if (this.config.tenant) params.set('tenant', this.config.tenant);\n\n if (options?.redirectUri) {\n params.set('redirect_uri', options.redirectUri);\n }\n if (options?.state) {\n params.set('state', options.state);\n }\n\n return `${this.config.serverUrl}/journey/start/${encodeURIComponent(slug)}?${params}`;\n }\n\n /**\n * URL of the hosted journey page (/journey/start/{slug}) for an iframe\n */\n getEmbedUrl(slug: string, options?: {\n theme?: 'light' | 'dark';\n hideHeader?: boolean;\n }): string {\n const params = new URLSearchParams({ embed: 'true' });\n if (this.config.tenant) params.set('tenant', this.config.tenant);\n\n if (options?.theme) {\n params.set('theme', options.theme);\n }\n if (options?.hideHeader) {\n params.set('hideHeader', 'true');\n }\n\n return `${this.config.serverUrl}/journey/start/${encodeURIComponent(slug)}?${params}`;\n }\n\n /**\n * Subscribe to SDK events\n */\n on(event: OlusoEventType | '*', listener: OlusoEventListener): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n\n // Return unsubscribe function\n return () => {\n this.listeners.get(event)?.delete(listener);\n };\n }\n\n /**\n * Unsubscribe from SDK events\n */\n off(event: OlusoEventType | '*', listener: OlusoEventListener): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n private emit(event: OlusoEvent): void {\n // Emit to specific listeners\n this.listeners.get(event.type)?.forEach((listener) => listener(event));\n // Emit to wildcard listeners\n this.listeners.get('*')?.forEach((listener) => listener(event));\n }\n\n private async request<T>(\n path: string,\n options?: {\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE';\n body?: unknown;\n }\n ): Promise<T> {\n const url = `${this.config.serverUrl}${path}`;\n const method = options?.method || 'GET';\n const isForm = typeof FormData !== 'undefined' && options?.body instanceof FormData;\n const headers: Record<string, string> = {};\n if (this.config.tenant) {\n headers['X-Tenant-ID'] = this.config.tenant;\n }\n // A form sets its own multipart boundary.\n if (!isForm) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (this.config.apiKey) {\n headers['X-API-Key'] = this.config.apiKey;\n }\n\n if (this.config.headers) {\n Object.assign(headers, await this.config.headers({ method, url }));\n }\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: options?.body === undefined ? undefined : isForm ? (options.body as FormData) : JSON.stringify(options.body),\n credentials: 'include', // Include cookies for session management\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }));\n throw new OlusoError(\n error.message || `Request failed: ${response.status}`,\n response.status,\n error.code,\n error.errors\n );\n }\n\n return response.json();\n }\n}\n\n/**\n * Custom error class for SDK errors\n */\nexport class OlusoError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code?: string,\n public readonly fieldErrors?: Record<string, string>\n ) {\n super(message);\n this.name = 'OlusoError';\n }\n}\n","import type { JourneyFormCondition } from '../types';\n\nconst ALIASES: Record<string, string> = {\n eq: 'eq', equals: 'eq', '==': 'eq', '=': 'eq',\n ne: 'ne', neq: 'ne', notequals: 'ne', '!=': 'ne',\n gt: 'gt', '>': 'gt', greaterthan: 'gt',\n gte: 'gte', '>=': 'gte', greaterthanorequals: 'gte',\n lt: 'lt', '<': 'lt', lessthan: 'lt',\n lte: 'lte', '<=': 'lte', lessthanorequals: 'lte',\n contains: 'contains', notcontains: 'not_contains', '!contains': 'not_contains',\n startswith: 'starts_with', endswith: 'ends_with',\n exists: 'exists', notnull: 'exists', isset: 'exists',\n notexists: 'not_exists', null: 'not_exists', isnotset: 'not_exists',\n empty: 'empty', notempty: 'not_empty',\n in: 'in', notin: 'not_in', '!in': 'not_in',\n regex: 'regex', matches: 'regex',\n true: 'true', false: 'false',\n};\n\n/** The canonical operator, as the server names it; undefined for one no condition supports. */\nexport function normalizeOperator(op: string | undefined): string | undefined {\n if (!op) return undefined;\n return ALIASES[op.trim().toLowerCase().replace(/_/g, '')];\n}\n\nconst same = (a: string, b: string) => a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;\n\nfunction order(actual: string, expected: string | undefined): number | undefined {\n if (expected === undefined) return undefined;\n const a = Number(actual);\n const e = Number(expected);\n if (actual.trim() !== '' && expected.trim() !== '' && !Number.isNaN(a) && !Number.isNaN(e)) return a === e ? 0 : a < e ? -1 : 1;\n const ad = Date.parse(actual);\n const ed = Date.parse(expected);\n if (!Number.isNaN(ad) && !Number.isNaN(ed)) return ad === ed ? 0 : ad < ed ? -1 : 1;\n return actual.localeCompare(expected, undefined, { sensitivity: 'accent' });\n}\n\nfunction compare(actual: string, op: string, expected: string | undefined): boolean {\n const lower = actual.toLowerCase();\n const want = (expected ?? '').toLowerCase();\n switch (op) {\n case 'eq': return same(actual, expected ?? '');\n case 'ne': return !same(actual, expected ?? '');\n case 'gt': { const o = order(actual, expected); return o !== undefined && o > 0; }\n case 'gte': { const o = order(actual, expected); return o !== undefined && o >= 0; }\n case 'lt': { const o = order(actual, expected); return o !== undefined && o < 0; }\n case 'lte': { const o = order(actual, expected); return o !== undefined && o <= 0; }\n case 'contains': return lower.includes(want);\n case 'not_contains': return !lower.includes(want);\n case 'starts_with': return lower.startsWith(want);\n case 'ends_with': return lower.endsWith(want);\n case 'regex':\n if (!expected) return false;\n try { return new RegExp(expected, 'i').test(actual); } catch { return false; }\n default: return false;\n }\n}\n\nfunction expectedList(expected: string | undefined): string[] {\n if (!expected || !expected.trim()) return [];\n const trimmed = expected.trim();\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String);\n } catch {\n return [];\n }\n }\n return trimmed.split(',').map((v) => v.trim()).filter(Boolean);\n}\n\nconst truthy = (v: string) => v.toLowerCase() !== 'false' && v !== '0';\n\n/**\n * Whether a field's current values meet a showWhen condition, with the server's semantics: positive operators pass\n * when any value matches, negative ones when none does.\n */\nexport function conditionMet(condition: JourneyFormCondition, values: string[]): boolean {\n const op = normalizeOperator(condition.operator);\n const present = values.filter((v) => v !== '');\n const members = () => present.flatMap((v) => v.split(',').map((p) => p.trim()).filter(Boolean));\n switch (op) {\n case 'exists':\n case 'not_empty': return present.length > 0;\n case 'not_exists':\n case 'empty': return present.length === 0;\n case 'ne': return !present.some((v) => compare(v, 'eq', condition.value));\n case 'not_contains': return !present.some((v) => compare(v, 'contains', condition.value));\n case 'in': { const list = expectedList(condition.value); return members().some((m) => list.some((e) => same(m, e))); }\n case 'not_in': { const list = expectedList(condition.value); return !members().some((m) => list.some((e) => same(m, e))); }\n case 'true': return present.some(truthy);\n case 'false': return !present.some(truthy);\n case undefined: return false;\n default: return present.some((v) => compare(v, op, condition.value));\n }\n}\n","/** Default look for rendered journeys. Override the custom properties on `.oluso-journey`, or pass `unstyled`. */\nexport const JOURNEY_STYLES = `\n.oluso-journey {\n --oluso-accent: #4f46e5;\n --oluso-accent-contrast: #ffffff;\n --oluso-fg: #111827;\n --oluso-muted: #6b7280;\n --oluso-bg: #ffffff;\n --oluso-field-bg: #ffffff;\n --oluso-border: #d1d5db;\n --oluso-danger: #b91c1c;\n --oluso-danger-bg: #fef2f2;\n --oluso-notice-bg: #eff6ff;\n --oluso-notice: #1d4ed8;\n --oluso-radius: 8px;\n --oluso-gap: 14px;\n --oluso-font: inherit;\n font-family: var(--oluso-font);\n color: var(--oluso-fg);\n font-size: 15px;\n line-height: 1.5;\n}\n.oluso-journey[data-theme=\"dark\"] {\n --oluso-fg: #f3f4f6;\n --oluso-muted: #9ca3af;\n --oluso-bg: #111827;\n --oluso-field-bg: #1f2937;\n --oluso-border: #374151;\n --oluso-danger: #fca5a5;\n --oluso-danger-bg: rgba(185, 28, 28, 0.15);\n --oluso-notice-bg: rgba(59, 130, 246, 0.15);\n --oluso-notice: #93c5fd;\n}\n@media (prefers-color-scheme: dark) {\n .oluso-journey[data-theme=\"auto\"] {\n --oluso-fg: #f3f4f6;\n --oluso-muted: #9ca3af;\n --oluso-bg: #111827;\n --oluso-field-bg: #1f2937;\n --oluso-border: #374151;\n --oluso-danger: #fca5a5;\n --oluso-danger-bg: rgba(185, 28, 28, 0.15);\n --oluso-notice-bg: rgba(59, 130, 246, 0.15);\n --oluso-notice: #93c5fd;\n }\n}\n.oluso-journey *, .oluso-journey *::before, .oluso-journey *::after { box-sizing: border-box; }\n.oluso-journey__form { display: flex; flex-direction: column; gap: var(--oluso-gap); margin: 0; }\n.oluso-journey__title { font-size: 1.25em; font-weight: 600; margin: 0; }\n.oluso-journey__description { color: var(--oluso-muted); margin: 0; white-space: pre-line; }\n.oluso-journey__alert { border-radius: var(--oluso-radius); padding: 10px 12px; margin: 0; }\n.oluso-journey__alert--error { background: var(--oluso-danger-bg); color: var(--oluso-danger); }\n.oluso-journey__alert--notice { background: var(--oluso-notice-bg); color: var(--oluso-notice); }\n.oluso-journey__group { display: flex; flex-direction: column; gap: var(--oluso-gap); border: 0; margin: 0; padding: 0; }\n.oluso-journey__field { display: flex; flex-direction: column; gap: 6px; }\n.oluso-journey__field[hidden] { display: none; }\n.oluso-journey__label { font-weight: 500; }\n.oluso-journey__required { color: var(--oluso-danger); margin-left: 2px; }\n.oluso-journey__input, .oluso-journey__select, .oluso-journey__textarea {\n width: 100%; font: inherit; color: var(--oluso-fg); background: var(--oluso-field-bg);\n border: 1px solid var(--oluso-border); border-radius: var(--oluso-radius); padding: 9px 11px; min-height: 40px;\n}\n.oluso-journey__input:focus, .oluso-journey__select:focus, .oluso-journey__textarea:focus {\n outline: 2px solid var(--oluso-accent); outline-offset: 1px; border-color: transparent;\n}\n.oluso-journey__input[aria-invalid=\"true\"], .oluso-journey__select[aria-invalid=\"true\"], .oluso-journey__textarea[aria-invalid=\"true\"] {\n border-color: var(--oluso-danger);\n}\n.oluso-journey__input--otp { letter-spacing: 0.4em; font-variant-numeric: tabular-nums; text-align: center; font-size: 1.2em; }\n.oluso-journey__phone { display: flex; gap: 8px; }\n.oluso-journey__phone .oluso-journey__select { width: auto; max-width: 45%; }\n.oluso-journey__choices { display: flex; flex-direction: column; gap: 8px; }\n.oluso-journey__choice { display: flex; gap: 10px; align-items: flex-start; cursor: pointer; }\n.oluso-journey__choice input { margin-top: 3px; accent-color: var(--oluso-accent); }\n.oluso-journey__choice-description { display: block; color: var(--oluso-muted); font-size: 0.9em; }\n.oluso-journey__help, .oluso-journey__hint { color: var(--oluso-muted); font-size: 0.875em; margin: 0; }\n.oluso-journey__error { color: var(--oluso-danger); font-size: 0.875em; margin: 0; }\n.oluso-journey__content { margin: 0; white-space: pre-line; }\n.oluso-journey__actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }\n.oluso-journey__button {\n font: inherit; font-weight: 500; border-radius: var(--oluso-radius); padding: 9px 16px; min-height: 40px; cursor: pointer;\n border: 1px solid var(--oluso-border); background: var(--oluso-field-bg); color: var(--oluso-fg);\n}\n.oluso-journey__button--primary { background: var(--oluso-accent); color: var(--oluso-accent-contrast); border-color: var(--oluso-accent); }\n.oluso-journey__button--primary:only-child, .oluso-journey__actions--stacked .oluso-journey__button--primary { flex: 1 1 auto; }\n.oluso-journey__button--link { background: none; border: 0; color: var(--oluso-accent); padding: 4px 0; min-height: 0; }\n.oluso-journey__button--cancel { background: none; }\n.oluso-journey__button:disabled { opacity: 0.6; cursor: progress; }\n.oluso-journey__enter { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }\n.oluso-journey__action-line { display: flex; flex-wrap: wrap; gap: 6px; align-items: baseline; margin: 0; }\n.oluso-journey__links { display: flex; flex-wrap: wrap; gap: 12px; font-size: 0.9em; }\n.oluso-journey__links a { color: var(--oluso-accent); }\n.oluso-journey__qr { display: flex; flex-direction: column; align-items: center; gap: 8px; }\n.oluso-journey__qr img { width: 180px; height: 180px; background: #fff; padding: 8px; border-radius: var(--oluso-radius); }\n.oluso-journey__code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; word-break: break-all; }\n.oluso-journey__codes { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; margin: 0; padding: 0; list-style: none; }\n.oluso-journey__codes li { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; padding: 6px 8px; border: 1px solid var(--oluso-border); border-radius: 6px; text-align: center; }\n.oluso-journey__status { color: var(--oluso-muted); text-align: center; padding: 16px 0; }\n.oluso-journey__done { text-align: center; padding: 8px 0; }\n`;\n\nlet injected = false;\n\nexport function injectJourneyStyles(): void {\n if (injected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.setAttribute('data-oluso-journey', '');\n style.textContent = JOURNEY_STYLES;\n document.head.appendChild(style);\n injected = true;\n}\n","/** WebAuthn for journey steps: options arrive and results leave as base64url, the way the server reads them. */\n\nexport function base64UrlToBuffer(value: string): ArrayBuffer {\n const base64 = value.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes.buffer;\n}\n\nexport function bufferToBase64Url(buffer: ArrayBuffer | null | undefined): string | null {\n if (!buffer) return null;\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\ntype Json = Record<string, unknown>;\n\nfunction credentialDescriptors(list: unknown): PublicKeyCredentialDescriptor[] | undefined {\n if (!Array.isArray(list)) return undefined;\n return list.map((c: Json) => ({\n type: (c.type as PublicKeyCredentialType) ?? 'public-key',\n id: base64UrlToBuffer(String(c.id)),\n transports: c.transports as AuthenticatorTransport[] | undefined,\n }));\n}\n\nexport function requestOptions(publicKey: Json): PublicKeyCredentialRequestOptions {\n return {\n ...(publicKey as object),\n challenge: base64UrlToBuffer(String(publicKey.challenge)),\n allowCredentials: credentialDescriptors(publicKey.allowCredentials),\n } as PublicKeyCredentialRequestOptions;\n}\n\nexport function creationOptions(publicKey: Json): PublicKeyCredentialCreationOptions {\n const user = (publicKey.user ?? {}) as Json;\n return {\n ...(publicKey as object),\n challenge: base64UrlToBuffer(String(publicKey.challenge)),\n user: { ...(user as object), id: base64UrlToBuffer(String(user.id)) },\n excludeCredentials: credentialDescriptors(publicKey.excludeCredentials),\n } as PublicKeyCredentialCreationOptions;\n}\n\n/** A passkey sign-in, as the JSON the server reads. */\nexport async function getAssertion(publicKey: Json): Promise<string> {\n const credential = (await navigator.credentials.get({ publicKey: requestOptions(publicKey) })) as PublicKeyCredential | null;\n if (!credential) throw new Error('No passkey was chosen');\n const response = credential.response as AuthenticatorAssertionResponse;\n return JSON.stringify({\n id: credential.id,\n rawId: bufferToBase64Url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: bufferToBase64Url(response.clientDataJSON),\n authenticatorData: bufferToBase64Url(response.authenticatorData),\n signature: bufferToBase64Url(response.signature),\n userHandle: bufferToBase64Url(response.userHandle),\n },\n authenticatorAttachment: credential.authenticatorAttachment ?? null,\n });\n}\n\n/** A new passkey, as the JSON the server reads. */\nexport async function createCredential(publicKey: Json): Promise<string> {\n const credential = (await navigator.credentials.create({ publicKey: creationOptions(publicKey) })) as PublicKeyCredential | null;\n if (!credential) throw new Error('No passkey was created');\n const response = credential.response as AuthenticatorAttestationResponse;\n return JSON.stringify({\n id: credential.id,\n rawId: bufferToBase64Url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: bufferToBase64Url(response.clientDataJSON),\n attestationObject: bufferToBase64Url(response.attestationObject),\n transports: typeof response.getTransports === 'function' ? response.getTransports() : undefined,\n },\n authenticatorAttachment: credential.authenticatorAttachment ?? null,\n });\n}\n","import type { OlusoClient } from '../client';\nimport type {\n JourneyFormAction,\n JourneyFormField,\n JourneyFormWidget,\n JourneySession,\n JourneyStepForm,\n} from '../types';\nimport { conditionMet } from './conditions';\nimport { injectJourneyStyles } from './styles';\nimport { createCredential, getAssertion } from './webauthn';\n\n/** Text the renderer shows itself; everything about a step comes from the server in the person's language. */\nexport interface JourneyLabels {\n loading: string;\n completed: string;\n failed: string;\n expired: string;\n restart: string;\n takePhoto: string;\n copy: string;\n copied: string;\n passkey: string;\n retry: string;\n waiting: string;\n unavailable: string;\n}\n\nconst DEFAULT_LABELS: JourneyLabels = {\n loading: 'Loading…',\n completed: 'All done. Thank you.',\n failed: 'Something went wrong. Please try again.',\n expired: 'This session has expired. Please start again.',\n restart: 'Start again',\n takePhoto: 'Take a photo',\n copy: 'Copy',\n copied: 'Copied',\n passkey: 'Use your passkey',\n retry: 'Try again',\n waiting: 'Waiting…',\n unavailable: 'This step can’t be shown here.',\n};\n\nexport interface MountJourneyOptions {\n client: OlusoClient;\n /** Start this journey (a waitlist, a contact form, a survey, a sign-up). */\n slug?: string;\n /** Input for the first step. */\n data?: Record<string, unknown>;\n /** Continue a session started elsewhere, e.g. one your backend started for the signed-in user. */\n session?: JourneySession;\n /** Start the session yourself, e.g. a sign-in journey with PKCE. */\n start?: () => Promise<JourneySession>;\n /** After every step the server returns. */\n onStep?: (session: JourneySession) => void;\n /** When the journey completes. */\n onComplete?: (session: JourneySession) => void | Promise<void>;\n /** When the journey fails, expires or a request fails. */\n onError?: (error: Error, session?: JourneySession) => void;\n /** When a step continues elsewhere (an external identity provider, a checkout). Defaults to navigating there. */\n onRedirect?: (url: string, session: JourneySession) => void;\n /** Show the completion message when done (default true). */\n showCompletion?: boolean;\n theme?: 'light' | 'dark' | 'auto';\n /** Skip the default styles; style `.oluso-journey__*` yourself. */\n unstyled?: boolean;\n labels?: Partial<JourneyLabels>;\n}\n\nexport interface JourneyMount {\n /** The session as it stands. */\n readonly session: JourneySession | undefined;\n /** Start again from the first step (only for journeys started by slug or `start`). */\n restart(): Promise<void>;\n destroy(): void;\n}\n\ntype Element = HTMLElement;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, className?: string, text?: string): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (className) node.className = className;\n if (text !== undefined) node.textContent = text;\n return node;\n}\n\nlet uid = 0;\n\n/**\n * Renders any journey into `container` and runs it step by step: forms, sign-in, verification codes, passkeys,\n * captcha, consent, file uploads. Steps the server describes are drawn natively; a step that only has hosted markup\n * is shown as that markup.\n */\nexport function mountJourney(container: Element, options: MountJourneyOptions): JourneyMount {\n const labels: JourneyLabels = { ...DEFAULT_LABELS, ...options.labels };\n const client = options.client;\n const id = `oluso-j${++uid}`;\n let session: JourneySession | undefined;\n let destroyed = false;\n let timers: number[] = [];\n\n if (!options.unstyled) injectJourneyStyles();\n const root = el('div', 'oluso-journey');\n root.setAttribute('data-theme', options.theme ?? 'auto');\n container.appendChild(root);\n\n const clearTimers = () => {\n timers.forEach((t) => window.clearInterval(t));\n timers = [];\n };\n\n const status = (text: string) => {\n root.replaceChildren(el('p', 'oluso-journey__status', text));\n };\n\n const fail = (error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n options.onError?.(err, session);\n return err;\n };\n\n const canRestart = () => Boolean(options.slug || options.start);\n\n const begin = async () => {\n clearTimers();\n status(labels.loading);\n try {\n const started = options.start\n ? await options.start()\n : options.slug\n ? await client.startJourney(options.slug, options.data)\n : options.session;\n if (!started) throw new Error('mountJourney needs a slug, a session or a start function');\n await show(started);\n } catch (error) {\n showProblem(fail(error).message);\n }\n };\n\n const show = async (next: JourneySession) => {\n if (destroyed) return;\n clearTimers();\n session = next;\n options.onStep?.(next);\n\n if (next.completed) {\n if (next.redirectUrl) {\n await options.onComplete?.(next);\n redirect(next.redirectUrl, next);\n return;\n }\n if (options.showCompletion !== false) {\n const done = el('div', 'oluso-journey__done');\n done.appendChild(el('p', 'oluso-journey__content', next.message || labels.completed));\n root.replaceChildren(done);\n } else {\n root.replaceChildren();\n }\n await options.onComplete?.(next);\n return;\n }\n\n if (next.status !== 'in_progress') {\n const message = next.status === 'expired' ? labels.expired : next.errorDescription || labels.failed;\n fail(new Error(message));\n showProblem(message);\n return;\n }\n\n if (next.redirectUrl) {\n redirect(next.redirectUrl, next);\n return;\n }\n\n if (next.step?.form) {\n renderForm(next.step.form);\n } else if (next.step?.html) {\n renderHtml(next.step.html);\n } else {\n showProblem(labels.unavailable);\n }\n };\n\n const redirect = (url: string, current: JourneySession) => {\n if (options.onRedirect) options.onRedirect(url, current);\n else window.location.assign(url);\n };\n\n const showProblem = (message: string) => {\n const box = el('div', 'oluso-journey__form');\n box.appendChild(el('p', 'oluso-journey__alert oluso-journey__alert--error', message));\n if (canRestart()) {\n const again = el('button', 'oluso-journey__button oluso-journey__button--primary', labels.restart);\n again.type = 'button';\n again.addEventListener('click', () => void begin());\n const row = el('div', 'oluso-journey__actions');\n row.appendChild(again);\n box.appendChild(row);\n }\n root.replaceChildren(box);\n };\n\n const post = async (form: FormData, action?: string) => {\n if (!session) return;\n const next = await client.submitStepForm(session.sessionId, form, action);\n await show(next);\n };\n\n const submitting = (form: HTMLFormElement, busy: boolean) => {\n form.setAttribute('aria-busy', String(busy));\n form.querySelectorAll('button').forEach((b) => ((b as HTMLButtonElement).disabled = busy));\n };\n\n const send = async (form: HTMLFormElement, action: JourneyFormAction | undefined, extra?: Record<string, string>) => {\n const data = action?.postsFields === false ? new FormData() : new FormData(form);\n if (action?.name) data.append(action.name, action.value ?? '');\n if (action?.values) for (const [k, v] of Object.entries(action.values)) data.append(k, v);\n if (extra) for (const [k, v] of Object.entries(extra)) data.set(k, v);\n submitting(form, true);\n try {\n await post(data);\n } catch (error) {\n submitting(form, false);\n const message = fail(error).message;\n let alert = form.querySelector<HTMLElement>('[data-oluso-request-error]');\n if (!alert) {\n alert = el('p', 'oluso-journey__alert oluso-journey__alert--error');\n alert.setAttribute('data-oluso-request-error', '');\n alert.setAttribute('role', 'alert');\n form.prepend(alert);\n }\n alert.textContent = message;\n }\n };\n\n const renderForm = (step: JourneyStepForm) => {\n const form = el('form', 'oluso-journey__form');\n\n if (step.title) form.appendChild(el('h2', 'oluso-journey__title', step.title));\n if (step.description) form.appendChild(el('p', 'oluso-journey__description', step.description));\n if (step.error) {\n const alert = el('p', 'oluso-journey__alert oluso-journey__alert--error', step.error);\n alert.setAttribute('role', 'alert');\n form.appendChild(alert);\n }\n if (step.notice) {\n const notice = el('p', 'oluso-journey__alert oluso-journey__alert--notice', step.notice);\n notice.setAttribute('role', 'status');\n form.appendChild(notice);\n }\n\n const wrappers: Array<{ field: JourneyFormField; wrapper: Element }> = [];\n for (const field of step.fields) {\n const rendered = renderField(field);\n if (!rendered) continue;\n form.appendChild(rendered);\n if (field.showWhen || field.showWhenAll?.length) wrappers.push({ field, wrapper: rendered });\n }\n\n if (step.widget) {\n const widget = renderWidget(step.widget, form);\n if (widget) form.appendChild(widget);\n }\n\n if (step.links.length > 0) {\n const links = el('div', 'oluso-journey__links');\n for (const link of step.links) {\n const a = el('a', undefined, link.label);\n a.href = link.url;\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n links.appendChild(a);\n }\n form.appendChild(links);\n }\n\n if (step.actions.length > 0) {\n const row = el('div', 'oluso-journey__actions');\n // Enter submits the first submit button in the form, so the primary action goes first, out of sight.\n const primary = step.actions.findIndex((a) => a.kind === 'primary');\n if (primary >= 0) {\n const enter = el('button', 'oluso-journey__enter');\n enter.type = 'submit';\n enter.tabIndex = -1;\n enter.setAttribute('aria-hidden', 'true');\n enter.dataset.olusoAction = String(primary);\n form.prepend(enter);\n }\n const described: Element[] = [];\n step.actions.forEach((action, index) => {\n const button = el('button', `oluso-journey__button oluso-journey__button--${action.kind}`, action.label);\n button.type = 'submit';\n button.formNoValidate = action.skipValidation || action.postsFields === false;\n button.dataset.olusoAction = String(index);\n if (action.description) {\n // A described button (a resend link with its prompt, a method with its explanation) gets a line of its own.\n const line = el('p', 'oluso-journey__action-line');\n line.appendChild(el('span', 'oluso-journey__help', action.description));\n line.appendChild(button);\n described.push(line);\n } else {\n row.appendChild(button);\n }\n });\n if (row.childElementCount > 0) form.appendChild(row);\n described.forEach((line) => form.appendChild(line));\n }\n\n const applyConditions = () => {\n for (const { field, wrapper } of wrappers) {\n const conditions = [...(field.showWhen ? [field.showWhen] : []), ...(field.showWhenAll ?? [])];\n const shown = conditions.every((c) => conditionMet(c, currentValues(form.elements.namedItem(c.field))));\n wrapper.hidden = !shown;\n wrapper.querySelectorAll('input, select, textarea').forEach((input) => {\n (input as HTMLInputElement).disabled = !shown || (input as HTMLElement).dataset.olusoReadonly === 'true';\n });\n }\n };\n form.addEventListener('input', (event) => {\n applyConditions();\n const target = event.target as HTMLElement;\n const wrapper = target.closest('.oluso-journey__field');\n wrapper?.querySelectorAll('[aria-invalid=\"true\"]').forEach((n) => n.removeAttribute('aria-invalid'));\n wrapper?.querySelector('.oluso-journey__error')?.remove();\n });\n form.addEventListener('change', applyConditions);\n applyConditions();\n\n form.addEventListener('submit', (event) => {\n event.preventDefault();\n const submitter = (event as SubmitEvent).submitter as HTMLButtonElement | null;\n const index = submitter?.dataset.olusoAction;\n const action = index !== undefined ? step.actions[Number(index)] : step.actions.find((a) => a.kind === 'primary');\n if (action?.confirm && submitter && submitter.dataset.olusoConfirming !== 'true') {\n // Ask inline: the question replaces the button's label until it is clicked again.\n submitter.dataset.olusoConfirming = 'true';\n submitter.textContent = action.confirm;\n submitter.setAttribute('aria-live', 'polite');\n return;\n }\n void send(form, action);\n });\n\n root.replaceChildren(form);\n const focus = form.querySelector<HTMLElement>('[autofocus]')\n ?? form.querySelector<HTMLElement>('input:not([type=hidden]):not([disabled]), select, textarea');\n focus?.focus({ preventScroll: true });\n };\n\n const renderField = (field: JourneyFormField): Element | null => {\n const fieldId = `${id}-${field.name}`;\n\n if (field.type === 'hidden') {\n const input = el('input');\n input.type = 'hidden';\n input.name = field.name;\n input.value = field.value ?? '';\n return input;\n }\n\n const wrapper = el('div', 'oluso-journey__field');\n if (field.group) wrapper.dataset.group = field.group;\n\n if (field.type === 'content') {\n if (field.label) wrapper.appendChild(el('p', 'oluso-journey__label', field.label));\n wrapper.appendChild(el('p', 'oluso-journey__content', field.value ?? ''));\n return wrapper;\n }\n\n const label = () => {\n if (!field.label) return;\n const l = el('label', 'oluso-journey__label', field.label);\n l.htmlFor = fieldId;\n if (field.required) {\n const marker = el('span', 'oluso-journey__required', '*');\n marker.setAttribute('aria-hidden', 'true');\n l.appendChild(marker);\n }\n wrapper.appendChild(l);\n };\n\n const describedBy: string[] = [];\n const common = (input: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) => {\n input.id = fieldId;\n input.name = field.name;\n input.required = field.required;\n if (field.readOnly) {\n if (input instanceof HTMLSelectElement) input.disabled = true;\n else input.readOnly = true;\n input.dataset.olusoReadonly = String(input instanceof HTMLSelectElement);\n }\n if (field.autofocus) input.autofocus = true;\n if (field.autocomplete) input.setAttribute('autocomplete', field.autocomplete);\n if (field.error) input.setAttribute('aria-invalid', 'true');\n };\n\n switch (field.type) {\n case 'textarea': {\n label();\n const input = el('textarea', 'oluso-journey__textarea');\n common(input);\n input.value = field.value ?? '';\n if (field.placeholder) input.placeholder = field.placeholder;\n if (field.rows) input.rows = field.rows;\n if (field.minLength) input.minLength = field.minLength;\n if (field.maxLength) input.maxLength = field.maxLength;\n wrapper.appendChild(input);\n break;\n }\n case 'select': {\n label();\n const input = el('select', 'oluso-journey__select');\n common(input);\n const blank = el('option', undefined, field.placeholder ?? '');\n blank.value = '';\n input.appendChild(blank);\n for (const option of field.options ?? []) {\n const o = el('option', undefined, option.label);\n o.value = option.value;\n o.disabled = option.disabled;\n o.selected = option.value === field.value;\n input.appendChild(o);\n }\n wrapper.appendChild(input);\n break;\n }\n case 'radio': {\n const group = el('fieldset', 'oluso-journey__group');\n if (field.label) {\n const legend = el('legend', 'oluso-journey__label', field.label);\n if (field.required) legend.appendChild(el('span', 'oluso-journey__required', '*'));\n group.appendChild(legend);\n }\n const choices = el('div', 'oluso-journey__choices');\n (field.options ?? []).forEach((option, i) => {\n const choice = el('label', 'oluso-journey__choice');\n const input = el('input');\n input.type = 'radio';\n input.name = field.name;\n input.value = option.value;\n input.id = `${fieldId}-${i}`;\n input.required = field.required;\n input.disabled = option.disabled || field.readOnly;\n input.checked = option.value === field.value;\n const text = el('span', undefined, option.label);\n if (option.description) text.appendChild(el('span', 'oluso-journey__choice-description', option.description));\n choice.append(input, text);\n choices.appendChild(choice);\n });\n group.appendChild(choices);\n wrapper.appendChild(group);\n break;\n }\n case 'checkbox': {\n // A checkbox with a placeholder shows its label above and the placeholder beside the box, as the hosted form does.\n if (field.placeholder) label();\n const choice = el('label', 'oluso-journey__choice');\n const input = el('input');\n input.type = 'checkbox';\n input.value = 'true';\n common(input);\n input.checked = field.value === 'true';\n if (field.readOnly) {\n // Read-only still posts its value (a required consent scope), so it can't be disabled.\n input.setAttribute('aria-readonly', 'true');\n input.addEventListener('click', (e) => e.preventDefault());\n }\n const text = el('span', undefined, field.placeholder ?? field.label ?? '');\n if (!field.placeholder && field.required) text.appendChild(el('span', 'oluso-journey__required', '*'));\n choice.append(input, text);\n wrapper.appendChild(choice);\n break;\n }\n case 'file': {\n label();\n const input = el('input', 'oluso-journey__input');\n input.type = 'file';\n common(input);\n input.readOnly = false;\n input.disabled = field.readOnly;\n if (field.accept) input.accept = field.accept;\n input.multiple = (field.maxFiles ?? 1) > 1;\n input.required = field.required && !field.capture;\n wrapper.appendChild(input);\n if (field.capture && !field.readOnly) {\n const cameraLabel = el('label', 'oluso-journey__hint', labels.takePhoto);\n cameraLabel.htmlFor = `${fieldId}-camera`;\n const camera = el('input', 'oluso-journey__input');\n camera.type = 'file';\n camera.id = `${fieldId}-camera`;\n camera.name = field.name;\n camera.accept = 'image/*';\n camera.setAttribute('capture', field.capture);\n wrapper.append(cameraLabel, camera);\n }\n break;\n }\n case 'tel': {\n label();\n if (field.countries && field.countries.length > 0) {\n const row = el('div', 'oluso-journey__phone');\n const country = el('select', 'oluso-journey__select');\n country.name = `${field.name}__country`;\n country.setAttribute('aria-label', field.label ?? field.name);\n country.disabled = field.readOnly;\n for (const c of field.countries) {\n const o = el('option', undefined, `${c.flag ? c.flag + ' ' : ''}${c.name} (${c.dialCode})`);\n o.value = c.code;\n o.selected = c.code === field.country;\n country.appendChild(o);\n }\n const input = el('input', 'oluso-journey__input');\n input.type = 'tel';\n input.inputMode = 'tel';\n common(input);\n input.value = field.value ?? '';\n if (field.placeholder) input.placeholder = field.placeholder;\n row.append(country, input);\n wrapper.appendChild(row);\n } else {\n const input = textInput(field, 'tel');\n common(input);\n wrapper.appendChild(input);\n }\n break;\n }\n case 'otp': {\n label();\n const input = el('input', 'oluso-journey__input oluso-journey__input--otp');\n input.type = 'text';\n input.inputMode = 'numeric';\n common(input);\n input.setAttribute('autocomplete', field.autocomplete ?? 'one-time-code');\n if (field.maxLength) {\n input.maxLength = field.maxLength;\n input.minLength = field.minLength ?? field.maxLength;\n }\n input.pattern = field.pattern ?? '[0-9]*';\n input.value = field.value ?? '';\n wrapper.appendChild(input);\n break;\n }\n default: {\n label();\n const known = ['text', 'email', 'password', 'number', 'date', 'url', 'tel'];\n const input = textInput(field, known.includes(field.type) ? field.type : 'text');\n common(input);\n wrapper.appendChild(input);\n }\n }\n\n if (field.description) {\n const help = el('p', 'oluso-journey__help', field.description);\n help.id = `${fieldId}-help`;\n describedBy.push(help.id);\n wrapper.appendChild(help);\n }\n if (field.hint) {\n const hint = el('p', 'oluso-journey__hint', field.hint);\n hint.id = `${fieldId}-hint`;\n describedBy.push(hint.id);\n wrapper.appendChild(hint);\n }\n if (field.error) {\n const error = el('p', 'oluso-journey__error', field.error);\n error.id = `${fieldId}-error`;\n describedBy.push(error.id);\n wrapper.appendChild(error);\n }\n if (describedBy.length > 0) {\n Array.from(wrapper.querySelectorAll('[id]')).find((n) => n.id === fieldId)?.setAttribute('aria-describedby', describedBy.join(' '));\n }\n return wrapper;\n };\n\n const textInput = (field: JourneyFormField, type: string) => {\n const input = el('input', 'oluso-journey__input');\n input.type = type;\n input.value = field.value ?? '';\n if (field.placeholder) input.placeholder = field.placeholder;\n if (field.pattern) input.pattern = field.pattern;\n if (field.patternError) {\n input.title = field.patternError;\n input.addEventListener('invalid', () => {\n if (input.validity.patternMismatch) input.setCustomValidity(field.patternError!);\n });\n input.addEventListener('input', () => input.setCustomValidity(''));\n }\n if (field.minLength) input.minLength = field.minLength;\n if (field.maxLength) input.maxLength = field.maxLength;\n if (field.min) input.min = field.min;\n if (field.max) input.max = field.max;\n if (type === 'number') input.step = 'any';\n return input;\n };\n\n const renderWidget = (widget: JourneyFormWidget, form: HTMLFormElement): Element | null => {\n const data = (widget.data ?? {}) as Record<string, unknown>;\n const box = el('div', 'oluso-journey__widget');\n\n const result = (value: string) => {\n if (!widget.resultField) return;\n let input = Array.from(form.querySelectorAll<HTMLInputElement>('input[type=hidden]')).find((n) => n.name === widget.resultField) ?? null;\n if (!input) {\n input = el('input');\n input.type = 'hidden';\n input.name = widget.resultField;\n form.appendChild(input);\n }\n input.value = value;\n };\n\n switch (widget.type) {\n case 'webauthn_get':\n case 'webauthn_create': {\n const run = el('button', 'oluso-journey__button oluso-journey__button--primary', widget.submit?.label ?? labels.passkey);\n run.type = 'button';\n const go = async () => {\n run.disabled = true;\n try {\n const options = await webAuthnOptions(data);\n const publicKey = options.publicKey;\n let extra = options.extra;\n const credential = widget.type === 'webauthn_get' ? await getAssertion(publicKey) : await createCredential(publicKey);\n result(credential);\n const naming = data.credentialName as { field?: string; platform?: string; crossPlatform?: string; other?: string } | undefined;\n if (naming?.field) {\n const attachment = (JSON.parse(credential) as { authenticatorAttachment?: string | null }).authenticatorAttachment;\n const name = attachment === 'platform' ? naming.platform : attachment === 'cross-platform' ? naming.crossPlatform : naming.other;\n (extra ??= {})[naming.field] = name ?? '';\n }\n await send(form, widget.submit, extra);\n } catch (error) {\n run.disabled = false;\n run.textContent = labels.retry;\n options.onError?.(error instanceof Error ? error : new Error(String(error)), session);\n }\n };\n run.addEventListener('click', () => void go());\n box.appendChild(run);\n if (typeof PublicKeyCredential !== 'undefined') queueMicrotask(() => void go());\n return box;\n }\n case 'verification_connect': {\n // A verification provider's own widget runs in the page; its outcome comes back as the step's callback.\n const options = (data.options ?? {}) as Record<string, unknown>;\n const reference = typeof data.referenceOption === 'string' ? options[data.referenceOption] : undefined;\n const field = typeof data.referenceField === 'string' ? data.referenceField : 'reference_id';\n const callback = async (withReference: boolean) => {\n const values = new FormData();\n if (withReference) values.set(field, reference == null ? '' : String(reference));\n submitting(form, true);\n try {\n await post(values, 'callback');\n } catch (error) {\n submitting(form, false);\n fail(error);\n }\n };\n const start = async () => {\n await loadScript(String(data.scriptUrl));\n const Ctor = (window as unknown as Record<string, unknown>)[typeof data.global === 'string' ? data.global : 'Connect'] as\n | (new (o: Record<string, unknown>) => { setup?: () => void; open: () => void })\n | undefined;\n if (!Ctor) throw new Error('The verification widget could not be loaded');\n const connect = new Ctor({\n ...options,\n onSuccess: () => void callback(true),\n onError: () => void callback(false),\n onClose: () => undefined,\n });\n connect.setup?.();\n connect.open();\n return connect;\n };\n let instance: Promise<{ open: () => void }> | undefined;\n const open = () => {\n if (instance) {\n void instance.then((c) => c.open());\n return;\n }\n instance = start();\n instance.catch((error) => {\n instance = undefined;\n fail(error);\n });\n };\n if (widget.submit) {\n const button = el('button', `oluso-journey__button oluso-journey__button--${widget.submit.kind}`, widget.submit.label);\n button.type = 'button';\n button.addEventListener('click', open);\n box.appendChild(button);\n }\n open();\n return box;\n }\n case 'captcha': {\n const target = el('div', 'oluso-journey__captcha');\n box.appendChild(target);\n void renderCaptcha(target, data, (token) => {\n result(token);\n if (widget.submit) void send(form, widget.submit);\n }).catch((error) => options.onError?.(error instanceof Error ? error : new Error(String(error)), session));\n return box;\n }\n case 'qr': {\n const qr = el('div', 'oluso-journey__qr');\n if (typeof data.image === 'string') {\n const img = el('img');\n img.src = data.image;\n img.alt = '';\n qr.appendChild(img);\n }\n if (typeof data.secret === 'string') {\n if (typeof data.secretLabel === 'string') qr.appendChild(el('span', 'oluso-journey__help', data.secretLabel));\n qr.appendChild(el('code', 'oluso-journey__code', data.secret));\n }\n else if (typeof data.value === 'string' && typeof data.image !== 'string') qr.appendChild(el('code', 'oluso-journey__code', data.value));\n box.appendChild(qr);\n return box;\n }\n case 'codes': {\n const codes = Array.isArray(data.codes) ? data.codes.map(String) : [];\n const list = el('ul', 'oluso-journey__codes');\n codes.forEach((c) => list.appendChild(el('li', undefined, c)));\n const copy = el('button', 'oluso-journey__button', labels.copy);\n copy.type = 'button';\n copy.addEventListener('click', () => {\n void navigator.clipboard?.writeText(codes.join('\\n')).then(() => (copy.textContent = labels.copied));\n });\n box.append(list, copy);\n return box;\n }\n case 'poll': {\n const seconds = Math.max(2, Number(data.intervalSeconds) || 5);\n const stopAt = Number(data.maxSeconds) > 0 ? Date.now() + Number(data.maxSeconds) * 1000 : Infinity;\n const rendered = session?.currentStep;\n timers.push(window.setInterval(() => {\n if (Date.now() > stopAt) {\n clearTimers();\n return;\n }\n if (!session || document.hidden) return;\n void client.getSession(session.sessionId).then(async (now) => {\n if (now.status !== 'in_progress' || now.currentStep !== rendered) {\n clearTimers();\n await post(new FormData(), 'init');\n }\n }).catch(() => undefined);\n }, seconds * 1000));\n return null;\n }\n default:\n return null;\n }\n };\n\n const webAuthnOptions = async (data: Record<string, unknown>) => {\n if (data.publicKey) return { publicKey: data.publicKey as Record<string, unknown>, extra: undefined };\n const url = String(data.optionsUrl);\n const absolute = /^https?:/i.test(url) ? url : `${client.serverUrl}${url.startsWith('/') ? '' : '/'}${url}`;\n const method = String(data.optionsMethod ?? 'POST').toUpperCase();\n const response = await fetch(absolute, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: method === 'GET' ? undefined : JSON.stringify(data.optionsBody ?? {}),\n credentials: 'include',\n });\n if (!response.ok) throw new Error(labels.failed);\n const json = (await response.json()) as Record<string, unknown>;\n const extra: Record<string, string> = {};\n if (typeof data.idProperty === 'string' && typeof data.idField === 'string' && json[data.idProperty] != null) {\n extra[data.idField] = String(json[data.idProperty]);\n }\n return { publicKey: (json.options ?? json) as Record<string, unknown>, extra };\n };\n\n const renderHtml = (html: string) => {\n const wrapper = el('div', 'oluso-journey__html');\n wrapper.innerHTML = html;\n wrapper.querySelectorAll('script').forEach((s) => s.remove());\n wrapper.addEventListener('submit', (event) => {\n const form = event.target as HTMLFormElement;\n event.preventDefault();\n const submitter = (event as SubmitEvent).submitter as HTMLButtonElement | null;\n const data = new FormData(form);\n if (submitter?.name) data.append(submitter.name, submitter.value);\n data.delete('__RequestVerificationToken');\n submitting(form, true);\n post(data).catch((error) => {\n submitting(form, false);\n fail(error);\n });\n });\n root.replaceChildren(wrapper);\n };\n\n void (options.session ? show(options.session) : begin());\n\n return {\n get session() {\n return session;\n },\n restart: begin,\n destroy() {\n destroyed = true;\n clearTimers();\n root.remove();\n },\n };\n}\n\nfunction currentValues(item: unknown): string[] {\n if (!item) return [];\n const inputs = item instanceof RadioNodeList ? Array.from(item) : [item];\n return inputs.flatMap((node) => {\n const input = node as HTMLInputElement;\n if (input.disabled) return [];\n if (input.type === 'checkbox' || input.type === 'radio') return input.checked ? [input.value] : [];\n if (input instanceof HTMLSelectElement && input.multiple) return Array.from(input.selectedOptions).map((o) => o.value);\n return [input.value];\n });\n}\n\nconst loadedScripts = new Map<string, Promise<void>>();\n\nfunction loadScript(src: string): Promise<void> {\n let loading = loadedScripts.get(src);\n if (!loading) {\n loading = new Promise<void>((resolve, reject) => {\n const tag = document.createElement('script');\n tag.src = src;\n tag.async = true;\n tag.onload = () => resolve();\n tag.onerror = () => {\n loadedScripts.delete(src);\n reject(new Error('A script the step needs could not be loaded'));\n };\n document.head.appendChild(tag);\n });\n loadedScripts.set(src, loading);\n }\n return loading;\n}\n\nconst CAPTCHA_SCRIPTS: Record<string, { src: string; global: string }> = {\n recaptcha: { src: 'https://www.google.com/recaptcha/api.js?render=explicit&onload=', global: 'grecaptcha' },\n hcaptcha: { src: 'https://js.hcaptcha.com/1/api.js?render=explicit&onload=', global: 'hcaptcha' },\n turnstile: { src: 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=', global: 'turnstile' },\n};\n\ntype CaptchaApi = {\n render: (el: HTMLElement, options: Record<string, unknown>) => unknown;\n ready?: (cb: () => void) => void;\n execute?: (siteKey: string, options: { action: string }) => Promise<string>;\n};\n\nasync function renderCaptcha(target: HTMLElement, data: Record<string, unknown>, done: (token: string) => void): Promise<void> {\n const provider = String(data.provider ?? 'recaptcha').toLowerCase();\n const script = CAPTCHA_SCRIPTS[provider];\n if (!script) throw new Error(`Captcha provider '${provider}' isn't supported`);\n const w = window as unknown as Record<string, unknown>;\n if (!w[script.global]) {\n const callback = `__olusoCaptcha${Date.now()}`;\n await new Promise<void>((resolve, reject) => {\n w[callback] = () => resolve();\n const tag = document.createElement('script');\n tag.src = script.src + callback + (data.language ? `&hl=${encodeURIComponent(String(data.language))}` : '');\n tag.async = true;\n tag.onerror = () => reject(new Error('The captcha could not be loaded'));\n document.head.appendChild(tag);\n });\n }\n const api = w[script.global] as CaptchaApi;\n const siteKey = String(data.siteKey ?? '');\n if (provider === 'recaptcha' && data.version === 'v3' && api.execute) {\n api.ready?.(() => void api.execute!(siteKey, { action: String(data.action ?? 'submit') }).then(done));\n return;\n }\n api.render(target, {\n sitekey: siteKey,\n theme: data.theme,\n size: data.size,\n action: data.action,\n callback: (token: string) => done(token),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAUO;;;ACqBA,IAAM,cAAN,MAAkB;AAAA,EAKvB,YAAY,QAAqB;AAFjC,SAAQ,YAAgE,oBAAI,IAAI;AAG9E,QAAI,CAAC,OAAO,WAAW;AACrB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAEA,SAAK,SAAS;AAAA,MACZ,GAAG;AAAA,MACH,WAAW,OAAO,UAAU,QAAQ,OAAO,EAAE;AAAA;AAAA,IAC/C;AACA,SAAK,UAAU,OAAO,SAAS,WAAW,MAAM,KAAK,UAAU;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAoC;AACnD,UAAM,WAAW,MAAM,KAAK,QAAqB,wBAAwB,mBAAmB,IAAI,CAAC,EAAE;AACnG,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,MACA,MACA,SAM2B;AAC3B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,QAA0B,wBAAwB,mBAAmB,IAAI,CAAC,WAAW;AAAA,QAC7G,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,YACR,GAAG,SAAS;AAAA,YACZ,UAAU,OAAO,aAAa,cAAc,SAAS,WAAW;AAAA,YAChE,WAAW,OAAO,cAAc,cAAc,UAAU,YAAY;AAAA,UACtE;AAAA,UACA,UAAU,SAAS;AAAA,QACrB;AAAA,MACF,CAAC;AAED,WAAK,KAAK;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,KAAK;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MACjE,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,MAAc,MAAyD;AACxF,UAAM,UAAU,MAAM,KAAK;AAAA,MACzB,wBAAwB,mBAAmB,IAAI,CAAC;AAAA,MAChD,EAAE,QAAQ,QAAQ,MAAM,EAAE,KAAK,EAAE;AAAA,IACnC;AAEA,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,MACd,WAAW,QAAQ;AAAA,MACnB,MAAM;AAAA,IACR,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,MAAc,MAAmE,MAAyD;AAC/J,UAAM,UAAU,MAAM,KAAK;AAAA,MACzB,wBAAwB,mBAAmB,IAAI,CAAC;AAAA,MAChD;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,EAAE,MAAM,UAAU,KAAK,UAAU,eAAe,KAAK,eAAe,qBAAqB,QAAQ,OAAO,KAAK,MAAM;AAAA,MAC3H;AAAA,IACF;AAEA,SAAK,KAAK,EAAE,MAAM,mBAAmB,MAAM,QAAQ,MAAM,WAAW,QAAQ,WAAW,MAAM,QAAQ,CAAC;AACtG,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WACJ,WACA,MACA,QACqB;AACrB,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,iCAAiC,mBAAmB,SAAS,CAAC;AAAA,MAC9D,EAAE,QAAQ,QAAQ,MAAM,EAAE,MAAM,OAAO,EAAE;AAAA,IAC3C;AAEA,SAAK,KAAK;AAAA,MACR,MAAM,OAAO,YAAY,sBAAsB,OAAO,UAAU,iBAAiB;AAAA,MACjF,MAAM,OAAO;AAAA,MACb;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,WAAmB,MAAgB,QAAsC;AAC5F,QAAI,OAAQ,MAAK,IAAI,oBAAoB,MAAM;AAC/C,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,iCAAiC,mBAAmB,SAAS,CAAC;AAAA,MAC9D,EAAE,QAAQ,QAAQ,MAAM,KAAK;AAAA,IAC/B;AAEA,SAAK,KAAK;AAAA,MACR,MAAM,OAAO,YAAY,sBAAsB,OAAO,UAAU,iBAAiB;AAAA,MACjF,MAAM,OAAO;AAAA,MACb;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,YAAoB;AACtB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,WAA4C;AAC3D,WAAO,KAAK,QAAwB,iCAAiC,mBAAmB,SAAS,CAAC,EAAE;AAAA,EACtG;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,MAAc,SAGjB;AACT,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,KAAK,OAAO,OAAQ,QAAO,IAAI,UAAU,KAAK,OAAO,MAAM;AAE/D,QAAI,SAAS,aAAa;AACxB,aAAO,IAAI,gBAAgB,QAAQ,WAAW;AAAA,IAChD;AACA,QAAI,SAAS,OAAO;AAClB,aAAO,IAAI,SAAS,QAAQ,KAAK;AAAA,IACnC;AAEA,WAAO,GAAG,KAAK,OAAO,SAAS,kBAAkB,mBAAmB,IAAI,CAAC,IAAI,MAAM;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAc,SAGf;AACT,UAAM,SAAS,IAAI,gBAAgB,EAAE,OAAO,OAAO,CAAC;AACpD,QAAI,KAAK,OAAO,OAAQ,QAAO,IAAI,UAAU,KAAK,OAAO,MAAM;AAE/D,QAAI,SAAS,OAAO;AAClB,aAAO,IAAI,SAAS,QAAQ,KAAK;AAAA,IACnC;AACA,QAAI,SAAS,YAAY;AACvB,aAAO,IAAI,cAAc,MAAM;AAAA,IACjC;AAEA,WAAO,GAAG,KAAK,OAAO,SAAS,kBAAkB,mBAAmB,IAAI,CAAC,IAAI,MAAM;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,GAAG,OAA6B,UAA0C;AACxE,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,WAAK,UAAU,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IACrC;AACA,SAAK,UAAU,IAAI,KAAK,EAAG,IAAI,QAAQ;AAGvC,WAAO,MAAM;AACX,WAAK,UAAU,IAAI,KAAK,GAAG,OAAO,QAAQ;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA6B,UAAoC;AACnE,SAAK,UAAU,IAAI,KAAK,GAAG,OAAO,QAAQ;AAAA,EAC5C;AAAA,EAEQ,KAAK,OAAyB;AAEpC,SAAK,UAAU,IAAI,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,SAAS,KAAK,CAAC;AAErE,SAAK,UAAU,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,SAAS,KAAK,CAAC;AAAA,EAChE;AAAA,EAEA,MAAc,QACZ,MACA,SAIY;AACZ,UAAM,MAAM,GAAG,KAAK,OAAO,SAAS,GAAG,IAAI;AAC3C,UAAM,SAAS,SAAS,UAAU;AAClC,UAAM,SAAS,OAAO,aAAa,eAAe,SAAS,gBAAgB;AAC3E,UAAM,UAAkC,CAAC;AACzC,QAAI,KAAK,OAAO,QAAQ;AACtB,cAAQ,aAAa,IAAI,KAAK,OAAO;AAAA,IACvC;AAEA,QAAI,CAAC,QAAQ;AACX,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,QAAI,KAAK,OAAO,QAAQ;AACtB,cAAQ,WAAW,IAAI,KAAK,OAAO;AAAA,IACrC;AAEA,QAAI,KAAK,OAAO,SAAS;AACvB,aAAO,OAAO,SAAS,MAAM,KAAK,OAAO,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC;AAAA,IACnE;AAEA,UAAM,WAAW,MAAM,KAAK,QAAQ,KAAK;AAAA,MACvC;AAAA,MACA;AAAA,MACA,MAAM,SAAS,SAAS,SAAY,SAAY,SAAU,QAAQ,OAAoB,KAAK,UAAU,QAAQ,IAAI;AAAA,MACjH,aAAa;AAAA;AAAA,IACf,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,SAAS,WAAW,EAAE;AAClF,YAAM,IAAI;AAAA,QACR,MAAM,WAAW,mBAAmB,SAAS,MAAM;AAAA,QACnD,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AACF;AAKO,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YACE,SACgB,QACA,MACA,aAChB;AACA,UAAM,OAAO;AAJG;AACA;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;;;ACnUA,IAAM,UAAkC;AAAA,EACtC,IAAI;AAAA,EAAM,QAAQ;AAAA,EAAM,MAAM;AAAA,EAAM,KAAK;AAAA,EACzC,IAAI;AAAA,EAAM,KAAK;AAAA,EAAM,WAAW;AAAA,EAAM,MAAM;AAAA,EAC5C,IAAI;AAAA,EAAM,KAAK;AAAA,EAAM,aAAa;AAAA,EAClC,KAAK;AAAA,EAAO,MAAM;AAAA,EAAO,qBAAqB;AAAA,EAC9C,IAAI;AAAA,EAAM,KAAK;AAAA,EAAM,UAAU;AAAA,EAC/B,KAAK;AAAA,EAAO,MAAM;AAAA,EAAO,kBAAkB;AAAA,EAC3C,UAAU;AAAA,EAAY,aAAa;AAAA,EAAgB,aAAa;AAAA,EAChE,YAAY;AAAA,EAAe,UAAU;AAAA,EACrC,QAAQ;AAAA,EAAU,SAAS;AAAA,EAAU,OAAO;AAAA,EAC5C,WAAW;AAAA,EAAc,MAAM;AAAA,EAAc,UAAU;AAAA,EACvD,OAAO;AAAA,EAAS,UAAU;AAAA,EAC1B,IAAI;AAAA,EAAM,OAAO;AAAA,EAAU,OAAO;AAAA,EAClC,OAAO;AAAA,EAAS,SAAS;AAAA,EACzB,MAAM;AAAA,EAAQ,OAAO;AACvB;AAGO,SAAS,kBAAkB,IAA4C;AAC5E,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,QAAQ,GAAG,KAAK,EAAE,YAAY,EAAE,QAAQ,MAAM,EAAE,CAAC;AAC1D;AAEA,IAAM,OAAO,CAAC,GAAW,MAAc,EAAE,cAAc,GAAG,QAAW,EAAE,aAAa,SAAS,CAAC,MAAM;AAEpG,SAAS,MAAM,QAAgB,UAAkD;AAC/E,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,IAAI,OAAO,MAAM;AACvB,QAAM,IAAI,OAAO,QAAQ;AACzB,MAAI,OAAO,KAAK,MAAM,MAAM,SAAS,KAAK,MAAM,MAAM,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,EAAG,QAAO,MAAM,IAAI,IAAI,IAAI,IAAI,KAAK;AAC9H,QAAM,KAAK,KAAK,MAAM,MAAM;AAC5B,QAAM,KAAK,KAAK,MAAM,QAAQ;AAC9B,MAAI,CAAC,OAAO,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,EAAE,EAAG,QAAO,OAAO,KAAK,IAAI,KAAK,KAAK,KAAK;AAClF,SAAO,OAAO,cAAc,UAAU,QAAW,EAAE,aAAa,SAAS,CAAC;AAC5E;AAEA,SAAS,QAAQ,QAAgB,IAAY,UAAuC;AAClF,QAAM,QAAQ,OAAO,YAAY;AACjC,QAAM,QAAQ,YAAY,IAAI,YAAY;AAC1C,UAAQ,IAAI;AAAA,IACV,KAAK;AAAM,aAAO,KAAK,QAAQ,YAAY,EAAE;AAAA,IAC7C,KAAK;AAAM,aAAO,CAAC,KAAK,QAAQ,YAAY,EAAE;AAAA,IAC9C,KAAK,MAAM;AAAE,YAAM,IAAI,MAAM,QAAQ,QAAQ;AAAG,aAAO,MAAM,UAAa,IAAI;AAAA,IAAG;AAAA,IACjF,KAAK,OAAO;AAAE,YAAM,IAAI,MAAM,QAAQ,QAAQ;AAAG,aAAO,MAAM,UAAa,KAAK;AAAA,IAAG;AAAA,IACnF,KAAK,MAAM;AAAE,YAAM,IAAI,MAAM,QAAQ,QAAQ;AAAG,aAAO,MAAM,UAAa,IAAI;AAAA,IAAG;AAAA,IACjF,KAAK,OAAO;AAAE,YAAM,IAAI,MAAM,QAAQ,QAAQ;AAAG,aAAO,MAAM,UAAa,KAAK;AAAA,IAAG;AAAA,IACnF,KAAK;AAAY,aAAO,MAAM,SAAS,IAAI;AAAA,IAC3C,KAAK;AAAgB,aAAO,CAAC,MAAM,SAAS,IAAI;AAAA,IAChD,KAAK;AAAe,aAAO,MAAM,WAAW,IAAI;AAAA,IAChD,KAAK;AAAa,aAAO,MAAM,SAAS,IAAI;AAAA,IAC5C,KAAK;AACH,UAAI,CAAC,SAAU,QAAO;AACtB,UAAI;AAAE,eAAO,IAAI,OAAO,UAAU,GAAG,EAAE,KAAK,MAAM;AAAA,MAAG,QAAQ;AAAE,eAAO;AAAA,MAAO;AAAA,IAC/E;AAAS,aAAO;AAAA,EAClB;AACF;AAEA,SAAS,aAAa,UAAwC;AAC5D,MAAI,CAAC,YAAY,CAAC,SAAS,KAAK,EAAG,QAAO,CAAC;AAC3C,QAAM,UAAU,SAAS,KAAK;AAC9B,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAI,MAAM,QAAQ,MAAM,EAAG,QAAO,OAAO,IAAI,MAAM;AAAA,IACrD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAC/D;AAEA,IAAM,SAAS,CAAC,MAAc,EAAE,YAAY,MAAM,WAAW,MAAM;AAM5D,SAAS,aAAa,WAAiC,QAA2B;AACvF,QAAM,KAAK,kBAAkB,UAAU,QAAQ;AAC/C,QAAM,UAAU,OAAO,OAAO,CAAC,MAAM,MAAM,EAAE;AAC7C,QAAM,UAAU,MAAM,QAAQ,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC;AAC9F,UAAQ,IAAI;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AAAa,aAAO,QAAQ,SAAS;AAAA,IAC1C,KAAK;AAAA,IACL,KAAK;AAAS,aAAO,QAAQ,WAAW;AAAA,IACxC,KAAK;AAAM,aAAO,CAAC,QAAQ,KAAK,CAAC,MAAM,QAAQ,GAAG,MAAM,UAAU,KAAK,CAAC;AAAA,IACxE,KAAK;AAAgB,aAAO,CAAC,QAAQ,KAAK,CAAC,MAAM,QAAQ,GAAG,YAAY,UAAU,KAAK,CAAC;AAAA,IACxF,KAAK,MAAM;AAAE,YAAM,OAAO,aAAa,UAAU,KAAK;AAAG,aAAO,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC;AAAA,IAAG;AAAA,IACrH,KAAK,UAAU;AAAE,YAAM,OAAO,aAAa,UAAU,KAAK;AAAG,aAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC;AAAA,IAAG;AAAA,IAC1H,KAAK;AAAQ,aAAO,QAAQ,KAAK,MAAM;AAAA,IACvC,KAAK;AAAS,aAAO,CAAC,QAAQ,KAAK,MAAM;AAAA,IACzC,KAAK;AAAW,aAAO;AAAA,IACvB;AAAS,aAAO,QAAQ,KAAK,CAAC,MAAM,QAAQ,GAAG,IAAI,UAAU,KAAK,CAAC;AAAA,EACrE;AACF;;;AChGO,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoG9B,IAAI,WAAW;AAER,SAAS,sBAA4B;AAC1C,MAAI,YAAY,OAAO,aAAa,YAAa;AACjD,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,aAAa,sBAAsB,EAAE;AAC3C,QAAM,cAAc;AACpB,WAAS,KAAK,YAAY,KAAK;AAC/B,aAAW;AACb;;;AC5GO,SAAS,kBAAkB,OAA4B;AAC5D,QAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AACzD,QAAM,SAAS,SAAS,IAAI,QAAQ,IAAK,OAAO,SAAS,KAAM,CAAC;AAChE,QAAM,SAAS,KAAK,MAAM;AAC1B,QAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,OAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AACtE,SAAO,MAAM;AACf;AAEO,SAAS,kBAAkB,QAAuD;AACvF,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,WAAU,OAAO,aAAa,MAAM,CAAC,CAAC;AAC7E,SAAO,KAAK,MAAM,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE;AAC/E;AAIA,SAAS,sBAAsB,MAA4D;AACzF,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO;AACjC,SAAO,KAAK,IAAI,CAAC,OAAa;AAAA,IAC5B,MAAO,EAAE,QAAoC;AAAA,IAC7C,IAAI,kBAAkB,OAAO,EAAE,EAAE,CAAC;AAAA,IAClC,YAAY,EAAE;AAAA,EAChB,EAAE;AACJ;AAEO,SAAS,eAAe,WAAoD;AACjF,SAAO;AAAA,IACL,GAAI;AAAA,IACJ,WAAW,kBAAkB,OAAO,UAAU,SAAS,CAAC;AAAA,IACxD,kBAAkB,sBAAsB,UAAU,gBAAgB;AAAA,EACpE;AACF;AAEO,SAAS,gBAAgB,WAAqD;AACnF,QAAM,OAAQ,UAAU,QAAQ,CAAC;AACjC,SAAO;AAAA,IACL,GAAI;AAAA,IACJ,WAAW,kBAAkB,OAAO,UAAU,SAAS,CAAC;AAAA,IACxD,MAAM,EAAE,GAAI,MAAiB,IAAI,kBAAkB,OAAO,KAAK,EAAE,CAAC,EAAE;AAAA,IACpE,oBAAoB,sBAAsB,UAAU,kBAAkB;AAAA,EACxE;AACF;AAGA,eAAsB,aAAa,WAAkC;AACnE,QAAM,aAAc,MAAM,UAAU,YAAY,IAAI,EAAE,WAAW,eAAe,SAAS,EAAE,CAAC;AAC5F,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,uBAAuB;AACxD,QAAM,WAAW,WAAW;AAC5B,SAAO,KAAK,UAAU;AAAA,IACpB,IAAI,WAAW;AAAA,IACf,OAAO,kBAAkB,WAAW,KAAK;AAAA,IACzC,MAAM,WAAW;AAAA,IACjB,UAAU;AAAA,MACR,gBAAgB,kBAAkB,SAAS,cAAc;AAAA,MACzD,mBAAmB,kBAAkB,SAAS,iBAAiB;AAAA,MAC/D,WAAW,kBAAkB,SAAS,SAAS;AAAA,MAC/C,YAAY,kBAAkB,SAAS,UAAU;AAAA,IACnD;AAAA,IACA,yBAAyB,WAAW,2BAA2B;AAAA,EACjE,CAAC;AACH;AAGA,eAAsB,iBAAiB,WAAkC;AACvE,QAAM,aAAc,MAAM,UAAU,YAAY,OAAO,EAAE,WAAW,gBAAgB,SAAS,EAAE,CAAC;AAChG,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,wBAAwB;AACzD,QAAM,WAAW,WAAW;AAC5B,SAAO,KAAK,UAAU;AAAA,IACpB,IAAI,WAAW;AAAA,IACf,OAAO,kBAAkB,WAAW,KAAK;AAAA,IACzC,MAAM,WAAW;AAAA,IACjB,UAAU;AAAA,MACR,gBAAgB,kBAAkB,SAAS,cAAc;AAAA,MACzD,mBAAmB,kBAAkB,SAAS,iBAAiB;AAAA,MAC/D,YAAY,OAAO,SAAS,kBAAkB,aAAa,SAAS,cAAc,IAAI;AAAA,IACxF;AAAA,IACA,yBAAyB,WAAW,2BAA2B;AAAA,EACjE,CAAC;AACH;;;ACvDA,IAAM,iBAAgC;AAAA,EACpC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AACf;AAsCA,SAAS,GAA0C,KAAQ,WAAoB,MAAyC;AACtH,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,MAAI,UAAW,MAAK,YAAY;AAChC,MAAI,SAAS,OAAW,MAAK,cAAc;AAC3C,SAAO;AACT;AAEA,IAAI,MAAM;AAOH,SAAS,aAAa,WAAoB,SAA4C;AAC3F,QAAM,SAAwB,EAAE,GAAG,gBAAgB,GAAG,QAAQ,OAAO;AACrE,QAAM,SAAS,QAAQ;AACvB,QAAM,KAAK,UAAU,EAAE,GAAG;AAC1B,MAAI;AACJ,MAAI,YAAY;AAChB,MAAI,SAAmB,CAAC;AAExB,MAAI,CAAC,QAAQ,SAAU,qBAAoB;AAC3C,QAAM,OAAO,GAAG,OAAO,eAAe;AACtC,OAAK,aAAa,cAAc,QAAQ,SAAS,MAAM;AACvD,YAAU,YAAY,IAAI;AAE1B,QAAM,cAAc,MAAM;AACxB,WAAO,QAAQ,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAC7C,aAAS,CAAC;AAAA,EACZ;AAEA,QAAM,SAAS,CAAC,SAAiB;AAC/B,SAAK,gBAAgB,GAAG,KAAK,yBAAyB,IAAI,CAAC;AAAA,EAC7D;AAEA,QAAM,OAAO,CAAC,UAAmB;AAC/B,UAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACpE,YAAQ,UAAU,KAAK,OAAO;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,KAAK;AAE9D,QAAM,QAAQ,YAAY;AACxB,gBAAY;AACZ,WAAO,OAAO,OAAO;AACrB,QAAI;AACF,YAAM,UAAU,QAAQ,QACpB,MAAM,QAAQ,MAAM,IACpB,QAAQ,OACN,MAAM,OAAO,aAAa,QAAQ,MAAM,QAAQ,IAAI,IACpD,QAAQ;AACd,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,0DAA0D;AACxF,YAAM,KAAK,OAAO;AAAA,IACpB,SAAS,OAAO;AACd,kBAAY,KAAK,KAAK,EAAE,OAAO;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,SAAyB;AAC3C,QAAI,UAAW;AACf,gBAAY;AACZ,cAAU;AACV,YAAQ,SAAS,IAAI;AAErB,QAAI,KAAK,WAAW;AAClB,UAAI,KAAK,aAAa;AACpB,cAAM,QAAQ,aAAa,IAAI;AAC/B,iBAAS,KAAK,aAAa,IAAI;AAC/B;AAAA,MACF;AACA,UAAI,QAAQ,mBAAmB,OAAO;AACpC,cAAM,OAAO,GAAG,OAAO,qBAAqB;AAC5C,aAAK,YAAY,GAAG,KAAK,0BAA0B,KAAK,WAAW,OAAO,SAAS,CAAC;AACpF,aAAK,gBAAgB,IAAI;AAAA,MAC3B,OAAO;AACL,aAAK,gBAAgB;AAAA,MACvB;AACA,YAAM,QAAQ,aAAa,IAAI;AAC/B;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,eAAe;AACjC,YAAM,UAAU,KAAK,WAAW,YAAY,OAAO,UAAU,KAAK,oBAAoB,OAAO;AAC7F,WAAK,IAAI,MAAM,OAAO,CAAC;AACvB,kBAAY,OAAO;AACnB;AAAA,IACF;AAEA,QAAI,KAAK,aAAa;AACpB,eAAS,KAAK,aAAa,IAAI;AAC/B;AAAA,IACF;AAEA,QAAI,KAAK,MAAM,MAAM;AACnB,iBAAW,KAAK,KAAK,IAAI;AAAA,IAC3B,WAAW,KAAK,MAAM,MAAM;AAC1B,iBAAW,KAAK,KAAK,IAAI;AAAA,IAC3B,OAAO;AACL,kBAAY,OAAO,WAAW;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,WAAW,CAAC,KAAa,YAA4B;AACzD,QAAI,QAAQ,WAAY,SAAQ,WAAW,KAAK,OAAO;AAAA,QAClD,QAAO,SAAS,OAAO,GAAG;AAAA,EACjC;AAEA,QAAM,cAAc,CAAC,YAAoB;AACvC,UAAM,MAAM,GAAG,OAAO,qBAAqB;AAC3C,QAAI,YAAY,GAAG,KAAK,oDAAoD,OAAO,CAAC;AACpF,QAAI,WAAW,GAAG;AAChB,YAAM,QAAQ,GAAG,UAAU,wDAAwD,OAAO,OAAO;AACjG,YAAM,OAAO;AACb,YAAM,iBAAiB,SAAS,MAAM,KAAK,MAAM,CAAC;AAClD,YAAM,MAAM,GAAG,OAAO,wBAAwB;AAC9C,UAAI,YAAY,KAAK;AACrB,UAAI,YAAY,GAAG;AAAA,IACrB;AACA,SAAK,gBAAgB,GAAG;AAAA,EAC1B;AAEA,QAAM,OAAO,OAAO,MAAgB,WAAoB;AACtD,QAAI,CAAC,QAAS;AACd,UAAM,OAAO,MAAM,OAAO,eAAe,QAAQ,WAAW,MAAM,MAAM;AACxE,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,QAAM,aAAa,CAAC,MAAuB,SAAkB;AAC3D,SAAK,aAAa,aAAa,OAAO,IAAI,CAAC;AAC3C,SAAK,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,MAAQ,EAAwB,WAAW,IAAK;AAAA,EAC3F;AAEA,QAAM,OAAO,OAAO,MAAuB,QAAuC,UAAmC;AACnH,UAAM,OAAO,QAAQ,gBAAgB,QAAQ,IAAI,SAAS,IAAI,IAAI,SAAS,IAAI;AAC/E,QAAI,QAAQ,KAAM,MAAK,OAAO,OAAO,MAAM,OAAO,SAAS,EAAE;AAC7D,QAAI,QAAQ,OAAQ,YAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,OAAO,MAAM,EAAG,MAAK,OAAO,GAAG,CAAC;AACxF,QAAI,MAAO,YAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,EAAG,MAAK,IAAI,GAAG,CAAC;AACpE,eAAW,MAAM,IAAI;AACrB,QAAI;AACF,YAAM,KAAK,IAAI;AAAA,IACjB,SAAS,OAAO;AACd,iBAAW,MAAM,KAAK;AACtB,YAAM,UAAU,KAAK,KAAK,EAAE;AAC5B,UAAI,QAAQ,KAAK,cAA2B,4BAA4B;AACxE,UAAI,CAAC,OAAO;AACV,gBAAQ,GAAG,KAAK,kDAAkD;AAClE,cAAM,aAAa,4BAA4B,EAAE;AACjD,cAAM,aAAa,QAAQ,OAAO;AAClC,aAAK,QAAQ,KAAK;AAAA,MACpB;AACA,YAAM,cAAc;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,SAA0B;AAC5C,UAAM,OAAO,GAAG,QAAQ,qBAAqB;AAE7C,QAAI,KAAK,MAAO,MAAK,YAAY,GAAG,MAAM,wBAAwB,KAAK,KAAK,CAAC;AAC7E,QAAI,KAAK,YAAa,MAAK,YAAY,GAAG,KAAK,8BAA8B,KAAK,WAAW,CAAC;AAC9F,QAAI,KAAK,OAAO;AACd,YAAM,QAAQ,GAAG,KAAK,oDAAoD,KAAK,KAAK;AACpF,YAAM,aAAa,QAAQ,OAAO;AAClC,WAAK,YAAY,KAAK;AAAA,IACxB;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,SAAS,GAAG,KAAK,qDAAqD,KAAK,MAAM;AACvF,aAAO,aAAa,QAAQ,QAAQ;AACpC,WAAK,YAAY,MAAM;AAAA,IACzB;AAEA,UAAM,WAAiE,CAAC;AACxE,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,WAAW,YAAY,KAAK;AAClC,UAAI,CAAC,SAAU;AACf,WAAK,YAAY,QAAQ;AACzB,UAAI,MAAM,YAAY,MAAM,aAAa,OAAQ,UAAS,KAAK,EAAE,OAAO,SAAS,SAAS,CAAC;AAAA,IAC7F;AAEA,QAAI,KAAK,QAAQ;AACf,YAAM,SAAS,aAAa,KAAK,QAAQ,IAAI;AAC7C,UAAI,OAAQ,MAAK,YAAY,MAAM;AAAA,IACrC;AAEA,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,YAAM,QAAQ,GAAG,OAAO,sBAAsB;AAC9C,iBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAM,IAAI,GAAG,KAAK,QAAW,KAAK,KAAK;AACvC,UAAE,OAAO,KAAK;AACd,UAAE,SAAS;AACX,UAAE,MAAM;AACR,cAAM,YAAY,CAAC;AAAA,MACrB;AACA,WAAK,YAAY,KAAK;AAAA,IACxB;AAEA,QAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,YAAM,MAAM,GAAG,OAAO,wBAAwB;AAE9C,YAAM,UAAU,KAAK,QAAQ,UAAU,CAAC,MAAM,EAAE,SAAS,SAAS;AAClE,UAAI,WAAW,GAAG;AAChB,cAAM,QAAQ,GAAG,UAAU,sBAAsB;AACjD,cAAM,OAAO;AACb,cAAM,WAAW;AACjB,cAAM,aAAa,eAAe,MAAM;AACxC,cAAM,QAAQ,cAAc,OAAO,OAAO;AAC1C,aAAK,QAAQ,KAAK;AAAA,MACpB;AACA,YAAM,YAAuB,CAAC;AAC9B,WAAK,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACtC,cAAM,SAAS,GAAG,UAAU,gDAAgD,OAAO,IAAI,IAAI,OAAO,KAAK;AACvG,eAAO,OAAO;AACd,eAAO,iBAAiB,OAAO,kBAAkB,OAAO,gBAAgB;AACxE,eAAO,QAAQ,cAAc,OAAO,KAAK;AACzC,YAAI,OAAO,aAAa;AAEtB,gBAAM,OAAO,GAAG,KAAK,4BAA4B;AACjD,eAAK,YAAY,GAAG,QAAQ,uBAAuB,OAAO,WAAW,CAAC;AACtE,eAAK,YAAY,MAAM;AACvB,oBAAU,KAAK,IAAI;AAAA,QACrB,OAAO;AACL,cAAI,YAAY,MAAM;AAAA,QACxB;AAAA,MACF,CAAC;AACD,UAAI,IAAI,oBAAoB,EAAG,MAAK,YAAY,GAAG;AACnD,gBAAU,QAAQ,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC;AAAA,IACpD;AAEA,UAAM,kBAAkB,MAAM;AAC5B,iBAAW,EAAE,OAAO,QAAQ,KAAK,UAAU;AACzC,cAAM,aAAa,CAAC,GAAI,MAAM,WAAW,CAAC,MAAM,QAAQ,IAAI,CAAC,GAAI,GAAI,MAAM,eAAe,CAAC,CAAE;AAC7F,cAAM,QAAQ,WAAW,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,KAAK,SAAS,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;AACtG,gBAAQ,SAAS,CAAC;AAClB,gBAAQ,iBAAiB,yBAAyB,EAAE,QAAQ,CAAC,UAAU;AACrE,UAAC,MAA2B,WAAW,CAAC,SAAU,MAAsB,QAAQ,kBAAkB;AAAA,QACpG,CAAC;AAAA,MACH;AAAA,IACF;AACA,SAAK,iBAAiB,SAAS,CAAC,UAAU;AACxC,sBAAgB;AAChB,YAAM,SAAS,MAAM;AACrB,YAAM,UAAU,OAAO,QAAQ,uBAAuB;AACtD,eAAS,iBAAiB,uBAAuB,EAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,cAAc,CAAC;AACnG,eAAS,cAAc,uBAAuB,GAAG,OAAO;AAAA,IAC1D,CAAC;AACD,SAAK,iBAAiB,UAAU,eAAe;AAC/C,oBAAgB;AAEhB,SAAK,iBAAiB,UAAU,CAAC,UAAU;AACzC,YAAM,eAAe;AACrB,YAAM,YAAa,MAAsB;AACzC,YAAM,QAAQ,WAAW,QAAQ;AACjC,YAAM,SAAS,UAAU,SAAY,KAAK,QAAQ,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AAChH,UAAI,QAAQ,WAAW,aAAa,UAAU,QAAQ,oBAAoB,QAAQ;AAEhF,kBAAU,QAAQ,kBAAkB;AACpC,kBAAU,cAAc,OAAO;AAC/B,kBAAU,aAAa,aAAa,QAAQ;AAC5C;AAAA,MACF;AACA,WAAK,KAAK,MAAM,MAAM;AAAA,IACxB,CAAC;AAED,SAAK,gBAAgB,IAAI;AACzB,UAAM,QAAQ,KAAK,cAA2B,aAAa,KACtD,KAAK,cAA2B,4DAA4D;AACjG,WAAO,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACtC;AAEA,QAAM,cAAc,CAAC,UAA4C;AAC/D,UAAM,UAAU,GAAG,EAAE,IAAI,MAAM,IAAI;AAEnC,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,QAAQ,GAAG,OAAO;AACxB,YAAM,OAAO;AACb,YAAM,OAAO,MAAM;AACnB,YAAM,QAAQ,MAAM,SAAS;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,GAAG,OAAO,sBAAsB;AAChD,QAAI,MAAM,MAAO,SAAQ,QAAQ,QAAQ,MAAM;AAE/C,QAAI,MAAM,SAAS,WAAW;AAC5B,UAAI,MAAM,MAAO,SAAQ,YAAY,GAAG,KAAK,wBAAwB,MAAM,KAAK,CAAC;AACjF,cAAQ,YAAY,GAAG,KAAK,0BAA0B,MAAM,SAAS,EAAE,CAAC;AACxE,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,MAAM;AAClB,UAAI,CAAC,MAAM,MAAO;AAClB,YAAM,IAAI,GAAG,SAAS,wBAAwB,MAAM,KAAK;AACzD,QAAE,UAAU;AACZ,UAAI,MAAM,UAAU;AAClB,cAAM,SAAS,GAAG,QAAQ,2BAA2B,GAAG;AACxD,eAAO,aAAa,eAAe,MAAM;AACzC,UAAE,YAAY,MAAM;AAAA,MACtB;AACA,cAAQ,YAAY,CAAC;AAAA,IACvB;AAEA,UAAM,cAAwB,CAAC;AAC/B,UAAM,SAAS,CAAC,UAAsE;AACpF,YAAM,KAAK;AACX,YAAM,OAAO,MAAM;AACnB,YAAM,WAAW,MAAM;AACvB,UAAI,MAAM,UAAU;AAClB,YAAI,iBAAiB,kBAAmB,OAAM,WAAW;AAAA,YACpD,OAAM,WAAW;AACtB,cAAM,QAAQ,gBAAgB,OAAO,iBAAiB,iBAAiB;AAAA,MACzE;AACA,UAAI,MAAM,UAAW,OAAM,YAAY;AACvC,UAAI,MAAM,aAAc,OAAM,aAAa,gBAAgB,MAAM,YAAY;AAC7E,UAAI,MAAM,MAAO,OAAM,aAAa,gBAAgB,MAAM;AAAA,IAC5D;AAEA,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,YAAY;AACf,cAAM;AACN,cAAM,QAAQ,GAAG,YAAY,yBAAyB;AACtD,eAAO,KAAK;AACZ,cAAM,QAAQ,MAAM,SAAS;AAC7B,YAAI,MAAM,YAAa,OAAM,cAAc,MAAM;AACjD,YAAI,MAAM,KAAM,OAAM,OAAO,MAAM;AACnC,YAAI,MAAM,UAAW,OAAM,YAAY,MAAM;AAC7C,YAAI,MAAM,UAAW,OAAM,YAAY,MAAM;AAC7C,gBAAQ,YAAY,KAAK;AACzB;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM;AACN,cAAM,QAAQ,GAAG,UAAU,uBAAuB;AAClD,eAAO,KAAK;AACZ,cAAM,QAAQ,GAAG,UAAU,QAAW,MAAM,eAAe,EAAE;AAC7D,cAAM,QAAQ;AACd,cAAM,YAAY,KAAK;AACvB,mBAAW,UAAU,MAAM,WAAW,CAAC,GAAG;AACxC,gBAAM,IAAI,GAAG,UAAU,QAAW,OAAO,KAAK;AAC9C,YAAE,QAAQ,OAAO;AACjB,YAAE,WAAW,OAAO;AACpB,YAAE,WAAW,OAAO,UAAU,MAAM;AACpC,gBAAM,YAAY,CAAC;AAAA,QACrB;AACA,gBAAQ,YAAY,KAAK;AACzB;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,QAAQ,GAAG,YAAY,sBAAsB;AACnD,YAAI,MAAM,OAAO;AACf,gBAAM,SAAS,GAAG,UAAU,wBAAwB,MAAM,KAAK;AAC/D,cAAI,MAAM,SAAU,QAAO,YAAY,GAAG,QAAQ,2BAA2B,GAAG,CAAC;AACjF,gBAAM,YAAY,MAAM;AAAA,QAC1B;AACA,cAAM,UAAU,GAAG,OAAO,wBAAwB;AAClD,SAAC,MAAM,WAAW,CAAC,GAAG,QAAQ,CAAC,QAAQ,MAAM;AAC3C,gBAAM,SAAS,GAAG,SAAS,uBAAuB;AAClD,gBAAM,QAAQ,GAAG,OAAO;AACxB,gBAAM,OAAO;AACb,gBAAM,OAAO,MAAM;AACnB,gBAAM,QAAQ,OAAO;AACrB,gBAAM,KAAK,GAAG,OAAO,IAAI,CAAC;AAC1B,gBAAM,WAAW,MAAM;AACvB,gBAAM,WAAW,OAAO,YAAY,MAAM;AAC1C,gBAAM,UAAU,OAAO,UAAU,MAAM;AACvC,gBAAM,OAAO,GAAG,QAAQ,QAAW,OAAO,KAAK;AAC/C,cAAI,OAAO,YAAa,MAAK,YAAY,GAAG,QAAQ,qCAAqC,OAAO,WAAW,CAAC;AAC5G,iBAAO,OAAO,OAAO,IAAI;AACzB,kBAAQ,YAAY,MAAM;AAAA,QAC5B,CAAC;AACD,cAAM,YAAY,OAAO;AACzB,gBAAQ,YAAY,KAAK;AACzB;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AAEf,YAAI,MAAM,YAAa,OAAM;AAC7B,cAAM,SAAS,GAAG,SAAS,uBAAuB;AAClD,cAAM,QAAQ,GAAG,OAAO;AACxB,cAAM,OAAO;AACb,cAAM,QAAQ;AACd,eAAO,KAAK;AACZ,cAAM,UAAU,MAAM,UAAU;AAChC,YAAI,MAAM,UAAU;AAElB,gBAAM,aAAa,iBAAiB,MAAM;AAC1C,gBAAM,iBAAiB,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC;AAAA,QAC3D;AACA,cAAM,OAAO,GAAG,QAAQ,QAAW,MAAM,eAAe,MAAM,SAAS,EAAE;AACzE,YAAI,CAAC,MAAM,eAAe,MAAM,SAAU,MAAK,YAAY,GAAG,QAAQ,2BAA2B,GAAG,CAAC;AACrG,eAAO,OAAO,OAAO,IAAI;AACzB,gBAAQ,YAAY,MAAM;AAC1B;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,cAAM;AACN,cAAM,QAAQ,GAAG,SAAS,sBAAsB;AAChD,cAAM,OAAO;AACb,eAAO,KAAK;AACZ,cAAM,WAAW;AACjB,cAAM,WAAW,MAAM;AACvB,YAAI,MAAM,OAAQ,OAAM,SAAS,MAAM;AACvC,cAAM,YAAY,MAAM,YAAY,KAAK;AACzC,cAAM,WAAW,MAAM,YAAY,CAAC,MAAM;AAC1C,gBAAQ,YAAY,KAAK;AACzB,YAAI,MAAM,WAAW,CAAC,MAAM,UAAU;AACpC,gBAAM,cAAc,GAAG,SAAS,uBAAuB,OAAO,SAAS;AACvE,sBAAY,UAAU,GAAG,OAAO;AAChC,gBAAM,SAAS,GAAG,SAAS,sBAAsB;AACjD,iBAAO,OAAO;AACd,iBAAO,KAAK,GAAG,OAAO;AACtB,iBAAO,OAAO,MAAM;AACpB,iBAAO,SAAS;AAChB,iBAAO,aAAa,WAAW,MAAM,OAAO;AAC5C,kBAAQ,OAAO,aAAa,MAAM;AAAA,QACpC;AACA;AAAA,MACF;AAAA,MACA,KAAK,OAAO;AACV,cAAM;AACN,YAAI,MAAM,aAAa,MAAM,UAAU,SAAS,GAAG;AACjD,gBAAM,MAAM,GAAG,OAAO,sBAAsB;AAC5C,gBAAM,UAAU,GAAG,UAAU,uBAAuB;AACpD,kBAAQ,OAAO,GAAG,MAAM,IAAI;AAC5B,kBAAQ,aAAa,cAAc,MAAM,SAAS,MAAM,IAAI;AAC5D,kBAAQ,WAAW,MAAM;AACzB,qBAAW,KAAK,MAAM,WAAW;AAC/B,kBAAM,IAAI,GAAG,UAAU,QAAW,GAAG,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,GAAG;AAC1F,cAAE,QAAQ,EAAE;AACZ,cAAE,WAAW,EAAE,SAAS,MAAM;AAC9B,oBAAQ,YAAY,CAAC;AAAA,UACvB;AACA,gBAAM,QAAQ,GAAG,SAAS,sBAAsB;AAChD,gBAAM,OAAO;AACb,gBAAM,YAAY;AAClB,iBAAO,KAAK;AACZ,gBAAM,QAAQ,MAAM,SAAS;AAC7B,cAAI,MAAM,YAAa,OAAM,cAAc,MAAM;AACjD,cAAI,OAAO,SAAS,KAAK;AACzB,kBAAQ,YAAY,GAAG;AAAA,QACzB,OAAO;AACL,gBAAM,QAAQ,UAAU,OAAO,KAAK;AACpC,iBAAO,KAAK;AACZ,kBAAQ,YAAY,KAAK;AAAA,QAC3B;AACA;AAAA,MACF;AAAA,MACA,KAAK,OAAO;AACV,cAAM;AACN,cAAM,QAAQ,GAAG,SAAS,gDAAgD;AAC1E,cAAM,OAAO;AACb,cAAM,YAAY;AAClB,eAAO,KAAK;AACZ,cAAM,aAAa,gBAAgB,MAAM,gBAAgB,eAAe;AACxE,YAAI,MAAM,WAAW;AACnB,gBAAM,YAAY,MAAM;AACxB,gBAAM,YAAY,MAAM,aAAa,MAAM;AAAA,QAC7C;AACA,cAAM,UAAU,MAAM,WAAW;AACjC,cAAM,QAAQ,MAAM,SAAS;AAC7B,gBAAQ,YAAY,KAAK;AACzB;AAAA,MACF;AAAA,MACA,SAAS;AACP,cAAM;AACN,cAAM,QAAQ,CAAC,QAAQ,SAAS,YAAY,UAAU,QAAQ,OAAO,KAAK;AAC1E,cAAM,QAAQ,UAAU,OAAO,MAAM,SAAS,MAAM,IAAI,IAAI,MAAM,OAAO,MAAM;AAC/E,eAAO,KAAK;AACZ,gBAAQ,YAAY,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,MAAM,aAAa;AACrB,YAAM,OAAO,GAAG,KAAK,uBAAuB,MAAM,WAAW;AAC7D,WAAK,KAAK,GAAG,OAAO;AACpB,kBAAY,KAAK,KAAK,EAAE;AACxB,cAAQ,YAAY,IAAI;AAAA,IAC1B;AACA,QAAI,MAAM,MAAM;AACd,YAAM,OAAO,GAAG,KAAK,uBAAuB,MAAM,IAAI;AACtD,WAAK,KAAK,GAAG,OAAO;AACpB,kBAAY,KAAK,KAAK,EAAE;AACxB,cAAQ,YAAY,IAAI;AAAA,IAC1B;AACA,QAAI,MAAM,OAAO;AACf,YAAM,QAAQ,GAAG,KAAK,wBAAwB,MAAM,KAAK;AACzD,YAAM,KAAK,GAAG,OAAO;AACrB,kBAAY,KAAK,MAAM,EAAE;AACzB,cAAQ,YAAY,KAAK;AAAA,IAC3B;AACA,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,KAAK,QAAQ,iBAAiB,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,GAAG,aAAa,oBAAoB,YAAY,KAAK,GAAG,CAAC;AAAA,IACpI;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,OAAyB,SAAiB;AAC3D,UAAM,QAAQ,GAAG,SAAS,sBAAsB;AAChD,UAAM,OAAO;AACb,UAAM,QAAQ,MAAM,SAAS;AAC7B,QAAI,MAAM,YAAa,OAAM,cAAc,MAAM;AACjD,QAAI,MAAM,QAAS,OAAM,UAAU,MAAM;AACzC,QAAI,MAAM,cAAc;AACtB,YAAM,QAAQ,MAAM;AACpB,YAAM,iBAAiB,WAAW,MAAM;AACtC,YAAI,MAAM,SAAS,gBAAiB,OAAM,kBAAkB,MAAM,YAAa;AAAA,MACjF,CAAC;AACD,YAAM,iBAAiB,SAAS,MAAM,MAAM,kBAAkB,EAAE,CAAC;AAAA,IACnE;AACA,QAAI,MAAM,UAAW,OAAM,YAAY,MAAM;AAC7C,QAAI,MAAM,UAAW,OAAM,YAAY,MAAM;AAC7C,QAAI,MAAM,IAAK,OAAM,MAAM,MAAM;AACjC,QAAI,MAAM,IAAK,OAAM,MAAM,MAAM;AACjC,QAAI,SAAS,SAAU,OAAM,OAAO;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,CAAC,QAA2B,SAA0C;AACzF,UAAM,OAAQ,OAAO,QAAQ,CAAC;AAC9B,UAAM,MAAM,GAAG,OAAO,uBAAuB;AAE7C,UAAM,SAAS,CAAC,UAAkB;AAChC,UAAI,CAAC,OAAO,YAAa;AACzB,UAAI,QAAQ,MAAM,KAAK,KAAK,iBAAmC,oBAAoB,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,WAAW,KAAK;AACpI,UAAI,CAAC,OAAO;AACV,gBAAQ,GAAG,OAAO;AAClB,cAAM,OAAO;AACb,cAAM,OAAO,OAAO;AACpB,aAAK,YAAY,KAAK;AAAA,MACxB;AACA,YAAM,QAAQ;AAAA,IAChB;AAEA,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AAAA,MACL,KAAK,mBAAmB;AACtB,cAAM,MAAM,GAAG,UAAU,wDAAwD,OAAO,QAAQ,SAAS,OAAO,OAAO;AACvH,YAAI,OAAO;AACX,cAAM,KAAK,YAAY;AACrB,cAAI,WAAW;AACf,cAAI;AACF,kBAAMA,WAAU,MAAM,gBAAgB,IAAI;AAC1C,kBAAM,YAAYA,SAAQ;AAC1B,gBAAI,QAAQA,SAAQ;AACpB,kBAAM,aAAa,OAAO,SAAS,iBAAiB,MAAM,aAAa,SAAS,IAAI,MAAM,iBAAiB,SAAS;AACpH,mBAAO,UAAU;AACjB,kBAAM,SAAS,KAAK;AACpB,gBAAI,QAAQ,OAAO;AACjB,oBAAM,aAAc,KAAK,MAAM,UAAU,EAAkD;AAC3F,oBAAM,OAAO,eAAe,aAAa,OAAO,WAAW,eAAe,mBAAmB,OAAO,gBAAgB,OAAO;AAC3H,eAAC,kBAAU,CAAC,IAAG,OAAO,KAAK,IAAI,QAAQ;AAAA,YACzC;AACA,kBAAM,KAAK,MAAM,OAAO,QAAQ,KAAK;AAAA,UACvC,SAAS,OAAO;AACd,gBAAI,WAAW;AACf,gBAAI,cAAc,OAAO;AACzB,oBAAQ,UAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,GAAG,OAAO;AAAA,UACtF;AAAA,QACF;AACA,YAAI,iBAAiB,SAAS,MAAM,KAAK,GAAG,CAAC;AAC7C,YAAI,YAAY,GAAG;AACnB,YAAI,OAAO,wBAAwB,YAAa,gBAAe,MAAM,KAAK,GAAG,CAAC;AAC9E,eAAO;AAAA,MACT;AAAA,MACA,KAAK,wBAAwB;AAE3B,cAAMA,WAAW,KAAK,WAAW,CAAC;AAClC,cAAM,YAAY,OAAO,KAAK,oBAAoB,WAAWA,SAAQ,KAAK,eAAe,IAAI;AAC7F,cAAM,QAAQ,OAAO,KAAK,mBAAmB,WAAW,KAAK,iBAAiB;AAC9E,cAAM,WAAW,OAAO,kBAA2B;AACjD,gBAAM,SAAS,IAAI,SAAS;AAC5B,cAAI,cAAe,QAAO,IAAI,OAAO,aAAa,OAAO,KAAK,OAAO,SAAS,CAAC;AAC/E,qBAAW,MAAM,IAAI;AACrB,cAAI;AACF,kBAAM,KAAK,QAAQ,UAAU;AAAA,UAC/B,SAAS,OAAO;AACd,uBAAW,MAAM,KAAK;AACtB,iBAAK,KAAK;AAAA,UACZ;AAAA,QACF;AACA,cAAM,QAAQ,YAAY;AACxB,gBAAM,WAAW,OAAO,KAAK,SAAS,CAAC;AACvC,gBAAM,OAAQ,OAA8C,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,SAAS;AAGrH,cAAI,CAAC,KAAM,OAAM,IAAI,MAAM,6CAA6C;AACxE,gBAAM,UAAU,IAAI,KAAK;AAAA,YACvB,GAAGA;AAAA,YACH,WAAW,MAAM,KAAK,SAAS,IAAI;AAAA,YACnC,SAAS,MAAM,KAAK,SAAS,KAAK;AAAA,YAClC,SAAS,MAAM;AAAA,UACjB,CAAC;AACD,kBAAQ,QAAQ;AAChB,kBAAQ,KAAK;AACb,iBAAO;AAAA,QACT;AACA,YAAI;AACJ,cAAM,OAAO,MAAM;AACjB,cAAI,UAAU;AACZ,iBAAK,SAAS,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC;AAClC;AAAA,UACF;AACA,qBAAW,MAAM;AACjB,mBAAS,MAAM,CAAC,UAAU;AACxB,uBAAW;AACX,iBAAK,KAAK;AAAA,UACZ,CAAC;AAAA,QACH;AACA,YAAI,OAAO,QAAQ;AACjB,gBAAM,SAAS,GAAG,UAAU,gDAAgD,OAAO,OAAO,IAAI,IAAI,OAAO,OAAO,KAAK;AACrH,iBAAO,OAAO;AACd,iBAAO,iBAAiB,SAAS,IAAI;AACrC,cAAI,YAAY,MAAM;AAAA,QACxB;AACA,aAAK;AACL,eAAO;AAAA,MACT;AAAA,MACA,KAAK,WAAW;AACd,cAAM,SAAS,GAAG,OAAO,wBAAwB;AACjD,YAAI,YAAY,MAAM;AACtB,aAAK,cAAc,QAAQ,MAAM,CAAC,UAAU;AAC1C,iBAAO,KAAK;AACZ,cAAI,OAAO,OAAQ,MAAK,KAAK,MAAM,OAAO,MAAM;AAAA,QAClD,CAAC,EAAE,MAAM,CAAC,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,GAAG,OAAO,CAAC;AACzG,eAAO;AAAA,MACT;AAAA,MACA,KAAK,MAAM;AACT,cAAM,KAAK,GAAG,OAAO,mBAAmB;AACxC,YAAI,OAAO,KAAK,UAAU,UAAU;AAClC,gBAAM,MAAM,GAAG,KAAK;AACpB,cAAI,MAAM,KAAK;AACf,cAAI,MAAM;AACV,aAAG,YAAY,GAAG;AAAA,QACpB;AACA,YAAI,OAAO,KAAK,WAAW,UAAU;AACnC,cAAI,OAAO,KAAK,gBAAgB,SAAU,IAAG,YAAY,GAAG,QAAQ,uBAAuB,KAAK,WAAW,CAAC;AAC5G,aAAG,YAAY,GAAG,QAAQ,uBAAuB,KAAK,MAAM,CAAC;AAAA,QAC/D,WACS,OAAO,KAAK,UAAU,YAAY,OAAO,KAAK,UAAU,SAAU,IAAG,YAAY,GAAG,QAAQ,uBAAuB,KAAK,KAAK,CAAC;AACvI,YAAI,YAAY,EAAE;AAClB,eAAO;AAAA,MACT;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,IAAI,CAAC;AACpE,cAAM,OAAO,GAAG,MAAM,sBAAsB;AAC5C,cAAM,QAAQ,CAAC,MAAM,KAAK,YAAY,GAAG,MAAM,QAAW,CAAC,CAAC,CAAC;AAC7D,cAAM,OAAO,GAAG,UAAU,yBAAyB,OAAO,IAAI;AAC9D,aAAK,OAAO;AACZ,aAAK,iBAAiB,SAAS,MAAM;AACnC,eAAK,UAAU,WAAW,UAAU,MAAM,KAAK,IAAI,CAAC,EAAE,KAAK,MAAO,KAAK,cAAc,OAAO,MAAO;AAAA,QACrG,CAAC;AACD,YAAI,OAAO,MAAM,IAAI;AACrB,eAAO;AAAA,MACT;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,UAAU,KAAK,IAAI,GAAG,OAAO,KAAK,eAAe,KAAK,CAAC;AAC7D,cAAM,SAAS,OAAO,KAAK,UAAU,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,MAAO;AAC3F,cAAM,WAAW,SAAS;AAC1B,eAAO,KAAK,OAAO,YAAY,MAAM;AACnC,cAAI,KAAK,IAAI,IAAI,QAAQ;AACvB,wBAAY;AACZ;AAAA,UACF;AACA,cAAI,CAAC,WAAW,SAAS,OAAQ;AACjC,eAAK,OAAO,WAAW,QAAQ,SAAS,EAAE,KAAK,OAAO,QAAQ;AAC5D,gBAAI,IAAI,WAAW,iBAAiB,IAAI,gBAAgB,UAAU;AAChE,0BAAY;AACZ,oBAAM,KAAK,IAAI,SAAS,GAAG,MAAM;AAAA,YACnC;AAAA,UACF,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,QAC1B,GAAG,UAAU,GAAI,CAAC;AAClB,eAAO;AAAA,MACT;AAAA,MACA;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,kBAAkB,OAAO,SAAkC;AAC/D,QAAI,KAAK,UAAW,QAAO,EAAE,WAAW,KAAK,WAAsC,OAAO,OAAU;AACpG,UAAM,MAAM,OAAO,KAAK,UAAU;AAClC,UAAM,WAAW,YAAY,KAAK,GAAG,IAAI,MAAM,GAAG,OAAO,SAAS,GAAG,IAAI,WAAW,GAAG,IAAI,KAAK,GAAG,GAAG,GAAG;AACzG,UAAM,SAAS,OAAO,KAAK,iBAAiB,MAAM,EAAE,YAAY;AAChE,UAAM,WAAW,MAAM,MAAM,UAAU;AAAA,MACrC;AAAA,MACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,WAAW,QAAQ,SAAY,KAAK,UAAU,KAAK,eAAe,CAAC,CAAC;AAAA,MAC1E,aAAa;AAAA,IACf,CAAC;AACD,QAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,OAAO,MAAM;AAC/C,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,QAAgC,CAAC;AACvC,QAAI,OAAO,KAAK,eAAe,YAAY,OAAO,KAAK,YAAY,YAAY,KAAK,KAAK,UAAU,KAAK,MAAM;AAC5G,YAAM,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;AAAA,IACpD;AACA,WAAO,EAAE,WAAY,KAAK,WAAW,MAAkC,MAAM;AAAA,EAC/E;AAEA,QAAM,aAAa,CAAC,SAAiB;AACnC,UAAM,UAAU,GAAG,OAAO,qBAAqB;AAC/C,YAAQ,YAAY;AACpB,YAAQ,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;AAC5D,YAAQ,iBAAiB,UAAU,CAAC,UAAU;AAC5C,YAAM,OAAO,MAAM;AACnB,YAAM,eAAe;AACrB,YAAM,YAAa,MAAsB;AACzC,YAAM,OAAO,IAAI,SAAS,IAAI;AAC9B,UAAI,WAAW,KAAM,MAAK,OAAO,UAAU,MAAM,UAAU,KAAK;AAChE,WAAK,OAAO,4BAA4B;AACxC,iBAAW,MAAM,IAAI;AACrB,WAAK,IAAI,EAAE,MAAM,CAAC,UAAU;AAC1B,mBAAW,MAAM,KAAK;AACtB,aAAK,KAAK;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AACD,SAAK,gBAAgB,OAAO;AAAA,EAC9B;AAEA,QAAM,QAAQ,UAAU,KAAK,QAAQ,OAAO,IAAI,MAAM;AAEtD,SAAO;AAAA,IACL,IAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AACR,kBAAY;AACZ,kBAAY;AACZ,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAyB;AAC9C,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAM,SAAS,gBAAgB,gBAAgB,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI;AACvE,SAAO,OAAO,QAAQ,CAAC,SAAS;AAC9B,UAAM,QAAQ;AACd,QAAI,MAAM,SAAU,QAAO,CAAC;AAC5B,QAAI,MAAM,SAAS,cAAc,MAAM,SAAS,QAAS,QAAO,MAAM,UAAU,CAAC,MAAM,KAAK,IAAI,CAAC;AACjG,QAAI,iBAAiB,qBAAqB,MAAM,SAAU,QAAO,MAAM,KAAK,MAAM,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;AACrH,WAAO,CAAC,MAAM,KAAK;AAAA,EACrB,CAAC;AACH;AAEA,IAAM,gBAAgB,oBAAI,IAA2B;AAErD,SAAS,WAAW,KAA4B;AAC9C,MAAI,UAAU,cAAc,IAAI,GAAG;AACnC,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,QAAc,CAAC,SAAS,WAAW;AAC/C,YAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,UAAI,MAAM;AACV,UAAI,QAAQ;AACZ,UAAI,SAAS,MAAM,QAAQ;AAC3B,UAAI,UAAU,MAAM;AAClB,sBAAc,OAAO,GAAG;AACxB,eAAO,IAAI,MAAM,6CAA6C,CAAC;AAAA,MACjE;AACA,eAAS,KAAK,YAAY,GAAG;AAAA,IAC/B,CAAC;AACD,kBAAc,IAAI,KAAK,OAAO;AAAA,EAChC;AACA,SAAO;AACT;AAEA,IAAM,kBAAmE;AAAA,EACvE,WAAW,EAAE,KAAK,mEAAmE,QAAQ,aAAa;AAAA,EAC1G,UAAU,EAAE,KAAK,4DAA4D,QAAQ,WAAW;AAAA,EAChG,WAAW,EAAE,KAAK,iFAAiF,QAAQ,YAAY;AACzH;AAQA,eAAe,cAAc,QAAqB,MAA+B,MAA8C;AAC7H,QAAM,WAAW,OAAO,KAAK,YAAY,WAAW,EAAE,YAAY;AAClE,QAAM,SAAS,gBAAgB,QAAQ;AACvC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,qBAAqB,QAAQ,mBAAmB;AAC7E,QAAM,IAAI;AACV,MAAI,CAAC,EAAE,OAAO,MAAM,GAAG;AACrB,UAAM,WAAW,iBAAiB,KAAK,IAAI,CAAC;AAC5C,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,QAAE,QAAQ,IAAI,MAAM,QAAQ;AAC5B,YAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,UAAI,MAAM,OAAO,MAAM,YAAY,KAAK,WAAW,OAAO,mBAAmB,OAAO,KAAK,QAAQ,CAAC,CAAC,KAAK;AACxG,UAAI,QAAQ;AACZ,UAAI,UAAU,MAAM,OAAO,IAAI,MAAM,iCAAiC,CAAC;AACvE,eAAS,KAAK,YAAY,GAAG;AAAA,IAC/B,CAAC;AAAA,EACH;AACA,QAAM,MAAM,EAAE,OAAO,MAAM;AAC3B,QAAM,UAAU,OAAO,KAAK,WAAW,EAAE;AACzC,MAAI,aAAa,eAAe,KAAK,YAAY,QAAQ,IAAI,SAAS;AACpE,QAAI,QAAQ,MAAM,KAAK,IAAI,QAAS,SAAS,EAAE,QAAQ,OAAO,KAAK,UAAU,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;AACpG;AAAA,EACF;AACA,MAAI,OAAO,QAAQ;AAAA,IACjB,SAAS;AAAA,IACT,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,UAAU,CAAC,UAAkB,KAAK,KAAK;AAAA,EACzC,CAAC;AACH;;;ALp0BI;AArBJ,IAAM,mBAAe,4BAAwC,IAAI;AAiB1D,SAAS,cAAc,EAAE,QAAQ,SAAS,GAAuB;AACtE,QAAM,aAAS,sBAAQ,MAAM,IAAI,YAAY,MAAM,GAAG,CAAC,MAAM,CAAC;AAE9D,SACE,4CAAC,aAAa,UAAb,EAAsB,OAAO,EAAE,OAAO,GACpC,UACH;AAEJ;AAKO,SAAS,WAAwB;AACtC,QAAM,cAAU,yBAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO,QAAQ;AACjB;AAwEO,SAAS,WAAW,SAA8C;AACvE,QAAM,SAAS,SAAS;AACxB,QAAM,CAAC,SAAS,UAAU,QAAI,uBAA6B,IAAI;AAC/D,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,IAAI;AAC/C,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAS,KAAK;AACtD,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAA4B,IAAI;AAC1D,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAkC,QAAQ,iBAAiB,CAAC,CAAC;AACzF,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAiC,CAAC,CAAC;AAGzE,8BAAU,MAAM;AACd,QAAI,YAAY;AAEhB,mBAAe,eAAe;AAC5B,UAAI;AACF,qBAAa,IAAI;AACjB,iBAAS,IAAI;AACb,cAAM,OAAO,MAAM,OAAO,WAAW,QAAQ,IAAI;AACjD,YAAI,CAAC,WAAW;AACd,qBAAW,IAAI;AAAA,QACjB;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,CAAC,WAAW;AACd,mBAAS,eAAe,aAAa,MAAM,IAAI,WAAW,OAAO,GAAG,GAAG,CAAC,CAAC;AAAA,QAC3E;AAAA,MACF,UAAE;AACA,YAAI,CAAC,WAAW;AACd,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,iBAAa;AAEb,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,IAAI,CAAC;AAEzB,QAAM,eAAW,0BAAY,CAAC,OAAe,UAAmB;AAC9D,cAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,EAAE;AAEjD,mBAAe,CAAC,SAAS;AACvB,UAAI,KAAK,KAAK,GAAG;AACf,cAAM,EAAE,CAAC,KAAK,GAAG,GAAG,GAAG,KAAK,IAAI;AAChC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS,0BAAY,YAA8C;AACvE,QAAI,CAAC,QAAS,QAAO;AAErB,QAAI;AACF,sBAAgB,IAAI;AACpB,eAAS,IAAI;AACb,qBAAe,CAAC,CAAC;AAEjB,YAAM,SAAS,MAAM,OAAO,OAAO,QAAQ,MAAM,MAAM;AAEvD,UAAI,OAAO,SAAS;AAClB,gBAAQ,YAAY,MAAM;AAAA,MAC5B;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,YAAY,eAAe,aAAa,MAAM,IAAI,WAAW,OAAO,GAAG,GAAG,CAAC;AACjF,eAAS,SAAS;AAClB,UAAI,UAAU,aAAa;AACzB,uBAAe,UAAU,WAAW;AAAA,MACtC;AACA,cAAQ,UAAU,SAAS;AAC3B,aAAO;AAAA,IACT,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,SAAS,MAAM,CAAC;AAErC,QAAM,YAAQ,0BAAY,MAAM;AAC9B,cAAU,QAAQ,iBAAiB,CAAC,CAAC;AACrC,mBAAe,CAAC,CAAC;AACjB,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,QAAQ,aAAa,CAAC;AAE1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AA+CO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB;AACF,GAAqB;AACnB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,EAAE,MAAM,WAAW,QAAQ,CAAC;AAE3C,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAkC,IAAI;AAExE,QAAM,mBAAe,0BAAY,OAAO,MAAiB;AACvD,MAAE,eAAe;AACjB,UAAM,SAAS,MAAM,OAAO;AAC5B,QAAI,QAAQ,WAAW,oBAAoB;AACzC,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,QAAQ,kBAAkB,CAAC;AAE/B,MAAI,WAAW;AACb,WAAO,4CAAC,SAAI,WAAuB,uBAAY;AAAA,EACjD;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO,4CAAC,SAAI,WAAsB,+BAAiB;AAAA,EACrD;AAEA,MAAI,WAAW;AACb,QAAI,eAAe;AACjB,aAAO,2EAAG,wBAAc,SAAS,GAAE;AAAA,IACrC;AACA,WACE,4CAAC,SAAI,WACH,sDAAC,OAAG,oBAAU,WAAW,kCAAiC,GAC5D;AAAA,EAEJ;AAEA,SACE,6CAAC,UAAK,UAAU,cAAc,WAC3B;AAAA,YAAQ,OAAO,IAAI,CAAC,UAAU;AAC7B,YAAM,aAA+B;AAAA,QACnC,OAAO,OAAO,MAAM,IAAI;AAAA,QACxB,UAAU,CAAC,UAAU,SAAS,MAAM,MAAM,KAAK;AAAA,QAC/C,OAAO,YAAY,MAAM,IAAI;AAAA,MAC/B;AAEA,UAAI,aAAa;AACf,eAAO,4CAAC,aAAAC,QAAM,UAAN,EAAiC,sBAAY,OAAO,UAAU,KAA1C,MAAM,IAAsC;AAAA,MAC1E;AAEA,aACE,4CAAC,gBAA8B,OAAe,GAAG,cAA9B,MAAM,IAAoC;AAAA,IAEjE,CAAC;AAAA,IAEA,SAAS,CAAC,MAAM,eACf,4CAAC,SAAI,OAAO,EAAE,OAAO,OAAO,cAAc,OAAO,GAC9C,gBAAM,SACT;AAAA,IAGD,eACC,aAAa,EAAE,cAAc,SAAS,MAAM,OAAO,EAAE,CAAC,IAEtD,4CAAC,YAAO,MAAK,UAAS,UAAU,cAC7B,yBAAe,kBAAkB,YACpC;AAAA,KAEJ;AAEJ;AAUA,SAAS,aAAa,EAAE,OAAO,OAAO,UAAU,MAAM,GAAsB;AAC1E,QAAM,KAAK,eAAe,MAAM,IAAI;AAEpC,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM;AAAA,IACnB,oBAAoB,MAAM,cAAc,GAAG,EAAE,UAAU;AAAA,IACvD,gBAAgB,CAAC,CAAC;AAAA,EACpB;AAEA,MAAI;AAEJ,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,cACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAQ,SAAoB;AAAA,UAC5B,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,MAAM;AAAA;AAAA,MACR;AAEF;AAAA,IAEF,KAAK;AACH,cACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAQ,SAAoB;AAAA,UAC5B,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UAExC;AAAA,wDAAC,YAAO,OAAM,IAAG,uBAAS;AAAA,YACzB,MAAM,SAAS,IAAI,CAAC,QACnB,4CAAC,YAAuB,OAAO,IAAI,OAChC,cAAI,SADM,IAAI,KAEjB,CACD;AAAA;AAAA;AAAA,MACH;AAEF;AAAA,IAEF,KAAK;AACH,cACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,MAAK;AAAA,UACL,SAAS,CAAC,CAAC;AAAA,UACX,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,OAAO;AAAA;AAAA,MAC5C;AAEF;AAAA,IAEF,KAAK;AACH,cACE,4CAAC,SAAI,MAAK,cACP,gBAAM,SAAS,IAAI,CAAC,QACnB,6CAAC,WACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAM,MAAM;AAAA,YACZ,OAAO,IAAI;AAAA,YACX,SAAS,UAAU,IAAI;AAAA,YACvB,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA;AAAA,QAC1C;AAAA,QACC,IAAI;AAAA,WARK,IAAI,KAShB,CACD,GACH;AAEF;AAAA,IAEF;AACE,cACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,MAAM,MAAM;AAAA,UACZ,OAAQ,SAAoB;AAAA,UAC5B,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,WAAW,MAAM,YAAY;AAAA,UAC7B,WAAW,MAAM,YAAY;AAAA,UAC7B,SAAS,MAAM,YAAY;AAAA,UAC3B,KAAK,MAAM,YAAY;AAAA,UACvB,KAAK,MAAM,YAAY;AAAA;AAAA,MACzB;AAAA,EAEN;AAEA,SACE,6CAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,iDAAC,WAAM,SAAS,IAAI,OAAO,EAAE,SAAS,SAAS,cAAc,UAAU,GACpE;AAAA,YAAM;AAAA,MACN,MAAM,YAAY,4CAAC,UAAK,OAAO,EAAE,OAAO,MAAM,GAAG,gBAAE;AAAA,OACtD;AAAA,IACC;AAAA,IACA,MAAM,eACL,4CAAC,WAAM,IAAI,GAAG,EAAE,SAAS,OAAO,EAAE,SAAS,SAAS,OAAO,OAAO,GAC/D,gBAAM,aACT;AAAA,IAED,SACC,4CAAC,WAAM,OAAO,EAAE,SAAS,SAAS,OAAO,MAAM,GAC5C,iBACH;AAAA,KAEJ;AAEJ;AAoCO,SAAS,QAAQ,EAAE,WAAW,OAAO,GAAG,QAAQ,GAAiB;AACtE,QAAM,SAAS,SAAS;AACxB,QAAM,WAAO,qBAAuB,IAAI;AACxC,QAAM,aAAS,qBAAO,OAAO;AAC7B,SAAO,UAAU;AAEjB,8BAAU,MAAM;AACd,QAAI,CAAC,KAAK,QAAS;AACnB,UAAM,QAAQ,aAAa,KAAK,SAAS;AAAA,MACvC;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB,OAAO,QAAQ;AAAA,MACf,gBAAgB,QAAQ;AAAA,MACxB,OAAO,QAAQ;AAAA,MACf,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,CAAC,MAAM,OAAO,QAAQ,SAAS,CAAC;AAAA,MACxC,YAAY,CAAC,MAAM,OAAO,QAAQ,aAAa,CAAC;AAAA,MAChD,SAAS,CAAC,GAAG,MAAM,OAAO,QAAQ,UAAU,GAAG,CAAC;AAAA,MAChD,YAAY,OAAO,QAAQ,aAAa,CAAC,KAAK,MAAM,OAAO,QAAQ,aAAa,KAAK,CAAC,IAAI;AAAA,IAC5F,CAAC;AACD,WAAO,MAAM,MAAM,QAAQ;AAAA,EAG7B,GAAG,CAAC,QAAQ,QAAQ,MAAM,QAAQ,SAAS,SAAS,CAAC;AAErD,SAAO,4CAAC,SAAI,KAAK,MAAM,WAAsB,OAAc;AAC7D;AAqCO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,QAAQ;AAAA,EACR,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,SAAS,SAAS;AACxB,QAAM,MAAM,OAAO,YAAY,MAAM,EAAE,OAAO,WAAW,CAAC;AAE1D,8BAAU,MAAM;AACd,QAAI,CAAC,WAAY;AAEjB,UAAM,gBAAgB,CAAC,UAAwB;AAE7C,UAAI,CAAC,OAAO,cAAc,IAAI,EAAE,WAAW,MAAM,MAAM,GAAG;AACxD;AAAA,MACF;AAEA,UAAI,MAAM,MAAM,SAAS,kBAAkB;AACzC,mBAAW,MAAM,KAAK,MAAM;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,QAAQ,MAAM,UAAU,CAAC;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,GAAG;AAAA,MACL;AAAA,MACA,OAAO,kBAAkB,IAAI;AAAA,MAC7B,OAAM;AAAA;AAAA,EACR;AAEJ;","names":["options","React"]}
|