@telia-ace/widget-conversation 1.0.14 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/LICENSE.txt +5 -5
  2. package/README.md +256 -256
  3. package/dist/agent.d.ts +17 -17
  4. package/dist/conversation-controller.d.ts +88 -88
  5. package/dist/conversation-form-adapter.d.ts +7 -7
  6. package/dist/conversation-platform.d.ts +50 -49
  7. package/dist/conversation-provider.d.ts +22 -22
  8. package/dist/conversation.js +6 -805
  9. package/dist/conversation.js.map +1 -1
  10. package/dist/index.d.ts +9 -9
  11. package/dist/index.js +9 -866
  12. package/dist/index.js.map +1 -1
  13. package/dist/index2.js +1678 -0
  14. package/dist/index2.js.map +1 -0
  15. package/dist/resolve-entity-value.d.ts +10 -10
  16. package/dist/return-button.js.map +1 -1
  17. package/dist/types.d.ts +110 -110
  18. package/dist/ui/conversation/conversation-component.d.ts +37 -37
  19. package/dist/ui/conversation/conversation-content.d.ts +12 -11
  20. package/dist/ui/conversation/conversation-input.d.ts +6 -6
  21. package/dist/ui/conversation/conversation-loader.d.ts +8 -8
  22. package/dist/ui/conversation/conversation-message.d.ts +7 -7
  23. package/dist/ui/conversation/conversation-styles.d.ts +11 -11
  24. package/dist/ui/conversation/conversation.d.ts +6 -6
  25. package/dist/ui/conversation/index.d.ts +3 -2
  26. package/dist/ui/conversation/message-types/agent.d.ts +11 -11
  27. package/dist/ui/conversation/message-types/custom-message-list-item.d.ts +9 -9
  28. package/dist/ui/conversation/message-types/custom.d.ts +9 -9
  29. package/dist/ui/conversation/message-types/index.d.ts +5 -5
  30. package/dist/ui/conversation/message-types/system.d.ts +12 -12
  31. package/dist/ui/conversation/message-types/timestamp.d.ts +8 -8
  32. package/dist/ui/conversation/message-types/user.d.ts +8 -8
  33. package/dist/ui/index.d.ts +2 -2
  34. package/dist/ui/return-button/index.d.ts +2 -2
  35. package/dist/ui/return-button/return-button-component.d.ts +19 -19
  36. package/dist/ui/return-button/return-button.d.ts +6 -6
  37. package/dist/user.d.ts +7 -7
  38. package/dist/utils/custom-message.d.ts +3 -3
  39. package/dist/utils/index.d.ts +1 -1
  40. package/dist/utils/open-chat-widget.d.ts +4 -4
  41. package/package.json +8 -8
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/agent.ts","../src/conversation-provider.ts","../src/user.ts","../src/conversation-controller.ts","../src/utils/open-chat-widget.ts","../src/conversation-platform.ts","../src/types.ts","../src/ui/conversation/conversation-component.ts","../src/ui/return-button/return-button-component.ts","../src/utils/custom-message.ts"],"sourcesContent":["import { Symbol } from '@telia-ace/widget-ui';\r\nimport {\r\n ConversationEntry,\r\n ConversationMessageType,\r\n getNormalizedMessageSettings,\r\n} from './conversation-controller';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport {\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n ConverstationMessageItem,\r\n} from './types';\r\n\r\nexport type AgentSettings = {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n};\r\n\r\nexport class Agent {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n\r\n constructor(private provider: ConversationProvider, settings: AgentSettings) {\r\n this.name = settings.name;\r\n this.avatar = settings.avatar;\r\n }\r\n\r\n print = (\r\n settings:\r\n | string\r\n | ConversationMessageSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ): ConversationEntry | undefined => {\r\n const sender: ConversationMessageSender = { name: this.name, avatar: this.avatar };\r\n const normalized = getNormalizedMessageSettings(settings);\r\n\r\n return this.provider.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.Agent,\r\n sender,\r\n normalized.timestamp\r\n );\r\n };\r\n typing = () => {\r\n return this.provider.setTypingState({ name: this.name, avatar: this.avatar });\r\n };\r\n\r\n update(settings: AgentSettings): void {\r\n const { name, avatar } = settings;\r\n if (avatar === null) {\r\n this.avatar = undefined;\r\n } else if (avatar) {\r\n this.avatar = avatar;\r\n }\r\n\r\n if (name === null) {\r\n this.name = undefined;\r\n } else if (name) {\r\n this.name = name;\r\n }\r\n }\r\n}\r\n","import {\r\n Container,\r\n EventListener,\r\n EventObject,\r\n EventSubscriptionCancellation,\r\n} from '@webprovisions/platform';\r\nimport { Agent, AgentSettings } from './agent';\r\nimport {\r\n CancelLoaderDelegate,\r\n ConversationController,\r\n ConversationEntry,\r\n ConversationMessageType,\r\n} from './conversation-controller';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n} from './types';\r\n\r\nexport class ConversationProvider {\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n public user: any;\r\n\r\n private constructor(\r\n public name: string,\r\n private container: Container,\r\n public controller: ConversationController | null\r\n ) {\r\n this.user = controller?.user;\r\n }\r\n\r\n static create(name: string, container: Container, controller: ConversationController) {\r\n return new ConversationProvider(name, container, controller);\r\n }\r\n\r\n createAgent(settings: AgentSettings = {}): Agent | undefined {\r\n if (this.controller) {\r\n return new Agent(this, settings);\r\n }\r\n }\r\n\r\n print(settings: string | ConversationMessageSettings): ConversationEntry | undefined {\r\n return this.controller?.print(settings);\r\n }\r\n\r\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\r\n return this.controller?.setTypingState(sender, type);\r\n }\r\n\r\n loading(): CancelLoaderDelegate {\r\n if (!this.controller) {\r\n return () => () => {};\r\n }\r\n return this.controller.loader();\r\n }\r\n\r\n createEntry(\r\n key: string,\r\n content: ConversationMessageContent,\r\n type: ConversationMessageType,\r\n sender?: ConversationMessageSender,\r\n timestamp?: number | null\r\n ) {\r\n return this.controller?.createEntry(key, content, type, sender, timestamp);\r\n }\r\n\r\n dispose() {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.log(`conversation-provider: dispose (${this.name})`);\r\n }\r\n this.controller?.disposeProvider(this);\r\n this.controller = null;\r\n this.subscriptions.forEach((unsub) => unsub());\r\n }\r\n\r\n onUnreadMessage(fn: EventListener): EventSubscriptionCancellation | void {\r\n if (this.controller) {\r\n const unsubscribe = this.controller?.onUnreadMessage(fn);\r\n this.subscriptions.push(unsubscribe);\r\n return () => {\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n\r\n onMounted(fn: EventListener): EventSubscriptionCancellation | void {\r\n if (this.controller) {\r\n const unsubscribe = this.controller?.events.subscribe(\r\n 'conversation:component-mount-changed',\r\n fn\r\n );\r\n this.subscriptions.push(unsubscribe);\r\n fn({} as EventObject, this.controller.getComponentMountedState());\r\n return () => {\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n}\r\n\r\nexport default ConversationProvider;\r\n","import {\r\n ConversationController,\r\n ConversationEntry,\r\n ConversationMessageType,\r\n getNormalizedMessageSettings,\r\n} from './conversation-controller';\r\nimport { ConversationMessageSettings } from './types';\r\n\r\nexport class User {\r\n constructor(private controller: ConversationController) {}\r\n\r\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\r\n const normalized = getNormalizedMessageSettings(settings);\r\n return this.controller.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.User,\r\n undefined,\r\n normalized.timestamp\r\n );\r\n };\r\n}\r\n","import { FormBuilder } from '@telia-ace/widget-forms';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventListener, EventManager, Widget } from '@webprovisions/platform';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport {\r\n ConversationMessageContent,\r\n ConversationMessageSender,\r\n ConversationMessageSettings,\r\n ConversationMessageUpdateSettings,\r\n ConverstationMessageItem,\r\n NormalizedMessageSettings,\r\n} from './types';\r\nimport { User } from './user';\r\nexport type ValidateHandler = (formValues: { [key: string]: any }) => Promise<any>;\r\n\r\nexport type SubmitHandler = (formValues: { [key: string]: any }) => Promise<any>;\r\n\r\nexport type Print = (content: string | ConversationMessageContent) => ConversationEntry;\r\n\r\nexport type FormHandlers = { [key: string]: FormHandler };\r\nexport type FormHandler = { validate?: ValidateHandler; submit: SubmitHandler };\r\n\r\nexport type CancelLoaderDelegate = () => void;\r\n\r\nexport class ConversationEntry {\r\n constructor(private writer: EntryWriter) {}\r\n\r\n update(\r\n content:\r\n | string\r\n | ConversationMessageUpdateSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ) {\r\n const normalized = this.getNormalizedSettings(content);\r\n // const normalized = typeof content === 'string' ? { body: content } : content;\r\n this.writer(<ConversationMessageUpdateSettings>normalized);\r\n }\r\n\r\n remove() {\r\n this.writer(null);\r\n }\r\n\r\n private getNormalizedSettings(\r\n content:\r\n | string\r\n | ConversationMessageUpdateSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n ) {\r\n if (typeof content === 'string') return { body: content };\r\n else if (content.length > -1 && typeof content === 'object') return { items: content };\r\n else return content;\r\n }\r\n}\r\n\r\nexport enum ConversationMessageType {\r\n User = 'user',\r\n Agent = 'agent',\r\n System = 'system',\r\n}\r\n\r\nexport type ConversationMessage = {\r\n key: string;\r\n timestamp: number | null;\r\n content: ConversationMessageContent | null;\r\n sender: ConversationMessageSender | null;\r\n type: ConversationMessageType;\r\n};\r\n\r\nexport type EntryWriter = (content: ConversationMessageUpdateSettings | null) => void;\r\n\r\nexport const getNormalizedMessageSettings = (\r\n settings:\r\n | string\r\n | ConversationMessageSettings\r\n | ConverstationMessageItem<any>\r\n | ConverstationMessageItem<any>[]\r\n): NormalizedMessageSettings => {\r\n let content: ConversationMessageContent;\r\n let key = uuid();\r\n let timestamp: number | null = Date.now();\r\n\r\n if (Array.isArray(settings) && settings.length > -1) {\r\n if (typeof settings[0] === 'string') {\r\n content = { items: [<ConverstationMessageItem<any>>settings] };\r\n } else {\r\n content = { items: <ConverstationMessageItem<any>[]>settings };\r\n }\r\n } else if (typeof settings === 'string') {\r\n content = { body: settings };\r\n } else {\r\n settings = <ConversationMessageSettings>settings || {};\r\n\r\n if (settings.type) {\r\n content = {\r\n ...(<any>settings),\r\n };\r\n } else {\r\n content = {\r\n body: settings.body,\r\n actions: settings.actions,\r\n title: settings.title,\r\n };\r\n if (settings.key) {\r\n key = settings.key;\r\n }\r\n if (settings.timestamp) {\r\n timestamp = settings.timestamp;\r\n }\r\n if (settings.form) {\r\n const builder = FormBuilder.create(key);\r\n settings.form(builder);\r\n const builtForm = builder.get();\r\n content.form = builtForm;\r\n }\r\n if (settings.timestamp === null) {\r\n timestamp = null;\r\n }\r\n }\r\n }\r\n return { content, key, timestamp };\r\n};\r\n\r\nconst removeTypingState = (\r\n typingActors: ConversationMessageSender[],\r\n sender?: ConversationMessageSender\r\n) => {\r\n if (!sender) {\r\n return;\r\n }\r\n const senderString = JSON.stringify(sender);\r\n const indexToRemove = typingActors.findIndex((item) => {\r\n return senderString === JSON.stringify(item);\r\n });\r\n if (indexToRemove > -1) {\r\n return typingActors.splice(indexToRemove, 1);\r\n }\r\n};\r\n\r\n/**\r\n * Manages the stream of messages inside a `ConversationComponent` and provides external read-write\r\n * access to it as well as exposing emitted actions.\r\n */\r\nexport class ConversationController {\r\n formHandlers: FormHandlers = {};\r\n\r\n /**\r\n * Represents the current end user.\r\n */\r\n user: User = new User(this);\r\n\r\n events: EventManager;\r\n\r\n providers: string[] = [];\r\n\r\n active: boolean = false;\r\n\r\n private registeredProviders: ConversationProvider[] = [];\r\n\r\n private loaders: number = 0;\r\n private componentMounted: boolean = false;\r\n\r\n messages: ConversationMessage[] = [];\r\n private typingActors: ConversationMessageSender[] = [];\r\n\r\n constructor(public container: Container, public id: string) {\r\n const widget: Widget = container.get('$widget');\r\n this.events = widget.events.createChild(this);\r\n }\r\n\r\n setProviders(providers: string[]) {\r\n const removed: string[] = [];\r\n const added: string[] = [];\r\n\r\n // remove\r\n this.providers\r\n .reduce<string[]>((acc, provider) => {\r\n if (providers.indexOf(provider) === -1) {\r\n acc.push(provider);\r\n }\r\n return acc;\r\n }, [])\r\n .forEach((providerToRemove) => {\r\n const indexToRemove = this.providers.indexOf(providerToRemove);\r\n if (indexToRemove > -1) {\r\n removed.push(providerToRemove);\r\n this.providers.splice(indexToRemove, 1);\r\n }\r\n });\r\n\r\n // add\r\n providers.forEach((provider) => {\r\n if (this.providers.indexOf(provider) === -1) {\r\n added.push(provider);\r\n this.providers.push(provider);\r\n }\r\n });\r\n\r\n if (added.length || removed.length) {\r\n this.events.dispatch('conversation:providers-changed', { added, removed });\r\n }\r\n }\r\n\r\n createProvider(name: string): ConversationProvider {\r\n const index = this.providerIndex(name);\r\n if (index > -1) {\r\n return this.registeredProviders[index];\r\n }\r\n const provider = ConversationProvider.create(name, this.container, this);\r\n this.registeredProviders.push(provider);\r\n return provider;\r\n }\r\n\r\n providerIndex(name: string) {\r\n return this.registeredProviders.findIndex((p) => p.name === name);\r\n }\r\n\r\n dispose() {\r\n this.registeredProviders.forEach((provider) => provider.dispose());\r\n this.messages = [];\r\n this.events.dispatch('conversation:controller-disposed', this);\r\n this.active = false;\r\n }\r\n\r\n onDispose(fn: EventListener) {\r\n return this.events.subscribe('conversation:controller-disposed', fn);\r\n }\r\n\r\n onStarted(fn: EventListener) {\r\n return this.events.subscribe('conversation:started', fn);\r\n }\r\n\r\n disposeProvider(target: ConversationProvider) {\r\n const index = this.providerIndex(target.name);\r\n index > -1 && this.registeredProviders.splice(index, 1);\r\n this.events.dispatch('conversation:providers-changed', { removed: [target.name] });\r\n if (!this.registeredProviders.length) {\r\n this.dispose();\r\n }\r\n }\r\n\r\n onProvidersChange(fn: EventListener) {\r\n return this.events.subscribe('conversation:providers-changed', fn);\r\n }\r\n\r\n setComponentMountedState(mounted: boolean) {\r\n if (this.componentMounted === mounted) {\r\n return;\r\n }\r\n this.componentMounted = mounted;\r\n if (mounted) {\r\n this.events.dispatch('conversation:unread-message', false);\r\n this.events.dispatch('conversation:started', true);\r\n this.active = true;\r\n }\r\n this.events.dispatch('conversation:component-mount-changed', mounted);\r\n }\r\n\r\n getComponentMountedState() {\r\n return this.componentMounted;\r\n }\r\n\r\n onUnreadMessage(fn: EventListener) {\r\n return this.events.subscribe('conversation:unread-message', fn);\r\n }\r\n\r\n createEntry(\r\n key: string,\r\n content: ConversationMessageContent,\r\n type: ConversationMessageType,\r\n sender?: ConversationMessageSender,\r\n timestamp?: number | null\r\n ): ConversationEntry {\r\n const message: ConversationMessage = {\r\n key,\r\n content,\r\n type,\r\n sender: sender || null,\r\n timestamp: timestamp || timestamp === null ? timestamp : Date.now(),\r\n };\r\n this.messages.push(message);\r\n message.type === ConversationMessageType.Agent &&\r\n removeTypingState(this.typingActors, sender);\r\n const entry = new ConversationEntry((updated) => {\r\n if (updated !== null) {\r\n const { timestamp: updatedTimestamp = undefined, ...content } = updated;\r\n message.content = content;\r\n if (updatedTimestamp) {\r\n message.timestamp = updatedTimestamp;\r\n }\r\n } else {\r\n const indexToRemove = this.messages.indexOf(message);\r\n message.content = null;\r\n if (indexToRemove > -1) {\r\n this.messages.splice(indexToRemove, 1);\r\n }\r\n }\r\n this.events.dispatch('conversation:message-updated', { message });\r\n this.update();\r\n });\r\n this.events.dispatch('conversation:message-created', { message });\r\n this.update();\r\n if (!this.componentMounted) {\r\n this.events.dispatch('conversation:unread-message', true);\r\n }\r\n return entry;\r\n }\r\n\r\n print = (settings: string | ConversationMessageSettings): ConversationEntry => {\r\n const normalized = getNormalizedMessageSettings(settings);\r\n\r\n return this.createEntry(\r\n normalized.key,\r\n normalized.content,\r\n ConversationMessageType.System,\r\n undefined,\r\n normalized.timestamp\r\n );\r\n };\r\n\r\n update() {\r\n this.events.dispatch('conversation:updated', {\r\n messages: this.messages,\r\n loading: this.loaders > 0,\r\n typingActors: this.typingActors,\r\n });\r\n }\r\n\r\n getMessageStream() {\r\n return {\r\n messages: this.messages,\r\n loading: this.loaders > 0,\r\n typingActors: this.typingActors,\r\n };\r\n }\r\n\r\n setTypingState(sender: ConversationMessageSender, type?: ConversationMessageType) {\r\n if (this.typingActors.indexOf(sender) === -1) {\r\n this.typingActors.push(sender);\r\n this.update();\r\n }\r\n\r\n return () => {\r\n removeTypingState(this.typingActors, sender);\r\n this.update();\r\n };\r\n }\r\n\r\n /**\r\n * Displays a loader in the conversation.\r\n */\r\n loader(): CancelLoaderDelegate {\r\n this.loaders = this.loaders + 1;\r\n let dismissed = false;\r\n if (this.loaders === 1) {\r\n this.update();\r\n }\r\n return () => {\r\n if (!dismissed) {\r\n dismissed = true;\r\n this.loaders = this.loaders - 1;\r\n if (this.loaders === 0) {\r\n this.update();\r\n }\r\n }\r\n };\r\n }\r\n\r\n submitForm(key: string, handler: SubmitHandler) {\r\n this.formHandlers[key] = { ...this.formHandlers[key], submit: handler };\r\n }\r\n\r\n validateForm(key: string, handler: ValidateHandler) {\r\n this.formHandlers[key] = { ...this.formHandlers[key], validate: handler };\r\n }\r\n}\r\n","import { ComponentPlatform, WidgetSettings } from '@telia-ace/widget-core';\r\nimport { closeAllModals } from '@telia-ace/widget-plugins';\r\nimport {\r\n createStorageWriter,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageScope,\r\n} from '@telia-ace/widget-services';\r\nimport { Container, Implementation, Widget } from '@webprovisions/platform';\r\nimport { ConversationEndedBehavior, ConversationPlatform } from '../';\r\n\r\nconst getParentWidget = (widgetName: string, implementation: Implementation) => {\r\n const mainWidgetName = widgetName.split('_contact');\r\n return implementation.widgets.get(mainWidgetName[0]);\r\n};\r\n\r\nconst getSeparateWidget = (container: Container) => {\r\n const originWidget = container.get('$widget');\r\n const { name, implementation }: Widget = container.get('$widget');\r\n\r\n const mainWidget =\r\n name.indexOf('_contact') > -1 ? getParentWidget(name, implementation) : originWidget;\r\n const { data }: WidgetSettings = container.get('$settings');\r\n const { trigger }: WidgetSettings = mainWidget.container.get('$settings');\r\n const chatWidgetName = `${name\r\n .replace('_contact-method', '')\r\n .replace('_contact', '')}_contact-method`;\r\n\r\n const chatWidget = implementation.widgets.get(chatWidgetName);\r\n if (chatWidget && !trigger) {\r\n return { chatWidget, mainWidget, data };\r\n }\r\n return { mainWidget, data };\r\n};\r\n\r\nexport const shouldPreventDefault = (container: Container) => {\r\n const { chatWidget } = getSeparateWidget(container);\r\n return !!chatWidget;\r\n};\r\n\r\nexport const openChatWidget = (\r\n container: Container,\r\n contactMethod: any /*ContactMethodType*/,\r\n triggerDOMTarget?: HTMLElement\r\n) => {\r\n const { mainWidget, data, chatWidget } = getSeparateWidget(container);\r\n\r\n if (chatWidget) {\r\n if (chatWidget.state === 'activated') {\r\n return chatWidget.invoke('open').then(() => {\r\n chatWidget.container.getAsync('conversation').then((conversation) => {\r\n conversation\r\n .navigateToConversationIfActive(contactMethod.id)\r\n .then(() => closeAllModals(container));\r\n });\r\n });\r\n }\r\n return chatWidget\r\n .activate()\r\n .then(() => {\r\n const { trigger } = chatWidget.container.get('$settings');\r\n trigger.action = 'hide'; // could be default in configuration\r\n return chatWidget\r\n .invoke('setSettings', () => ({\r\n data,\r\n trigger,\r\n activate: true,\r\n }))\r\n .then(() => {\r\n return chatWidget.container\r\n .getAsync('components')\r\n .then((components: ComponentPlatform) => {\r\n /**\r\n * Could cause issues if target widget is no longer as specific for this use case\r\n */\r\n const contactMethodsQuery = components\r\n .components()\r\n .ofType('contact-method');\r\n components.write({\r\n key: 'setContactMethodId',\r\n attributes: {\r\n properties: {\r\n id: contactMethod.id,\r\n guideId: contactMethod.guideId,\r\n },\r\n },\r\n target: contactMethodsQuery,\r\n provider: 'localStorage',\r\n });\r\n const conversationsQuery = components\r\n .components()\r\n .ofType('conversation');\r\n components.write({\r\n key: 'setConversationProvider',\r\n attributes: {\r\n properties: { providers: [contactMethod.clientName] },\r\n },\r\n target: conversationsQuery,\r\n provider: 'localStorage',\r\n });\r\n });\r\n });\r\n })\r\n .then(() => {\r\n return chatWidget.invoke('attach', {\r\n key: 'contact-method',\r\n triggerDOMElement: triggerDOMTarget,\r\n withRenderState: 'open',\r\n });\r\n })\r\n .then(() => {\r\n createStorageWriter(\r\n chatWidget.container,\r\n 'activeStickyWidget',\r\n StorageCategory.Necessary,\r\n {\r\n medium: StorageMedium.Local,\r\n scope: StorageScope.Implementation,\r\n }\r\n ).then((write) => write(chatWidget.name));\r\n\r\n return chatWidget.container\r\n .getAsync('conversation')\r\n .then((platform) => {\r\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Deactivate);\r\n })\r\n .then(() => closeAllModals(container))\r\n .then(() => false);\r\n });\r\n }\r\n mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\r\n return platform\r\n .navigateToConversationIfActive(contactMethod.id)\r\n .then(() => platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate));\r\n });\r\n return chatWidget ? false : true;\r\n};\r\n\r\nexport const navigateToConversation = (\r\n container: Container,\r\n contactMethod: any /*ContactMethodType*/,\r\n routeName = 'conversation'\r\n) => {\r\n const { mainWidget, chatWidget } = getSeparateWidget(container);\r\n if (chatWidget) {\r\n return chatWidget.container.getAsync('router').then((router: any) => {\r\n router.navigate(routeName, { id: contactMethod.id });\r\n });\r\n }\r\n\r\n return mainWidget.container.getAsync('conversation').then((platform: ConversationPlatform) => {\r\n platform.setConversationEndedBehavior(ConversationEndedBehavior.Navigate)?.then(() => {\r\n mainWidget.container.getAsync('router').then((router: any) => {\r\n mainWidget.container\r\n .getAsync('components')\r\n .then((components: ComponentPlatform) => {\r\n const conversationQuery = components.components().ofType('conversation');\r\n components.write({\r\n key: 'setConversationProvider',\r\n attributes: { properties: { providers: [contactMethod.clientName] } },\r\n target: conversationQuery,\r\n provider: 'localStorage',\r\n });\r\n })\r\n .then(() => {\r\n router.navigate(routeName, { id: contactMethod.id });\r\n });\r\n });\r\n });\r\n });\r\n};\r\n","import { ComponentNodeController, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';\r\nimport { RouteData, RoutingService } from '@telia-ace/widget-routing';\r\nimport {\r\n createStorageWriter,\r\n readStorage,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageWriter,\r\n} from '@telia-ace/widget-services';\r\nimport { lock } from '@telia-ace/widget-utilities';\r\nimport {\r\n Container,\r\n EventManager,\r\n EventSubscriptionCancellation,\r\n Widget,\r\n} from '@webprovisions/platform';\r\nimport { ConversationController } from './conversation-controller';\r\nimport { ConversationProvider } from './conversation-provider';\r\nimport { navigateToConversation, openChatWidget, shouldPreventDefault } from './utils';\r\n\r\nconst STORAGE_KEY = 'conversations';\r\n\r\nexport type ConversationHandler = (\r\n conversation: ConversationProvider,\r\n component: ComponentNodeController\r\n) => void | (() => void);\r\n\r\nexport type UnregisterControllerDelegate = () => void;\r\n\r\nexport type ConversationProviderRegistration = {\r\n name: string;\r\n handler: ConversationHandler;\r\n};\r\n\r\nexport enum ConversationEndedBehavior {\r\n Deactivate = 'deactivate',\r\n Navigate = 'navigate',\r\n None = 'none',\r\n}\r\n\r\nexport type SessionInfo = {\r\n id?: string;\r\n route?: RouteData;\r\n conversationEndedBehavior?: ConversationEndedBehavior;\r\n};\r\n\r\nexport class ConversationPlatform {\r\n events: EventManager;\r\n private controllers: {\r\n conversation: ConversationController;\r\n component: ComponentNodeController;\r\n }[] = [];\r\n private providers: ConversationProviderRegistration[] = [];\r\n private disposeProviders: { [providerKey: string]: (() => void)[] } = {};\r\n private subscriptions: EventSubscriptionCancellation[] = [];\r\n private storageWriter: StorageWriter | null = null;\r\n private router: RoutingService | null = null;\r\n private buttonQuery: ComponentQuery | null = null;\r\n private sessionInfo: SessionInfo | null = null;\r\n\r\n constructor(private container: Container, private components: ComponentPlatform) {\r\n const widget: Widget = container.get('$widget');\r\n this.events = widget.events.createChild(this);\r\n }\r\n\r\n initialize() {\r\n createStorageWriter(this.container, STORAGE_KEY, StorageCategory.Necessary, {\r\n medium: StorageMedium.Local,\r\n }).then((writer) => (this.storageWriter = writer));\r\n\r\n readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (storedSession) => {\r\n this.buttonQuery = this.components\r\n .components()\r\n .ofType('conversation-return-button');\r\n if (storedSession) {\r\n this.sessionInfo = storedSession;\r\n if (storedSession.id && storedSession.route) {\r\n this.writeToComponents({ active: true, alert: { show: false } });\r\n }\r\n }\r\n }\r\n );\r\n this.container.getAsync('router').then((router) => (this.router = router));\r\n this.events.subscribe('conversation:ended', (event, data) => {\r\n switch (this.sessionInfo?.conversationEndedBehavior) {\r\n case ConversationEndedBehavior.Deactivate:\r\n const widget: Widget = this.container.get('$widget');\r\n widget.deactivate();\r\n break;\r\n case ConversationEndedBehavior.Navigate:\r\n const initialRoute = this.router?.getInitialRoute();\r\n if (initialRoute) {\r\n this.router?.navigate(initialRoute.name);\r\n }\r\n break;\r\n case ConversationEndedBehavior.None:\r\n default:\r\n break;\r\n }\r\n this.writeToComponents({ active: false });\r\n this.sessionInfo = null;\r\n this.storageWriter && this.storageWriter();\r\n });\r\n }\r\n\r\n addSubscription(sub: EventSubscriptionCancellation) {\r\n this.subscriptions.push(sub);\r\n }\r\n\r\n static getInstance(\r\n container: Container,\r\n key: string = 'conversation'\r\n ): Promise<ConversationPlatform> {\r\n return lock(container)(() => {\r\n return container.getAsync(key).then((value: ConversationPlatform) => {\r\n let conversation = value;\r\n if (!conversation) {\r\n return ComponentPlatform.getInstance(container).then((components) => {\r\n conversation = new ConversationPlatform(container, components);\r\n conversation.initialize();\r\n container.registerAsync(key, () => conversation);\r\n return conversation;\r\n });\r\n }\r\n return conversation;\r\n });\r\n });\r\n }\r\n\r\n navigateToConversationIfActive(id: string): Promise<void> {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (storedSession) => {\r\n if (storedSession && storedSession.id === id) {\r\n if (storedSession.route) {\r\n const { name, params } = storedSession.route;\r\n this.router?.navigate(name, params);\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n setConversationEndedBehavior(behavior: ConversationEndedBehavior) {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (stored) => {\r\n let storedSession = stored;\r\n if (storedSession) {\r\n storedSession.conversationEndedBehavior = behavior;\r\n } else {\r\n storedSession = { conversationEndedBehavior: behavior };\r\n }\r\n this.sessionInfo = storedSession;\r\n return (\r\n (this.storageWriter && this.storageWriter(this.sessionInfo)) ||\r\n Promise.resolve()\r\n );\r\n }\r\n );\r\n }\r\n\r\n createController(id: string) {\r\n const index = this.controllers.findIndex((c) => c.conversation.id === id);\r\n if (index > -1) {\r\n return this.controllers[index].conversation;\r\n }\r\n return new ConversationController(this.container, id);\r\n }\r\n\r\n registerProvider(name: string, handler: ConversationHandler): void {\r\n const provider = {\r\n name,\r\n handler,\r\n };\r\n this.providers.push(provider);\r\n // execute provider for all matching controllers\r\n this.controllers\r\n .filter((controller) => controller.conversation.providers.indexOf(name) > -1)\r\n .forEach((controller) => {\r\n this.invokeHandler(provider, controller);\r\n });\r\n }\r\n\r\n registerController(\r\n conversation: ConversationController,\r\n component: ComponentNodeController\r\n ): boolean {\r\n const index = this.controllers.findIndex((c) => c.conversation.id === conversation.id);\r\n let controller: any;\r\n if (index < 0) {\r\n controller = { conversation, component };\r\n this.controllers.push(controller);\r\n const invokeHandlers = (providers: string[]) => {\r\n if (providers) {\r\n this.providers\r\n .filter((provider) => providers.indexOf(provider.name) > -1)\r\n .forEach((provider) => {\r\n this.invokeHandler(provider, controller);\r\n });\r\n }\r\n };\r\n\r\n this.subscriptions.push(\r\n conversation.onDispose((event, data) => {\r\n const index = this.controllers.findIndex((c) => c.conversation === data);\r\n index > -1 && this.controllers.splice(index, 1);\r\n this.components\r\n .components()\r\n .ofType('conversation-return-button')\r\n .select()\r\n .writeProperties({ active: false });\r\n\r\n this.events.dispatch('conversation:ended', {}, { bubbles: true });\r\n })\r\n );\r\n this.subscriptions.push(\r\n conversation.onProvidersChange((event, data) => {\r\n const { added, removed }: { added: string[]; removed: string[] } = data;\r\n removed.forEach((removedProvider) => {\r\n this.disposeProviders[removedProvider].forEach((dispose) => {\r\n dispose();\r\n });\r\n });\r\n invokeHandlers(added);\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n conversation.onStarted((event, isActive) => {\r\n const session: SessionInfo = {\r\n id: conversation.id,\r\n route: this.router?.getRouteData(),\r\n conversationEndedBehavior: this.sessionInfo?.conversationEndedBehavior,\r\n };\r\n this.sessionInfo = session;\r\n this.storageWriter && this.storageWriter(session);\r\n\r\n this.writeToComponents({ active: isActive });\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n conversation.onUnreadMessage((event, data) => {\r\n this.events.dispatch('conversation:unread-message', data);\r\n this.writeToComponents({ alert: { show: data } });\r\n })\r\n );\r\n\r\n invokeHandlers(conversation.providers);\r\n return true;\r\n }\r\n controller = this.controllers[index];\r\n return false;\r\n }\r\n\r\n private writeToComponents(properties: any, key: string = 'conversationReturnButtonState') {\r\n if (this.buttonQuery) {\r\n this.components.write({\r\n key: 'conversationReturnButtonState',\r\n attributes: { properties },\r\n target: this.buttonQuery,\r\n provider: 'localStorage',\r\n });\r\n }\r\n }\r\n\r\n private invokeHandler(provider: ConversationProviderRegistration, controller: any) {\r\n const dispose = provider.handler(\r\n controller.conversation.createProvider(provider.name),\r\n controller.component\r\n );\r\n if (dispose) {\r\n if (!this.disposeProviders[provider.name]) {\r\n this.disposeProviders[provider.name] = [];\r\n }\r\n this.disposeProviders[provider.name].push(dispose);\r\n }\r\n }\r\n\r\n getComponentRoute() {\r\n return readStorage<SessionInfo>(this.container, STORAGE_KEY, StorageMedium.Local).then(\r\n (stored) => stored?.route\r\n );\r\n }\r\n\r\n dispose() {\r\n Object.keys(this.disposeProviders).forEach((key) => {\r\n this.disposeProviders[key].forEach((dispose) => {\r\n dispose();\r\n });\r\n });\r\n this.subscriptions.forEach((unsubscribe) => {\r\n unsubscribe();\r\n });\r\n this.controllers = [];\r\n this.providers = [];\r\n }\r\n\r\n public static async handleContactMethodClick(\r\n event: any,\r\n container: Container,\r\n contactMethod: any,\r\n callback?: Function\r\n ) {\r\n if (shouldPreventDefault(container)) {\r\n event.preventDefault();\r\n let triggerEl = document.getElementById('humany-dynamic-anchor');\r\n if (!triggerEl) {\r\n triggerEl = document.createElement('a');\r\n triggerEl.setAttribute('href', '#');\r\n triggerEl.id = 'humany-dynamic-anchor';\r\n document.body.appendChild(triggerEl);\r\n }\r\n openChatWidget(container, contactMethod, triggerEl);\r\n }\r\n openChatWidget(container, contactMethod);\r\n }\r\n\r\n public static async handleContactMethodSubmit(container: Container, contactMethod: any) {\r\n return navigateToConversation(container, contactMethod);\r\n }\r\n}\r\n","import { Form, FormBuilder } from '@telia-ace/widget-forms';\r\nimport { Symbol } from '@telia-ace/widget-ui';\r\n\r\nexport type ConversationMessageSettings = {\r\n key?: string;\r\n timestamp?: number;\r\n title?: string;\r\n body?: string;\r\n actions?: { [actionKey: string]: any };\r\n form?: (builder: FormBuilder) => void;\r\n type?: string;\r\n items?: ConversationMessageList[];\r\n [key: string]: any;\r\n};\r\n\r\nexport type NormalizedMessageSettings = {\r\n content: ConversationMessageContent;\r\n key: string;\r\n timestamp: number | null;\r\n};\r\n\r\nexport type ConversationMessageList = {\r\n header?: string;\r\n itemKey: string;\r\n type?: ConversationMessageListType;\r\n items: ConversationMessageListItem[];\r\n};\r\n\r\nexport type ConversationMessageListItem = {\r\n icon?: string;\r\n type?: ConversationMessageListItemType;\r\n actions?: { [actionKey: string]: any };\r\n form?: Form;\r\n body?: string;\r\n key: string;\r\n [key: string]: any;\r\n};\r\n\r\nexport type ConversationMessageContent = {\r\n title?: string;\r\n body?: string;\r\n actions?: { [actionKey: string]: any };\r\n items?: ConverstationMessageItem<any>[];\r\n form?: Form;\r\n [key: string]: any;\r\n};\r\n\r\nexport type ConverstationMessageItem<T, R = ItemPayload> = R extends [T, any] ? R : never;\r\n\r\nexport type ConversationMessageUpdateSettings = ConversationMessageContent & {\r\n timestamp?: number;\r\n};\r\n\r\nexport type ConversationMessageSender = {\r\n name?: string;\r\n avatar?: string | Symbol;\r\n};\r\n\r\nexport enum ConversationMessageListType {\r\n Ordinary = 'ordinary',\r\n Seperator = 'seperator',\r\n}\r\n\r\nexport enum ConversationMessageListItemType {\r\n Header = 'header',\r\n LinkList = 'link-list',\r\n Separator = 'separator',\r\n NoGoodAlternative = 'no-good-alternative',\r\n ButtonList = 'button-list',\r\n Text = 'text',\r\n HTML = 'html',\r\n FeedbackList = 'feedback-list',\r\n}\r\n\r\ntype LinkListItem = [\r\n ConversationMessageListItemType.LinkList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype HeaderItem = [ConversationMessageListItemType.Header, string];\r\ntype TextItem = [ConversationMessageListItemType.Text, string];\r\ntype SeparatorItem = [ConversationMessageListItemType.Separator, undefined];\r\ntype NoGoodAlternativeItem = [\r\n ConversationMessageListItemType.NoGoodAlternative,\r\n {\r\n body: string;\r\n }\r\n];\r\ntype ButtonListItem = [\r\n ConversationMessageListItemType.ButtonList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype FeedbackListItem = [\r\n ConversationMessageListItemType.FeedbackList,\r\n {\r\n actions: { [key: string]: string };\r\n }\r\n];\r\ntype HTMLItem = [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: string;\r\n }\r\n];\r\n\r\ntype ItemPayload =\r\n | LinkListItem\r\n | HeaderItem\r\n | TextItem\r\n | SeparatorItem\r\n | NoGoodAlternativeItem\r\n | ButtonListItem\r\n | HTMLItem\r\n | FeedbackListItem;\r\n","import { RoutingService } from '@telia-ace/widget-routing';\r\nimport { createReactComponent } from '@telia-ace/widget-ui';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ConversationMessage, ConversationMessageType } from '../../conversation-controller';\r\nimport { ConversationPlatform } from '../../conversation-platform';\r\nimport { ConversationMessageContent, ConversationMessageSender } from '../../types';\r\n\r\nexport type BundledConversationMessage = {\r\n timestamp: number;\r\n content: [BundledMessageContent];\r\n sender: ConversationMessageSender;\r\n type: ConversationMessageType;\r\n};\r\n\r\ntype BundledMessageContent = {\r\n key: string;\r\n} & ConversationMessageContent;\r\n\r\nexport type ConversationContent = {\r\n loading: boolean;\r\n typingActors: ConversationMessageSender[];\r\n messages: ConversationMessage[];\r\n};\r\n\r\n/**\r\n * Group items by sender, type and time. Current grouping threshold is 2000 ms.\r\n * Put this as a property on either the component or on the provider?\r\n * Could possibly be implemented directly in the createEntry method\r\n * of the conversation controller to avoid iterating over the entire array on\r\n * each update.\r\n */\r\nconst groupedMessages = (\r\n messages: ConversationMessage[],\r\n timeout?: number\r\n): BundledConversationMessage[] => {\r\n return messages.reduce((acc: any[], current: any, index: number) => {\r\n const newItem = {\r\n ...current,\r\n content: [{ ...current.content, key: current.key }],\r\n };\r\n if (acc.length > 0 && current.type !== ConversationMessageType.System) {\r\n const previous = acc[acc.length - 1];\r\n if (\r\n (!timeout && timeout !== 0) ||\r\n Math.abs(previous.timestamp - current.timestamp) < timeout\r\n ) {\r\n if (\r\n previous.sender?.name === current.sender?.name &&\r\n previous.type === current.type\r\n ) {\r\n previous.timestamp = current.timestamp;\r\n previous.content.push({ ...current.content, key: current.key });\r\n return acc;\r\n }\r\n }\r\n }\r\n acc.push(newItem);\r\n return acc;\r\n }, []);\r\n};\r\n\r\nexport type ConversationComponentProperties = {\r\n providers: string[];\r\n messages: BundledConversationMessage[]; // internal\r\n loading: boolean;\r\n inputPlaceholder: string;\r\n inputDisabled: boolean;\r\n inputHidden: boolean;\r\n inputMultiline: boolean;\r\n userLabel: string;\r\n avatarSize: string;\r\n typingActors: any[]; // internal\r\n sendButtonLabel: string;\r\n secondaryAction?: { icon?: string; action: string; label: string };\r\n};\r\n\r\nconst ConversationComponent = (container: Container) => {\r\n return Promise.all([\r\n ConversationPlatform.getInstance(container),\r\n container.getAsync('router'),\r\n ]).then(([platform, router]: [ConversationPlatform, RoutingService]) => {\r\n return createReactComponent(\r\n container,\r\n 'conversation',\r\n import('./conversation'),\r\n (component) => {\r\n const routeData = router.getRouteData();\r\n const name = routeData.params.id || component.node.name || 'component';\r\n const conversation = platform.createController(name);\r\n const isNewController = platform.registerController(conversation, component);\r\n\r\n const messageGroupingTimeout = 3 * 60 * 1000;\r\n\r\n const setProperties = (properties: ConversationComponentProperties) => {\r\n const { providers = [] } = properties;\r\n if (providers) {\r\n const providerKeys = Array.isArray(providers) ? providers : [providers];\r\n conversation.setProviders(providerKeys);\r\n return providerKeys;\r\n }\r\n };\r\n setProperties(component.properties<ConversationComponentProperties>(setProperties));\r\n\r\n conversation.setComponentMountedState(true);\r\n\r\n const writeMessages = (messageStream: any) => {\r\n const { loading, typingActors, messages } = messageStream;\r\n component.writeProperties({\r\n loading,\r\n typingActors,\r\n messages: groupedMessages(messages, messageGroupingTimeout),\r\n });\r\n };\r\n\r\n writeMessages(conversation.getMessageStream());\r\n\r\n if (isNewController) {\r\n // todo: dont create actions here, there will be duplicates due to reuseController = true\r\n component.actions.create('user-submit', (data, options) => {\r\n if (options) {\r\n const { preventDefault, validationPromise } = options;\r\n if (preventDefault) {\r\n if (validationPromise) {\r\n validationPromise().then((text: string) => {\r\n if (text) {\r\n conversation.user.print(text);\r\n }\r\n });\r\n }\r\n return;\r\n }\r\n }\r\n conversation.user.print(data.text);\r\n });\r\n\r\n component.actions.create('user-typing', (data, options) => {});\r\n\r\n component.actions.create('form', (data, options) => {});\r\n\r\n component.actions.create('action', (data, options) => {});\r\n }\r\n\r\n const unsubscribe = conversation.events.subscribe(\r\n 'conversation:updated',\r\n (e: any, conversationData: ConversationContent) => {\r\n writeMessages(conversationData);\r\n }\r\n );\r\n\r\n return () => {\r\n conversation.setComponentMountedState(false);\r\n unsubscribe();\r\n if (!conversation.active) {\r\n // unregisterController();\r\n // todo: add possibility to dispose this through extendComponent()\r\n // component.dispose();\r\n writeMessages({ messages: [], typingActors: [], loading: false });\r\n }\r\n };\r\n },\r\n { reuseController: true }\r\n );\r\n });\r\n};\r\n\r\nexport default ConversationComponent;\r\n","import { ComponentPlatform } from '@telia-ace/widget-core';\r\nimport { RoutingService } from '@telia-ace/widget-routing';\r\nimport { createReactComponent, Symbol } from '@telia-ace/widget-ui';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { ConversationPlatform } from '../../';\r\n\r\nexport enum ButtonMode {\r\n flat = 'flat',\r\n flashing = 'flashing',\r\n flashingGradient = 'flashingGradient',\r\n}\r\n\r\nexport type ReturnButtonProps = {\r\n label: string;\r\n active: boolean;\r\n mode: ButtonMode;\r\n alert?: {\r\n symbol?: Symbol;\r\n show?: boolean;\r\n label?: string;\r\n };\r\n};\r\n\r\nconst ConversationReturnButtonComponent = (container: Container) => {\r\n return Promise.all([\r\n ComponentPlatform.getInstance(container),\r\n ConversationPlatform.getInstance(container),\r\n container.getAsync('router'),\r\n ]).then(\r\n ([components, platform, router]: [\r\n ComponentPlatform,\r\n ConversationPlatform,\r\n RoutingService\r\n ]) => {\r\n return createReactComponent(\r\n container,\r\n 'conversation-return-button',\r\n import('./return-button'),\r\n (component) => {\r\n component.actions.create('toggle', (options = {}) => {\r\n platform.getComponentRoute()?.then((route) => {\r\n route && router.navigate(route.name, route.params);\r\n });\r\n });\r\n }\r\n );\r\n }\r\n );\r\n};\r\n\r\nexport default ConversationReturnButtonComponent;\r\n","import { ComponentResolver, ReactComponent } from '@telia-ace/widget-core';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { lazy } from 'react';\r\nimport { ConversationPlatform } from '..';\r\n\r\nexport const registerCustomMessageComponent = (\r\n container: Container,\r\n type: string,\r\n component: ReactComponent\r\n) => {\r\n return container.getAsync('componentResolver').then(async (o: ComponentResolver) => {\r\n const platform = await ConversationPlatform.getInstance(container);\r\n platform.addSubscription(\r\n o.registerComponent(\r\n type,\r\n lazy(() => component)\r\n )\r\n );\r\n });\r\n};\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,MAAM,MAAM;AAAA,EAIf,YAAoB,UAAgC,UAAyB;AAAzD,SAAA,WAAA;AAKpB,SAAA,QAAQ,CACJ,cAKgC;AAChC,YAAM,SAAoC,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK;AACpE,YAAA,aAAa,6BAA6B,SAAQ;AAEjD,aAAA,KAAK,SAAS,YACjB,WAAW,KACX,WAAW,SACX,wBAAwB,OACxB,QACA,WAAW,SACf;AAAA,IAAA;AAEJ,SAAA,SAAS,MAAM;AACJ,aAAA,KAAK,SAAS,eAAe,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAQ,CAAA;AAAA,IAAA;AAvB5E,SAAK,OAAO,SAAS;AACrB,SAAK,SAAS,SAAS;AAAA,EAC3B;AAAA,EAwBA,OAAO,UAA+B;AAC5B,UAAA,EAAE,MAAM,WAAW;AACzB,QAAI,WAAW,MAAM;AACjB,WAAK,SAAS;AAAA,eACP,QAAQ;AACf,WAAK,SAAS;AAAA,IAClB;AAEA,QAAI,SAAS,MAAM;AACf,WAAK,OAAO;AAAA,eACL,MAAM;AACb,WAAK,OAAO;AAAA,IAChB;AAAA,EACJ;AACJ;AC5CO,MAAM,qBAAqB;AAAA,EAI9B,YACW,MACC,WACD,YACT;AAHS,SAAA,OAAA;AACC,SAAA,YAAA;AACD,SAAA,aAAA;AANX,SAAQ,gBAAiD;AAQrD,SAAK,OAAO,yCAAY;AAAA,EAC5B;AAAA,EAEA,OAAO,OAAO,MAAc,WAAsB,YAAoC;AAClF,WAAO,IAAI,qBAAqB,MAAM,WAAW,UAAU;AAAA,EAC/D;AAAA,EAEA,YAAY,WAA0B,IAAuB;AACzD,QAAI,KAAK,YAAY;AACV,aAAA,IAAI,MAAM,MAAM,QAAQ;AAAA,IACnC;AAAA,EACJ;AAAA,EAEA,MAAM,UAA+E;;AAC1E,WAAA,WAAK,eAAL,mBAAiB,MAAM;AAAA,EAClC;AAAA,EAEA,eAAe,QAAmC,MAAgC;;AAC9E,WAAO,WAAK,eAAL,mBAAiB,eAAe,QAAQ;AAAA,EACnD;AAAA,EAEA,UAAgC;AACxB,QAAA,CAAC,KAAK,YAAY;AAClB,aAAO,MAAM,MAAM;AAAA,MAAA;AAAA,IACvB;AACO,WAAA,KAAK,WAAW;EAC3B;AAAA,EAEA,YACI,KACA,SACA,MACA,QACA,WACF;;AACE,WAAO,WAAK,eAAL,mBAAiB,YAAY,KAAK,SAAS,MAAM,QAAQ;AAAA,EACpE;AAAA,EAEA,UAAU;;AAID,eAAA,eAAA,mBAAY,gBAAgB;AACjC,SAAK,aAAa;AAClB,SAAK,cAAc,QAAQ,CAAC,UAAU,MAAO,CAAA;AAAA,EACjD;AAAA,EAEA,gBAAgB,IAAyD;;AACrE,QAAI,KAAK,YAAY;AACjB,YAAM,cAAc,WAAK,eAAL,mBAAiB,gBAAgB;AAChD,WAAA,cAAc,KAAK,WAAW;AACnC,aAAO,MAAM;AACG;MAAA;AAAA,IAEpB;AAAA,EACJ;AAAA,EAEA,UAAU,IAAyD;;AAC/D,QAAI,KAAK,YAAY;AACjB,YAAM,cAAc,WAAK,eAAL,mBAAiB,OAAO,UACxC,wCACA;AAEC,WAAA,cAAc,KAAK,WAAW;AACnC,SAAG,CAAA,GAAmB,KAAK,WAAW,yBAA0B,CAAA;AAChE,aAAO,MAAM;AACG;MAAA;AAAA,IAEpB;AAAA,EACJ;AACJ;AC1FO,MAAM,KAAK;AAAA,EACd,YAAoB,YAAoC;AAApC,SAAA,aAAA;AAEpB,SAAA,QAAQ,CAAC,aAAsE;AACrE,YAAA,aAAa,6BAA6B,QAAQ;AACjD,aAAA,KAAK,WAAW,YACnB,WAAW,KACX,WAAW,SACX,wBAAwB,MACxB,QACA,WAAW,SACf;AAAA,IAAA;AAAA,EAVqD;AAY7D;ACGO,MAAM,kBAAkB;AAAA,EAC3B,YAAoB,QAAqB;AAArB,SAAA,SAAA;AAAA,EAAsB;AAAA,EAE1C,OACI,SAKF;AACQ,UAAA,aAAa,KAAK,sBAAsB,OAAO;AAErD,SAAK,OAA0C,UAAU;AAAA,EAC7D;AAAA,EAEA,SAAS;AACL,SAAK,OAAO,IAAI;AAAA,EACpB;AAAA,EAEQ,sBACJ,SAKF;AACE,QAAI,OAAO,YAAY;AAAiB,aAAA,EAAE,MAAM;aACvC,QAAQ,SAAS,MAAM,OAAO,YAAY;AAAiB,aAAA,EAAE,OAAO;;AACjE,aAAA;AAAA,EAChB;AACJ;AAEY,IAAA,4CAAA,6BAAL;AACI,2BAAA,UAAA;AACC,2BAAA,WAAA;AACC,2BAAA,YAAA;AAHD,SAAA;AAAA,GAAA,2BAAA,CAAA,CAAA;AAgBC,MAAA,+BAA+B,CACxC,aAK4B;AACxB,MAAA;AACJ,MAAI,MAAM;AACN,MAAA,YAA2B,KAAK;AAEpC,MAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,IAAI;AAC7C,QAAA,OAAO,SAAS,OAAO,UAAU;AACjC,gBAAU,EAAE,OAAO,CAAgC,QAAQ,EAAE;AAAA,IAAA,OAC1D;AACO,gBAAA,EAAE,OAAwC;IACxD;AAAA,EAAA,WACO,OAAO,aAAa,UAAU;AAC3B,cAAA,EAAE,MAAM;EAAS,OACxB;AACH,eAAwC,YAAY;AAEpD,QAAI,SAAS,MAAM;AACL,gBAAA,mBACG;AAAA,IACb,OACG;AACO,gBAAA;AAAA,QACN,MAAM,SAAS;AAAA,QACf,SAAS,SAAS;AAAA,QAClB,OAAO,SAAS;AAAA,MAAA;AAEpB,UAAI,SAAS,KAAK;AACd,cAAM,SAAS;AAAA,MACnB;AACA,UAAI,SAAS,WAAW;AACpB,oBAAY,SAAS;AAAA,MACzB;AACA,UAAI,SAAS,MAAM;AACT,cAAA,UAAU,YAAY,OAAO,GAAG;AACtC,iBAAS,KAAK,OAAO;AACf,cAAA,YAAY,QAAQ;AAC1B,gBAAQ,OAAO;AAAA,MACnB;AACI,UAAA,SAAS,cAAc,MAAM;AACjB,oBAAA;AAAA,MAChB;AAAA,IACJ;AAAA,EACJ;AACO,SAAA,EAAE,SAAS,KAAK;AAC3B;AAEA,MAAM,oBAAoB,CACtB,cACA,WACC;AACD,MAAI,CAAC,QAAQ;AACT;AAAA,EACJ;AACM,QAAA,eAAe,KAAK,UAAU,MAAM;AAC1C,QAAM,gBAAgB,aAAa,UAAU,CAAC,SAAS;AAC5C,WAAA,iBAAiB,KAAK,UAAU,IAAI;AAAA,EAAA,CAC9C;AACD,MAAI,gBAAgB,IAAI;AACb,WAAA,aAAa,OAAO,eAAe,CAAC;AAAA,EAC/C;AACJ;AAMO,MAAM,uBAAuB;AAAA,EAsBhC,YAAmB,WAA6B,IAAY;AAAzC,SAAA,YAAA;AAA6B,SAAA,KAAA;AArBhD,SAAA,eAA6B;AAKhB,SAAA,OAAA,IAAI,KAAK,IAAI;AAI1B,SAAA,YAAsB;AAEJ,SAAA,SAAA;AAElB,SAAQ,sBAA8C;AAEtD,SAAQ,UAAkB;AAC1B,SAAQ,mBAA4B;AAEpC,SAAA,WAAkC;AAClC,SAAQ,eAA4C;AAiJpD,SAAA,QAAQ,CAAC,aAAsE;AACrE,YAAA,aAAa,6BAA6B,QAAQ;AAEjD,aAAA,KAAK,YACR,WAAW,KACX,WAAW,SACX,UACA,QACA,WAAW,SACf;AAAA,IAAA;AAvJM,UAAA,SAAiB,UAAU,IAAI,SAAS;AAC9C,SAAK,SAAS,OAAO,OAAO,YAAY,IAAI;AAAA,EAChD;AAAA,EAEA,aAAa,WAAqB;AAC9B,UAAM,UAAoB,CAAA;AAC1B,UAAM,QAAkB,CAAA;AAGxB,SAAK,UACA,OAAiB,CAAC,KAAK,aAAa;AACjC,UAAI,UAAU,QAAQ,QAAQ,MAAM,IAAI;AACpC,YAAI,KAAK,QAAQ;AAAA,MACrB;AACO,aAAA;AAAA,OACR,EAAE,EACJ,QAAQ,CAAC,qBAAqB;AAC3B,YAAM,gBAAgB,KAAK,UAAU,QAAQ,gBAAgB;AAC7D,UAAI,gBAAgB,IAAI;AACpB,gBAAQ,KAAK,gBAAgB;AACxB,aAAA,UAAU,OAAO,eAAe,CAAC;AAAA,MAC1C;AAAA,IAAA,CACH;AAGK,cAAA,QAAQ,CAAC,aAAa;AAC5B,UAAI,KAAK,UAAU,QAAQ,QAAQ,MAAM,IAAI;AACzC,cAAM,KAAK,QAAQ;AACd,aAAA,UAAU,KAAK,QAAQ;AAAA,MAChC;AAAA,IAAA,CACH;AAEG,QAAA,MAAM,UAAU,QAAQ,QAAQ;AAChC,WAAK,OAAO,SAAS,kCAAkC,EAAE,OAAO,SAAS;AAAA,IAC7E;AAAA,EACJ;AAAA,EAEA,eAAe,MAAoC;AACzC,UAAA,QAAQ,KAAK,cAAc,IAAI;AACrC,QAAI,QAAQ,IAAI;AACZ,aAAO,KAAK,oBAAoB;AAAA,IACpC;AACA,UAAM,WAAW,qBAAqB,OAAO,MAAM,KAAK,WAAW,IAAI;AAClE,SAAA,oBAAoB,KAAK,QAAQ;AAC/B,WAAA;AAAA,EACX;AAAA,EAEA,cAAc,MAAc;AACxB,WAAO,KAAK,oBAAoB,UAAU,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EACpE;AAAA,EAEA,UAAU;AACN,SAAK,oBAAoB,QAAQ,CAAC,aAAa,SAAS,SAAS;AACjE,SAAK,WAAW;AACX,SAAA,OAAO,SAAS,oCAAoC,IAAI;AAC7D,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,UAAU,IAAmB;AACzB,WAAO,KAAK,OAAO,UAAU,oCAAoC,EAAE;AAAA,EACvE;AAAA,EAEA,UAAU,IAAmB;AACzB,WAAO,KAAK,OAAO,UAAU,wBAAwB,EAAE;AAAA,EAC3D;AAAA,EAEA,gBAAgB,QAA8B;AAC1C,UAAM,QAAQ,KAAK,cAAc,OAAO,IAAI;AAC5C,YAAQ,MAAM,KAAK,oBAAoB,OAAO,OAAO,CAAC;AACjD,SAAA,OAAO,SAAS,kCAAkC,EAAE,SAAS,CAAC,OAAO,IAAI,EAAA,CAAG;AAC7E,QAAA,CAAC,KAAK,oBAAoB,QAAQ;AAClC,WAAK,QAAQ;AAAA,IACjB;AAAA,EACJ;AAAA,EAEA,kBAAkB,IAAmB;AACjC,WAAO,KAAK,OAAO,UAAU,kCAAkC,EAAE;AAAA,EACrE;AAAA,EAEA,yBAAyB,SAAkB;AACnC,QAAA,KAAK,qBAAqB,SAAS;AACnC;AAAA,IACJ;AACA,SAAK,mBAAmB;AACxB,QAAI,SAAS;AACJ,WAAA,OAAO,SAAS,+BAA+B,KAAK;AACpD,WAAA,OAAO,SAAS,wBAAwB,IAAI;AACjD,WAAK,SAAS;AAAA,IAClB;AACK,SAAA,OAAO,SAAS,wCAAwC,OAAO;AAAA,EACxE;AAAA,EAEA,2BAA2B;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,gBAAgB,IAAmB;AAC/B,WAAO,KAAK,OAAO,UAAU,+BAA+B,EAAE;AAAA,EAClE;AAAA,EAEA,YACI,KACA,SACA,MACA,QACA,WACiB;AACjB,UAAM,UAA+B;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,MAClB,WAAW,aAAa,cAAc,OAAO,YAAY,KAAK,IAAI;AAAA,IAAA;AAEjE,SAAA,SAAS,KAAK,OAAO;AAC1B,YAAQ,SAAS,WACb,kBAAkB,KAAK,cAAc,MAAM;AAC/C,UAAM,QAAQ,IAAI,kBAAkB,CAAC,YAAY;AAC7C,UAAI,YAAY,MAAM;AAClB,cAAgE,cAAxD,aAAW,mBAAmB,WAA0B,IAAZ,qBAAY,IAAZ,CAA5C;AACR,gBAAQ,UAAU;AAClB,YAAI,kBAAkB;AAClB,kBAAQ,YAAY;AAAA,QACxB;AAAA,MAAA,OACG;AACH,cAAM,gBAAgB,KAAK,SAAS,QAAQ,OAAO;AACnD,gBAAQ,UAAU;AAClB,YAAI,gBAAgB,IAAI;AACf,eAAA,SAAS,OAAO,eAAe,CAAC;AAAA,QACzC;AAAA,MACJ;AACA,WAAK,OAAO,SAAS,gCAAgC,EAAE,QAAS,CAAA;AAChE,WAAK,OAAO;AAAA,IAAA,CACf;AACD,SAAK,OAAO,SAAS,gCAAgC,EAAE,QAAS,CAAA;AAChE,SAAK,OAAO;AACR,QAAA,CAAC,KAAK,kBAAkB;AACnB,WAAA,OAAO,SAAS,+BAA+B,IAAI;AAAA,IAC5D;AACO,WAAA;AAAA,EACX;AAAA,EAcA,SAAS;AACA,SAAA,OAAO,SAAS,wBAAwB;AAAA,MACzC,UAAU,KAAK;AAAA,MACf,SAAS,KAAK,UAAU;AAAA,MACxB,cAAc,KAAK;AAAA,IAAA,CACtB;AAAA,EACL;AAAA,EAEA,mBAAmB;AACR,WAAA;AAAA,MACH,UAAU,KAAK;AAAA,MACf,SAAS,KAAK,UAAU;AAAA,MACxB,cAAc,KAAK;AAAA,IAAA;AAAA,EAE3B;AAAA,EAEA,eAAe,QAAmC,MAAgC;AAC9E,QAAI,KAAK,aAAa,QAAQ,MAAM,MAAM,IAAI;AACrC,WAAA,aAAa,KAAK,MAAM;AAC7B,WAAK,OAAO;AAAA,IAChB;AAEA,WAAO,MAAM;AACS,wBAAA,KAAK,cAAc,MAAM;AAC3C,WAAK,OAAO;AAAA,IAAA;AAAA,EAEpB;AAAA,EAKA,SAA+B;AACtB,SAAA,UAAU,KAAK,UAAU;AAC9B,QAAI,YAAY;AACZ,QAAA,KAAK,YAAY,GAAG;AACpB,WAAK,OAAO;AAAA,IAChB;AACA,WAAO,MAAM;AACT,UAAI,CAAC,WAAW;AACA,oBAAA;AACP,aAAA,UAAU,KAAK,UAAU;AAC1B,YAAA,KAAK,YAAY,GAAG;AACpB,eAAK,OAAO;AAAA,QAChB;AAAA,MACJ;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,WAAW,KAAa,SAAwB;AACvC,SAAA,aAAa,OAAO,iCAAK,KAAK,aAAa,OAAvB,EAA6B,QAAQ;EAClE;AAAA,EAEA,aAAa,KAAa,SAA0B;AAC3C,SAAA,aAAa,OAAO,iCAAK,KAAK,aAAa,OAAvB,EAA6B,UAAU;EACpE;AACJ;AC7WA,MAAM,kBAAkB,CAAC,YAAoB,mBAAmC;AACtE,QAAA,iBAAiB,WAAW,MAAM,UAAU;AAClD,SAAO,eAAe,QAAQ,IAAI,eAAe,EAAE;AACvD;AAEA,MAAM,oBAAoB,CAAC,cAAyB;AAC1C,QAAA,eAAe,UAAU,IAAI,SAAS;AAC5C,QAAM,EAAE,MAAM,mBAA2B,UAAU,IAAI,SAAS;AAE1D,QAAA,aACF,KAAK,QAAQ,UAAU,IAAI,KAAK,gBAAgB,MAAM,cAAc,IAAI;AAC5E,QAAM,EAAE,SAAyB,UAAU,IAAI,WAAW;AAC1D,QAAM,EAAE,YAA4B,WAAW,UAAU,IAAI,WAAW;AAClE,QAAA,iBAAiB,GAAG,KACrB,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,YAAY,EAAE;AAE3B,QAAM,aAAa,eAAe,QAAQ,IAAI,cAAc;AACxD,MAAA,cAAc,CAAC,SAAS;AACjB,WAAA,EAAE,YAAY,YAAY;EACrC;AACO,SAAA,EAAE,YAAY;AACzB;AAEa,MAAA,uBAAuB,CAAC,cAAyB;AACpD,QAAA,EAAE,eAAe,kBAAkB,SAAS;AAClD,SAAO,CAAC,CAAC;AACb;AAEO,MAAM,iBAAiB,CAC1B,WACA,eACA,qBACC;AACD,QAAM,EAAE,YAAY,MAAM,eAAe,kBAAkB,SAAS;AAEpE,MAAI,YAAY;AACR,QAAA,WAAW,UAAU,aAAa;AAClC,aAAO,WAAW,OAAO,MAAM,EAAE,KAAK,MAAM;AACxC,mBAAW,UAAU,SAAS,cAAc,EAAE,KAAK,CAAC,iBAAiB;AAE5D,uBAAA,+BAA+B,cAAc,EAAE,EAC/C,KAAK,MAAM,eAAe,SAAS,CAAC;AAAA,QAAA,CAC5C;AAAA,MAAA,CACJ;AAAA,IACL;AACA,WAAO,WACF,WACA,KAAK,MAAM;AACR,YAAM,EAAE,YAAY,WAAW,UAAU,IAAI,WAAW;AACxD,cAAQ,SAAS;AACV,aAAA,WACF,OAAO,eAAe,MAAO;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MAAA,EACZ,EACD,KAAK,MAAM;AACR,eAAO,WAAW,UACb,SAAS,YAAY,EACrB,KAAK,CAAC,eAAkC;AAIrC,gBAAM,sBAAsB,WACvB,WAAW,EACX,OAAO,gBAAgB;AAC5B,qBAAW,MAAM;AAAA,YACb,KAAK;AAAA,YACL,YAAY;AAAA,cACR,YAAY;AAAA,gBACR,IAAI,cAAc;AAAA,gBAClB,SAAS,cAAc;AAAA,cAC3B;AAAA,YACJ;AAAA,YACA,QAAQ;AAAA,YACR,UAAU;AAAA,UAAA,CACb;AACD,gBAAM,qBAAqB,WACtB,WAAW,EACX,OAAO,cAAc;AAC1B,qBAAW,MAAM;AAAA,YACb,KAAK;AAAA,YACL,YAAY;AAAA,cACR,YAAY,EAAE,WAAW,CAAC,cAAc,UAAU,EAAE;AAAA,YACxD;AAAA,YACA,QAAQ;AAAA,YACR,UAAU;AAAA,UAAA,CACb;AAAA,QAAA,CACJ;AAAA,MAAA,CACR;AAAA,IAAA,CACR,EACA,KAAK,MAAM;AACD,aAAA,WAAW,OAAO,UAAU;AAAA,QAC/B,KAAK;AAAA,QACL,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,MAAA,CACpB;AAAA,IAAA,CACJ,EACA,KAAK,MAAM;AACR,0BACI,WAAW,WACX,sBACA,gBAAgB,WAChB;AAAA,QACI,QAAQ,cAAc;AAAA,QACtB,OAAO,aAAa;AAAA,MAAA,CAE5B,EAAE,KAAK,CAAC,UAAU,MAAM,WAAW,IAAI,CAAC;AAExC,aAAO,WAAW,UACb,SAAS,cAAc,EACvB,KAAK,CAAC,aAAa;AACP,iBAAA,6BAA6B,0BAA0B,UAAU;AAAA,MAAA,CAC7E,EACA,KAAK,MAAM,eAAe,SAAS,CAAC,EACpC,KAAK,MAAM,KAAK;AAAA,IAAA,CACxB;AAAA,EACT;AACA,aAAW,UAAU,SAAS,cAAc,EAAE,KAAK,CAAC,aAAmC;AAC5E,WAAA,SACF,+BAA+B,cAAc,EAAE,EAC/C,KAAK,MAAM,SAAS,6BAA6B,0BAA0B,QAAQ,CAAC;AAAA,EAAA,CAC5F;AACD,SAAO,aAAa,QAAQ;AAChC;AAEO,MAAM,yBAAyB,CAClC,WACA,eACA,YAAY,mBACX;AACD,QAAM,EAAE,YAAY,eAAe,kBAAkB,SAAS;AAC9D,MAAI,YAAY;AACZ,WAAO,WAAW,UAAU,SAAS,QAAQ,EAAE,KAAK,CAAC,WAAgB;AACjE,aAAO,SAAS,WAAW,EAAE,IAAI,cAAc,IAAI;AAAA,IAAA,CACtD;AAAA,EACL;AAEA,SAAO,WAAW,UAAU,SAAS,cAAc,EAAE,KAAK,CAAC,aAAmC;;AAC1F,mBAAS,6BAA6B,0BAA0B,QAAQ,MAAxE,mBAA2E,KAAK,MAAM;AAClF,iBAAW,UAAU,SAAS,QAAQ,EAAE,KAAK,CAAC,WAAgB;AAC1D,mBAAW,UACN,SAAS,YAAY,EACrB,KAAK,CAAC,eAAkC;AACrC,gBAAM,oBAAoB,WAAW,WAAW,EAAE,OAAO,cAAc;AACvE,qBAAW,MAAM;AAAA,YACb,KAAK;AAAA,YACL,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,cAAc,UAAU,IAAI;AAAA,YACpE,QAAQ;AAAA,YACR,UAAU;AAAA,UAAA,CACb;AAAA,QAAA,CACJ,EACA,KAAK,MAAM;AACR,iBAAO,SAAS,WAAW,EAAE,IAAI,cAAc,IAAI;AAAA,QAAA,CACtD;AAAA,MAAA,CACR;AAAA,IAAA;AAAA,EACJ,CACJ;AACL;ACtJA,MAAM,cAAc;AAcR,IAAA,8CAAA,+BAAL;AACU,6BAAA,gBAAA;AACF,6BAAA,cAAA;AACJ,6BAAA,UAAA;AAHC,SAAA;AAAA,GAAA,6BAAA,CAAA,CAAA;AAYL,MAAM,qBAAqB;AAAA,EAc9B,YAAoB,WAA8B,YAA+B;AAA7D,SAAA,YAAA;AAA8B,SAAA,aAAA;AAZlD,SAAQ,cAGF;AACN,SAAQ,YAAgD;AACxD,SAAQ,mBAA8D;AACtE,SAAQ,gBAAiD;AACzD,SAAQ,gBAAsC;AAC9C,SAAQ,SAAgC;AACxC,SAAQ,cAAqC;AAC7C,SAAQ,cAAkC;AAGhC,UAAA,SAAiB,UAAU,IAAI,SAAS;AAC9C,SAAK,SAAS,OAAO,OAAO,YAAY,IAAI;AAAA,EAChD;AAAA,EAEA,aAAa;AACT,wBAAoB,KAAK,WAAW,aAAa,gBAAgB,WAAW;AAAA,MACxE,QAAQ,cAAc;AAAA,IAAA,CACzB,EAAE,KAAK,CAAC,WAAY,KAAK,gBAAgB,MAAO;AAExB,gBAAA,KAAK,WAAW,aAAa,cAAc,KAAK,EAAE,KACvE,CAAC,kBAAkB;AACf,WAAK,cAAc,KAAK,WACnB,aACA,OAAO,4BAA4B;AACxC,UAAI,eAAe;AACf,aAAK,cAAc;AACf,YAAA,cAAc,MAAM,cAAc,OAAO;AACpC,eAAA,kBAAkB,EAAE,QAAQ,MAAM,OAAO,EAAE,MAAM,MAAM,EAAA,CAAG;AAAA,QACnE;AAAA,MACJ;AAAA,IAAA,CAER;AACK,SAAA,UAAU,SAAS,QAAQ,EAAE,KAAK,CAAC,WAAY,KAAK,SAAS,MAAO;AACzE,SAAK,OAAO,UAAU,sBAAsB,CAAC,OAAO,SAAS;;AACzD,cAAQ,WAAK,gBAAL,mBAAkB;AAAA,aACjB;AACD,gBAAM,SAAiB,KAAK,UAAU,IAAI,SAAS;AACnD,iBAAO,WAAW;AAClB;AAAA,aACC;AACK,gBAAA,eAAe,WAAK,WAAL,mBAAa;AAClC,cAAI,cAAc;AACT,uBAAA,WAAA,mBAAQ,SAAS,aAAa;AAAA,UACvC;AACA;AAAA;AAKR,WAAK,kBAAkB,EAAE,QAAQ,MAAO,CAAA;AACxC,WAAK,cAAc;AACd,WAAA,iBAAiB,KAAK;IAAc,CAC5C;AAAA,EACL;AAAA,EAEA,gBAAgB,KAAoC;AAC3C,SAAA,cAAc,KAAK,GAAG;AAAA,EAC/B;AAAA,EAEA,OAAO,YACH,WACA,MAAc,gBACe;AACtB,WAAA,KAAK,SAAS,EAAE,MAAM;AACzB,aAAO,UAAU,SAAS,GAAG,EAAE,KAAK,CAAC,UAAgC;AACjE,YAAI,eAAe;AACnB,YAAI,CAAC,cAAc;AACf,iBAAO,kBAAkB,YAAY,SAAS,EAAE,KAAK,CAAC,eAAe;AAClD,2BAAA,IAAI,qBAAqB,WAAW,UAAU;AAC7D,yBAAa,WAAW;AACd,sBAAA,cAAc,KAAK,MAAM,YAAY;AACxC,mBAAA;AAAA,UAAA,CACV;AAAA,QACL;AACO,eAAA;AAAA,MAAA,CACV;AAAA,IAAA,CACJ;AAAA,EACL;AAAA,EAEA,+BAA+B,IAA2B;AAC/C,WAAA,YAAyB,KAAK,WAAW,aAAa,cAAc,KAAK,EAAE,KAC9E,CAAC,kBAAkB;;AACX,UAAA,iBAAiB,cAAc,OAAO,IAAI;AAC1C,YAAI,cAAc,OAAO;AACf,gBAAA,EAAE,MAAM,WAAW,cAAc;AAClC,qBAAA,WAAA,mBAAQ,SAAS,MAAM;AAAA,QAChC;AAAA,MACJ;AAAA,IAAA,CAER;AAAA,EACJ;AAAA,EAEA,6BAA6B,UAAqC;AACvD,WAAA,YAAyB,KAAK,WAAW,aAAa,cAAc,KAAK,EAAE,KAC9E,CAAC,WAAW;AACR,UAAI,gBAAgB;AACpB,UAAI,eAAe;AACf,sBAAc,4BAA4B;AAAA,MAAA,OACvC;AACa,wBAAA,EAAE,2BAA2B;MACjD;AACA,WAAK,cAAc;AAEd,aAAA,KAAK,iBAAiB,KAAK,cAAc,KAAK,WAAW,KAC1D,QAAQ;IAAQ,CAG5B;AAAA,EACJ;AAAA,EAEA,iBAAiB,IAAY;AACnB,UAAA,QAAQ,KAAK,YAAY,UAAU,CAAC,MAAM,EAAE,aAAa,OAAO,EAAE;AACxE,QAAI,QAAQ,IAAI;AACL,aAAA,KAAK,YAAY,OAAO;AAAA,IACnC;AACA,WAAO,IAAI,uBAAuB,KAAK,WAAW,EAAE;AAAA,EACxD;AAAA,EAEA,iBAAiB,MAAc,SAAoC;AAC/D,UAAM,WAAW;AAAA,MACb;AAAA,MACA;AAAA,IAAA;AAEC,SAAA,UAAU,KAAK,QAAQ;AAE5B,SAAK,YACA,OAAO,CAAC,eAAe,WAAW,aAAa,UAAU,QAAQ,IAAI,IAAI,EAAE,EAC3E,QAAQ,CAAC,eAAe;AAChB,WAAA,cAAc,UAAU,UAAU;AAAA,IAAA,CAC1C;AAAA,EACT;AAAA,EAEA,mBACI,cACA,WACO;AACD,UAAA,QAAQ,KAAK,YAAY,UAAU,CAAC,MAAM,EAAE,aAAa,OAAO,aAAa,EAAE;AACjF,QAAA;AACJ,QAAI,QAAQ,GAAG;AACE,mBAAA,EAAE,cAAc;AACxB,WAAA,YAAY,KAAK,UAAU;AAC1B,YAAA,iBAAiB,CAAC,cAAwB;AAC5C,YAAI,WAAW;AACX,eAAK,UACA,OAAO,CAAC,aAAa,UAAU,QAAQ,SAAS,IAAI,IAAI,EAAE,EAC1D,QAAQ,CAAC,aAAa;AACd,iBAAA,cAAc,UAAU,UAAU;AAAA,UAAA,CAC1C;AAAA,QACT;AAAA,MAAA;AAGJ,WAAK,cAAc,KACf,aAAa,UAAU,CAAC,OAAO,SAAS;AAC9B,cAAA,SAAQ,KAAK,YAAY,UAAU,CAAC,MAAM,EAAE,iBAAiB,IAAI;AACvE,iBAAQ,MAAM,KAAK,YAAY,OAAO,QAAO,CAAC;AAC9C,aAAK,WACA,WACA,EAAA,OAAO,4BAA4B,EACnC,OAAO,EACP,gBAAgB,EAAE,QAAQ,MAAO,CAAA;AAEjC,aAAA,OAAO,SAAS,sBAAsB,IAAI,EAAE,SAAS,MAAM;AAAA,MACnE,CAAA,CACL;AACA,WAAK,cAAc,KACf,aAAa,kBAAkB,CAAC,OAAO,SAAS;AACtC,cAAA,EAAE,OAAO,YAAoD;AAC3D,gBAAA,QAAQ,CAAC,oBAAoB;AACjC,eAAK,iBAAiB,iBAAiB,QAAQ,CAAC,YAAY;AAChD;UAAA,CACX;AAAA,QAAA,CACJ;AACD,uBAAe,KAAK;AAAA,MACvB,CAAA,CACL;AAEA,WAAK,cAAc,KACf,aAAa,UAAU,CAAC,OAAO,aAAa;;AACxC,cAAM,UAAuB;AAAA,UACzB,IAAI,aAAa;AAAA,UACjB,OAAO,WAAK,WAAL,mBAAa;AAAA,UACpB,2BAA2B,WAAK,gBAAL,mBAAkB;AAAA,QAAA;AAEjD,aAAK,cAAc;AACd,aAAA,iBAAiB,KAAK,cAAc,OAAO;AAEhD,aAAK,kBAAkB,EAAE,QAAQ,SAAU,CAAA;AAAA,MAC9C,CAAA,CACL;AAEA,WAAK,cAAc,KACf,aAAa,gBAAgB,CAAC,OAAO,SAAS;AACrC,aAAA,OAAO,SAAS,+BAA+B,IAAI;AACxD,aAAK,kBAAkB,EAAE,OAAO,EAAE,MAAM,QAAQ;AAAA,MACnD,CAAA,CACL;AAEA,qBAAe,aAAa,SAAS;AAC9B,aAAA;AAAA,IACX;AACA,iBAAa,KAAK,YAAY;AACvB,WAAA;AAAA,EACX;AAAA,EAEA,kBAA0B,YAAiB,MAAc,iCAAiC;AACtF,QAAI,KAAK,aAAa;AAClB,WAAK,WAAW,MAAM;AAAA,QAClB,KAAK;AAAA,QACL,YAAY,EAAE,WAAW;AAAA,QACzB,QAAQ,KAAK;AAAA,QACb,UAAU;AAAA,MAAA,CACb;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,cAAc,UAA4C,YAAiB;AACzE,UAAA,UAAU,SAAS,QACrB,WAAW,aAAa,eAAe,SAAS,IAAI,GACpD,WAAW,SACf;AACA,QAAI,SAAS;AACT,UAAI,CAAC,KAAK,iBAAiB,SAAS,OAAO;AAClC,aAAA,iBAAiB,SAAS,QAAQ,CAAA;AAAA,MAC3C;AACA,WAAK,iBAAiB,SAAS,MAAM,KAAK,OAAO;AAAA,IACrD;AAAA,EACJ;AAAA,EAEA,oBAAoB;AACT,WAAA,YAAyB,KAAK,WAAW,aAAa,cAAc,KAAK,EAAE,KAC9E,CAAC,WAAW,iCAAQ,KACxB;AAAA,EACJ;AAAA,EAEA,UAAU;AACN,WAAO,KAAK,KAAK,gBAAgB,EAAE,QAAQ,CAAC,QAAQ;AAChD,WAAK,iBAAiB,KAAK,QAAQ,CAAC,YAAY;AACpC;MAAA,CACX;AAAA,IAAA,CACJ;AACI,SAAA,cAAc,QAAQ,CAAC,gBAAgB;AAC5B;IAAA,CACf;AACD,SAAK,cAAc;AACnB,SAAK,YAAY;EACrB;AAAA,EAEA,OAAoB,yBAChB,OACA,WACA,eACA,UACF;AAAA;AACM,UAAA,qBAAqB,SAAS,GAAG;AACjC,cAAM,eAAe;AACjB,YAAA,YAAY,SAAS,eAAe,uBAAuB;AAC/D,YAAI,CAAC,WAAW;AACA,sBAAA,SAAS,cAAc,GAAG;AAC5B,oBAAA,aAAa,QAAQ,GAAG;AAClC,oBAAU,KAAK;AACN,mBAAA,KAAK,YAAY,SAAS;AAAA,QACvC;AACe,uBAAA,WAAW,eAAe,SAAS;AAAA,MACtD;AACA,qBAAe,WAAW,aAAa;AAAA,IAC3C;AAAA;AAAA,EAEA,OAAoB,0BAA0B,WAAsB,eAAoB;AAAA;AAC7E,aAAA,uBAAuB,WAAW,aAAa;AAAA,IAC1D;AAAA;AACJ;AClQY,IAAA,oDAAA,qCAAL;AACM,mCAAA,YAAA;AACE,mCAAA,cAAA;AACC,mCAAA,eAAA;AACQ,mCAAA,uBAAA;AACP,mCAAA,gBAAA;AACN,mCAAA,UAAA;AACA,mCAAA,UAAA;AACQ,mCAAA,kBAAA;AARP,SAAA;AAAA,GAAA,mCAAA,CAAA,CAAA;AChCZ,MAAM,kBAAkB,CACpB,UACA,YAC+B;AAC/B,SAAO,SAAS,OAAO,CAAC,KAAY,SAAc,UAAkB;;AAChE,UAAM,UAAU,iCACT,UADS;AAAA,MAEZ,SAAS,CAAC,iCAAK,QAAQ,UAAb,EAAsB,KAAK,QAAQ,MAAK;AAAA,IAAA;AAEtD,QAAI,IAAI,SAAS,KAAK,QAAQ,SAAS,wBAAwB,QAAQ;AAC7D,YAAA,WAAW,IAAI,IAAI,SAAS;AAE7B,UAAA,CAAC,WAAW,YAAY,KACzB,KAAK,IAAI,SAAS,YAAY,QAAQ,SAAS,IAAI,SACrD;AAEM,YAAA,gBAAS,WAAT,mBAAiB,UAAS,eAAQ,WAAR,mBAAgB,SAC1C,SAAS,SAAS,QAAQ,MAC5B;AACE,mBAAS,YAAY,QAAQ;AACpB,mBAAA,QAAQ,KAAK,iCAAK,QAAQ,UAAb,EAAsB,KAAK,QAAQ,IAAA,EAAK;AACvD,iBAAA;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,KAAK,OAAO;AACT,WAAA;AAAA,EACX,GAAG,CAAE,CAAA;AACT;AAiBM,MAAA,wBAAwB,CAAC,cAAyB;AACpD,SAAO,QAAQ,IAAI;AAAA,IACf,qBAAqB,YAAY,SAAS;AAAA,IAC1C,UAAU,SAAS,QAAQ;AAAA,EAC9B,CAAA,EAAE,KAAK,CAAC,CAAC,UAAU,YAAoD;AACpE,WAAO,qBACH,WACA,gBACA,OAAO,sBACP,CAAC,cAAc;AACL,YAAA,YAAY,OAAO;AACzB,YAAM,OAAO,UAAU,OAAO,MAAM,UAAU,KAAK,QAAQ;AACrD,YAAA,eAAe,SAAS,iBAAiB,IAAI;AACnD,YAAM,kBAAkB,SAAS,mBAAmB,cAAc,SAAS;AAErE,YAAA,yBAAyB,IAAI,KAAK;AAElC,YAAA,gBAAgB,CAAC,eAAgD;AAC7D,cAAA,EAAE,YAAY,OAAO;AAC3B,YAAI,WAAW;AACX,gBAAM,eAAe,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS;AACtE,uBAAa,aAAa,YAAY;AAC/B,iBAAA;AAAA,QACX;AAAA,MAAA;AAEU,oBAAA,UAAU,WAA4C,aAAa,CAAC;AAElF,mBAAa,yBAAyB,IAAI;AAEpC,YAAA,gBAAgB,CAAC,kBAAuB;AACpC,cAAA,EAAE,SAAS,cAAc,aAAa;AAC5C,kBAAU,gBAAgB;AAAA,UACtB;AAAA,UACA;AAAA,UACA,UAAU,gBAAgB,UAAU,sBAAsB;AAAA,QAAA,CAC7D;AAAA,MAAA;AAGS,oBAAA,aAAa,kBAAkB;AAE7C,UAAI,iBAAiB;AAEjB,kBAAU,QAAQ,OAAO,eAAe,CAAC,MAAM,YAAY;AACvD,cAAI,SAAS;AACH,kBAAA,EAAE,gBAAgB,sBAAsB;AAC9C,gBAAI,gBAAgB;AAChB,kBAAI,mBAAmB;AACD,kCAAA,EAAE,KAAK,CAAC,SAAiB;AACvC,sBAAI,MAAM;AACO,iCAAA,KAAK,MAAM,IAAI;AAAA,kBAChC;AAAA,gBAAA,CACH;AAAA,cACL;AACA;AAAA,YACJ;AAAA,UACJ;AACa,uBAAA,KAAK,MAAM,KAAK,IAAI;AAAA,QAAA,CACpC;AAED,kBAAU,QAAQ,OAAO,eAAe,CAAC,MAAM,YAAY;AAAA,QAAA,CAAE;AAE7D,kBAAU,QAAQ,OAAO,QAAQ,CAAC,MAAM,YAAY;AAAA,QAAA,CAAE;AAEtD,kBAAU,QAAQ,OAAO,UAAU,CAAC,MAAM,YAAY;AAAA,QAAA,CAAE;AAAA,MAC5D;AAEA,YAAM,cAAc,aAAa,OAAO,UACpC,wBACA,CAAC,GAAQ,qBAA0C;AAC/C,sBAAc,gBAAgB;AAAA,MAAA,CAEtC;AAEA,aAAO,MAAM;AACT,qBAAa,yBAAyB,KAAK;AAC/B;AACR,YAAA,CAAC,aAAa,QAAQ;AAIR,wBAAA,EAAE,UAAU,IAAI,cAAc,CAAA,GAAI,SAAS,MAAA,CAAO;AAAA,QACpE;AAAA,MAAA;AAAA,IACJ,GAEJ,EAAE,iBAAiB,KAAA,CACvB;AAAA,EAAA,CACH;AACL;AC5IM,MAAA,oCAAoC,CAAC,cAAyB;AAChE,SAAO,QAAQ,IAAI;AAAA,IACf,kBAAkB,YAAY,SAAS;AAAA,IACvC,qBAAqB,YAAY,SAAS;AAAA,IAC1C,UAAU,SAAS,QAAQ;AAAA,EAAA,CAC9B,EAAE,KACC,CAAC,CAAC,YAAY,UAAU,YAIlB;AACF,WAAO,qBACH,WACA,8BACA,OAAO,uBACP,CAAC,cAAc;AACX,gBAAU,QAAQ,OAAO,UAAU,CAAC,UAAU,CAAA,MAAO;;AACjD,uBAAS,kBAAkB,MAA3B,mBAA8B,KAAK,CAAC,UAAU;AAC1C,mBAAS,OAAO,SAAS,MAAM,MAAM,MAAM,MAAM;AAAA,QAAA;AAAA,MACpD,CACJ;AAAA,IAAA,CAET;AAAA,EAAA,CAER;AACJ;AC3CO,MAAM,iCAAiC,CAC1C,WACA,MACA,cACC;AACD,SAAO,UAAU,SAAS,mBAAmB,EAAE,KAAK,CAAO,MAAyB;AAChF,UAAM,WAAW,MAAM,qBAAqB,YAAY,SAAS;AACxD,aAAA,gBACL,EAAE,kBACE,MACA,KAAK,MAAM,SAAS,CACxB,CACJ;AAAA,EAAA,EACH;AACL;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}