@product7/feedback-sdk 1.3.3 → 1.3.5
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/dist/feedback-sdk.js +2441 -3240
- package/dist/feedback-sdk.js.map +1 -1
- package/dist/feedback-sdk.min.js +1 -1
- package/dist/feedback-sdk.min.js.map +1 -1
- package/package.json +1 -1
- package/src/api/services/MessengerService.js +76 -0
- package/src/core/BaseAPIService.js +4 -0
- package/src/index.js +2 -3
- package/src/styles/base.js +27 -52
- package/src/styles/changelog.js +152 -269
- package/src/styles/components.js +489 -0
- package/src/styles/design-tokens.js +104 -0
- package/src/styles/feedback.js +59 -369
- package/src/styles/messenger-core.js +390 -0
- package/src/styles/messenger-features.js +347 -0
- package/src/styles/messenger-help.js +298 -0
- package/src/styles/messenger-themes.js +500 -0
- package/src/styles/messenger-views.js +618 -0
- package/src/styles/messenger.js +558 -0
- package/src/styles/styles.js +24 -2
- package/src/styles/surveys.js +354 -0
- package/src/widgets/BaseWidget.js +25 -58
- package/src/widgets/ButtonWidget.js +3 -18
- package/src/widgets/ChangelogWidget.js +7 -48
- package/src/widgets/InlineWidget.js +16 -13
- package/src/widgets/MessengerWidget.js +37 -51
- package/src/widgets/SurveyWidget.js +42 -146
- package/src/widgets/TabWidget.js +2 -22
- package/src/widgets/messenger/MessengerState.js +49 -46
- package/src/widgets/messenger/components/MessengerLauncher.js +10 -5
- package/src/widgets/messenger/components/MessengerPanel.js +5 -27
- package/src/widgets/messenger/components/NavigationTabs.js +5 -14
- package/src/widgets/messenger/views/ChangelogView.js +13 -14
- package/src/widgets/messenger/views/ChatView.js +43 -36
- package/src/widgets/messenger/views/ConversationsView.js +16 -21
- package/src/widgets/messenger/views/HelpView.js +10 -10
- package/src/widgets/messenger/views/HomeView.js +11 -16
- package/src/widgets/messenger/views/PreChatFormView.js +18 -30
- package/src/styles/messengerStyles.js +0 -2328
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback-sdk.min.js","sources":["../src/api/mock-data/index.js","../src/api/utils/helpers.js","../src/api/services/ChangelogService.js","../src/api/services/FeedbackService.js","../src/api/services/HelpService.js","../src/api/services/MessengerService.js","../src/utils/errors.js","../src/api/services/SurveyService.js","../src/core/BaseAPIService.js","../src/core/APIService.js","../src/core/EventBus.js","../src/utils/helpers.js","../src/widgets/BaseWidget.js","../src/widgets/ButtonWidget.js","../src/widgets/ChangelogWidget.js","../src/widgets/InlineWidget.js","../src/widgets/messenger/MessengerState.js","../src/widgets/messenger/components/MessengerLauncher.js","../src/widgets/messenger/components/NavigationTabs.js","../src/widgets/messenger/components/MessengerPanel.js","../src/widgets/messenger/views/ChangelogView.js","../src/widgets/messenger/views/ChatView.js","../src/widgets/messenger/views/ConversationsView.js","../src/widgets/messenger/views/HelpView.js","../src/widgets/messenger/views/HomeView.js","../src/widgets/messenger/views/PreChatFormView.js","../src/core/WebSocketService.js","../src/widgets/MessengerWidget.js","../src/widgets/SurveyWidget.js","../src/widgets/TabWidget.js","../src/widgets/WidgetFactory.js","../src/core/FeedbackSDK.js","../src/index.js"],"sourcesContent":["export const MOCK_CHANGELOGS = [\n\t{\n\t\tid: 'changelog_1',\n\t\ttitle:\n\t\t\t'Feature prioritization, multiple roadmaps, and feature request analytics.',\n\t\texcerpt:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tdescription:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiNEQkVBRkUiLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzE1NUVFRiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMzAiIHk9IjQwIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjQiIGZpbGw9IiNFNUU3RUIiLz48cmVjdCB4PSIzMCIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHRleHQgeD0iNDAiIHk9Ijg1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMUYyOTM3Ij4yMDA8L3RleHQ+PHRleHQgeD0iNDAiIHk9Ijk1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjgiIGZpbGw9IiM2QjcyODAiPlBvc3RzPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI0MCIgcng9IjQiIGZpbGw9IiNGM0Y0RjYiLz48cmVjdCB4PSIyNzAiIHk9IjYwIiB3aWR0aD0iODAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHBhdGggZD0iTTMwIDEzMEgzNzBNMzAgMTUwSDM3ME0zMCAxNzBIMzcwTTMwIDE5MEgzNzAiIHN0cm9rZT0iI0U1RTdFQiIgc3Ryb2tlLXdpZHRoPSIxIi8+PHBhdGggZD0iTTUwIDE2MEwxMDAgMTQwTDE1MCAxNTBMMjAwIDEzMEwyNTAgMTM1TDMwMCAxMjBMMzUwIDEyNSIgc3Ryb2tlPSIjMTU1RUVGIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz48L3N2Zz4=',\n\t\tslug: 'feature-prioritization-roadmaps-analytics',\n\t\tpublished_at: '2025-03-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'New Feature', color: '#10B981' },\n\t\t\t{ name: 'Analytics', color: '#6366F1' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_2',\n\t\ttitle: 'Dark mode support and UI improvements',\n\t\texcerpt:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tdescription:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiMxRjI5MzciLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0iIzM3NDE1MSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjEiLz48Y2lyY2xlIGN4PSIyMDAiIGN5PSIxMjUiIHI9IjQwIiBmaWxsPSIjRkJCRjI0Ii8+PHBhdGggZD0iTTIyMCAxMjVDMjIwIDEzNiAyMTEgMTQ1IDIwMCAxNDVDMTg5IDE0NSAxODAgMTM2IDE4MCAxMjVDMTgwIDExNCAxODkgMTA1IDIwMCAxMDVDMjExIDEwNSAyMjAgMTE0IDIyMCAxMjVaIiBmaWxsPSIjMUYyOTM3Ii8+PC9zdmc+',\n\t\tslug: 'dark-mode-ui-improvements',\n\t\tpublished_at: '2025-03-01T10:00:00Z',\n\t\tlabels: [{ name: 'Enhancement', color: '#8B5CF6' }],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_3',\n\t\ttitle: 'Performance improvements and bug fixes',\n\t\texcerpt:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tdescription:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tslug: 'performance-improvements-bug-fixes',\n\t\tpublished_at: '2025-02-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'Bug Fix', color: '#EF4444' },\n\t\t\t{ name: 'Performance', color: '#F59E0B' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n];\n\nexport const MOCK_CONVERSATIONS = [\n\t{\n\t\tid: 'conv_1',\n\t\tsubject: 'Question about pricing',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 1,\n\t\tassigned_user: {\n\t\t\tid: 'user_1',\n\t\t\tname: 'Sarah',\n\t\t\tavatar: null,\n\t\t},\n\t},\n\t{\n\t\tid: 'conv_2',\n\t\tsubject: 'Feature request',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(\n\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000\n\t\t).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 0,\n\t\tassigned_user: {\n\t\t\tid: 'user_2',\n\t\t\tname: 'Tom',\n\t\t\tavatar: null,\n\t\t},\n\t},\n];\n\nexport const MOCK_MESSAGES = {\n\tconv_1: [\n\t\t{\n\t\t\tid: 'msg_1',\n\t\t\tcontent: \"Hi there! 👋 I'm Sarah. How can I help you today?\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Sarah',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 50 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_2',\n\t\t\tcontent: 'Hi! I have a question about your enterprise pricing.',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n\tconv_2: [\n\t\t{\n\t\t\tid: 'msg_3',\n\t\t\tcontent: \"Hello! I'm Tom from the product team.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_4',\n\t\t\tcontent: 'I would love to see a dark mode feature!',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(\n\t\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000 - 30 * 60 * 1000\n\t\t\t).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_5',\n\t\t\tcontent:\n\t\t\t\t\"Great suggestion! That feature will be available next week. I'll let you know when it's ready.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n};\n\nexport const MOCK_HELP_COLLECTIONS = [\n\t{\n\t\tid: 'collection_1',\n\t\ttitle: 'Product Overview',\n\t\tdescription: 'See how your AI-first customer service solution works.',\n\t\tarticleCount: 24,\n\t\ticon: 'ph-book-open',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_2',\n\t\ttitle: 'Getting Started',\n\t\tdescription: 'Everything you need to know to get started with Product7.',\n\t\tarticleCount: 30,\n\t\ticon: 'ph-rocket',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_3',\n\t\ttitle: 'AI Agent',\n\t\tdescription:\n\t\t\t'Resolving customer questions instantly and accurately—from live chat to email.',\n\t\tarticleCount: 82,\n\t\ticon: 'ph-robot',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_4',\n\t\ttitle: 'Channels',\n\t\tdescription:\n\t\t\t'Enabling the channels you use to communicate with customers, all from the Inbox.',\n\t\tarticleCount: 45,\n\t\ticon: 'ph-chat-circle',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_5',\n\t\ttitle: 'Billing & Payments',\n\t\tdescription: 'Manage your subscription, invoices, and payment methods.',\n\t\tarticleCount: 12,\n\t\ticon: 'ph-credit-card',\n\t\turl: '#',\n\t},\n];\n\nexport const MOCK_SURVEYS = [\n\t{\n\t\tid: 'mock_nps_survey',\n\t\ttype: 'nps',\n\t\ttitle: 'How likely are you to recommend us?',\n\t\tdescription: 'Your feedback helps us improve',\n\t\tlow_label: 'Not likely',\n\t\thigh_label: 'Very likely',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n\t{\n\t\tid: 'mock_csat_survey',\n\t\ttype: 'csat',\n\t\ttitle: 'How satisfied are you?',\n\t\tdescription: 'Rate your experience with our product',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n\t{\n\t\tid: 'mock_ces_survey',\n\t\ttype: 'ces',\n\t\ttitle: 'How easy was it?',\n\t\tdescription: 'Rate the ease of completing your task',\n\t\tlow_label: 'Very difficult',\n\t\thigh_label: 'Very easy',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n];\n","export const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function getDeviceInfo() {\n\tif (typeof navigator === 'undefined') {\n\t\treturn { device: null, browser: null, os: null };\n\t}\n\n\tconst ua = navigator.userAgent;\n\n\tlet device = 'desktop';\n\tif (/Mobi|Android/i.test(ua)) {\n\t\tdevice = /Tablet|iPad/i.test(ua) ? 'tablet' : 'mobile';\n\t}\n\n\tlet browser = 'unknown';\n\tif (ua.includes('Firefox')) browser = 'firefox';\n\telse if (ua.includes('Edg')) browser = 'edge';\n\telse if (ua.includes('Chrome')) browser = 'chrome';\n\telse if (ua.includes('Safari')) browser = 'safari';\n\telse if (ua.includes('Opera') || ua.includes('OPR')) browser = 'opera';\n\n\tlet os = 'unknown';\n\tif (ua.includes('Windows')) os = 'windows';\n\telse if (ua.includes('Mac')) os = 'macos';\n\telse if (ua.includes('Linux')) os = 'linux';\n\telse if (ua.includes('Android')) os = 'android';\n\telse if (ua.includes('iPhone') || ua.includes('iPad')) os = 'ios';\n\n\treturn { device, browser, os };\n}\n","import { MOCK_CHANGELOGS } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class ChangelogService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { success: true, data: MOCK_CHANGELOGS };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/changelogs',\n\t\t\t\toptions\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n}\n","import { delay } from '../utils/helpers.js';\n\nexport class FeedbackService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync submitFeedback(feedbackData) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(500);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_post_' + Date.now(),\n\t\t\t\t\ttitle: feedbackData.title,\n\t\t\t\t\tcontent: feedbackData.content,\n\t\t\t\t},\n\t\t\t\tmessage: 'Feedback submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst payload = {\n\t\t\tboard:\n\t\t\t\tfeedbackData.board_id || feedbackData.board || feedbackData.boardId,\n\t\t\ttitle: feedbackData.title,\n\t\t\tcontent: feedbackData.content,\n\t\t\tattachments: feedbackData.attachments || [],\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst response = await this.api._makeRequest('/widget/feedback', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn response;\n\t\t});\n\t}\n}\n","import { MOCK_HELP_COLLECTIONS } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class HelpService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getHelpCollections(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { status: true, data: MOCK_HELP_COLLECTIONS };\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/collections',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync searchHelpArticles(query, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst filtered = MOCK_HELP_COLLECTIONS.filter(\n\t\t\t\t(c) =>\n\t\t\t\t\tc.title.toLowerCase().includes(query.toLowerCase()) ||\n\t\t\t\t\tc.description.toLowerCase().includes(query.toLowerCase())\n\t\t\t);\n\t\t\treturn { status: true, data: filtered };\n\t\t}\n\n\t\tconst params = { q: query, ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/search',\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n}\n","import { MOCK_CONVERSATIONS, MOCK_MESSAGES } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class MessengerService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getMessengerSettings() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tgreeting_message: 'Hi there! How can we help you today?',\n\t\t\t\t\tteam_name: 'Support Team',\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/settings', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_CONVERSATIONS,\n\t\t\t\tmeta: { total: MOCK_CONVERSATIONS.length, page: 1, limit: 20 },\n\t\t\t};\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/messenger/conversations',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversation(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst conv = MOCK_CONVERSATIONS.find((c) => c.id === conversationId);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { ...conv, messages: MOCK_MESSAGES[conversationId] || [] },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}`,\n\t\t\t{\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync startConversation(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ content: data.content }),\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getUnreadCount() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tconst count = MOCK_CONVERSATIONS.reduce(\n\t\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t\t0\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { unread_count: count, unread_conversations: count > 0 ? 1 : 0 },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/unread', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/read`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n}\n","export class SDKError extends Error {\n\tconstructor(message, cause) {\n\t\tsuper(message);\n\t\tthis.name = 'SDKError';\n\t\tthis.cause = cause;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, SDKError);\n\t\t}\n\t}\n}\n\nexport class APIError extends Error {\n\tconstructor(status, message, response) {\n\t\tsuper(message);\n\t\tthis.name = 'APIError';\n\t\tthis.status = status;\n\t\tthis.response = response;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, APIError);\n\t\t}\n\t}\n\n\tisNetworkError() {\n\t\treturn this.status === 0;\n\t}\n\n\tisClientError() {\n\t\treturn this.status >= 400 && this.status < 500;\n\t}\n\n\tisServerError() {\n\t\treturn this.status >= 500 && this.status < 600;\n\t}\n}\n\nexport class WidgetError extends Error {\n\tconstructor(message, widgetType, widgetId) {\n\t\tsuper(message);\n\t\tthis.name = 'WidgetError';\n\t\tthis.widgetType = widgetType;\n\t\tthis.widgetId = widgetId;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, WidgetError);\n\t\t}\n\t}\n}\n\nexport class ConfigError extends Error {\n\tconstructor(message, configKey) {\n\t\tsuper(message);\n\t\tthis.name = 'ConfigError';\n\t\tthis.configKey = configKey;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ConfigError);\n\t\t}\n\t}\n}\n\nexport class ValidationError extends Error {\n\tconstructor(message, field, value) {\n\t\tsuper(message);\n\t\tthis.name = 'ValidationError';\n\t\tthis.field = field;\n\t\tthis.value = value;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ValidationError);\n\t\t}\n\t}\n}\n\nexport class ErrorHandler {\n\tconstructor(debug = false) {\n\t\tthis.debug = debug;\n\t}\n\n\thandle(error, context = '') {\n\t\tconst errorInfo = {\n\t\t\tname: error.name,\n\t\t\tmessage: error.message,\n\t\t\tcontext,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (error instanceof APIError) {\n\t\t\terrorInfo.status = error.status;\n\t\t\terrorInfo.type = 'api';\n\t\t} else if (error instanceof WidgetError) {\n\t\t\terrorInfo.widgetType = error.widgetType;\n\t\t\terrorInfo.widgetId = error.widgetId;\n\t\t\terrorInfo.type = 'widget';\n\t\t} else if (error instanceof ConfigError) {\n\t\t\terrorInfo.configKey = error.configKey;\n\t\t\terrorInfo.type = 'config';\n\t\t} else if (error instanceof ValidationError) {\n\t\t\terrorInfo.field = error.field;\n\t\t\terrorInfo.value = error.value;\n\t\t\terrorInfo.type = 'validation';\n\t\t} else {\n\t\t\terrorInfo.type = 'unknown';\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tconsole.error('[FeedbackSDK Error]', errorInfo, error);\n\t\t} else {\n\t\t\tconsole.error('[FeedbackSDK Error]', error.message);\n\t\t}\n\n\t\treturn errorInfo;\n\t}\n\n\tgetUserMessage(error) {\n\t\tif (error instanceof APIError) {\n\t\t\tif (error.isNetworkError()) {\n\t\t\t\treturn 'Network error. Please check your connection and try again.';\n\t\t\t} else if (error.isClientError()) {\n\t\t\t\treturn 'Invalid request. Please check your input and try again.';\n\t\t\t} else if (error.isServerError()) {\n\t\t\t\treturn 'Server error. Please try again later.';\n\t\t\t}\n\t\t\treturn 'Failed to submit feedback. Please try again.';\n\t\t}\n\n\t\tif (error instanceof ValidationError) {\n\t\t\treturn `Please check your ${error.field}: ${error.message}`;\n\t\t}\n\n\t\tif (error instanceof ConfigError) {\n\t\t\treturn 'Configuration error. Please check your SDK setup.';\n\t\t}\n\n\t\tif (error instanceof WidgetError) {\n\t\t\treturn 'Widget error. Please try refreshing the page.';\n\t\t}\n\n\t\treturn 'An unexpected error occurred. Please try again.';\n\t}\n}\n","import { APIError } from '../../utils/errors.js';\nimport { MOCK_SURVEYS } from '../mock-data';\nimport { delay, getDeviceInfo } from '../utils/helpers.js';\n\nexport class SurveyService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { success: true, data: MOCK_SURVEYS };\n\t\t}\n\n\t\tconst params = {\n\t\t\turl:\n\t\t\t\tcontext.url ||\n\t\t\t\t(typeof window !== 'undefined' ? window.location.href : ''),\n\t\t\t...getDeviceInfo(),\n\t\t\t...(context.userProperties && {\n\t\t\t\tuser_properties: context.userProperties,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/surveys/active',\n\t\t\t\tparams\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_response_' + Date.now(),\n\t\t\t\t\tsurvey_id: surveyId,\n\t\t\t\t\t...responseData,\n\t\t\t\t},\n\t\t\t\tmessage: 'Survey response submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst payload = {\n\t\t\trating: responseData.rating,\n\t\t\tfeedback: responseData.feedback || '',\n\t\t\tanswers: responseData.answers || {},\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/responses`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(100);\n\t\t\treturn { success: true, message: 'Survey dismissed successfully' };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/dismiss`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n}\n","import { APIError } from '../utils/errors.js';\n\nexport class BaseAPIService {\n\tconstructor(config = {}) {\n\t\tthis.workspace = config.workspace;\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.userContext = config.userContext || null;\n\t\tthis.mock = config.mock || false;\n\t\tthis.env = config.env || 'production';\n\t\tthis.baseURL = this._getBaseURL(config);\n\n\t\tthis._loadStoredSession();\n\t}\n\n\t_getBaseURL(config) {\n\t\tif (config.apiUrl) return config.apiUrl;\n\n\t\tconst ENV_URLS = {\n\t\t\tproduction: {\n\t\t\t\tbase: 'https://api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tstaging: {\n\t\t\t\tbase: 'https://staging.api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.staging.api.product7.io/api/v1`,\n\t\t\t},\n\t\t};\n\n\t\tconst envConfig = ENV_URLS[this.env] || ENV_URLS.production;\n\t\treturn this.workspace\n\t\t\t? envConfig.withWorkspace(this.workspace)\n\t\t\t: envConfig.base;\n\t}\n\n\tasync init(userContext = null) {\n\t\tif (userContext) {\n\t\t\tthis.userContext = userContext;\n\t\t}\n\n\t\tif (this.isSessionValid()) {\n\t\t\treturn { sessionToken: this.sessionToken };\n\t\t}\n\n\t\tif (!this.workspace || !this.userContext) {\n\t\t\tthrow new APIError(\n\t\t\t\t400,\n\t\t\t\t`Missing ${!this.workspace ? 'workspace' : 'user context'} for initialization`\n\t\t\t);\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn this._initMockSession();\n\t\t}\n\n\t\treturn this._initRealSession();\n\t}\n\n\tasync _initMockSession() {\n\t\tthis.sessionToken = 'mock_session_' + Date.now();\n\t\tthis.sessionExpiry = new Date(Date.now() + 3600 * 1000);\n\t\tthis._storeSession();\n\t\treturn {\n\t\t\tsessionToken: this.sessionToken,\n\t\t\tconfig: {\n\t\t\t\tprimaryColor: '#21244A',\n\t\t\t\tbackgroundColor: '#ffffff',\n\t\t\t\ttextColor: '#1F2937',\n\t\t\t\tboardId: 'feature-requests',\n\t\t\t\tsize: 'medium',\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t},\n\t\t\texpiresIn: 3600,\n\t\t};\n\t}\n\n\tasync _initRealSession() {\n\t\tconst payload = {\n\t\t\tworkspace: this.workspace,\n\t\t\tuser: this.userContext,\n\t\t};\n\n\t\ttry {\n\t\t\tconst response = await this._makeRequest('/widget/init', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\n\t\t\tthis.sessionToken = response.session_token;\n\t\t\tthis.sessionExpiry = new Date(Date.now() + response.expires_in * 1000);\n\t\t\tthis._storeSession();\n\n\t\t\treturn {\n\t\t\t\tsessionToken: this.sessionToken,\n\t\t\t\tconfig: response.config || {},\n\t\t\t\texpiresIn: response.expires_in,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new APIError(\n\t\t\t\terror.status || 500,\n\t\t\t\t`Failed to initialize widget: ${error.message}`,\n\t\t\t\terror.response\n\t\t\t);\n\t\t}\n\t}\n\n\tasync _ensureSession() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\t\tif (!this.sessionToken) {\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\t}\n\n\tasync _handleAuthRetry(method, ...args) {\n\t\ttry {\n\t\t\treturn await method.apply(this, args);\n\t\t} catch (error) {\n\t\t\tif (error.status === 401) {\n\t\t\t\tthis.sessionToken = null;\n\t\t\t\tthis.sessionExpiry = null;\n\t\t\t\tawait this.init();\n\t\t\t\treturn await method.apply(this, args);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tisSessionValid() {\n\t\treturn (\n\t\t\tthis.sessionToken && this.sessionExpiry && new Date() < this.sessionExpiry\n\t\t);\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.userContext = userContext;\n\t\tthis._storeData('feedbackSDK_userContext', userContext);\n\t}\n\n\tgetUserContext() {\n\t\treturn this.userContext;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis._removeData('feedbackSDK_session');\n\t\tthis._removeData('feedbackSDK_userContext');\n\t}\n\n\t_storeSession() {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\ttry {\n\t\t\tconst sessionData = {\n\t\t\t\ttoken: this.sessionToken,\n\t\t\t\texpiry: this.sessionExpiry.toISOString(),\n\t\t\t\tworkspace: this.workspace,\n\t\t\t};\n\t\t\tthis._storeData('feedbackSDK_session', sessionData);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_storeData(key, value) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t}\n\t}\n\n\t_removeData(key) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) throw error;\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst queryParams = new URLSearchParams();\n\t\tObject.entries(params).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tqueryParams.append(\n\t\t\t\t\tkey,\n\t\t\t\t\ttypeof value === 'object' ? JSON.stringify(value) : value\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\treturn queryParams.toString();\n\t}\n\n\t_getEndpointWithParams(endpoint, params) {\n\t\tconst queryString = this._buildQueryParams(params);\n\t\treturn `${endpoint}${queryString ? '?' + queryString : ''}`;\n\t}\n}\n","import { ChangelogService } from '../api/services/ChangelogService.js';\nimport { FeedbackService } from '../api/services/FeedbackService.js';\nimport { HelpService } from '../api/services/HelpService.js';\nimport { MessengerService } from '../api/services/MessengerService.js';\nimport { SurveyService } from '../api/services/SurveyService.js';\nimport { BaseAPIService } from './BaseAPIService.js';\n\nexport class APIService extends BaseAPIService {\n\tconstructor(config = {}) {\n\t\tsuper(config);\n\n\t\tthis.feedback = new FeedbackService(this);\n\t\tthis.survey = new SurveyService(this);\n\t\tthis.messenger = new MessengerService(this);\n\t\tthis.help = new HelpService(this);\n\t\tthis.changelog = new ChangelogService(this);\n\t}\n\n\tasync submitFeedback(data) {\n\t\treturn this.feedback.submitFeedback(data);\n\t}\n\n\tasync getActiveSurveys(context) {\n\t\treturn this.survey.getActiveSurveys(context);\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\treturn this.survey.submitSurveyResponse(surveyId, responseData);\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\treturn this.survey.dismissSurvey(surveyId);\n\t}\n\n\tasync getMessengerSettings() {\n\t\treturn this.messenger.getMessengerSettings();\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.messenger.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.messenger.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.messenger.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tconsole.log('[APIService] startConversation: session invalid, calling init...');\n\t\t\ttry {\n\t\t\t\tawait this.init();\n\t\t\t\tconsole.log('[APIService] startConversation: init result, token:', this.sessionToken ? 'set' : 'null');\n\t\t\t} catch (initError) {\n\t\t\t\tconsole.error('[APIService] startConversation: init failed:', initError.message);\n\t\t\t\tthrow initError;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.error('[APIService] startConversation: no session token after init');\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\n\t\tconsole.log('[APIService] startConversation: sending to', `${this.baseURL}/widget/messenger/conversations`, 'mock:', this.mock);\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\tconst payload = { content: data.content };\n\t\tif (data.attachments && data.attachments.length > 0) {\n\t\t\tpayload.attachments = data.attachments;\n\t\t}\n\n\t\treturn this._makeRequest(`/widget/messenger/conversations/${conversationId}/messages`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\t}\n\n\t/**\n\t * Upload a file to CDN via widget endpoint\n\t * @param {string} base64Data - Base64 encoded file data (with or without data URI prefix)\n\t * @param {string} filename - Original filename\n\t * @returns {Promise<Object>} Response with url\n\t */\n\tasync uploadFile(base64Data, filename) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.messenger.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.messenger.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.messenger.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.messenger.submitRating(conversationId, data);\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.messenger.identifyContact(data);\n\t}\n\n\tasync getHelpCollections(options) {\n\t\treturn this.help.getHelpCollections(options);\n\t}\n\n\tasync searchHelpArticles(query, options) {\n\t\treturn this.help.searchHelpArticles(query, options);\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\n\t\t\t// Invalidate mock tokens when not in mock mode (and vice versa)\n\t\t\tconst isMockToken = sessionData.token && sessionData.token.startsWith('mock_');\n\t\t\tif (isMockToken !== this.mock) {\n\t\t\t\tlocalStorage.removeItem('feedbackSDK_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[FeedbackSDK] Event callback error:', error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tonce(event, callback) {\n\t\tconst unsubscribe = this.on(event, (data) => {\n\t\t\tcallback(data);\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn unsubscribe;\n\t}\n\n\tclear() {\n\t\tthis.events.clear();\n\t}\n\n\tgetListenerCount(event) {\n\t\tconst callbacks = this.events.get(event);\n\t\treturn callbacks ? callbacks.length : 0;\n\t}\n}\n","export function generateId(prefix = 'feedback') {\n\tconst timestamp = Date.now();\n\tconst random = Math.random().toString(36).substring(2, 9);\n\treturn `${prefix}_${timestamp}_${random}`;\n}\n\nexport function deepMerge(target, source) {\n\tconst result = { ...target };\n\n\tfor (const key in source) {\n\t\tif (source.hasOwnProperty(key)) {\n\t\t\tif (\n\t\t\t\tsource[key] &&\n\t\t\t\ttypeof source[key] === 'object' &&\n\t\t\t\t!Array.isArray(source[key])\n\t\t\t) {\n\t\t\t\tresult[key] = deepMerge(target[key] || {}, source[key]);\n\t\t\t} else {\n\t\t\t\tresult[key] = source[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function executedFunction(...args) {\n\t\tconst later = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tfunc(...args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n\nexport function throttle(func, limit) {\n\tlet lastFunc;\n\tlet lastRan;\n\treturn function (...args) {\n\t\tif (!lastRan) {\n\t\t\tfunc(...args);\n\t\t\tlastRan = Date.now();\n\t\t} else {\n\t\t\tclearTimeout(lastFunc);\n\t\t\tlastFunc = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (Date.now() - lastRan >= limit) {\n\t\t\t\t\t\tfunc(...args);\n\t\t\t\t\t\tlastRan = Date.now();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlimit - (Date.now() - lastRan)\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isValidEmail(email) {\n\tif (!email || typeof email !== 'string') return false;\n\n\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\treturn emailRegex.test(email.trim());\n}\n\nexport function sanitizeHTML(str) {\n\tif (!str || typeof str !== 'string') return '';\n\n\tconst div = document.createElement('div');\n\tdiv.textContent = str;\n\treturn div.innerHTML;\n}\n\nexport function getCSSProperty(element, property, fallback = '') {\n\tif (!element || !property) return fallback;\n\n\ttry {\n\t\tconst style = window.getComputedStyle(element);\n\t\treturn style.getPropertyValue(property) || fallback;\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function isInViewport(element) {\n\tif (!element) return false;\n\n\tconst rect = element.getBoundingClientRect();\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <=\n\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t);\n}\n\nexport function scrollToElement(element, options = {}) {\n\tif (!element) return;\n\n\tconst defaultOptions = {\n\t\tbehavior: 'smooth',\n\t\tblock: 'center',\n\t\tinline: 'nearest',\n\t};\n\n\telement.scrollIntoView({ ...defaultOptions, ...options });\n}\n\nexport function getBrowserInfo() {\n\tconst userAgent = navigator.userAgent;\n\tconst platform = navigator.platform;\n\n\treturn {\n\t\tuserAgent,\n\t\tplatform,\n\t\tlanguage: navigator.language || navigator.userLanguage,\n\t\tcookieEnabled: navigator.cookieEnabled,\n\t\tscreenResolution: `${screen.width}x${screen.height}`,\n\t\twindowSize: `${window.innerWidth}x${window.innerHeight}`,\n\t\ttimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t};\n}\n\nexport function formatFileSize(bytes) {\n\tif (bytes === 0) return '0 Bytes';\n\n\tconst k = 1024;\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function delay(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function safeJsonParse(str, fallback = null) {\n\ttry {\n\t\treturn JSON.parse(str);\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function escapeRegex(string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getNestedProperty(obj, path, defaultValue = undefined) {\n\tif (!obj || !path) return defaultValue;\n\n\tconst keys = path.split('.');\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (current === null || current === undefined || !(key in current)) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\treturn current;\n}\n\nexport function setNestedProperty(obj, path, value) {\n\tif (!obj || !path) return obj;\n\n\tconst keys = path.split('.');\n\tconst lastKey = keys.pop();\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (!(key in current) || typeof current[key] !== 'object') {\n\t\t\tcurrent[key] = {};\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\tcurrent[lastKey] = value;\n\treturn obj;\n}\n\nexport function isBrowser() {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isMobile() {\n\tif (!isBrowser()) return false;\n\n\treturn (\n\t\t/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n\t\t\tnavigator.userAgent\n\t\t) || window.innerWidth <= 768\n\t);\n}\n\nexport function getCurrentTimestamp() {\n\treturn new Date().toISOString();\n}\n\nexport function validateConfig(config, required = []) {\n\tconst missing = [];\n\n\tfor (const key of required) {\n\t\tif (!config[key]) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tif (missing.length > 0) {\n\t\tthrow new Error(`Missing required configuration: ${missing.join(', ')}`);\n\t}\n\n\treturn true;\n}\n","export class BaseWidget {\n\tstatic STORAGE_KEY = 'feedback_submitted';\n\tstatic DEFAULT_COOLDOWN_DAYS = 30; // Don't show for 30 days after submission\n\n\tconstructor(options = {}) {\n\t\tthis.id = options.id;\n\t\tthis.sdk = options.sdk;\n\t\tthis.apiService = options.apiService;\n\t\tthis.type = options.type || 'base';\n\n\t\tthis.options = {\n\t\t\tcontainer: null,\n\t\t\tposition: this.sdk.config.position,\n\t\t\tboardId: this.sdk.config.boardId,\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor || '#21244A',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\ttextColor: options.textColor || '#1F2937',\n\t\t\tautoShow: false,\n\t\t\tshowBackdrop: true,\n\t\t\tcustomStyles: {},\n\t\t\tsuppressAfterSubmission: true, // Don't show widget again after submission\n\t\t\tsuppressionDays: BaseWidget.DEFAULT_COOLDOWN_DAYS,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.element = null;\n\t\tthis.panelElement = null;\n\t\tthis.backdropElement = null;\n\t\tthis.mounted = false;\n\t\tthis.destroyed = false;\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t\tisSubmitting: false,\n\t\t\ttitle: '',\n\t\t\tcontent: '',\n\t\t\temail: '',\n\t\t\tattachments: [],\n\t\t\terrors: {},\n\t\t};\n\n\t\tthis._bindMethods();\n\t}\n\n\tmount(container) {\n\t\tif (this.mounted || this.destroyed) return this;\n\n\t\t// Check if feedback was recently submitted and should be suppressed\n\t\tif (this.options.suppressAfterSubmission && this._hasRecentlySubmitted()) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\treason: 'recently_submitted',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof container === 'string') {\n\t\t\tcontainer = document.querySelector(container);\n\t\t}\n\n\t\tif (!container) {\n\t\t\tcontainer = document.body;\n\t\t}\n\n\t\tthis.container = container;\n\t\tthis.element = this._render();\n\t\tthis.container.appendChild(this.element);\n\n\t\tthis.mounted = true;\n\t\tthis._attachEvents();\n\t\tthis.onMount();\n\n\t\tif (this.options.autoShow) {\n\t\t\tthis.show();\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('widget:mounted', { widget: this });\n\t\treturn this;\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t\treturn this;\n\t}\n\n\topenPanel() {\n\t\tthis.state.isOpen = true;\n\n\t\tif (this.options.displayMode === 'modal') {\n\t\t\tthis._showLoadingModal();\n\t\t\t// Simulate loading delay then show form\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._hideLoadingModal();\n\t\t\t\tthis._renderPanel();\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tif (this.panelElement) {\n\t\t\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t\t\t}\n\t\t\t\t\tif (this.backdropElement) {\n\t\t\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, 600);\n\t\t} else {\n\t\t\tthis._renderPanel();\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (this.panelElement) {\n\t\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t\t}\n\t\t\t\tif (this.backdropElement) {\n\t\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t_showLoadingModal() {\n\t\tthis.state.isLoading = true;\n\n\t\t// Create backdrop\n\t\tthis.backdropElement = document.createElement('div');\n\t\tthis.backdropElement.className = 'feedback-panel-backdrop';\n\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\t// Create loading modal\n\t\tthis.loadingElement = document.createElement('div');\n\t\tthis.loadingElement.className = `feedback-loading-modal theme-${this.options.theme}`;\n\t\tthis.loadingElement.innerHTML = `\n\t\t\t<div class=\"feedback-loading-spinner\"></div>\n\t\t`;\n\t\tdocument.body.appendChild(this.loadingElement);\n\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.backdropElement.classList.add('show');\n\t\t\tthis.loadingElement.classList.add('show');\n\t\t});\n\t}\n\n\t_hideLoadingModal() {\n\t\tthis.state.isLoading = false;\n\t\tif (this.loadingElement) {\n\t\t\tthis.loadingElement.remove();\n\t\t\tthis.loadingElement = null;\n\t\t}\n\t}\n\n\tclosePanel() {\n\t\tif (this.panelElement) {\n\t\t\tthis.panelElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.panelElement && this.panelElement.parentNode) {\n\t\t\t\tthis.panelElement.parentNode.removeChild(this.panelElement);\n\t\t\t\tthis.panelElement = null;\n\t\t\t}\n\t\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\t\tthis.backdropElement = null;\n\t\t\t}\n\t\t\tthis._resetForm();\n\t\t}, 300);\n\t}\n\n\tasync submitFeedback() {\n\t\tif (this.state.isSubmitting) return;\n\n\t\tthis._hideError();\n\n\t\ttry {\n\t\t\tthis.state.isSubmitting = true;\n\t\t\tthis._updateSubmitButton();\n\n\t\t\tconst payload = {\n\t\t\t\ttitle: this.state.title || 'Feedback',\n\t\t\t\tcontent: this.state.content,\n\t\t\t\temail: this.state.email,\n\t\t\t\tboard_id: this.options.boardId,\n\t\t\t\tattachments: this.state.attachments,\n\t\t\t};\n\n\t\t\tif (!this.state.content.trim()) {\n\t\t\t\tthis._showError('Please enter your feedback message.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst response = await this.apiService.submitFeedback(payload);\n\n\t\t\t// Track that feedback was submitted\n\t\t\tthis._trackSubmission();\n\n\t\t\tthis._showSuccessMessage();\n\t\t\tthis.closePanel();\n\n\t\t\tthis.sdk.eventBus.emit('feedback:submitted', {\n\t\t\t\twidget: this,\n\t\t\t\tfeedback: response,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._showError('Failed to submit feedback. Please try again.');\n\t\t\tthis.sdk.eventBus.emit('feedback:error', { widget: this, error });\n\t\t} finally {\n\t\t\tthis.state.isSubmitting = false;\n\t\t\tthis._updateSubmitButton();\n\t\t}\n\t}\n\n\thandleConfigUpdate(newConfig) {\n\t\tthis.options.theme = newConfig.theme;\n\t\tif (this.element) {\n\t\t\tthis._updateTheme();\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.destroyed) return;\n\n\t\tthis.onDestroy();\n\t\tthis.closePanel();\n\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\n\t\tthis.destroyed = true;\n\t\tthis.mounted = false;\n\t\tthis.sdk.eventBus.emit('widget:destroyed', { widget: this });\n\t}\n\n\tonMount() {}\n\tonDestroy() {}\n\n\t/**\n\t * Track that feedback was submitted to localStorage\n\t */\n\t_trackSubmission() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst data = {\n\t\t\t\tsubmittedAt: Date.now(),\n\t\t\t\tboardId: this.options.boardId,\n\t\t\t};\n\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(data));\n\t\t} catch (e) {\n\t\t\t// localStorage may not be available\n\t\t\tconsole.warn('Failed to track feedback submission:', e);\n\t\t}\n\t}\n\n\t/**\n\t * Check if feedback was recently submitted (within cooldown period)\n\t * Uses backend tracking (preferred) with localStorage as fallback\n\t * @returns {boolean} true if feedback was submitted within the cooldown period\n\t */\n\t_hasRecentlySubmitted() {\n\t\tconst cooldownMs = this.options.suppressionDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\t// Check backend tracking first (from init response)\n\t\tif (this.sdk.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.sdk.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\t// Fallback to localStorage\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\tconst submittedAt = data.submittedAt;\n\n\t\t\treturn now - submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\t// localStorage may not be available or data is corrupted\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Clear the submission tracking (allow showing the widget again)\n\t */\n\tclearSubmissionTracking() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear submission tracking:', e);\n\t\t}\n\t}\n\n\t/**\n\t * Check if the widget should be shown based on submission history\n\t * @returns {boolean} true if the widget should be shown\n\t */\n\tshouldShow() {\n\t\tif (!this.options.suppressAfterSubmission) return true;\n\t\treturn !this._hasRecentlySubmitted();\n\t}\n\n\t_render() {\n\t\tthrow new Error('_render() must be implemented by concrete widget');\n\t}\n\n\t_attachEvents() {\n\t\t// Override in concrete widgets\n\t}\n\n\t_bindMethods() {\n\t\tthis.openPanel = this.openPanel.bind(this);\n\t\tthis.closePanel = this.closePanel.bind(this);\n\t\tthis.submitFeedback = this.submitFeedback.bind(this);\n\t}\n\n\t_renderPanel() {\n\t\tif (this.panelElement) return;\n\n\t\tif (this.options.showBackdrop && !this.backdropElement) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'feedback-panel-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\t\tthis.backdropElement.addEventListener('click', this.closePanel);\n\t\t}\n\n\t\tconst modeClass =\n\t\t\tthis.options.displayMode === 'modal'\n\t\t\t\t? 'feedback-modal'\n\t\t\t\t: 'feedback-panel';\n\t\tconst sizeClass = `size-${this.options.size}`;\n\t\tthis.panelElement = document.createElement('div');\n\t\tthis.panelElement.className = `${modeClass} ${sizeClass}`;\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--primary-color',\n\t\t\tthis.options.primaryColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--bg-color',\n\t\t\tthis.options.backgroundColor\n\t\t);\n\t\tthis.panelElement.style.setProperty('--text-color', this.options.textColor);\n\t\tthis.panelElement.innerHTML = this._getPanelHTML();\n\n\t\tdocument.body.appendChild(this.panelElement);\n\t\tthis._attachPanelEvents();\n\n\t\tconst firstInput = this.panelElement.querySelector('input, textarea');\n\t\tif (firstInput) {\n\t\t\tsetTimeout(() => firstInput.focus(), 350);\n\t\t}\n\t}\n\n\t_getPanelHTML() {\n\t\treturn `\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-header\">\n <h3>Send Feedback</h3>\n <button class=\"feedback-panel-close\" type=\"button\" aria-label=\"Close\">×</button>\n </div>\n <div class=\"feedback-panel-body\">\n <form class=\"feedback-form\">\n <div class=\"feedback-form-group\">\n <label for=\"feedback-title-${this.id}\">Title (optional)</label>\n <input \n type=\"text\" \n id=\"feedback-title-${this.id}\" \n name=\"title\" \n placeholder=\"Brief description of your feedback\"\n value=\"${this.state.title}\"\n />\n </div>\n <div class=\"feedback-form-group\">\n <label for=\"feedback-content-${this.id}\">Message *</label>\n <textarea \n id=\"feedback-content-${this.id}\" \n name=\"content\" \n placeholder=\"Tell us what you think...\"\n required\n >${this.state.content}</textarea>\n </div>\n <div class=\"feedback-error\" role=\"alert\"></div>\n <div class=\"feedback-form-actions\">\n <button type=\"submit\" class=\"feedback-btn feedback-btn-submit\">\n ${this.state.isSubmitting ? 'Sending...' : 'Send Feedback'}\n </button>\n </div>\n </form>\n </div>\n </div>\n `;\n\t}\n\n\t_attachPanelEvents() {\n\t\tconst panel = this.panelElement;\n\n\t\tpanel\n\t\t\t.querySelector('.feedback-panel-close')\n\t\t\t.addEventListener('click', this.closePanel);\n\n\t\tconst form = panel.querySelector('.feedback-form');\n\t\tform.addEventListener('submit', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.submitFeedback();\n\t\t});\n\n\t\tpanel\n\t\t\t.querySelector('input[name=\"title\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.title = e.target.value;\n\t\t\t});\n\n\t\tpanel\n\t\t\t.querySelector('textarea[name=\"content\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.content = e.target.value;\n\t\t\t});\n\n\t\tconst handleEscape = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.closePanel();\n\t\t\t\tdocument.removeEventListener('keydown', handleEscape);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleEscape);\n\t}\n\n\t_updateSubmitButton() {\n\t\tif (this.panelElement) {\n\t\t\tconst submitBtn = this.panelElement.querySelector('.feedback-btn-submit');\n\t\t\tif (submitBtn) {\n\t\t\t\tsubmitBtn.textContent = this.state.isSubmitting\n\t\t\t\t\t? 'Sending...'\n\t\t\t\t\t: 'Send Feedback';\n\t\t\t\tsubmitBtn.disabled = this.state.isSubmitting;\n\t\t\t}\n\t\t}\n\t}\n\n\t_showError(message) {\n\t\tif (this.panelElement) {\n\t\t\tconst errorElement = this.panelElement.querySelector('.feedback-error');\n\t\t\tif (errorElement) {\n\t\t\t\terrorElement.textContent = message;\n\t\t\t\terrorElement.classList.add('show');\n\t\t\t}\n\t\t}\n\t}\n\n\t_hideError() {\n\t\tif (this.panelElement) {\n\t\t\tconst errorElement = this.panelElement.querySelector('.feedback-error');\n\t\t\tif (errorElement) {\n\t\t\t\terrorElement.classList.remove('show');\n\t\t\t}\n\t\t}\n\t}\n\n\t_showSuccessMessage() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className = 'feedback-success-notification';\n\t\tnotification.innerHTML = `\n <div class=\"feedback-success-content\">\n <div class=\"feedback-success-icon\">✓</div>\n <span>Feedback submitted successfully!</span>\n <button class=\"feedback-success-close\" aria-label=\"Close\">×</button>\n </div>\n `;\n\n\t\tdocument.body.appendChild(notification);\n\n\t\tconst closeBtn = notification.querySelector('.feedback-success-close');\n\t\tconst closeNotification = () => {\n\t\t\tif (notification.parentNode) {\n\t\t\t\tnotification.style.opacity = '0';\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (notification.parentNode) {\n\t\t\t\t\t\tnotification.parentNode.removeChild(notification);\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t};\n\n\t\tcloseBtn.addEventListener('click', closeNotification);\n\n\t\tsetTimeout(closeNotification, 4000);\n\t}\n\n\t_resetForm() {\n\t\tthis.state.title = '';\n\t\tthis.state.content = '';\n\t\tthis.state.email = '';\n\t\tthis.state.errors = {};\n\t}\n\n\t_updateTheme() {\n\t\tif (this.element) {\n\t\t\tthis.element.className = this.element.className.replace(\n\t\t\t\t/theme-\\w+/,\n\t\t\t\t`theme-${this.options.theme}`\n\t\t\t);\n\t\t}\n\t\tif (this.panelElement) {\n\t\t\tthis.panelElement.className = this.panelElement.className.replace(\n\t\t\t\t/theme-\\w+/,\n\t\t\t\t`theme-${this.options.theme}`\n\t\t\t);\n\t\t}\n\t}\n\n\topenModal() {\n\t\tthis.openPanel();\n\t}\n\n\tcloseModal() {\n\t\tthis.closePanel();\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class ButtonWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'button' });\n\t\tthis.isMinimized = false;\n\t}\n\n\t_render() {\n\t\tconst button = document.createElement('div');\n\t\tbutton.className = `feedback-widget feedback-widget-button theme-${this.options.theme} position-${this.options.position}`;\n\t\tbutton.innerHTML = `\n <button class=\"feedback-trigger-btn\" type=\"button\">\n <svg class=\"feedback-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" fill=\"currentColor\">\n <path d=\"M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z\"/>\n </svg>\n <span class=\"feedback-text\">Feedback</span>\n \n <div class=\"feedback-minimize-icon\">\n <svg viewBox=\"0 0 256 256\">\n <path d=\"M213.66,53.66,163.31,104H192a8,8,0,0,1,0,16H144a8,8,0,0,1-8-8V64a8,8,0,0,1,16,0V92.69l50.34-50.35a8,8,0,0,1,11.32,11.32ZM112,136H64a8,8,0,0,0,0,16H92.69L42.34,202.34a8,8,0,0,0,11.32,11.32L104,163.31V192a8,8,0,0,0,16,0V144A8,8,0,0,0,112,136Z\"/>\n </svg>\n </div>\n \n <div class=\"feedback-expand-icon\">\n <svg viewBox=\"0 0 256 256\">\n <path d=\"M112,40V64.69L61.66,14.34A8,8,0,0,0,50.34,25.66L100.69,76H72a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V36A8,8,0,0,0,112,40Zm131.06,70.61a8,8,0,0,0-8.72,1.73L184,162.69V136a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H195.31l50.35-50.34A8,8,0,0,0,243.06,110.61Z\"/>\n </svg>\n </div>\n </button>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(button.style, this.options.customStyles);\n\t\t}\n\n\t\treturn button;\n\t}\n\n\t_attachEvents() {\n\t\tconst button = this.element.querySelector('.feedback-trigger-btn');\n\t\tconst minimizeIcon = this.element.querySelector('.feedback-minimize-icon');\n\t\tconst expandIcon = this.element.querySelector('.feedback-expand-icon');\n\n\t\t// Add click handlers directly to the icons\n\t\tminimizeIcon.addEventListener('click', (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tthis.minimize();\n\t\t});\n\n\t\texpandIcon.addEventListener('click', (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tthis.restore();\n\t\t});\n\n\t\t// Main button click handler\n\t\tbutton.addEventListener('click', (e) => {\n\t\t\t// Check if the click originated from an icon\n\t\t\tif (\n\t\t\t\te.target.closest('.feedback-minimize-icon') ||\n\t\t\t\te.target.closest('.feedback-expand-icon')\n\t\t\t) {\n\t\t\t\treturn; // Let the icon handlers deal with it\n\t\t\t}\n\n\t\t\tif (!this.isMinimized) {\n\t\t\t\tthis.openPanel();\n\t\t\t}\n\t\t});\n\n\t\tbutton.addEventListener('mouseenter', () => {\n\t\t\tif (!this.state.isSubmitting && !this.isMinimized) {\n\t\t\t\tbutton.style.transform = 'translateY(-2px)';\n\t\t\t}\n\t\t});\n\n\t\tbutton.addEventListener('mouseleave', () => {\n\t\t\tif (!this.isMinimized) {\n\t\t\t\tbutton.style.transform = 'translateY(0)';\n\t\t\t}\n\t\t});\n\t}\n\n\tminimize() {\n\t\tthis.isMinimized = true;\n\t\tthis.element.classList.add('minimized');\n\t}\n\n\trestore() {\n\t\tthis.isMinimized = false;\n\t\tthis.element.classList.remove('minimized');\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\t}\n\n\tupdateText(text) {\n\t\tconst textEl = this.element?.querySelector('.feedback-text');\n\t\tif (textEl) {\n\t\t\ttextEl.textContent = text;\n\t\t}\n\t}\n\n\tupdatePosition(position) {\n\t\tthis.options.position = position;\n\t\tif (this.element) {\n\t\t\tthis.element.className = this.element.className.replace(\n\t\t\t\t/position-\\w+-\\w+/,\n\t\t\t\t`position-${position}`\n\t\t\t);\n\t\t}\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class ChangelogWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'changelog' });\n\t\tthis.changelogs = [];\n\t\tthis.isLoading = false;\n\t\tthis.modalElement = null;\n\t\tthis.sidebarElement = null;\n\t\tthis.currentIndex = 0;\n\t}\n\n\t_render() {\n\t\tconst trigger = document.createElement('div');\n\t\ttrigger.className = `feedback-widget changelog-widget theme-${this.options.theme} position-${this.options.position}`;\n\t\ttrigger.innerHTML = `\n\t\t\t<button class=\"changelog-trigger-btn\" type=\"button\" aria-label=\"View Updates\">\n\t\t\t\t<svg class=\"changelog-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n\t\t\t\t\t<path d=\"M5.8 21L7.4 14L2 9.2L9.2 8.6L12 2L14.8 8.6L22 9.2L16.6 14L18.2 21L12 17.3L5.8 21Z\"/>\n\t\t\t\t</svg>\n\t\t\t\t<span class=\"changelog-text\">${this.options.triggerText || \"What's New\"}</span>\n\t\t\t\t<span class=\"changelog-confetti-emoji\">🎉</span>\n\t\t\t\t${this.options.showBadge ? '<span class=\"changelog-badge\"></span>' : ''}\n\t\t\t</button>\n\t\t`;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(trigger.style, this.options.customStyles);\n\t\t}\n\n\t\treturn trigger;\n\t}\n\n\t_attachEvents() {\n\t\tconst button = this.element.querySelector('.changelog-trigger-btn');\n\n\t\tbutton.addEventListener('click', () => {\n\t\t\tthis.openSidebar();\n\t\t});\n\n\t\tbutton.addEventListener('mouseenter', () => {\n\t\t\tbutton.style.transform = 'translateY(-2px)';\n\t\t});\n\n\t\tbutton.addEventListener('mouseleave', () => {\n\t\t\tbutton.style.transform = 'translateY(0)';\n\t\t});\n\t}\n\n\t// ==================== POPUP MODAL ====================\n\n\tasync openModal() {\n\t\tif (this.modalElement) return;\n\n\t\tthis.state.isOpen = true;\n\t\tthis._createModal();\n\n\t\t// Load changelogs if not already loaded\n\t\tif (this.changelogs.length === 0) {\n\t\t\tawait this._loadChangelogs();\n\t\t}\n\n\t\tthis.currentIndex = 0;\n\t\tthis._renderCurrentChangelog();\n\n\t\t// Prevent body scroll\n\t\tdocument.body.style.overflow = 'hidden';\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.modalElement) {\n\t\t\t\tthis.modalElement.classList.add('open');\n\t\t\t}\n\t\t\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\tcloseModal() {\n\t\t// Restore body scroll\n\t\tdocument.body.style.overflow = '';\n\n\t\tif (this.modalElement) {\n\t\t\tthis.modalElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.modalElement && this.modalElement.parentNode) {\n\t\t\t\tthis.modalElement.parentNode.removeChild(this.modalElement);\n\t\t\t\tthis.modalElement = null;\n\t\t\t}\n\t\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\t\tthis.backdropElement = null;\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\t_createModal() {\n\t\t// Create backdrop\n\t\tthis.backdropElement = document.createElement('div');\n\t\tthis.backdropElement.className = 'changelog-modal-backdrop';\n\t\tdocument.body.appendChild(this.backdropElement);\n\t\tthis.backdropElement.addEventListener('click', () => this.closeModal());\n\n\t\t// Create modal\n\t\tthis.modalElement = document.createElement('div');\n\t\tthis.modalElement.className = `changelog-modal theme-${this.options.theme}`;\n\t\tthis.modalElement.innerHTML = `\n\t\t\t<div class=\"changelog-modal-container\">\n\t\t\t\t<button class=\"changelog-modal-close\" type=\"button\" aria-label=\"Close\">×</button>\n\t\t\t\t<div class=\"changelog-modal-content\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"changelog-loading-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.modalElement);\n\n\t\t// Prevent clicks inside modal from closing it\n\t\tthis.modalElement\n\t\t\t.querySelector('.changelog-modal-container')\n\t\t\t.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\t// Attach close button event\n\t\tthis.modalElement\n\t\t\t.querySelector('.changelog-modal-close')\n\t\t\t.addEventListener('click', () => this.closeModal());\n\n\t\t// Handle escape key\n\t\tthis._escapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.closeModal();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', this._escapeHandler);\n\t}\n\n\t// ==================== LIST MODAL ====================\n\n\tasync openSidebar() {\n\t\tif (this.listModalElement) return;\n\n\t\t// Close popup modal if open\n\t\tif (this.modalElement) {\n\t\t\tthis.closeModal();\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 350));\n\t\t}\n\n\t\tthis.state.isOpen = true;\n\t\tthis._createListModal();\n\n\t\t// Load changelogs if not already loaded\n\t\tif (this.changelogs.length === 0) {\n\t\t\tawait this._loadChangelogs();\n\t\t}\n\n\t\tthis._renderChangelogList();\n\n\t\t// Prevent body scroll\n\t\tdocument.body.style.overflow = 'hidden';\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.listModalElement) {\n\t\t\t\tthis.listModalElement.classList.add('open');\n\t\t\t\t// Trigger confetti animation\n\t\t\t\tthis._showConfetti();\n\t\t\t}\n\t\t\tif (this.listModalBackdropElement) {\n\t\t\t\tthis.listModalBackdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\t_showConfetti() {\n\t\tconst colors = [\n\t\t\t'#FF6B6B',\n\t\t\t'#4ECDC4',\n\t\t\t'#FFE66D',\n\t\t\t'#95E1D3',\n\t\t\t'#F38181',\n\t\t\t'#AA96DA',\n\t\t\t'#FCBAD3',\n\t\t\t'#A8D8EA',\n\t\t];\n\t\tconst confettiCount = 50;\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'changelog-confetti-container';\n\t\tdocument.body.appendChild(container);\n\n\t\tfor (let i = 0; i < confettiCount; i++) {\n\t\t\tconst confetti = document.createElement('div');\n\t\t\tconfetti.className = 'changelog-confetti';\n\t\t\tconfetti.style.left = Math.random() * 100 + '%';\n\t\t\tconfetti.style.backgroundColor =\n\t\t\t\tcolors[Math.floor(Math.random() * colors.length)];\n\t\t\tconfetti.style.animationDelay = Math.random() * 0.5 + 's';\n\t\t\tconfetti.style.animationDuration = Math.random() * 1 + 1.5 + 's';\n\n\t\t\t// Random shapes\n\t\t\tconst shapes = ['circle', 'square', 'rectangle'];\n\t\t\tconst shape = shapes[Math.floor(Math.random() * shapes.length)];\n\t\t\tif (shape === 'circle') {\n\t\t\t\tconfetti.style.borderRadius = '50%';\n\t\t\t\tconfetti.style.width = Math.random() * 8 + 4 + 'px';\n\t\t\t\tconfetti.style.height = confetti.style.width;\n\t\t\t} else if (shape === 'rectangle') {\n\t\t\t\tconfetti.style.width = Math.random() * 4 + 3 + 'px';\n\t\t\t\tconfetti.style.height = Math.random() * 10 + 8 + 'px';\n\t\t\t} else {\n\t\t\t\tconfetti.style.width = Math.random() * 8 + 4 + 'px';\n\t\t\t\tconfetti.style.height = confetti.style.width;\n\t\t\t}\n\n\t\t\tcontainer.appendChild(confetti);\n\t\t}\n\n\t\t// Remove confetti after animation\n\t\tsetTimeout(() => {\n\t\t\tif (container.parentNode) {\n\t\t\t\tcontainer.parentNode.removeChild(container);\n\t\t\t}\n\t\t}, 2500);\n\t}\n\n\tcloseSidebar() {\n\t\t// Restore body scroll\n\t\tdocument.body.style.overflow = '';\n\n\t\tif (this.listModalElement) {\n\t\t\tthis.listModalElement.classList.remove('open');\n\t\t}\n\t\tif (this.listModalBackdropElement) {\n\t\t\tthis.listModalBackdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.listModalElement && this.listModalElement.parentNode) {\n\t\t\t\tthis.listModalElement.parentNode.removeChild(this.listModalElement);\n\t\t\t\tthis.listModalElement = null;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tthis.listModalBackdropElement &&\n\t\t\t\tthis.listModalBackdropElement.parentNode\n\t\t\t) {\n\t\t\t\tthis.listModalBackdropElement.parentNode.removeChild(\n\t\t\t\t\tthis.listModalBackdropElement\n\t\t\t\t);\n\t\t\t\tthis.listModalBackdropElement = null;\n\t\t\t}\n\t\t\tif (this._listModalEscapeHandler) {\n\t\t\t\tdocument.removeEventListener('keydown', this._listModalEscapeHandler);\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\t_createListModal() {\n\t\t// Create backdrop\n\t\tthis.listModalBackdropElement = document.createElement('div');\n\t\tthis.listModalBackdropElement.className = 'changelog-list-modal-backdrop';\n\t\tdocument.body.appendChild(this.listModalBackdropElement);\n\t\tthis.listModalBackdropElement.addEventListener('click', () =>\n\t\t\tthis.closeSidebar()\n\t\t);\n\n\t\t// Create list modal\n\t\tthis.listModalElement = document.createElement('div');\n\t\tthis.listModalElement.className = `changelog-list-modal theme-${this.options.theme}`;\n\t\tthis.listModalElement.innerHTML = `\n\t\t\t<div class=\"changelog-list-modal-container\">\n\t\t\t\t<div class=\"changelog-list-modal-header\">\n\t\t\t\t\t<h2>${this.options.title || \"What's New\"} 🎉</h2>\n\t\t\t\t\t<button class=\"changelog-list-modal-close\" type=\"button\" aria-label=\"Close\">×</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-list-modal-body\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"changelog-loading-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.listModalElement);\n\n\t\t// Prevent clicks inside modal from closing it\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-container')\n\t\t\t.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\t// Attach close button event\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-close')\n\t\t\t.addEventListener('click', () => this.closeSidebar());\n\n\t\t// Handle escape key\n\t\tthis._listModalEscapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.closeSidebar();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', this._listModalEscapeHandler);\n\t}\n\n\t_renderChangelogList() {\n\t\tconst body = this.listModalElement.querySelector(\n\t\t\t'.changelog-list-modal-body'\n\t\t);\n\n\t\tif (this.isLoading) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tbody.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tbody.innerHTML = `\n\t\t\t<div class=\"changelog-list\">\n\t\t\t\t${this.changelogs.map((changelog, index) => this._renderChangelogListItem(changelog, index)).join('')}\n\t\t\t</div>\n\t\t`;\n\n\t\t// Attach click events to items\n\t\tbody.querySelectorAll('.changelog-list-item').forEach((item, index) => {\n\t\t\titem.addEventListener('click', () => {\n\t\t\t\tconst changelog = this.changelogs[index];\n\t\t\t\tthis._handleViewUpdate(changelog);\n\t\t\t});\n\t\t});\n\t}\n\n\t_renderChangelogListItem(changelog, index) {\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst date = changelog.published_at\n\t\t\t? this._formatDate(changelog.published_at)\n\t\t\t: '';\n\n\t\treturn `\n\t\t\t<div class=\"changelog-list-item\" data-index=\"${index}\">\n\t\t\t\t<div class=\"changelog-list-item-main\">\n\t\t\t\t\t${\n\t\t\t\t\t\thasImage\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<div class=\"changelog-list-item-image\">\n\t\t\t\t\t\t\t<img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<div class=\"changelog-list-item-content\">\n\t\t\t\t\t\t${date ? `<span class=\"changelog-list-item-date\">${date}</span>` : ''}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tchangelog.labels && changelog.labels.length > 0\n\t\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t\t<div class=\"changelog-list-item-labels\">\n\t\t\t\t\t\t\t\t${changelog.labels\n\t\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t\t(label) => `\n\t\t\t\t\t\t\t\t\t<span class=\"changelog-label\" style=\"background-color: ${label.color || '#E5E7EB'}; color: ${this._getContrastColor(label.color || '#E5E7EB')}\">${label.name}</span>\n\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<h3 class=\"changelog-list-item-title\">${changelog.title}</h3>\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tchangelog.excerpt || changelog.description\n\t\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t\t<p class=\"changelog-list-item-description\">${changelog.excerpt || changelog.description}</p>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tasync _loadChangelogs() {\n\t\tthis.isLoading = true;\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getChangelogs();\n\t\t\tthis.changelogs = result.data || [];\n\t\t\tthis.sdk.eventBus.emit('changelog:loaded', {\n\t\t\t\tchangelogs: this.changelogs,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.changelogs = [];\n\t\t\tthis.sdk.eventBus.emit('changelog:error', { error });\n\t\t} finally {\n\t\t\tthis.isLoading = false;\n\t\t}\n\t}\n\n\t_renderCurrentChangelog() {\n\t\tconst content = this.modalElement.querySelector('.changelog-modal-content');\n\n\t\tif (this.isLoading) {\n\t\t\treturn; // Keep showing loading spinner\n\t\t}\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tcontent.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tconst changelog = this.changelogs[this.currentIndex];\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst hasMultiple = this.changelogs.length > 1;\n\n\t\tcontent.innerHTML = `\n\t\t\t<div class=\"changelog-popup-item\">\n\t\t\t\t${\n\t\t\t\t\thasImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"changelog-popup-image\">\n\t\t\t\t\t\t<img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" />\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"changelog-popup-body\">\n\t\t\t\t\t<h2 class=\"changelog-popup-title\">${changelog.title}</h2>\n\t\t\t\t\t${\n\t\t\t\t\t\tchangelog.excerpt || changelog.description\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<p class=\"changelog-popup-description\">${changelog.excerpt || changelog.description}</p>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<button class=\"changelog-popup-btn\" type=\"button\">\n\t\t\t\t\t\t${this.options.viewButtonText || 'View Update'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-popup-footer\">\n\t\t\t\t\t${\n\t\t\t\t\t\thasMultiple\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<div class=\"changelog-popup-dots\">\n\t\t\t\t\t\t\t${this.changelogs\n\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t(_, i) => `\n\t\t\t\t\t\t\t\t<span class=\"changelog-dot ${i === this.currentIndex ? 'active' : ''}\" data-index=\"${i}\"></span>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<button class=\"changelog-view-all-btn\" type=\"button\">\n\t\t\t\t\t\tView all updates\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t\t\t\t\t<path d=\"M5 12h14M12 5l7 7-7 7\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\t// Attach view button event\n\t\tcontent\n\t\t\t.querySelector('.changelog-popup-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis._handleViewUpdate(changelog);\n\t\t\t});\n\n\t\t// Attach view all button event\n\t\tcontent\n\t\t\t.querySelector('.changelog-view-all-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.closeModal();\n\t\t\t\tsetTimeout(() => this.openSidebar(), 350);\n\t\t\t});\n\n\t\t// Attach dot navigation events\n\t\tif (hasMultiple) {\n\t\t\tcontent.querySelectorAll('.changelog-dot').forEach((dot) => {\n\t\t\t\tdot.addEventListener('click', (e) => {\n\t\t\t\t\tconst index = parseInt(e.target.dataset.index, 10);\n\t\t\t\t\tthis.currentIndex = index;\n\t\t\t\t\tthis._renderCurrentChangelog();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t_handleViewUpdate(changelog) {\n\t\tthis.sdk.eventBus.emit('changelog:view', { changelog });\n\n\t\t// If there's a URL, open it\n\t\tif (changelog.url || changelog.slug) {\n\t\t\tconst url =\n\t\t\t\tchangelog.url ||\n\t\t\t\t`${this.options.changelogBaseUrl || ''}/${changelog.slug}`;\n\t\t\tif (this.options.openInNewTab !== false) {\n\t\t\t\twindow.open(url, '_blank', 'noopener,noreferrer');\n\t\t\t} else {\n\t\t\t\twindow.location.href = url;\n\t\t\t}\n\t\t}\n\n\t\t// Custom callback if provided\n\t\tif (typeof this.options.onViewUpdate === 'function') {\n\t\t\tthis.options.onViewUpdate(changelog);\n\t\t}\n\t}\n\n\t_formatDate(dateString) {\n\t\tconst date = new Date(dateString);\n\t\tconst options = { year: 'numeric', month: 'short', day: 'numeric' };\n\t\treturn date.toLocaleDateString('en-US', options);\n\t}\n\n\t_getContrastColor(hexColor) {\n\t\t// Remove # if present\n\t\tconst hex = hexColor.replace('#', '');\n\t\tconst r = parseInt(hex.substr(0, 2), 16);\n\t\tconst g = parseInt(hex.substr(2, 2), 16);\n\t\tconst b = parseInt(hex.substr(4, 2), 16);\n\t\t// Calculate luminance\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#1F2937' : '#FFFFFF';\n\t}\n\n\thideBadge() {\n\t\tconst badge = this.element?.querySelector('.changelog-badge');\n\t\tif (badge) {\n\t\t\tbadge.style.display = 'none';\n\t\t}\n\t}\n\n\tshowBadge() {\n\t\tconst badge = this.element?.querySelector('.changelog-badge');\n\t\tif (badge) {\n\t\t\tbadge.style.display = 'block';\n\t\t}\n\t}\n\n\tnextChangelog() {\n\t\tif (this.currentIndex < this.changelogs.length - 1) {\n\t\t\tthis.currentIndex++;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t}\n\n\tprevChangelog() {\n\t\tif (this.currentIndex > 0) {\n\t\t\tthis.currentIndex--;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t}\n\n\tasync refresh() {\n\t\tthis.changelogs = [];\n\t\tawait this._loadChangelogs();\n\t\tif (this.modalElement) {\n\t\t\tthis.currentIndex = 0;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t\tif (this.listModalElement) {\n\t\t\tthis._renderChangelogList();\n\t\t}\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\t}\n\n\tdestroy() {\n\t\tif (this._escapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._escapeHandler);\n\t\t}\n\t\tif (this._listModalEscapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._listModalEscapeHandler);\n\t\t}\n\t\tthis.closeModal();\n\t\tthis.closeSidebar();\n\t\tsuper.destroy();\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class InlineWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'inline' });\n\t}\n\n\t_render() {\n\t\tconst widget = document.createElement('div');\n\t\twidget.className = `feedback-widget feedback-widget-inline theme-${this.options.theme}`;\n\t\twidget.innerHTML = `\n <div class=\"feedback-inline-content\">\n <h3>Send us your feedback</h3>\n <form class=\"feedback-inline-form\">\n <div class=\"feedback-form-group\">\n <input \n type=\"text\" \n name=\"title\" \n placeholder=\"Title (optional)\"\n value=\"${this.state.title}\"\n />\n </div>\n <div class=\"feedback-form-group\">\n <textarea \n name=\"content\" \n placeholder=\"Your feedback...\"\n required\n >${this.state.content}</textarea>\n </div>\n <div class=\"feedback-form-group\">\n <input \n type=\"email\" \n name=\"email\" \n placeholder=\"Email (optional)\"\n value=\"${this.state.email}\"\n />\n </div>\n <button type=\"submit\" class=\"feedback-btn feedback-btn-submit\">\n Send Feedback\n </button>\n <div class=\"feedback-error\" style=\"display: none;\"></div>\n </form>\n </div>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(widget.style, this.options.customStyles);\n\t\t}\n\n\t\treturn widget;\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('.feedback-inline-form');\n\n\t\tform.addEventListener('submit', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.submitFeedback();\n\t\t});\n\n\t\tform.querySelector('input[name=\"title\"]').addEventListener('input', (e) => {\n\t\t\tthis.state.title = e.target.value;\n\t\t});\n\n\t\tform\n\t\t\t.querySelector('textarea[name=\"content\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.content = e.target.value;\n\t\t\t});\n\n\t\tform.querySelector('input[name=\"email\"]').addEventListener('input', (e) => {\n\t\t\tthis.state.email = e.target.value;\n\t\t});\n\t}\n\n\topenModal() {\n\t\tconst textarea = this.element.querySelector('textarea[name=\"content\"]');\n\t\tif (textarea) {\n\t\t\ttextarea.focus();\n\t\t}\n\t}\n\n\tcloseModal() {\n\t\t// Inline widget doesn't use modal\n\t}\n\n\t_showSuccessMessage() {\n\t\tconst widget = this.element.querySelector('.feedback-inline-content');\n\t\tconst originalContent = widget.innerHTML;\n\n\t\twidget.innerHTML = `\n <div class=\"feedback-success\">\n <div class=\"feedback-success-icon\">✓</div>\n <h3>Thank you!</h3>\n <p>Your feedback has been submitted successfully.</p>\n <button class=\"feedback-btn feedback-btn-reset\">Send Another</button>\n </div>\n `;\n\n\t\tconst resetBtn = widget.querySelector('.feedback-btn-reset');\n\t\tresetBtn.addEventListener('click', () => {\n\t\t\twidget.innerHTML = originalContent;\n\t\t\tthis._attachEvents();\n\t\t\tthis._resetForm();\n\t\t});\n\t}\n\n\t_showError(message) {\n\t\tconst errorElement = this.element.querySelector('.feedback-error');\n\t\tif (errorElement) {\n\t\t\terrorElement.textContent = message;\n\t\t\terrorElement.style.display = 'block';\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (errorElement) {\n\t\t\t\t\terrorElement.style.display = 'none';\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t}\n\t}\n\n\t_updateSubmitButton() {\n\t\tconst submitBtn = this.element.querySelector('.feedback-btn-submit');\n\t\tif (submitBtn) {\n\t\t\tsubmitBtn.textContent = this.state.isSubmitting\n\t\t\t\t? 'Sending...'\n\t\t\t\t: 'Send Feedback';\n\t\t\tsubmitBtn.disabled = this.state.isSubmitting;\n\t\t}\n\t}\n\n\tupdateTitle(title) {\n\t\tconst titleElement = this.element?.querySelector('h3');\n\t\tif (titleElement) {\n\t\t\ttitleElement.textContent = title;\n\t\t}\n\t}\n\n\tsetPlaceholder(field, placeholder) {\n\t\tconst input = this.element?.querySelector(`[name=\"${field}\"]`);\n\t\tif (input) {\n\t\t\tinput.placeholder = placeholder;\n\t\t}\n\t}\n}\n","/**\n * MessengerState - State management for the Messenger widget\n */\nexport class MessengerState {\n\tconstructor(options = {}) {\n\t\tthis.currentView = 'home'; // 'home', 'messages', 'chat', 'help', 'changelog'\n\t\tthis.isOpen = false;\n\t\tthis.unreadCount = 0;\n\t\tthis.activeConversationId = null;\n\n\t\t// Conversations\n\t\tthis.conversations = [];\n\t\tthis.messages = {}; // { conversationId: [messages] }\n\n\t\t// Help articles\n\t\tthis.helpArticles = [];\n\t\tthis.helpSearchQuery = '';\n\n\t\t// Changelog\n\t\tthis.homeChangelogItems = [];\n\t\tthis.changelogItems = [];\n\n\t\t// Team info\n\t\tthis.teamName = options.teamName || 'Support';\n\t\tthis.teamAvatars = options.teamAvatars || [];\n\t\tthis.welcomeMessage = options.welcomeMessage || 'How can we help?';\n\n\t\t// User info\n\t\tthis.userContext = options.userContext || null;\n\n\t\t// Feature flags\n\t\tthis.enableHelp = options.enableHelp !== false;\n\t\tthis.enableChangelog = options.enableChangelog !== false;\n\n\t\t// Agent availability\n\t\tthis.agentsOnline = false;\n\t\tthis.onlineCount = 0;\n\t\tthis.responseTime = 'Usually replies within a few minutes';\n\n\t\t// Typing indicators\n\t\tthis.typingUsers = {}; // { conversationId: { userName, timestamp } }\n\n\t\t// Loading states\n\t\tthis.isLoading = false;\n\t\tthis.isLoadingMessages = false;\n\n\t\t// Listeners\n\t\tthis._listeners = new Set();\n\t}\n\n\t/**\n\t * Subscribe to state changes\n\t */\n\tsubscribe(callback) {\n\t\tthis._listeners.add(callback);\n\t\treturn () => this._listeners.delete(callback);\n\t}\n\n\t/**\n\t * Notify all listeners of state change\n\t */\n\t_notify(changeType, data) {\n\t\tthis._listeners.forEach((cb) => cb(changeType, data, this));\n\t}\n\n\t/**\n\t * Set current view\n\t */\n\tsetView(view) {\n\t\tconst previousView = this.currentView;\n\t\tthis.currentView = view;\n\t\tthis._notify('viewChange', { previousView, currentView: view });\n\t}\n\n\t/**\n\t * Toggle panel open/closed\n\t */\n\tsetOpen(isOpen) {\n\t\tthis.isOpen = isOpen;\n\t\tthis._notify('openChange', { isOpen });\n\t}\n\n\t/**\n\t * Set active conversation for chat view\n\t */\n\tsetActiveConversation(conversationId) {\n\t\tconst previousConversationId = this.activeConversationId;\n\t\tthis.activeConversationId = conversationId;\n\t\tthis._notify('conversationChange', { conversationId, previousConversationId });\n\t}\n\n\t/**\n\t * Update conversations list\n\t */\n\tsetConversations(conversations) {\n\t\tthis.conversations = conversations;\n\t\tthis._updateUnreadCount();\n\t\tthis._notify('conversationsUpdate', { conversations });\n\t}\n\n\t/**\n\t * Add a new conversation\n\t */\n\taddConversation(conversation) {\n\t\tthis.conversations.unshift(conversation);\n\t\tthis._updateUnreadCount();\n\t\tthis._notify('conversationAdded', { conversation });\n\t}\n\n\t/**\n\t * Update messages for a conversation\n\t */\n\tsetMessages(conversationId, messages) {\n\t\tthis.messages[conversationId] = messages;\n\t\tthis._notify('messagesUpdate', { conversationId, messages });\n\t}\n\n\t/**\n\t * Add a message to a conversation\n\t */\n\taddMessage(conversationId, message) {\n\t\tif (!this.messages[conversationId]) {\n\t\t\tthis.messages[conversationId] = [];\n\t\t}\n\t\tthis.messages[conversationId].push(message);\n\n\t\t// Update conversation preview\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (conv) {\n\t\t\tconv.lastMessage = message.content;\n\t\t\tconv.lastMessageTime = message.timestamp;\n\t\t\tif (!message.isOwn) {\n\t\t\t\tconv.unread = (conv.unread || 0) + 1;\n\t\t\t\tthis._updateUnreadCount();\n\t\t\t}\n\t\t}\n\n\t\tthis._notify('messageAdded', { conversationId, message });\n\t}\n\n\t/**\n\t * Update a conversation by id\n\t */\n\tupdateConversation(conversationId, updates) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (!conv) {\n\t\t\treturn null;\n\t\t}\n\n\t\tObject.assign(conv, updates);\n\t\tthis._notify('conversationUpdated', { conversationId, conversation: conv });\n\t\treturn conv;\n\t}\n\n\t/**\n\t * Mark conversation as read\n\t */\n\tmarkAsRead(conversationId) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (conv && conv.unread > 0) {\n\t\t\tconv.unread = 0;\n\t\t\tthis._updateUnreadCount();\n\t\t\tthis._notify('conversationRead', { conversationId });\n\t\t}\n\t}\n\n\t/**\n\t * Update unread count\n\t */\n\t_updateUnreadCount() {\n\t\tthis.unreadCount = this.conversations.reduce(\n\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t0\n\t\t);\n\t\tthis._notify('unreadCountChange', { count: this.unreadCount });\n\t}\n\n\t/**\n\t * Set help articles\n\t */\n\tsetHelpArticles(articles) {\n\t\tthis.helpArticles = articles;\n\t\tthis._notify('helpArticlesUpdate', { articles });\n\t}\n\n\t/**\n\t * Set help search query\n\t */\n\tsetHelpSearchQuery(query) {\n\t\tthis.helpSearchQuery = query;\n\t\tthis._notify('helpSearchChange', { query });\n\t}\n\n\t/**\n\t * Set home changelog items\n\t */\n\tsetHomeChangelogItems(items) {\n\t\tthis.homeChangelogItems = items;\n\t\tthis._notify('homeChangelogUpdate', { items });\n\t}\n\n\t/**\n\t * Set changelog items\n\t */\n\tsetChangelogItems(items) {\n\t\tthis.changelogItems = items;\n\t\tthis._notify('changelogUpdate', { items });\n\t}\n\n\t/**\n\t * Get current conversation\n\t */\n\tgetActiveConversation() {\n\t\treturn this.conversations.find((c) => c.id === this.activeConversationId);\n\t}\n\n\t/**\n\t * Get messages for active conversation\n\t */\n\tgetActiveMessages() {\n\t\treturn this.messages[this.activeConversationId] || [];\n\t}\n\n\t/**\n\t * Update team avatars from backend agent data.\n\t * Converts available_agents ({full_name, picture}) into avatar strings\n\t * the views already support (URL strings or initial strings).\n\t */\n\tsetTeamAvatarsFromAgents(agents) {\n\t\tif (!agents || agents.length === 0) return;\n\n\t\tthis.teamAvatars = agents.map((agent) => {\n\t\t\tif (agent.picture) return agent.picture;\n\t\t\treturn agent.full_name || '?';\n\t\t});\n\t\tthis._notify('teamAvatarsUpdate', { teamAvatars: this.teamAvatars });\n\t}\n\n\t/**\n\t * Get filtered help articles\n\t */\n\tgetFilteredHelpArticles() {\n\t\tif (!this.helpSearchQuery) {\n\t\t\treturn this.helpArticles;\n\t\t}\n\t\tconst query = this.helpSearchQuery.toLowerCase();\n\t\treturn this.helpArticles.filter(\n\t\t\t(article) =>\n\t\t\t\tarticle.title.toLowerCase().includes(query) ||\n\t\t\t\t(article.description &&\n\t\t\t\t\tarticle.description.toLowerCase().includes(query))\n\t\t);\n\t}\n\n\t/**\n\t * Reset state\n\t */\n\treset() {\n\t\tthis.currentView = 'home';\n\t\tthis.activeConversationId = null;\n\t\tthis.helpSearchQuery = '';\n\t\tthis._notify('reset', {});\n\t}\n}\n","export class MessengerLauncher {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\tprimaryColor: options.primaryColor || '#155eff',\n\t\t\t...options,\n\t\t};\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = `messenger-launcher messenger-launcher-${this.options.position}`;\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type, data) => {\n\t\t\tif (type === 'openChange') {\n\t\t\t\tthis._updateIcon();\n\t\t\t}\n\t\t\tif (type === 'unreadCountChange') {\n\t\t\t\tthis._updateBadge();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst badgeHtml =\n\t\t\tthis.state.unreadCount > 0\n\t\t\t\t? `<span class=\"messenger-launcher-badge\">${this.state.unreadCount > 9 ? '9+' : this.state.unreadCount}</span>`\n\t\t\t\t: '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<button class=\"messenger-launcher-btn\" aria-label=\"Open messenger\" style=\"background: ${this.options.primaryColor};\">\n\t\t\t\t<span class=\"messenger-launcher-icon messenger-launcher-icon-chat\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"#ffffff\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M144,140a12,12,0,1,1-12-12A12,12,0,0,1,144,140Zm44-12a12,12,0,1,0,12,12A12,12,0,0,0,188,128Zm51.34,83.47a16,16,0,0,1-19.87,19.87l-24.71-7.27A80,80,0,0,1,86.43,183.42a79,79,0,0,1-25.19-7.35l-24.71,7.27a16,16,0,0,1-19.87-19.87l7.27-24.71A80,80,0,1,1,169.58,72.59a80,80,0,0,1,62.49,114.17ZM81.3,166.3a79.94,79.94,0,0,1,70.38-93.87A64,64,0,0,0,39.55,134.19a8,8,0,0,1,.63,6L32,168l27.76-8.17a8,8,0,0,1,6,.63A63.45,63.45,0,0,0,81.3,166.3Zm135.15,15.89a64,64,0,1,0-26.26,26.26,8,8,0,0,1,6-.63L224,216l-8.17-27.76A8,8,0,0,1,216.45,182.19Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</span>\n\t\t\t\t<span class=\"messenger-launcher-icon messenger-launcher-icon-close\" style=\"display: none;\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"#ffffff\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</span>\n\t\t\t\t${badgeHtml}\n\t\t\t</button>\n\t\t`;\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-launcher-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(!this.state.isOpen);\n\t\t\t});\n\t}\n\n\t_updateIcon() {\n\t\tconst chatIcon = this.element.querySelector(\n\t\t\t'.messenger-launcher-icon-chat'\n\t\t);\n\t\tconst closeIcon = this.element.querySelector(\n\t\t\t'.messenger-launcher-icon-close'\n\t\t);\n\n\t\tif (this.state.isOpen) {\n\t\t\tchatIcon.style.display = 'none';\n\t\t\tcloseIcon.style.display = 'flex';\n\t\t\tthis.element.classList.add('messenger-launcher-open');\n\t\t} else {\n\t\t\tchatIcon.style.display = 'flex';\n\t\t\tcloseIcon.style.display = 'none';\n\t\t\tthis.element.classList.remove('messenger-launcher-open');\n\t\t}\n\t}\n\n\t_updateBadge() {\n\t\tconst existingBadge = this.element.querySelector(\n\t\t\t'.messenger-launcher-badge'\n\t\t);\n\t\tif (existingBadge) {\n\t\t\texistingBadge.remove();\n\t\t}\n\n\t\tif (this.state.unreadCount > 0 && !this.state.isOpen) {\n\t\t\tconst badge = document.createElement('span');\n\t\t\tbadge.className = 'messenger-launcher-badge';\n\t\t\tbadge.textContent =\n\t\t\t\tthis.state.unreadCount > 9 ? '9+' : this.state.unreadCount;\n\t\t\tthis.element.querySelector('.messenger-launcher-btn').appendChild(badge);\n\t\t}\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","/**\n * NavigationTabs - Bottom navigation for messenger\n */\nexport class NavigationTabs {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-nav';\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\t// Subscribe to state changes\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'viewChange' || type === 'unreadCountChange') {\n\t\t\t\tthis._updateActiveTab();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_getTabs() {\n\t\tconst tabs = [\n\t\t\t{ id: 'home', label: 'Home', icon: this._getHomeIcon() },\n\t\t\t{\n\t\t\t\tid: 'messages',\n\t\t\t\tlabel: 'Messages',\n\t\t\t\ticon: this._getMessagesIcon(),\n\t\t\t\tbadge: this.state.unreadCount,\n\t\t\t},\n\t\t];\n\n\t\tif (this.state.enableHelp) {\n\t\t\ttabs.push({ id: 'help', label: 'Help', icon: this._getHelpIcon() });\n\t\t}\n\n\t\tif (this.state.enableChangelog) {\n\t\t\ttabs.push({\n\t\t\t\tid: 'changelog',\n\t\t\t\tlabel: 'Changelog',\n\t\t\t\ticon: this._getChangelogIcon(),\n\t\t\t});\n\t\t}\n\n\t\treturn tabs;\n\t}\n\n\t_updateContent() {\n\t\tconst tabs = this._getTabs();\n\t\tconst tabsHtml = tabs\n\t\t\t.map((tab) => {\n\t\t\t\tconst isActive = this.state.currentView === tab.id;\n\t\t\t\tconst badgeHtml =\n\t\t\t\t\ttab.badge && tab.badge > 0\n\t\t\t\t\t\t? `<span class=\"messenger-nav-badge\">${tab.badge > 9 ? '9+' : tab.badge}</span>`\n\t\t\t\t\t\t: '';\n\n\t\t\t\treturn `\n\t\t\t\t<button class=\"messenger-nav-tab ${isActive ? 'active' : ''}\" data-tab=\"${tab.id}\">\n\t\t\t\t\t<span class=\"messenger-nav-icon\">${tab.icon}</span>\n\t\t\t\t\t<span class=\"messenger-nav-label\">${tab.label}</span>\n\t\t\t\t\t${badgeHtml}\n\t\t\t\t</button>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tthis.element.innerHTML = tabsHtml;\n\t}\n\n\t_attachEvents() {\n\t\tthis.element.addEventListener('click', (e) => {\n\t\t\tconst tab = e.target.closest('.messenger-nav-tab');\n\t\t\tif (tab) {\n\t\t\t\tconst tabId = tab.dataset.tab;\n\t\t\t\tthis.state.setView(tabId);\n\t\t\t}\n\t\t});\n\t}\n\n\t_updateActiveTab() {\n\t\tconst tabs = this.element.querySelectorAll('.messenger-nav-tab');\n\t\ttabs.forEach((tab) => {\n\t\t\tconst isActive = tab.dataset.tab === this.state.currentView;\n\t\t\ttab.classList.toggle('active', isActive);\n\n\t\t\t// Update badge if messages tab\n\t\t\tif (tab.dataset.tab === 'messages') {\n\t\t\t\tconst existingBadge = tab.querySelector('.messenger-nav-badge');\n\t\t\t\tif (existingBadge) existingBadge.remove();\n\n\t\t\t\tif (this.state.unreadCount > 0) {\n\t\t\t\t\tconst badge = document.createElement('span');\n\t\t\t\t\tbadge.className = 'messenger-nav-badge';\n\t\t\t\t\tbadge.textContent =\n\t\t\t\t\t\tthis.state.unreadCount > 9 ? '9+' : this.state.unreadCount;\n\t\t\t\t\ttab.appendChild(badge);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t_getHomeIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t<path d=\"M216,115.54V208a8,8,0,0,1-8,8H160a8,8,0,0,1-8-8V160a8,8,0,0,0-8-8H112a8,8,0,0,0-8,8v48a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V115.54a8,8,0,0,1,2.62-5.92l80-75.54a8,8,0,0,1,10.77,0l80,75.54A8,8,0,0,1,216,115.54Z\" opacity=\"0.2\"></path>\n\t\t<path d=\"M218.83,103.77l-80-75.48a1.14,1.14,0,0,1-.11-.11,16,16,0,0,0-21.53,0l-.11.11L37.17,103.77A16,16,0,0,0,32,115.55V208a16,16,0,0,0,16,16H96a16,16,0,0,0,16-16V160h32v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V115.55A16,16,0,0,0,218.83,103.77ZM208,208H160V160a16,16,0,0,0-16-16H112a16,16,0,0,0-16,16v48H48V115.55l.11-.1L128,40l79.9,75.43.11.1Z\"></path>\n\t</svg>`;\n\t}\n\n\t_getMessagesIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t<path d=\"M224,64V192a8,8,0,0,1-8,8H82.5a8,8,0,0,0-5.15,1.88l-32.2,28.23A8,8,0,0,1,32,224V64a8,8,0,0,1,8-8H216A8,8,0,0,1,224,64Z\" opacity=\"0.2\"></path>\n\t\t<path d=\"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78.69.69,0,0,0,.13-.11L82.5,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H82.5a16,16,0,0,0-10.3,3.75l-.12.11L40,224V64H216Z\"></path>\n\t</svg>`;\n\t}\n\n\t_getHelpIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t<path d=\"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\" opacity=\"0.2\"></path>\n\t\t<path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z\"></path>\n\t</svg>`;\n\t}\n\n\t_getChangelogIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t<path d=\"M200,144a32,32,0,0,1-63.5,4.5L85.83,121.25a32.07,32.07,0,0,1-41.54-34l-24.15-21a8,8,0,0,1,10.25-12.29L54.55,75a32,32,0,0,1,59.16,2.5l50.63,27.25a31.88,31.88,0,0,1,35.66,7l26.46-23A8,8,0,1,1,236.71,101l-26.46,23A32,32,0,0,1,200,144Z\" opacity=\"0.2\"></path>\n\t\t<path d=\"M228.54,86.66l-26.46,23.07A40,40,0,0,0,168,72.13L120.89,46.5a40,40,0,0,0-75.44-4l-22-19.2a8,8,0,0,0-10.5,12L35.44,54.77a40,40,0,0,0,50,61.07l47.1,25.64a40,40,0,0,0,75.41,4.07l26.46-23.07a8,8,0,0,0-10.5-12ZM56,96A24,24,0,1,1,77.25,82.75,24,24,0,0,1,56,96Zm144,64a24,24,0,1,1,24-24A24,24,0,0,1,200,160Z\"></path>\n\t</svg>`;\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","/**\n * MessengerPanel - Main panel container for messenger\n */\nimport { NavigationTabs } from './NavigationTabs.js';\n\nexport class MessengerPanel {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || 'dark',\n\t\t\t...options,\n\t\t};\n\t\tthis.element = null;\n\t\tthis.navigationTabs = null;\n\t\tthis.currentViewComponent = null;\n\t\tthis.viewRegistry = {};\n\t\tthis._unsubscribe = null;\n\t}\n\n\t/**\n\t * Register view components\n\t */\n\tregisterView(name, ViewClass) {\n\t\tthis.viewRegistry[name] = ViewClass;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = `messenger-panel messenger-panel-${this.options.position} theme-${this.options.theme}`;\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-panel-content\">\n\t\t\t\t<div class=\"messenger-panel-views\"></div>\n\t\t\t\t<div class=\"messenger-panel-nav\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\t// Render navigation tabs\n\t\tthis.navigationTabs = new NavigationTabs(this.state, this.options);\n\t\tconst navContainer = this.element.querySelector('.messenger-panel-nav');\n\t\tnavContainer.appendChild(this.navigationTabs.render());\n\n\t\t// Render initial view\n\t\tthis._renderCurrentView();\n\n\t\t// Subscribe to state changes\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'viewChange') {\n\t\t\t\tthis._renderCurrentView();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_renderCurrentView() {\n\t\tconst viewsContainer = this.element.querySelector('.messenger-panel-views');\n\n\t\t// Destroy current view if exists\n\t\tif (this.currentViewComponent && this.currentViewComponent.destroy) {\n\t\t\tthis.currentViewComponent.destroy();\n\t\t}\n\n\t\t// Clear container\n\t\tviewsContainer.innerHTML = '';\n\n\t\t// Get view class\n\t\tconst ViewClass = this.viewRegistry[this.state.currentView];\n\t\tif (ViewClass) {\n\t\t\tthis.currentViewComponent = new ViewClass(this.state, this.options);\n\t\t\tviewsContainer.appendChild(this.currentViewComponent.render());\n\t\t} else {\n\t\t\tviewsContainer.innerHTML = `<div class=\"messenger-view-placeholder\">View not found: ${this.state.currentView}</div>`;\n\t\t}\n\t}\n\n\t/**\n\t * Show the panel with animation\n\t */\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t\t// Trigger animation\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tthis.element.classList.add('open');\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Hide the panel with animation\n\t */\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.classList.remove('open');\n\t\t\t// Wait for animation to complete\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.style.display = 'none';\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t}\n\t}\n\n\t/**\n\t * Set panel header content (used by views)\n\t */\n\tsetHeader(headerContent) {\n\t\tconst header = this.element.querySelector('.messenger-panel-header');\n\t\tif (header) {\n\t\t\theader.innerHTML = headerContent;\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.navigationTabs) {\n\t\t\tthis.navigationTabs.destroy();\n\t\t}\n\t\tif (this.currentViewComponent && this.currentViewComponent.destroy) {\n\t\t\tthis.currentViewComponent.destroy();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class ChangelogView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-changelog-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'changelogUpdate') {\n\t\t\t\tthis._updateChangelogList();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst avatarsHtml = this._renderTeamAvatars();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-changelog-header\">\n\t\t\t\t<h2>Changelog</h2>\n\t\t\t\t<button class=\"messenger-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-changelog-subheader\">\n\t\t\t\t<span class=\"messenger-changelog-latest\">Latest</span>\n\t\t\t\t<div class=\"messenger-changelog-team\">\n\t\t\t\t\t<span>From ${this.state.teamName}</span>\n\t\t\t\t\t${avatarsHtml}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-changelog-body\">\n\t\t\t\t<div class=\"messenger-changelog-list\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._updateChangelogList();\n\t\tthis._attachEvents();\n\t}\n\n\t_updateChangelogList() {\n\t\tconst changelogContainer = this.element.querySelector(\n\t\t\t'.messenger-changelog-list'\n\t\t);\n\t\tconst changelogItems = this.state.changelogItems;\n\n\t\tif (changelogItems.length === 0) {\n\t\t\tchangelogContainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tchangelogContainer.innerHTML = changelogItems\n\t\t\t.map((item) => this._renderChangelogCard(item))\n\t\t\t.join('');\n\n\t\tthis._attachChangelogEvents();\n\t}\n\n\t_renderChangelogCard(item) {\n\t\tconst tagsHtml =\n\t\t\titem.tags && item.tags.length > 0\n\t\t\t\t? `<div class=\"messenger-changelog-tags\">\n\t\t\t\t${item.tags.map((tag) => `<span class=\"messenger-changelog-tag\">${tag}</span>`).join('')}\n\t\t\t</div>`\n\t\t\t\t: '';\n\n\t\tconst dateStr = this._formatDate(item.publishedAt || item.date);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${\n\t\t\t\t\titem.coverImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"messenger-changelog-cover\">\n\t\t\t\t\t\t<img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.style.display='none';\" />\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-changelog-content\">\n\t\t\t\t\t${tagsHtml}\n\t\t\t\t\t<h3 class=\"messenger-changelog-title\">${item.title}</h3>\n\t\t\t\t\t${item.description ? `<p class=\"messenger-changelog-description\">${this._truncateText(item.description, 100)}</p>` : ''}\n\t\t\t\t\t<div class=\"messenger-changelog-meta\">\n\t\t\t\t\t\t<span class=\"messenger-changelog-date\">${dateStr}</span>\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#000000\" viewBox=\"0 0 256 256\" class=\"messenger-changelog-arrow\">\n\t\t\t\t\t\t\t<path d=\"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack messenger-avatar-stack-tiny\">\n\t\t\t\t\t<div class=\"messenger-avatar messenger-avatar-tiny\" style=\"background: #5856d6;\">S</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst colors = ['#5856d6', '#007aff', '#34c759'];\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 2)\n\t\t\t.map((avatar, i) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<img class=\"messenger-avatar messenger-avatar-tiny\" src=\"${avatar}\" alt=\"Team member\" style=\"z-index: ${2 - i};\" />`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"messenger-avatar messenger-avatar-tiny\" style=\"background: ${colors[i % colors.length]}; z-index: ${2 - i};\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack messenger-avatar-stack-tiny\">${avatarItems}</div>`;\n\t}\n\n\t_renderEmptyState() {\n\t\treturn `\n\t\t\t<div class=\"messenger-changelog-empty\">\n\t\t\t\t<div class=\"messenger-changelog-empty-icon\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M228.54,86.66l-26.46,23.07A40,40,0,0,0,168,72.13L120.89,46.5a40,40,0,0,0-75.44-4l-22-19.2a8,8,0,0,0-10.5,12L35.44,54.77a40,40,0,0,0,50,61.07l47.1,25.64a40,40,0,0,0,75.41,4.07l26.46-23.07a8,8,0,0,0-10.5-12ZM56,96A24,24,0,1,1,77.25,82.75,24,24,0,0,1,56,96Zm144,64a24,24,0,1,1,24-24A24,24,0,0,1,200,160Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3>No changelog yet</h3>\n\t\t\t\t<p>Check back later for updates</p>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_formatDate(dateString) {\n\t\tif (!dateString) return '';\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleDateString('en-US', {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t\tyear: 'numeric',\n\t\t});\n\t}\n\n\t_truncateText(text, maxLength) {\n\t\tif (!text) return '';\n\t\tif (text.length <= maxLength) return text;\n\t\treturn text.substring(0, maxLength).trim() + '...';\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tthis._attachChangelogEvents();\n\t}\n\n\t_attachChangelogEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-changelog-card')\n\t\t\t.forEach((card) => {\n\t\t\t\tcard.addEventListener('click', () => {\n\t\t\t\t\tconst changelogId = card.dataset.changelogId;\n\t\t\t\t\tconst changelogItem = this.state.changelogItems.find(\n\t\t\t\t\t\t(n) => n.id === changelogId\n\t\t\t\t\t);\n\t\t\t\t\tif (changelogItem && changelogItem.url) {\n\t\t\t\t\t\twindow.open(changelogItem.url, '_blank');\n\t\t\t\t\t} else if (this.options.onChangelogClick) {\n\t\t\t\t\t\tthis.options.onChangelogClick(changelogItem);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class ChatView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t\tthis._typingTimeout = null;\n\t\tthis._isTyping = false;\n\t\tthis._typingIndicator = null;\n\t\tthis._isConversationClosed = false;\n\t\tthis._showEmailOverlayFlag = false;\n\t\tthis._pendingAttachments = []; // { file, preview, type }\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-chat-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type, data) => {\n\t\t\tif (\n\t\t\t\ttype === 'messageAdded' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._hideTypingIndicator();\n\t\t\t\tthis._appendMessage(data.message);\n\t\t\t\tthis._scrollToBottom();\n\t\t\t} else if (\n\t\t\t\ttype === 'typingStarted' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._showTypingIndicator(data.userName);\n\t\t\t} else if (\n\t\t\t\ttype === 'typingStopped' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._hideTypingIndicator();\n\t\t\t} else if (\n\t\t\t\ttype === 'conversationUpdated' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t} else if (type === 'messagesUpdate' && data.conversationId === this.state.activeConversationId) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst conversation = this.state.getActiveConversation();\n\t\tconst messages = this.state.getActiveMessages();\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\t\tconst isClosed = !isNewConversation && conversation?.status === 'closed';\n\t\tthis._isConversationClosed = isClosed;\n\n\t\tconst messagesHtml =\n\t\t\tmessages.length === 0\n\t\t\t\t? this._renderEmptyState(isNewConversation)\n\t\t\t\t: messages.map((msg) => this._renderMessage(msg)).join('');\n\n\t\tconst avatarHtml = this._renderConversationAvatar(conversation);\n\t\tconst title = isNewConversation\n\t\t\t? 'New conversation'\n\t\t\t: conversation?.title || 'Chat with team';\n\t\tconst placeholder = isNewConversation\n\t\t\t? 'Start typing your message...'\n\t\t\t: isClosed\n\t\t\t\t? 'Conversation closed'\n\t\t\t\t: 'Write a message...';\n\n\t\tconst existingName = this.state.userContext?.name || '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-chat-header\">\n\t\t\t\t<button class=\"messenger-back-btn\" aria-label=\"Back\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-chat-header-info\">\n\t\t\t\t\t${avatarHtml}\n\t\t\t\t\t<span class=\"messenger-chat-title\">${title}</span>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"messenger-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-chat-messages\">\n\t\t\t\t${messagesHtml}\n\t\t\t\t${isClosed ? `\n\t\t\t\t<div class=\"messenger-closed-banner\">\n\t\t\t\t\t<i class=\"ph ph-check-circle\" style=\"font-size: 18px;\"></i>\n\t\t\t\t\t<span>This conversation has been resolved</span>\n\t\t\t\t</div>\n\t\t\t\t` : ''}\n\t\t\t\t<div class=\"messenger-typing-indicator\" style=\"display: none;\">\n\t\t\t\t\t<div class=\"messenger-typing-dots\">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"messenger-typing-text\"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${isClosed ? '' : `\n\t\t\t<div class=\"messenger-compose-attachments-preview\"></div>\n\n\t\t\t<div class=\"messenger-chat-compose\">\n\t\t\t\t<button class=\"messenger-compose-attach\" aria-label=\"Attach file\">\n\t\t\t\t\t<i class=\"ph ph-paperclip\" style=\"font-size: 20px;\"></i>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-compose-input-wrapper\">\n\t\t\t\t\t<textarea class=\"messenger-compose-input\" placeholder=\"${placeholder}\" rows=\"1\"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"messenger-compose-send\" aria-label=\"Send\" disabled>\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14L118.42,148.9l47.24-47.25a8,8,0,0,0-11.31-11.31L107.1,137.58,24,98.22l.14,0L216,40Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<input type=\"file\" class=\"messenger-compose-file-input\" style=\"display:none;\" multiple accept=\"image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip\" />\n\t\t\t</div>\n\t\t\t`}\n\n\t\t\t<div class=\"messenger-email-overlay\" style=\"display: none;\">\n\t\t\t\t<div class=\"messenger-email-card\">\n\t\t\t\t\t<h4>What is your email address?</h4>\n\t\t\t\t\t<p>Enter your email to know when we reply:</p>\n\t\t\t\t\t<input type=\"text\" class=\"messenger-email-name\" placeholder=\"Name (optional)\" value=\"${this._escapeHtml(existingName)}\" autocomplete=\"name\" />\n\t\t\t\t\t<input type=\"email\" class=\"messenger-email-input\" placeholder=\"Enter your email address...\" autocomplete=\"email\" />\n\t\t\t\t\t<div class=\"messenger-email-actions\">\n\t\t\t\t\t\t<button class=\"messenger-email-submit\" disabled>Set my email</button>\n\t\t\t\t\t\t<button class=\"messenger-email-skip\">Skip</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._typingIndicator = this.element.querySelector(\n\t\t\t'.messenger-typing-indicator'\n\t\t);\n\t\tthis._attachEvents();\n\t\tthis._scrollToBottom();\n\t\tthis._renderAttachmentPreviews();\n\n\t\t// Show email overlay after first message sent without email\n\t\tif (this._showEmailOverlayFlag) {\n\t\t\tthis._showEmailOverlay();\n\t\t}\n\t}\n\n\t_renderEmptyState(isNewConversation = false) {\n\t\tconst avatarHtml = this._renderTeamAvatars();\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\t\tconst isOnline = this.state.agentsOnline;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-chat-empty\">\n\t\t\t\t<div class=\"messenger-chat-empty-avatars\">${avatarHtml}</div>\n\t\t\t\t<h3>${isNewConversation ? 'Start a new conversation' : 'Start the conversation'}</h3>\n\t\t\t\t<p>Send us a message and we'll get back to you as soon as possible.</p>\n\t\t\t\t<div class=\"messenger-chat-availability\">\n\t\t\t\t\t<span class=\"messenger-availability-dot ${isOnline ? 'messenger-availability-online' : 'messenger-availability-away'}\"></span>\n\t\t\t\t\t<span>${isOnline ? \"We're online now\" : responseTime}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderMessageAttachments(attachments) {\n\t\tif (!attachments || attachments.length === 0) return '';\n\t\treturn attachments.map((att) => {\n\t\t\tif (att.type === 'image') {\n\t\t\t\treturn `<img class=\"messenger-message-image\" src=\"${this._escapeHtml(att.url)}\" alt=\"${this._escapeHtml(att.name || 'image')}\" data-url=\"${this._escapeHtml(att.url)}\" />`;\n\t\t\t}\n\t\t\treturn `<a class=\"messenger-message-file\" href=\"${this._escapeHtml(att.url)}\" data-url=\"${this._escapeHtml(att.url)}\" data-name=\"${this._escapeHtml(att.name || 'file')}\">\n\t\t\t\t<i class=\"ph ph-file\" style=\"font-size:16px;\"></i>\n\t\t\t\t<span>${this._escapeHtml(att.name || 'file')}</span>\n\t\t\t\t<i class=\"ph ph-download-simple messenger-file-download-icon\" style=\"font-size:14px;\"></i>\n\t\t\t</a>`;\n\t\t}).join('');\n\t}\n\n\t_renderMessage(message) {\n\t\tconst isOwn = message.isOwn;\n\t\tconst messageClass = isOwn\n\t\t\t? 'messenger-message-own'\n\t\t\t: 'messenger-message-received';\n\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\t\tconst attachmentsHtml = this._renderMessageAttachments(message.attachments);\n\n\t\tconst contentHtml = message.content ? `<div class=\"messenger-message-content\">${this._formatMessageContent(message.content)}</div>` : '';\n\n\t\tconst bubbleHtml = contentHtml ? `<div class=\"messenger-message-bubble\">${contentHtml}</div>` : '';\n\n\t\tif (isOwn) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-message ${messageClass}\">\n\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t<div class=\"messenger-message-time\">${timeStr}</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarHtml = this._renderSenderAvatar(message.sender);\n\t\treturn `\n\t\t\t<div class=\"messenger-message ${messageClass}\">\n\t\t\t\t<div class=\"messenger-message-avatar\">${avatarHtml}</div>\n\t\t\t\t<div class=\"messenger-message-wrapper\">\n\t\t\t\t\t<div class=\"messenger-message-sender\">${message.sender?.name || 'Support'}</div>\n\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t<div class=\"messenger-message-time\">${timeStr}</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderSenderAvatar(sender) {\n\t\tif (sender?.avatarUrl) {\n\t\t\treturn `<img class=\"messenger-avatar messenger-avatar-small\" src=\"${sender.avatarUrl}\" alt=\"${sender.name}\" />`;\n\t\t}\n\t\tconst initial = (sender?.name || 'S').charAt(0).toUpperCase();\n\t\treturn `<div class=\"messenger-avatar messenger-avatar-small\" style=\"background: #5856d6;\">${initial}</div>`;\n\t}\n\n\t_renderConversationAvatar(conversation) {\n\t\tif (!conversation?.participants?.length) {\n\t\t\treturn `<div class=\"messenger-avatar messenger-avatar-small\" style=\"background: #5856d6;\">S</div>`;\n\t\t}\n\t\tconst p = conversation.participants[0];\n\t\tif (p.avatarUrl) {\n\t\t\treturn `<img class=\"messenger-avatar messenger-avatar-small\" src=\"${p.avatarUrl}\" alt=\"${p.name}\" />`;\n\t\t}\n\t\treturn `<div class=\"messenger-avatar messenger-avatar-small\" style=\"background: #5856d6;\">${(p.name || 'S').charAt(0).toUpperCase()}</div>`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"messenger-avatar\" style=\"background: #5856d6;\">S</div>\n\t\t\t\t\t<div class=\"messenger-avatar\" style=\"background: #007aff;\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst colors = ['#5856d6', '#007aff', '#34c759', '#ff9500', '#ff3b30'];\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar, i) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<img class=\"messenger-avatar\" src=\"${avatar}\" alt=\"Team member\" style=\"z-index: ${3 - i};\" />`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"messenger-avatar\" style=\"background: ${colors[i % colors.length]}; z-index: ${3 - i};\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_formatMessageTime(timestamp) {\n\t\tif (!timestamp) return '';\n\t\tconst date = new Date(timestamp);\n\t\treturn date.toLocaleTimeString('en-US', {\n\t\t\thour: 'numeric',\n\t\t\tminute: '2-digit',\n\t\t\thour12: true,\n\t\t});\n\t}\n\n\t_formatMessageContent(content) {\n\t\tif (!content) return '';\n\t\treturn content\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\\n/g, '<br>');\n\t}\n\n\t_appendMessage(message) {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tconst emptyState = messagesContainer.querySelector('.messenger-chat-empty');\n\t\tif (emptyState) {\n\t\t\temptyState.remove();\n\t\t}\n\n\t\tconst messageHtml = this._renderMessage(message);\n\t\tconst tempDiv = document.createElement('div');\n\t\ttempDiv.innerHTML = messageHtml;\n\t\tmessagesContainer.appendChild(tempDiv.firstElementChild);\n\t}\n\n\t_scrollToBottom() {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n\t\t\t}, 50);\n\t\t}\n\t}\n\n\t_updateSendButtonState() {\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\t\tif (input && sendBtn) {\n\t\t\tsendBtn.disabled = !input.value.trim() && this._pendingAttachments.length === 0;\n\t\t}\n\t}\n\n\t_renderAttachmentPreviews() {\n\t\tconst container = this.element.querySelector('.messenger-compose-attachments-preview');\n\t\tif (!container) return;\n\n\t\tif (this._pendingAttachments.length === 0) {\n\t\t\tcontainer.innerHTML = '';\n\t\t\tcontainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.display = 'flex';\n\t\tcontainer.innerHTML = this._pendingAttachments.map((att, i) => {\n\t\t\tconst isImage = att.type.startsWith('image');\n\t\t\tconst thumb = isImage\n\t\t\t\t? `<img class=\"messenger-attachment-thumb\" src=\"${att.preview}\" alt=\"${this._escapeHtml(att.file.name)}\" />`\n\t\t\t\t: `<div class=\"messenger-attachment-thumb messenger-attachment-file-icon\"><i class=\"ph ph-file\" style=\"font-size:20px;\"></i></div>`;\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-attachment-preview\" data-index=\"${i}\">\n\t\t\t\t\t${thumb}\n\t\t\t\t\t<button class=\"messenger-attachment-remove\" data-index=\"${i}\" aria-label=\"Remove\">×</button>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}).join('');\n\n\t\t// Attach remove button events\n\t\tcontainer.querySelectorAll('.messenger-attachment-remove').forEach((btn) => {\n\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\tconst idx = parseInt(e.currentTarget.dataset.index, 10);\n\t\t\t\tthis._pendingAttachments.splice(idx, 1);\n\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\tthis._updateSendButtonState();\n\t\t\t});\n\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-back-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('messages');\n\t\t\t});\n\n\t\tthis.element\n\t\t\t.querySelector('.messenger-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\t// Compose input (not rendered when conversation is closed)\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\n\t\tif (input && sendBtn) {\n\t\t\tinput.addEventListener('input', () => {\n\t\t\t\t// Auto-resize textarea\n\t\t\t\tinput.style.height = 'auto';\n\t\t\t\tinput.style.height = Math.min(input.scrollHeight, 120) + 'px';\n\n\t\t\t\t// Enable/disable send button\n\t\t\t\tthis._updateSendButtonState();\n\n\t\t\t\t// Send typing indicator\n\t\t\t\tif (input.value.trim()) {\n\t\t\t\t\tthis._startTyping();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter' && !e.shiftKey) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis._sendMessage();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsendBtn.addEventListener('click', () => {\n\t\t\t\tthis._sendMessage();\n\t\t\t});\n\t\t}\n\n\t\t// Attach button + file input\n\t\tconst attachBtn = this.element.querySelector('.messenger-compose-attach');\n\t\tconst fileInput = this.element.querySelector('.messenger-compose-file-input');\n\n\t\tif (attachBtn && fileInput) {\n\t\t\tattachBtn.addEventListener('click', () => {\n\t\t\t\tfileInput.click();\n\t\t\t});\n\n\t\t\tfileInput.addEventListener('change', (e) => {\n\t\t\t\tconst files = e.target.files;\n\t\t\t\tif (!files) return;\n\t\t\t\tArray.from(files).forEach((file) => {\n\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\treader.onload = (ev) => {\n\t\t\t\t\t\tthis._pendingAttachments.push({\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tpreview: ev.target.result,\n\t\t\t\t\t\t\ttype: file.type,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t\t};\n\t\t\t\t\treader.readAsDataURL(file);\n\t\t\t\t});\n\t\t\t\tfileInput.value = '';\n\t\t\t});\n\t\t}\n\n\t\t// Email overlay events\n\t\tconst emailInput = this.element.querySelector('.messenger-email-input');\n\t\tconst emailSubmit = this.element.querySelector('.messenger-email-submit');\n\t\tconst emailSkip = this.element.querySelector('.messenger-email-skip');\n\n\t\tif (emailInput) {\n\t\t\temailInput.addEventListener('input', () => {\n\t\t\t\tconst isValid = this._isValidEmail(emailInput.value.trim());\n\t\t\t\temailSubmit.disabled = !isValid;\n\t\t\t});\n\n\t\t\temailInput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter' && !emailSubmit.disabled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis._handleEmailSubmit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (emailSubmit) {\n\t\t\temailSubmit.addEventListener('click', () => {\n\t\t\t\tthis._handleEmailSubmit();\n\t\t\t});\n\t\t}\n\n\t\tif (emailSkip) {\n\t\t\temailSkip.addEventListener('click', () => {\n\t\t\t\tthis._hideEmailOverlay();\n\t\t\t});\n\t\t}\n\n\t\t// Delegated events for attachment clicks\n\t\tconst messagesContainer = this.element.querySelector('.messenger-chat-messages');\n\t\tif (messagesContainer) {\n\t\t\tmessagesContainer.addEventListener('click', (e) => {\n\t\t\t\t// File click -> download\n\t\t\t\tconst fileLink = e.target.closest('.messenger-message-file');\n\t\t\t\tif (fileLink) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst url = fileLink.dataset.url;\n\t\t\t\t\tconst name = fileLink.dataset.name;\n\t\t\t\t\tthis._downloadFile(url, name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Image click -> open in new tab\n\t\t\t\tconst img = e.target.closest('.messenger-message-image');\n\t\t\t\tif (img) {\n\t\t\t\t\tconst url = img.dataset.url || img.src;\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _downloadFile(url, name) {\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst blob = await response.blob();\n\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.href = blobUrl;\n\t\t\ta.download = name || 'download';\n\t\t\ta.style.display = 'none';\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\tdocument.body.removeChild(a);\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t} catch {\n\t\t\t// Fallback: open in new tab\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\t}\n\n\t_isValidEmail(email) {\n\t\treturn /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n\t}\n\n\t_showEmailOverlay() {\n\t\tconst overlay = this.element.querySelector('.messenger-email-overlay');\n\t\tif (overlay) {\n\t\t\toverlay.style.display = 'flex';\n\t\t\tconst emailInput = overlay.querySelector('.messenger-email-input');\n\t\t\tif (emailInput) {\n\t\t\t\tsetTimeout(() => emailInput.focus(), 100);\n\t\t\t}\n\t\t}\n\t}\n\n\t_startPendingConversation() {\n\t\tif (this._pendingMessage && this.options.onStartConversation) {\n\t\t\tthis.options.onStartConversation(this._pendingMessage, this._pendingAttachmentsForSend || []);\n\t\t\tthis._pendingMessage = null;\n\t\t\tthis._pendingAttachmentsForSend = null;\n\t\t}\n\t}\n\n\t_hideEmailOverlay() {\n\t\tthis._showEmailOverlayFlag = false;\n\t\tconst overlay = this.element.querySelector('.messenger-email-overlay');\n\t\tif (overlay) {\n\t\t\toverlay.style.display = 'none';\n\t\t}\n\t}\n\n\tasync _handleEmailSubmit() {\n\t\tconst nameInput = this.element.querySelector('.messenger-email-name');\n\t\tconst emailInput = this.element.querySelector('.messenger-email-input');\n\t\tconst submitBtn = this.element.querySelector('.messenger-email-submit');\n\n\t\tconst name = nameInput?.value.trim() || '';\n\t\tconst email = emailInput?.value.trim();\n\n\t\tif (!email || !this._isValidEmail(email)) return;\n\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitBtn.textContent = 'Saving...';\n\n\t\ttry {\n\t\t\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({ name, email });\n\t\t\t}\n\n\t\t\tif (!this.state.userContext) {\n\t\t\t\tthis.state.userContext = {};\n\t\t\t}\n\t\t\tthis.state.userContext.name = name;\n\t\t\tthis.state.userContext.email = email;\n\n\t\t\tthis._hideEmailOverlay();\n\t\t\tthis._startPendingConversation();\n\t\t} catch (error) {\n\t\t\tconsole.error('[ChatView] Failed to save email:', error);\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitBtn.textContent = 'Set my email';\n\t\t}\n\t}\n\n\tasync _sendMessage() {\n\t\tif (this._isConversationClosed) return;\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst content = input.value.trim();\n\t\tconst hasAttachments = this._pendingAttachments.length > 0;\n\n\t\tif (!content && !hasAttachments) return;\n\n\t\tthis._stopTyping();\n\n\t\t// Collect attachments to upload\n\t\tconst attachmentsToSend = [...this._pendingAttachments];\n\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\t\tconst needsContactInfo = !this.state.userContext?.email;\n\n\t\tif (isNewConversation) {\n\t\t\t// Show user's message in chat immediately\n\t\t\tconst localMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: content,\n\t\t\t\tisOwn: true,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tattachments: attachmentsToSend.map((a) => ({\n\t\t\t\t\turl: a.preview,\n\t\t\t\t\ttype: a.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: a.file.name,\n\t\t\t\t})),\n\t\t\t};\n\t\t\tthis._appendMessage(localMessage);\n\t\t\tthis._scrollToBottom();\n\n\t\t\tif (needsContactInfo) {\n\t\t\t\tthis._pendingMessage = content;\n\t\t\t\tthis._pendingAttachmentsForSend = attachmentsToSend;\n\t\t\t\tthis._showEmailOverlayFlag = true;\n\t\t\t\tsetTimeout(() => this._showEmailOverlay(), 300);\n\t\t\t} else {\n\t\t\t\tif (this.options.onStartConversation) {\n\t\t\t\t\tthis.options.onStartConversation(content, attachmentsToSend);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst message = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: content,\n\t\t\t\tisOwn: true,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tattachments: attachmentsToSend.map((a) => ({\n\t\t\t\t\turl: a.preview,\n\t\t\t\t\ttype: a.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: a.file.name,\n\t\t\t\t})),\n\t\t\t};\n\n\t\t\tthis.state.addMessage(this.state.activeConversationId, message);\n\n\t\t\tif (this.options.onSendMessage) {\n\t\t\t\tthis.options.onSendMessage(this.state.activeConversationId, message, attachmentsToSend);\n\t\t\t}\n\t\t}\n\n\t\t// Clear input and attachments\n\t\tinput.value = '';\n\t\tinput.style.height = 'auto';\n\t\tthis._pendingAttachments = [];\n\t\tthis._renderAttachmentPreviews();\n\t\tthis._updateSendButtonState();\n\t}\n\n\t_startTyping() {\n\t\tif (this._isConversationClosed) return;\n\t\tif (!this._isTyping && this.state.activeConversationId) {\n\t\t\tthis._isTyping = true;\n\t\t\tif (this.options.onTyping) {\n\t\t\t\tthis.options.onTyping(this.state.activeConversationId, true);\n\t\t\t}\n\t\t}\n\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t}\n\t\tthis._typingTimeout = setTimeout(() => {\n\t\t\tthis._stopTyping();\n\t\t}, 3000);\n\t}\n\n\t_stopTyping() {\n\t\tif (this._isTyping && this.state.activeConversationId) {\n\t\t\tthis._isTyping = false;\n\t\t\tif (this.options.onTyping) {\n\t\t\t\tthis.options.onTyping(this.state.activeConversationId, false);\n\t\t\t}\n\t\t}\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t\tthis._typingTimeout = null;\n\t\t}\n\t}\n\n\t_showTypingIndicator(userName) {\n\t\tif (this._typingIndicator) {\n\t\t\tthis._typingIndicator.style.display = 'flex';\n\t\t\tconst textEl = this._typingIndicator.querySelector(\n\t\t\t\t'.messenger-typing-text'\n\t\t\t);\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = `${userName || 'Support'} is typing...`;\n\t\t\t}\n\t\t\tthis._scrollToBottom();\n\t\t}\n\t}\n\n\t_hideTypingIndicator() {\n\t\tif (this._typingIndicator) {\n\t\t\tthis._typingIndicator.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t}\n\t\tthis._stopTyping();\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class ConversationsView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-conversations-view';\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'conversationAdded' ||\n\t\t\t\ttype === 'conversationRead' ||\n\t\t\t\ttype === 'conversationUpdated'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst conversations = this.state.conversations;\n\t\tconst avatarsHtml = this._renderAvatarStack();\n\n\t\tlet conversationsHtml;\n\t\tif (conversations.length === 0) {\n\t\t\tconversationsHtml = `\n\t\t\t\t<div class=\"messenger-conversations-empty\">\n\t\t\t\t\t<div class=\"messenger-conversations-empty-icon\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78.69.69,0,0,0,.13-.11L82.5,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H82.5a16,16,0,0,0-10.3,3.75l-.12.11L40,224V64H216Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No conversations yet</h3>\n\t\t\t\t\t<p>Start a new conversation with our team</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t} else {\n\t\t\tconversationsHtml = `\n\t\t\t\t<div class=\"messenger-conversations-list\">\n\t\t\t\t\t${conversations.map((conv) => this._renderConversationItem(conv)).join('')}\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-conversations-header\">\n\t\t\t\t<h2>Messages</h2>\n\t\t\t\t<button class=\"messenger-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-conversations-body\">\n\t\t\t\t${conversationsHtml}\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-conversations-footer\">\n\t\t\t\t<button class=\"messenger-new-message-btn\">\n\t\t\t\t\t<div class=\"messenger-new-message-avatars\">${avatarsHtml}</div>\n\t\t\t\t\t<span>Send us a message</span>\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderConversationItem(conversation) {\n\t\tconst unreadClass = conversation.unread > 0 ? 'unread' : '';\n\t\tconst timeAgo = this._formatTimeAgo(conversation.lastMessageTime);\n\t\tconst avatarsHtml = this._renderConversationAvatars(\n\t\t\tconversation.participants\n\t\t);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-conversation-item ${unreadClass}\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"messenger-conversation-avatars\">\n\t\t\t\t\t${avatarsHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-conversation-content\">\n\t\t\t\t\t<div class=\"messenger-conversation-header\">\n\t\t\t\t\t\t<span class=\"messenger-conversation-title\">${conversation.title || 'Chat with team'}</span>\n\t\t\t\t\t\t<span class=\"messenger-conversation-time\">${timeAgo}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"messenger-conversation-preview\">\n\t\t\t\t\t\t${conversation.unread > 0 ? '<span class=\"messenger-unread-dot\"></span>' : ''}\n\t\t\t\t\t\t<span class=\"messenger-conversation-message\">${this._truncateMessage(conversation.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderConversationAvatars(participants) {\n\t\tif (!participants || participants.length === 0) {\n\t\t\treturn `<div class=\"messenger-avatar messenger-avatar-medium\" style=\"background: #5856d6;\">S</div>`;\n\t\t}\n\n\t\tconst p = participants[0];\n\t\tif (p.avatarUrl) {\n\t\t\treturn `<img class=\"messenger-avatar messenger-avatar-medium\" src=\"${p.avatarUrl}\" alt=\"${p.name}\" />`;\n\t\t}\n\t\treturn `<div class=\"messenger-avatar messenger-avatar-medium\" style=\"background: ${this._getAvatarColor(0)};\">${(p.name || 'S').charAt(0).toUpperCase()}</div>`;\n\t}\n\n\t_renderAvatarStack() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack messenger-avatar-stack-small\">\n\t\t\t\t\t<div class=\"messenger-avatar messenger-avatar-small\" style=\"background: #5856d6;\">S</div>\n\t\t\t\t\t<div class=\"messenger-avatar messenger-avatar-small\" style=\"background: #007aff;\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 2)\n\t\t\t.map((avatar, i) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<img class=\"messenger-avatar messenger-avatar-small\" src=\"${avatar}\" alt=\"Team member\" style=\"z-index: ${2 - i};\" />`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"messenger-avatar messenger-avatar-small\" style=\"background: ${this._getAvatarColor(i)}; z-index: ${2 - i};\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack messenger-avatar-stack-small\">${avatarItems}</div>`;\n\t}\n\n\t_getAvatarColor(index) {\n\t\tconst colors = ['#5856d6', '#007aff', '#34c759', '#ff9500', '#ff3b30'];\n\t\treturn colors[index % colors.length];\n\t}\n\n\t_formatTimeAgo(timestamp) {\n\t\tif (!timestamp) return '';\n\t\tconst date = new Date(timestamp);\n\t\tconst now = new Date();\n\t\tconst diffMs = now - date;\n\t\tconst diffMins = Math.floor(diffMs / 60000);\n\t\tconst diffHours = Math.floor(diffMs / 3600000);\n\t\tconst diffDays = Math.floor(diffMs / 86400000);\n\n\t\tif (diffMins < 1) return 'now';\n\t\tif (diffMins < 60) return `${diffMins}m`;\n\t\tif (diffHours < 24) return `${diffHours}h`;\n\t\tif (diffDays < 7) return `${diffDays}d`;\n\t\treturn date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\t}\n\n\t_truncateMessage(message) {\n\t\tif (!message) return 'No messages yet';\n\t\tconst maxLength = 50;\n\t\tif (message.length <= maxLength) return message;\n\t\treturn message.substring(0, maxLength) + '...';\n\t}\n\n\t_attachEvents() {\n\t\tconst closeBtn = this.element.querySelector('.messenger-close-btn');\n\t\tif (closeBtn) {\n\t\t\tcloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-conversation-item')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst convId = item.dataset.conversationId;\n\t\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\t\tthis.state.markAsRead(convId);\n\t\t\t\t\tthis.state.setView('chat');\n\n\t\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\tconst newMsgBtn = this.element.querySelector('.messenger-new-message-btn');\n\t\tif (newMsgBtn) {\n\t\t\tnewMsgBtn.addEventListener('click', () => {\n\t\t\t\tthis._startNewConversation();\n\t\t\t});\n\t\t}\n\t}\n\n\t_startNewConversation() {\n\t\t// If there's an open conversation, route to it instead of creating new\n\t\tconst openConversation = this.state.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.state.setActiveConversation(openConversation.id);\n\t\t\tthis.state.markAsRead(openConversation.id);\n\t\t\tthis.state.setView('chat');\n\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\tthis.options.onSelectConversation(openConversation.id);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.state.setActiveConversation(null);\n\t\t\tif (this.options.onStartNewConversation) {\n\t\t\t\tthis.options.onStartNewConversation();\n\t\t\t} else {\n\t\t\t\tthis.state.setView('chat');\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class HelpView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-help-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'helpArticlesUpdate' || type === 'helpSearchChange') {\n\t\t\t\tthis._updateCollectionsList();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst searchQuery = this.state.helpSearchQuery || '';\n\t\tconst collections = this.state.helpArticles || [];\n\t\tconst collectionCount = collections.length;\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-help-header\">\n\t\t\t\t<h2>Help</h2>\n\t\t\t\t<button class=\"messenger-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-help-search\">\n\t\t\t\t<div class=\"messenger-help-search-wrapper\">\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tclass=\"messenger-help-search-input\"\n\t\t\t\t\t\tplaceholder=\"Search for help\"\n\t\t\t\t\t\tvalue=\"${searchQuery}\"\n\t\t\t\t\t/>\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"#000000\" viewBox=\"0 0 256 256\" class=\"messenger-help-search-icon\">\n\t\t\t\t\t\t<path d=\"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-help-body\">\n\t\t\t\t<div class=\"messenger-help-collections-header\">\n\t\t\t\t\t${collectionCount} collections\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-help-collections\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._updateCollectionsList();\n\t\tthis._attachEvents();\n\t}\n\n\t_updateCollectionsList() {\n\t\tconst collectionsContainer = this.element.querySelector(\n\t\t\t'.messenger-help-collections'\n\t\t);\n\t\tconst collections = this.state.helpArticles || [];\n\t\tconst searchQuery = (this.state.helpSearchQuery || '').toLowerCase();\n\n\t\tconst filteredCollections = searchQuery\n\t\t\t? collections.filter(\n\t\t\t\t\t(c) =>\n\t\t\t\t\t\tc.title.toLowerCase().includes(searchQuery) ||\n\t\t\t\t\t\t(c.description && c.description.toLowerCase().includes(searchQuery))\n\t\t\t\t)\n\t\t\t: collections;\n\n\t\tconst headerEl = this.element.querySelector(\n\t\t\t'.messenger-help-collections-header'\n\t\t);\n\t\tif (headerEl) {\n\t\t\theaderEl.textContent = `${filteredCollections.length} collections`;\n\t\t}\n\n\t\tif (filteredCollections.length === 0) {\n\t\t\tcollectionsContainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tcollectionsContainer.innerHTML = filteredCollections\n\t\t\t.map((collection) => this._renderCollectionItem(collection))\n\t\t\t.join('');\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_renderCollectionItem(collection) {\n\t\tconst articleCount = collection.articleCount || 0;\n\t\treturn `\n\t\t\t<div class=\"messenger-help-collection\" data-collection-id=\"${collection.id}\">\n\t\t\t\t<div class=\"messenger-help-collection-content\">\n\t\t\t\t\t<h3 class=\"messenger-help-collection-title\">${collection.title}</h3>\n\t\t\t\t\t<p class=\"messenger-help-collection-desc\">${collection.description || ''}</p>\n\t\t\t\t\t<span class=\"messenger-help-collection-count\">${articleCount} articles</span>\n\t\t\t\t</div>\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\" class=\"messenger-help-collection-arrow\">\n\t\t\t\t\t<path d=\"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z\"></path>\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderEmptyState() {\n\t\tconst isSearching = this.state.helpSearchQuery;\n\n\t\tif (isSearching) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-help-empty\">\n\t\t\t\t\t<div class=\"messenger-help-empty-icon\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No results found</h3>\n\t\t\t\t\t<p>Try a different search term</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"messenger-help-empty\">\n\t\t\t\t<div class=\"messenger-help-empty-icon\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3>Help collections</h3>\n\t\t\t\t<p>No collections available yet</p>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst searchInput = this.element.querySelector(\n\t\t\t'.messenger-help-search-input'\n\t\t);\n\t\tlet searchTimeout;\n\t\tsearchInput.addEventListener('input', (e) => {\n\t\t\tclearTimeout(searchTimeout);\n\t\t\tsearchTimeout = setTimeout(() => {\n\t\t\t\tthis.state.setHelpSearchQuery(e.target.value);\n\t\t\t}, 300);\n\t\t});\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_attachCollectionEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-help-collection')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst collectionId = item.dataset.collectionId;\n\t\t\t\t\tconst collection = this.state.helpArticles.find(\n\t\t\t\t\t\t(c) => c.id === collectionId\n\t\t\t\t\t);\n\t\t\t\t\tif (collection && collection.url) {\n\t\t\t\t\t\twindow.open(collection.url, '_blank');\n\t\t\t\t\t} else if (this.options.onArticleClick) {\n\t\t\t\t\t\tthis.options.onArticleClick(collection);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class HomeView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-home-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'homeChangelogUpdate' ||\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'availabilityUpdate'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst avatarsHtml = this._renderAvatarStack();\n\t\tconst recentChangelogHtml = this._renderRecentChangelog();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-home-header\">\n\t\t\t\t<div class=\"messenger-home-header-top\">\n\t\t\t\t\t<div class=\"messenger-home-logo\">\n\t\t\t\t\t\t${this.options.logoUrl ? `<img src=\"${this.options.logoUrl}\" alt=\"${this.state.teamName}\" />` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"messenger-home-avatars\">${avatarsHtml}</div>\n\t\t\t\t\t<button class=\"messenger-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-home-welcome\">\n\t\t\t\t\t<span class=\"messenger-home-greeting\">Hello there.</span>\n\t\t\t\t\t<span class=\"messenger-home-question\">${this.state.welcomeMessage}</span>\n\t\t\t\t\t${this._renderAvailabilityStatus()}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-home-body\">\n\t\t\t\t${this._renderMessageButton()}\n\n\t\t\t\t${this._renderFeaturedCard()}\n\n\t\t\t\t${recentChangelogHtml}\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderAvatarStack() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"messenger-avatar\" style=\"background: #5856d6;\">S</div>\n\t\t\t\t\t<div class=\"messenger-avatar\" style=\"background: #007aff;\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar, i) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<img class=\"messenger-avatar\" src=\"${avatar}\" alt=\"Team member\" style=\"z-index: ${3 - i};\" />`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"messenger-avatar\" style=\"background: ${this._getAvatarColor(i)}; z-index: ${3 - i};\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_getAvatarColor(index) {\n\t\tconst colors = ['#5856d6', '#007aff', '#34c759', '#ff9500', '#ff3b30'];\n\t\treturn colors[index % colors.length];\n\t}\n\n\t_renderAvailabilityStatus() {\n\t\tconst isOnline = this.state.agentsOnline;\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\n\t\tif (isOnline) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-home-availability\">\n\t\t\t\t\t<span class=\"messenger-availability-dot messenger-availability-online\"></span>\n\t\t\t\t\t<span class=\"messenger-availability-text\">We're online now</span>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-availability\">\n\t\t\t\t<span class=\"messenger-availability-dot messenger-availability-away\"></span>\n\t\t\t\t<span class=\"messenger-availability-text\">${responseTime}</span>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderMessageButton() {\n\t\tconst openConversation = this.state.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tconst preview = openConversation.lastMessage\n\t\t\t\t? (openConversation.lastMessage.length > 40\n\t\t\t\t\t? openConversation.lastMessage.substring(0, 40) + '...'\n\t\t\t\t\t: openConversation.lastMessage)\n\t\t\t\t: 'Continue your conversation';\n\n\t\t\treturn `\n\t\t\t\t<button class=\"messenger-home-message-btn messenger-home-continue-btn\" data-conversation-id=\"${openConversation.id}\">\n\t\t\t\t\t<div class=\"messenger-home-continue-info\">\n\t\t\t\t\t\t<span class=\"messenger-home-continue-label\">Continue conversation</span>\n\t\t\t\t\t\t<span class=\"messenger-home-continue-preview\">${preview}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<i class=\"ph ph-arrow-right\" style=\"font-size: 16px;\"></i>\n\t\t\t\t</button>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<button class=\"messenger-home-message-btn\">\n\t\t\t\t<span>Send us a message</span>\n\t\t\t\t<i class=\"ph ph-arrow-right\" style=\"font-size: 16px;\"></i>\n\t\t\t</button>\n\t\t`;\n\t}\n\n\t_renderFeaturedCard() {\n\t\tif (!this.options.featuredContent) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst { title, description, imageUrl, action } =\n\t\t\tthis.options.featuredContent;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-featured\">\n\t\t\t\t${imageUrl ? `<img src=\"${imageUrl}\" alt=\"${title}\" class=\"messenger-home-featured-image\" onerror=\"this.style.display='none';\" />` : ''}\n\t\t\t\t<div class=\"messenger-home-featured-content\">\n\t\t\t\t\t<h3>${title}</h3>\n\t\t\t\t\t<p>${description}</p>\n\t\t\t\t</div>\n\t\t\t\t${action ? `<button class=\"messenger-home-featured-btn\" data-action=\"${action.type}\" data-value=\"${action.value}\">${action.label}</button>` : ''}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderRecentChangelog() {\n\t\tconst changelogItems = this.state.homeChangelogItems;\n\t\tif (changelogItems.length === 0) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst changelogHtml = changelogItems\n\t\t\t.map(\n\t\t\t\t(item) => `\n\t\t\t<div class=\"messenger-home-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${\n\t\t\t\t\titem.coverImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"messenger-home-changelog-cover\">\n\t\t\t\t\t\t<img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.style.display='none';\" />\n\t\t\t\t\t\t${item.coverText ? `<span class=\"messenger-home-changelog-cover-text\">${item.coverText}</span>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-home-changelog-card-content\">\n\t\t\t\t\t<h4 class=\"messenger-home-changelog-card-title\">${item.title}</h4>\n\t\t\t\t\t<p class=\"messenger-home-changelog-card-desc\">${item.description || ''}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t\t\t)\n\t\t\t.join('');\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-changelog-section\">\n\t\t\t\t${changelogHtml}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_formatDate(dateString) {\n\t\tif (!dateString) return '';\n\t\tconst date = new Date(dateString);\n\t\tconst now = new Date();\n\t\tconst diffDays = Math.floor((now - date) / (1000 * 60 * 60 * 24));\n\n\t\tif (diffDays === 0) return 'Today';\n\t\tif (diffDays === 1) return 'Yesterday';\n\t\tif (diffDays < 7) return `${diffDays}d ago`;\n\t\treturn date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\t// Send message / continue conversation button\n\t\tconst msgBtn = this.element.querySelector('.messenger-home-message-btn');\n\t\tif (msgBtn) {\n\t\t\tmsgBtn.addEventListener('click', () => {\n\t\t\t\tconst convId = msgBtn.dataset.conversationId;\n\t\t\t\tif (convId) {\n\t\t\t\t\t// Continue existing open conversation\n\t\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\t\tthis.state.setView('chat');\n\t\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// No open conversation — start new\n\t\t\t\t\tthis.state.setActiveConversation(null);\n\t\t\t\t\tthis.state.setView('chat');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-home-changelog-item')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tthis.state.setView('changelog');\n\t\t\t\t});\n\t\t\t});\n\n\t\tconst seeAllBtn = this.element.querySelector(\n\t\t\t'.messenger-home-changelog-all'\n\t\t);\n\t\tif (seeAllBtn) {\n\t\t\tseeAllBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('changelog');\n\t\t\t});\n\t\t}\n\n\t\tconst featuredBtn = this.element.querySelector(\n\t\t\t'.messenger-home-featured-btn'\n\t\t);\n\t\tif (featuredBtn) {\n\t\t\tfeaturedBtn.addEventListener('click', () => {\n\t\t\t\tconst action = featuredBtn.dataset.action;\n\t\t\t\tconst value = featuredBtn.dataset.value;\n\t\t\t\tif (action === 'url') {\n\t\t\t\t\twindow.open(value, '_blank');\n\t\t\t\t} else if (action === 'view') {\n\t\t\t\t\tthis.state.setView(value);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","/**\n * PreChatFormView - Collects user info after the first message\n */\nexport class PreChatFormView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._isSubmitting = false;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-prechat-view';\n\n\t\tthis._updateContent();\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\t// Pre-fill from userContext if available\n\t\tconst existingName = this.state.userContext?.name || '';\n\t\tconst existingEmail = this.state.userContext?.email || '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-prechat-overlay\">\n\t\t\t\t<div class=\"messenger-prechat-card\">\n\t\t\t\t\t<h4>Get notified when we reply</h4>\n\t\t\t\t\t<form class=\"messenger-prechat-form\" novalidate>\n\t\t\t\t\t\t<div class=\"messenger-prechat-fields\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tid=\"messenger-prechat-name\"\n\t\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\t\tplaceholder=\"Name (optional)\"\n\t\t\t\t\t\t\t\tvalue=\"${this._escapeHtml(existingName)}\"\n\t\t\t\t\t\t\t\tautocomplete=\"name\"\n\t\t\t\t\t\t\t\tclass=\"messenger-prechat-input\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\tid=\"messenger-prechat-email\"\n\t\t\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t\t\tplaceholder=\"Email address\"\n\t\t\t\t\t\t\t\tvalue=\"${this._escapeHtml(existingEmail)}\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t\t\tclass=\"messenger-prechat-input\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span class=\"messenger-prechat-error\" id=\"messenger-email-error\"></span>\n\t\t\t\t\t\t<div class=\"messenger-prechat-actions\">\n\t\t\t\t\t\t\t<button type=\"button\" class=\"messenger-prechat-skip\">Skip</button>\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"messenger-prechat-submit\" disabled>\n\t\t\t\t\t\t\t\t<span class=\"messenger-prechat-submit-text\">Continue</span>\n\t\t\t\t\t\t\t\t<span class=\"messenger-prechat-submit-loading\" style=\"display: none;\">\n\t\t\t\t\t\t\t\t\t<i class=\"ph ph-spinner\" style=\"font-size: 16px;\"></i>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"messenger-avatar\" style=\"background: #5856d6;\">S</div>\n\t\t\t\t\t<div class=\"messenger-avatar\" style=\"background: #007aff;\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst colors = ['#5856d6', '#007aff', '#34c759', '#ff9500', '#ff3b30'];\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar, i) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<img class=\"messenger-avatar\" src=\"${avatar}\" alt=\"Team member\" style=\"z-index: ${3 - i};\" />`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"messenger-avatar\" style=\"background: ${colors[i % colors.length]}; z-index: ${3 - i};\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\t_attachEvents() {\n\t\t// Form validation\n\t\tconst form = this.element.querySelector('.messenger-prechat-form');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst skipBtn = this.element.querySelector('.messenger-prechat-skip');\n\n\t\tconst validateForm = () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tconst isEmailValid = this._isValidEmail(email);\n\t\t\tsubmitBtn.disabled = !isEmailValid;\n\t\t\treturn isEmailValid;\n\t\t};\n\n\t\temailInput.addEventListener('input', () => {\n\t\t\tthis._clearError('messenger-email-error');\n\t\t\tvalidateForm();\n\t\t});\n\n\t\temailInput.addEventListener('blur', () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tif (email && !this._isValidEmail(email)) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t}\n\t\t});\n\n\t\t// Skip button - go back to chat without collecting info\n\t\tskipBtn.addEventListener('click', () => {\n\t\t\tthis.state.setView('chat');\n\t\t});\n\n\t\t// Form submission\n\t\tform.addEventListener('submit', async (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (this._isSubmitting) return;\n\t\t\tif (!validateForm()) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this._handleSubmit();\n\t\t});\n\n\t\t// Set initial button state\n\t\tvalidateForm();\n\n\t\t// Focus email input\n\t\tsetTimeout(() => emailInput.focus(), 100);\n\t}\n\n\t_isValidEmail(email) {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\treturn emailRegex.test(email);\n\t}\n\n\t_showError(elementId, message) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = message;\n\t\t\terrorEl.style.display = 'block';\n\t\t}\n\t}\n\n\t_clearError(elementId) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = '';\n\t\t\terrorEl.style.display = 'none';\n\t\t}\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst nameInput = this.element.querySelector('#messenger-prechat-name');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst submitText = submitBtn.querySelector('.messenger-prechat-submit-text');\n\t\tconst submitLoading = submitBtn.querySelector('.messenger-prechat-submit-loading');\n\n\t\tconst name = nameInput.value.trim();\n\t\tconst email = emailInput.value.trim();\n\n\t\t// Show loading state\n\t\tthis._isSubmitting = true;\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitText.style.display = 'none';\n\t\tsubmitLoading.style.display = 'inline-flex';\n\n\t\ttry {\n\t\t\t// First, identify the contact with collected info\n\t\t\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({ name, email });\n\t\t\t}\n\n\t\t\t// Update state with user info\n\t\t\tif (!this.state.userContext) {\n\t\t\t\tthis.state.userContext = {};\n\t\t\t}\n\t\t\tthis.state.userContext.name = name;\n\t\t\tthis.state.userContext.email = email;\n\n\t\t\tthis._isSubmitting = false;\n\n\t\t\t// Go to chat after collecting contact info\n\t\t\tthis.state.setView('chat');\n\t\t} catch (error) {\n\t\t\tconsole.error('[PreChatFormView] Error submitting form:', error);\n\t\t\tthis._showError('messenger-email-error', 'Something went wrong. Please try again.');\n\n\t\t\t// Reset button state\n\t\t\tthis._isSubmitting = false;\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitText.style.display = 'inline';\n\t\t\tsubmitLoading.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","/**\n * WebSocketService - Real-time communication for messenger widget\n */\n\nexport class WebSocketService {\n\tconstructor(config = {}) {\n\t\tthis.baseURL = config.baseURL || '';\n\t\tthis.workspace = config.workspace || '';\n\t\tthis.sessionToken = config.sessionToken || null;\n\t\tthis.mock = config.mock || false;\n\n\t\tthis.ws = null;\n\t\tthis.reconnectAttempts = 0;\n\t\tthis.maxReconnectAttempts = 5;\n\t\tthis.reconnectDelay = 1000;\n\t\tthis.pingInterval = null;\n\t\tthis.isConnected = false;\n\n\t\t// Event listeners\n\t\tthis._listeners = new Map();\n\n\t\t// Bind methods\n\t\tthis._onOpen = this._onOpen.bind(this);\n\t\tthis._onMessage = this._onMessage.bind(this);\n\t\tthis._onClose = this._onClose.bind(this);\n\t\tthis._onError = this._onError.bind(this);\n\t}\n\n\t/**\n\t * Connect to WebSocket server\n\t */\n\tconnect(sessionToken = null) {\n\t\tif (sessionToken) {\n\t\t\tthis.sessionToken = sessionToken;\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.warn('[WebSocket] No session token provided');\n\t\t\treturn;\n\t\t}\n\n\t\t// Mock mode - simulate connection\n\t\tif (this.mock) {\n\t\t\tthis.isConnected = true;\n\t\t\tthis._emit('connected', {});\n\t\t\tthis._startMockResponses();\n\t\t\treturn;\n\t\t}\n\n\t\t// Build WebSocket URL\n\t\tconst wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n\t\tlet wsURL = this.baseURL.replace(/^https?:/, wsProtocol);\n\t\twsURL = wsURL.replace('/api/v1', '');\n\t\twsURL = `${wsURL}/api/v1/widget/messenger/ws?token=${encodeURIComponent(this.sessionToken)}`;\n\n\t\ttry {\n\t\t\tthis.ws = new WebSocket(wsURL);\n\t\t\tthis.ws.onopen = this._onOpen;\n\t\t\tthis.ws.onmessage = this._onMessage;\n\t\t\tthis.ws.onclose = this._onClose;\n\t\t\tthis.ws.onerror = this._onError;\n\t\t} catch (error) {\n\t\t\tconsole.error('[WebSocket] Connection error:', error);\n\t\t\tthis._scheduleReconnect();\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from WebSocket server\n\t */\n\tdisconnect() {\n\t\tthis.isConnected = false;\n\t\tthis.reconnectAttempts = this.maxReconnectAttempts; // Prevent reconnection\n\n\t\tif (this.pingInterval) {\n\t\t\tclearInterval(this.pingInterval);\n\t\t\tthis.pingInterval = null;\n\t\t}\n\n\t\tif (this.ws) {\n\t\t\tthis.ws.close();\n\t\t\tthis.ws = null;\n\t\t}\n\n\t\tif (this._mockInterval) {\n\t\t\tclearInterval(this._mockInterval);\n\t\t\tthis._mockInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to events\n\t * @param {string} event - Event name\n\t * @param {Function} callback - Event handler\n\t * @returns {Function} Unsubscribe function\n\t */\n\ton(event, callback) {\n\t\tif (!this._listeners.has(event)) {\n\t\t\tthis._listeners.set(event, new Set());\n\t\t}\n\t\tthis._listeners.get(event).add(callback);\n\t\treturn () => this._listeners.get(event).delete(callback);\n\t}\n\n\t/**\n\t * Remove event listener\n\t */\n\toff(event, callback) {\n\t\tif (this._listeners.has(event)) {\n\t\t\tthis._listeners.get(event).delete(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Send message through WebSocket\n\t */\n\tsend(type, payload = {}) {\n\t\tif (!this.isConnected) {\n\t\t\tconsole.warn('[WebSocket] Not connected, cannot send message');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\t// Mock mode - just log\n\t\t\tconsole.log('[WebSocket Mock] Sending:', type, payload);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.ws && this.ws.readyState === WebSocket.OPEN) {\n\t\t\tthis.ws.send(JSON.stringify({ type, payload }));\n\t\t}\n\t}\n\n\t// Private methods\n\n\t_onOpen() {\n\t\tconsole.log('[WebSocket] Connected');\n\t\tthis.isConnected = true;\n\t\tthis.reconnectAttempts = 0;\n\t\tthis._emit('connected', {});\n\n\t\t// Start ping interval to keep connection alive\n\t\tthis.pingInterval = setInterval(() => {\n\t\t\tthis.send('ping', {});\n\t\t}, 30000);\n\t}\n\n\t_onMessage(event) {\n\t\ttry {\n\t\t\tconst data = JSON.parse(event.data);\n\t\t\tconst { type, payload } = data;\n\n\t\t\t// Handle different event types\n\t\t\tswitch (type) {\n\t\t\t\tcase 'message:new':\n\t\t\t\t\tthis._emit('message', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'typing:started':\n\t\t\t\t\tthis._emit('typing_started', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'typing:stopped':\n\t\t\t\t\tthis._emit('typing_stopped', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'conversation:updated':\n\t\t\t\t\tthis._emit('conversation_updated', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'conversation:closed':\n\t\t\t\t\tthis._emit('conversation_closed', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'availability:changed':\n\t\t\t\t\tthis._emit('availability_changed', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'pong':\n\t\t\t\t\t// Ping response, ignore\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.log('[WebSocket] Unknown event:', type, payload);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[WebSocket] Failed to parse message:', error);\n\t\t}\n\t}\n\n\t_onClose(event) {\n\t\tconsole.log('[WebSocket] Disconnected:', event.code, event.reason);\n\t\tthis.isConnected = false;\n\n\t\tif (this.pingInterval) {\n\t\t\tclearInterval(this.pingInterval);\n\t\t\tthis.pingInterval = null;\n\t\t}\n\n\t\tthis._emit('disconnected', { code: event.code, reason: event.reason });\n\t\tthis._scheduleReconnect();\n\t}\n\n\t_onError(error) {\n\t\tconsole.error('[WebSocket] Error:', error);\n\t\tthis._emit('error', { error });\n\t}\n\n\t_scheduleReconnect() {\n\t\tif (this.reconnectAttempts >= this.maxReconnectAttempts) {\n\t\t\tconsole.log('[WebSocket] Max reconnect attempts reached');\n\t\t\tthis._emit('reconnect_failed', {});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reconnectAttempts++;\n\t\tconst delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\t\tconsole.log(\n\t\t\t`[WebSocket] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`\n\t\t);\n\n\t\tsetTimeout(() => {\n\t\t\tthis.connect();\n\t\t}, delay);\n\t}\n\n\t_emit(event, data) {\n\t\tif (this._listeners.has(event)) {\n\t\t\tthis._listeners.get(event).forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`[WebSocket] Error in ${event} handler:`, error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Mock support for development\n\t_startMockResponses() {\n\t\t// Simulate agent typing and responses\n\t\tthis._mockInterval = setInterval(() => {\n\t\t\t// Randomly emit typing or message events for demo\n\t\t\tconst random = Math.random();\n\t\t\tif (random < 0.1) {\n\t\t\t\tthis._emit('typing_started', {\n\t\t\t\t\tconversation_id: 'conv_1',\n\t\t\t\t\tuser_id: 'agent_1',\n\t\t\t\t\tuser_name: 'Sarah',\n\t\t\t\t\tis_agent: true,\n\t\t\t\t});\n\n\t\t\t\t// Stop typing after 2 seconds\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._emit('typing_stopped', {\n\t\t\t\t\t\tconversation_id: 'conv_1',\n\t\t\t\t\t\tuser_id: 'agent_1',\n\t\t\t\t\t});\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t}, 10000);\n\t}\n\n\t/**\n\t * Simulate receiving a message (for mock mode)\n\t */\n\tsimulateMessage(conversationId, message) {\n\t\tif (this.mock) {\n\t\t\tthis._emit('message', {\n\t\t\t\tconversation_id: conversationId,\n\t\t\t\tmessage: {\n\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\tcontent: message.content,\n\t\t\t\t\tsender_type: message.sender_type || 'agent',\n\t\t\t\t\tsender_name: message.sender_name || 'Support',\n\t\t\t\t\tsender_avatar: message.sender_avatar || null,\n\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n}\n","\nimport { BaseWidget } from './BaseWidget.js';\nimport { MessengerState } from './messenger/MessengerState.js';\nimport { MessengerLauncher } from './messenger/components/MessengerLauncher.js';\nimport { MessengerPanel } from './messenger/components/MessengerPanel.js';\nimport { ChangelogView } from './messenger/views/ChangelogView.js';\nimport { ChatView } from './messenger/views/ChatView.js';\nimport { ConversationsView } from './messenger/views/ConversationsView.js';\nimport { HelpView } from './messenger/views/HelpView.js';\nimport { HomeView } from './messenger/views/HomeView.js';\nimport { PreChatFormView } from './messenger/views/PreChatFormView.js';\nimport { WebSocketService } from '../core/WebSocketService.js';\n\nexport class MessengerWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'messenger' });\n\n\t\tthis.messengerOptions = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || 'light',\n\t\t\tteamName: options.teamName || 'Support',\n\t\t\tteamAvatars: options.teamAvatars || [],\n\t\t\twelcomeMessage: options.welcomeMessage || 'How can we help?',\n\t\t\tenableHelp: options.enableHelp !== false,\n\t\t\tenableChangelog: options.enableChangelog !== false,\n\t\t\tlogoUrl: options.logoUrl || 'https://product7.io/p7logo.svg',\n\t\t\tfeaturedContent: options.featuredContent || null,\n\t\t\tprimaryColor: options.primaryColor || '#1c1c1e',\n\t\t\tonSendMessage: options.onSendMessage || null,\n\t\t\tonArticleClick: options.onArticleClick || null,\n\t\t\tonChangelogClick: options.onChangelogClick || null,\n\t\t};\n\n\t\tthis.messengerState = new MessengerState({\n\t\t\tteamName: this.messengerOptions.teamName,\n\t\t\tteamAvatars: this.messengerOptions.teamAvatars,\n\t\t\twelcomeMessage: this.messengerOptions.welcomeMessage,\n\t\t\tenableHelp: this.messengerOptions.enableHelp,\n\t\t\tenableChangelog: this.messengerOptions.enableChangelog,\n\t\t\tuserContext: this.sdk?.apiService?.getUserContext() || null,\n\t\t});\n\n\t\tthis.launcher = null;\n\t\tthis.panel = null;\n\t\tthis.wsService = null;\n\t\tthis._wsUnsubscribers = [];\n\n\t\tthis._handleOpenChange = this._handleOpenChange.bind(this);\n\t\tthis._handleWebSocketMessage = this._handleWebSocketMessage.bind(this);\n\t\tthis._handleTypingStarted = this._handleTypingStarted.bind(this);\n\t\tthis._handleTypingStopped = this._handleTypingStopped.bind(this);\n\t\tthis._handleConversationClosed = this._handleConversationClosed.bind(this);\n\t}\n\n\t_render() {\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = `messenger-widget theme-${this.messengerOptions.theme}`;\n\t\tcontainer.style.zIndex = '999999';\n\n\t\tthis.launcher = new MessengerLauncher(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t});\n\t\tcontainer.appendChild(this.launcher.render());\n\n\t\tthis.panel = new MessengerPanel(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\ttheme: this.messengerOptions.theme,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\tlogoUrl: this.messengerOptions.logoUrl,\n\t\t\tfeaturedContent: this.messengerOptions.featuredContent,\n\t\t\tonSendMessage:\n\t\t\t\tthis.messengerOptions.onSendMessage ||\n\t\t\t\tthis._handleSendMessage.bind(this),\n\t\t\tonStartConversation: this._handleStartConversation.bind(this),\n\t\t\tonTyping: this.sendTypingIndicator.bind(this),\n\t\t\tonSelectConversation: this._handleSelectConversation.bind(this),\n\t\t\tonStartNewConversation: this._handleNewConversationClick.bind(this),\n\t\t\tonIdentifyContact: this._handleIdentifyContact.bind(this),\n\t\t\tonArticleClick: this.messengerOptions.onArticleClick,\n\t\t\tonChangelogClick: this.messengerOptions.onChangelogClick,\n\t\t});\n\n\t\tthis.panel.registerView('home', HomeView);\n\t\tthis.panel.registerView('messages', ConversationsView);\n\t\tthis.panel.registerView('chat', ChatView);\n\t\tthis.panel.registerView('prechat', PreChatFormView);\n\t\tthis.panel.registerView('help', HelpView);\n\t\tthis.panel.registerView('changelog', ChangelogView);\n\n\t\tcontainer.appendChild(this.panel.render());\n\t\tthis.panel.hide();\n\n\t\treturn container;\n\t}\n\n\t_attachEvents() {\n\t\tthis._stateUnsubscribe = this.messengerState.subscribe((type, data) => {\n\t\t\tif (type === 'openChange') {\n\t\t\t\tthis._handleOpenChange(data.isOpen);\n\t\t\t}\n\t\t\tif (type === 'conversationChange') {\n\t\t\t\tthis._handleActiveConversationChange(\n\t\t\t\t\tdata.conversationId,\n\t\t\t\t\tdata.previousConversationId\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\t_handleOpenChange(isOpen) {\n\t\tif (isOpen) {\n\t\t\tthis.panel.show();\n\t\t\tthis.sdk.eventBus.emit('messenger:opened', { widget: this });\n\t\t} else {\n\t\t\tthis.panel.hide();\n\t\t\tthis.messengerState.reset();\n\t\t\tthis.sdk.eventBus.emit('messenger:closed', { widget: this });\n\t\t}\n\t}\n\n\t_handleActiveConversationChange(conversationId, previousConversationId) {\n\t\tif (previousConversationId && this.wsService) {\n\t\t\tthis.wsService.send('conversation:unsubscribe', {\n\t\t\t\tconversation_id: previousConversationId,\n\t\t\t});\n\t\t}\n\t\tif (conversationId && this.wsService) {\n\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\tconversation_id: conversationId,\n\t\t\t});\n\t\t}\n\t}\n\nasync _handleStartConversation(messageContent, pendingAttachments) {\n\ttry {\n\t\tconst userContext = this.messengerState.userContext;\n\t\tconst isAuthenticated = userContext?.email && userContext?.name;\n\n\t\t// If user is authenticated, silently identify them first\n\t\tif (isAuthenticated) {\n\t\t\ttry {\n\t\t\t\tawait this.apiService.identifyContact({\n\t\t\t\t\tname: userContext.name,\n\t\t\t\t\temail: userContext.email,\n\t\t\t\t});\n\t\t\t\tconsole.log('[MessengerWidget] User auto-identified for conversation');\n\t\t\t} catch (error) {\n\t\t\t\t// If identification fails with a non-critical error, continue anyway\n\t\t\t\tif (error?.code !== 'ALREADY_IDENTIFIED') {\n\t\t\t\t\tconsole.warn('[MessengerWidget] Auto-identification failed:', error);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Unauthenticated user - show pre-chat form\n\t\t\tthis.messengerState.pendingMessage = {\n\t\t\t\tcontent: messageContent,\n\t\t\t\tattachments: pendingAttachments,\n\t\t\t};\n\t\t\tthis.messengerState.setView('prechat');\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check for existing open conversation\n\t\tconst openConversation = this.messengerState.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.messengerState.setActiveConversation(openConversation.id);\n\t\t\tawait this._handleSendMessage(\n\t\t\t\topenConversation.id,\n\t\t\t\t{ content: messageContent },\n\t\t\t\tpendingAttachments\n\t\t\t);\n\t\t\treturn openConversation;\n\t\t}\n\n\t\treturn await this.startNewConversation(\n\t\t\tmessageContent,\n\t\t\t'',\n\t\t\tpendingAttachments\n\t\t);\n\t} catch (error) {\n\t\tconsole.error('[MessengerWidget] Failed to start conversation:', error);\n\t\treturn null;\n\t}\n}\n\n\tasync _handleSelectConversation(conversationId) {\n\t\ttry {\n\t\t\tawait this.fetchMessages(conversationId);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch messages:', error);\n\t\t}\n\t}\n\n\t_handleNewConversationClick() {\n\t\tconst openConversation = this.messengerState.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.messengerState.setActiveConversation(openConversation.id);\n\t\t\tthis.messengerState.setView('chat');\n\t\t\tthis._handleSelectConversation(openConversation.id);\n\t\t} else {\n\t\t\tthis.messengerState.setActiveConversation(null);\n\t\t\tthis.messengerState.setView('chat');\n\t\t}\n\t}\n\n\tasync _handleIdentifyContact(contactData) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.identifyContact({\n\t\t\t\tname: contactData.name,\n\t\t\t\temail: contactData.email,\n\t\t\t});\n\n\t\t\tif (response.status) {\n\t\t\t\tconsole.log('[MessengerWidget] Contact identified:', contactData.email);\n\n\t\t\t\tif (!this.messengerState.userContext) {\n\t\t\t\t\tthis.messengerState.userContext = {};\n\t\t\t\t}\n\t\t\t\tthis.messengerState.userContext.name = contactData.name;\n\t\t\t\tthis.messengerState.userContext.email = contactData.email;\n\n\t\t\t\tconst pendingMessage = this.messengerState.pendingMessage;\n\t\t\t\tif (pendingMessage) {\n\t\t\t\t\tthis.messengerState.pendingMessage = null;\n\n\t\t\t\t\tawait this.startNewConversation(\n\t\t\t\t\t\tpendingMessage.content,\n\t\t\t\t\t\t'',\n\t\t\t\t\t\tpendingMessage.attachments\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.messengerState.setView('chat');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to identify contact:', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync _handleUploadFile(base64Data, filename) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.uploadFile(base64Data, filename);\n\t\t\tif (response.status && response.url) {\n\t\t\t\treturn response.url;\n\t\t\t}\n\t\t\tthrow new Error('Upload failed');\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to upload file:', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync _uploadPendingAttachments(pendingAttachments) {\n\t\tif (!pendingAttachments || pendingAttachments.length === 0) return [];\n\n\t\tconst uploaded = [];\n\t\tfor (const att of pendingAttachments) {\n\t\t\ttry {\n\t\t\t\tconst cdnUrl = await this._handleUploadFile(att.preview, att.file.name);\n\t\t\t\tuploaded.push({\n\t\t\t\t\turl: cdnUrl,\n\t\t\t\t\ttype: att.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: att.file.name,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[MessengerWidget] Skipping failed attachment upload:',\n\t\t\t\t\tatt.file.name,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn uploaded;\n\t}\n\n\tasync _handleSendMessage(conversationId, message, pendingAttachments) {\n\t\tthis.sdk.eventBus.emit('messenger:messageSent', {\n\t\t\twidget: this,\n\t\t\tconversationId,\n\t\t\tmessage,\n\t\t});\n\n\t\ttry {\n\t\t\tconst uploadedAttachments =\n\t\t\t\tawait this._uploadPendingAttachments(pendingAttachments);\n\n\t\t\tconst response = await this.apiService.sendMessage(conversationId, {\n\t\t\t\tcontent: message.content,\n\t\t\t\tattachments: uploadedAttachments,\n\t\t\t});\n\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconsole.log('[MessengerWidget] Message sent:', response.data.id);\n\t\t\t}\n\n\t\t\tif (this.apiService?.mock) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst mockResponse = {\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: \"Thanks for your message! We'll get back to you soon.\",\n\t\t\t\t\t\tisOwn: false,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\tsender: {\n\t\t\t\t\t\t\tname: 'Support Team',\n\t\t\t\t\t\t\tavatarUrl: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tthis.messengerState.addMessage(conversationId, mockResponse);\n\t\t\t\t}, 1500);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to send message:', error);\n\t\t}\n\t}\n\n\t_handleWebSocketMessage(data) {\n\t\tconst { conversation_id, message } = data;\n\n\t\tlet attachments = [];\n\t\tif (message.attachments) {\n\t\t\ttry {\n\t\t\t\tattachments =\n\t\t\t\t\ttypeof message.attachments === 'string'\n\t\t\t\t\t\t? JSON.parse(message.attachments)\n\t\t\t\t\t\t: message.attachments;\n\t\t\t} catch (e) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\n\t\tconst localMessage = {\n\t\t\tid: message.id,\n\t\t\tcontent: message.content,\n\t\t\tisOwn: message.sender_type === 'customer',\n\t\t\ttimestamp: message.created_at,\n\t\t\tattachments: attachments.length > 0 ? attachments : undefined,\n\t\t\tsender: {\n\t\t\t\tname: message.sender_name || 'Support',\n\t\t\t\tavatarUrl: message.sender_avatar || null,\n\t\t\t},\n\t\t};\n\n\t\tthis.messengerState.addMessage(conversation_id, localMessage);\n\n\t\tif (\n\t\t\t!this.messengerState.isOpen ||\n\t\t\tthis.messengerState.activeConversationId !== conversation_id\n\t\t) {\n\t\t\tthis._updateUnreadCount();\n\t\t}\n\t}\n\n\t_handleTypingStarted(data) {\n\t\tif (data.is_agent) {\n\t\t\tthis.messengerState._notify('typingStarted', {\n\t\t\t\tconversationId: data.conversation_id,\n\t\t\t\tuserName: data.user_name,\n\t\t\t});\n\t\t}\n\t}\n\n\t_handleTypingStopped(data) {\n\t\tthis.messengerState._notify('typingStopped', {\n\t\t\tconversationId: data.conversation_id,\n\t\t});\n\t}\n\n\t_handleConversationClosed(data) {\n\t\tconst conversationId =\n\t\t\tdata?.conversation_id || data?.id || data?.conversation?.id;\n\t\tif (!conversationId) return;\n\n\t\tthis.messengerState.updateConversation(conversationId, { status: 'closed' });\n\t}\n\n\tasync _updateUnreadCount() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getUnreadCount();\n\t\t\tif (response.status && response.data) {\n\t\t\t\tthis.messengerState.unreadCount = response.data.unread_count || 0;\n\t\t\t\tthis.messengerState._notify('unreadCountChange', {\n\t\t\t\t\tcount: this.messengerState.unreadCount,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to get unread count:', error);\n\t\t}\n\t}\n\n\t_initWebSocket() {\n\t\tif (this.wsService) {\n\t\t\tthis.wsService.disconnect();\n\t\t}\n\n\t\tthis.wsService = new WebSocketService({\n\t\t\tbaseURL: this.apiService.baseURL,\n\t\t\tworkspace: this.apiService.workspace,\n\t\t\tsessionToken: this.apiService.sessionToken,\n\t\t\tmock: this.apiService.mock,\n\t\t});\n\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('message', this._handleWebSocketMessage)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('typing_started', this._handleTypingStarted)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('typing_stopped', this._handleTypingStopped)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('conversation_closed', this._handleConversationClosed)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('connected', () => {\n\t\t\t\tconsole.log('[MessengerWidget] WebSocket connected');\n\t\t\t\tif (this.messengerState.activeConversationId) {\n\t\t\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\t\t\tconversation_id: this.messengerState.activeConversationId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('disconnected', () => {\n\t\t\t\tconsole.log('[MessengerWidget] WebSocket disconnected');\n\t\t\t})\n\t\t);\n\n\t\tthis.wsService.connect();\n\t}\n\n\topen() {\n\t\tthis.messengerState.setOpen(true);\n\t}\n\n\tclose() {\n\t\tthis.messengerState.setOpen(false);\n\t}\n\n\ttoggle() {\n\t\tthis.messengerState.setOpen(!this.messengerState.isOpen);\n\t}\n\n\tnavigateTo(view) {\n\t\tthis.messengerState.setView(view);\n\t\tif (!this.messengerState.isOpen) {\n\t\t\tthis.open();\n\t\t}\n\t}\n\n\tsetConversations(conversations) {\n\t\tthis.messengerState.setConversations(conversations);\n\t}\n\n\taddMessage(conversationId, message) {\n\t\tthis.messengerState.addMessage(conversationId, message);\n\t}\n\n\tsetHelpArticles(articles) {\n\t\tthis.messengerState.setHelpArticles(articles);\n\t}\n\n\tsetHomeChangelogItems(items) {\n\t\tthis.messengerState.setHomeChangelogItems(items);\n\t}\n\n\tsetChangelogItems(items) {\n\t\tthis.messengerState.setChangelogItems(items);\n\t}\n\n\tsetUnreadCount(count) {\n\t\tthis.messengerState.unreadCount = count;\n\t\tthis.messengerState._notify('unreadCountChange', { count });\n\t}\n\n\tgetState() {\n\t\treturn {\n\t\t\tisOpen: this.messengerState.isOpen,\n\t\t\tcurrentView: this.messengerState.currentView,\n\t\t\tunreadCount: this.messengerState.unreadCount,\n\t\t\tconversations: this.messengerState.conversations,\n\t\t};\n\t}\n\n\tasync loadInitialData() {\n\t\ttry {\n\t\t\tconst conversations = await this._fetchConversations();\n\t\t\tthis.messengerState.setConversations(conversations);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to load conversations:', error);\n\t\t}\n\n\t\tif (this.messengerOptions.enableHelp) {\n\t\t\ttry {\n\t\t\t\tconst articles = await this._fetchHelpArticles();\n\t\t\t\tthis.messengerState.setHelpArticles(articles);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[MessengerWidget] Failed to load help articles:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.messengerOptions.enableChangelog) {\n\t\t\ttry {\n\t\t\t\tconst { homeItems, changelogItems } = await this._fetchChangelog();\n\t\t\t\tthis.messengerState.setHomeChangelogItems(homeItems);\n\t\t\t\tthis.messengerState.setChangelogItems(changelogItems);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[MessengerWidget] Failed to load changelog:', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync _fetchConversations() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getConversations();\n\t\t\tif (response.status && response.data) {\n\t\t\t\treturn response.data.map((conv) => ({\n\t\t\t\t\tid: conv.id,\n\t\t\t\t\ttitle:\n\t\t\t\t\t\tconv.subject ||\n\t\t\t\t\t\t`Chat with ${conv.assigned_user?.name || 'Support'}`,\n\t\t\t\t\tparticipants: conv.assigned_user\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: conv.assigned_user.name,\n\t\t\t\t\t\t\t\t\tavatarUrl: conv.assigned_user.avatar,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [{ name: 'Support', avatarUrl: null }],\n\t\t\t\t\tlastMessage: conv.preview || conv.snippet || '',\n\t\t\t\t\tlastMessageTime: conv.last_message_at,\n\t\t\t\t\tunread: conv.unread || 0,\n\t\t\t\t\tstatus: conv.status,\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch conversations:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync _fetchHelpArticles() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getHelpCollections();\n\t\t\tif (response.status && response.data) {\n\t\t\t\treturn response.data.map((collection) => ({\n\t\t\t\t\tid: collection.id,\n\t\t\t\t\ttitle: collection.title || collection.name,\n\t\t\t\t\tdescription: collection.description || '',\n\t\t\t\t\tarticleCount:\n\t\t\t\t\t\tcollection.article_count || collection.articleCount || 0,\n\t\t\t\t\ticon: collection.icon || 'ph-book-open',\n\t\t\t\t\turl: collection.url || `#/help/${collection.slug || collection.id}`,\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch help articles:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync fetchMessages(conversationId) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getConversation(conversationId);\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconst messages = (response.data.messages || []).map((msg) => {\n\t\t\t\t\tlet attachments;\n\t\t\t\t\tif (msg.attachments) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tattachments =\n\t\t\t\t\t\t\t\ttypeof msg.attachments === 'string'\n\t\t\t\t\t\t\t\t\t? JSON.parse(msg.attachments)\n\t\t\t\t\t\t\t\t\t: msg.attachments;\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: msg.id,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t\tisOwn: msg.sender_type === 'customer',\n\t\t\t\t\t\ttimestamp: msg.created_at,\n\t\t\t\t\t\tattachments:\n\t\t\t\t\t\t\tattachments && attachments.length > 0 ? attachments : undefined,\n\t\t\t\t\t\tsender: {\n\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\tmsg.sender_name ||\n\t\t\t\t\t\t\t\t(msg.sender_type === 'customer' ? 'You' : 'Support'),\n\t\t\t\t\t\t\tavatarUrl: msg.sender_avatar || null,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tthis.messengerState.setMessages(conversationId, messages);\n\n\t\t\t\tawait this.apiService.markConversationAsRead(conversationId);\n\t\t\t\tthis.messengerState.markAsRead(conversationId);\n\n\t\t\t\treturn messages;\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch messages:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync startNewConversation(message, subject = '', pendingAttachments = []) {\n\t\ttry {\n\t\t\tconst uploadedAttachments =\n\t\t\t\tawait this._uploadPendingAttachments(pendingAttachments);\n\n\t\t\tconsole.log('[MessengerWidget] Starting conversation...', {\n\t\t\t\tmessage,\n\t\t\t\tattachmentCount: uploadedAttachments.length,\n\t\t\t\thasSession: this.apiService.isSessionValid(),\n\t\t\t\tsessionToken: this.apiService.sessionToken\n\t\t\t\t\t? this.apiService.sessionToken.substring(0, 10) + '...'\n\t\t\t\t\t: null,\n\t\t\t\tbaseURL: this.apiService.baseURL,\n\t\t\t\tmock: this.apiService.mock,\n\t\t\t});\n\n\t\t\tconst response = await this.apiService.startConversation({\n\t\t\t\tmessage,\n\t\t\t\tsubject,\n\t\t\t\tattachments: uploadedAttachments,\n\t\t\t});\n\n\t\t\tconsole.log('[MessengerWidget] Conversation response:', response);\n\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconst conv = response.data;\n\t\t\t\tconst newConversation = {\n\t\t\t\t\tid: conv.id,\n\t\t\t\t\ttitle: conv.subject || 'New conversation',\n\t\t\t\t\tparticipants: [{ name: 'Support', avatarUrl: null }],\n\t\t\t\t\tlastMessage: message,\n\t\t\t\t\tlastMessageTime: conv.created_at || new Date().toISOString(),\n\t\t\t\t\tunread: 0,\n\t\t\t\t\tstatus: 'open',\n\t\t\t\t};\n\n\t\t\t\tthis.messengerState.addConversation(newConversation);\n\n\t\t\t\tthis.messengerState.setMessages(conv.id, [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: message,\n\t\t\t\t\t\tisOwn: true,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\tthis.messengerState.setActiveConversation(conv.id);\n\t\t\t\tthis.messengerState.setView('chat');\n\n\t\t\t\treturn conv;\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to start conversation:', error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\ttry {\n\t\t\tawait this.apiService.sendTypingIndicator(conversationId, isTyping);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\tasync checkAgentAvailability() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.checkAgentsOnline();\n\t\t\tif (response.status && response.data) {\n\t\t\t\tthis.messengerState.agentsOnline = response.data.agents_online;\n\t\t\t\tthis.messengerState.onlineCount = response.data.online_count || 0;\n\t\t\t\tthis.messengerState.responseTime = response.data.response_time || '';\n\n\t\t\t\tif (response.data.available_agents) {\n\t\t\t\t\tthis.messengerState.setTeamAvatarsFromAgents(\n\t\t\t\t\t\tresponse.data.available_agents\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.messengerState._notify('availabilityUpdate', response.data);\n\t\t\t\treturn response.data;\n\t\t\t}\n\t\t\treturn { agents_online: false, online_count: 0 };\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to check availability:', error);\n\t\t\treturn { agents_online: false, online_count: 0 };\n\t\t}\n\t}\n\n\tasync _fetchChangelog() {\n\t\tif (this.apiService?.mock) {\n\t\t\treturn {\n\t\t\t\thomeItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_5',\n\t\t\t\t\t\ttitle: 'New integrations available',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Connect with more tools you love and streamline your workflow.',\n\t\t\t\t\t\ttags: ['Integration'],\n\t\t\t\t\t\tcoverImage: 'https://feedback-sdk.product7.io/700x400__5_.png',\n\t\t\t\t\t\tcoverText: null,\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 14 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_2',\n\t\t\t\t\t\ttitle: 'A new era of Insights has arrived',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'We announced Fin Insights, a groundbreaking, AI-powered product that gives you complete visibility into every customer conversation.',\n\t\t\t\t\t\ttags: ['New feature', 'AI'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://feedback-sdk.product7.io/Intercom_Messenger__1_.jpg',\n\t\t\t\t\t\tcoverText: 'Watch our major product launch on-demand',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 5 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_1',\n\t\t\t\t\t\ttitle: 'The 2025 Customer Service Transformation Report',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Learn how AI has transformed customer service from the ground up—rewriting its economics and reshaping expectations.',\n\t\t\t\t\t\ttags: ['Report'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://feedback-sdk.product7.io/Main_Report_Email_Header.png',\n\t\t\t\t\t\tcoverText: 'Customer service trends as we know them are dead.',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 2 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tchangelogItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_4',\n\t\t\t\t\t\ttitle: 'Enhanced conversation analytics',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Get deeper insights into your customer conversations with our new analytics dashboard.',\n\t\t\t\t\t\ttags: ['Analytics'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://feedback-sdk.product7.io/cgangelog-Frame%202087334450.jpg',\n\t\t\t\t\t\tcoverText: null,\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 10 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_3',\n\t\t\t\t\t\ttitle: 'Escalation guidance for complex issues',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'New AI-powered escalation guidance helps your team handle complex customer issues more effectively.',\n\t\t\t\t\t\ttags: ['New feature', 'AI'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://feedback-sdk.product7.io/cgangelog-image-escalation-guidance-event@2x.png',\n\t\t\t\t\t\tcoverText: null,\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 7 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\tconst response = await this.apiService.getChangelogs({ limit: 20 });\n\t\tconst changelogs = response.data || [];\n\n\t\tconst mappedItems = changelogs.map((item) => ({\n\t\t\tid: item.id,\n\t\t\ttitle: item.title,\n\t\t\tdescription: item.excerpt || item.description || '',\n\t\t\ttags: item.labels ? item.labels.map((label) => label.name) : [],\n\t\t\tcoverImage: item.cover_image || null,\n\t\t\tcoverText: null,\n\t\t\tpublishedAt: item.published_at,\n\t\t\turl: item.slug ? `/changelog/${item.slug}` : '#',\n\t\t}));\n\n\t\treturn {\n\t\t\thomeItems: mappedItems.slice(0, 3),\n\t\t\tchangelogItems: mappedItems,\n\t\t};\n\t}\n\nasync onMount() {\n\tthis.loadInitialData();\n\n\tif (this.apiService?.sessionToken) {\n\t\tthis._initWebSocket();\n\t}\n\n\tthis.checkAgentAvailability();\n\n\tthis._availabilityInterval = setInterval(() => {\n\t\tthis.checkAgentAvailability();\n\t}, 60000);\n}\n\n\tonDestroy() {\n\t\tif (this._stateUnsubscribe) {\n\t\t\tthis._stateUnsubscribe();\n\t\t}\n\n\t\tif (this.wsService) {\n\t\t\tthis.wsService.disconnect();\n\t\t}\n\n\t\tthis._wsUnsubscribers.forEach((unsub) => unsub());\n\t\tthis._wsUnsubscribers = [];\n\n\t\tif (this._availabilityInterval) {\n\t\t\tclearInterval(this._availabilityInterval);\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.launcher) {\n\t\t\tthis.launcher.destroy();\n\t\t}\n\t\tif (this.panel) {\n\t\t\tthis.panel.destroy();\n\t\t}\n\t\tthis.onDestroy();\n\t\tsuper.destroy();\n\t}\n}","import { BaseWidget } from './BaseWidget.js';\n\nexport class SurveyWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'survey' });\n\n\t\tthis.surveyOptions = {\n\t\t\tsurveyId: options.surveyId || null, // Backend survey ID for API calls\n\t\t\tsurveyType: options.surveyType || 'nps', // 'nps', 'csat', 'ces', 'custom'\n\t\t\tposition: options.position || 'bottom-right', // 'bottom-right', 'bottom-left', 'center', 'bottom'\n\t\t\ttitle: options.title || null,\n\t\t\tdescription: options.description || null,\n\t\t\tlowLabel: options.lowLabel || null,\n\t\t\thighLabel: options.highLabel || null,\n\t\t\tcustomQuestions: options.customQuestions || [],\n\t\t\ttheme: options.theme || 'light',\n\t\t\tonSubmit: options.onSubmit || null,\n\t\t\tonDismiss: options.onDismiss || null,\n\t\t};\n\n\t\tthis.surveyState = {\n\t\t\tscore: null,\n\t\t\tfeedback: '',\n\t\t\tcustomAnswers: {},\n\t\t\tisVisible: false,\n\t\t};\n\t}\n\n\t_render() {\n\t\t// Survey widget doesn't render a trigger button, it's shown programmatically\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'feedback-survey-container';\n\t\tcontainer.style.display = 'none';\n\t\treturn container;\n\t}\n\n\t_attachEvents() {\n\t\t// Events are attached when survey is shown\n\t}\n\n\tshow() {\n\t\tthis._renderSurvey();\n\t\tthis.surveyState.isVisible = true;\n\t\tthis.sdk.eventBus.emit('survey:shown', {\n\t\t\twidget: this,\n\t\t\ttype: this.surveyOptions.surveyType,\n\t\t});\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tthis._closeSurvey();\n\t\treturn this;\n\t}\n\n\t_renderSurvey() {\n\t\t// Remove any existing survey\n\t\tthis._closeSurvey();\n\n\t\tconst config = this._getSurveyConfig();\n\t\tconst positionStyles = this._getPositionStyles();\n\t\tconst themeStyles =\n\t\t\tthis.surveyOptions.theme === 'dark'\n\t\t\t\t? 'background: #1a1a1a; color: #fff;'\n\t\t\t\t: 'background: #fff; color: #1d1d1f;';\n\n\t\t// Create backdrop for center position\n\t\tif (this.surveyOptions.position === 'center') {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'feedback-survey-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\t\t\tthis.backdropElement.addEventListener('click', () =>\n\t\t\t\tthis._handleDismiss()\n\t\t\t);\n\t\t}\n\n\t\tthis.surveyElement = document.createElement('div');\n\t\tthis.surveyElement.className = `feedback-survey feedback-survey-${this.surveyOptions.position} theme-${this.surveyOptions.theme}`;\n\t\tthis.surveyElement.style.cssText = `position: fixed; ${positionStyles} z-index: 10000; ${themeStyles} border-radius: 16px; box-shadow: 0 20px 60px rgba(0,0,0,0.3); padding: 24px; min-width: 320px; max-width: 400px; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;`;\n\n\t\tthis.surveyElement.innerHTML = `\n\t\t\t<button class=\"feedback-survey-close\" style=\"position: absolute; top: 12px; right: 12px; background: none; border: none; font-size: 20px; cursor: pointer; color: ${this.surveyOptions.theme === 'dark' ? '#888' : '#86868b'}; line-height: 1;\">×</button>\n\t\t\t<h3 class=\"feedback-survey-title\" style=\"margin: 0 0 8px 0; font-size: 18px; font-weight: 600; padding-right: 24px;\">${config.title}</h3>\n\t\t\t<p class=\"feedback-survey-description\" style=\"color: ${this.surveyOptions.theme === 'dark' ? '#aaa' : '#86868b'}; margin: 0 0 20px 0; font-size: 14px;\">${config.description}</p>\n\t\t\t<div class=\"feedback-survey-content\">${config.html}</div>\n\t\t\t<div class=\"feedback-survey-feedback\" style=\"margin-top: 16px;\">\n\t\t\t\t<textarea class=\"feedback-survey-textarea\" placeholder=\"Any additional feedback? (optional)\" style=\"width: 100%; padding: 12px; border: 1px solid ${this.surveyOptions.theme === 'dark' ? '#333' : '#d2d2d7'}; border-radius: 8px; font-size: 14px; resize: none; height: 80px; background: ${this.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#fff'}; color: ${this.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f'}; font-family: inherit; box-sizing: border-box;\"></textarea>\n\t\t\t</div>\n\t\t\t<button class=\"feedback-survey-submit\" style=\"width: 100%; margin-top: 12px; padding: 12px; background: #007aff; color: white; border: none; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; font-family: inherit;\">Submit</button>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.surveyElement);\n\t\tthis._attachSurveyEvents();\n\n\t\t// Animate in\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.surveyElement.style.opacity = '1';\n\t\t\tthis.surveyElement.style.transform =\n\t\t\t\tthis.surveyOptions.position === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(1)'\n\t\t\t\t\t: 'translateY(0)';\n\t\t});\n\t}\n\n\t_getSurveyConfig() {\n\t\tconst configs = {\n\t\t\tnps: {\n\t\t\t\ttitle:\n\t\t\t\t\tthis.surveyOptions.title || 'How likely are you to recommend us?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'On a scale of 0-10, how likely are you to recommend our product to a friend or colleague?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-nps\" style=\"display: flex; justify-content: space-between; gap: 4px;\">\n\t\t\t\t\t\t${[...Array(11).keys()]\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(n) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-nps-btn\" data-score=\"${n}\" style=\"width: 28px; height: 36px; border: 1px solid ${this.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7'}; border-radius: 6px; background: ${this.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#f8f9fa'}; cursor: pointer; font-size: 12px; color: ${this.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f'}; transition: all 0.15s;\">${n}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style=\"display: flex; justify-content: space-between; margin-top: 8px; font-size: 11px; color: ${this.surveyOptions.theme === 'dark' ? '#888' : '#86868b'};\">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel || 'Not likely'}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel || 'Very likely'}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcsat: {\n\t\t\t\ttitle: this.surveyOptions.title || 'How satisfied are you?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'How would you rate your overall satisfaction with our product?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-csat\" style=\"display: flex; justify-content: center; gap: 16px;\">\n\t\t\t\t\t\t${['😞', '😕', '😐', '🙂', '😄']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(emoji, i) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-csat-btn\" data-score=\"${i + 1}\" style=\"background: none; border: none; cursor: pointer; font-size: 36px; transition: transform 0.15s; padding: 8px;\">${emoji}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style=\"display: flex; justify-content: space-between; margin-top: 8px; font-size: 11px; color: ${this.surveyOptions.theme === 'dark' ? '#888' : '#86868b'};\">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel || 'Very dissatisfied'}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel || 'Very satisfied'}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tces: {\n\t\t\t\ttitle: this.surveyOptions.title || 'How easy was it?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'How easy was it to accomplish your task today?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-ces\" style=\"display: flex; justify-content: space-between; gap: 8px;\">\n\t\t\t\t\t\t${['Very Difficult', 'Difficult', 'Neutral', 'Easy', 'Very Easy']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(label, i) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-ces-btn\" data-score=\"${i + 1}\" style=\"flex: 1; padding: 12px 8px; border: 1px solid ${this.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7'}; border-radius: 8px; background: ${this.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#f8f9fa'}; cursor: pointer; font-size: 11px; color: ${this.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f'}; transition: all 0.15s;\">${label}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcustom: {\n\t\t\t\ttitle: this.surveyOptions.title || 'Quick Feedback',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'Help us improve by answering a few questions.',\n\t\t\t\thtml: this._renderCustomQuestions(),\n\t\t\t},\n\t\t};\n\n\t\treturn configs[this.surveyOptions.surveyType] || configs.nps;\n\t}\n\n\t_renderCustomQuestions() {\n\t\tif (\n\t\t\t!this.surveyOptions.customQuestions ||\n\t\t\tthis.surveyOptions.customQuestions.length === 0\n\t\t) {\n\t\t\t// Default custom questions\n\t\t\treturn `\n\t\t\t\t<div style=\"margin-bottom: 16px;\">\n\t\t\t\t\t<label style=\"display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500;\">What feature do you use most?</label>\n\t\t\t\t\t<select class=\"feedback-survey-select\" data-question=\"feature\" style=\"width: 100%; padding: 10px; border: 1px solid ${this.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7'}; border-radius: 8px; font-size: 14px; background: ${this.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#fff'}; color: ${this.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f'};\">\n\t\t\t\t\t\t<option value=\"\">Select a feature</option>\n\t\t\t\t\t\t<option value=\"feedback\">Feedback Collection</option>\n\t\t\t\t\t\t<option value=\"surveys\">Surveys</option>\n\t\t\t\t\t\t<option value=\"analytics\">Analytics</option>\n\t\t\t\t\t\t<option value=\"integrations\">Integrations</option>\n\t\t\t\t\t</select>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<label style=\"display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500;\">How often do you use it?</label>\n\t\t\t\t\t<div class=\"feedback-survey-frequency\" style=\"display: flex; gap: 8px;\">\n\t\t\t\t\t\t${['Daily', 'Weekly', 'Monthly', 'Rarely']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(freq) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-freq-btn\" data-freq=\"${freq}\" style=\"flex: 1; padding: 10px; border: 1px solid ${this.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7'}; border-radius: 8px; background: ${this.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#f8f9fa'}; cursor: pointer; font-size: 12px; color: ${this.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f'}; transition: all 0.15s;\">${freq}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn this.surveyOptions.customQuestions\n\t\t\t.map(\n\t\t\t\t(q, index) => `\n\t\t\t<div style=\"margin-bottom: 16px;\">\n\t\t\t\t<label style=\"display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500;\">${q.label}</label>\n\t\t\t\t${this._renderQuestionInput(q, index)}\n\t\t\t</div>\n\t\t`\n\t\t\t)\n\t\t\t.join('');\n\t}\n\n\t_renderQuestionInput(question, index) {\n\t\tswitch (question.type) {\n\t\t\tcase 'select':\n\t\t\t\treturn `\n\t\t\t\t\t<select class=\"feedback-survey-select\" data-question=\"${question.id || index}\" style=\"width: 100%; padding: 10px; border: 1px solid ${this.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7'}; border-radius: 8px; font-size: 14px; background: ${this.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#fff'}; color: ${this.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f'};\">\n\t\t\t\t\t\t<option value=\"\">${question.placeholder || 'Select an option'}</option>\n\t\t\t\t\t\t${question.options.map((opt) => `<option value=\"${opt.value}\">${opt.label}</option>`).join('')}\n\t\t\t\t\t</select>\n\t\t\t\t`;\n\t\t\tcase 'text':\n\t\t\t\treturn `\n\t\t\t\t\t<input type=\"text\" class=\"feedback-survey-input\" data-question=\"${question.id || index}\" placeholder=\"${question.placeholder || ''}\" style=\"width: 100%; padding: 10px; border: 1px solid ${this.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7'}; border-radius: 8px; font-size: 14px; background: ${this.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#fff'}; color: ${this.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f'}; box-sizing: border-box;\">\n\t\t\t\t`;\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\n\t_getPositionStyles() {\n\t\tconst positions = {\n\t\t\t'bottom-right':\n\t\t\t\t'bottom: 24px; right: 24px; opacity: 0; transform: translateY(20px); transition: all 0.3s ease;',\n\t\t\t'bottom-left':\n\t\t\t\t'bottom: 24px; left: 24px; opacity: 0; transform: translateY(20px); transition: all 0.3s ease;',\n\t\t\tcenter:\n\t\t\t\t'top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.95); opacity: 0; transition: all 0.3s ease;',\n\t\t\tbottom:\n\t\t\t\t'bottom: 0; left: 0; right: 0; border-radius: 16px 16px 0 0; max-width: none; opacity: 0; transform: translateY(20px); transition: all 0.3s ease;',\n\t\t};\n\t\treturn positions[this.surveyOptions.position] || positions['bottom-right'];\n\t}\n\n\t_attachSurveyEvents() {\n\t\tif (!this.surveyElement) return;\n\n\t\t// Close button\n\t\tconst closeBtn = this.surveyElement.querySelector('.feedback-survey-close');\n\t\tcloseBtn.addEventListener('click', () => this._handleDismiss());\n\n\t\t// Submit button\n\t\tconst submitBtn = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-submit'\n\t\t);\n\t\tsubmitBtn.addEventListener('click', () => this._handleSubmit());\n\n\t\t// Feedback textarea\n\t\tconst textarea = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-textarea'\n\t\t);\n\t\ttextarea.addEventListener('input', (e) => {\n\t\t\tthis.surveyState.feedback = e.target.value;\n\t\t});\n\n\t\t// Survey type specific events\n\t\tthis._attachTypeSpecificEvents();\n\n\t\t// Escape key\n\t\tthis._escapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis._handleDismiss();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', this._escapeHandler);\n\t}\n\n\t_attachTypeSpecificEvents() {\n\t\tconst type = this.surveyOptions.surveyType;\n\n\t\tif (type === 'nps') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectNPS(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t\tbtn.addEventListener('mouseenter', () => {\n\t\t\t\t\t\tif (this.surveyState.score !== parseInt(btn.dataset.score)) {\n\t\t\t\t\t\t\tbtn.style.borderColor = '#007aff';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbtn.addEventListener('mouseleave', () => {\n\t\t\t\t\t\tif (this.surveyState.score !== parseInt(btn.dataset.score)) {\n\t\t\t\t\t\t\tbtn.style.borderColor =\n\t\t\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'csat') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-csat-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectCSAT(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t\tbtn.addEventListener('mouseenter', () => {\n\t\t\t\t\t\tbtn.style.transform = 'scale(1.1)';\n\t\t\t\t\t});\n\t\t\t\t\tbtn.addEventListener('mouseleave', () => {\n\t\t\t\t\t\tif (this.surveyState.score !== parseInt(btn.dataset.score)) {\n\t\t\t\t\t\t\tbtn.style.transform = 'scale(1)';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'ces') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-ces-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectCES(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t\tbtn.addEventListener('mouseenter', () => {\n\t\t\t\t\t\tif (this.surveyState.score !== parseInt(btn.dataset.score)) {\n\t\t\t\t\t\t\tbtn.style.borderColor = '#007aff';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbtn.addEventListener('mouseleave', () => {\n\t\t\t\t\t\tif (this.surveyState.score !== parseInt(btn.dataset.score)) {\n\t\t\t\t\t\t\tbtn.style.borderColor =\n\t\t\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'custom') {\n\t\t\t// Frequency buttons\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-freq-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectFrequency(btn.dataset.freq)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t// Select inputs\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-select')\n\t\t\t\t.forEach((select) => {\n\t\t\t\t\tselect.addEventListener('change', (e) => {\n\t\t\t\t\t\tthis.surveyState.customAnswers[select.dataset.question] =\n\t\t\t\t\t\t\te.target.value;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t// Text inputs\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-input')\n\t\t\t\t.forEach((input) => {\n\t\t\t\t\tinput.addEventListener('input', (e) => {\n\t\t\t\t\t\tthis.surveyState.customAnswers[input.dataset.question] =\n\t\t\t\t\t\t\te.target.value;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t}\n\n\t_selectNPS(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.style.background = '#007aff';\n\t\t\t\t\tbtn.style.borderColor = '#007aff';\n\t\t\t\t\tbtn.style.color = '#fff';\n\t\t\t\t} else {\n\t\t\t\t\tbtn.style.background =\n\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#f8f9fa';\n\t\t\t\t\tbtn.style.borderColor =\n\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7';\n\t\t\t\t\tbtn.style.color =\n\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f';\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectCSAT(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-csat-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tbtn.style.transform = btnScore === score ? 'scale(1.2)' : 'scale(1)';\n\t\t\t});\n\t}\n\n\t_selectCES(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-ces-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.style.background = '#007aff';\n\t\t\t\t\tbtn.style.borderColor = '#007aff';\n\t\t\t\t\tbtn.style.color = '#fff';\n\t\t\t\t} else {\n\t\t\t\t\tbtn.style.background =\n\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#f8f9fa';\n\t\t\t\t\tbtn.style.borderColor =\n\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7';\n\t\t\t\t\tbtn.style.color =\n\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f';\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectFrequency(freq) {\n\t\tthis.surveyState.customAnswers.frequency = freq;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-freq-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tif (btn.dataset.freq === freq) {\n\t\t\t\t\tbtn.style.background = '#007aff';\n\t\t\t\t\tbtn.style.borderColor = '#007aff';\n\t\t\t\t\tbtn.style.color = '#fff';\n\t\t\t\t} else {\n\t\t\t\t\tbtn.style.background =\n\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#2a2a2a' : '#f8f9fa';\n\t\t\t\t\tbtn.style.borderColor =\n\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#444' : '#d2d2d7';\n\t\t\t\t\tbtn.style.color =\n\t\t\t\t\t\tthis.surveyOptions.theme === 'dark' ? '#fff' : '#1d1d1f';\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst type = this.surveyOptions.surveyType;\n\n\t\t// Validate\n\t\tif (\n\t\t\t(type === 'nps' || type === 'csat' || type === 'ces') &&\n\t\t\tthis.surveyState.score === null\n\t\t) {\n\t\t\tthis._showError('Please select a rating');\n\t\t\treturn;\n\t\t}\n\n\t\tconst responseData = {\n\t\t\trating: this.surveyState.score,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tanswers: this.surveyState.customAnswers,\n\t\t};\n\n\t\tconst response = {\n\t\t\ttype: type,\n\t\t\tscore: this.surveyState.score,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tcustomAnswers: this.surveyState.customAnswers,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\t// Call onSubmit callback if provided\n\t\tif (this.surveyOptions.onSubmit) {\n\t\t\tthis.surveyOptions.onSubmit(response);\n\t\t}\n\n\t\t// Submit to API\n\t\ttry {\n\t\t\tconst surveyId =\n\t\t\t\tthis.surveyOptions.surveyId || `local_${type}_${Date.now()}`;\n\t\t\tawait this.apiService.submitSurveyResponse(surveyId, responseData);\n\t\t} catch (error) {\n\t\t\tconsole.error('[SurveyWidget] Failed to submit survey:', error);\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('survey:submitted', { widget: this, response });\n\n\t\tthis._closeSurvey();\n\t\tthis._showSuccessNotification();\n\t}\n\n\tasync _handleDismiss() {\n\t\t// Call dismiss API if survey has a backend ID\n\t\tif (this.surveyOptions.surveyId) {\n\t\t\ttry {\n\t\t\t\tawait this.apiService.dismissSurvey(this.surveyOptions.surveyId);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[SurveyWidget] Failed to dismiss survey:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.surveyOptions.onDismiss) {\n\t\t\tthis.surveyOptions.onDismiss();\n\t\t}\n\t\tthis.sdk.eventBus.emit('survey:dismissed', { widget: this });\n\t\tthis._closeSurvey();\n\t}\n\n\t_showError(message) {\n\t\t// Simple error display - could be enhanced\n\t\tconst existing = this.surveyElement.querySelector('.feedback-survey-error');\n\t\tif (existing) existing.remove();\n\n\t\tconst error = document.createElement('div');\n\t\terror.className = 'feedback-survey-error';\n\t\terror.style.cssText =\n\t\t\t'color: #ef4444; font-size: 13px; margin-top: 8px; text-align: center;';\n\t\terror.textContent = message;\n\n\t\tconst submitBtn = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-submit'\n\t\t);\n\t\tsubmitBtn.parentNode.insertBefore(error, submitBtn);\n\n\t\tsetTimeout(() => error.remove(), 3000);\n\t}\n\n\t_showSuccessNotification() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className = 'feedback-survey-success';\n\t\tnotification.style.cssText = `\n\t\t\tposition: fixed;\n\t\t\ttop: 24px;\n\t\t\tright: 24px;\n\t\t\tbackground: #10b981;\n\t\t\tcolor: white;\n\t\t\tpadding: 16px 24px;\n\t\t\tborder-radius: 12px;\n\t\t\tfont-size: 14px;\n\t\t\tfont-weight: 500;\n\t\t\tz-index: 10001;\n\t\t\tbox-shadow: 0 10px 40px rgba(0,0,0,0.2);\n\t\t\tfont-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n\t\t`;\n\t\tnotification.innerHTML = `\n\t\t\t<div style=\"display: flex; align-items: center; gap: 8px;\">\n\t\t\t\t<span style=\"font-size: 18px;\">✓</span>\n\t\t\t\t<span>Thank you for your feedback!</span>\n\t\t\t</div>\n\t\t`;\n\t\tdocument.body.appendChild(notification);\n\n\t\tsetTimeout(() => {\n\t\t\tnotification.style.opacity = '0';\n\t\t\tnotification.style.transition = 'opacity 0.3s ease';\n\t\t\tsetTimeout(() => notification.remove(), 300);\n\t\t}, 3000);\n\t}\n\n\t_closeSurvey() {\n\t\tif (this._escapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._escapeHandler);\n\t\t\tthis._escapeHandler = null;\n\t\t}\n\n\t\t// Capture references to avoid race conditions with setTimeout\n\t\tconst surveyEl = this.surveyElement;\n\t\tconst backdropEl = this.backdropElement;\n\n\t\tif (surveyEl) {\n\t\t\tsurveyEl.style.opacity = '0';\n\t\t\tsurveyEl.style.transform =\n\t\t\t\tthis.surveyOptions.position === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(0.95)'\n\t\t\t\t\t: 'translateY(20px)';\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (surveyEl && surveyEl.parentNode) {\n\t\t\t\t\tsurveyEl.parentNode.removeChild(surveyEl);\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t\tthis.surveyElement = null;\n\t\t}\n\n\t\tif (backdropEl) {\n\t\t\tbackdropEl.style.opacity = '0';\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (backdropEl && backdropEl.parentNode) {\n\t\t\t\t\tbackdropEl.parentNode.removeChild(backdropEl);\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t\tthis.backdropElement = null;\n\t\t}\n\n\t\tthis.surveyState = {\n\t\t\tscore: null,\n\t\t\tfeedback: '',\n\t\t\tcustomAnswers: {},\n\t\t\tisVisible: false,\n\t\t};\n\t}\n\n\tdestroy() {\n\t\tthis._closeSurvey();\n\t\tsuper.destroy();\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class TabWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'tab' });\n\t}\n\n\t_render() {\n\t\tconst tab = document.createElement('div');\n\t\ttab.className = `feedback-widget feedback-widget-tab theme-${this.options.theme} position-${this.options.position}`;\n\t\ttab.innerHTML = `\n <div class=\"feedback-tab-trigger\">\n <span class=\"feedback-tab-text\">Feedback</span>\n </div>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(tab.style, this.options.customStyles);\n\t\t}\n\n\t\treturn tab;\n\t}\n\n\t_attachEvents() {\n\t\tconst tab = this.element.querySelector('.feedback-tab-trigger');\n\t\ttab.addEventListener('click', this.openModal);\n\n\t\ttab.addEventListener('mouseenter', () => {\n\t\t\tif (!this.state.isSubmitting) {\n\t\t\t\ttab.style.transform = this._getHoverTransform();\n\t\t\t}\n\t\t});\n\n\t\ttab.addEventListener('mouseleave', () => {\n\t\t\ttab.style.transform = 'none';\n\t\t});\n\t}\n\n\t_getHoverTransform() {\n\t\tconst position = this.options.position;\n\t\tif (position.includes('right')) {\n\t\t\treturn 'translateX(-5px)';\n\t\t} else if (position.includes('left')) {\n\t\t\treturn 'translateX(5px)';\n\t\t}\n\t\treturn 'none';\n\t}\n\n\tupdateText(text) {\n\t\tconst textElement = this.element?.querySelector('.feedback-tab-text');\n\t\tif (textElement) {\n\t\t\ttextElement.textContent = text;\n\t\t}\n\t}\n\n\tupdatePosition(position) {\n\t\tthis.options.position = position;\n\t\tif (this.element) {\n\t\t\tthis.element.className = this.element.className.replace(\n\t\t\t\t/position-\\w+-\\w+/,\n\t\t\t\t`position-${position}`\n\t\t\t);\n\t\t}\n\t}\n}\n","import { SDKError } from '../utils/errors.js';\nimport { ButtonWidget } from './ButtonWidget.js';\nimport { ChangelogWidget } from './ChangelogWidget.js';\nimport { InlineWidget } from './InlineWidget.js';\nimport { MessengerWidget } from './MessengerWidget.js';\nimport { SurveyWidget } from './SurveyWidget.js';\nimport { TabWidget } from './TabWidget.js';\n\nexport class WidgetFactory {\n\tstatic widgets = new Map([\n\t\t['button', ButtonWidget],\n\t\t['tab', TabWidget],\n\t\t['inline', InlineWidget],\n\t\t['survey', SurveyWidget],\n\t\t['messenger', MessengerWidget],\n\t\t['changelog', ChangelogWidget],\n\t]);\n\n\tstatic register(type, WidgetClass) {\n\t\tif (typeof type !== 'string' || !type.trim()) {\n\t\t\tthrow new SDKError('Widget type must be a non-empty string');\n\t\t}\n\n\t\tif (typeof WidgetClass !== 'function') {\n\t\t\tthrow new SDKError('Widget class must be a constructor function');\n\t\t}\n\n\t\tthis.widgets.set(type, WidgetClass);\n\t}\n\n\tstatic create(type, options = {}) {\n\t\tconst WidgetClass = this.widgets.get(type);\n\n\t\tif (!WidgetClass) {\n\t\t\tconst availableTypes = Array.from(this.widgets.keys()).join(', ');\n\t\t\tthrow new SDKError(\n\t\t\t\t`Unknown widget type: ${type}. Available types: ${availableTypes}`\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\treturn new WidgetClass(options);\n\t\t} catch (error) {\n\t\t\tthrow new SDKError(\n\t\t\t\t`Failed to create widget of type '${type}': ${error.message}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tstatic getAvailableTypes() {\n\t\treturn Array.from(this.widgets.keys());\n\t}\n\n\tstatic isTypeRegistered(type) {\n\t\treturn this.widgets.has(type);\n\t}\n\n\tstatic unregister(type) {\n\t\treturn this.widgets.delete(type);\n\t}\n\n\tstatic clear() {\n\t\tthis.widgets.clear();\n\t}\n\n\tstatic getWidgetClass(type) {\n\t\treturn this.widgets.get(type);\n\t}\n}\n","import { ConfigError, SDKError } from '../utils/errors.js';\nimport { deepMerge, generateId } from '../utils/helpers.js';\nimport { WidgetFactory } from '../widgets/WidgetFactory.js';\nimport { APIService } from './APIService.js';\nimport { EventBus } from './EventBus.js';\n\nexport class FeedbackSDK {\n\tconstructor(config = {}) {\n\t\tthis.config = this._validateAndMergeConfig(config);\n\t\tthis.initialized = false;\n\t\tthis.widgets = new Map();\n\t\tthis.eventBus = new EventBus();\n\n\t\tthis.apiService = new APIService({\n\t\t\tapiUrl: this.config.apiUrl,\n\t\t\tworkspace: this.config.workspace,\n\t\t\tsiteId: this.config.siteId,\n\t\t\tsessionToken: this.config.sessionToken,\n\t\t\tuserContext: this.config.userContext,\n\t\t\tmock: this.config.mock,\n\t\t\tdebug: this.config.debug,\n\t\t\tenv: this.config.env,\n\t\t});\n\n\t\tthis._bindMethods();\n\t}\n\n\tasync init() {\n\t\tif (this.initialized) {\n\t\t\treturn { alreadyInitialized: true };\n\t\t}\n\n\t\ttry {\n\t\t\tconst initData = await this.apiService.init(this.config.userContext);\n\n\t\t\tif (initData.config) {\n\t\t\t\tthis.config = deepMerge(initData.config, this.config);\n\t\t\t}\n\n\t\t\tthis.initialized = true;\n\t\t\tthis.eventBus.emit('sdk:initialized', {\n\t\t\t\tconfig: this.config,\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tinitialized: true,\n\t\t\t\tconfig: initData.config || {},\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t\texpiresIn: initData.expiresIn,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to initialize SDK: ${error.message}`, error);\n\t\t}\n\t}\n\n\tcreateWidget(type = 'button', options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before creating widgets. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst widgetId = generateId('widget');\n\t\tconst widgetOptions = {\n\t\t\tid: widgetId,\n\t\t\tsdk: this,\n\t\t\tapiService: this.apiService,\n\t\t\t...this.config,\n\t\t\t...options,\n\t\t};\n\n\t\ttry {\n\t\t\tconst widget = WidgetFactory.create(type, widgetOptions);\n\t\t\tthis.widgets.set(widgetId, widget);\n\t\t\tthis.eventBus.emit('widget:created', { widget, type });\n\t\t\treturn widget;\n\t\t} catch (error) {\n\t\t\tthrow new SDKError(`Failed to create widget: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetWidget(id) {\n\t\treturn this.widgets.get(id);\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getActiveSurveys(context);\n\t\t\treturn result.data || [];\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(\n\t\t\t\t`Failed to fetch active surveys: ${error.message}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tasync showSurveyById(surveyId, options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst surveys = await this.getActiveSurveys();\n\t\tconst surveyConfig = surveys.find((s) => s.id === surveyId);\n\n\t\tif (!surveyConfig) {\n\t\t\tthrow new SDKError(\n\t\t\t\t`Survey with ID '${surveyId}' not found or not active`\n\t\t\t);\n\t\t}\n\n\t\treturn this.showSurvey({\n\t\t\tsurveyId: surveyConfig.id,\n\t\t\tsurveyType: surveyConfig.type,\n\t\t\ttitle: surveyConfig.title,\n\t\t\tdescription: surveyConfig.description,\n\t\t\tlowLabel: surveyConfig.low_label,\n\t\t\thighLabel: surveyConfig.high_label,\n\t\t\tcustomQuestions: surveyConfig.questions,\n\t\t\t...options,\n\t\t});\n\t}\n\n\tshowSurvey(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst surveyWidget = this.createWidget('survey', {\n\t\t\tsurveyId: options.surveyId,\n\t\t\tsurveyType: options.surveyType || options.type || 'nps',\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || this.config.theme || 'light',\n\t\t\ttitle: options.title,\n\t\t\tdescription: options.description,\n\t\t\tlowLabel: options.lowLabel,\n\t\t\thighLabel: options.highLabel,\n\t\t\tcustomQuestions: options.customQuestions,\n\t\t\tonSubmit: options.onSubmit,\n\t\t\tonDismiss: options.onDismiss,\n\t\t});\n\n\t\tsurveyWidget.mount();\n\t\tsurveyWidget.show();\n\n\t\treturn surveyWidget;\n\t}\n\n\tshowChangelog(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing changelog. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst changelogWidget = this.createWidget('changelog', {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || this.config.theme || 'light',\n\t\t\ttitle: options.title || \"What's New\",\n\t\t\ttriggerText: options.triggerText || \"What's New\",\n\t\t\tshowBadge: options.showBadge !== false,\n\t\t\tviewButtonText: options.viewButtonText || 'View Update',\n\t\t\tchangelogBaseUrl: options.changelogBaseUrl,\n\t\t\topenInNewTab: options.openInNewTab,\n\t\t\tonViewUpdate: options.onViewUpdate,\n\t\t});\n\n\t\tchangelogWidget.mount();\n\t\tchangelogWidget.show();\n\n\t\treturn changelogWidget;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching changelogs. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getChangelogs(options);\n\t\t\treturn result.data || [];\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to fetch changelogs: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetAllWidgets() {\n\t\treturn Array.from(this.widgets.values());\n\t}\n\n\tdestroyWidget(id) {\n\t\tconst widget = this.widgets.get(id);\n\t\tif (widget) {\n\t\t\twidget.destroy();\n\t\t\tthis.widgets.delete(id);\n\t\t\tthis.eventBus.emit('widget:removed', { widgetId: id });\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdestroyAllWidgets() {\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.destroy();\n\t\t}\n\t\tthis.widgets.clear();\n\t\tthis.eventBus.emit('widgets:cleared');\n\t}\n\n\tupdateConfig(newConfig) {\n\t\tconst oldConfig = { ...this.config };\n\t\tthis.config = this._validateAndMergeConfig(newConfig, this.config);\n\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.handleConfigUpdate(this.config);\n\t\t}\n\n\t\tthis.eventBus.emit('config:updated', {\n\t\t\toldConfig,\n\t\t\tnewConfig: this.config,\n\t\t});\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.config.userContext = userContext;\n\t\tif (this.apiService) {\n\t\t\tthis.apiService.setUserContext(userContext);\n\t\t}\n\t\tthis.eventBus.emit('user:updated', { userContext });\n\t}\n\n\tgetUserContext() {\n\t\treturn (\n\t\t\tthis.config.userContext ||\n\t\t\t(this.apiService ? this.apiService.getUserContext() : null)\n\t\t);\n\t}\n\n\tasync reinitialize(newUserContext = null) {\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\n\t\tif (newUserContext) {\n\t\t\tthis.setUserContext(newUserContext);\n\t\t}\n\n\t\treturn this.init();\n\t}\n\n\ton(event, callback) {\n\t\tthis.eventBus.on(event, callback);\n\t\treturn this;\n\t}\n\n\toff(event, callback) {\n\t\tthis.eventBus.off(event, callback);\n\t\treturn this;\n\t}\n\n\tonce(event, callback) {\n\t\tthis.eventBus.once(event, callback);\n\t\treturn this;\n\t}\n\n\temit(event, data) {\n\t\tthis.eventBus.emit(event, data);\n\t\treturn this;\n\t}\n\n\tdestroy() {\n\t\tthis.destroyAllWidgets();\n\t\tthis.eventBus.removeAllListeners();\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\t\tthis.eventBus.emit('sdk:destroyed');\n\t}\n\n\thasFeedbackBeenSubmitted(cooldownDays = 30) {\n\t\tconst cooldownMs = cooldownDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\treturn now - data.submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearFeedbackSubmissionTracking() {\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t\tthis.eventBus.emit('feedback:trackingCleared');\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear feedback tracking:', e);\n\t\t}\n\t}\n\n\t_detectEnvironment() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn 'production';\n\t\t}\n\n\t\tconst hostname = window.location.hostname.toLowerCase();\n\n\t\tif (\n\t\t\thostname.includes('staging') ||\n\t\t\thostname.includes('localhost') ||\n\t\t\thostname.includes('127.0.0.1') ||\n\t\t\thostname.includes('.local')\n\t\t) {\n\t\t\treturn 'staging';\n\t\t}\n\n\t\treturn 'production';\n\t}\n\n\t_validateAndMergeConfig(newConfig, existingConfig = {}) {\n\t\tconst defaultConfig = {\n\t\t\tapiUrl: null,\n\t\t\tworkspace: null,\n\t\t\tuserContext: null,\n\t\t\tposition: 'bottom-right',\n\t\t\ttheme: 'light',\n\t\t\tboardId: 'general',\n\t\t\tautoShow: true,\n\t\t\tdebug: false,\n\t\t\tmock: false,\n\t\t\tenv: this._detectEnvironment(),\n\t\t};\n\n\t\tconst mergedConfig = deepMerge(\n\t\t\tdeepMerge(defaultConfig, existingConfig),\n\t\t\tnewConfig\n\t\t);\n\n\t\tif (!newConfig.env && !existingConfig.env) {\n\t\t\tmergedConfig.env = this._detectEnvironment();\n\t\t}\n\n\t\tif (!mergedConfig.workspace) {\n\t\t\tthrow new ConfigError('Missing required configuration: workspace');\n\t\t}\n\n\t\tif (mergedConfig.userContext) {\n\t\t\tthis._validateUserContext(mergedConfig.userContext);\n\t\t}\n\n\t\treturn mergedConfig;\n\t}\n\n\t_validateUserContext(userContext) {\n\t\tif (!userContext.user_id && !userContext.email) {\n\t\t\tthrow new ConfigError(\n\t\t\t\t'User context must include at least user_id or email'\n\t\t\t);\n\t\t}\n\n\t\tconst validStructure = {\n\t\t\tuser_id: 'string',\n\t\t\temail: 'string',\n\t\t\tname: 'string',\n\t\t\tcustom_fields: 'object',\n\t\t\tcompany: 'object',\n\t\t};\n\n\t\tfor (const [key, expectedType] of Object.entries(validStructure)) {\n\t\t\tif (userContext[key] && typeof userContext[key] !== expectedType) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`User context field '${key}' must be of type '${expectedType}'`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t_bindMethods() {\n\t\tthis.createWidget = this.createWidget.bind(this);\n\t\tthis.destroyWidget = this.destroyWidget.bind(this);\n\t\tthis.updateConfig = this.updateConfig.bind(this);\n\t}\n\n\tstatic create(config) {\n\t\treturn new FeedbackSDK(config);\n\t}\n\n\tstatic async createAndInit(config) {\n\t\tconst sdk = new FeedbackSDK(config);\n\t\tawait sdk.init();\n\t\treturn sdk;\n\t}\n\n\tstatic extractUserContextFromAuth(authData) {\n\t\tif (!authData) return null;\n\n\t\treturn {\n\t\t\tuser_id: authData.sub || authData.id || authData.user_id,\n\t\t\temail: authData.email,\n\t\t\tname: authData.name || authData.display_name || authData.full_name,\n\t\t\tcustom_fields: {\n\t\t\t\trole: authData.role,\n\t\t\t\tplan: authData.plan || authData.subscription?.plan,\n\t\t\t\t...(authData.custom_fields || {}),\n\t\t\t},\n\t\t\tcompany:\n\t\t\t\tauthData.company || authData.organization\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tid: authData.company?.id || authData.organization?.id,\n\t\t\t\t\t\t\tname: authData.company?.name || authData.organization?.name,\n\t\t\t\t\t\t\tmonthly_spend: authData.company?.monthly_spend,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n}\n","import { APIService } from './core/APIService.js';\nimport { EventBus } from './core/EventBus.js';\nimport { FeedbackSDK } from './core/FeedbackSDK.js';\nimport { MESSENGER_STYLES } from './styles/messengerStyles.js';\nimport { CSS_STYLES } from './styles/styles.js';\nimport {\n\tAPIError,\n\tConfigError,\n\tSDKError,\n\tValidationError,\n\tWidgetError,\n} from './utils/errors.js';\nimport * as helpers from './utils/helpers.js';\nimport { BaseWidget } from './widgets/BaseWidget.js';\nimport { ButtonWidget } from './widgets/ButtonWidget.js';\nimport { ChangelogWidget } from './widgets/ChangelogWidget.js';\nimport { InlineWidget } from './widgets/InlineWidget.js';\nimport { MessengerWidget } from './widgets/MessengerWidget.js';\nimport { SurveyWidget } from './widgets/SurveyWidget.js';\nimport { TabWidget } from './widgets/TabWidget.js';\nimport { WidgetFactory } from './widgets/WidgetFactory.js';\n\nfunction injectStyles() {\n\tif (\n\t\ttypeof document !== 'undefined' &&\n\t\t!document.querySelector('#feedback-sdk-styles')\n\t) {\n\t\tconst style = document.createElement('style');\n\t\tstyle.id = 'feedback-sdk-styles';\n\t\tstyle.textContent = CSS_STYLES + MESSENGER_STYLES;\n\t\tdocument.head.appendChild(style);\n\t}\n}\n\nfunction autoInit() {\n\tif (typeof window !== 'undefined' && window.FeedbackSDKConfig) {\n\t\tinjectStyles();\n\n\t\tconst config = { ...window.FeedbackSDKConfig };\n\t\tconst sdk = new FeedbackSDK(config);\n\n\t\tsdk\n\t\t\t.init()\n\t\t\t.then((initData) => {\n\t\t\t\twindow.FeedbackSDK.instance = sdk;\n\n\t\t\t\tif (window.FeedbackSDKConfig.autoCreate) {\n\t\t\t\t\tconst widgets = Array.isArray(window.FeedbackSDKConfig.autoCreate)\n\t\t\t\t\t\t? window.FeedbackSDKConfig.autoCreate\n\t\t\t\t\t\t: [window.FeedbackSDKConfig.autoCreate];\n\n\t\t\t\t\twidgets.forEach((widgetConfig) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst widget = sdk.createWidget(\n\t\t\t\t\t\t\t\twidgetConfig.type || 'button',\n\t\t\t\t\t\t\t\twidgetConfig\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\twidget.mount(widgetConfig.container);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error('[FeedbackSDK] Failed to create widget:', error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (typeof CustomEvent !== 'undefined') {\n\t\t\t\t\tconst event = new CustomEvent('FeedbackSDKReady', {\n\t\t\t\t\t\tdetail: { sdk, config, initData },\n\t\t\t\t\t});\n\t\t\t\t\twindow.dispatchEvent(event);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[FeedbackSDK] Auto-initialization failed:', error);\n\n\t\t\t\tif (typeof CustomEvent !== 'undefined') {\n\t\t\t\t\tconst event = new CustomEvent('FeedbackSDKError', {\n\t\t\t\t\t\tdetail: { error, config, phase: 'initialization' },\n\t\t\t\t\t});\n\t\t\t\t\twindow.dispatchEvent(event);\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\nfunction handleDOMReady() {\n\tif (typeof document !== 'undefined') {\n\t\tif (document.readyState === 'loading') {\n\t\t\tdocument.addEventListener('DOMContentLoaded', autoInit);\n\t\t} else {\n\t\t\tsetTimeout(autoInit, 0);\n\t\t}\n\t}\n}\n\nconst FeedbackSDKExport = {\n\tFeedbackSDK,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tTabWidget,\n\tInlineWidget,\n\tSurveyWidget,\n\tMessengerWidget,\n\tWidgetFactory,\n\tEventBus,\n\tAPIService,\n\tSDKError,\n\tAPIError,\n\tWidgetError,\n\tConfigError,\n\tValidationError,\n\thelpers,\n\tcreate: (config) => {\n\t\tinjectStyles();\n\t\treturn new FeedbackSDK(config);\n\t},\n\tversion: '1.0.0',\n\tinstance: null,\n\n\tisReady: () => Boolean(FeedbackSDKExport.instance),\n\tgetInstance: () => FeedbackSDKExport.instance,\n\n\tsetUserContext: (userContext) => {\n\t\tif (FeedbackSDKExport.instance) {\n\t\t\tFeedbackSDKExport.instance.setUserContext(userContext);\n\t\t} else {\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.FeedbackSDKUserContext = userContext;\n\t\t\t}\n\t\t}\n\t},\n\n\tinitWithUser: async (config, userContext) => {\n\t\tinjectStyles();\n\t\tconst fullConfig = { ...config, userContext };\n\t\tconst sdk = new FeedbackSDK(fullConfig);\n\t\tawait sdk.init();\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.FeedbackSDK.instance = sdk;\n\t\t}\n\n\t\treturn sdk;\n\t},\n\n\tonReady: (callback) => {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tif (FeedbackSDKExport.isReady()) {\n\t\t\t\tcallback(FeedbackSDKExport.instance);\n\t\t\t} else {\n\t\t\t\twindow.addEventListener(\n\t\t\t\t\t'FeedbackSDKReady',\n\t\t\t\t\t(event) => {\n\t\t\t\t\t\tcallback(event.detail.sdk, event.detail);\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tonError: (callback) => {\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.addEventListener('FeedbackSDKError', (event) => {\n\t\t\t\tcallback(event.detail.error, event.detail);\n\t\t\t});\n\t\t}\n\t},\n\n\textractUserContext: FeedbackSDK.extractUserContextFromAuth,\n};\n\nif (typeof window !== 'undefined') {\n\twindow.FeedbackSDK = FeedbackSDKExport;\n\thandleDOMReady();\n}\n\nexport default FeedbackSDKExport;\n\nexport {\n\tAPIError,\n\tAPIService,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tConfigError,\n\tEventBus,\n\tFeedbackSDK,\n\thelpers,\n\tInlineWidget,\n\tMessengerWidget,\n\tSDKError,\n\tSurveyWidget,\n\tTabWidget,\n\tValidationError,\n\tWidgetError,\n\tWidgetFactory,\n};\n"],"names":["MOCK_CHANGELOGS","id","title","excerpt","description","cover_image","slug","published_at","labels","name","color","status","MOCK_CONVERSATIONS","subject","last_message_at","Date","now","toISOString","created_at","unread","assigned_user","avatar","MOCK_MESSAGES","conv_1","content","sender_type","sender_name","sender_avatar","conv_2","MOCK_HELP_COLLECTIONS","articleCount","icon","url","MOCK_SURVEYS","type","low_label","high_label","trigger","delay","ms","Promise","resolve","setTimeout","getDeviceInfo","navigator","device","browser","os","ua","userAgent","test","includes","ChangelogService","constructor","baseAPI","this","api","getChangelogs","options","_ensureSession","mock","success","data","_handleAuthRetry","async","endpoint","_getEndpointWithParams","_makeRequest","method","headers","Authorization","sessionToken","FeedbackService","submitFeedback","feedbackData","message","payload","board","board_id","boardId","attachments","body","JSON","stringify","HelpService","getHelpCollections","searchHelpArticles","query","filter","c","toLowerCase","params","q","MessengerService","getMessengerSettings","enabled","greeting_message","team_name","response_time","checkAgentsOnline","agents_online","online_count","getConversations","meta","total","length","page","limit","getConversation","conversationId","find","messages","startConversation","newConv","unshift","sendMessage","newMessage","push","getUnreadCount","count","reduce","sum","unread_count","unread_conversations","markConversationAsRead","SDKError","Error","cause","super","captureStackTrace","APIError","response","isNetworkError","isClientError","isServerError","WidgetError","widgetType","widgetId","ConfigError","configKey","ValidationError","field","value","SurveyService","getActiveSurveys","context","window","location","href","userProperties","user_properties","submitSurveyResponse","surveyId","responseData","survey_id","rating","feedback","answers","dismissSurvey","BaseAPIService","config","workspace","sessionExpiry","userContext","env","baseURL","_getBaseURL","_loadStoredSession","apiUrl","ENV_URLS","production","base","withWorkspace","ws","staging","envConfig","init","isSessionValid","_initMockSession","_initRealSession","_storeSession","primaryColor","backgroundColor","textColor","size","displayMode","expiresIn","user","session_token","expires_in","error","args","apply","setUserContext","_storeData","getUserContext","clearSession","_removeData","localStorage","sessionData","token","expiry","stored","getItem","parse","key","setItem","removeItem","fetch","ok","errorMessage","json","e","text","contentType","get","_buildQueryParams","queryParams","URLSearchParams","Object","entries","forEach","append","toString","queryString","APIService","survey","messenger","help","changelog","available_agents","full_name","picture","getMessages","console","log","initError","uploadFile","base64Data","filename","file","sendTypingIndicator","isTyping","submitRating","identifyContact","startsWith","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","once","unsubscribe","clear","getListenerCount","generateId","prefix","Math","random","substring","deepMerge","target","source","result","hasOwnProperty","Array","isArray","isBrowser","document","func","wait","timeout","clearTimeout","string","replace","bytes","i","floor","parseFloat","pow","toFixed","platform","language","userLanguage","cookieEnabled","screenResolution","screen","width","height","windowSize","innerWidth","innerHeight","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","element","property","fallback","getComputedStyle","getPropertyValue","obj","path","defaultValue","undefined","keys","split","current","rect","getBoundingClientRect","top","left","bottom","documentElement","clientHeight","right","clientWidth","email","trim","str","div","createElement","textContent","innerHTML","scrollIntoView","behavior","block","inline","lastKey","pop","lastFunc","lastRan","required","missing","join","BaseWidget","static","sdk","apiService","container","position","autoShow","showBackdrop","customStyles","suppressAfterSubmission","suppressionDays","DEFAULT_COOLDOWN_DAYS","panelElement","backdropElement","mounted","destroyed","state","isOpen","isLoading","isSubmitting","errors","_bindMethods","mount","_hasRecentlySubmitted","eventBus","widget","reason","querySelector","_render","appendChild","_attachEvents","onMount","show","style","display","hide","openPanel","_showLoadingModal","_hideLoadingModal","_renderPanel","requestAnimationFrame","classList","add","className","loadingElement","theme","remove","closePanel","parentNode","removeChild","_resetForm","_hideError","_updateSubmitButton","_showError","_trackSubmission","_showSuccessMessage","handleConfigUpdate","newConfig","_updateTheme","destroy","onDestroy","storageKey","STORAGE_KEY","submittedAt","warn","cooldownMs","last_feedback_at","getTime","clearSubmissionTracking","shouldShow","bind","addEventListener","modeClass","sizeClass","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","notification","closeNotification","opacity","openModal","closeModal","ButtonWidget","isMinimized","button","assign","minimizeIcon","expandIcon","stopPropagation","minimize","restore","closest","transform","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","currentIndex","triggerText","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","listModalBackdropElement","colors","confetti","animationDelay","animationDuration","shapes","shape","borderRadius","closeSidebar","_listModalEscapeHandler","map","_renderChangelogListItem","querySelectorAll","item","_handleViewUpdate","hasImage","image","imageUrl","date","_formatDate","label","_getContrastColor","hasMultiple","viewButtonText","_","dot","parseInt","dataset","changelogBaseUrl","openInNewTab","open","onViewUpdate","dateString","toLocaleDateString","year","month","day","hexColor","hex","substr","hideBadge","badge","nextChangelog","prevChangelog","refresh","InlineWidget","form","textarea","originalContent","updateTitle","titleElement","setPlaceholder","placeholder","input","MessengerState","currentView","unreadCount","activeConversationId","conversations","helpArticles","helpSearchQuery","homeChangelogItems","changelogItems","teamName","teamAvatars","welcomeMessage","enableHelp","enableChangelog","agentsOnline","onlineCount","responseTime","typingUsers","isLoadingMessages","_listeners","Set","subscribe","delete","_notify","changeType","cb","setView","view","previousView","setOpen","setActiveConversation","previousConversationId","setConversations","_updateUnreadCount","addConversation","conversation","setMessages","addMessage","conv","lastMessage","lastMessageTime","timestamp","isOwn","updateConversation","updates","markAsRead","setHelpArticles","articles","setHelpSearchQuery","setHomeChangelogItems","items","setChangelogItems","getActiveConversation","getActiveMessages","setTeamAvatarsFromAgents","agents","agent","getFilteredHelpArticles","article","reset","MessengerLauncher","_unsubscribe","render","_updateContent","_updateIcon","_updateBadge","badgeHtml","chatIcon","closeIcon","existingBadge","NavigationTabs","_updateActiveTab","_getTabs","tabs","_getHomeIcon","_getMessagesIcon","_getHelpIcon","_getChangelogIcon","tabsHtml","tab","isActive","tabId","toggle","MessengerPanel","navigationTabs","currentViewComponent","viewRegistry","registerView","ViewClass","_renderCurrentView","viewsContainer","setHeader","headerContent","header","ChangelogView","_updateChangelogList","avatarsHtml","_renderTeamAvatars","changelogContainer","_renderChangelogCard","_attachChangelogEvents","_renderEmptyState","tagsHtml","tags","tag","dateStr","publishedAt","coverImage","_truncateText","avatars","slice","charAt","toUpperCase","maxLength","card","changelogId","changelogItem","n","onChangelogClick","ChatView","_typingTimeout","_isTyping","_typingIndicator","_isConversationClosed","_showEmailOverlayFlag","_pendingAttachments","_hideTypingIndicator","_appendMessage","_scrollToBottom","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","msg","_renderMessage","avatarHtml","_renderConversationAvatar","existingName","_escapeHtml","_renderAttachmentPreviews","_showEmailOverlay","isOnline","_renderMessageAttachments","att","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","avatarUrl","participants","p","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollTop","scrollHeight","_updateSendButtonState","sendBtn","preview","btn","idx","currentTarget","min","_startTyping","shiftKey","_sendMessage","attachBtn","fileInput","click","files","from","reader","FileReader","onload","ev","readAsDataURL","emailInput","emailSubmit","emailSkip","isValid","_isValidEmail","_handleEmailSubmit","_hideEmailOverlay","fileLink","_downloadFile","img","src","blob","blobUrl","URL","createObjectURL","a","download","revokeObjectURL","overlay","_startPendingConversation","_pendingMessage","onStartConversation","_pendingAttachmentsForSend","nameInput","onIdentifyContact","hasAttachments","_stopTyping","attachmentsToSend","needsContactInfo","localMessage","onSendMessage","onTyping","ConversationsView","_renderAvatarStack","conversationsHtml","_renderConversationItem","unreadClass","timeAgo","_formatTimeAgo","_renderConversationAvatars","_truncateMessage","_getAvatarColor","diffMs","diffMins","diffHours","diffDays","closeBtn","convId","onSelectConversation","newMsgBtn","_startNewConversation","openConversation","onStartNewConversation","HelpView","_updateCollectionsList","searchQuery","collectionCount","collectionsContainer","collections","filteredCollections","headerEl","collection","_renderCollectionItem","_attachCollectionEvents","searchTimeout","collectionId","onArticleClick","HomeView","recentChangelogHtml","_renderRecentChangelog","logoUrl","_renderAvailabilityStatus","_renderMessageButton","_renderFeaturedCard","featuredContent","action","coverText","msgBtn","seeAllBtn","featuredBtn","PreChatFormView","_isSubmitting","existingEmail","skipBtn","validateForm","isEmailValid","_clearError","_handleSubmit","elementId","errorEl","submitText","submitLoading","WebSocketService","reconnectAttempts","maxReconnectAttempts","reconnectDelay","pingInterval","isConnected","_onOpen","_onMessage","_onClose","_onError","connect","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","close","_mockInterval","send","readyState","OPEN","setInterval","code","conversation_id","user_id","user_name","is_agent","simulateMessage","MessengerWidget","messengerOptions","messengerState","launcher","wsService","_wsUnsubscribers","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","zIndex","_handleSendMessage","_handleStartConversation","_handleSelectConversation","_handleNewConversationClick","_handleIdentifyContact","_stateUnsubscribe","_handleActiveConversationChange","messageContent","pendingAttachments","pendingMessage","startNewConversation","fetchMessages","contactData","_handleUploadFile","_uploadPendingAttachments","uploaded","cdnUrl","err","uploadedAttachments","mockResponse","_initWebSocket","navigateTo","setUnreadCount","getState","loadInitialData","_fetchConversations","_fetchHelpArticles","homeItems","_fetchChangelog","snippet","article_count","attachmentCount","hasSession","newConversation","checkAgentAvailability","mappedItems","_availabilityInterval","unsub","SurveyWidget","surveyOptions","surveyType","lowLabel","highLabel","customQuestions","onSubmit","onDismiss","surveyState","score","customAnswers","isVisible","_renderSurvey","_closeSurvey","_getSurveyConfig","positionStyles","_getPositionStyles","themeStyles","_handleDismiss","surveyElement","cssText","html","_attachSurveyEvents","configs","nps","csat","emoji","ces","custom","_renderCustomQuestions","_renderQuestionInput","freq","question","opt","positions","center","_attachTypeSpecificEvents","_selectNPS","borderColor","_selectCSAT","_selectCES","_selectFrequency","select","background","btnScore","frequency","_showSuccessNotification","existing","insertBefore","transition","surveyEl","backdropEl","TabWidget","_getHoverTransform","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","FeedbackSDK","_validateAndMergeConfig","initialized","siteId","debug","alreadyInitialized","initData","createWidget","widgetOptions","getWidget","showSurveyById","surveyConfig","s","showSurvey","questions","surveyWidget","showChangelog","changelogWidget","getAllWidgets","values","destroyWidget","destroyAllWidgets","updateConfig","oldConfig","reinitialize","newUserContext","removeAllListeners","hasFeedbackBeenSubmitted","cooldownDays","clearFeedbackSubmissionTracking","_detectEnvironment","hostname","existingConfig","mergedConfig","_validateUserContext","validStructure","custom_fields","company","expectedType","createAndInit","extractUserContextFromAuth","authData","sub","display_name","role","plan","subscription","organization","monthly_spend","injectStyles","CSS_STYLES","head","autoInit","FeedbackSDKConfig","then","instance","autoCreate","widgetConfig","CustomEvent","detail","dispatchEvent","catch","phase","FeedbackSDKExport","helpers","version","isReady","Boolean","getInstance","FeedbackSDKUserContext","initWithUser","fullConfig","onReady","onError","extractUserContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feedback-sdk.min.js","sources":["../src/api/mock-data/index.js","../src/api/utils/helpers.js","../src/api/services/ChangelogService.js","../src/api/services/FeedbackService.js","../src/api/services/HelpService.js","../src/api/services/MessengerService.js","../src/utils/errors.js","../src/api/services/SurveyService.js","../src/core/BaseAPIService.js","../src/core/APIService.js","../src/core/EventBus.js","../src/utils/helpers.js","../src/widgets/BaseWidget.js","../src/widgets/ButtonWidget.js","../src/widgets/ChangelogWidget.js","../src/widgets/InlineWidget.js","../src/widgets/messenger/MessengerState.js","../src/widgets/messenger/components/MessengerLauncher.js","../src/widgets/messenger/components/NavigationTabs.js","../src/widgets/messenger/components/MessengerPanel.js","../src/widgets/messenger/views/ChangelogView.js","../src/widgets/messenger/views/ChatView.js","../src/widgets/messenger/views/ConversationsView.js","../src/widgets/messenger/views/HelpView.js","../src/widgets/messenger/views/HomeView.js","../src/widgets/messenger/views/PreChatFormView.js","../src/core/WebSocketService.js","../src/widgets/MessengerWidget.js","../src/widgets/SurveyWidget.js","../src/widgets/TabWidget.js","../src/widgets/WidgetFactory.js","../src/core/FeedbackSDK.js","../src/index.js","../src/styles/styles.js"],"sourcesContent":["export const MOCK_CHANGELOGS = [\n\t{\n\t\tid: 'changelog_1',\n\t\ttitle:\n\t\t\t'Feature prioritization, multiple roadmaps, and feature request analytics.',\n\t\texcerpt:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tdescription:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiNEQkVBRkUiLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzE1NUVFRiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMzAiIHk9IjQwIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjQiIGZpbGw9IiNFNUU3RUIiLz48cmVjdCB4PSIzMCIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHRleHQgeD0iNDAiIHk9Ijg1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMUYyOTM3Ij4yMDA8L3RleHQ+PHRleHQgeD0iNDAiIHk9Ijk1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjgiIGZpbGw9IiM2QjcyODAiPlBvc3RzPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI0MCIgcng9IjQiIGZpbGw9IiNGM0Y0RjYiLz48cmVjdCB4PSIyNzAiIHk9IjYwIiB3aWR0aD0iODAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHBhdGggZD0iTTMwIDEzMEgzNzBNMzAgMTUwSDM3ME0zMCAxNzBIMzcwTTMwIDE5MEgzNzAiIHN0cm9rZT0iI0U1RTdFQiIgc3Ryb2tlLXdpZHRoPSIxIi8+PHBhdGggZD0iTTUwIDE2MEwxMDAgMTQwTDE1MCAxNTBMMjAwIDEzMEwyNTAgMTM1TDMwMCAxMjBMMzUwIDEyNSIgc3Ryb2tlPSIjMTU1RUVGIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz48L3N2Zz4=',\n\t\tslug: 'feature-prioritization-roadmaps-analytics',\n\t\tpublished_at: '2025-03-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'New Feature', color: '#10B981' },\n\t\t\t{ name: 'Analytics', color: '#6366F1' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_2',\n\t\ttitle: 'Dark mode support and UI improvements',\n\t\texcerpt:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tdescription:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiMxRjI5MzciLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0iIzM3NDE1MSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjEiLz48Y2lyY2xlIGN4PSIyMDAiIGN5PSIxMjUiIHI9IjQwIiBmaWxsPSIjRkJCRjI0Ii8+PHBhdGggZD0iTTIyMCAxMjVDMjIwIDEzNiAyMTEgMTQ1IDIwMCAxNDVDMTg5IDE0NSAxODAgMTM2IDE4MCAxMjVDMTgwIDExNCAxODkgMTA1IDIwMCAxMDVDMjExIDEwNSAyMjAgMTE0IDIyMCAxMjVaIiBmaWxsPSIjMUYyOTM3Ii8+PC9zdmc+',\n\t\tslug: 'dark-mode-ui-improvements',\n\t\tpublished_at: '2025-03-01T10:00:00Z',\n\t\tlabels: [{ name: 'Enhancement', color: '#8B5CF6' }],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_3',\n\t\ttitle: 'Performance improvements and bug fixes',\n\t\texcerpt:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tdescription:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tslug: 'performance-improvements-bug-fixes',\n\t\tpublished_at: '2025-02-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'Bug Fix', color: '#EF4444' },\n\t\t\t{ name: 'Performance', color: '#F59E0B' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n];\n\nexport const MOCK_CONVERSATIONS = [\n\t{\n\t\tid: 'conv_1',\n\t\tsubject: 'Question about pricing',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 1,\n\t\tassigned_user: {\n\t\t\tid: 'user_1',\n\t\t\tname: 'Sarah',\n\t\t\tavatar: null,\n\t\t},\n\t},\n\t{\n\t\tid: 'conv_2',\n\t\tsubject: 'Feature request',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(\n\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000\n\t\t).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 0,\n\t\tassigned_user: {\n\t\t\tid: 'user_2',\n\t\t\tname: 'Tom',\n\t\t\tavatar: null,\n\t\t},\n\t},\n];\n\nexport const MOCK_MESSAGES = {\n\tconv_1: [\n\t\t{\n\t\t\tid: 'msg_1',\n\t\t\tcontent: \"Hi there! 👋 I'm Sarah. How can I help you today?\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Sarah',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 50 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_2',\n\t\t\tcontent: 'Hi! I have a question about your enterprise pricing.',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n\tconv_2: [\n\t\t{\n\t\t\tid: 'msg_3',\n\t\t\tcontent: \"Hello! I'm Tom from the product team.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_4',\n\t\t\tcontent: 'I would love to see a dark mode feature!',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(\n\t\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000 - 30 * 60 * 1000\n\t\t\t).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_5',\n\t\t\tcontent:\n\t\t\t\t\"Great suggestion! That feature will be available next week. I'll let you know when it's ready.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n};\n\nexport const MOCK_HELP_COLLECTIONS = [\n\t{\n\t\tid: 'collection_1',\n\t\ttitle: 'Product Overview',\n\t\tdescription: 'See how your AI-first customer service solution works.',\n\t\tarticleCount: 24,\n\t\ticon: 'ph-book-open',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_2',\n\t\ttitle: 'Getting Started',\n\t\tdescription: 'Everything you need to know to get started with Product7.',\n\t\tarticleCount: 30,\n\t\ticon: 'ph-rocket',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_3',\n\t\ttitle: 'AI Agent',\n\t\tdescription:\n\t\t\t'Resolving customer questions instantly and accurately—from live chat to email.',\n\t\tarticleCount: 82,\n\t\ticon: 'ph-robot',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_4',\n\t\ttitle: 'Channels',\n\t\tdescription:\n\t\t\t'Enabling the channels you use to communicate with customers, all from the Inbox.',\n\t\tarticleCount: 45,\n\t\ticon: 'ph-chat-circle',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_5',\n\t\ttitle: 'Billing & Payments',\n\t\tdescription: 'Manage your subscription, invoices, and payment methods.',\n\t\tarticleCount: 12,\n\t\ticon: 'ph-credit-card',\n\t\turl: '#',\n\t},\n];\n\nexport const MOCK_SURVEYS = [\n\t{\n\t\tid: 'mock_nps_survey',\n\t\ttype: 'nps',\n\t\ttitle: 'How likely are you to recommend us?',\n\t\tdescription: 'Your feedback helps us improve',\n\t\tlow_label: 'Not likely',\n\t\thigh_label: 'Very likely',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n\t{\n\t\tid: 'mock_csat_survey',\n\t\ttype: 'csat',\n\t\ttitle: 'How satisfied are you?',\n\t\tdescription: 'Rate your experience with our product',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n\t{\n\t\tid: 'mock_ces_survey',\n\t\ttype: 'ces',\n\t\ttitle: 'How easy was it?',\n\t\tdescription: 'Rate the ease of completing your task',\n\t\tlow_label: 'Very difficult',\n\t\thigh_label: 'Very easy',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n];\n","export const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function getDeviceInfo() {\n\tif (typeof navigator === 'undefined') {\n\t\treturn { device: null, browser: null, os: null };\n\t}\n\n\tconst ua = navigator.userAgent;\n\n\tlet device = 'desktop';\n\tif (/Mobi|Android/i.test(ua)) {\n\t\tdevice = /Tablet|iPad/i.test(ua) ? 'tablet' : 'mobile';\n\t}\n\n\tlet browser = 'unknown';\n\tif (ua.includes('Firefox')) browser = 'firefox';\n\telse if (ua.includes('Edg')) browser = 'edge';\n\telse if (ua.includes('Chrome')) browser = 'chrome';\n\telse if (ua.includes('Safari')) browser = 'safari';\n\telse if (ua.includes('Opera') || ua.includes('OPR')) browser = 'opera';\n\n\tlet os = 'unknown';\n\tif (ua.includes('Windows')) os = 'windows';\n\telse if (ua.includes('Mac')) os = 'macos';\n\telse if (ua.includes('Linux')) os = 'linux';\n\telse if (ua.includes('Android')) os = 'android';\n\telse if (ua.includes('iPhone') || ua.includes('iPad')) os = 'ios';\n\n\treturn { device, browser, os };\n}\n","import { MOCK_CHANGELOGS } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class ChangelogService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { success: true, data: MOCK_CHANGELOGS };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/changelogs',\n\t\t\t\toptions\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n}\n","import { delay } from '../utils/helpers.js';\n\nexport class FeedbackService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync submitFeedback(feedbackData) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(500);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_post_' + Date.now(),\n\t\t\t\t\ttitle: feedbackData.title,\n\t\t\t\t\tcontent: feedbackData.content,\n\t\t\t\t},\n\t\t\t\tmessage: 'Feedback submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst payload = {\n\t\t\tboard:\n\t\t\t\tfeedbackData.board_id || feedbackData.board || feedbackData.boardId,\n\t\t\ttitle: feedbackData.title,\n\t\t\tcontent: feedbackData.content,\n\t\t\tattachments: feedbackData.attachments || [],\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst response = await this.api._makeRequest('/widget/feedback', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn response;\n\t\t});\n\t}\n}\n","import { MOCK_HELP_COLLECTIONS } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class HelpService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getHelpCollections(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { status: true, data: MOCK_HELP_COLLECTIONS };\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/collections',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync searchHelpArticles(query, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst filtered = MOCK_HELP_COLLECTIONS.filter(\n\t\t\t\t(c) =>\n\t\t\t\t\tc.title.toLowerCase().includes(query.toLowerCase()) ||\n\t\t\t\t\tc.description.toLowerCase().includes(query.toLowerCase())\n\t\t\t);\n\t\t\treturn { status: true, data: filtered };\n\t\t}\n\n\t\tconst params = { q: query, ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/search',\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n}\n","import { MOCK_CONVERSATIONS, MOCK_MESSAGES } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class MessengerService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getMessengerSettings() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tgreeting_message: 'Hi there! How can we help you today?',\n\t\t\t\t\tteam_name: 'Support Team',\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/settings', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_CONVERSATIONS,\n\t\t\t\tmeta: { total: MOCK_CONVERSATIONS.length, page: 1, limit: 20 },\n\t\t\t};\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/messenger/conversations',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversation(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst conv = MOCK_CONVERSATIONS.find((c) => c.id === conversationId);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { ...conv, messages: MOCK_MESSAGES[conversationId] || [] },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}`,\n\t\t\t{\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync startConversation(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ content: data.content }),\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getUnreadCount() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tconst count = MOCK_CONVERSATIONS.reduce(\n\t\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t\t0\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { unread_count: count, unread_conversations: count > 0 ? 1 : 0 },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/unread', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/read`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getMessages(conversationId, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_MESSAGES[conversationId] || [],\n\t\t\t\tmeta: { total: 0, page: 1, limit: 50 },\n\t\t\t};\n\t\t}\n\n\t\tconst params = { ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync identifyContact(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tcontact_id: 'mock_contact_' + Date.now(),\n\t\t\t\t\temail: data.email,\n\t\t\t\t\tname: data.name || '',\n\t\t\t\t\tis_new: true,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/identify', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\temail: data.email,\n\t\t\t\tname: data.name || '',\n\t\t\t\tphone: data.phone || '',\n\t\t\t\tcompany: data.company || '',\n\t\t\t\tavatar_url: data.avatar_url || '',\n\t\t\t\tmetadata: data.metadata || {},\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/typing`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ is_typing: isTyping }),\n\t\t\t}\n\t\t);\n\t}\n}\n","export class SDKError extends Error {\n\tconstructor(message, cause) {\n\t\tsuper(message);\n\t\tthis.name = 'SDKError';\n\t\tthis.cause = cause;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, SDKError);\n\t\t}\n\t}\n}\n\nexport class APIError extends Error {\n\tconstructor(status, message, response) {\n\t\tsuper(message);\n\t\tthis.name = 'APIError';\n\t\tthis.status = status;\n\t\tthis.response = response;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, APIError);\n\t\t}\n\t}\n\n\tisNetworkError() {\n\t\treturn this.status === 0;\n\t}\n\n\tisClientError() {\n\t\treturn this.status >= 400 && this.status < 500;\n\t}\n\n\tisServerError() {\n\t\treturn this.status >= 500 && this.status < 600;\n\t}\n}\n\nexport class WidgetError extends Error {\n\tconstructor(message, widgetType, widgetId) {\n\t\tsuper(message);\n\t\tthis.name = 'WidgetError';\n\t\tthis.widgetType = widgetType;\n\t\tthis.widgetId = widgetId;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, WidgetError);\n\t\t}\n\t}\n}\n\nexport class ConfigError extends Error {\n\tconstructor(message, configKey) {\n\t\tsuper(message);\n\t\tthis.name = 'ConfigError';\n\t\tthis.configKey = configKey;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ConfigError);\n\t\t}\n\t}\n}\n\nexport class ValidationError extends Error {\n\tconstructor(message, field, value) {\n\t\tsuper(message);\n\t\tthis.name = 'ValidationError';\n\t\tthis.field = field;\n\t\tthis.value = value;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ValidationError);\n\t\t}\n\t}\n}\n\nexport class ErrorHandler {\n\tconstructor(debug = false) {\n\t\tthis.debug = debug;\n\t}\n\n\thandle(error, context = '') {\n\t\tconst errorInfo = {\n\t\t\tname: error.name,\n\t\t\tmessage: error.message,\n\t\t\tcontext,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (error instanceof APIError) {\n\t\t\terrorInfo.status = error.status;\n\t\t\terrorInfo.type = 'api';\n\t\t} else if (error instanceof WidgetError) {\n\t\t\terrorInfo.widgetType = error.widgetType;\n\t\t\terrorInfo.widgetId = error.widgetId;\n\t\t\terrorInfo.type = 'widget';\n\t\t} else if (error instanceof ConfigError) {\n\t\t\terrorInfo.configKey = error.configKey;\n\t\t\terrorInfo.type = 'config';\n\t\t} else if (error instanceof ValidationError) {\n\t\t\terrorInfo.field = error.field;\n\t\t\terrorInfo.value = error.value;\n\t\t\terrorInfo.type = 'validation';\n\t\t} else {\n\t\t\terrorInfo.type = 'unknown';\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tconsole.error('[FeedbackSDK Error]', errorInfo, error);\n\t\t} else {\n\t\t\tconsole.error('[FeedbackSDK Error]', error.message);\n\t\t}\n\n\t\treturn errorInfo;\n\t}\n\n\tgetUserMessage(error) {\n\t\tif (error instanceof APIError) {\n\t\t\tif (error.isNetworkError()) {\n\t\t\t\treturn 'Network error. Please check your connection and try again.';\n\t\t\t} else if (error.isClientError()) {\n\t\t\t\treturn 'Invalid request. Please check your input and try again.';\n\t\t\t} else if (error.isServerError()) {\n\t\t\t\treturn 'Server error. Please try again later.';\n\t\t\t}\n\t\t\treturn 'Failed to submit feedback. Please try again.';\n\t\t}\n\n\t\tif (error instanceof ValidationError) {\n\t\t\treturn `Please check your ${error.field}: ${error.message}`;\n\t\t}\n\n\t\tif (error instanceof ConfigError) {\n\t\t\treturn 'Configuration error. Please check your SDK setup.';\n\t\t}\n\n\t\tif (error instanceof WidgetError) {\n\t\t\treturn 'Widget error. Please try refreshing the page.';\n\t\t}\n\n\t\treturn 'An unexpected error occurred. Please try again.';\n\t}\n}\n","import { APIError } from '../../utils/errors.js';\nimport { MOCK_SURVEYS } from '../mock-data';\nimport { delay, getDeviceInfo } from '../utils/helpers.js';\n\nexport class SurveyService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { success: true, data: MOCK_SURVEYS };\n\t\t}\n\n\t\tconst params = {\n\t\t\turl:\n\t\t\t\tcontext.url ||\n\t\t\t\t(typeof window !== 'undefined' ? window.location.href : ''),\n\t\t\t...getDeviceInfo(),\n\t\t\t...(context.userProperties && {\n\t\t\t\tuser_properties: context.userProperties,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/surveys/active',\n\t\t\t\tparams\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_response_' + Date.now(),\n\t\t\t\t\tsurvey_id: surveyId,\n\t\t\t\t\t...responseData,\n\t\t\t\t},\n\t\t\t\tmessage: 'Survey response submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst payload = {\n\t\t\trating: responseData.rating,\n\t\t\tfeedback: responseData.feedback || '',\n\t\t\tanswers: responseData.answers || {},\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/responses`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(100);\n\t\t\treturn { success: true, message: 'Survey dismissed successfully' };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/dismiss`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n}\n","import { APIError } from '../utils/errors.js';\n\nexport class BaseAPIService {\n\tconstructor(config = {}) {\n\t\tthis.workspace = config.workspace;\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.userContext = config.userContext || null;\n\t\tthis.mock = config.mock || false;\n\t\tthis.env = config.env || 'production';\n\t\tthis.baseURL = this._getBaseURL(config);\n\n\t\tthis._loadStoredSession();\n\t}\n\n\t_getBaseURL(config) {\n\t\tif (config.apiUrl) return config.apiUrl;\n\n\t\tconst ENV_URLS = {\n\t\t\tproduction: {\n\t\t\t\tbase: 'https://api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tstaging: {\n\t\t\t\tbase: 'https://staging.api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.staging.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tlocalstack: {\n\t\t\t\tbase: 'http://localhost:1323/api/v1',\n\t\t\t\twithWorkspace: (ws) => `http://${ws}.localhost:1323/api/v1`,\n\t\t\t},\n\t\t};\n\n\t\tconst envConfig = ENV_URLS[this.env] || ENV_URLS.production;\n\t\treturn this.workspace\n\t\t\t? envConfig.withWorkspace(this.workspace)\n\t\t\t: envConfig.base;\n\t}\n\n\tasync init(userContext = null) {\n\t\tif (userContext) {\n\t\t\tthis.userContext = userContext;\n\t\t}\n\n\t\tif (this.isSessionValid()) {\n\t\t\treturn { sessionToken: this.sessionToken };\n\t\t}\n\n\t\tif (!this.workspace || !this.userContext) {\n\t\t\tthrow new APIError(\n\t\t\t\t400,\n\t\t\t\t`Missing ${!this.workspace ? 'workspace' : 'user context'} for initialization`\n\t\t\t);\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn this._initMockSession();\n\t\t}\n\n\t\treturn this._initRealSession();\n\t}\n\n\tasync _initMockSession() {\n\t\tthis.sessionToken = 'mock_session_' + Date.now();\n\t\tthis.sessionExpiry = new Date(Date.now() + 3600 * 1000);\n\t\tthis._storeSession();\n\t\treturn {\n\t\t\tsessionToken: this.sessionToken,\n\t\t\tconfig: {\n\t\t\t\tprimaryColor: '#21244A',\n\t\t\t\tbackgroundColor: '#ffffff',\n\t\t\t\ttextColor: '#1F2937',\n\t\t\t\tboardId: 'feature-requests',\n\t\t\t\tsize: 'medium',\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t},\n\t\t\texpiresIn: 3600,\n\t\t};\n\t}\n\n\tasync _initRealSession() {\n\t\tconst payload = {\n\t\t\tworkspace: this.workspace,\n\t\t\tuser: this.userContext,\n\t\t};\n\n\t\ttry {\n\t\t\tconst response = await this._makeRequest('/widget/init', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\n\t\t\tthis.sessionToken = response.session_token;\n\t\t\tthis.sessionExpiry = new Date(Date.now() + response.expires_in * 1000);\n\t\t\tthis._storeSession();\n\n\t\t\treturn {\n\t\t\t\tsessionToken: this.sessionToken,\n\t\t\t\tconfig: response.config || {},\n\t\t\t\texpiresIn: response.expires_in,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new APIError(\n\t\t\t\terror.status || 500,\n\t\t\t\t`Failed to initialize widget: ${error.message}`,\n\t\t\t\terror.response\n\t\t\t);\n\t\t}\n\t}\n\n\tasync _ensureSession() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\t\tif (!this.sessionToken) {\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\t}\n\n\tasync _handleAuthRetry(method, ...args) {\n\t\ttry {\n\t\t\treturn await method.apply(this, args);\n\t\t} catch (error) {\n\t\t\tif (error.status === 401) {\n\t\t\t\tthis.sessionToken = null;\n\t\t\t\tthis.sessionExpiry = null;\n\t\t\t\tawait this.init();\n\t\t\t\treturn await method.apply(this, args);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tisSessionValid() {\n\t\treturn (\n\t\t\tthis.sessionToken && this.sessionExpiry && new Date() < this.sessionExpiry\n\t\t);\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.userContext = userContext;\n\t\tthis._storeData('feedbackSDK_userContext', userContext);\n\t}\n\n\tgetUserContext() {\n\t\treturn this.userContext;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis._removeData('feedbackSDK_session');\n\t\tthis._removeData('feedbackSDK_userContext');\n\t}\n\n\t_storeSession() {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\ttry {\n\t\t\tconst sessionData = {\n\t\t\t\ttoken: this.sessionToken,\n\t\t\t\texpiry: this.sessionExpiry.toISOString(),\n\t\t\t\tworkspace: this.workspace,\n\t\t\t};\n\t\t\tthis._storeData('feedbackSDK_session', sessionData);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_storeData(key, value) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t}\n\t}\n\n\t_removeData(key) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) throw error;\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst queryParams = new URLSearchParams();\n\t\tObject.entries(params).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tqueryParams.append(\n\t\t\t\t\tkey,\n\t\t\t\t\ttypeof value === 'object' ? JSON.stringify(value) : value\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\treturn queryParams.toString();\n\t}\n\n\t_getEndpointWithParams(endpoint, params) {\n\t\tconst queryString = this._buildQueryParams(params);\n\t\treturn `${endpoint}${queryString ? '?' + queryString : ''}`;\n\t}\n}\n","import { ChangelogService } from '../api/services/ChangelogService.js';\nimport { FeedbackService } from '../api/services/FeedbackService.js';\nimport { HelpService } from '../api/services/HelpService.js';\nimport { MessengerService } from '../api/services/MessengerService.js';\nimport { SurveyService } from '../api/services/SurveyService.js';\nimport { BaseAPIService } from './BaseAPIService.js';\n\nexport class APIService extends BaseAPIService {\n\tconstructor(config = {}) {\n\t\tsuper(config);\n\n\t\tthis.feedback = new FeedbackService(this);\n\t\tthis.survey = new SurveyService(this);\n\t\tthis.messenger = new MessengerService(this);\n\t\tthis.help = new HelpService(this);\n\t\tthis.changelog = new ChangelogService(this);\n\t}\n\n\tasync submitFeedback(data) {\n\t\treturn this.feedback.submitFeedback(data);\n\t}\n\n\tasync getActiveSurveys(context) {\n\t\treturn this.survey.getActiveSurveys(context);\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\treturn this.survey.submitSurveyResponse(surveyId, responseData);\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\treturn this.survey.dismissSurvey(surveyId);\n\t}\n\n\tasync getMessengerSettings() {\n\t\treturn this.messenger.getMessengerSettings();\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.messenger.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.messenger.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.messenger.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tconsole.log('[APIService] startConversation: session invalid, calling init...');\n\t\t\ttry {\n\t\t\t\tawait this.init();\n\t\t\t\tconsole.log('[APIService] startConversation: init result, token:', this.sessionToken ? 'set' : 'null');\n\t\t\t} catch (initError) {\n\t\t\t\tconsole.error('[APIService] startConversation: init failed:', initError.message);\n\t\t\t\tthrow initError;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.error('[APIService] startConversation: no session token after init');\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\n\t\tconsole.log('[APIService] startConversation: sending to', `${this.baseURL}/widget/messenger/conversations`, 'mock:', this.mock);\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\tconst payload = { content: data.content };\n\t\tif (data.attachments && data.attachments.length > 0) {\n\t\t\tpayload.attachments = data.attachments;\n\t\t}\n\n\t\treturn this._makeRequest(`/widget/messenger/conversations/${conversationId}/messages`, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\t}\n\n\t/**\n\t * Upload a file to CDN via widget endpoint\n\t * @param {string} base64Data - Base64 encoded file data (with or without data URI prefix)\n\t * @param {string} filename - Original filename\n\t * @returns {Promise<Object>} Response with url\n\t */\n\tasync uploadFile(base64Data, filename) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.messenger.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.messenger.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.messenger.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.messenger.submitRating(conversationId, data);\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.messenger.identifyContact(data);\n\t}\n\n\tasync getHelpCollections(options) {\n\t\treturn this.help.getHelpCollections(options);\n\t}\n\n\tasync searchHelpArticles(query, options) {\n\t\treturn this.help.searchHelpArticles(query, options);\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\n\t\t\t// Invalidate mock tokens when not in mock mode (and vice versa)\n\t\t\tconst isMockToken = sessionData.token && sessionData.token.startsWith('mock_');\n\t\t\tif (isMockToken !== this.mock) {\n\t\t\t\tlocalStorage.removeItem('feedbackSDK_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[FeedbackSDK] Event callback error:', error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tonce(event, callback) {\n\t\tconst unsubscribe = this.on(event, (data) => {\n\t\t\tcallback(data);\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn unsubscribe;\n\t}\n\n\tclear() {\n\t\tthis.events.clear();\n\t}\n\n\tgetListenerCount(event) {\n\t\tconst callbacks = this.events.get(event);\n\t\treturn callbacks ? callbacks.length : 0;\n\t}\n}\n","export function generateId(prefix = 'feedback') {\n\tconst timestamp = Date.now();\n\tconst random = Math.random().toString(36).substring(2, 9);\n\treturn `${prefix}_${timestamp}_${random}`;\n}\n\nexport function deepMerge(target, source) {\n\tconst result = { ...target };\n\n\tfor (const key in source) {\n\t\tif (source.hasOwnProperty(key)) {\n\t\t\tif (\n\t\t\t\tsource[key] &&\n\t\t\t\ttypeof source[key] === 'object' &&\n\t\t\t\t!Array.isArray(source[key])\n\t\t\t) {\n\t\t\t\tresult[key] = deepMerge(target[key] || {}, source[key]);\n\t\t\t} else {\n\t\t\t\tresult[key] = source[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function executedFunction(...args) {\n\t\tconst later = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tfunc(...args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n\nexport function throttle(func, limit) {\n\tlet lastFunc;\n\tlet lastRan;\n\treturn function (...args) {\n\t\tif (!lastRan) {\n\t\t\tfunc(...args);\n\t\t\tlastRan = Date.now();\n\t\t} else {\n\t\t\tclearTimeout(lastFunc);\n\t\t\tlastFunc = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (Date.now() - lastRan >= limit) {\n\t\t\t\t\t\tfunc(...args);\n\t\t\t\t\t\tlastRan = Date.now();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlimit - (Date.now() - lastRan)\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isValidEmail(email) {\n\tif (!email || typeof email !== 'string') return false;\n\n\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\treturn emailRegex.test(email.trim());\n}\n\nexport function sanitizeHTML(str) {\n\tif (!str || typeof str !== 'string') return '';\n\n\tconst div = document.createElement('div');\n\tdiv.textContent = str;\n\treturn div.innerHTML;\n}\n\nexport function getCSSProperty(element, property, fallback = '') {\n\tif (!element || !property) return fallback;\n\n\ttry {\n\t\tconst style = window.getComputedStyle(element);\n\t\treturn style.getPropertyValue(property) || fallback;\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function isInViewport(element) {\n\tif (!element) return false;\n\n\tconst rect = element.getBoundingClientRect();\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <=\n\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t);\n}\n\nexport function scrollToElement(element, options = {}) {\n\tif (!element) return;\n\n\tconst defaultOptions = {\n\t\tbehavior: 'smooth',\n\t\tblock: 'center',\n\t\tinline: 'nearest',\n\t};\n\n\telement.scrollIntoView({ ...defaultOptions, ...options });\n}\n\nexport function getBrowserInfo() {\n\tconst userAgent = navigator.userAgent;\n\tconst platform = navigator.platform;\n\n\treturn {\n\t\tuserAgent,\n\t\tplatform,\n\t\tlanguage: navigator.language || navigator.userLanguage,\n\t\tcookieEnabled: navigator.cookieEnabled,\n\t\tscreenResolution: `${screen.width}x${screen.height}`,\n\t\twindowSize: `${window.innerWidth}x${window.innerHeight}`,\n\t\ttimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t};\n}\n\nexport function formatFileSize(bytes) {\n\tif (bytes === 0) return '0 Bytes';\n\n\tconst k = 1024;\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function delay(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function safeJsonParse(str, fallback = null) {\n\ttry {\n\t\treturn JSON.parse(str);\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function escapeRegex(string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getNestedProperty(obj, path, defaultValue = undefined) {\n\tif (!obj || !path) return defaultValue;\n\n\tconst keys = path.split('.');\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (current === null || current === undefined || !(key in current)) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\treturn current;\n}\n\nexport function setNestedProperty(obj, path, value) {\n\tif (!obj || !path) return obj;\n\n\tconst keys = path.split('.');\n\tconst lastKey = keys.pop();\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (!(key in current) || typeof current[key] !== 'object') {\n\t\t\tcurrent[key] = {};\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\tcurrent[lastKey] = value;\n\treturn obj;\n}\n\nexport function isBrowser() {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isMobile() {\n\tif (!isBrowser()) return false;\n\n\treturn (\n\t\t/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n\t\t\tnavigator.userAgent\n\t\t) || window.innerWidth <= 768\n\t);\n}\n\nexport function getCurrentTimestamp() {\n\treturn new Date().toISOString();\n}\n\nexport function validateConfig(config, required = []) {\n\tconst missing = [];\n\n\tfor (const key of required) {\n\t\tif (!config[key]) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tif (missing.length > 0) {\n\t\tthrow new Error(`Missing required configuration: ${missing.join(', ')}`);\n\t}\n\n\treturn true;\n}\n","export class BaseWidget {\n\tstatic STORAGE_KEY = 'feedback_submitted';\n\tstatic DEFAULT_COOLDOWN_DAYS = 30;\n\n\tconstructor(options = {}) {\n\t\tthis.id = options.id;\n\t\tthis.sdk = options.sdk;\n\t\tthis.apiService = options.apiService;\n\t\tthis.type = options.type || 'base';\n\n\t\tthis.options = {\n\t\t\tcontainer: null,\n\t\t\tposition: this.sdk.config.position,\n\t\t\tboardId: this.sdk.config.boardId,\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\ttextColor: options.textColor || '#1F2937',\n\t\t\tautoShow: false,\n\t\t\tshowBackdrop: true,\n\t\t\tcustomStyles: {},\n\t\t\tsuppressAfterSubmission: true,\n\t\t\tsuppressionDays: BaseWidget.DEFAULT_COOLDOWN_DAYS,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.element = null;\n\t\tthis.panelElement = null;\n\t\tthis.backdropElement = null;\n\t\tthis.mounted = false;\n\t\tthis.destroyed = false;\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t\tisSubmitting: false,\n\t\t\ttitle: '',\n\t\t\tcontent: '',\n\t\t\temail: '',\n\t\t\tattachments: [],\n\t\t\terrors: {},\n\t\t};\n\n\t\tthis._bindMethods();\n\t}\n\n\tmount(container) {\n\t\tif (this.mounted || this.destroyed) return this;\n\n\t\tif (this.options.suppressAfterSubmission && this._hasRecentlySubmitted()) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\treason: 'recently_submitted',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof container === 'string') {\n\t\t\tcontainer = document.querySelector(container);\n\t\t}\n\n\t\tif (!container) {\n\t\t\tcontainer = document.body;\n\t\t}\n\n\t\tthis.container = container;\n\t\tthis.element = this._render();\n\t\tthis.container.appendChild(this.element);\n\n\t\tthis.mounted = true;\n\t\tthis._attachEvents();\n\t\tthis.onMount();\n\n\t\tif (this.options.autoShow) {\n\t\t\tthis.show();\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('widget:mounted', { widget: this });\n\t\treturn this;\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t\treturn this;\n\t}\n\n\topenPanel() {\n\t\tthis.state.isOpen = true;\n\n\t\tif (this.options.displayMode === 'modal') {\n\t\t\tthis._showLoadingModal();\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._hideLoadingModal();\n\t\t\t\tthis._renderPanel();\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tif (this.panelElement) {\n\t\t\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t\t\t}\n\t\t\t\t\tif (this.backdropElement) {\n\t\t\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, 600);\n\t\t} else {\n\t\t\tthis._renderPanel();\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (this.panelElement) {\n\t\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t\t}\n\t\t\t\tif (this.backdropElement) {\n\t\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t_showLoadingModal() {\n\t\tthis.state.isLoading = true;\n\n\t\tthis.backdropElement = document.createElement('div');\n\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\tthis.loadingElement = document.createElement('div');\n\t\tthis.loadingElement.className = 'feedback-loading-modal';\n\t\tthis.loadingElement.innerHTML = `\n\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t`;\n\t\tdocument.body.appendChild(this.loadingElement);\n\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.backdropElement.classList.add('show');\n\t\t\tthis.loadingElement.classList.add('show');\n\t\t});\n\t}\n\n\t_hideLoadingModal() {\n\t\tthis.state.isLoading = false;\n\t\tif (this.loadingElement) {\n\t\t\tthis.loadingElement.remove();\n\t\t\tthis.loadingElement = null;\n\t\t}\n\t}\n\n\tclosePanel() {\n\t\tif (this.panelElement) {\n\t\t\tthis.panelElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.panelElement && this.panelElement.parentNode) {\n\t\t\t\tthis.panelElement.parentNode.removeChild(this.panelElement);\n\t\t\t\tthis.panelElement = null;\n\t\t\t}\n\t\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\t\tthis.backdropElement = null;\n\t\t\t}\n\t\t\tthis._resetForm();\n\t\t}, 300);\n\t}\n\n\tasync submitFeedback() {\n\t\tif (this.state.isSubmitting) return;\n\n\t\tthis._hideError();\n\n\t\ttry {\n\t\t\tthis.state.isSubmitting = true;\n\t\t\tthis._updateSubmitButton();\n\n\t\t\tconst payload = {\n\t\t\t\ttitle: this.state.title || 'Feedback',\n\t\t\t\tcontent: this.state.content,\n\t\t\t\temail: this.state.email,\n\t\t\t\tboard_id: this.options.boardId,\n\t\t\t\tattachments: this.state.attachments,\n\t\t\t};\n\n\t\t\tif (!this.state.content.trim()) {\n\t\t\t\tthis._showError('Please enter your feedback message.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst response = await this.apiService.submitFeedback(payload);\n\n\t\t\tthis._trackSubmission();\n\n\t\t\tthis._showSuccessMessage();\n\t\t\tthis.closePanel();\n\n\t\t\tthis.sdk.eventBus.emit('feedback:submitted', {\n\t\t\t\twidget: this,\n\t\t\t\tfeedback: response,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._showError('Failed to submit feedback. Please try again.');\n\t\t\tthis.sdk.eventBus.emit('feedback:error', { widget: this, error });\n\t\t} finally {\n\t\t\tthis.state.isSubmitting = false;\n\t\t\tthis._updateSubmitButton();\n\t\t}\n\t}\n\n\thandleConfigUpdate(newConfig) {\n\t\tthis.options.theme = newConfig.theme;\n\t\tif (this.element) {\n\t\t\tthis._updateTheme();\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.destroyed) return;\n\n\t\tthis.onDestroy();\n\t\tthis.closePanel();\n\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\n\t\tthis.destroyed = true;\n\t\tthis.mounted = false;\n\t\tthis.sdk.eventBus.emit('widget:destroyed', { widget: this });\n\t}\n\n\tonMount() {}\n\tonDestroy() {}\n\n\t_trackSubmission() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst data = {\n\t\t\t\tsubmittedAt: Date.now(),\n\t\t\t\tboardId: this.options.boardId,\n\t\t\t};\n\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(data));\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to track feedback submission:', e);\n\t\t}\n\t}\n\n\t_hasRecentlySubmitted() {\n\t\tconst cooldownMs = this.options.suppressionDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.sdk.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.sdk.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\tconst submittedAt = data.submittedAt;\n\n\t\t\treturn now - submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearSubmissionTracking() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear submission tracking:', e);\n\t\t}\n\t}\n\n\tshouldShow() {\n\t\tif (!this.options.suppressAfterSubmission) return true;\n\t\treturn !this._hasRecentlySubmitted();\n\t}\n\n\t_render() {\n\t\tthrow new Error('_render() must be implemented by concrete widget');\n\t}\n\n\t_attachEvents() {\n\t\t// Override in concrete widgets\n\t}\n\n\t_bindMethods() {\n\t\tthis.openPanel = this.openPanel.bind(this);\n\t\tthis.closePanel = this.closePanel.bind(this);\n\t\tthis.submitFeedback = this.submitFeedback.bind(this);\n\t}\n\n\t_renderPanel() {\n\t\tif (this.panelElement) return;\n\n\t\tif (this.options.showBackdrop && !this.backdropElement) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\t\tthis.backdropElement.addEventListener('click', this.closePanel);\n\t\t}\n\n\t\tconst modeClass =\n\t\t\tthis.options.displayMode === 'modal'\n\t\t\t\t? 'feedback-modal'\n\t\t\t\t: 'feedback-panel';\n\t\tconst sizeClass = `size-${this.options.size}`;\n\t\tthis.panelElement = document.createElement('div');\n\t\tthis.panelElement.className = `${modeClass} ${sizeClass}`;\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--primary-color',\n\t\t\tthis.options.primaryColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--bg-color',\n\t\t\tthis.options.backgroundColor\n\t\t);\n\t\tthis.panelElement.style.setProperty('--text-color', this.options.textColor);\n\t\tthis.panelElement.innerHTML = this._getPanelHTML();\n\n\t\tdocument.body.appendChild(this.panelElement);\n\t\tthis._attachPanelEvents();\n\n\t\tconst firstInput = this.panelElement.querySelector('input, textarea');\n\t\tif (firstInput) {\n\t\t\tsetTimeout(() => firstInput.focus(), 350);\n\t\t}\n\t}\n\n\t_getPanelHTML() {\n\t\treturn `\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-header\">\n <h3>Send Feedback</h3>\n <button class=\"sdk-close-btn\" type=\"button\" aria-label=\"Close\">×</button>\n </div>\n <div class=\"feedback-panel-body\">\n <form class=\"feedback-form\">\n <div class=\"sdk-form-group\">\n <label class=\"sdk-label\" for=\"feedback-title-${this.id}\">Title (optional)</label>\n <input \n type=\"text\" \n id=\"feedback-title-${this.id}\" \n name=\"title\" \n class=\"sdk-input\"\n placeholder=\"Brief description of your feedback\"\n value=\"${this.state.title}\"\n />\n </div>\n <div class=\"sdk-form-group\">\n <label class=\"sdk-label\" for=\"feedback-content-${this.id}\">Message *</label>\n <textarea \n id=\"feedback-content-${this.id}\" \n name=\"content\" \n class=\"sdk-textarea\"\n placeholder=\"Tell us what you think...\"\n required\n >${this.state.content}</textarea>\n </div>\n <div class=\"feedback-error\" role=\"alert\"></div>\n <div class=\"feedback-form-actions\">\n <button type=\"submit\" class=\"sdk-btn-primary sdk-btn-block\">\n ${this.state.isSubmitting ? 'Sending...' : 'Send Feedback'}\n </button>\n </div>\n </form>\n </div>\n </div>\n `;\n\t}\n\n\t_attachPanelEvents() {\n\t\tconst panel = this.panelElement;\n\n\t\tpanel\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', this.closePanel);\n\n\t\tconst form = panel.querySelector('.feedback-form');\n\t\tform.addEventListener('submit', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.submitFeedback();\n\t\t});\n\n\t\tpanel\n\t\t\t.querySelector('input[name=\"title\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.title = e.target.value;\n\t\t\t});\n\n\t\tpanel\n\t\t\t.querySelector('textarea[name=\"content\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.content = e.target.value;\n\t\t\t});\n\n\t\tconst handleEscape = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.closePanel();\n\t\t\t\tdocument.removeEventListener('keydown', handleEscape);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleEscape);\n\t}\n\n\t_updateSubmitButton() {\n\t\tif (this.panelElement) {\n\t\t\tconst submitBtn = this.panelElement.querySelector('.sdk-btn-primary');\n\t\t\tif (submitBtn) {\n\t\t\t\tsubmitBtn.textContent = this.state.isSubmitting\n\t\t\t\t\t? 'Sending...'\n\t\t\t\t\t: 'Send Feedback';\n\t\t\t\tsubmitBtn.disabled = this.state.isSubmitting;\n\t\t\t}\n\t\t}\n\t}\n\n\t_showError(message) {\n\t\tif (this.panelElement) {\n\t\t\tconst errorElement = this.panelElement.querySelector('.feedback-error');\n\t\t\tif (errorElement) {\n\t\t\t\terrorElement.textContent = message;\n\t\t\t\terrorElement.classList.add('show');\n\t\t\t}\n\t\t}\n\t}\n\n\t_hideError() {\n\t\tif (this.panelElement) {\n\t\t\tconst errorElement = this.panelElement.querySelector('.feedback-error');\n\t\t\tif (errorElement) {\n\t\t\t\terrorElement.classList.remove('show');\n\t\t\t}\n\t\t}\n\t}\n\n\t_showSuccessMessage() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className = 'sdk-notification sdk-notification-success';\n\t\tnotification.innerHTML = `\n <div class=\"sdk-notification-content\">\n <div class=\"sdk-notification-icon\">✓</div>\n <span class=\"sdk-notification-text\">Feedback submitted successfully!</span>\n <button class=\"sdk-close-btn\" aria-label=\"Close\">×</button>\n </div>\n `;\n\n\t\tdocument.body.appendChild(notification);\n\n\t\tconst closeBtn = notification.querySelector('.sdk-close-btn');\n\t\tconst closeNotification = () => {\n\t\t\tif (notification.parentNode) {\n\t\t\t\tnotification.style.opacity = '0';\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (notification.parentNode) {\n\t\t\t\t\t\tnotification.parentNode.removeChild(notification);\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t};\n\n\t\tcloseBtn.addEventListener('click', closeNotification);\n\n\t\tsetTimeout(closeNotification, 4000);\n\t}\n\n\t_resetForm() {\n\t\tthis.state.title = '';\n\t\tthis.state.content = '';\n\t\tthis.state.email = '';\n\t\tthis.state.errors = {};\n\t}\n\n\t_updateTheme() {\n\t\t// No longer needed - single theme\n\t}\n\n\topenModal() {\n\t\tthis.openPanel();\n\t}\n\n\tcloseModal() {\n\t\tthis.closePanel();\n\t}\n}","import { BaseWidget } from './BaseWidget.js';\n\nexport class ButtonWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'button' });\n\t\tthis.isMinimized = false;\n\t}\n\n\t_render() {\n\t\tconst button = document.createElement('div');\n\t\tbutton.className = `feedback-widget-button position-${this.options.position}`;\n\t\tbutton.innerHTML = `\n <button class=\"feedback-trigger-btn\" type=\"button\">\n <svg class=\"feedback-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" fill=\"currentColor\">\n <path d=\"M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z\"/>\n </svg>\n <span class=\"feedback-text\">Feedback</span>\n \n <div class=\"feedback-minimize-icon\">\n <svg viewBox=\"0 0 256 256\">\n <path d=\"M213.66,53.66,163.31,104H192a8,8,0,0,1,0,16H144a8,8,0,0,1-8-8V64a8,8,0,0,1,16,0V92.69l50.34-50.35a8,8,0,0,1,11.32,11.32ZM112,136H64a8,8,0,0,0,0,16H92.69L42.34,202.34a8,8,0,0,0,11.32,11.32L104,163.31V192a8,8,0,0,0,16,0V144A8,8,0,0,0,112,136Z\"/>\n </svg>\n </div>\n \n <div class=\"feedback-expand-icon\">\n <svg viewBox=\"0 0 256 256\">\n <path d=\"M112,40V64.69L61.66,14.34A8,8,0,0,0,50.34,25.66L100.69,76H72a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V36A8,8,0,0,0,112,40Zm131.06,70.61a8,8,0,0,0-8.72,1.73L184,162.69V136a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H195.31l50.35-50.34A8,8,0,0,0,243.06,110.61Z\"/>\n </svg>\n </div>\n </button>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(button.style, this.options.customStyles);\n\t\t}\n\n\t\treturn button;\n\t}\n\n\t_attachEvents() {\n\t\tconst button = this.element.querySelector('.feedback-trigger-btn');\n\t\tconst minimizeIcon = this.element.querySelector('.feedback-minimize-icon');\n\t\tconst expandIcon = this.element.querySelector('.feedback-expand-icon');\n\n\t\tminimizeIcon.addEventListener('click', (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tthis.minimize();\n\t\t});\n\n\t\texpandIcon.addEventListener('click', (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tthis.restore();\n\t\t});\n\n\t\tbutton.addEventListener('click', (e) => {\n\t\t\tif (\n\t\t\t\te.target.closest('.feedback-minimize-icon') ||\n\t\t\t\te.target.closest('.feedback-expand-icon')\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.isMinimized) {\n\t\t\t\tthis.openPanel();\n\t\t\t}\n\t\t});\n\t}\n\n\tminimize() {\n\t\tthis.isMinimized = true;\n\t\tthis.element.classList.add('minimized');\n\t}\n\n\trestore() {\n\t\tthis.isMinimized = false;\n\t\tthis.element.classList.remove('minimized');\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\t}\n\n\tupdateText(text) {\n\t\tconst textEl = this.element?.querySelector('.feedback-text');\n\t\tif (textEl) {\n\t\t\ttextEl.textContent = text;\n\t\t}\n\t}\n\n\tupdatePosition(position) {\n\t\tthis.options.position = position;\n\t\tif (this.element) {\n\t\t\tthis.element.className = this.element.className.replace(\n\t\t\t\t/position-\\w+-\\w+/,\n\t\t\t\t`position-${position}`\n\t\t\t);\n\t\t}\n\t}\n}","import { BaseWidget } from './BaseWidget.js';\n\nexport class ChangelogWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'changelog' });\n\t\tthis.changelogs = [];\n\t\tthis.isLoading = false;\n\t\tthis.modalElement = null;\n\t\tthis.sidebarElement = null;\n\t\tthis.currentIndex = 0;\n\t}\n\n\t_render() {\n\t\tconst trigger = document.createElement('div');\n\t\ttrigger.className = `changelog-widget position-${this.options.position}`;\n\t\ttrigger.innerHTML = `\n\t\t\t<button class=\"changelog-trigger-btn\" type=\"button\" aria-label=\"View Updates\">\n\t\t\t\t<svg class=\"changelog-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n\t\t\t\t\t<path d=\"M5.8 21L7.4 14L2 9.2L9.2 8.6L12 2L14.8 8.6L22 9.2L16.6 14L18.2 21L12 17.3L5.8 21Z\"/>\n\t\t\t\t</svg>\n\t\t\t\t<span class=\"changelog-text\">${this.options.triggerText || \"What's New\"}</span>\n\t\t\t\t<span class=\"changelog-confetti-emoji\">🎉</span>\n\t\t\t\t${this.options.showBadge ? '<span class=\"changelog-badge\"></span>' : ''}\n\t\t\t</button>\n\t\t`;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(trigger.style, this.options.customStyles);\n\t\t}\n\n\t\treturn trigger;\n\t}\n\n\t_attachEvents() {\n\t\tconst button = this.element.querySelector('.changelog-trigger-btn');\n\t\tbutton.addEventListener('click', () => {\n\t\t\tthis.openSidebar();\n\t\t});\n\t}\n\n\tasync openModal() {\n\t\tif (this.modalElement) return;\n\n\t\tthis.state.isOpen = true;\n\t\tthis._createModal();\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tawait this._loadChangelogs();\n\t\t}\n\n\t\tthis.currentIndex = 0;\n\t\tthis._renderCurrentChangelog();\n\n\t\tdocument.body.style.overflow = 'hidden';\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.modalElement) {\n\t\t\t\tthis.modalElement.classList.add('open');\n\t\t\t}\n\t\t\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\tcloseModal() {\n\t\tdocument.body.style.overflow = '';\n\n\t\tif (this.modalElement) {\n\t\t\tthis.modalElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.modalElement && this.modalElement.parentNode) {\n\t\t\t\tthis.modalElement.parentNode.removeChild(this.modalElement);\n\t\t\t\tthis.modalElement = null;\n\t\t\t}\n\t\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\t\tthis.backdropElement = null;\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\t_createModal() {\n\t\tthis.backdropElement = document.createElement('div');\n\t\tthis.backdropElement.className = 'changelog-modal-backdrop';\n\t\tdocument.body.appendChild(this.backdropElement);\n\t\tthis.backdropElement.addEventListener('click', () => this.closeModal());\n\n\t\tthis.modalElement = document.createElement('div');\n\t\tthis.modalElement.className = 'changelog-modal';\n\t\tthis.modalElement.innerHTML = `\n\t\t\t<div class=\"changelog-modal-container\">\n\t\t\t\t<button class=\"changelog-modal-close\" type=\"button\" aria-label=\"Close\">×</button>\n\t\t\t\t<div class=\"changelog-modal-content\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.modalElement);\n\n\t\tthis.modalElement\n\t\t\t.querySelector('.changelog-modal-container')\n\t\t\t.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\tthis.modalElement\n\t\t\t.querySelector('.changelog-modal-close')\n\t\t\t.addEventListener('click', () => this.closeModal());\n\n\t\tthis._escapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.closeModal();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', this._escapeHandler);\n\t}\n\n\tasync openSidebar() {\n\t\tif (this.listModalElement) return;\n\n\t\tif (this.modalElement) {\n\t\t\tthis.closeModal();\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 350));\n\t\t}\n\n\t\tthis.state.isOpen = true;\n\t\tthis._createListModal();\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tawait this._loadChangelogs();\n\t\t}\n\n\t\tthis._renderChangelogList();\n\n\t\tdocument.body.style.overflow = 'hidden';\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.listModalElement) {\n\t\t\t\tthis.listModalElement.classList.add('open');\n\t\t\t\tthis._showConfetti();\n\t\t\t}\n\t\t\tif (this.listModalBackdropElement) {\n\t\t\t\tthis.listModalBackdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\t_showConfetti() {\n\t\tconst colors = [\n\t\t\t'#FF6B6B',\n\t\t\t'#4ECDC4',\n\t\t\t'#FFE66D',\n\t\t\t'#95E1D3',\n\t\t\t'#F38181',\n\t\t\t'#AA96DA',\n\t\t\t'#FCBAD3',\n\t\t\t'#A8D8EA',\n\t\t];\n\t\tconst confettiCount = 50;\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'changelog-confetti-container';\n\t\tdocument.body.appendChild(container);\n\n\t\tfor (let i = 0; i < confettiCount; i++) {\n\t\t\tconst confetti = document.createElement('div');\n\t\t\tconfetti.className = 'changelog-confetti';\n\t\t\tconfetti.style.left = Math.random() * 100 + '%';\n\t\t\tconfetti.style.backgroundColor =\n\t\t\t\tcolors[Math.floor(Math.random() * colors.length)];\n\t\t\tconfetti.style.animationDelay = Math.random() * 0.5 + 's';\n\t\t\tconfetti.style.animationDuration = Math.random() * 1 + 1.5 + 's';\n\n\t\t\tconst shapes = ['circle', 'square', 'rectangle'];\n\t\t\tconst shape = shapes[Math.floor(Math.random() * shapes.length)];\n\t\t\tif (shape === 'circle') {\n\t\t\t\tconfetti.style.borderRadius = '50%';\n\t\t\t\tconfetti.style.width = Math.random() * 8 + 4 + 'px';\n\t\t\t\tconfetti.style.height = confetti.style.width;\n\t\t\t} else if (shape === 'rectangle') {\n\t\t\t\tconfetti.style.width = Math.random() * 4 + 3 + 'px';\n\t\t\t\tconfetti.style.height = Math.random() * 10 + 8 + 'px';\n\t\t\t} else {\n\t\t\t\tconfetti.style.width = Math.random() * 8 + 4 + 'px';\n\t\t\t\tconfetti.style.height = confetti.style.width;\n\t\t\t}\n\n\t\t\tcontainer.appendChild(confetti);\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tif (container.parentNode) {\n\t\t\t\tcontainer.parentNode.removeChild(container);\n\t\t\t}\n\t\t}, 2500);\n\t}\n\n\tcloseSidebar() {\n\t\tdocument.body.style.overflow = '';\n\n\t\tif (this.listModalElement) {\n\t\t\tthis.listModalElement.classList.remove('open');\n\t\t}\n\t\tif (this.listModalBackdropElement) {\n\t\t\tthis.listModalBackdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.listModalElement && this.listModalElement.parentNode) {\n\t\t\t\tthis.listModalElement.parentNode.removeChild(this.listModalElement);\n\t\t\t\tthis.listModalElement = null;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tthis.listModalBackdropElement &&\n\t\t\t\tthis.listModalBackdropElement.parentNode\n\t\t\t) {\n\t\t\t\tthis.listModalBackdropElement.parentNode.removeChild(\n\t\t\t\t\tthis.listModalBackdropElement\n\t\t\t\t);\n\t\t\t\tthis.listModalBackdropElement = null;\n\t\t\t}\n\t\t\tif (this._listModalEscapeHandler) {\n\t\t\t\tdocument.removeEventListener('keydown', this._listModalEscapeHandler);\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\t_createListModal() {\n\t\tthis.listModalBackdropElement = document.createElement('div');\n\t\tthis.listModalBackdropElement.className = 'changelog-list-modal-backdrop';\n\t\tdocument.body.appendChild(this.listModalBackdropElement);\n\t\tthis.listModalBackdropElement.addEventListener('click', () =>\n\t\t\tthis.closeSidebar()\n\t\t);\n\n\t\tthis.listModalElement = document.createElement('div');\n\t\tthis.listModalElement.className = 'changelog-list-modal';\n\t\tthis.listModalElement.innerHTML = `\n\t\t\t<div class=\"changelog-list-modal-container\">\n\t\t\t\t<div class=\"changelog-list-modal-header\">\n\t\t\t\t\t<h2>${this.options.title || \"What's New\"} 🎉</h2>\n\t\t\t\t\t<button class=\"changelog-list-modal-close\" type=\"button\" aria-label=\"Close\">×</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-list-modal-body\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.listModalElement);\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-container')\n\t\t\t.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-close')\n\t\t\t.addEventListener('click', () => this.closeSidebar());\n\n\t\tthis._listModalEscapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.closeSidebar();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', this._listModalEscapeHandler);\n\t}\n\n\t_renderChangelogList() {\n\t\tconst body = this.listModalElement.querySelector(\n\t\t\t'.changelog-list-modal-body'\n\t\t);\n\n\t\tif (this.isLoading) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tbody.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tbody.innerHTML = `\n\t\t\t<div class=\"changelog-list\">\n\t\t\t\t${this.changelogs.map((changelog, index) => this._renderChangelogListItem(changelog, index)).join('')}\n\t\t\t</div>\n\t\t`;\n\n\t\tbody.querySelectorAll('.changelog-list-item').forEach((item, index) => {\n\t\t\titem.addEventListener('click', () => {\n\t\t\t\tconst changelog = this.changelogs[index];\n\t\t\t\tthis._handleViewUpdate(changelog);\n\t\t\t});\n\t\t});\n\t}\n\n\t_renderChangelogListItem(changelog, index) {\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst date = changelog.published_at\n\t\t\t? this._formatDate(changelog.published_at)\n\t\t\t: '';\n\n\t\treturn `\n\t\t\t<div class=\"changelog-list-item\" data-index=\"${index}\">\n\t\t\t\t<div class=\"changelog-list-item-main\">\n\t\t\t\t\t${\n\t\t\t\t\t\thasImage\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<div class=\"changelog-list-item-image\">\n\t\t\t\t\t\t\t<img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<div class=\"changelog-list-item-content\">\n\t\t\t\t\t\t${date ? `<span class=\"changelog-list-item-date\">${date}</span>` : ''}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tchangelog.labels && changelog.labels.length > 0\n\t\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t\t<div class=\"changelog-list-item-labels\">\n\t\t\t\t\t\t\t\t${changelog.labels\n\t\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t\t(label) => `\n\t\t\t\t\t\t\t\t\t<span class=\"changelog-label\" style=\"background-color: ${label.color || '#E5E7EB'}; color: ${this._getContrastColor(label.color || '#E5E7EB')}\">${label.name}</span>\n\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<h3 class=\"changelog-list-item-title\">${changelog.title}</h3>\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tchangelog.excerpt || changelog.description\n\t\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t\t<p class=\"changelog-list-item-description\">${changelog.excerpt || changelog.description}</p>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tasync _loadChangelogs() {\n\t\tthis.isLoading = true;\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getChangelogs();\n\t\t\tthis.changelogs = result.data || [];\n\t\t\tthis.sdk.eventBus.emit('changelog:loaded', {\n\t\t\t\tchangelogs: this.changelogs,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.changelogs = [];\n\t\t\tthis.sdk.eventBus.emit('changelog:error', { error });\n\t\t} finally {\n\t\t\tthis.isLoading = false;\n\t\t}\n\t}\n\n\t_renderCurrentChangelog() {\n\t\tconst content = this.modalElement.querySelector('.changelog-modal-content');\n\n\t\tif (this.isLoading) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tcontent.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tconst changelog = this.changelogs[this.currentIndex];\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst hasMultiple = this.changelogs.length > 1;\n\n\t\tcontent.innerHTML = `\n\t\t\t<div class=\"changelog-popup-item\">\n\t\t\t\t${\n\t\t\t\t\thasImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"changelog-popup-image\">\n\t\t\t\t\t\t<img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" />\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"changelog-popup-body\">\n\t\t\t\t\t<h2 class=\"changelog-popup-title\">${changelog.title}</h2>\n\t\t\t\t\t${\n\t\t\t\t\t\tchangelog.excerpt || changelog.description\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<p class=\"changelog-popup-description\">${changelog.excerpt || changelog.description}</p>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<button class=\"changelog-popup-btn\" type=\"button\">\n\t\t\t\t\t\t${this.options.viewButtonText || 'View Update'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-popup-footer\">\n\t\t\t\t\t${\n\t\t\t\t\t\thasMultiple\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<div class=\"changelog-popup-dots\">\n\t\t\t\t\t\t\t${this.changelogs\n\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t(_, i) => `\n\t\t\t\t\t\t\t\t<span class=\"changelog-dot ${i === this.currentIndex ? 'active' : ''}\" data-index=\"${i}\"></span>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<button class=\"changelog-view-all-btn\" type=\"button\">\n\t\t\t\t\t\tView all updates\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t\t\t\t\t<path d=\"M5 12h14M12 5l7 7-7 7\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tcontent\n\t\t\t.querySelector('.changelog-popup-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis._handleViewUpdate(changelog);\n\t\t\t});\n\n\t\tcontent\n\t\t\t.querySelector('.changelog-view-all-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.closeModal();\n\t\t\t\tsetTimeout(() => this.openSidebar(), 350);\n\t\t\t});\n\n\t\tif (hasMultiple) {\n\t\t\tcontent.querySelectorAll('.changelog-dot').forEach((dot) => {\n\t\t\t\tdot.addEventListener('click', (e) => {\n\t\t\t\t\tconst index = parseInt(e.target.dataset.index, 10);\n\t\t\t\t\tthis.currentIndex = index;\n\t\t\t\t\tthis._renderCurrentChangelog();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t_handleViewUpdate(changelog) {\n\t\tthis.sdk.eventBus.emit('changelog:view', { changelog });\n\n\t\tif (changelog.url || changelog.slug) {\n\t\t\tconst url =\n\t\t\t\tchangelog.url ||\n\t\t\t\t`${this.options.changelogBaseUrl || ''}/${changelog.slug}`;\n\t\t\tif (this.options.openInNewTab !== false) {\n\t\t\t\twindow.open(url, '_blank', 'noopener,noreferrer');\n\t\t\t} else {\n\t\t\t\twindow.location.href = url;\n\t\t\t}\n\t\t}\n\n\t\tif (typeof this.options.onViewUpdate === 'function') {\n\t\t\tthis.options.onViewUpdate(changelog);\n\t\t}\n\t}\n\n\t_formatDate(dateString) {\n\t\tconst date = new Date(dateString);\n\t\tconst options = { year: 'numeric', month: 'short', day: 'numeric' };\n\t\treturn date.toLocaleDateString('en-US', options);\n\t}\n\n\t_getContrastColor(hexColor) {\n\t\tconst hex = hexColor.replace('#', '');\n\t\tconst r = parseInt(hex.substr(0, 2), 16);\n\t\tconst g = parseInt(hex.substr(2, 2), 16);\n\t\tconst b = parseInt(hex.substr(4, 2), 16);\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#1F2937' : '#FFFFFF';\n\t}\n\n\thideBadge() {\n\t\tconst badge = this.element?.querySelector('.changelog-badge');\n\t\tif (badge) {\n\t\t\tbadge.style.display = 'none';\n\t\t}\n\t}\n\n\tshowBadge() {\n\t\tconst badge = this.element?.querySelector('.changelog-badge');\n\t\tif (badge) {\n\t\t\tbadge.style.display = 'block';\n\t\t}\n\t}\n\n\tnextChangelog() {\n\t\tif (this.currentIndex < this.changelogs.length - 1) {\n\t\t\tthis.currentIndex++;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t}\n\n\tprevChangelog() {\n\t\tif (this.currentIndex > 0) {\n\t\t\tthis.currentIndex--;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t}\n\n\tasync refresh() {\n\t\tthis.changelogs = [];\n\t\tawait this._loadChangelogs();\n\t\tif (this.modalElement) {\n\t\t\tthis.currentIndex = 0;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t\tif (this.listModalElement) {\n\t\t\tthis._renderChangelogList();\n\t\t}\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\t}\n\n\tdestroy() {\n\t\tif (this._escapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._escapeHandler);\n\t\t}\n\t\tif (this._listModalEscapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._listModalEscapeHandler);\n\t\t}\n\t\tthis.closeModal();\n\t\tthis.closeSidebar();\n\t\tsuper.destroy();\n\t}\n}","import { BaseWidget } from './BaseWidget.js';\n\nexport class InlineWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'inline' });\n\t}\n\n\t_render() {\n\t\tconst widget = document.createElement('div');\n\t\twidget.className = 'feedback-widget feedback-widget-inline';\n\t\twidget.innerHTML = `\n <div class=\"feedback-inline-content\">\n <h3>Send us your feedback</h3>\n <form class=\"feedback-inline-form\">\n <div class=\"sdk-form-group\">\n <input \n type=\"text\" \n name=\"title\" \n class=\"sdk-input\"\n placeholder=\"Title (optional)\"\n value=\"${this.state.title}\"\n />\n </div>\n <div class=\"sdk-form-group\">\n <textarea \n name=\"content\" \n class=\"sdk-textarea\"\n placeholder=\"Your feedback...\"\n required\n >${this.state.content}</textarea>\n </div>\n <div class=\"sdk-form-group\">\n <input \n type=\"email\" \n name=\"email\" \n class=\"sdk-input\"\n placeholder=\"Email (optional)\"\n value=\"${this.state.email}\"\n />\n </div>\n <button type=\"submit\" class=\"sdk-btn-primary sdk-btn-block\">\n Send Feedback\n </button>\n <div class=\"feedback-error\"></div>\n </form>\n </div>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(widget.style, this.options.customStyles);\n\t\t}\n\n\t\treturn widget;\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('.feedback-inline-form');\n\n\t\tform.addEventListener('submit', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.submitFeedback();\n\t\t});\n\n\t\tform.querySelector('input[name=\"title\"]').addEventListener('input', (e) => {\n\t\t\tthis.state.title = e.target.value;\n\t\t});\n\n\t\tform\n\t\t\t.querySelector('textarea[name=\"content\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.content = e.target.value;\n\t\t\t});\n\n\t\tform.querySelector('input[name=\"email\"]').addEventListener('input', (e) => {\n\t\t\tthis.state.email = e.target.value;\n\t\t});\n\t}\n\n\topenModal() {\n\t\tconst textarea = this.element.querySelector('textarea[name=\"content\"]');\n\t\tif (textarea) {\n\t\t\ttextarea.focus();\n\t\t}\n\t}\n\n\tcloseModal() {\n\t\t// Inline widget doesn't use modal\n\t}\n\n\t_showSuccessMessage() {\n\t\tconst widget = this.element.querySelector('.feedback-inline-content');\n\t\tconst originalContent = widget.innerHTML;\n\n\t\twidget.innerHTML = `\n <div class=\"feedback-success\">\n <div class=\"sdk-notification-icon\">✓</div>\n <h3>Thank you!</h3>\n <p>Your feedback has been submitted successfully.</p>\n <button class=\"sdk-btn-primary\">Send Another</button>\n </div>\n `;\n\n\t\tconst resetBtn = widget.querySelector('.sdk-btn-primary');\n\t\tresetBtn.addEventListener('click', () => {\n\t\t\twidget.innerHTML = originalContent;\n\t\t\tthis._attachEvents();\n\t\t\tthis._resetForm();\n\t\t});\n\t}\n\n\t_showError(message) {\n\t\tconst errorElement = this.element.querySelector('.feedback-error');\n\t\tif (errorElement) {\n\t\t\terrorElement.textContent = message;\n\t\t\terrorElement.classList.add('show');\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (errorElement) {\n\t\t\t\t\terrorElement.classList.remove('show');\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t}\n\t}\n\n\t_updateSubmitButton() {\n\t\tconst submitBtn = this.element.querySelector('.sdk-btn-primary');\n\t\tif (submitBtn) {\n\t\t\tsubmitBtn.textContent = this.state.isSubmitting\n\t\t\t\t? 'Sending...'\n\t\t\t\t: 'Send Feedback';\n\t\t\tsubmitBtn.disabled = this.state.isSubmitting;\n\t\t}\n\t}\n\n\tupdateTitle(title) {\n\t\tconst titleElement = this.element?.querySelector('h3');\n\t\tif (titleElement) {\n\t\t\ttitleElement.textContent = title;\n\t\t}\n\t}\n\n\tsetPlaceholder(field, placeholder) {\n\t\tconst input = this.element?.querySelector(`[name=\"${field}\"]`);\n\t\tif (input) {\n\t\t\tinput.placeholder = placeholder;\n\t\t}\n\t}\n}","/**\n * MessengerState - State management for the Messenger widget\n */\nexport class MessengerState {\nconstructor(options = {}) {\n\tthis.currentView = 'home';\n\tthis.isOpen = false;\n\tthis.unreadCount = 0;\n\tthis.activeConversationId = null;\n\n\t// Conversations\n\tthis.conversations = [];\n\tthis.messages = {};\n\n\t// Help articles\n\tthis.helpArticles = [];\n\tthis.helpSearchQuery = '';\n\n\t// Changelog\n\tthis.homeChangelogItems = [];\n\tthis.changelogItems = [];\n\n\t// Team info\n\tthis.teamName = options.teamName || 'Support';\n\tthis.teamAvatars = options.teamAvatars || [];\n\tthis.welcomeMessage = options.welcomeMessage || 'How can we help?';\n\n\t// User info\n\tthis.userContext = options.userContext || null;\n\t\n\t// ADD THESE TWO PROPERTIES\n\tthis.isIdentified = false; // Track if user has been identified\n\tthis.pendingMessage = null; // { content, attachments } - for pre-chat flow\n\n\t// Feature flags\n\tthis.enableHelp = options.enableHelp !== false;\n\tthis.enableChangelog = options.enableChangelog !== false;\n\n\t// Agent availability\n\tthis.agentsOnline = false;\n\tthis.onlineCount = 0;\n\tthis.responseTime = 'Usually replies within a few minutes';\n\n\t// Typing indicators\n\tthis.typingUsers = {};\n\n\t// Loading states\n\tthis.isLoading = false;\n\tthis.isLoadingMessages = false;\n\n\t// Listeners\n\tthis._listeners = new Set();\n}\n\t/**\n\t * Subscribe to state changes\n\t */\n\tsubscribe(callback) {\n\t\tthis._listeners.add(callback);\n\t\treturn () => this._listeners.delete(callback);\n\t}\n\n\t/**\n\t * Notify all listeners of state change\n\t */\n\t_notify(changeType, data) {\n\t\tthis._listeners.forEach((cb) => cb(changeType, data, this));\n\t}\n\n\t/**\n\t * Set current view\n\t */\n\tsetView(view) {\n\t\tconst previousView = this.currentView;\n\t\tthis.currentView = view;\n\t\tthis._notify('viewChange', { previousView, currentView: view });\n\t}\n\n\t/**\n\t * Toggle panel open/closed\n\t */\n\tsetOpen(isOpen) {\n\t\tthis.isOpen = isOpen;\n\t\tthis._notify('openChange', { isOpen });\n\t}\n\n\t/**\n\t * Set active conversation for chat view\n\t */\n\tsetActiveConversation(conversationId) {\n\t\tconst previousConversationId = this.activeConversationId;\n\t\tthis.activeConversationId = conversationId;\n\t\tthis._notify('conversationChange', { conversationId, previousConversationId });\n\t}\n\n\t/**\n\t * Update conversations list\n\t */\n\tsetConversations(conversations) {\n\t\tthis.conversations = conversations;\n\t\tthis._updateUnreadCount();\n\t\tthis._notify('conversationsUpdate', { conversations });\n\t}\n\n\t/**\n\t * Add a new conversation\n\t */\n\taddConversation(conversation) {\n\t\tthis.conversations.unshift(conversation);\n\t\tthis._updateUnreadCount();\n\t\tthis._notify('conversationAdded', { conversation });\n\t}\n\n\t/**\n\t * Update messages for a conversation\n\t */\n\tsetMessages(conversationId, messages) {\n\t\tthis.messages[conversationId] = messages;\n\t\tthis._notify('messagesUpdate', { conversationId, messages });\n\t}\n\n\t/**\n\t * Add a message to a conversation\n\t */\n\taddMessage(conversationId, message) {\n\t\tif (!this.messages[conversationId]) {\n\t\t\tthis.messages[conversationId] = [];\n\t\t}\n\t\tthis.messages[conversationId].push(message);\n\n\t\t// Update conversation preview\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (conv) {\n\t\t\tconv.lastMessage = message.content;\n\t\t\tconv.lastMessageTime = message.timestamp;\n\t\t\tif (!message.isOwn) {\n\t\t\t\tconv.unread = (conv.unread || 0) + 1;\n\t\t\t\tthis._updateUnreadCount();\n\t\t\t}\n\t\t}\n\n\t\tthis._notify('messageAdded', { conversationId, message });\n\t}\n\n\t/**\n\t * Update a conversation by id\n\t */\n\tupdateConversation(conversationId, updates) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (!conv) {\n\t\t\treturn null;\n\t\t}\n\n\t\tObject.assign(conv, updates);\n\t\tthis._notify('conversationUpdated', { conversationId, conversation: conv });\n\t\treturn conv;\n\t}\n\n\t/**\n\t * Mark conversation as read\n\t */\n\tmarkAsRead(conversationId) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (conv && conv.unread > 0) {\n\t\t\tconv.unread = 0;\n\t\t\tthis._updateUnreadCount();\n\t\t\tthis._notify('conversationRead', { conversationId });\n\t\t}\n\t}\n\n\t/**\n\t * Update unread count\n\t */\n\t_updateUnreadCount() {\n\t\tthis.unreadCount = this.conversations.reduce(\n\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t0\n\t\t);\n\t\tthis._notify('unreadCountChange', { count: this.unreadCount });\n\t}\n\n\t/**\n\t * Set help articles\n\t */\n\tsetHelpArticles(articles) {\n\t\tthis.helpArticles = articles;\n\t\tthis._notify('helpArticlesUpdate', { articles });\n\t}\n\n\t/**\n\t * Set help search query\n\t */\n\tsetHelpSearchQuery(query) {\n\t\tthis.helpSearchQuery = query;\n\t\tthis._notify('helpSearchChange', { query });\n\t}\n\n\t/**\n\t * Set home changelog items\n\t */\n\tsetHomeChangelogItems(items) {\n\t\tthis.homeChangelogItems = items;\n\t\tthis._notify('homeChangelogUpdate', { items });\n\t}\n\n\t/**\n\t * Set changelog items\n\t */\n\tsetChangelogItems(items) {\n\t\tthis.changelogItems = items;\n\t\tthis._notify('changelogUpdate', { items });\n\t}\n\n\t/**\n\t * Get current conversation\n\t */\n\tgetActiveConversation() {\n\t\treturn this.conversations.find((c) => c.id === this.activeConversationId);\n\t}\n\n\t/**\n\t * Get messages for active conversation\n\t */\n\tgetActiveMessages() {\n\t\treturn this.messages[this.activeConversationId] || [];\n\t}\n\n\t/**\n\t * Update team avatars from backend agent data.\n\t * Converts available_agents ({full_name, picture}) into avatar strings\n\t * the views already support (URL strings or initial strings).\n\t */\n\tsetTeamAvatarsFromAgents(agents) {\n\t\tif (!agents || agents.length === 0) return;\n\n\t\tthis.teamAvatars = agents.map((agent) => {\n\t\t\tif (agent.picture) return agent.picture;\n\t\t\treturn agent.full_name || '?';\n\t\t});\n\t\tthis._notify('teamAvatarsUpdate', { teamAvatars: this.teamAvatars });\n\t}\n\n\t/**\n\t * Get filtered help articles\n\t */\n\tgetFilteredHelpArticles() {\n\t\tif (!this.helpSearchQuery) {\n\t\t\treturn this.helpArticles;\n\t\t}\n\t\tconst query = this.helpSearchQuery.toLowerCase();\n\t\treturn this.helpArticles.filter(\n\t\t\t(article) =>\n\t\t\t\tarticle.title.toLowerCase().includes(query) ||\n\t\t\t\t(article.description &&\n\t\t\t\t\tarticle.description.toLowerCase().includes(query))\n\t\t);\n\t}\n\n\t/**\n\t * Reset state\n\t */\n\treset() {\n\t\tthis.currentView = 'home';\n\t\tthis.activeConversationId = null;\n\t\tthis.helpSearchQuery = '';\n\t\tthis._notify('reset', {});\n\t}\n}\n","export class MessengerLauncher {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\t...options,\n\t\t};\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = `messenger-launcher messenger-launcher-${this.options.position}`;\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type, data) => {\n\t\t\tif (type === 'openChange') {\n\t\t\t\tthis._updateIcon();\n\t\t\t}\n\t\t\tif (type === 'unreadCountChange') {\n\t\t\t\tthis._updateBadge();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst badgeHtml =\n\t\t\tthis.state.unreadCount > 0\n\t\t\t\t? `<span class=\"messenger-launcher-badge\">${this.state.unreadCount > 9 ? '9+' : this.state.unreadCount}</span>`\n\t\t\t\t: '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<button class=\"messenger-launcher-btn\" aria-label=\"Open messenger\">\n\t\t\t\t<span class=\"messenger-launcher-icon messenger-launcher-icon-chat\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M144,140a12,12,0,1,1-12-12A12,12,0,0,1,144,140Zm44-12a12,12,0,1,0,12,12A12,12,0,0,0,188,128Zm51.34,83.47a16,16,0,0,1-19.87,19.87l-24.71-7.27A80,80,0,0,1,86.43,183.42a79,79,0,0,1-25.19-7.35l-24.71,7.27a16,16,0,0,1-19.87-19.87l7.27-24.71A80,80,0,1,1,169.58,72.59a80,80,0,0,1,62.49,114.17ZM81.3,166.3a79.94,79.94,0,0,1,70.38-93.87A64,64,0,0,0,39.55,134.19a8,8,0,0,1,.63,6L32,168l27.76-8.17a8,8,0,0,1,6,.63A63.45,63.45,0,0,0,81.3,166.3Zm135.15,15.89a64,64,0,1,0-26.26,26.26,8,8,0,0,1,6-.63L224,216l-8.17-27.76A8,8,0,0,1,216.45,182.19Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</span>\n\t\t\t\t<span class=\"messenger-launcher-icon messenger-launcher-icon-close\" style=\"display: none;\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</span>\n\t\t\t\t${badgeHtml}\n\t\t\t</button>\n\t\t`;\n\n\t\t// Set custom primary color if provided\n\t\tif (this.options.primaryColor) {\n\t\t\tthis.element.querySelector('.messenger-launcher-btn').style.setProperty('background', this.options.primaryColor);\n\t\t}\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-launcher-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(!this.state.isOpen);\n\t\t\t});\n\t}\n\n\t_updateIcon() {\n\t\tconst chatIcon = this.element.querySelector(\n\t\t\t'.messenger-launcher-icon-chat'\n\t\t);\n\t\tconst closeIcon = this.element.querySelector(\n\t\t\t'.messenger-launcher-icon-close'\n\t\t);\n\n\t\tif (this.state.isOpen) {\n\t\t\tchatIcon.style.display = 'none';\n\t\t\tcloseIcon.style.display = 'flex';\n\t\t\tthis.element.classList.add('messenger-launcher-open');\n\t\t} else {\n\t\t\tchatIcon.style.display = 'flex';\n\t\t\tcloseIcon.style.display = 'none';\n\t\t\tthis.element.classList.remove('messenger-launcher-open');\n\t\t}\n\t}\n\n\t_updateBadge() {\n\t\tconst existingBadge = this.element.querySelector(\n\t\t\t'.messenger-launcher-badge'\n\t\t);\n\t\tif (existingBadge) {\n\t\t\texistingBadge.remove();\n\t\t}\n\n\t\tif (this.state.unreadCount > 0 && !this.state.isOpen) {\n\t\t\tconst badge = document.createElement('span');\n\t\t\tbadge.className = 'messenger-launcher-badge';\n\t\t\tbadge.textContent =\n\t\t\t\tthis.state.unreadCount > 9 ? '9+' : this.state.unreadCount;\n\t\t\tthis.element.querySelector('.messenger-launcher-btn').appendChild(badge);\n\t\t}\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}","export class NavigationTabs {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-nav';\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'viewChange' || type === 'unreadCountChange') {\n\t\t\t\tthis._updateActiveTab();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_getTabs() {\n\t\tconst tabs = [\n\t\t\t{ id: 'home', label: 'Home', icon: this._getHomeIcon() },\n\t\t\t{\n\t\t\t\tid: 'messages',\n\t\t\t\tlabel: 'Messages',\n\t\t\t\ticon: this._getMessagesIcon(),\n\t\t\t\tbadge: this.state.unreadCount,\n\t\t\t},\n\t\t];\n\n\t\tif (this.state.enableHelp) {\n\t\t\ttabs.push({ id: 'help', label: 'Help', icon: this._getHelpIcon() });\n\t\t}\n\n\t\tif (this.state.enableChangelog) {\n\t\t\ttabs.push({\n\t\t\t\tid: 'changelog',\n\t\t\t\tlabel: 'Changelog',\n\t\t\t\ticon: this._getChangelogIcon(),\n\t\t\t});\n\t\t}\n\n\t\treturn tabs;\n\t}\n\n\t_updateContent() {\n\t\tconst tabs = this._getTabs();\n\t\tconst tabsHtml = tabs\n\t\t\t.map((tab) => {\n\t\t\t\tconst isActive = this.state.currentView === tab.id;\n\t\t\t\tconst badgeHtml =\n\t\t\t\t\ttab.badge && tab.badge > 0\n\t\t\t\t\t\t? `<span class=\"messenger-nav-badge\">${tab.badge > 9 ? '9+' : tab.badge}</span>`\n\t\t\t\t\t\t: '';\n\n\t\t\t\treturn `\n\t\t\t\t<button class=\"messenger-nav-tab ${isActive ? 'active' : ''}\" data-tab=\"${tab.id}\">\n\t\t\t\t\t<span class=\"messenger-nav-icon\">${tab.icon}</span>\n\t\t\t\t\t<span class=\"messenger-nav-label\">${tab.label}</span>\n\t\t\t\t\t${badgeHtml}\n\t\t\t\t</button>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tthis.element.innerHTML = tabsHtml;\n\t}\n\n\t_attachEvents() {\n\t\tthis.element.addEventListener('click', (e) => {\n\t\t\tconst tab = e.target.closest('.messenger-nav-tab');\n\t\t\tif (tab) {\n\t\t\t\tconst tabId = tab.dataset.tab;\n\t\t\t\tthis.state.setView(tabId);\n\t\t\t}\n\t\t});\n\t}\n\n\t_updateActiveTab() {\n\t\tconst tabs = this.element.querySelectorAll('.messenger-nav-tab');\n\t\ttabs.forEach((tab) => {\n\t\t\tconst isActive = tab.dataset.tab === this.state.currentView;\n\t\t\ttab.classList.toggle('active', isActive);\n\n\t\t\tif (tab.dataset.tab === 'messages') {\n\t\t\t\tconst existingBadge = tab.querySelector('.messenger-nav-badge');\n\t\t\t\tif (existingBadge) existingBadge.remove();\n\n\t\t\t\tif (this.state.unreadCount > 0) {\n\t\t\t\t\tconst badge = document.createElement('span');\n\t\t\t\t\tbadge.className = 'messenger-nav-badge';\n\t\t\t\t\tbadge.textContent =\n\t\t\t\t\t\tthis.state.unreadCount > 9 ? '9+' : this.state.unreadCount;\n\t\t\t\t\ttab.appendChild(badge);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t_getHomeIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t<path d=\"M218.83,103.77l-80-75.48a1.14,1.14,0,0,1-.11-.11,16,16,0,0,0-21.53,0l-.11.11L37.17,103.77A16,16,0,0,0,32,115.55V208a16,16,0,0,0,16,16H96a16,16,0,0,0,16-16V160h32v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V115.55A16,16,0,0,0,218.83,103.77ZM208,208H160V160a16,16,0,0,0-16-16H112a16,16,0,0,0-16,16v48H48V115.55l.11-.1L128,40l79.9,75.43.11.1Z\"></path>\n\t</svg>`;\n\t}\n\n\t_getMessagesIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t<path d=\"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78.69.69,0,0,0,.13-.11L82.5,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H82.5a16,16,0,0,0-10.3,3.75l-.12.11L40,224V64H216Z\"></path>\n\t</svg>`;\n\t}\n\n\t_getHelpIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t<path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z\"></path>\n\t</svg>`;\n\t}\n\n\t_getChangelogIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t<path d=\"M228.54,86.66l-26.46,23.07A40,40,0,0,0,168,72.13L120.89,46.5a40,40,0,0,0-75.44-4l-22-19.2a8,8,0,0,0-10.5,12L35.44,54.77a40,40,0,0,0,50,61.07l47.1,25.64a40,40,0,0,0,75.41,4.07l26.46-23.07a8,8,0,0,0-10.5-12ZM56,96A24,24,0,1,1,77.25,82.75,24,24,0,0,1,56,96Zm144,64a24,24,0,1,1,24-24A24,24,0,0,1,200,160Z\"></path>\n\t</svg>`;\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}","import { NavigationTabs } from './NavigationTabs.js';\n\nexport class MessengerPanel {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\t...options,\n\t\t};\n\t\tthis.element = null;\n\t\tthis.navigationTabs = null;\n\t\tthis.currentViewComponent = null;\n\t\tthis.viewRegistry = {};\n\t\tthis._unsubscribe = null;\n\t}\n\n\tregisterView(name, ViewClass) {\n\t\tthis.viewRegistry[name] = ViewClass;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = `messenger-panel messenger-panel-${this.options.position}`;\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-panel-content\">\n\t\t\t\t<div class=\"messenger-panel-views\"></div>\n\t\t\t\t<div class=\"messenger-panel-nav\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.navigationTabs = new NavigationTabs(this.state, this.options);\n\t\tconst navContainer = this.element.querySelector('.messenger-panel-nav');\n\t\tnavContainer.appendChild(this.navigationTabs.render());\n\n\t\tthis._renderCurrentView();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'viewChange') {\n\t\t\t\tthis._renderCurrentView();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_renderCurrentView() {\n\t\tconst viewsContainer = this.element.querySelector('.messenger-panel-views');\n\n\t\tif (this.currentViewComponent && this.currentViewComponent.destroy) {\n\t\t\tthis.currentViewComponent.destroy();\n\t\t}\n\n\t\tviewsContainer.innerHTML = '';\n\n\t\tconst ViewClass = this.viewRegistry[this.state.currentView];\n\t\tif (ViewClass) {\n\t\t\tthis.currentViewComponent = new ViewClass(this.state, this.options);\n\t\t\tviewsContainer.appendChild(this.currentViewComponent.render());\n\t\t} else {\n\t\t\tviewsContainer.innerHTML = `<div class=\"messenger-empty-state\">\n\t\t\t\t<p>View not found: ${this.state.currentView}</p>\n\t\t\t</div>`;\n\t\t}\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tthis.element.classList.add('open');\n\t\t\t});\n\t\t}\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.classList.remove('open');\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.style.display = 'none';\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t}\n\t}\n\n\tsetHeader(headerContent) {\n\t\tconst header = this.element.querySelector('.messenger-panel-header');\n\t\tif (header) {\n\t\t\theader.innerHTML = headerContent;\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.navigationTabs) {\n\t\t\tthis.navigationTabs.destroy();\n\t\t}\n\t\tif (this.currentViewComponent && this.currentViewComponent.destroy) {\n\t\t\tthis.currentViewComponent.destroy();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}","export class ChangelogView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-changelog-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'changelogUpdate') {\n\t\t\t\tthis._updateChangelogList();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst avatarsHtml = this._renderTeamAvatars();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-changelog-header\">\n\t\t\t\t<h2>Changelog</h2>\n\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-changelog-subheader\">\n\t\t\t\t<span class=\"messenger-changelog-latest\">Latest</span>\n\t\t\t\t<div class=\"messenger-changelog-team\">\n\t\t\t\t\t<span>From ${this.state.teamName}</span>\n\t\t\t\t\t${avatarsHtml}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-changelog-body\">\n\t\t\t\t<div class=\"messenger-changelog-list\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._updateChangelogList();\n\t\tthis._attachEvents();\n\t}\n\n\t_updateChangelogList() {\n\t\tconst changelogContainer = this.element.querySelector(\n\t\t\t'.messenger-changelog-list'\n\t\t);\n\t\tconst changelogItems = this.state.changelogItems;\n\n\t\tif (changelogItems.length === 0) {\n\t\t\tchangelogContainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tchangelogContainer.innerHTML = changelogItems\n\t\t\t.map((item) => this._renderChangelogCard(item))\n\t\t\t.join('');\n\n\t\tthis._attachChangelogEvents();\n\t}\n\n\t_renderChangelogCard(item) {\n\t\tconst tagsHtml =\n\t\t\titem.tags && item.tags.length > 0\n\t\t\t\t? `<div class=\"messenger-changelog-tags\">\n\t\t\t\t${item.tags.map((tag) => `<span class=\"sdk-badge sdk-badge-primary messenger-changelog-tag\">${tag}</span>`).join('')}\n\t\t\t</div>`\n\t\t\t\t: '';\n\n\t\tconst dateStr = this._formatDate(item.publishedAt || item.date);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${\n\t\t\t\t\titem.coverImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"messenger-changelog-cover\">\n\t\t\t\t\t\t<img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.style.display='none';\" />\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-changelog-content\">\n\t\t\t\t\t${tagsHtml}\n\t\t\t\t\t<h3 class=\"messenger-changelog-title\">${item.title}</h3>\n\t\t\t\t\t${item.description ? `<p class=\"messenger-changelog-description\">${this._truncateText(item.description, 100)}</p>` : ''}\n\t\t\t\t\t<div class=\"messenger-changelog-meta\">\n\t\t\t\t\t\t<span class=\"messenger-changelog-date\">${dateStr}</span>\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 256 256\" class=\"messenger-changelog-arrow\">\n\t\t\t\t\t\t\t<path d=\"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack messenger-avatar-stack-tiny\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-sm\">S</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 2)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack messenger-avatar-stack-tiny\">${avatarItems}</div>`;\n\t}\n\n\t_renderEmptyState() {\n\t\treturn `\n\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M228.54,86.66l-26.46,23.07A40,40,0,0,0,168,72.13L120.89,46.5a40,40,0,0,0-75.44-4l-22-19.2a8,8,0,0,0-10.5,12L35.44,54.77a40,40,0,0,0,50,61.07l47.1,25.64a40,40,0,0,0,75.41,4.07l26.46-23.07a8,8,0,0,0-10.5-12ZM56,96A24,24,0,1,1,77.25,82.75,24,24,0,0,1,56,96Zm144,64a24,24,0,1,1,24-24A24,24,0,0,1,200,160Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3>No changelog yet</h3>\n\t\t\t\t<p>Check back later for updates</p>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_formatDate(dateString) {\n\t\tif (!dateString) return '';\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleDateString('en-US', {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t\tyear: 'numeric',\n\t\t});\n\t}\n\n\t_truncateText(text, maxLength) {\n\t\tif (!text) return '';\n\t\tif (text.length <= maxLength) return text;\n\t\treturn text.substring(0, maxLength).trim() + '...';\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tthis._attachChangelogEvents();\n\t}\n\n\t_attachChangelogEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-changelog-card')\n\t\t\t.forEach((card) => {\n\t\t\t\tcard.addEventListener('click', () => {\n\t\t\t\t\tconst changelogId = card.dataset.changelogId;\n\t\t\t\t\tconst changelogItem = this.state.changelogItems.find(\n\t\t\t\t\t\t(n) => n.id === changelogId\n\t\t\t\t\t);\n\t\t\t\t\tif (changelogItem && changelogItem.url) {\n\t\t\t\t\t\twindow.open(changelogItem.url, '_blank');\n\t\t\t\t\t} else if (this.options.onChangelogClick) {\n\t\t\t\t\t\tthis.options.onChangelogClick(changelogItem);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}","export class ChatView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t\tthis._typingTimeout = null;\n\t\tthis._isTyping = false;\n\t\tthis._typingIndicator = null;\n\t\tthis._isConversationClosed = false;\n\t\tthis._showEmailOverlayFlag = false;\n\t\tthis._pendingAttachments = []; \n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-chat-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type, data) => {\n\t\t\tif (\n\t\t\t\ttype === 'messageAdded' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._hideTypingIndicator();\n\t\t\t\tthis._appendMessage(data.message);\n\t\t\t\tthis._scrollToBottom();\n\t\t\t} else if (\n\t\t\t\ttype === 'typingStarted' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._showTypingIndicator(data.userName);\n\t\t\t} else if (\n\t\t\t\ttype === 'typingStopped' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._hideTypingIndicator();\n\t\t\t} else if (\n\t\t\t\ttype === 'conversationUpdated' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t} else if (type === 'messagesUpdate' && data.conversationId === this.state.activeConversationId) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst conversation = this.state.getActiveConversation();\n\t\tconst messages = this.state.getActiveMessages();\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\t\tconst isClosed = !isNewConversation && conversation?.status === 'closed';\n\t\tthis._isConversationClosed = isClosed;\n\n\t\tconst messagesHtml =\n\t\t\tmessages.length === 0\n\t\t\t\t? this._renderEmptyState(isNewConversation)\n\t\t\t\t: messages.map((msg) => this._renderMessage(msg)).join('');\n\n\t\tconst avatarHtml = this._renderConversationAvatar(conversation);\n\t\tconst title = isNewConversation\n\t\t\t? 'New conversation'\n\t\t\t: conversation?.title || 'Chat with team';\n\t\tconst placeholder = isNewConversation\n\t\t\t? 'Start typing your message...'\n\t\t\t: isClosed\n\t\t\t\t? 'Conversation closed'\n\t\t\t\t: 'Write a message...';\n\n\t\tconst existingName = this.state.userContext?.name || '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-chat-header\">\n\t\t\t\t<button class=\"sdk-btn-icon messenger-back-btn\" aria-label=\"Back\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-chat-header-info\">\n\t\t\t\t\t${avatarHtml}\n\t\t\t\t\t<span class=\"messenger-chat-title\">${title}</span>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-chat-messages\">\n\t\t\t\t${messagesHtml}\n\t\t\t\t${isClosed ? `\n\t\t\t\t<div class=\"messenger-closed-banner\">\n\t\t\t\t\t<i class=\"ph ph-check-circle\"></i>\n\t\t\t\t\t<span>This conversation has been resolved</span>\n\t\t\t\t</div>\n\t\t\t\t` : ''}\n\t\t\t\t<div class=\"messenger-typing-indicator\">\n\t\t\t\t\t<div class=\"messenger-typing-dots\">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"messenger-typing-text\"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${isClosed ? '' : `\n\t\t\t<div class=\"messenger-compose-attachments-preview\"></div>\n\n\t\t\t<div class=\"messenger-chat-compose\">\n\t\t\t\t<button class=\"sdk-btn-icon messenger-compose-attach\" aria-label=\"Attach file\">\n\t\t\t\t\t<i class=\"ph ph-paperclip\"></i>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-compose-input-wrapper\">\n\t\t\t\t\t<textarea class=\"messenger-compose-input\" placeholder=\"${placeholder}\" rows=\"1\"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"messenger-compose-send\" aria-label=\"Send\" disabled>\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14L118.42,148.9l47.24-47.25a8,8,0,0,0-11.31-11.31L107.1,137.58,24,98.22l.14,0L216,40Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<input type=\"file\" class=\"messenger-compose-file-input\" multiple accept=\"image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip\" />\n\t\t\t</div>\n\t\t\t`}\n\n\t\t\t<div class=\"messenger-email-overlay\">\n\t\t\t\t<div class=\"sdk-card messenger-email-card\">\n\t\t\t\t\t<div class=\"sdk-card-header\">\n\t\t\t\t\t\t<h4>What is your email address?</h4>\n\t\t\t\t\t\t<p>Enter your email to know when we reply:</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"sdk-card-body\">\n\t\t\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t\t\t<input type=\"text\" class=\"sdk-input messenger-email-name\" placeholder=\"Name (optional)\" value=\"${this._escapeHtml(existingName)}\" autocomplete=\"name\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t\t\t<input type=\"email\" class=\"sdk-input messenger-email-input\" placeholder=\"Enter your email address...\" autocomplete=\"email\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"sdk-card-footer messenger-email-actions\">\n\t\t\t\t\t\t<button class=\"sdk-btn sdk-btn-primary sdk-btn-block messenger-email-submit\" disabled>Set my email</button>\n\t\t\t\t\t\t<button class=\"sdk-btn sdk-btn-secondary sdk-btn-block messenger-email-skip\">Skip</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._typingIndicator = this.element.querySelector(\n\t\t\t'.messenger-typing-indicator'\n\t\t);\n\t\tthis._attachEvents();\n\t\tthis._scrollToBottom();\n\t\tthis._renderAttachmentPreviews();\n\n\t\t// Show email overlay after first message sent without email\n\t\tif (this._showEmailOverlayFlag) {\n\t\t\tthis._showEmailOverlay();\n\t\t}\n\t}\n\n\t_renderEmptyState(isNewConversation = false) {\n\t\tconst avatarHtml = this._renderTeamAvatars();\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\t\tconst isOnline = this.state.agentsOnline;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-chat-empty\">\n\t\t\t\t<div class=\"messenger-chat-empty-avatars\">${avatarHtml}</div>\n\t\t\t\t<h3>${isNewConversation ? 'Start a new conversation' : 'Start the conversation'}</h3>\n\t\t\t\t<p>Send us a message and we'll get back to you as soon as possible.</p>\n\t\t\t\t<div class=\"messenger-chat-availability\">\n\t\t\t\t\t<span class=\"messenger-availability-dot ${isOnline ? 'messenger-availability-online' : 'messenger-availability-away'}\"></span>\n\t\t\t\t\t<span>${isOnline ? \"We're online now\" : responseTime}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderMessageAttachments(attachments) {\n\t\tif (!attachments || attachments.length === 0) return '';\n\t\treturn attachments.map((att) => {\n\t\t\tif (att.type === 'image') {\n\t\t\t\treturn `<img class=\"messenger-message-image\" src=\"${this._escapeHtml(att.url)}\" alt=\"${this._escapeHtml(att.name || 'image')}\" data-url=\"${this._escapeHtml(att.url)}\" />`;\n\t\t\t}\n\t\t\treturn `<a class=\"messenger-message-file\" href=\"${this._escapeHtml(att.url)}\" data-url=\"${this._escapeHtml(att.url)}\" data-name=\"${this._escapeHtml(att.name || 'file')}\">\n\t\t\t\t<i class=\"ph ph-file\"></i>\n\t\t\t\t<span>${this._escapeHtml(att.name || 'file')}</span>\n\t\t\t\t<i class=\"ph ph-download-simple messenger-file-download-icon\"></i>\n\t\t\t</a>`;\n\t\t}).join('');\n\t}\n\n\t_renderMessage(message) {\n\t\tconst isOwn = message.isOwn;\n\t\tconst messageClass = isOwn\n\t\t\t? 'messenger-message-own'\n\t\t\t: 'messenger-message-received';\n\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\t\tconst attachmentsHtml = this._renderMessageAttachments(message.attachments);\n\n\t\tconst contentHtml = message.content ? `<div class=\"messenger-message-content\">${this._formatMessageContent(message.content)}</div>` : '';\n\n\t\tconst bubbleHtml = contentHtml ? `<div class=\"messenger-message-bubble\">${contentHtml}</div>` : '';\n\n\t\tif (isOwn) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-message ${messageClass}\">\n\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t<div class=\"messenger-message-time\">${timeStr}</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarHtml = this._renderSenderAvatar(message.sender);\n\t\treturn `\n\t\t\t<div class=\"messenger-message ${messageClass}\">\n\t\t\t\t<div class=\"messenger-message-avatar\">${avatarHtml}</div>\n\t\t\t\t<div class=\"messenger-message-wrapper\">\n\t\t\t\t\t<div class=\"messenger-message-sender\">${message.sender?.name || 'Support'}</div>\n\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t<div class=\"messenger-message-time\">${timeStr}</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderSenderAvatar(sender) {\n\t\tif (sender?.avatarUrl) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${sender.avatarUrl}\" alt=\"${sender.name}\" /></div>`;\n\t\t}\n\t\tconst initial = (sender?.name || 'S').charAt(0).toUpperCase();\n\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${initial}</div>`;\n\t}\n\n\t_renderConversationAvatar(conversation) {\n\t\tif (!conversation?.participants?.length) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">S</div>`;\n\t\t}\n\t\tconst p = conversation.participants[0];\n\t\tif (p.avatarUrl) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${p.avatarUrl}\" alt=\"${p.name}\" /></div>`;\n\t\t}\n\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${(p.name || 'S').charAt(0).toUpperCase()}</div>`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_formatMessageTime(timestamp) {\n\t\tif (!timestamp) return '';\n\t\tconst date = new Date(timestamp);\n\t\treturn date.toLocaleTimeString('en-US', {\n\t\t\thour: 'numeric',\n\t\t\tminute: '2-digit',\n\t\t\thour12: true,\n\t\t});\n\t}\n\n\t_formatMessageContent(content) {\n\t\tif (!content) return '';\n\t\treturn content\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\\n/g, '<br>');\n\t}\n\n\t_appendMessage(message) {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tconst emptyState = messagesContainer.querySelector('.messenger-chat-empty');\n\t\tif (emptyState) {\n\t\t\temptyState.remove();\n\t\t}\n\n\t\tconst messageHtml = this._renderMessage(message);\n\t\tconst tempDiv = document.createElement('div');\n\t\ttempDiv.innerHTML = messageHtml;\n\t\tmessagesContainer.appendChild(tempDiv.firstElementChild);\n\t}\n\n\t_scrollToBottom() {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n\t\t\t}, 50);\n\t\t}\n\t}\n\n\t_updateSendButtonState() {\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\t\tif (input && sendBtn) {\n\t\t\tsendBtn.disabled = !input.value.trim() && this._pendingAttachments.length === 0;\n\t\t}\n\t}\n\n\t_renderAttachmentPreviews() {\n\t\tconst container = this.element.querySelector('.messenger-compose-attachments-preview');\n\t\tif (!container) return;\n\n\t\tif (this._pendingAttachments.length === 0) {\n\t\t\tcontainer.innerHTML = '';\n\t\t\tcontainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.display = 'flex';\n\t\tcontainer.innerHTML = this._pendingAttachments.map((att, i) => {\n\t\t\tconst isImage = att.type.startsWith('image');\n\t\t\tconst thumb = isImage\n\t\t\t\t? `<img class=\"messenger-attachment-thumb\" src=\"${att.preview}\" alt=\"${this._escapeHtml(att.file.name)}\" />`\n\t\t\t\t: `<div class=\"messenger-attachment-thumb messenger-attachment-file-icon\"><i class=\"ph ph-file\"></i></div>`;\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-attachment-preview\" data-index=\"${i}\">\n\t\t\t\t\t${thumb}\n\t\t\t\t\t<button class=\"messenger-attachment-remove\" data-index=\"${i}\" aria-label=\"Remove\">×</button>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}).join('');\n\n\t\t// Attach remove button events\n\t\tcontainer.querySelectorAll('.messenger-attachment-remove').forEach((btn) => {\n\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\tconst idx = parseInt(e.currentTarget.dataset.index, 10);\n\t\t\t\tthis._pendingAttachments.splice(idx, 1);\n\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\tthis._updateSendButtonState();\n\t\t\t});\n\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-back-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('messages');\n\t\t\t});\n\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\t// Compose input (not rendered when conversation is closed)\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\n\t\tif (input && sendBtn) {\n\t\t\tinput.addEventListener('input', () => {\n\t\t\t\t// Auto-resize textarea\n\t\t\t\tinput.style.height = 'auto';\n\t\t\t\tinput.style.height = Math.min(input.scrollHeight, 120) + 'px';\n\n\t\t\t\t// Enable/disable send button\n\t\t\t\tthis._updateSendButtonState();\n\n\t\t\t\t// Send typing indicator\n\t\t\t\tif (input.value.trim()) {\n\t\t\t\t\tthis._startTyping();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter' && !e.shiftKey) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis._sendMessage();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsendBtn.addEventListener('click', () => {\n\t\t\t\tthis._sendMessage();\n\t\t\t});\n\t\t}\n\n\t\t// Attach button + file input\n\t\tconst attachBtn = this.element.querySelector('.messenger-compose-attach');\n\t\tconst fileInput = this.element.querySelector('.messenger-compose-file-input');\n\n\t\tif (attachBtn && fileInput) {\n\t\t\tattachBtn.addEventListener('click', () => {\n\t\t\t\tfileInput.click();\n\t\t\t});\n\n\t\t\tfileInput.addEventListener('change', (e) => {\n\t\t\t\tconst files = e.target.files;\n\t\t\t\tif (!files) return;\n\t\t\t\tArray.from(files).forEach((file) => {\n\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\treader.onload = (ev) => {\n\t\t\t\t\t\tthis._pendingAttachments.push({\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tpreview: ev.target.result,\n\t\t\t\t\t\t\ttype: file.type,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t\t};\n\t\t\t\t\treader.readAsDataURL(file);\n\t\t\t\t});\n\t\t\t\tfileInput.value = '';\n\t\t\t});\n\t\t}\n\n\t\t// Email overlay events\n\t\tconst emailInput = this.element.querySelector('.messenger-email-input');\n\t\tconst emailSubmit = this.element.querySelector('.messenger-email-submit');\n\t\tconst emailSkip = this.element.querySelector('.messenger-email-skip');\n\n\t\tif (emailInput) {\n\t\t\temailInput.addEventListener('input', () => {\n\t\t\t\tconst isValid = this._isValidEmail(emailInput.value.trim());\n\t\t\t\temailSubmit.disabled = !isValid;\n\t\t\t});\n\n\t\t\temailInput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter' && !emailSubmit.disabled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis._handleEmailSubmit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (emailSubmit) {\n\t\t\temailSubmit.addEventListener('click', () => {\n\t\t\t\tthis._handleEmailSubmit();\n\t\t\t});\n\t\t}\n\n\t\tif (emailSkip) {\n\t\t\temailSkip.addEventListener('click', () => {\n\t\t\t\tthis._hideEmailOverlay();\n\t\t\t});\n\t\t}\n\n\t\t// Delegated events for attachment clicks\n\t\tconst messagesContainer = this.element.querySelector('.messenger-chat-messages');\n\t\tif (messagesContainer) {\n\t\t\tmessagesContainer.addEventListener('click', (e) => {\n\t\t\t\t// File click -> download\n\t\t\t\tconst fileLink = e.target.closest('.messenger-message-file');\n\t\t\t\tif (fileLink) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst url = fileLink.dataset.url;\n\t\t\t\t\tconst name = fileLink.dataset.name;\n\t\t\t\t\tthis._downloadFile(url, name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Image click -> open in new tab\n\t\t\t\tconst img = e.target.closest('.messenger-message-image');\n\t\t\t\tif (img) {\n\t\t\t\t\tconst url = img.dataset.url || img.src;\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _downloadFile(url, name) {\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst blob = await response.blob();\n\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.href = blobUrl;\n\t\t\ta.download = name || 'download';\n\t\t\ta.style.display = 'none';\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\tdocument.body.removeChild(a);\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t} catch {\n\t\t\t// Fallback: open in new tab\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\t}\n\n\t_isValidEmail(email) {\n\t\treturn /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n\t}\n\n\t_showEmailOverlay() {\n\t\tconst overlay = this.element.querySelector('.messenger-email-overlay');\n\t\tif (overlay) {\n\t\t\toverlay.style.display = 'flex';\n\t\t\tconst emailInput = overlay.querySelector('.messenger-email-input');\n\t\t\tif (emailInput) {\n\t\t\t\tsetTimeout(() => emailInput.focus(), 100);\n\t\t\t}\n\t\t}\n\t}\n\n\t_startPendingConversation() {\n\t\tif (this._pendingMessage && this.options.onStartConversation) {\n\t\t\tthis.options.onStartConversation(this._pendingMessage, this._pendingAttachmentsForSend || []);\n\t\t\tthis._pendingMessage = null;\n\t\t\tthis._pendingAttachmentsForSend = null;\n\t\t}\n\t}\n\n\t_hideEmailOverlay() {\n\t\tthis._showEmailOverlayFlag = false;\n\t\tconst overlay = this.element.querySelector('.messenger-email-overlay');\n\t\tif (overlay) {\n\t\t\toverlay.style.display = 'none';\n\t\t}\n\t}\n\n\tasync _handleEmailSubmit() {\n\t\tconst nameInput = this.element.querySelector('.messenger-email-name');\n\t\tconst emailInput = this.element.querySelector('.messenger-email-input');\n\t\tconst submitBtn = this.element.querySelector('.messenger-email-submit');\n\n\t\tconst name = nameInput?.value.trim() || '';\n\t\tconst email = emailInput?.value.trim();\n\n\t\tif (!email || !this._isValidEmail(email)) return;\n\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitBtn.textContent = 'Saving...';\n\n\t\ttry {\n\t\t\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({ name, email });\n\t\t\t}\n\n\t\t\tif (!this.state.userContext) {\n\t\t\t\tthis.state.userContext = {};\n\t\t\t}\n\t\t\tthis.state.userContext.name = name;\n\t\t\tthis.state.userContext.email = email;\n\n\t\t\tthis._hideEmailOverlay();\n\t\t\tthis._startPendingConversation();\n\t\t} catch (error) {\n\t\t\tconsole.error('[ChatView] Failed to save email:', error);\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitBtn.textContent = 'Set my email';\n\t\t}\n\t}\n\n\tasync _sendMessage() {\n\t\tif (this._isConversationClosed) return;\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst content = input.value.trim();\n\t\tconst hasAttachments = this._pendingAttachments.length > 0;\n\n\t\tif (!content && !hasAttachments) return;\n\n\t\tthis._stopTyping();\n\n\t\t// Collect attachments to upload\n\t\tconst attachmentsToSend = [...this._pendingAttachments];\n\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\t\tconst needsContactInfo = !this.state.userContext?.email;\n\n\t\tif (isNewConversation) {\n\t\t\t// Show user's message in chat immediately\n\t\t\tconst localMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: content,\n\t\t\t\tisOwn: true,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tattachments: attachmentsToSend.map((a) => ({\n\t\t\t\t\turl: a.preview,\n\t\t\t\t\ttype: a.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: a.file.name,\n\t\t\t\t})),\n\t\t\t};\n\t\t\tthis._appendMessage(localMessage);\n\t\t\tthis._scrollToBottom();\n\n\t\t\tif (needsContactInfo) {\n\t\t\t\tthis._pendingMessage = content;\n\t\t\t\tthis._pendingAttachmentsForSend = attachmentsToSend;\n\t\t\t\tthis._showEmailOverlayFlag = true;\n\t\t\t\tsetTimeout(() => this._showEmailOverlay(), 300);\n\t\t\t} else {\n\t\t\t\tif (this.options.onStartConversation) {\n\t\t\t\t\tthis.options.onStartConversation(content, attachmentsToSend);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst message = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: content,\n\t\t\t\tisOwn: true,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tattachments: attachmentsToSend.map((a) => ({\n\t\t\t\t\turl: a.preview,\n\t\t\t\t\ttype: a.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: a.file.name,\n\t\t\t\t})),\n\t\t\t};\n\n\t\t\tthis.state.addMessage(this.state.activeConversationId, message);\n\n\t\t\tif (this.options.onSendMessage) {\n\t\t\t\tthis.options.onSendMessage(this.state.activeConversationId, message, attachmentsToSend);\n\t\t\t}\n\t\t}\n\n\t\t// Clear input and attachments\n\t\tinput.value = '';\n\t\tinput.style.height = 'auto';\n\t\tthis._pendingAttachments = [];\n\t\tthis._renderAttachmentPreviews();\n\t\tthis._updateSendButtonState();\n\t}\n\n\t_startTyping() {\n\t\tif (this._isConversationClosed) return;\n\t\tif (!this._isTyping && this.state.activeConversationId) {\n\t\t\tthis._isTyping = true;\n\t\t\tif (this.options.onTyping) {\n\t\t\t\tthis.options.onTyping(this.state.activeConversationId, true);\n\t\t\t}\n\t\t}\n\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t}\n\t\tthis._typingTimeout = setTimeout(() => {\n\t\t\tthis._stopTyping();\n\t\t}, 3000);\n\t}\n\n\t_stopTyping() {\n\t\tif (this._isTyping && this.state.activeConversationId) {\n\t\t\tthis._isTyping = false;\n\t\t\tif (this.options.onTyping) {\n\t\t\t\tthis.options.onTyping(this.state.activeConversationId, false);\n\t\t\t}\n\t\t}\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t\tthis._typingTimeout = null;\n\t\t}\n\t}\n\n\t_showTypingIndicator(userName) {\n\t\tif (this._typingIndicator) {\n\t\t\tthis._typingIndicator.style.display = 'flex';\n\t\t\tconst textEl = this._typingIndicator.querySelector(\n\t\t\t\t'.messenger-typing-text'\n\t\t\t);\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = `${userName || 'Support'} is typing...`;\n\t\t\t}\n\t\t\tthis._scrollToBottom();\n\t\t}\n\t}\n\n\t_hideTypingIndicator() {\n\t\tif (this._typingIndicator) {\n\t\t\tthis._typingIndicator.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t}\n\t\tthis._stopTyping();\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}","export class ConversationsView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-conversations-view';\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'conversationAdded' ||\n\t\t\t\ttype === 'conversationRead' ||\n\t\t\t\ttype === 'conversationUpdated'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst conversations = this.state.conversations;\n\t\tconst avatarsHtml = this._renderAvatarStack();\n\n\t\tlet conversationsHtml;\n\t\tif (conversations.length === 0) {\n\t\t\tconversationsHtml = `\n\t\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78.69.69,0,0,0,.13-.11L82.5,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H82.5a16,16,0,0,0-10.3,3.75l-.12.11L40,224V64H216Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No conversations yet</h3>\n\t\t\t\t\t<p>Start a new conversation with our team</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t} else {\n\t\t\tconversationsHtml = `\n\t\t\t\t<div class=\"messenger-conversations-list\">\n\t\t\t\t\t${conversations.map((conv) => this._renderConversationItem(conv)).join('')}\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-conversations-header\">\n\t\t\t\t<h2>Messages</h2>\n\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-conversations-body\">\n\t\t\t\t${conversationsHtml}\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-conversations-footer\">\n\t\t\t\t<button class=\"messenger-new-message-btn\">\n\t\t\t\t\t<div class=\"messenger-new-message-avatars\">${avatarsHtml}</div>\n\t\t\t\t\t<span>Send us a message</span>\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderConversationItem(conversation) {\n\t\tconst unreadClass = conversation.unread > 0 ? 'unread' : '';\n\t\tconst timeAgo = this._formatTimeAgo(conversation.lastMessageTime);\n\t\tconst avatarsHtml = this._renderConversationAvatars(\n\t\t\tconversation.participants\n\t\t);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-conversation-item ${unreadClass}\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"messenger-conversation-avatars\">\n\t\t\t\t\t${avatarsHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-conversation-content\">\n\t\t\t\t\t<div class=\"messenger-conversation-header\">\n\t\t\t\t\t\t<span class=\"messenger-conversation-title\">${conversation.title || 'Chat with team'}</span>\n\t\t\t\t\t\t<span class=\"messenger-conversation-time\">${timeAgo}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"messenger-conversation-preview\">\n\t\t\t\t\t\t${conversation.unread > 0 ? '<span class=\"messenger-unread-dot\"></span>' : ''}\n\t\t\t\t\t\t<span class=\"messenger-conversation-message\">${this._truncateMessage(conversation.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderConversationAvatars(participants) {\n\t\tif (!participants || participants.length === 0) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">S</div>`;\n\t\t}\n\n\t\tconst p = participants[0];\n\t\tif (p.avatarUrl) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${p.avatarUrl}\" alt=\"${p.name}\" /></div>`;\n\t\t}\n\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${(p.name || 'S').charAt(0).toUpperCase()}</div>`;\n\t}\n\n\t_renderAvatarStack() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-sm\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-sm\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 2)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_formatTimeAgo(timestamp) {\n\t\tif (!timestamp) return '';\n\t\tconst date = new Date(timestamp);\n\t\tconst now = new Date();\n\t\tconst diffMs = now - date;\n\t\tconst diffMins = Math.floor(diffMs / 60000);\n\t\tconst diffHours = Math.floor(diffMs / 3600000);\n\t\tconst diffDays = Math.floor(diffMs / 86400000);\n\n\t\tif (diffMins < 1) return 'now';\n\t\tif (diffMins < 60) return `${diffMins}m`;\n\t\tif (diffHours < 24) return `${diffHours}h`;\n\t\tif (diffDays < 7) return `${diffDays}d`;\n\t\treturn date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\t}\n\n\t_truncateMessage(message) {\n\t\tif (!message) return 'No messages yet';\n\t\tconst maxLength = 50;\n\t\tif (message.length <= maxLength) return message;\n\t\treturn message.substring(0, maxLength) + '...';\n\t}\n\n\t_attachEvents() {\n\t\tconst closeBtn = this.element.querySelector('.sdk-close-btn');\n\t\tif (closeBtn) {\n\t\t\tcloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-conversation-item')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst convId = item.dataset.conversationId;\n\t\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\t\tthis.state.markAsRead(convId);\n\t\t\t\t\tthis.state.setView('chat');\n\n\t\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\tconst newMsgBtn = this.element.querySelector('.messenger-new-message-btn');\n\t\tif (newMsgBtn) {\n\t\t\tnewMsgBtn.addEventListener('click', () => {\n\t\t\t\tthis._startNewConversation();\n\t\t\t});\n\t\t}\n\t}\n\n\t_startNewConversation() {\n\t\t// If there's an open conversation, route to it instead of creating new\n\t\tconst openConversation = this.state.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.state.setActiveConversation(openConversation.id);\n\t\t\tthis.state.markAsRead(openConversation.id);\n\t\t\tthis.state.setView('chat');\n\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\tthis.options.onSelectConversation(openConversation.id);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.state.setActiveConversation(null);\n\t\t\tif (this.options.onStartNewConversation) {\n\t\t\t\tthis.options.onStartNewConversation();\n\t\t\t} else {\n\t\t\t\tthis.state.setView('chat');\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}","export class HelpView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-help-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'helpArticlesUpdate' || type === 'helpSearchChange') {\n\t\t\t\tthis._updateCollectionsList();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst searchQuery = this.state.helpSearchQuery || '';\n\t\tconst collections = this.state.helpArticles || [];\n\t\tconst collectionCount = collections.length;\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-help-header\">\n\t\t\t\t<h2>Help</h2>\n\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-help-search\">\n\t\t\t\t<div class=\"messenger-help-search-wrapper\">\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tclass=\"sdk-input messenger-help-search-input\"\n\t\t\t\t\t\tplaceholder=\"Search for help\"\n\t\t\t\t\t\tvalue=\"${searchQuery}\"\n\t\t\t\t\t/>\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"#000000\" viewBox=\"0 0 256 256\" class=\"messenger-help-search-icon\">\n\t\t\t\t\t\t<path d=\"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-help-body\">\n\t\t\t\t<div class=\"messenger-help-collections-header\">\n\t\t\t\t\t${collectionCount} collections\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-help-collections\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._updateCollectionsList();\n\t\tthis._attachEvents();\n\t}\n\n\t_updateCollectionsList() {\n\t\tconst collectionsContainer = this.element.querySelector(\n\t\t\t'.messenger-help-collections'\n\t\t);\n\t\tconst collections = this.state.helpArticles || [];\n\t\tconst searchQuery = (this.state.helpSearchQuery || '').toLowerCase();\n\n\t\tconst filteredCollections = searchQuery\n\t\t\t? collections.filter(\n\t\t\t\t\t(c) =>\n\t\t\t\t\t\tc.title.toLowerCase().includes(searchQuery) ||\n\t\t\t\t\t\t(c.description && c.description.toLowerCase().includes(searchQuery))\n\t\t\t\t)\n\t\t\t: collections;\n\n\t\tconst headerEl = this.element.querySelector(\n\t\t\t'.messenger-help-collections-header'\n\t\t);\n\t\tif (headerEl) {\n\t\t\theaderEl.textContent = `${filteredCollections.length} collections`;\n\t\t}\n\n\t\tif (filteredCollections.length === 0) {\n\t\t\tcollectionsContainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tcollectionsContainer.innerHTML = filteredCollections\n\t\t\t.map((collection) => this._renderCollectionItem(collection))\n\t\t\t.join('');\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_renderCollectionItem(collection) {\n\t\tconst articleCount = collection.articleCount || 0;\n\t\treturn `\n\t\t\t<div class=\"messenger-help-collection\" data-collection-id=\"${collection.id}\">\n\t\t\t\t<div class=\"messenger-help-collection-content\">\n\t\t\t\t\t<h3 class=\"messenger-help-collection-title\">${collection.title}</h3>\n\t\t\t\t\t<p class=\"messenger-help-collection-desc\">${collection.description || ''}</p>\n\t\t\t\t\t<span class=\"messenger-help-collection-count\">${articleCount} articles</span>\n\t\t\t\t</div>\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\" class=\"messenger-help-collection-arrow\">\n\t\t\t\t\t<path d=\"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z\"></path>\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderEmptyState() {\n\t\tconst isSearching = this.state.helpSearchQuery;\n\n\t\tif (isSearching) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No results found</h3>\n\t\t\t\t\t<p>Try a different search term</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3>Help collections</h3>\n\t\t\t\t<p>No collections available yet</p>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst searchInput = this.element.querySelector(\n\t\t\t'.messenger-help-search-input'\n\t\t);\n\t\tlet searchTimeout;\n\t\tsearchInput.addEventListener('input', (e) => {\n\t\t\tclearTimeout(searchTimeout);\n\t\t\tsearchTimeout = setTimeout(() => {\n\t\t\t\tthis.state.setHelpSearchQuery(e.target.value);\n\t\t\t}, 300);\n\t\t});\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_attachCollectionEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-help-collection')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst collectionId = item.dataset.collectionId;\n\t\t\t\t\tconst collection = this.state.helpArticles.find(\n\t\t\t\t\t\t(c) => c.id === collectionId\n\t\t\t\t\t);\n\t\t\t\t\tif (collection && collection.url) {\n\t\t\t\t\t\twindow.open(collection.url, '_blank');\n\t\t\t\t\t} else if (this.options.onArticleClick) {\n\t\t\t\t\t\tthis.options.onArticleClick(collection);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}","export class HomeView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-home-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'homeChangelogUpdate' ||\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'availabilityUpdate'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst avatarsHtml = this._renderAvatarStack();\n\t\tconst recentChangelogHtml = this._renderRecentChangelog();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-home-header\">\n\t\t\t\t<div class=\"messenger-home-header-top\">\n\t\t\t\t\t<div class=\"messenger-home-logo\">\n\t\t\t\t\t\t${this.options.logoUrl ? `<img src=\"${this.options.logoUrl}\" alt=\"${this.state.teamName}\" />` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"messenger-home-avatars\">${avatarsHtml}</div>\n\t\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-home-welcome\">\n\t\t\t\t\t<span class=\"messenger-home-greeting\">Hello there.</span>\n\t\t\t\t\t<span class=\"messenger-home-question\">${this.state.welcomeMessage}</span>\n\t\t\t\t\t${this._renderAvailabilityStatus()}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-home-body\">\n\t\t\t\t${this._renderMessageButton()}\n\n\t\t\t\t${this._renderFeaturedCard()}\n\n\t\t\t\t${recentChangelogHtml}\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderAvatarStack() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_renderAvailabilityStatus() {\n\t\tconst isOnline = this.state.agentsOnline;\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\n\t\tif (isOnline) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-home-availability\">\n\t\t\t\t\t<span class=\"messenger-availability-dot messenger-availability-online\"></span>\n\t\t\t\t\t<span class=\"messenger-availability-text\">We're online now</span>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-availability\">\n\t\t\t\t<span class=\"messenger-availability-dot messenger-availability-away\"></span>\n\t\t\t\t<span class=\"messenger-availability-text\">${responseTime}</span>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderMessageButton() {\n\t\tconst openConversation = this.state.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tconst preview = openConversation.lastMessage\n\t\t\t\t? (openConversation.lastMessage.length > 40\n\t\t\t\t\t? openConversation.lastMessage.substring(0, 40) + '...'\n\t\t\t\t\t: openConversation.lastMessage)\n\t\t\t\t: 'Continue your conversation';\n\n\t\t\treturn `\n\t\t\t\t<button class=\"messenger-home-message-btn messenger-home-continue-btn\" data-conversation-id=\"${openConversation.id}\">\n\t\t\t\t\t<div class=\"messenger-home-continue-info\">\n\t\t\t\t\t\t<span class=\"messenger-home-continue-label\">Continue conversation</span>\n\t\t\t\t\t\t<span class=\"messenger-home-continue-preview\">${preview}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<i class=\"ph ph-arrow-right\"></i>\n\t\t\t\t</button>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<button class=\"messenger-home-message-btn\">\n\t\t\t\t<span>Send us a message</span>\n\t\t\t\t<i class=\"ph ph-arrow-right\"></i>\n\t\t\t</button>\n\t\t`;\n\t}\n\n\t_renderFeaturedCard() {\n\t\tif (!this.options.featuredContent) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst { title, description, imageUrl, action } =\n\t\t\tthis.options.featuredContent;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-featured\">\n\t\t\t\t${imageUrl ? `<img src=\"${imageUrl}\" alt=\"${title}\" class=\"messenger-home-featured-image\" onerror=\"this.style.display='none';\" />` : ''}\n\t\t\t\t<div class=\"messenger-home-featured-content\">\n\t\t\t\t\t<h3>${title}</h3>\n\t\t\t\t\t<p>${description}</p>\n\t\t\t\t</div>\n\t\t\t\t${action ? `<button class=\"sdk-btn sdk-btn-primary messenger-home-featured-btn\" data-action=\"${action.type}\" data-value=\"${action.value}\">${action.label}</button>` : ''}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderRecentChangelog() {\n\t\tconst changelogItems = this.state.homeChangelogItems;\n\t\tif (changelogItems.length === 0) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst changelogHtml = changelogItems\n\t\t\t.map(\n\t\t\t\t(item) => `\n\t\t\t<div class=\"messenger-home-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${\n\t\t\t\t\titem.coverImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"messenger-home-changelog-cover\">\n\t\t\t\t\t\t<img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.style.display='none';\" />\n\t\t\t\t\t\t${item.coverText ? `<span class=\"messenger-home-changelog-cover-text\">${item.coverText}</span>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-home-changelog-card-content\">\n\t\t\t\t\t<h4 class=\"messenger-home-changelog-card-title\">${item.title}</h4>\n\t\t\t\t\t<p class=\"messenger-home-changelog-card-desc\">${item.description || ''}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t\t\t)\n\t\t\t.join('');\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-changelog-section\">\n\t\t\t\t${changelogHtml}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_formatDate(dateString) {\n\t\tif (!dateString) return '';\n\t\tconst date = new Date(dateString);\n\t\tconst now = new Date();\n\t\tconst diffDays = Math.floor((now - date) / (1000 * 60 * 60 * 24));\n\n\t\tif (diffDays === 0) return 'Today';\n\t\tif (diffDays === 1) return 'Yesterday';\n\t\tif (diffDays < 7) return `${diffDays}d ago`;\n\t\treturn date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\t// Send message / continue conversation button\n\t\tconst msgBtn = this.element.querySelector('.messenger-home-message-btn');\n\t\tif (msgBtn) {\n\t\t\tmsgBtn.addEventListener('click', () => {\n\t\t\t\tconst convId = msgBtn.dataset.conversationId;\n\t\t\t\tif (convId) {\n\t\t\t\t\t// Continue existing open conversation\n\t\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\t\tthis.state.setView('chat');\n\t\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// No open conversation — start new\n\t\t\t\t\tthis.state.setActiveConversation(null);\n\t\t\t\t\tthis.state.setView('chat');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-home-changelog-item')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tthis.state.setView('changelog');\n\t\t\t\t});\n\t\t\t});\n\n\t\tconst seeAllBtn = this.element.querySelector(\n\t\t\t'.messenger-home-changelog-all'\n\t\t);\n\t\tif (seeAllBtn) {\n\t\t\tseeAllBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('changelog');\n\t\t\t});\n\t\t}\n\n\t\tconst featuredBtn = this.element.querySelector(\n\t\t\t'.messenger-home-featured-btn'\n\t\t);\n\t\tif (featuredBtn) {\n\t\t\tfeaturedBtn.addEventListener('click', () => {\n\t\t\t\tconst action = featuredBtn.dataset.action;\n\t\t\t\tconst value = featuredBtn.dataset.value;\n\t\t\t\tif (action === 'url') {\n\t\t\t\t\twindow.open(value, '_blank');\n\t\t\t\t} else if (action === 'view') {\n\t\t\t\t\tthis.state.setView(value);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}","export class PreChatFormView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._isSubmitting = false;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-prechat-view';\n\n\t\tthis._updateContent();\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst existingName = this.state.userContext?.name || '';\n\t\tconst existingEmail = this.state.userContext?.email || '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-prechat-overlay\">\n\t\t\t\t<div class=\"messenger-prechat-card\">\n\t\t\t\t\t<h4 class=\"messenger-prechat-title\">Get notified when we reply</h4>\n\t\t\t\t\t<form class=\"sdk-form-group\" novalidate>\n\t\t\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tid=\"messenger-prechat-name\"\n\t\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\t\tplaceholder=\"Name (optional)\"\n\t\t\t\t\t\t\t\tvalue=\"${this._escapeHtml(existingName)}\"\n\t\t\t\t\t\t\t\tautocomplete=\"name\"\n\t\t\t\t\t\t\t\tclass=\"sdk-input\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\tid=\"messenger-prechat-email\"\n\t\t\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t\t\tplaceholder=\"Email address\"\n\t\t\t\t\t\t\t\tvalue=\"${this._escapeHtml(existingEmail)}\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t\t\tclass=\"sdk-input\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span class=\"messenger-prechat-error\" id=\"messenger-email-error\"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"messenger-prechat-actions\">\n\t\t\t\t\t\t\t<button type=\"button\" class=\"sdk-btn sdk-btn-secondary messenger-prechat-skip\">Skip</button>\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"sdk-btn sdk-btn-primary sdk-btn-block messenger-prechat-submit\" disabled>\n\t\t\t\t\t\t\t\t<span class=\"messenger-prechat-submit-text\">Continue</span>\n\t\t\t\t\t\t\t\t<span class=\"messenger-prechat-submit-loading\">\n\t\t\t\t\t\t\t\t\t<i class=\"ph ph-spinner\"></i>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\t_attachEvents() {\n\t\t// Form validation\n\t\tconst form = this.element.querySelector('form');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst skipBtn = this.element.querySelector('.messenger-prechat-skip');\n\n\t\tconst validateForm = () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tconst isEmailValid = this._isValidEmail(email);\n\t\t\tsubmitBtn.disabled = !isEmailValid;\n\t\t\treturn isEmailValid;\n\t\t};\n\n\t\temailInput.addEventListener('input', () => {\n\t\t\tthis._clearError('messenger-email-error');\n\t\t\tvalidateForm();\n\t\t});\n\n\t\temailInput.addEventListener('blur', () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tif (email && !this._isValidEmail(email)) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t}\n\t\t});\n\n\t\tskipBtn.addEventListener('click', () => {\n\t\t\tthis.state.setView('chat');\n\t\t});\n\n\t\tform.addEventListener('submit', async (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (this._isSubmitting) return;\n\t\t\tif (!validateForm()) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this._handleSubmit();\n\t\t});\n\n\t\tvalidateForm();\n\n\t\tsetTimeout(() => emailInput.focus(), 100);\n\t}\n\n\t_isValidEmail(email) {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\treturn emailRegex.test(email);\n\t}\n\n\t_showError(elementId, message) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = message;\n\t\t\terrorEl.style.display = 'block';\n\t\t}\n\t}\n\n\t_clearError(elementId) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = '';\n\t\t\terrorEl.style.display = 'none';\n\t\t}\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst nameInput = this.element.querySelector('#messenger-prechat-name');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst submitText = submitBtn.querySelector('.messenger-prechat-submit-text');\n\t\tconst submitLoading = submitBtn.querySelector('.messenger-prechat-submit-loading');\n\n\t\tconst name = nameInput.value.trim();\n\t\tconst email = emailInput.value.trim();\n\n\t\tthis._isSubmitting = true;\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitText.style.display = 'none';\n\t\tsubmitLoading.style.display = 'inline-flex';\n\n\t\ttry {\n\t\t\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({ name, email });\n\t\t\t}\n\n\t\t\tif (!this.state.userContext) {\n\t\t\t\tthis.state.userContext = {};\n\t\t\t}\n\t\t\tthis.state.userContext.name = name;\n\t\t\tthis.state.userContext.email = email;\n\n\t\t\tthis._isSubmitting = false;\n\n\t\t\tthis.state.setView('chat');\n\t\t} catch (error) {\n\t\t\tconsole.error('[PreChatFormView] Error submitting form:', error);\n\t\t\tthis._showError('messenger-email-error', 'Something went wrong. Please try again.');\n\n\t\t\tthis._isSubmitting = false;\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitText.style.display = 'inline';\n\t\t\tsubmitLoading.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","/**\n * WebSocketService - Real-time communication for messenger widget\n */\n\nexport class WebSocketService {\n\tconstructor(config = {}) {\n\t\tthis.baseURL = config.baseURL || '';\n\t\tthis.workspace = config.workspace || '';\n\t\tthis.sessionToken = config.sessionToken || null;\n\t\tthis.mock = config.mock || false;\n\n\t\tthis.ws = null;\n\t\tthis.reconnectAttempts = 0;\n\t\tthis.maxReconnectAttempts = 5;\n\t\tthis.reconnectDelay = 1000;\n\t\tthis.pingInterval = null;\n\t\tthis.isConnected = false;\n\n\t\t// Event listeners\n\t\tthis._listeners = new Map();\n\n\t\t// Bind methods\n\t\tthis._onOpen = this._onOpen.bind(this);\n\t\tthis._onMessage = this._onMessage.bind(this);\n\t\tthis._onClose = this._onClose.bind(this);\n\t\tthis._onError = this._onError.bind(this);\n\t}\n\n\t/**\n\t * Connect to WebSocket server\n\t */\n\tconnect(sessionToken = null) {\n\t\tif (sessionToken) {\n\t\t\tthis.sessionToken = sessionToken;\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.warn('[WebSocket] No session token provided');\n\t\t\treturn;\n\t\t}\n\n\t\t// Mock mode - simulate connection\n\t\tif (this.mock) {\n\t\t\tthis.isConnected = true;\n\t\t\tthis._emit('connected', {});\n\t\t\tthis._startMockResponses();\n\t\t\treturn;\n\t\t}\n\n\t\t// Build WebSocket URL\n\t\tconst wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n\t\tlet wsURL = this.baseURL.replace(/^https?:/, wsProtocol);\n\t\twsURL = wsURL.replace('/api/v1', '');\n\t\twsURL = `${wsURL}/api/v1/widget/messenger/ws?token=${encodeURIComponent(this.sessionToken)}`;\n\n\t\ttry {\n\t\t\tthis.ws = new WebSocket(wsURL);\n\t\t\tthis.ws.onopen = this._onOpen;\n\t\t\tthis.ws.onmessage = this._onMessage;\n\t\t\tthis.ws.onclose = this._onClose;\n\t\t\tthis.ws.onerror = this._onError;\n\t\t} catch (error) {\n\t\t\tconsole.error('[WebSocket] Connection error:', error);\n\t\t\tthis._scheduleReconnect();\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from WebSocket server\n\t */\n\tdisconnect() {\n\t\tthis.isConnected = false;\n\t\tthis.reconnectAttempts = this.maxReconnectAttempts; // Prevent reconnection\n\n\t\tif (this.pingInterval) {\n\t\t\tclearInterval(this.pingInterval);\n\t\t\tthis.pingInterval = null;\n\t\t}\n\n\t\tif (this.ws) {\n\t\t\tthis.ws.close();\n\t\t\tthis.ws = null;\n\t\t}\n\n\t\tif (this._mockInterval) {\n\t\t\tclearInterval(this._mockInterval);\n\t\t\tthis._mockInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to events\n\t * @param {string} event - Event name\n\t * @param {Function} callback - Event handler\n\t * @returns {Function} Unsubscribe function\n\t */\n\ton(event, callback) {\n\t\tif (!this._listeners.has(event)) {\n\t\t\tthis._listeners.set(event, new Set());\n\t\t}\n\t\tthis._listeners.get(event).add(callback);\n\t\treturn () => this._listeners.get(event).delete(callback);\n\t}\n\n\t/**\n\t * Remove event listener\n\t */\n\toff(event, callback) {\n\t\tif (this._listeners.has(event)) {\n\t\t\tthis._listeners.get(event).delete(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Send message through WebSocket\n\t */\n\tsend(type, payload = {}) {\n\t\tif (!this.isConnected) {\n\t\t\tconsole.warn('[WebSocket] Not connected, cannot send message');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\t// Mock mode - just log\n\t\t\tconsole.log('[WebSocket Mock] Sending:', type, payload);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.ws && this.ws.readyState === WebSocket.OPEN) {\n\t\t\tthis.ws.send(JSON.stringify({ type, payload }));\n\t\t}\n\t}\n\n\t// Private methods\n\n\t_onOpen() {\n\t\tconsole.log('[WebSocket] Connected');\n\t\tthis.isConnected = true;\n\t\tthis.reconnectAttempts = 0;\n\t\tthis._emit('connected', {});\n\n\t\t// Start ping interval to keep connection alive\n\t\tthis.pingInterval = setInterval(() => {\n\t\t\tthis.send('ping', {});\n\t\t}, 30000);\n\t}\n\n\t_onMessage(event) {\n\t\ttry {\n\t\t\tconst data = JSON.parse(event.data);\n\t\t\tconst { type, payload } = data;\n\n\t\t\t// Handle different event types\n\t\t\tswitch (type) {\n\t\t\t\tcase 'message:new':\n\t\t\t\t\tthis._emit('message', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'typing:started':\n\t\t\t\t\tthis._emit('typing_started', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'typing:stopped':\n\t\t\t\t\tthis._emit('typing_stopped', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'conversation:updated':\n\t\t\t\t\tthis._emit('conversation_updated', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'conversation:closed':\n\t\t\t\t\tthis._emit('conversation_closed', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'availability:changed':\n\t\t\t\t\tthis._emit('availability_changed', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'pong':\n\t\t\t\t\t// Ping response, ignore\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.log('[WebSocket] Unknown event:', type, payload);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[WebSocket] Failed to parse message:', error);\n\t\t}\n\t}\n\n\t_onClose(event) {\n\t\tconsole.log('[WebSocket] Disconnected:', event.code, event.reason);\n\t\tthis.isConnected = false;\n\n\t\tif (this.pingInterval) {\n\t\t\tclearInterval(this.pingInterval);\n\t\t\tthis.pingInterval = null;\n\t\t}\n\n\t\tthis._emit('disconnected', { code: event.code, reason: event.reason });\n\t\tthis._scheduleReconnect();\n\t}\n\n\t_onError(error) {\n\t\tconsole.error('[WebSocket] Error:', error);\n\t\tthis._emit('error', { error });\n\t}\n\n\t_scheduleReconnect() {\n\t\tif (this.reconnectAttempts >= this.maxReconnectAttempts) {\n\t\t\tconsole.log('[WebSocket] Max reconnect attempts reached');\n\t\t\tthis._emit('reconnect_failed', {});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reconnectAttempts++;\n\t\tconst delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\t\tconsole.log(\n\t\t\t`[WebSocket] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`\n\t\t);\n\n\t\tsetTimeout(() => {\n\t\t\tthis.connect();\n\t\t}, delay);\n\t}\n\n\t_emit(event, data) {\n\t\tif (this._listeners.has(event)) {\n\t\t\tthis._listeners.get(event).forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`[WebSocket] Error in ${event} handler:`, error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Mock support for development\n\t_startMockResponses() {\n\t\t// Simulate agent typing and responses\n\t\tthis._mockInterval = setInterval(() => {\n\t\t\t// Randomly emit typing or message events for demo\n\t\t\tconst random = Math.random();\n\t\t\tif (random < 0.1) {\n\t\t\t\tthis._emit('typing_started', {\n\t\t\t\t\tconversation_id: 'conv_1',\n\t\t\t\t\tuser_id: 'agent_1',\n\t\t\t\t\tuser_name: 'Sarah',\n\t\t\t\t\tis_agent: true,\n\t\t\t\t});\n\n\t\t\t\t// Stop typing after 2 seconds\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._emit('typing_stopped', {\n\t\t\t\t\t\tconversation_id: 'conv_1',\n\t\t\t\t\t\tuser_id: 'agent_1',\n\t\t\t\t\t});\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t}, 10000);\n\t}\n\n\t/**\n\t * Simulate receiving a message (for mock mode)\n\t */\n\tsimulateMessage(conversationId, message) {\n\t\tif (this.mock) {\n\t\t\tthis._emit('message', {\n\t\t\t\tconversation_id: conversationId,\n\t\t\t\tmessage: {\n\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\tcontent: message.content,\n\t\t\t\t\tsender_type: message.sender_type || 'agent',\n\t\t\t\t\tsender_name: message.sender_name || 'Support',\n\t\t\t\t\tsender_avatar: message.sender_avatar || null,\n\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n}\n","\nimport { BaseWidget } from './BaseWidget.js';\nimport { MessengerState } from './messenger/MessengerState.js';\nimport { MessengerLauncher } from './messenger/components/MessengerLauncher.js';\nimport { MessengerPanel } from './messenger/components/MessengerPanel.js';\nimport { ChangelogView } from './messenger/views/ChangelogView.js';\nimport { ChatView } from './messenger/views/ChatView.js';\nimport { ConversationsView } from './messenger/views/ConversationsView.js';\nimport { HelpView } from './messenger/views/HelpView.js';\nimport { HomeView } from './messenger/views/HomeView.js';\nimport { PreChatFormView } from './messenger/views/PreChatFormView.js';\nimport { WebSocketService } from '../core/WebSocketService.js';\n\nexport class MessengerWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'messenger' });\n\n\t\tthis.messengerOptions = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || 'light',\n\t\t\tteamName: options.teamName || 'Support',\n\t\t\tteamAvatars: options.teamAvatars || [],\n\t\t\twelcomeMessage: options.welcomeMessage || 'How can we help?',\n\t\t\tenableHelp: options.enableHelp !== false,\n\t\t\tenableChangelog: options.enableChangelog !== false,\n\t\t\tlogoUrl: options.logoUrl || 'https://product7.io/p7logo.svg',\n\t\t\tfeaturedContent: options.featuredContent || null,\n\t\t\tprimaryColor: options.primaryColor || '#1c1c1e',\n\t\t\tonSendMessage: options.onSendMessage || null,\n\t\t\tonArticleClick: options.onArticleClick || null,\n\t\t\tonChangelogClick: options.onChangelogClick || null,\n\t\t};\n\n\t\tthis.messengerState = new MessengerState({\n\t\t\tteamName: this.messengerOptions.teamName,\n\t\t\tteamAvatars: this.messengerOptions.teamAvatars,\n\t\t\twelcomeMessage: this.messengerOptions.welcomeMessage,\n\t\t\tenableHelp: this.messengerOptions.enableHelp,\n\t\t\tenableChangelog: this.messengerOptions.enableChangelog,\n\t\t\tuserContext: this.sdk?.apiService?.getUserContext() || null,\n\t\t});\n\n\t\tthis.launcher = null;\n\t\tthis.panel = null;\n\t\tthis.wsService = null;\n\t\tthis._wsUnsubscribers = [];\n\n\t\tthis._handleOpenChange = this._handleOpenChange.bind(this);\n\t\tthis._handleWebSocketMessage = this._handleWebSocketMessage.bind(this);\n\t\tthis._handleTypingStarted = this._handleTypingStarted.bind(this);\n\t\tthis._handleTypingStopped = this._handleTypingStopped.bind(this);\n\t\tthis._handleConversationClosed = this._handleConversationClosed.bind(this);\n\t}\n\n\t_render() {\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = `messenger-widget theme-${this.messengerOptions.theme}`;\n\t\tcontainer.style.zIndex = '999999';\n\n\t\tthis.launcher = new MessengerLauncher(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t});\n\t\tcontainer.appendChild(this.launcher.render());\n\n\t\tthis.panel = new MessengerPanel(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\ttheme: this.messengerOptions.theme,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\tlogoUrl: this.messengerOptions.logoUrl,\n\t\t\tfeaturedContent: this.messengerOptions.featuredContent,\n\t\t\tonSendMessage:\n\t\t\t\tthis.messengerOptions.onSendMessage ||\n\t\t\t\tthis._handleSendMessage.bind(this),\n\t\t\tonStartConversation: this._handleStartConversation.bind(this),\n\t\t\tonTyping: this.sendTypingIndicator.bind(this),\n\t\t\tonSelectConversation: this._handleSelectConversation.bind(this),\n\t\t\tonStartNewConversation: this._handleNewConversationClick.bind(this),\n\t\t\tonIdentifyContact: this._handleIdentifyContact.bind(this),\n\t\t\tonArticleClick: this.messengerOptions.onArticleClick,\n\t\t\tonChangelogClick: this.messengerOptions.onChangelogClick,\n\t\t});\n\n\t\tthis.panel.registerView('home', HomeView);\n\t\tthis.panel.registerView('messages', ConversationsView);\n\t\tthis.panel.registerView('chat', ChatView);\n\t\tthis.panel.registerView('prechat', PreChatFormView);\n\t\tthis.panel.registerView('help', HelpView);\n\t\tthis.panel.registerView('changelog', ChangelogView);\n\n\t\tcontainer.appendChild(this.panel.render());\n\t\tthis.panel.hide();\n\n\t\treturn container;\n\t}\n\n\t_attachEvents() {\n\t\tthis._stateUnsubscribe = this.messengerState.subscribe((type, data) => {\n\t\t\tif (type === 'openChange') {\n\t\t\t\tthis._handleOpenChange(data.isOpen);\n\t\t\t}\n\t\t\tif (type === 'conversationChange') {\n\t\t\t\tthis._handleActiveConversationChange(\n\t\t\t\t\tdata.conversationId,\n\t\t\t\t\tdata.previousConversationId\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\t_handleOpenChange(isOpen) {\n\t\tif (isOpen) {\n\t\t\tthis.panel.show();\n\t\t\tthis.sdk.eventBus.emit('messenger:opened', { widget: this });\n\t\t} else {\n\t\t\tthis.panel.hide();\n\t\t\tthis.messengerState.reset();\n\t\t\tthis.sdk.eventBus.emit('messenger:closed', { widget: this });\n\t\t}\n\t}\n\n\t_handleActiveConversationChange(conversationId, previousConversationId) {\n\t\tif (previousConversationId && this.wsService) {\n\t\t\tthis.wsService.send('conversation:unsubscribe', {\n\t\t\t\tconversation_id: previousConversationId,\n\t\t\t});\n\t\t}\n\t\tif (conversationId && this.wsService) {\n\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\tconversation_id: conversationId,\n\t\t\t});\n\t\t}\n\t}\n\nasync _handleStartConversation(messageContent, pendingAttachments) {\n\ttry {\n\t\t// Check if already identified\n\t\tif (!this.messengerState.isIdentified) {\n\t\t\t// Not identified - show pre-chat form\n\t\t\tthis.messengerState.pendingMessage = {\n\t\t\t\tcontent: messageContent,\n\t\t\t\tattachments: pendingAttachments,\n\t\t\t};\n\t\t\tthis.messengerState.setView('prechat');\n\t\t\treturn null;\n\t\t}\n\n\t\t// Already identified - proceed with conversation\n\t\tconst openConversation = this.messengerState.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.messengerState.setActiveConversation(openConversation.id);\n\t\t\tawait this._handleSendMessage(\n\t\t\t\topenConversation.id,\n\t\t\t\t{ content: messageContent },\n\t\t\t\tpendingAttachments\n\t\t\t);\n\t\t\treturn openConversation;\n\t\t}\n\n\t\treturn await this.startNewConversation(\n\t\t\tmessageContent,\n\t\t\t'',\n\t\t\tpendingAttachments\n\t\t);\n\t} catch (error) {\n\t\tconsole.error('[MessengerWidget] Failed to start conversation:', error);\n\t\treturn null;\n\t}\n}\n\n\tasync _handleSelectConversation(conversationId) {\n\t\ttry {\n\t\t\tawait this.fetchMessages(conversationId);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch messages:', error);\n\t\t}\n\t}\n\n\t_handleNewConversationClick() {\n\t\tconst openConversation = this.messengerState.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.messengerState.setActiveConversation(openConversation.id);\n\t\t\tthis.messengerState.setView('chat');\n\t\t\tthis._handleSelectConversation(openConversation.id);\n\t\t} else {\n\t\t\tthis.messengerState.setActiveConversation(null);\n\t\t\tthis.messengerState.setView('chat');\n\t\t}\n\t}\n\nasync _handleIdentifyContact(contactData) {\n\ttry {\n\t\tconst response = await this.apiService.identifyContact({\n\t\t\tname: contactData.name,\n\t\t\temail: contactData.email,\n\t\t});\n\n\t\tif (response.status) {\n\t\t\tconsole.log('[MessengerWidget] Contact identified:', response.data.contact_id);\n\n\t\t\t// Update state\n\t\t\tif (!this.messengerState.userContext) {\n\t\t\t\tthis.messengerState.userContext = {};\n\t\t\t}\n\t\t\tthis.messengerState.userContext.name = contactData.name;\n\t\t\tthis.messengerState.userContext.email = contactData.email;\n\t\t\tthis.messengerState.isIdentified = true; // ADD THIS LINE\n\n\t\t\t// Process pending message\n\t\t\tconst pendingMessage = this.messengerState.pendingMessage;\n\t\t\tif (pendingMessage) {\n\t\t\t\tthis.messengerState.pendingMessage = null;\n\t\t\t\tawait this.startNewConversation(\n\t\t\t\t\tpendingMessage.content,\n\t\t\t\t\t'',\n\t\t\t\t\tpendingMessage.attachments\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.messengerState.setView('chat');\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t} catch (error) {\n\t\tconsole.error('[MessengerWidget] Failed to identify contact:', error);\n\t\tthrow error;\n\t}\n}\n\n\tasync _handleUploadFile(base64Data, filename) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.uploadFile(base64Data, filename);\n\t\t\tif (response.status && response.url) {\n\t\t\t\treturn response.url;\n\t\t\t}\n\t\t\tthrow new Error('Upload failed');\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to upload file:', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync _uploadPendingAttachments(pendingAttachments) {\n\t\tif (!pendingAttachments || pendingAttachments.length === 0) return [];\n\n\t\tconst uploaded = [];\n\t\tfor (const att of pendingAttachments) {\n\t\t\ttry {\n\t\t\t\tconst cdnUrl = await this._handleUploadFile(att.preview, att.file.name);\n\t\t\t\tuploaded.push({\n\t\t\t\t\turl: cdnUrl,\n\t\t\t\t\ttype: att.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: att.file.name,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[MessengerWidget] Skipping failed attachment upload:',\n\t\t\t\t\tatt.file.name,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn uploaded;\n\t}\n\n\tasync _handleSendMessage(conversationId, message, pendingAttachments) {\n\t\tthis.sdk.eventBus.emit('messenger:messageSent', {\n\t\t\twidget: this,\n\t\t\tconversationId,\n\t\t\tmessage,\n\t\t});\n\n\t\ttry {\n\t\t\tconst uploadedAttachments =\n\t\t\t\tawait this._uploadPendingAttachments(pendingAttachments);\n\n\t\t\tconst response = await this.apiService.sendMessage(conversationId, {\n\t\t\t\tcontent: message.content,\n\t\t\t\tattachments: uploadedAttachments,\n\t\t\t});\n\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconsole.log('[MessengerWidget] Message sent:', response.data.id);\n\t\t\t}\n\n\t\t\tif (this.apiService?.mock) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst mockResponse = {\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: \"Thanks for your message! We'll get back to you soon.\",\n\t\t\t\t\t\tisOwn: false,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\tsender: {\n\t\t\t\t\t\t\tname: 'Support Team',\n\t\t\t\t\t\t\tavatarUrl: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tthis.messengerState.addMessage(conversationId, mockResponse);\n\t\t\t\t}, 1500);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to send message:', error);\n\t\t}\n\t}\n\n\t_handleWebSocketMessage(data) {\n\t\tconst { conversation_id, message } = data;\n\n\t\tlet attachments = [];\n\t\tif (message.attachments) {\n\t\t\ttry {\n\t\t\t\tattachments =\n\t\t\t\t\ttypeof message.attachments === 'string'\n\t\t\t\t\t\t? JSON.parse(message.attachments)\n\t\t\t\t\t\t: message.attachments;\n\t\t\t} catch (e) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\n\t\tconst localMessage = {\n\t\t\tid: message.id,\n\t\t\tcontent: message.content,\n\t\t\tisOwn: message.sender_type === 'customer',\n\t\t\ttimestamp: message.created_at,\n\t\t\tattachments: attachments.length > 0 ? attachments : undefined,\n\t\t\tsender: {\n\t\t\t\tname: message.sender_name || 'Support',\n\t\t\t\tavatarUrl: message.sender_avatar || null,\n\t\t\t},\n\t\t};\n\n\t\tthis.messengerState.addMessage(conversation_id, localMessage);\n\n\t\tif (\n\t\t\t!this.messengerState.isOpen ||\n\t\t\tthis.messengerState.activeConversationId !== conversation_id\n\t\t) {\n\t\t\tthis._updateUnreadCount();\n\t\t}\n\t}\n\n\t_handleTypingStarted(data) {\n\t\tif (data.is_agent) {\n\t\t\tthis.messengerState._notify('typingStarted', {\n\t\t\t\tconversationId: data.conversation_id,\n\t\t\t\tuserName: data.user_name,\n\t\t\t});\n\t\t}\n\t}\n\n\t_handleTypingStopped(data) {\n\t\tthis.messengerState._notify('typingStopped', {\n\t\t\tconversationId: data.conversation_id,\n\t\t});\n\t}\n\n\t_handleConversationClosed(data) {\n\t\tconst conversationId =\n\t\t\tdata?.conversation_id || data?.id || data?.conversation?.id;\n\t\tif (!conversationId) return;\n\n\t\tthis.messengerState.updateConversation(conversationId, { status: 'closed' });\n\t}\n\n\tasync _updateUnreadCount() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getUnreadCount();\n\t\t\tif (response.status && response.data) {\n\t\t\t\tthis.messengerState.unreadCount = response.data.unread_count || 0;\n\t\t\t\tthis.messengerState._notify('unreadCountChange', {\n\t\t\t\t\tcount: this.messengerState.unreadCount,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to get unread count:', error);\n\t\t}\n\t}\n\n\t_initWebSocket() {\n\t\tif (this.wsService) {\n\t\t\tthis.wsService.disconnect();\n\t\t}\n\n\t\tthis.wsService = new WebSocketService({\n\t\t\tbaseURL: this.apiService.baseURL,\n\t\t\tworkspace: this.apiService.workspace,\n\t\t\tsessionToken: this.apiService.sessionToken,\n\t\t\tmock: this.apiService.mock,\n\t\t});\n\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('message', this._handleWebSocketMessage)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('typing_started', this._handleTypingStarted)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('typing_stopped', this._handleTypingStopped)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('conversation_closed', this._handleConversationClosed)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('connected', () => {\n\t\t\t\tconsole.log('[MessengerWidget] WebSocket connected');\n\t\t\t\tif (this.messengerState.activeConversationId) {\n\t\t\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\t\t\tconversation_id: this.messengerState.activeConversationId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('disconnected', () => {\n\t\t\t\tconsole.log('[MessengerWidget] WebSocket disconnected');\n\t\t\t})\n\t\t);\n\n\t\tthis.wsService.connect();\n\t}\n\n\topen() {\n\t\tthis.messengerState.setOpen(true);\n\t}\n\n\tclose() {\n\t\tthis.messengerState.setOpen(false);\n\t}\n\n\ttoggle() {\n\t\tthis.messengerState.setOpen(!this.messengerState.isOpen);\n\t}\n\n\tnavigateTo(view) {\n\t\tthis.messengerState.setView(view);\n\t\tif (!this.messengerState.isOpen) {\n\t\t\tthis.open();\n\t\t}\n\t}\n\n\tsetConversations(conversations) {\n\t\tthis.messengerState.setConversations(conversations);\n\t}\n\n\taddMessage(conversationId, message) {\n\t\tthis.messengerState.addMessage(conversationId, message);\n\t}\n\n\tsetHelpArticles(articles) {\n\t\tthis.messengerState.setHelpArticles(articles);\n\t}\n\n\tsetHomeChangelogItems(items) {\n\t\tthis.messengerState.setHomeChangelogItems(items);\n\t}\n\n\tsetChangelogItems(items) {\n\t\tthis.messengerState.setChangelogItems(items);\n\t}\n\n\tsetUnreadCount(count) {\n\t\tthis.messengerState.unreadCount = count;\n\t\tthis.messengerState._notify('unreadCountChange', { count });\n\t}\n\n\tgetState() {\n\t\treturn {\n\t\t\tisOpen: this.messengerState.isOpen,\n\t\t\tcurrentView: this.messengerState.currentView,\n\t\t\tunreadCount: this.messengerState.unreadCount,\n\t\t\tconversations: this.messengerState.conversations,\n\t\t};\n\t}\n\n\tasync loadInitialData() {\n\t\ttry {\n\t\t\tconst conversations = await this._fetchConversations();\n\t\t\tthis.messengerState.setConversations(conversations);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to load conversations:', error);\n\t\t}\n\n\t\tif (this.messengerOptions.enableHelp) {\n\t\t\ttry {\n\t\t\t\tconst articles = await this._fetchHelpArticles();\n\t\t\t\tthis.messengerState.setHelpArticles(articles);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[MessengerWidget] Failed to load help articles:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.messengerOptions.enableChangelog) {\n\t\t\ttry {\n\t\t\t\tconst { homeItems, changelogItems } = await this._fetchChangelog();\n\t\t\t\tthis.messengerState.setHomeChangelogItems(homeItems);\n\t\t\t\tthis.messengerState.setChangelogItems(changelogItems);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[MessengerWidget] Failed to load changelog:', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync _fetchConversations() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getConversations();\n\t\t\tif (response.status && response.data) {\n\t\t\t\treturn response.data.map((conv) => ({\n\t\t\t\t\tid: conv.id,\n\t\t\t\t\ttitle:\n\t\t\t\t\t\tconv.subject ||\n\t\t\t\t\t\t`Chat with ${conv.assigned_user?.name || 'Support'}`,\n\t\t\t\t\tparticipants: conv.assigned_user\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: conv.assigned_user.name,\n\t\t\t\t\t\t\t\t\tavatarUrl: conv.assigned_user.avatar,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [{ name: 'Support', avatarUrl: null }],\n\t\t\t\t\tlastMessage: conv.preview || conv.snippet || '',\n\t\t\t\t\tlastMessageTime: conv.last_message_at,\n\t\t\t\t\tunread: conv.unread || 0,\n\t\t\t\t\tstatus: conv.status,\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch conversations:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync _fetchHelpArticles() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getHelpCollections();\n\t\t\tif (response.status && response.data) {\n\t\t\t\treturn response.data.map((collection) => ({\n\t\t\t\t\tid: collection.id,\n\t\t\t\t\ttitle: collection.title || collection.name,\n\t\t\t\t\tdescription: collection.description || '',\n\t\t\t\t\tarticleCount:\n\t\t\t\t\t\tcollection.article_count || collection.articleCount || 0,\n\t\t\t\t\ticon: collection.icon || 'ph-book-open',\n\t\t\t\t\turl: collection.url || `#/help/${collection.slug || collection.id}`,\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch help articles:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync fetchMessages(conversationId) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getConversation(conversationId);\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconst messages = (response.data.messages || []).map((msg) => {\n\t\t\t\t\tlet attachments;\n\t\t\t\t\tif (msg.attachments) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tattachments =\n\t\t\t\t\t\t\t\ttypeof msg.attachments === 'string'\n\t\t\t\t\t\t\t\t\t? JSON.parse(msg.attachments)\n\t\t\t\t\t\t\t\t\t: msg.attachments;\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: msg.id,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t\tisOwn: msg.sender_type === 'customer',\n\t\t\t\t\t\ttimestamp: msg.created_at,\n\t\t\t\t\t\tattachments:\n\t\t\t\t\t\t\tattachments && attachments.length > 0 ? attachments : undefined,\n\t\t\t\t\t\tsender: {\n\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\tmsg.sender_name ||\n\t\t\t\t\t\t\t\t(msg.sender_type === 'customer' ? 'You' : 'Support'),\n\t\t\t\t\t\t\tavatarUrl: msg.sender_avatar || null,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tthis.messengerState.setMessages(conversationId, messages);\n\n\t\t\t\tawait this.apiService.markConversationAsRead(conversationId);\n\t\t\t\tthis.messengerState.markAsRead(conversationId);\n\n\t\t\t\treturn messages;\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch messages:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync startNewConversation(message, subject = '', pendingAttachments = []) {\n\t\ttry {\n\t\t\tconst uploadedAttachments =\n\t\t\t\tawait this._uploadPendingAttachments(pendingAttachments);\n\n\t\t\tconsole.log('[MessengerWidget] Starting conversation...', {\n\t\t\t\tmessage,\n\t\t\t\tattachmentCount: uploadedAttachments.length,\n\t\t\t\thasSession: this.apiService.isSessionValid(),\n\t\t\t\tsessionToken: this.apiService.sessionToken\n\t\t\t\t\t? this.apiService.sessionToken.substring(0, 10) + '...'\n\t\t\t\t\t: null,\n\t\t\t\tbaseURL: this.apiService.baseURL,\n\t\t\t\tmock: this.apiService.mock,\n\t\t\t});\n\n\t\t\tconst response = await this.apiService.startConversation({\n\t\t\t\tmessage,\n\t\t\t\tsubject,\n\t\t\t\tattachments: uploadedAttachments,\n\t\t\t});\n\n\t\t\tconsole.log('[MessengerWidget] Conversation response:', response);\n\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconst conv = response.data;\n\t\t\t\tconst newConversation = {\n\t\t\t\t\tid: conv.id,\n\t\t\t\t\ttitle: conv.subject || 'New conversation',\n\t\t\t\t\tparticipants: [{ name: 'Support', avatarUrl: null }],\n\t\t\t\t\tlastMessage: message,\n\t\t\t\t\tlastMessageTime: conv.created_at || new Date().toISOString(),\n\t\t\t\t\tunread: 0,\n\t\t\t\t\tstatus: 'open',\n\t\t\t\t};\n\n\t\t\t\tthis.messengerState.addConversation(newConversation);\n\n\t\t\t\tthis.messengerState.setMessages(conv.id, [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: message,\n\t\t\t\t\t\tisOwn: true,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\tthis.messengerState.setActiveConversation(conv.id);\n\t\t\t\tthis.messengerState.setView('chat');\n\n\t\t\t\treturn conv;\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to start conversation:', error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\ttry {\n\t\t\tawait this.apiService.sendTypingIndicator(conversationId, isTyping);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\tasync checkAgentAvailability() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.checkAgentsOnline();\n\t\t\tif (response.status && response.data) {\n\t\t\t\tthis.messengerState.agentsOnline = response.data.agents_online;\n\t\t\t\tthis.messengerState.onlineCount = response.data.online_count || 0;\n\t\t\t\tthis.messengerState.responseTime = response.data.response_time || '';\n\n\t\t\t\tif (response.data.available_agents) {\n\t\t\t\t\tthis.messengerState.setTeamAvatarsFromAgents(\n\t\t\t\t\t\tresponse.data.available_agents\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.messengerState._notify('availabilityUpdate', response.data);\n\t\t\t\treturn response.data;\n\t\t\t}\n\t\t\treturn { agents_online: false, online_count: 0 };\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to check availability:', error);\n\t\t\treturn { agents_online: false, online_count: 0 };\n\t\t}\n\t}\n\n\tasync _fetchChangelog() {\n\t\tif (this.apiService?.mock) {\n\t\t\treturn {\n\t\t\t\thomeItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_5',\n\t\t\t\t\t\ttitle: 'New integrations available',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Connect with more tools you love and streamline your workflow.',\n\t\t\t\t\t\ttags: ['Integration'],\n\t\t\t\t\t\tcoverImage: 'https://feedback-sdk.product7.io/700x400__5_.png',\n\t\t\t\t\t\tcoverText: null,\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 14 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_2',\n\t\t\t\t\t\ttitle: 'A new era of Insights has arrived',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'We announced Fin Insights, a groundbreaking, AI-powered product that gives you complete visibility into every customer conversation.',\n\t\t\t\t\t\ttags: ['New feature', 'AI'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://feedback-sdk.product7.io/Intercom_Messenger__1_.jpg',\n\t\t\t\t\t\tcoverText: 'Watch our major product launch on-demand',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 5 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_1',\n\t\t\t\t\t\ttitle: 'The 2025 Customer Service Transformation Report',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Learn how AI has transformed customer service from the ground up—rewriting its economics and reshaping expectations.',\n\t\t\t\t\t\ttags: ['Report'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://feedback-sdk.product7.io/Main_Report_Email_Header.png',\n\t\t\t\t\t\tcoverText: 'Customer service trends as we know them are dead.',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 2 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tchangelogItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_4',\n\t\t\t\t\t\ttitle: 'Enhanced conversation analytics',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Get deeper insights into your customer conversations with our new analytics dashboard.',\n\t\t\t\t\t\ttags: ['Analytics'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://feedback-sdk.product7.io/cgangelog-Frame%202087334450.jpg',\n\t\t\t\t\t\tcoverText: null,\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 10 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_3',\n\t\t\t\t\t\ttitle: 'Escalation guidance for complex issues',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'New AI-powered escalation guidance helps your team handle complex customer issues more effectively.',\n\t\t\t\t\t\ttags: ['New feature', 'AI'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://feedback-sdk.product7.io/cgangelog-image-escalation-guidance-event@2x.png',\n\t\t\t\t\t\tcoverText: null,\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 7 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\tconst response = await this.apiService.getChangelogs({ limit: 20 });\n\t\tconst changelogs = response.data || [];\n\n\t\tconst mappedItems = changelogs.map((item) => ({\n\t\t\tid: item.id,\n\t\t\ttitle: item.title,\n\t\t\tdescription: item.excerpt || item.description || '',\n\t\t\ttags: item.labels ? item.labels.map((label) => label.name) : [],\n\t\t\tcoverImage: item.cover_image || null,\n\t\t\tcoverText: null,\n\t\t\tpublishedAt: item.published_at,\n\t\t\turl: item.slug ? `/changelog/${item.slug}` : '#',\n\t\t}));\n\n\t\treturn {\n\t\t\thomeItems: mappedItems.slice(0, 3),\n\t\t\tchangelogItems: mappedItems,\n\t\t};\n\t}\n\nasync onMount() {\n\tthis.loadInitialData();\n\n\tif (this.apiService?.sessionToken) {\n\t\tthis._initWebSocket();\n\t}\n\n\tthis.checkAgentAvailability();\n\n\tthis._availabilityInterval = setInterval(() => {\n\t\tthis.checkAgentAvailability();\n\t}, 60000);\n}\n\n\tonDestroy() {\n\t\tif (this._stateUnsubscribe) {\n\t\t\tthis._stateUnsubscribe();\n\t\t}\n\n\t\tif (this.wsService) {\n\t\t\tthis.wsService.disconnect();\n\t\t}\n\n\t\tthis._wsUnsubscribers.forEach((unsub) => unsub());\n\t\tthis._wsUnsubscribers = [];\n\n\t\tif (this._availabilityInterval) {\n\t\t\tclearInterval(this._availabilityInterval);\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.launcher) {\n\t\t\tthis.launcher.destroy();\n\t\t}\n\t\tif (this.panel) {\n\t\t\tthis.panel.destroy();\n\t\t}\n\t\tthis.onDestroy();\n\t\tsuper.destroy();\n\t}\n}","import { BaseWidget } from './BaseWidget.js';\n\nexport class SurveyWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'survey' });\n\n\t\tthis.surveyOptions = {\n\t\t\tsurveyId: options.surveyId || null,\n\t\t\tsurveyType: options.surveyType || 'nps',\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttitle: options.title || null,\n\t\t\tdescription: options.description || null,\n\t\t\tlowLabel: options.lowLabel || null,\n\t\t\thighLabel: options.highLabel || null,\n\t\t\tcustomQuestions: options.customQuestions || [],\n\t\t\tonSubmit: options.onSubmit || null,\n\t\t\tonDismiss: options.onDismiss || null,\n\t\t};\n\n\t\tthis.surveyState = {\n\t\t\tscore: null,\n\t\t\tfeedback: '',\n\t\t\tcustomAnswers: {},\n\t\t\tisVisible: false,\n\t\t};\n\t}\n\n\t_render() {\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'feedback-survey-container';\n\t\treturn container;\n\t}\n\n\t_attachEvents() {\n\t\t// Events are attached when survey is shown\n\t}\n\n\tshow() {\n\t\tthis._renderSurvey();\n\t\tthis.surveyState.isVisible = true;\n\t\tthis.sdk.eventBus.emit('survey:shown', {\n\t\t\twidget: this,\n\t\t\ttype: this.surveyOptions.surveyType,\n\t\t});\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tthis._closeSurvey();\n\t\treturn this;\n\t}\n\n\t_renderSurvey() {\n\t\tthis._closeSurvey();\n\n\t\tconst config = this._getSurveyConfig();\n\n\t\tif (this.surveyOptions.position === 'center') {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'feedback-survey-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\t\t\tthis.backdropElement.addEventListener('click', () =>\n\t\t\t\tthis._handleDismiss()\n\t\t\t);\n\t\t}\n\n\t\tthis.surveyElement = document.createElement('div');\n\t\tthis.surveyElement.className = `feedback-survey feedback-survey-${this.surveyOptions.position}`;\n\n\t\tthis.surveyElement.innerHTML = `\n\t\t\t<button class=\"feedback-survey-close\">×</button>\n\t\t\t<h3 class=\"feedback-survey-title\">${config.title}</h3>\n\t\t\t<p class=\"feedback-survey-description\">${config.description}</p>\n\t\t\t<div class=\"feedback-survey-content\">${config.html}</div>\n\t\t\t<div class=\"feedback-survey-feedback\">\n\t\t\t\t<textarea class=\"feedback-survey-textarea\" placeholder=\"Any additional feedback? (optional)\"></textarea>\n\t\t\t</div>\n\t\t\t<button class=\"feedback-survey-submit\">Submit</button>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.surveyElement);\n\t\tthis._attachSurveyEvents();\n\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.surveyElement.style.opacity = '1';\n\t\t\tthis.surveyElement.style.transform =\n\t\t\t\tthis.surveyOptions.position === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(1)'\n\t\t\t\t\t: 'translateY(0)';\n\t\t});\n\t}\n\n\t_getSurveyConfig() {\n\t\tconst configs = {\n\t\t\tnps: {\n\t\t\t\ttitle:\n\t\t\t\t\tthis.surveyOptions.title || 'How likely are you to recommend us?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'On a scale of 0-10, how likely are you to recommend our product to a friend or colleague?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-nps\">\n\t\t\t\t\t\t${[...Array(11).keys()]\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(n) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-nps-btn\" data-score=\"${n}\">${n}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"feedback-survey-labels\">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel || 'Not likely'}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel || 'Very likely'}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcsat: {\n\t\t\t\ttitle: this.surveyOptions.title || 'How satisfied are you?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'How would you rate your overall satisfaction with our product?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-csat\">\n\t\t\t\t\t\t${['😞', '😕', '😐', '🙂', '😄']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(emoji, i) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-csat-btn\" data-score=\"${i + 1}\">${emoji}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"feedback-survey-labels\">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel || 'Very dissatisfied'}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel || 'Very satisfied'}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tces: {\n\t\t\t\ttitle: this.surveyOptions.title || 'How easy was it?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'How easy was it to accomplish your task today?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-ces\">\n\t\t\t\t\t\t${['Very Difficult', 'Difficult', 'Neutral', 'Easy', 'Very Easy']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(label, i) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-ces-btn\" data-score=\"${i + 1}\">${label}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcustom: {\n\t\t\t\ttitle: this.surveyOptions.title || 'Quick Feedback',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'Help us improve by answering a few questions.',\n\t\t\t\thtml: this._renderCustomQuestions(),\n\t\t\t},\n\t\t};\n\n\t\treturn configs[this.surveyOptions.surveyType] || configs.nps;\n\t}\n\n\t_renderCustomQuestions() {\n\t\tif (\n\t\t\t!this.surveyOptions.customQuestions ||\n\t\t\tthis.surveyOptions.customQuestions.length === 0\n\t\t) {\n\t\t\treturn `\n\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t<label class=\"sdk-label\">What feature do you use most?</label>\n\t\t\t\t\t<select class=\"feedback-survey-select\" data-question=\"feature\">\n\t\t\t\t\t\t<option value=\"\">Select a feature</option>\n\t\t\t\t\t\t<option value=\"feedback\">Feedback Collection</option>\n\t\t\t\t\t\t<option value=\"surveys\">Surveys</option>\n\t\t\t\t\t\t<option value=\"analytics\">Analytics</option>\n\t\t\t\t\t\t<option value=\"integrations\">Integrations</option>\n\t\t\t\t\t</select>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t<label class=\"sdk-label\">How often do you use it?</label>\n\t\t\t\t\t<div class=\"feedback-survey-frequency\">\n\t\t\t\t\t\t${['Daily', 'Weekly', 'Monthly', 'Rarely']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(freq) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-freq-btn\" data-freq=\"${freq}\">${freq}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn this.surveyOptions.customQuestions\n\t\t\t.map(\n\t\t\t\t(q, index) => `\n\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t<label class=\"sdk-label\">${q.label}</label>\n\t\t\t\t${this._renderQuestionInput(q, index)}\n\t\t\t</div>\n\t\t`\n\t\t\t)\n\t\t\t.join('');\n\t}\n\n\t_renderQuestionInput(question, index) {\n\t\tswitch (question.type) {\n\t\t\tcase 'select':\n\t\t\t\treturn `\n\t\t\t\t\t<select class=\"feedback-survey-select\" data-question=\"${question.id || index}\">\n\t\t\t\t\t\t<option value=\"\">${question.placeholder || 'Select an option'}</option>\n\t\t\t\t\t\t${question.options.map((opt) => `<option value=\"${opt.value}\">${opt.label}</option>`).join('')}\n\t\t\t\t\t</select>\n\t\t\t\t`;\n\t\t\tcase 'text':\n\t\t\t\treturn `\n\t\t\t\t\t<input type=\"text\" class=\"feedback-survey-input\" data-question=\"${question.id || index}\" placeholder=\"${question.placeholder || ''}\">\n\t\t\t\t`;\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\n\t_attachSurveyEvents() {\n\t\tif (!this.surveyElement) return;\n\n\t\tconst closeBtn = this.surveyElement.querySelector('.feedback-survey-close');\n\t\tcloseBtn.addEventListener('click', () => this._handleDismiss());\n\n\t\tconst submitBtn = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-submit'\n\t\t);\n\t\tsubmitBtn.addEventListener('click', () => this._handleSubmit());\n\n\t\tconst textarea = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-textarea'\n\t\t);\n\t\ttextarea.addEventListener('input', (e) => {\n\t\t\tthis.surveyState.feedback = e.target.value;\n\t\t});\n\n\t\tthis._attachTypeSpecificEvents();\n\n\t\tthis._escapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis._handleDismiss();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', this._escapeHandler);\n\t}\n\n\t_attachTypeSpecificEvents() {\n\t\tconst type = this.surveyOptions.surveyType;\n\n\t\tif (type === 'nps') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectNPS(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'csat') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-csat-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectCSAT(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'ces') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-ces-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectCES(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'custom') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-freq-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectFrequency(btn.dataset.freq)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-select')\n\t\t\t\t.forEach((select) => {\n\t\t\t\t\tselect.addEventListener('change', (e) => {\n\t\t\t\t\t\tthis.surveyState.customAnswers[select.dataset.question] =\n\t\t\t\t\t\t\te.target.value;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-input')\n\t\t\t\t.forEach((input) => {\n\t\t\t\t\tinput.addEventListener('input', (e) => {\n\t\t\t\t\t\tthis.surveyState.customAnswers[input.dataset.question] =\n\t\t\t\t\t\t\te.target.value;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t}\n\n\t_selectNPS(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectCSAT(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-csat-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectCES(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-ces-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectFrequency(freq) {\n\t\tthis.surveyState.customAnswers.frequency = freq;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-freq-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tif (btn.dataset.freq === freq) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst type = this.surveyOptions.surveyType;\n\n\t\tif (\n\t\t\t(type === 'nps' || type === 'csat' || type === 'ces') &&\n\t\t\tthis.surveyState.score === null\n\t\t) {\n\t\t\tthis._showError('Please select a rating');\n\t\t\treturn;\n\t\t}\n\n\t\tconst responseData = {\n\t\t\trating: this.surveyState.score,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tanswers: this.surveyState.customAnswers,\n\t\t};\n\n\t\tconst response = {\n\t\t\ttype: type,\n\t\t\tscore: this.surveyState.score,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tcustomAnswers: this.surveyState.customAnswers,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (this.surveyOptions.onSubmit) {\n\t\t\tthis.surveyOptions.onSubmit(response);\n\t\t}\n\n\t\ttry {\n\t\t\tconst surveyId =\n\t\t\t\tthis.surveyOptions.surveyId || `local_${type}_${Date.now()}`;\n\t\t\tawait this.apiService.submitSurveyResponse(surveyId, responseData);\n\t\t} catch (error) {\n\t\t\tconsole.error('[SurveyWidget] Failed to submit survey:', error);\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('survey:submitted', { widget: this, response });\n\n\t\tthis._closeSurvey();\n\t\tthis._showSuccessNotification();\n\t}\n\n\tasync _handleDismiss() {\n\t\tif (this.surveyOptions.surveyId) {\n\t\t\ttry {\n\t\t\t\tawait this.apiService.dismissSurvey(this.surveyOptions.surveyId);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[SurveyWidget] Failed to dismiss survey:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.surveyOptions.onDismiss) {\n\t\t\tthis.surveyOptions.onDismiss();\n\t\t}\n\t\tthis.sdk.eventBus.emit('survey:dismissed', { widget: this });\n\t\tthis._closeSurvey();\n\t}\n\n\t_showError(message) {\n\t\tconst existing = this.surveyElement.querySelector('.feedback-survey-error');\n\t\tif (existing) existing.remove();\n\n\t\tconst error = document.createElement('div');\n\t\terror.className = 'feedback-survey-error';\n\t\terror.textContent = message;\n\n\t\tconst submitBtn = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-submit'\n\t\t);\n\t\tsubmitBtn.parentNode.insertBefore(error, submitBtn);\n\n\t\tsetTimeout(() => error.remove(), 3000);\n\t}\n\n\t_showSuccessNotification() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className = 'feedback-survey-success';\n\t\tnotification.innerHTML = `\n\t\t\t<div>\n\t\t\t\t<span style=\"font-size: 18px;\">✓</span>\n\t\t\t\t<span>Thank you for your feedback!</span>\n\t\t\t</div>\n\t\t`;\n\t\tdocument.body.appendChild(notification);\n\n\t\tsetTimeout(() => {\n\t\t\tnotification.style.opacity = '0';\n\t\t\tnotification.style.transition = 'opacity 0.3s ease';\n\t\t\tsetTimeout(() => notification.remove(), 300);\n\t\t}, 3000);\n\t}\n\n\t_closeSurvey() {\n\t\tif (this._escapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._escapeHandler);\n\t\t\tthis._escapeHandler = null;\n\t\t}\n\n\t\tconst surveyEl = this.surveyElement;\n\t\tconst backdropEl = this.backdropElement;\n\n\t\tif (surveyEl) {\n\t\t\tsurveyEl.style.opacity = '0';\n\t\t\tsurveyEl.style.transform =\n\t\t\t\tthis.surveyOptions.position === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(0.95)'\n\t\t\t\t\t: 'translateY(20px)';\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (surveyEl && surveyEl.parentNode) {\n\t\t\t\t\tsurveyEl.parentNode.removeChild(surveyEl);\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t\tthis.surveyElement = null;\n\t\t}\n\n\t\tif (backdropEl) {\n\t\t\tbackdropEl.style.opacity = '0';\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (backdropEl && backdropEl.parentNode) {\n\t\t\t\t\tbackdropEl.parentNode.removeChild(backdropEl);\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t\tthis.backdropElement = null;\n\t\t}\n\n\t\tthis.surveyState = {\n\t\t\tscore: null,\n\t\t\tfeedback: '',\n\t\t\tcustomAnswers: {},\n\t\t\tisVisible: false,\n\t\t};\n\t}\n\n\tdestroy() {\n\t\tthis._closeSurvey();\n\t\tsuper.destroy();\n\t}\n}","import { BaseWidget } from './BaseWidget.js';\n\nexport class TabWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'tab' });\n\t}\n\n\t_render() {\n\t\tconst tab = document.createElement('div');\n\t\ttab.className = `feedback-widget feedback-widget-tab position-${this.options.position}`;\n\t\ttab.innerHTML = `\n <div class=\"feedback-tab-trigger\">\n <span class=\"feedback-tab-text\">Feedback</span>\n </div>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(tab.style, this.options.customStyles);\n\t\t}\n\n\t\treturn tab;\n\t}\n\n\t_attachEvents() {\n\t\tconst tab = this.element.querySelector('.feedback-tab-trigger');\n\t\ttab.addEventListener('click', this.openModal);\n\t}\n\n\tupdateText(text) {\n\t\tconst textElement = this.element?.querySelector('.feedback-tab-text');\n\t\tif (textElement) {\n\t\t\ttextElement.textContent = text;\n\t\t}\n\t}\n\n\tupdatePosition(position) {\n\t\tthis.options.position = position;\n\t\tif (this.element) {\n\t\t\tthis.element.className = this.element.className.replace(\n\t\t\t\t/position-\\w+-\\w+/,\n\t\t\t\t`position-${position}`\n\t\t\t);\n\t\t}\n\t}\n}","import { SDKError } from '../utils/errors.js';\nimport { ButtonWidget } from './ButtonWidget.js';\nimport { ChangelogWidget } from './ChangelogWidget.js';\nimport { InlineWidget } from './InlineWidget.js';\nimport { MessengerWidget } from './MessengerWidget.js';\nimport { SurveyWidget } from './SurveyWidget.js';\nimport { TabWidget } from './TabWidget.js';\n\nexport class WidgetFactory {\n\tstatic widgets = new Map([\n\t\t['button', ButtonWidget],\n\t\t['tab', TabWidget],\n\t\t['inline', InlineWidget],\n\t\t['survey', SurveyWidget],\n\t\t['messenger', MessengerWidget],\n\t\t['changelog', ChangelogWidget],\n\t]);\n\n\tstatic register(type, WidgetClass) {\n\t\tif (typeof type !== 'string' || !type.trim()) {\n\t\t\tthrow new SDKError('Widget type must be a non-empty string');\n\t\t}\n\n\t\tif (typeof WidgetClass !== 'function') {\n\t\t\tthrow new SDKError('Widget class must be a constructor function');\n\t\t}\n\n\t\tthis.widgets.set(type, WidgetClass);\n\t}\n\n\tstatic create(type, options = {}) {\n\t\tconst WidgetClass = this.widgets.get(type);\n\n\t\tif (!WidgetClass) {\n\t\t\tconst availableTypes = Array.from(this.widgets.keys()).join(', ');\n\t\t\tthrow new SDKError(\n\t\t\t\t`Unknown widget type: ${type}. Available types: ${availableTypes}`\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\treturn new WidgetClass(options);\n\t\t} catch (error) {\n\t\t\tthrow new SDKError(\n\t\t\t\t`Failed to create widget of type '${type}': ${error.message}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tstatic getAvailableTypes() {\n\t\treturn Array.from(this.widgets.keys());\n\t}\n\n\tstatic isTypeRegistered(type) {\n\t\treturn this.widgets.has(type);\n\t}\n\n\tstatic unregister(type) {\n\t\treturn this.widgets.delete(type);\n\t}\n\n\tstatic clear() {\n\t\tthis.widgets.clear();\n\t}\n\n\tstatic getWidgetClass(type) {\n\t\treturn this.widgets.get(type);\n\t}\n}\n","import { ConfigError, SDKError } from '../utils/errors.js';\nimport { deepMerge, generateId } from '../utils/helpers.js';\nimport { WidgetFactory } from '../widgets/WidgetFactory.js';\nimport { APIService } from './APIService.js';\nimport { EventBus } from './EventBus.js';\n\nexport class FeedbackSDK {\n\tconstructor(config = {}) {\n\t\tthis.config = this._validateAndMergeConfig(config);\n\t\tthis.initialized = false;\n\t\tthis.widgets = new Map();\n\t\tthis.eventBus = new EventBus();\n\n\t\tthis.apiService = new APIService({\n\t\t\tapiUrl: this.config.apiUrl,\n\t\t\tworkspace: this.config.workspace,\n\t\t\tsiteId: this.config.siteId,\n\t\t\tsessionToken: this.config.sessionToken,\n\t\t\tuserContext: this.config.userContext,\n\t\t\tmock: this.config.mock,\n\t\t\tdebug: this.config.debug,\n\t\t\tenv: this.config.env,\n\t\t});\n\n\t\tthis._bindMethods();\n\t}\n\n\tasync init() {\n\t\tif (this.initialized) {\n\t\t\treturn { alreadyInitialized: true };\n\t\t}\n\n\t\ttry {\n\t\t\tconst initData = await this.apiService.init(this.config.userContext);\n\n\t\t\tif (initData.config) {\n\t\t\t\tthis.config = deepMerge(initData.config, this.config);\n\t\t\t}\n\n\t\t\tthis.initialized = true;\n\t\t\tthis.eventBus.emit('sdk:initialized', {\n\t\t\t\tconfig: this.config,\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tinitialized: true,\n\t\t\t\tconfig: initData.config || {},\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t\texpiresIn: initData.expiresIn,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to initialize SDK: ${error.message}`, error);\n\t\t}\n\t}\n\n\tcreateWidget(type = 'button', options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before creating widgets. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst widgetId = generateId('widget');\n\t\tconst widgetOptions = {\n\t\t\tid: widgetId,\n\t\t\tsdk: this,\n\t\t\tapiService: this.apiService,\n\t\t\t...this.config,\n\t\t\t...options,\n\t\t};\n\n\t\ttry {\n\t\t\tconst widget = WidgetFactory.create(type, widgetOptions);\n\t\t\tthis.widgets.set(widgetId, widget);\n\t\t\tthis.eventBus.emit('widget:created', { widget, type });\n\t\t\treturn widget;\n\t\t} catch (error) {\n\t\t\tthrow new SDKError(`Failed to create widget: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetWidget(id) {\n\t\treturn this.widgets.get(id);\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getActiveSurveys(context);\n\t\t\treturn result.data || [];\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(\n\t\t\t\t`Failed to fetch active surveys: ${error.message}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tasync showSurveyById(surveyId, options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst surveys = await this.getActiveSurveys();\n\t\tconst surveyConfig = surveys.find((s) => s.id === surveyId);\n\n\t\tif (!surveyConfig) {\n\t\t\tthrow new SDKError(\n\t\t\t\t`Survey with ID '${surveyId}' not found or not active`\n\t\t\t);\n\t\t}\n\n\t\treturn this.showSurvey({\n\t\t\tsurveyId: surveyConfig.id,\n\t\t\tsurveyType: surveyConfig.type,\n\t\t\ttitle: surveyConfig.title,\n\t\t\tdescription: surveyConfig.description,\n\t\t\tlowLabel: surveyConfig.low_label,\n\t\t\thighLabel: surveyConfig.high_label,\n\t\t\tcustomQuestions: surveyConfig.questions,\n\t\t\t...options,\n\t\t});\n\t}\n\n\tshowSurvey(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst surveyWidget = this.createWidget('survey', {\n\t\t\tsurveyId: options.surveyId,\n\t\t\tsurveyType: options.surveyType || options.type || 'nps',\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || this.config.theme || 'light',\n\t\t\ttitle: options.title,\n\t\t\tdescription: options.description,\n\t\t\tlowLabel: options.lowLabel,\n\t\t\thighLabel: options.highLabel,\n\t\t\tcustomQuestions: options.customQuestions,\n\t\t\tonSubmit: options.onSubmit,\n\t\t\tonDismiss: options.onDismiss,\n\t\t});\n\n\t\tsurveyWidget.mount();\n\t\tsurveyWidget.show();\n\n\t\treturn surveyWidget;\n\t}\n\n\tshowChangelog(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing changelog. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst changelogWidget = this.createWidget('changelog', {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || this.config.theme || 'light',\n\t\t\ttitle: options.title || \"What's New\",\n\t\t\ttriggerText: options.triggerText || \"What's New\",\n\t\t\tshowBadge: options.showBadge !== false,\n\t\t\tviewButtonText: options.viewButtonText || 'View Update',\n\t\t\tchangelogBaseUrl: options.changelogBaseUrl,\n\t\t\topenInNewTab: options.openInNewTab,\n\t\t\tonViewUpdate: options.onViewUpdate,\n\t\t});\n\n\t\tchangelogWidget.mount();\n\t\tchangelogWidget.show();\n\n\t\treturn changelogWidget;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching changelogs. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getChangelogs(options);\n\t\t\treturn result.data || [];\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to fetch changelogs: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetAllWidgets() {\n\t\treturn Array.from(this.widgets.values());\n\t}\n\n\tdestroyWidget(id) {\n\t\tconst widget = this.widgets.get(id);\n\t\tif (widget) {\n\t\t\twidget.destroy();\n\t\t\tthis.widgets.delete(id);\n\t\t\tthis.eventBus.emit('widget:removed', { widgetId: id });\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdestroyAllWidgets() {\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.destroy();\n\t\t}\n\t\tthis.widgets.clear();\n\t\tthis.eventBus.emit('widgets:cleared');\n\t}\n\n\tupdateConfig(newConfig) {\n\t\tconst oldConfig = { ...this.config };\n\t\tthis.config = this._validateAndMergeConfig(newConfig, this.config);\n\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.handleConfigUpdate(this.config);\n\t\t}\n\n\t\tthis.eventBus.emit('config:updated', {\n\t\t\toldConfig,\n\t\t\tnewConfig: this.config,\n\t\t});\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.config.userContext = userContext;\n\t\tif (this.apiService) {\n\t\t\tthis.apiService.setUserContext(userContext);\n\t\t}\n\t\tthis.eventBus.emit('user:updated', { userContext });\n\t}\n\n\tgetUserContext() {\n\t\treturn (\n\t\t\tthis.config.userContext ||\n\t\t\t(this.apiService ? this.apiService.getUserContext() : null)\n\t\t);\n\t}\n\n\tasync reinitialize(newUserContext = null) {\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\n\t\tif (newUserContext) {\n\t\t\tthis.setUserContext(newUserContext);\n\t\t}\n\n\t\treturn this.init();\n\t}\n\n\ton(event, callback) {\n\t\tthis.eventBus.on(event, callback);\n\t\treturn this;\n\t}\n\n\toff(event, callback) {\n\t\tthis.eventBus.off(event, callback);\n\t\treturn this;\n\t}\n\n\tonce(event, callback) {\n\t\tthis.eventBus.once(event, callback);\n\t\treturn this;\n\t}\n\n\temit(event, data) {\n\t\tthis.eventBus.emit(event, data);\n\t\treturn this;\n\t}\n\n\tdestroy() {\n\t\tthis.destroyAllWidgets();\n\t\tthis.eventBus.removeAllListeners();\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\t\tthis.eventBus.emit('sdk:destroyed');\n\t}\n\n\thasFeedbackBeenSubmitted(cooldownDays = 30) {\n\t\tconst cooldownMs = cooldownDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\treturn now - data.submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearFeedbackSubmissionTracking() {\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t\tthis.eventBus.emit('feedback:trackingCleared');\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear feedback tracking:', e);\n\t\t}\n\t}\n\n\t_detectEnvironment() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn 'production';\n\t\t}\n\n\t\tconst hostname = window.location.hostname.toLowerCase();\n\n\t\tif (\n\t\t\thostname.includes('staging') ||\n\t\t\thostname.includes('localhost') ||\n\t\t\thostname.includes('127.0.0.1') ||\n\t\t\thostname.includes('.local')\n\t\t) {\n\t\t\treturn 'staging';\n\t\t}\n\n\t\treturn 'production';\n\t}\n\n\t_validateAndMergeConfig(newConfig, existingConfig = {}) {\n\t\tconst defaultConfig = {\n\t\t\tapiUrl: null,\n\t\t\tworkspace: null,\n\t\t\tuserContext: null,\n\t\t\tposition: 'bottom-right',\n\t\t\ttheme: 'light',\n\t\t\tboardId: 'general',\n\t\t\tautoShow: true,\n\t\t\tdebug: false,\n\t\t\tmock: false,\n\t\t\tenv: this._detectEnvironment(),\n\t\t};\n\n\t\tconst mergedConfig = deepMerge(\n\t\t\tdeepMerge(defaultConfig, existingConfig),\n\t\t\tnewConfig\n\t\t);\n\n\t\tif (!newConfig.env && !existingConfig.env) {\n\t\t\tmergedConfig.env = this._detectEnvironment();\n\t\t}\n\n\t\tif (!mergedConfig.workspace) {\n\t\t\tthrow new ConfigError('Missing required configuration: workspace');\n\t\t}\n\n\t\tif (mergedConfig.userContext) {\n\t\t\tthis._validateUserContext(mergedConfig.userContext);\n\t\t}\n\n\t\treturn mergedConfig;\n\t}\n\n\t_validateUserContext(userContext) {\n\t\tif (!userContext.user_id && !userContext.email) {\n\t\t\tthrow new ConfigError(\n\t\t\t\t'User context must include at least user_id or email'\n\t\t\t);\n\t\t}\n\n\t\tconst validStructure = {\n\t\t\tuser_id: 'string',\n\t\t\temail: 'string',\n\t\t\tname: 'string',\n\t\t\tcustom_fields: 'object',\n\t\t\tcompany: 'object',\n\t\t};\n\n\t\tfor (const [key, expectedType] of Object.entries(validStructure)) {\n\t\t\tif (userContext[key] && typeof userContext[key] !== expectedType) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`User context field '${key}' must be of type '${expectedType}'`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t_bindMethods() {\n\t\tthis.createWidget = this.createWidget.bind(this);\n\t\tthis.destroyWidget = this.destroyWidget.bind(this);\n\t\tthis.updateConfig = this.updateConfig.bind(this);\n\t}\n\n\tstatic create(config) {\n\t\treturn new FeedbackSDK(config);\n\t}\n\n\tstatic async createAndInit(config) {\n\t\tconst sdk = new FeedbackSDK(config);\n\t\tawait sdk.init();\n\t\treturn sdk;\n\t}\n\n\tstatic extractUserContextFromAuth(authData) {\n\t\tif (!authData) return null;\n\n\t\treturn {\n\t\t\tuser_id: authData.sub || authData.id || authData.user_id,\n\t\t\temail: authData.email,\n\t\t\tname: authData.name || authData.display_name || authData.full_name,\n\t\t\tcustom_fields: {\n\t\t\t\trole: authData.role,\n\t\t\t\tplan: authData.plan || authData.subscription?.plan,\n\t\t\t\t...(authData.custom_fields || {}),\n\t\t\t},\n\t\t\tcompany:\n\t\t\t\tauthData.company || authData.organization\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tid: authData.company?.id || authData.organization?.id,\n\t\t\t\t\t\t\tname: authData.company?.name || authData.organization?.name,\n\t\t\t\t\t\t\tmonthly_spend: authData.company?.monthly_spend,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n}\n","import { APIService } from './core/APIService.js';\nimport { EventBus } from './core/EventBus.js';\nimport { FeedbackSDK } from './core/FeedbackSDK.js';\nimport { CSS_STYLES } from './styles/styles.js';\nimport {\n\tAPIError,\n\tConfigError,\n\tSDKError,\n\tValidationError,\n\tWidgetError,\n} from './utils/errors.js';\nimport * as helpers from './utils/helpers.js';\nimport { BaseWidget } from './widgets/BaseWidget.js';\nimport { ButtonWidget } from './widgets/ButtonWidget.js';\nimport { ChangelogWidget } from './widgets/ChangelogWidget.js';\nimport { InlineWidget } from './widgets/InlineWidget.js';\nimport { MessengerWidget } from './widgets/MessengerWidget.js';\nimport { SurveyWidget } from './widgets/SurveyWidget.js';\nimport { TabWidget } from './widgets/TabWidget.js';\nimport { WidgetFactory } from './widgets/WidgetFactory.js';\n\nfunction injectStyles() {\n\tif (\n\t\ttypeof document !== 'undefined' &&\n\t\t!document.querySelector('#feedback-sdk-styles')\n\t) {\n\t\tconst style = document.createElement('style');\n\t\tstyle.id = 'feedback-sdk-styles';\n\t\tstyle.textContent = CSS_STYLES;\n\t\tdocument.head.appendChild(style);\n\t}\n}\n\nfunction autoInit() {\n\tif (typeof window !== 'undefined' && window.FeedbackSDKConfig) {\n\t\tinjectStyles();\n\n\t\tconst config = { ...window.FeedbackSDKConfig };\n\t\tconst sdk = new FeedbackSDK(config);\n\n\t\tsdk\n\t\t\t.init()\n\t\t\t.then((initData) => {\n\t\t\t\twindow.FeedbackSDK.instance = sdk;\n\n\t\t\t\tif (window.FeedbackSDKConfig.autoCreate) {\n\t\t\t\t\tconst widgets = Array.isArray(window.FeedbackSDKConfig.autoCreate)\n\t\t\t\t\t\t? window.FeedbackSDKConfig.autoCreate\n\t\t\t\t\t\t: [window.FeedbackSDKConfig.autoCreate];\n\n\t\t\t\t\twidgets.forEach((widgetConfig) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst widget = sdk.createWidget(\n\t\t\t\t\t\t\t\twidgetConfig.type || 'button',\n\t\t\t\t\t\t\t\twidgetConfig\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\twidget.mount(widgetConfig.container);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error('[FeedbackSDK] Failed to create widget:', error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (typeof CustomEvent !== 'undefined') {\n\t\t\t\t\tconst event = new CustomEvent('FeedbackSDKReady', {\n\t\t\t\t\t\tdetail: { sdk, config, initData },\n\t\t\t\t\t});\n\t\t\t\t\twindow.dispatchEvent(event);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[FeedbackSDK] Auto-initialization failed:', error);\n\n\t\t\t\tif (typeof CustomEvent !== 'undefined') {\n\t\t\t\t\tconst event = new CustomEvent('FeedbackSDKError', {\n\t\t\t\t\t\tdetail: { error, config, phase: 'initialization' },\n\t\t\t\t\t});\n\t\t\t\t\twindow.dispatchEvent(event);\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\nfunction handleDOMReady() {\n\tif (typeof document !== 'undefined') {\n\t\tif (document.readyState === 'loading') {\n\t\t\tdocument.addEventListener('DOMContentLoaded', autoInit);\n\t\t} else {\n\t\t\tsetTimeout(autoInit, 0);\n\t\t}\n\t}\n}\n\nconst FeedbackSDKExport = {\n\tFeedbackSDK,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tTabWidget,\n\tInlineWidget,\n\tSurveyWidget,\n\tMessengerWidget,\n\tWidgetFactory,\n\tEventBus,\n\tAPIService,\n\tSDKError,\n\tAPIError,\n\tWidgetError,\n\tConfigError,\n\tValidationError,\n\thelpers,\n\tcreate: (config) => {\n\t\tinjectStyles();\n\t\treturn new FeedbackSDK(config);\n\t},\n\tversion: '1.0.0',\n\tinstance: null,\n\n\tisReady: () => Boolean(FeedbackSDKExport.instance),\n\tgetInstance: () => FeedbackSDKExport.instance,\n\n\tsetUserContext: (userContext) => {\n\t\tif (FeedbackSDKExport.instance) {\n\t\t\tFeedbackSDKExport.instance.setUserContext(userContext);\n\t\t} else {\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.FeedbackSDKUserContext = userContext;\n\t\t\t}\n\t\t}\n\t},\n\n\tinitWithUser: async (config, userContext) => {\n\t\tinjectStyles();\n\t\tconst fullConfig = { ...config, userContext };\n\t\tconst sdk = new FeedbackSDK(fullConfig);\n\t\tawait sdk.init();\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.FeedbackSDK.instance = sdk;\n\t\t}\n\n\t\treturn sdk;\n\t},\n\n\tonReady: (callback) => {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tif (FeedbackSDKExport.isReady()) {\n\t\t\t\tcallback(FeedbackSDKExport.instance);\n\t\t\t} else {\n\t\t\t\twindow.addEventListener(\n\t\t\t\t\t'FeedbackSDKReady',\n\t\t\t\t\t(event) => {\n\t\t\t\t\t\tcallback(event.detail.sdk, event.detail);\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tonError: (callback) => {\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.addEventListener('FeedbackSDKError', (event) => {\n\t\t\t\tcallback(event.detail.error, event.detail);\n\t\t\t});\n\t\t}\n\t},\n\n\textractUserContext: FeedbackSDK.extractUserContextFromAuth,\n};\n\nif (typeof window !== 'undefined') {\n\twindow.FeedbackSDK = FeedbackSDKExport;\n\thandleDOMReady();\n}\n\nexport default FeedbackSDKExport;\n\nexport {\n\tAPIError,\n\tAPIService,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tConfigError,\n\tEventBus,\n\tFeedbackSDK,\n\thelpers,\n\tInlineWidget,\n\tMessengerWidget,\n\tSDKError,\n\tSurveyWidget,\n\tTabWidget,\n\tValidationError,\n\tWidgetError,\n\tWidgetFactory,\n};","import { baseStyles } from './base.js';\nimport { changelogStyles } from './changelog.js';\nimport { feedbackStyles } from './feedback.js';\nimport { messengerCoreStyles } from './messenger-core.js';\nimport { messengerViewsStyles } from './messenger-views.js';\nimport { messengerHelpStyles } from './messenger-help.js';\nimport { messengerFeaturesStyles } from './messenger-features.js';\nimport { messengerThemesStyles } from './messenger-themes.js';\n\nexport const CSS_STYLES = \n baseStyles + \n feedbackStyles + \n changelogStyles +\n messengerCoreStyles +\n messengerViewsStyles +\n messengerHelpStyles +\n messengerFeaturesStyles +\n messengerThemesStyles;\n\nexport { \n baseStyles, \n changelogStyles, \n feedbackStyles,\n messengerCoreStyles,\n messengerViewsStyles,\n messengerHelpStyles,\n messengerFeaturesStyles,\n messengerThemesStyles\n};"],"names":["MOCK_CHANGELOGS","id","title","excerpt","description","cover_image","slug","published_at","labels","name","color","status","MOCK_CONVERSATIONS","subject","last_message_at","Date","now","toISOString","created_at","unread","assigned_user","avatar","MOCK_MESSAGES","conv_1","content","sender_type","sender_name","sender_avatar","conv_2","MOCK_HELP_COLLECTIONS","articleCount","icon","url","MOCK_SURVEYS","type","low_label","high_label","trigger","delay","ms","Promise","resolve","setTimeout","getDeviceInfo","navigator","device","browser","os","ua","userAgent","test","includes","ChangelogService","constructor","baseAPI","this","api","getChangelogs","options","_ensureSession","mock","success","data","_handleAuthRetry","async","endpoint","_getEndpointWithParams","_makeRequest","method","headers","Authorization","sessionToken","FeedbackService","submitFeedback","feedbackData","message","payload","board","board_id","boardId","attachments","body","JSON","stringify","HelpService","getHelpCollections","searchHelpArticles","query","filter","c","toLowerCase","params","q","MessengerService","getMessengerSettings","enabled","greeting_message","team_name","response_time","checkAgentsOnline","agents_online","online_count","getConversations","meta","total","length","page","limit","getConversation","conversationId","find","messages","startConversation","newConv","unshift","sendMessage","newMessage","push","getUnreadCount","count","reduce","sum","unread_count","unread_conversations","markConversationAsRead","getMessages","identifyContact","contact_id","email","is_new","phone","company","avatar_url","metadata","sendTypingIndicator","isTyping","is_typing","SDKError","Error","cause","super","captureStackTrace","APIError","response","isNetworkError","isClientError","isServerError","WidgetError","widgetType","widgetId","ConfigError","configKey","ValidationError","field","value","SurveyService","getActiveSurveys","context","window","location","href","userProperties","user_properties","submitSurveyResponse","surveyId","responseData","survey_id","rating","feedback","answers","dismissSurvey","BaseAPIService","config","workspace","sessionExpiry","userContext","env","baseURL","_getBaseURL","_loadStoredSession","apiUrl","ENV_URLS","production","base","withWorkspace","ws","staging","localstack","envConfig","init","isSessionValid","_initMockSession","_initRealSession","_storeSession","primaryColor","backgroundColor","textColor","size","displayMode","expiresIn","user","session_token","expires_in","error","args","apply","setUserContext","_storeData","getUserContext","clearSession","_removeData","localStorage","sessionData","token","expiry","stored","getItem","parse","key","setItem","removeItem","fetch","ok","errorMessage","json","e","text","contentType","get","_buildQueryParams","queryParams","URLSearchParams","Object","entries","forEach","append","toString","queryString","APIService","survey","messenger","help","changelog","available_agents","full_name","picture","console","log","initError","uploadFile","base64Data","filename","file","submitRating","startsWith","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","once","unsubscribe","clear","getListenerCount","generateId","prefix","Math","random","substring","deepMerge","target","source","result","hasOwnProperty","Array","isArray","isBrowser","document","func","wait","timeout","clearTimeout","string","replace","bytes","i","floor","parseFloat","pow","toFixed","platform","language","userLanguage","cookieEnabled","screenResolution","screen","width","height","windowSize","innerWidth","innerHeight","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","element","property","fallback","getComputedStyle","getPropertyValue","obj","path","defaultValue","undefined","keys","split","current","rect","getBoundingClientRect","top","left","bottom","documentElement","clientHeight","right","clientWidth","trim","str","div","createElement","textContent","innerHTML","scrollIntoView","behavior","block","inline","lastKey","pop","lastFunc","lastRan","required","missing","join","BaseWidget","static","sdk","apiService","container","position","autoShow","showBackdrop","customStyles","suppressAfterSubmission","suppressionDays","DEFAULT_COOLDOWN_DAYS","panelElement","backdropElement","mounted","destroyed","state","isOpen","isLoading","isSubmitting","errors","_bindMethods","mount","_hasRecentlySubmitted","eventBus","widget","reason","querySelector","_render","appendChild","_attachEvents","onMount","show","style","display","hide","openPanel","_showLoadingModal","_hideLoadingModal","_renderPanel","requestAnimationFrame","classList","add","className","loadingElement","remove","closePanel","parentNode","removeChild","_resetForm","_hideError","_updateSubmitButton","_showError","_trackSubmission","_showSuccessMessage","handleConfigUpdate","newConfig","theme","_updateTheme","destroy","onDestroy","storageKey","STORAGE_KEY","submittedAt","warn","cooldownMs","last_feedback_at","getTime","clearSubmissionTracking","shouldShow","bind","addEventListener","modeClass","sizeClass","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","notification","closeNotification","opacity","openModal","closeModal","ButtonWidget","isMinimized","button","assign","minimizeIcon","expandIcon","stopPropagation","minimize","restore","closest","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","currentIndex","triggerText","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","listModalBackdropElement","colors","confetti","animationDelay","animationDuration","shapes","shape","borderRadius","closeSidebar","_listModalEscapeHandler","map","_renderChangelogListItem","querySelectorAll","item","_handleViewUpdate","hasImage","image","imageUrl","date","_formatDate","label","_getContrastColor","hasMultiple","viewButtonText","_","dot","parseInt","dataset","changelogBaseUrl","openInNewTab","open","onViewUpdate","dateString","toLocaleDateString","year","month","day","hexColor","hex","substr","hideBadge","badge","nextChangelog","prevChangelog","refresh","InlineWidget","form","textarea","originalContent","updateTitle","titleElement","setPlaceholder","placeholder","input","MessengerState","currentView","unreadCount","activeConversationId","conversations","helpArticles","helpSearchQuery","homeChangelogItems","changelogItems","teamName","teamAvatars","welcomeMessage","isIdentified","pendingMessage","enableHelp","enableChangelog","agentsOnline","onlineCount","responseTime","typingUsers","isLoadingMessages","_listeners","Set","subscribe","delete","_notify","changeType","cb","setView","view","previousView","setOpen","setActiveConversation","previousConversationId","setConversations","_updateUnreadCount","addConversation","conversation","setMessages","addMessage","conv","lastMessage","lastMessageTime","timestamp","isOwn","updateConversation","updates","markAsRead","setHelpArticles","articles","setHelpSearchQuery","setHomeChangelogItems","items","setChangelogItems","getActiveConversation","getActiveMessages","setTeamAvatarsFromAgents","agents","agent","getFilteredHelpArticles","article","reset","MessengerLauncher","_unsubscribe","render","_updateContent","_updateIcon","_updateBadge","badgeHtml","chatIcon","closeIcon","existingBadge","NavigationTabs","_updateActiveTab","_getTabs","tabs","_getHomeIcon","_getMessagesIcon","_getHelpIcon","_getChangelogIcon","tabsHtml","tab","isActive","tabId","toggle","MessengerPanel","navigationTabs","currentViewComponent","viewRegistry","registerView","ViewClass","_renderCurrentView","viewsContainer","setHeader","headerContent","header","ChangelogView","_updateChangelogList","avatarsHtml","_renderTeamAvatars","changelogContainer","_renderChangelogCard","_attachChangelogEvents","_renderEmptyState","tagsHtml","tags","tag","dateStr","publishedAt","coverImage","_truncateText","avatars","slice","charAt","toUpperCase","maxLength","card","changelogId","changelogItem","n","onChangelogClick","ChatView","_typingTimeout","_isTyping","_typingIndicator","_isConversationClosed","_showEmailOverlayFlag","_pendingAttachments","_hideTypingIndicator","_appendMessage","_scrollToBottom","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","msg","_renderMessage","avatarHtml","_renderConversationAvatar","existingName","_escapeHtml","_renderAttachmentPreviews","_showEmailOverlay","isOnline","_renderMessageAttachments","att","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","avatarUrl","participants","p","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollTop","scrollHeight","_updateSendButtonState","sendBtn","preview","btn","idx","currentTarget","min","_startTyping","shiftKey","_sendMessage","attachBtn","fileInput","click","files","from","reader","FileReader","onload","ev","readAsDataURL","emailInput","emailSubmit","emailSkip","isValid","_isValidEmail","_handleEmailSubmit","_hideEmailOverlay","fileLink","_downloadFile","img","src","blob","blobUrl","URL","createObjectURL","a","download","revokeObjectURL","overlay","_startPendingConversation","_pendingMessage","onStartConversation","_pendingAttachmentsForSend","nameInput","onIdentifyContact","hasAttachments","_stopTyping","attachmentsToSend","needsContactInfo","localMessage","onSendMessage","onTyping","ConversationsView","_renderAvatarStack","conversationsHtml","_renderConversationItem","unreadClass","timeAgo","_formatTimeAgo","_renderConversationAvatars","_truncateMessage","diffMs","diffMins","diffHours","diffDays","closeBtn","convId","onSelectConversation","newMsgBtn","_startNewConversation","openConversation","onStartNewConversation","HelpView","_updateCollectionsList","searchQuery","collectionCount","collectionsContainer","collections","filteredCollections","headerEl","collection","_renderCollectionItem","_attachCollectionEvents","searchTimeout","collectionId","onArticleClick","HomeView","recentChangelogHtml","_renderRecentChangelog","logoUrl","_renderAvailabilityStatus","_renderMessageButton","_renderFeaturedCard","featuredContent","action","coverText","msgBtn","seeAllBtn","featuredBtn","PreChatFormView","_isSubmitting","existingEmail","skipBtn","validateForm","isEmailValid","_clearError","_handleSubmit","elementId","errorEl","submitText","submitLoading","WebSocketService","reconnectAttempts","maxReconnectAttempts","reconnectDelay","pingInterval","isConnected","_onOpen","_onMessage","_onClose","_onError","connect","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","close","_mockInterval","send","readyState","OPEN","setInterval","code","conversation_id","user_id","user_name","is_agent","simulateMessage","MessengerWidget","messengerOptions","messengerState","launcher","wsService","_wsUnsubscribers","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","zIndex","_handleSendMessage","_handleStartConversation","_handleSelectConversation","_handleNewConversationClick","_handleIdentifyContact","_stateUnsubscribe","_handleActiveConversationChange","messageContent","pendingAttachments","startNewConversation","fetchMessages","contactData","_handleUploadFile","_uploadPendingAttachments","uploaded","cdnUrl","err","uploadedAttachments","mockResponse","_initWebSocket","navigateTo","setUnreadCount","getState","loadInitialData","_fetchConversations","_fetchHelpArticles","homeItems","_fetchChangelog","snippet","article_count","attachmentCount","hasSession","newConversation","checkAgentAvailability","mappedItems","_availabilityInterval","unsub","SurveyWidget","surveyOptions","surveyType","lowLabel","highLabel","customQuestions","onSubmit","onDismiss","surveyState","score","customAnswers","isVisible","_renderSurvey","_closeSurvey","_getSurveyConfig","_handleDismiss","surveyElement","html","_attachSurveyEvents","transform","configs","nps","csat","emoji","ces","custom","_renderCustomQuestions","_renderQuestionInput","freq","question","opt","_attachTypeSpecificEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","frequency","_showSuccessNotification","existing","insertBefore","transition","surveyEl","backdropEl","TabWidget","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","FeedbackSDK","_validateAndMergeConfig","initialized","siteId","debug","alreadyInitialized","initData","createWidget","widgetOptions","getWidget","showSurveyById","surveyConfig","s","showSurvey","questions","surveyWidget","showChangelog","changelogWidget","getAllWidgets","values","destroyWidget","destroyAllWidgets","updateConfig","oldConfig","reinitialize","newUserContext","removeAllListeners","hasFeedbackBeenSubmitted","cooldownDays","clearFeedbackSubmissionTracking","_detectEnvironment","hostname","existingConfig","mergedConfig","_validateUserContext","validStructure","custom_fields","expectedType","createAndInit","extractUserContextFromAuth","authData","sub","display_name","role","plan","subscription","organization","monthly_spend","injectStyles","baseStyles","head","autoInit","FeedbackSDKConfig","then","instance","autoCreate","widgetConfig","CustomEvent","detail","dispatchEvent","catch","phase","FeedbackSDKExport","helpers","version","isReady","Boolean","getInstance","FeedbackSDKUserContext","initWithUser","fullConfig","onReady","onError","extractUserContext"],"mappings":"kPAAO,MAAMA,EAAkB,CAC9B,CACCC,GAAI,cACJC,MACC,4EACDC,QACC,+GACDC,YACC,+GACDC,YACC,ytCACDC,KAAM,4CACNC,aAAc,uBACdC,OAAQ,CACP,CAAEC,KAAM,cAAeC,MAAO,WAC9B,CAAED,KAAM,YAAaC,MAAO,YAE7BC,OAAQ,aAET,CACCV,GAAI,cACJC,MAAO,wCACPC,QACC,+EACDC,YACC,+EACDC,YACC,imBACDC,KAAM,4BACNC,aAAc,uBACdC,OAAQ,CAAC,CAAEC,KAAM,cAAeC,MAAO,YACvCC,OAAQ,aAET,CACCV,GAAI,cACJC,MAAO,yCACPC,QACC,8EACDC,YACC,8EACDE,KAAM,qCACNC,aAAc,uBACdC,OAAQ,CACP,CAAEC,KAAM,UAAWC,MAAO,WAC1B,CAAED,KAAM,cAAeC,MAAO,YAE/BC,OAAQ,cAIGC,EAAqB,CACjC,CACCX,GAAI,SACJY,QAAS,yBACTF,OAAQ,OACRG,gBAAiB,IAAIC,KAAKA,KAAKC,MAAQ,OAAgBC,cACvDC,WAAY,IAAIH,KAAKA,KAAKC,MAAQ,QAAyBC,cAC3DE,OAAQ,EACRC,cAAe,CACdnB,GAAI,SACJQ,KAAM,QACNY,OAAQ,OAGV,CACCpB,GAAI,SACJY,QAAS,kBACTF,OAAQ,OACRG,gBAAiB,IAAIC,KACpBA,KAAKC,MAAQ,QACZC,cACFC,WAAY,IAAIH,KAAKA,KAAKC,MAAQ,OAA0BC,cAC5DE,OAAQ,EACRC,cAAe,CACdnB,GAAI,SACJQ,KAAM,MACNY,OAAQ,QAKEC,EAAgB,CAC5BC,OAAQ,CACP,CACCtB,GAAI,QACJuB,QAAS,oDACTC,YAAa,QACbC,YAAa,QACbC,cAAe,KACfT,WAAY,IAAIH,KAAKA,KAAKC,MAAQ,KAAgBC,eAEnD,CACChB,GAAI,QACJuB,QAAS,uDACTC,YAAa,WACbP,WAAY,IAAIH,KAAKA,KAAKC,MAAQ,OAAgBC,gBAGpDW,OAAQ,CACP,CACC3B,GAAI,QACJuB,QAAS,wCACTC,YAAa,QACbC,YAAa,MACbC,cAAe,KACfT,WAAY,IAAIH,KAAKA,KAAKC,MAAQ,QAAyBC,eAE5D,CACChB,GAAI,QACJuB,QAAS,2CACTC,YAAa,WACbP,WAAY,IAAIH,KACfA,KAAKC,MAAQ,OAA0B,MACtCC,eAEH,CACChB,GAAI,QACJuB,QACC,iGACDC,YAAa,QACbC,YAAa,MACbC,cAAe,KACfT,WAAY,IAAIH,KAAKA,KAAKC,MAAQ,QAAyBC,iBAKjDY,EAAwB,CACpC,CACC5B,GAAI,eACJC,MAAO,mBACPE,YAAa,yDACb0B,aAAc,GACdC,KAAM,eACNC,IAAK,KAEN,CACC/B,GAAI,eACJC,MAAO,kBACPE,YAAa,4DACb0B,aAAc,GACdC,KAAM,YACNC,IAAK,KAEN,CACC/B,GAAI,eACJC,MAAO,WACPE,YACC,iFACD0B,aAAc,GACdC,KAAM,WACNC,IAAK,KAEN,CACC/B,GAAI,eACJC,MAAO,WACPE,YACC,mFACD0B,aAAc,GACdC,KAAM,iBACNC,IAAK,KAEN,CACC/B,GAAI,eACJC,MAAO,qBACPE,YAAa,2DACb0B,aAAc,GACdC,KAAM,iBACNC,IAAK,MAIMC,EAAe,CAC3B,CACChC,GAAI,kBACJiC,KAAM,MACNhC,MAAO,sCACPE,YAAa,iCACb+B,UAAW,aACXC,WAAY,cACZC,QAAS,SACT1B,OAAQ,UAET,CACCV,GAAI,mBACJiC,KAAM,OACNhC,MAAO,yBACPE,YAAa,wCACbiC,QAAS,SACT1B,OAAQ,UAET,CACCV,GAAI,kBACJiC,KAAM,MACNhC,MAAO,mBACPE,YAAa,wCACb+B,UAAW,iBACXC,WAAY,YACZC,QAAS,SACT1B,OAAQ,WCvMG2B,EAASC,GAAO,IAAIC,QAASC,GAAYC,WAAWD,EAASF,IAEnE,SAASI,IACf,GAAyB,oBAAdC,UACV,MAAO,CAAEC,OAAQ,KAAMC,QAAS,KAAMC,GAAI,MAG3C,MAAMC,EAAKJ,UAAUK,UAErB,IAAIJ,EAAS,UACT,gBAAgBK,KAAKF,KACxBH,EAAS,eAAeK,KAAKF,GAAM,SAAW,UAG/C,IAAIF,EAAU,UACVE,EAAGG,SAAS,WAAYL,EAAU,UAC7BE,EAAGG,SAAS,OAAQL,EAAU,OAC9BE,EAAGG,SAAS,UAAWL,EAAU,SACjCE,EAAGG,SAAS,UAAWL,EAAU,UACjCE,EAAGG,SAAS,UAAYH,EAAGG,SAAS,UAAQL,EAAU,SAE/D,IAAIC,EAAK,UAOT,OANIC,EAAGG,SAAS,WAAYJ,EAAK,UACxBC,EAAGG,SAAS,OAAQJ,EAAK,QACzBC,EAAGG,SAAS,SAAUJ,EAAK,QAC3BC,EAAGG,SAAS,WAAYJ,EAAK,WAC7BC,EAAGG,SAAS,WAAaH,EAAGG,SAAS,WAASJ,EAAK,OAErD,CAAEF,SAAQC,UAASC,KAC3B,CC1BO,MAAMK,EACZ,WAAAC,CAAYC,GACXC,KAAKC,IAAMF,CACZ,CAEA,mBAAMG,CAAcC,EAAU,IAG7B,aAFMH,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,YACNtB,EAAM,KACL,CAAEuB,SAAS,EAAMC,KAAM9D,IAGxBuD,KAAKC,IAAIO,iBAAiBC,UAChC,MAAMC,EAAWV,KAAKC,IAAIU,uBACzB,qBACAR,GAED,aAAaH,KAAKC,IAAIW,aAAaF,EAAU,CAC5CG,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,mBAGhD,ECxBM,MAAMC,EACZ,WAAAnB,CAAYC,GACXC,KAAKC,IAAMF,CACZ,CAEA,oBAAMmB,CAAeC,GAGpB,SAFMnB,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAEZ,aADMtB,EAAM,KACL,CACNuB,SAAS,EACTC,KAAM,CACL7D,GAAI,aAAec,KAAKC,MACxBd,MAAOwE,EAAaxE,MACpBsB,QAASkD,EAAalD,SAEvBmD,QAAS,oCAIX,MAAMC,EAAU,CACfC,MACCH,EAAaI,UAAYJ,EAAaG,OAASH,EAAaK,QAC7D7E,MAAOwE,EAAaxE,MACpBsB,QAASkD,EAAalD,QACtBwD,YAAaN,EAAaM,aAAe,IAG1C,OAAOzB,KAAKC,IAAIO,iBAAiBC,eACTT,KAAKC,IAAIW,aAAa,mBAAoB,CAChEC,OAAQ,OACRa,KAAMC,KAAKC,UAAUP,GACrBP,QAAS,CACR,eAAgB,mBAChBC,cAAe,UAAUf,KAAKC,IAAIe,kBAKtC,ECvCM,MAAMa,EACZ,WAAA/B,CAAYC,GACXC,KAAKC,IAAMF,CACZ,CAEA,wBAAM+B,CAAmB3B,EAAU,IAGlC,SAFMH,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAEZ,aADMtB,EAAM,KACL,CAAE3B,QAAQ,EAAMmD,KAAMjC,GAG9B,MAAMoC,EAAWV,KAAKC,IAAIU,uBACzB,2BACAR,GAED,OAAOH,KAAKC,IAAIW,aAAaF,EAAU,CACtCG,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,iBAE/C,CAEA,wBAAMe,CAAmBC,EAAO7B,EAAU,IAGzC,SAFMH,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAAM,OACZtB,EAAM,KAMZ,MAAO,CAAE3B,QAAQ,EAAMmD,KALNjC,EAAsB2D,OACrCC,GACAA,EAAEvF,MAAMwF,cAAcvC,SAASoC,EAAMG,gBACrCD,EAAErF,YAAYsF,cAAcvC,SAASoC,EAAMG,gBAG9C,CAEA,MAAMC,EAAS,CAAEC,EAAGL,KAAU7B,GACxBO,EAAWV,KAAKC,IAAIU,uBACzB,sBACAyB,GAED,OAAOpC,KAAKC,IAAIW,aAAaF,EAAU,CACtCG,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,iBAE/C,EC7CM,MAAMsB,EACZ,WAAAxC,CAAYC,GACXC,KAAKC,IAAMF,CACZ,CAEA,0BAAMwC,GAGL,aAFMvC,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KACL,CACNjD,QAAQ,EACRmD,KAAM,CACLiC,SAAS,EACTC,iBAAkB,uCAClBC,UAAW,eACXC,cAAe,yCAKX3C,KAAKC,IAAIW,aAAa,6BAA8B,CAC1DC,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,iBAE/C,CAEA,uBAAM4B,GAGL,aAFM5C,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KACL,CACNjD,QAAQ,EACRmD,KAAM,CACLsC,eAAe,EACfC,aAAc,EACdH,cAAe,yCAKX3C,KAAKC,IAAIW,aAAa,kCAAmC,CAC/DC,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,iBAE/C,CAEA,sBAAM+B,CAAiB5C,EAAU,IAGhC,SAFMH,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAEZ,aADMtB,EAAM,KACL,CACN3B,QAAQ,EACRmD,KAAMlD,EACN2F,KAAM,CAAEC,MAAO5F,EAAmB6F,OAAQC,KAAM,EAAGC,MAAO,KAI5D,MAAM1C,EAAWV,KAAKC,IAAIU,uBACzB,kCACAR,GAED,OAAOH,KAAKC,IAAIW,aAAaF,EAAU,CACtCG,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,iBAE/C,CAEA,qBAAMqC,CAAgBC,GAGrB,SAFMtD,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAAM,OACZtB,EAAM,KAEZ,MAAO,CACN3B,QAAQ,EACRmD,KAAM,IAHMlD,EAAmBkG,KAAMrB,GAAMA,EAAExF,KAAO4G,GAGnCE,SAAUzF,EAAcuF,IAAmB,IAE9D,CAEA,OAAOtD,KAAKC,IAAIW,aACf,mCAAmC0C,IACnC,CACCzC,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,iBAGhD,CAEA,uBAAMyC,CAAkBlD,GAGvB,SAFMP,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAAM,OACZtB,EAAM,KACZ,MAAM2E,EAAU,CACfhH,GAAI,QAAUc,KAAKC,MACnBH,QAASiD,EAAKjD,SAAW,mBACzBF,OAAQ,OACRG,iBAAiB,IAAIC,MAAOE,cAC5BC,YAAY,IAAIH,MAAOE,cACvB8F,SAAU,CACT,CACC9G,GAAI,OAASc,KAAKC,MAClBQ,QAASsC,EAAKa,QACdlD,YAAa,WACbP,YAAY,IAAIH,MAAOE,iBAM1B,OAFAL,EAAmBsG,QAAQD,GAC3B3F,EAAc2F,EAAQhH,IAAMgH,EAAQF,SAC7B,CAAEpG,QAAQ,EAAMmD,KAAMmD,EAC9B,CAEA,OAAO1D,KAAKC,IAAIW,aAAa,kCAAmC,CAC/DC,OAAQ,OACRC,QAAS,CACR,eAAgB,mBAChBC,cAAe,UAAUf,KAAKC,IAAIe,gBAEnCU,KAAMC,KAAKC,UAAU,CACpBR,QAASb,EAAKa,QACd9D,QAASiD,EAAKjD,SAAW,MAG5B,CAEA,iBAAMsG,CAAYN,EAAgB/C,GAGjC,SAFMP,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAAM,OACZtB,EAAM,KACZ,MAAM8E,EAAa,CAClBnH,GAAI,OAASc,KAAKC,MAClBQ,QAASsC,EAAKtC,QACdC,YAAa,WACbP,YAAY,IAAIH,MAAOE,eAMxB,OAJKK,EAAcuF,KAClBvF,EAAcuF,GAAkB,IAEjCvF,EAAcuF,GAAgBQ,KAAKD,GAC5B,CAAEzG,QAAQ,EAAMmD,KAAMsD,EAC9B,CAEA,OAAO7D,KAAKC,IAAIW,aACf,mCAAmC0C,aACnC,CACCzC,OAAQ,OACRC,QAAS,CACR,eAAgB,mBAChBC,cAAe,UAAUf,KAAKC,IAAIe,gBAEnCU,KAAMC,KAAKC,UAAU,CAAE3D,QAASsC,EAAKtC,WAGxC,CAEA,oBAAM8F,GAGL,SAFM/D,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAAM,CAClB,MAAM2D,EAAQ3G,EAAmB4G,OAChC,CAACC,EAAKhC,IAAMgC,GAAOhC,EAAEtE,QAAU,GAC/B,GAED,MAAO,CACNR,QAAQ,EACRmD,KAAM,CAAE4D,aAAcH,EAAOI,qBAAsBJ,EAAQ,EAAI,EAAI,GAErE,CAEA,OAAOhE,KAAKC,IAAIW,aAAa,2BAA4B,CACxDC,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,iBAE/C,CAEA,4BAAMqD,CAAuBf,GAG5B,aAFMtD,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KACL,CAAEjD,QAAQ,GAGX4C,KAAKC,IAAIW,aACf,mCAAmC0C,SACnC,CACCzC,OAAQ,OACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,iBAGhD,CAEA,iBAAMsD,CAAYhB,EAAgBnD,EAAU,IAG3C,SAFMH,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAEZ,aADMtB,EAAM,KACL,CACN3B,QAAQ,EACRmD,KAAMxC,EAAcuF,IAAmB,GACvCN,KAAM,CAAEC,MAAO,EAAGE,KAAM,EAAGC,MAAO,KAIpC,MAAMhB,EAAS,IAAKjC,GACdO,EAAWV,KAAKC,IAAIU,uBACzB,mCAAmC2C,aACnClB,GAED,OAAOpC,KAAKC,IAAIW,aAAaF,EAAU,CACtCG,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,iBAE/C,CAEA,qBAAMuD,CAAgBhE,GAGrB,aAFMP,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,YACNtB,EAAM,KACL,CACN3B,QAAQ,EACRmD,KAAM,CACLiE,WAAY,gBAAkBhH,KAAKC,MACnCgH,MAAOlE,EAAKkE,MACZvH,KAAMqD,EAAKrD,MAAQ,GACnBwH,QAAQ,KAKJ1E,KAAKC,IAAIW,aAAa,6BAA8B,CAC1DC,OAAQ,OACRC,QAAS,CACR,eAAgB,mBAChBC,cAAe,UAAUf,KAAKC,IAAIe,gBAEnCU,KAAMC,KAAKC,UAAU,CACpB6C,MAAOlE,EAAKkE,MACZvH,KAAMqD,EAAKrD,MAAQ,GACnByH,MAAOpE,EAAKoE,OAAS,GACrBC,QAASrE,EAAKqE,SAAW,GACzBC,WAAYtE,EAAKsE,YAAc,GAC/BC,SAAUvE,EAAKuE,UAAY,CAAA,KAG9B,CAEA,yBAAMC,CAAoBzB,EAAgB0B,GAGzC,aAFMhF,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KACL,CAAEjD,QAAQ,GAGX4C,KAAKC,IAAIW,aACf,mCAAmC0C,WACnC,CACCzC,OAAQ,OACRC,QAAS,CACR,eAAgB,mBAChBC,cAAe,UAAUf,KAAKC,IAAIe,gBAEnCU,KAAMC,KAAKC,UAAU,CAAEqD,UAAWD,KAGrC,EC/QM,MAAME,UAAiBC,MAC7B,WAAArF,CAAYsB,EAASgE,GACpBC,MAAMjE,GACNpB,KAAK9C,KAAO,WACZ8C,KAAKoF,MAAQA,EAETD,MAAMG,mBACTH,MAAMG,kBAAkBtF,KAAMkF,EAEhC,QAGM,MAAMK,UAAiBJ,MAC7B,WAAArF,CAAY1C,EAAQgE,EAASoE,GAC5BH,MAAMjE,GACNpB,KAAK9C,KAAO,WACZ8C,KAAK5C,OAASA,EACd4C,KAAKwF,SAAWA,EAEZL,MAAMG,mBACTH,MAAMG,kBAAkBtF,KAAMuF,EAEhC,CAEA,cAAAE,GACC,OAAuB,IAAhBzF,KAAK5C,MACb,CAEA,aAAAsI,GACC,OAAO1F,KAAK5C,QAAU,KAAO4C,KAAK5C,OAAS,GAC5C,CAEA,aAAAuI,GACC,OAAO3F,KAAK5C,QAAU,KAAO4C,KAAK5C,OAAS,GAC5C,GAGM,MAAMwI,UAAoBT,MAChC,WAAArF,CAAYsB,EAASyE,EAAYC,GAChCT,MAAMjE,GACNpB,KAAK9C,KAAO,cACZ8C,KAAK6F,WAAaA,EAClB7F,KAAK8F,SAAWA,EAEZX,MAAMG,mBACTH,MAAMG,kBAAkBtF,KAAM4F,EAEhC,EAGM,MAAMG,UAAoBZ,MAChC,WAAArF,CAAYsB,EAAS4E,GACpBX,MAAMjE,GACNpB,KAAK9C,KAAO,cACZ8C,KAAKgG,UAAYA,EAEbb,MAAMG,mBACTH,MAAMG,kBAAkBtF,KAAM+F,EAEhC,EAGM,MAAME,UAAwBd,MACpC,WAAArF,CAAYsB,EAAS8E,EAAOC,GAC3Bd,MAAMjE,GACNpB,KAAK9C,KAAO,kBACZ8C,KAAKkG,MAAQA,EACblG,KAAKmG,MAAQA,EAEThB,MAAMG,mBACTH,MAAMG,kBAAkBtF,KAAMiG,EAEhC,ECpEM,MAAMG,EACZ,WAAAtG,CAAYC,GACXC,KAAKC,IAAMF,CACZ,CAEA,sBAAMsG,CAAiBC,EAAU,IAGhC,SAFMtG,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAEZ,aADMtB,EAAM,KACL,CAAEuB,SAAS,EAAMC,KAAM7B,GAG/B,MAAM0D,EAAS,CACd3D,IACC6H,EAAQ7H,MACW,oBAAX8H,OAAyBA,OAAOC,SAASC,KAAO,OACtDrH,OACCkH,EAAQI,gBAAkB,CAC7BC,gBAAiBL,EAAQI,iBAI3B,OAAO1G,KAAKC,IAAIO,iBAAiBC,UAChC,MAAMC,EAAWV,KAAKC,IAAIU,uBACzB,yBACAyB,GAED,aAAapC,KAAKC,IAAIW,aAAaF,EAAU,CAC5CG,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,mBAGhD,CAEA,0BAAM4F,CAAqBC,EAAUC,GACpC,IAAKD,EAAU,MAAM,IAAItB,EAAS,IAAK,yBAIvC,SAFMvF,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,KAEZ,aADMtB,EAAM,KACL,CACNuB,SAAS,EACTC,KAAM,CACL7D,GAAI,iBAAmBc,KAAKC,MAC5BsJ,UAAWF,KACRC,GAEJ1F,QAAS,2CAIX,MAAMC,EAAU,CACf2F,OAAQF,EAAaE,OACrBC,SAAUH,EAAaG,UAAY,GACnCC,QAASJ,EAAaI,SAAW,CAAA,GAGlC,OAAOlH,KAAKC,IAAIO,iBAAiBC,eACnBT,KAAKC,IAAIW,aACrB,mBAAmBiG,cACnB,CACChG,OAAQ,OACRa,KAAMC,KAAKC,UAAUP,GACrBP,QAAS,CACR,eAAgB,mBAChBC,cAAe,UAAUf,KAAKC,IAAIe,kBAKvC,CAEA,mBAAMmG,CAAcN,GACnB,IAAKA,EAAU,MAAM,IAAItB,EAAS,IAAK,yBAIvC,aAFMvF,KAAKC,IAAIG,iBAEXJ,KAAKC,IAAII,YACNtB,EAAM,KACL,CAAEuB,SAAS,EAAMc,QAAS,kCAG3BpB,KAAKC,IAAIO,iBAAiBC,eACnBT,KAAKC,IAAIW,aACrB,mBAAmBiG,YACnB,CACChG,OAAQ,OACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKC,IAAIe,kBAIjD,EC/FM,MAAMoG,EACZ,WAAAtH,CAAYuH,EAAS,IACpBrH,KAAKsH,UAAYD,EAAOC,UACxBtH,KAAKgB,aAAe,KACpBhB,KAAKuH,cAAgB,KACrBvH,KAAKwH,YAAcH,EAAOG,aAAe,KACzCxH,KAAKK,KAAOgH,EAAOhH,OAAQ,EAC3BL,KAAKyH,IAAMJ,EAAOI,KAAO,aACzBzH,KAAK0H,QAAU1H,KAAK2H,YAAYN,GAEhCrH,KAAK4H,oBACN,CAEA,WAAAD,CAAYN,GACX,GAAIA,EAAOQ,OAAQ,OAAOR,EAAOQ,OAEjC,MAAMC,EAAW,CAChBC,WAAY,CACXC,KAAM,iCACNC,cAAgBC,GAAO,WAAWA,4BAEnCC,QAAS,CACRH,KAAM,yCACNC,cAAgBC,GAAO,WAAWA,oCAEnCE,WAAY,CACXJ,KAAM,+BACNC,cAAgBC,GAAO,UAAUA,4BAI7BG,EAAYP,EAAS9H,KAAKyH,MAAQK,EAASC,WACjD,OAAO/H,KAAKsH,UACTe,EAAUJ,cAAcjI,KAAKsH,WAC7Be,EAAUL,IACd,CAEA,UAAMM,CAAKd,EAAc,MAKxB,GAJIA,IACHxH,KAAKwH,YAAcA,GAGhBxH,KAAKuI,iBACR,MAAO,CAAEvH,aAAchB,KAAKgB,cAG7B,IAAKhB,KAAKsH,YAActH,KAAKwH,YAC5B,MAAM,IAAIjC,EACT,IACA,WAAYvF,KAAKsH,UAA0B,eAAd,kCAI/B,OAAItH,KAAKK,KACDL,KAAKwI,mBAGNxI,KAAKyI,kBACb,CAEA,sBAAMD,GAIL,OAHAxI,KAAKgB,aAAe,gBAAkBxD,KAAKC,MAC3CuC,KAAKuH,cAAgB,IAAI/J,KAAKA,KAAKC,MAAQ,MAC3CuC,KAAK0I,gBACE,CACN1H,aAAchB,KAAKgB,aACnBqG,OAAQ,CACPsB,aAAc,UACdC,gBAAiB,UACjBC,UAAW,UACXrH,QAAS,mBACTsH,KAAM,SACNC,YAAa,SAEdC,UAAW,KAEb,CAEA,sBAAMP,GACL,MAAMpH,EAAU,CACfiG,UAAWtH,KAAKsH,UAChB2B,KAAMjJ,KAAKwH,aAGZ,IACC,MAAMhC,QAAiBxF,KAAKY,aAAa,eAAgB,CACxDC,OAAQ,OACRa,KAAMC,KAAKC,UAAUP,GACrBP,QAAS,CAAE,eAAgB,sBAO5B,OAJAd,KAAKgB,aAAewE,EAAS0D,cAC7BlJ,KAAKuH,cAAgB,IAAI/J,KAAKA,KAAKC,MAA8B,IAAtB+H,EAAS2D,YACpDnJ,KAAK0I,gBAEE,CACN1H,aAAchB,KAAKgB,aACnBqG,OAAQ7B,EAAS6B,QAAU,CAAA,EAC3B2B,UAAWxD,EAAS2D,WAEtB,CAAE,MAAOC,GACR,MAAM,IAAI7D,EACT6D,EAAMhM,QAAU,IAChB,gCAAgCgM,EAAMhI,UACtCgI,EAAM5D,SAER,CACD,CAEA,oBAAMpF,GAIL,GAHKJ,KAAKuI,wBACHvI,KAAKsI,QAEPtI,KAAKgB,aACT,MAAM,IAAIuE,EAAS,IAAK,mCAE1B,CAEA,sBAAM/E,CAAiBK,KAAWwI,GACjC,IACC,aAAaxI,EAAOyI,MAAMtJ,KAAMqJ,EACjC,CAAE,MAAOD,GACR,GAAqB,MAAjBA,EAAMhM,OAIT,OAHA4C,KAAKgB,aAAe,KACpBhB,KAAKuH,cAAgB,WACfvH,KAAKsI,aACEzH,EAAOyI,MAAMtJ,KAAMqJ,GAEjC,MAAMD,CACP,CACD,CAEA,cAAAb,GACC,OACCvI,KAAKgB,cAAgBhB,KAAKuH,eAAiB,IAAI/J,KAASwC,KAAKuH,aAE/D,CAEA,cAAAgC,CAAe/B,GACdxH,KAAKwH,YAAcA,EACnBxH,KAAKwJ,WAAW,0BAA2BhC,EAC5C,CAEA,cAAAiC,GACC,OAAOzJ,KAAKwH,WACb,CAEA,YAAAkC,GACC1J,KAAKgB,aAAe,KACpBhB,KAAKuH,cAAgB,KACrBvH,KAAK2J,YAAY,uBACjB3J,KAAK2J,YAAY,0BAClB,CAEA,aAAAjB,GACC,GAA4B,oBAAjBkB,aACX,IACC,MAAMC,EAAc,CACnBC,MAAO9J,KAAKgB,aACZ+I,OAAQ/J,KAAKuH,cAAc7J,cAC3B4J,UAAWtH,KAAKsH,WAEjBtH,KAAKwJ,WAAW,sBAAuBK,EACxC,CAAE,MAAOT,GAET,CACD,CAEA,kBAAAxB,GACC,GAA4B,oBAAjBgC,aAA8B,OAAO,EAChD,IACC,MAAMI,EAASJ,aAAaK,QAAQ,uBACpC,IAAKD,EAAQ,OAAO,EAEpB,MAAMH,EAAclI,KAAKuI,MAAMF,GAI/B,OAHAhK,KAAKgB,aAAe6I,EAAYC,MAChC9J,KAAKuH,cAAgB,IAAI/J,KAAKqM,EAAYE,QAEnC/J,KAAKuI,gBACb,CAAE,MAAOa,GACR,OAAO,CACR,CACD,CAEA,UAAAI,CAAWW,EAAKhE,GACa,oBAAjByD,cACVA,aAAaQ,QAAQD,EAAKxI,KAAKC,UAAUuE,GAE3C,CAEA,WAAAwD,CAAYQ,GACiB,oBAAjBP,cACVA,aAAaS,WAAWF,EAE1B,CAEA,kBAAMvJ,CAAaF,EAAUP,EAAU,IACtC,MAAM1B,EAAM,GAAGuB,KAAK0H,UAAUhH,IAE9B,IACC,MAAM8E,QAAiB8E,MAAM7L,EAAK0B,GAElC,IAAKqF,EAAS+E,GAAI,CACjB,IAAIC,EAAe,QAAQhF,EAASpI,SAChC0J,EAAe,KAEnB,IACCA,QAAqBtB,EAASiF,OAC9BD,EACC1D,EAAa1F,SAAW0F,EAAasC,OAASoB,CAChD,CAAE,MAAOE,GACRF,QAAsBhF,EAASmF,QAAWH,CAC3C,CAEA,MAAM,IAAIjF,EAASC,EAASpI,OAAQoN,EAAc1D,EACnD,CAEA,MAAM8D,EAAcpF,EAAS1E,QAAQ+J,IAAI,gBACzC,OAAID,GAAeA,EAAYhL,SAAS,0BAC1B4F,EAASiF,aAGVjF,EAASmF,MACvB,CAAE,MAAOvB,GACR,GAAIA,aAAiB7D,EAAU,MAAM6D,EACrC,MAAM,IAAI7D,EAAS,EAAG6D,EAAMhI,QAAS,KACtC,CACD,CAEA,iBAAA0J,CAAkB1I,GACjB,MAAM2I,EAAc,IAAIC,gBASxB,OARAC,OAAOC,QAAQ9I,GAAQ+I,QAAQ,EAAEhB,EAAKhE,MACjCA,SACH4E,EAAYK,OACXjB,EACiB,iBAAVhE,EAAqBxE,KAAKC,UAAUuE,GAASA,KAIhD4E,EAAYM,UACpB,CAEA,sBAAA1K,CAAuBD,EAAU0B,GAChC,MAAMkJ,EAActL,KAAK8K,kBAAkB1I,GAC3C,MAAO,GAAG1B,IAAW4K,EAAc,IAAMA,EAAc,IACxD,EChPM,MAAMC,UAAmBnE,EAC/B,WAAAtH,CAAYuH,EAAS,IACpBhC,MAAMgC,GAENrH,KAAKiH,SAAW,IAAIhG,EAAgBjB,MACpCA,KAAKwL,OAAS,IAAIpF,EAAcpG,MAChCA,KAAKyL,UAAY,IAAInJ,EAAiBtC,MACtCA,KAAK0L,KAAO,IAAI7J,EAAY7B,MAC5BA,KAAK2L,UAAY,IAAI9L,EAAiBG,KACvC,CAEA,oBAAMkB,CAAeX,GACpB,OAAOP,KAAKiH,SAAS/F,eAAeX,EACrC,CAEA,sBAAM8F,CAAiBC,GACtB,OAAOtG,KAAKwL,OAAOnF,iBAAiBC,EACrC,CAEA,0BAAMM,CAAqBC,EAAUC,GACpC,OAAO9G,KAAKwL,OAAO5E,qBAAqBC,EAAUC,EACnD,CAEA,mBAAMK,CAAcN,GACnB,OAAO7G,KAAKwL,OAAOrE,cAAcN,EAClC,CAEA,0BAAMtE,GACL,OAAOvC,KAAKyL,UAAUlJ,sBACvB,CAEA,uBAAMK,GAKL,OAJK5C,KAAKuI,wBACHvI,KAAKsI,OAGRtI,KAAKK,KACD,CACNjD,QAAQ,EACRmD,KAAM,CACLsC,eAAe,EACfC,aAAc,EACdH,cAAe,uCACfiJ,iBAAkB,CACjB,CAAEC,UAAW,QAASC,QAAS,IAC/B,CAAED,UAAW,MAAOC,QAAS,OAM1B9L,KAAKY,aAAa,kCAAmC,CAC3DC,OAAQ,MACRC,QAAS,CAAEC,cAAe,UAAUf,KAAKgB,iBAE3C,CAEA,sBAAM+B,CAAiB5C,GACtB,OAAOH,KAAKyL,UAAU1I,iBAAiB5C,EACxC,CAEA,qBAAMkD,CAAgBC,GACrB,OAAOtD,KAAKyL,UAAUpI,gBAAgBC,EACvC,CAEA,iBAAMgB,CAAYhB,EAAgBnD,GACjC,OAAOH,KAAKyL,UAAUnH,YAAYhB,EAAgBnD,EACnD,CAEA,uBAAMsD,CAAkBlD,GACvB,IAAKP,KAAKuI,iBAAkB,CAC3BwD,QAAQC,IAAI,oEACZ,UACOhM,KAAKsI,OACXyD,QAAQC,IAAI,sDAAuDhM,KAAKgB,aAAe,MAAQ,OAChG,CAAE,MAAOiL,GAER,MADAF,QAAQ3C,MAAM,+CAAgD6C,EAAU7K,SAClE6K,CACP,CACD,CAEA,IAAKjM,KAAKgB,aAET,MADA+K,QAAQ3C,MAAM,+DACR,IAAI7D,SAAS,IAAK,oCAKzB,GAFAwG,QAAQC,IAAI,6CAA8C,GAAGhM,KAAK0H,yCAA0C,QAAS1H,KAAKK,MAEtHL,KAAKK,KAAM,OACR,IAAIpB,QAASC,GAAYC,WAAWD,EAAS,MACnD,MAAMwE,EAAU,CACfhH,GAAI,QAAUc,KAAKC,MACnBH,QAASiD,EAAKjD,SAAW,mBACzBF,OAAQ,OACRG,iBAAiB,IAAIC,MAAOE,cAC5BC,YAAY,IAAIH,MAAOE,cACvB8F,SAAU,CACT,CACC9G,GAAI,OAASc,KAAKC,MAClBQ,QAASsC,EAAKa,QACdlD,YAAa,WACbP,YAAY,IAAIH,MAAOE,iBAM1B,OAFAL,mBAAmBsG,QAAQD,GAC3B3F,cAAc2F,EAAQhH,IAAMgH,EAAQF,SAC7B,CAAEpG,QAAQ,EAAMmD,KAAMmD,EAC9B,CAEA,OAAO1D,KAAKY,aAAa,kCAAmC,CAC3DC,OAAQ,OACRC,QAAS,CACR,eAAgB,mBAChBC,cAAe,UAAUf,KAAKgB,gBAE/BU,KAAMC,KAAKC,UAAU,CACpBR,QAASb,EAAKa,QACd9D,QAASiD,EAAKjD,SAAW,MAG5B,CAEA,iBAAMsG,CAAYN,EAAgB/C,GAKjC,GAJKP,KAAKuI,wBACHvI,KAAKsI,OAGRtI,KAAKK,KAAM,OACR,IAAIpB,QAASC,GAAYC,WAAWD,EAAS,MACnD,MAAM2E,EAAa,CAClBnH,GAAI,OAASc,KAAKC,MAClBQ,QAASsC,EAAKtC,QACdwD,YAAalB,EAAKkB,aAAe,GACjCvD,YAAa,WACbP,YAAY,IAAIH,MAAOE,eAMxB,OAJKK,cAAcuF,KAClBvF,cAAcuF,GAAkB,IAEjCvF,cAAcuF,GAAgBQ,KAAKD,GAC5B,CAAEzG,QAAQ,EAAMmD,KAAMsD,EAC9B,CAEA,MAAMxC,EAAU,CAAEpD,QAASsC,EAAKtC,SAKhC,OAJIsC,EAAKkB,aAAelB,EAAKkB,YAAYyB,OAAS,IACjD7B,EAAQI,YAAclB,EAAKkB,aAGrBzB,KAAKY,aAAa,mCAAmC0C,aAA2B,CACtFzC,OAAQ,OACRC,QAAS,CACR,eAAgB,mBAChBC,cAAe,UAAUf,KAAKgB,gBAE/BU,KAAMC,KAAKC,UAAUP,IAEvB,CAQA,gBAAM6K,CAAWC,EAAYC,GAK5B,OAJKpM,KAAKuI,wBACHvI,KAAKsI,OAGRtI,KAAKK,YACF,IAAIpB,QAASC,GAAYC,WAAWD,EAAS,MAC5C,CAAE9B,QAAQ,EAAMqB,IAAK,gCAAgC2N,MAGtDpM,KAAKY,aAAa,2BAA4B,CACpDC,OAAQ,OACRC,QAAS,CACR,eAAgB,mBAChBC,cAAe,UAAUf,KAAKgB,gBAE/BU,KAAMC,KAAKC,UAAU,CAAEyK,KAAMF,EAAYC,cAE3C,CAEA,yBAAMrH,CAAoBzB,EAAgB0B,GACzC,OAAOhF,KAAKyL,UAAU1G,oBAAoBzB,EAAgB0B,EAC3D,CAEA,4BAAMX,CAAuBf,GAC5B,OAAOtD,KAAKyL,UAAUpH,uBAAuBf,EAC9C,CAEA,oBAAMS,GACL,OAAO/D,KAAKyL,UAAU1H,gBACvB,CAEA,kBAAMuI,CAAahJ,EAAgB/C,GAClC,OAAOP,KAAKyL,UAAUa,aAAahJ,EAAgB/C,EACpD,CAEA,qBAAMgE,CAAgBhE,GACrB,OAAOP,KAAKyL,UAAUlH,gBAAgBhE,EACvC,CAEA,wBAAMuB,CAAmB3B,GACxB,OAAOH,KAAK0L,KAAK5J,mBAAmB3B,EACrC,CAEA,wBAAM4B,CAAmBC,EAAO7B,GAC/B,OAAOH,KAAK0L,KAAK3J,mBAAmBC,EAAO7B,EAC5C,CAEA,kBAAAyH,GACC,GAA4B,oBAAjBgC,aAA8B,OAAO,EAEhD,IACC,MAAMI,EAASJ,aAAaK,QAAQ,uBACpC,IAAKD,EAAQ,OAAO,EAEpB,MAAMH,EAAclI,KAAKuI,MAAMF,GAI/B,OADoBH,EAAYC,OAASD,EAAYC,MAAMyC,WAAW,YAClDvM,KAAKK,MACxBuJ,aAAaS,WAAW,wBACjB,IAGRrK,KAAKgB,aAAe6I,EAAYC,MAChC9J,KAAKuH,cAAgB,IAAI/J,KAAKqM,EAAYE,QAEnC/J,KAAKuI,iBACb,CAAE,MAAOa,GACR,OAAO,CACR,CACD,CAEA,kBAAMxI,CAAaF,EAAUP,EAAU,IACtC,MAAM1B,EAAM,GAAGuB,KAAK0H,UAAUhH,IAE9B,IACC,MAAM8E,QAAiB8E,MAAM7L,EAAK0B,GAElC,IAAKqF,EAAS+E,GAAI,CACjB,IAAIC,EAAe,QAAQhF,EAASpI,SAChC0J,EAAe,KAEnB,IACCA,QAAqBtB,EAASiF,OAC9BD,EACC1D,EAAa1F,SAAW0F,EAAasC,OAASoB,CAChD,CAAE,MAAOE,GACRF,QAAsBhF,EAASmF,QAAWH,CAC3C,CAEA,MAAM,IAAIjF,SAASC,EAASpI,OAAQoN,EAAc1D,EACnD,CAEA,MAAM8D,EAAcpF,EAAS1E,QAAQ+J,IAAI,gBACzC,OAAID,GAAeA,EAAYhL,SAAS,0BAC1B4F,EAASiF,aAGVjF,EAASmF,MACvB,CAAE,MAAOvB,GACR,GAAIA,aAAiB7D,SACpB,MAAM6D,EAEP,MAAM,IAAI7D,SAAS,EAAG6D,EAAMhI,QAAS,KACtC,CACD,ECtRM,MAAMoL,EACZ,WAAA1M,GACCE,KAAKyM,OAAS,IAAIC,GACnB,CAEA,EAAAC,CAAGC,EAAOC,GAMT,OALK7M,KAAKyM,OAAOK,IAAIF,IACpB5M,KAAKyM,OAAOM,IAAIH,EAAO,IAExB5M,KAAKyM,OAAO5B,IAAI+B,GAAO9I,KAAK+I,GAErB,IAAM7M,KAAKgN,IAAIJ,EAAOC,EAC9B,CAEA,GAAAG,CAAIJ,EAAOC,GACV,MAAMI,EAAYjN,KAAKyM,OAAO5B,IAAI+B,GAClC,GAAIK,EAAW,CACd,MAAMC,EAAQD,EAAUE,QAAQN,GAC5BK,GAAQ,GACXD,EAAUG,OAAOF,EAAO,EAE1B,CACD,CAEA,IAAAG,CAAKT,EAAOrM,GACX,MAAM0M,EAAYjN,KAAKyM,OAAO5B,IAAI+B,GAC9BK,GACHA,EAAU9B,QAAS0B,IAClB,IACCA,EAAStM,EACV,CAAE,MAAO6I,GACR2C,QAAQ3C,MAAM,sCAAuCA,EACtD,GAGH,CAEA,IAAAkE,CAAKV,EAAOC,GACX,MAAMU,EAAcvN,KAAK2M,GAAGC,EAAQrM,IACnCsM,EAAStM,GACTgN,MAED,OAAOA,CACR,CAEA,KAAAC,GACCxN,KAAKyM,OAAOe,OACb,CAEA,gBAAAC,CAAiBb,GAChB,MAAMK,EAAYjN,KAAKyM,OAAO5B,IAAI+B,GAClC,OAAOK,EAAYA,EAAU/J,OAAS,CACvC,ECpDM,SAASwK,EAAWC,EAAS,YAGnC,MAAO,GAAGA,KAFQnQ,KAAKC,SACRmQ,KAAKC,SAASxC,SAAS,IAAIyC,UAAU,EAAG,IAExD,CAEO,SAASC,EAAUC,EAAQC,GACjC,MAAMC,EAAS,IAAKF,GAEpB,IAAK,MAAM7D,KAAO8D,EACbA,EAAOE,eAAehE,KAExB8D,EAAO9D,IACgB,iBAAhB8D,EAAO9D,KACbiE,MAAMC,QAAQJ,EAAO9D,IAEtB+D,EAAO/D,GAAO4D,EAAUC,EAAO7D,IAAQ,CAAA,EAAI8D,EAAO9D,IAElD+D,EAAO/D,GAAO8D,EAAO9D,IAKxB,OAAO+D,CACR,CAkKO,SAASI,IACf,MAAyB,oBAAX/H,QAA8C,oBAAbgI,QAChD,8CAlKO,SAAkBC,EAAMC,GAC9B,IAAIC,EACJ,OAAO,YAA6BrF,GAKnCsF,aAAaD,GACbA,EAAUvP,WALI,KACbwP,aAAaD,GACbF,KAAQnF,IAGmBoF,EAC7B,CACD,oBAoGO,SAAezP,GACrB,OAAO,IAAIC,QAASC,GAAYC,WAAWD,EAASF,GACrD,cAUO,SAAqB4P,GAC3B,OAAOA,EAAOC,QAAQ,sBAAuB,OAC9C,iBAxBO,SAAwBC,GAC9B,GAAc,IAAVA,EAAa,MAAO,UAExB,MAEMC,EAAInB,KAAKoB,MAAMpB,KAAK5B,IAAI8C,GAASlB,KAAK5B,IAFlC,OAIV,OAAOiD,YAAYH,EAAQlB,KAAKsB,IAJtB,KAI6BH,IAAII,QAAQ,IAAM,IAH3C,CAAC,QAAS,KAAM,KAAM,MAGiCJ,EACtE,8BAvBO,WAIN,MAAO,CACNrP,UAJiBL,UAAUK,UAK3B0P,SAJgB/P,UAAU+P,SAK1BC,SAAUhQ,UAAUgQ,UAAYhQ,UAAUiQ,aAC1CC,cAAelQ,UAAUkQ,cACzBC,iBAAkB,GAAGC,OAAOC,SAASD,OAAOE,SAC5CC,WAAY,GAAGrJ,OAAOsJ,cAActJ,OAAOuJ,cAC3CC,SAAUC,KAAKC,iBAAiBC,kBAAkBC,SAEpD,iBAjDO,SAAwBC,EAASC,EAAUC,EAAW,IAC5D,IAAKF,IAAYC,EAAU,OAAOC,EAElC,IAEC,OADc/J,OAAOgK,iBAAiBH,GACzBI,iBAAiBH,IAAaC,CAC5C,CAAE,MAAOlH,GACR,OAAOkH,CACR,CACD,sBAoHO,WACN,OAAO,IAAI9S,MAAOE,aACnB,oBAlDO,SAA2B+S,EAAKC,EAAMC,OAAeC,GAC3D,IAAKH,IAAQC,EAAM,OAAOC,EAE1B,MAAME,EAAOH,EAAKI,MAAM,KACxB,IAAIC,EAAUN,EAEd,IAAK,MAAMtG,KAAO0G,EAAM,CACvB,GAAIE,WAA+C5G,KAAO4G,GACzD,OAAOJ,EAERI,EAAUA,EAAQ5G,EACnB,CAEA,OAAO4G,CACR,2BAhFO,SAAsBX,GAC5B,IAAKA,EAAS,OAAO,EAErB,MAAMY,EAAOZ,EAAQa,wBACrB,OACCD,EAAKE,KAAO,GACZF,EAAKG,MAAQ,GACbH,EAAKI,SACH7K,OAAOuJ,aAAevB,SAAS8C,gBAAgBC,eACjDN,EAAKO,QAAUhL,OAAOsJ,YAActB,SAAS8C,gBAAgBG,YAE/D,WA6FO,WACN,QAAKlD,MAGJ,iEAAiE3O,KAChEN,UAAUK,YACN6G,OAAOsJ,YAAc,IAE5B,eA1IO,SAAsBpL,GAC5B,SAAKA,GAA0B,iBAAVA,IAEF,6BACD9E,KAAK8E,EAAMgN,OAC9B,gBA2EO,SAAuBC,EAAKpB,EAAW,MAC7C,IACC,OAAO3O,KAAKuI,MAAMwH,EACnB,CAAE,MAAOtI,GACR,OAAOkH,CACR,CACD,eA/EO,SAAsBoB,GAC5B,IAAKA,GAAsB,iBAARA,EAAkB,MAAO,GAE5C,MAAMC,EAAMpD,SAASqD,cAAc,OAEnC,OADAD,EAAIE,YAAcH,EACXC,EAAIG,SACZ,kBA0BO,SAAyB1B,EAASjQ,EAAU,IAClD,IAAKiQ,EAAS,OAQdA,EAAQ2B,eAAe,CALtBC,SAAU,SACVC,MAAO,SACPC,OAAQ,aAGsC/R,GAChD,oBA2DO,SAA2BsQ,EAAKC,EAAMvK,GAC5C,IAAKsK,IAAQC,EAAM,OAAOD,EAE1B,MAAMI,EAAOH,EAAKI,MAAM,KAClBqB,EAAUtB,EAAKuB,MACrB,IAAIrB,EAAUN,EAEd,IAAK,MAAMtG,KAAO0G,EACX1G,KAAO4G,GAAoC,iBAAjBA,EAAQ5G,KACvC4G,EAAQ5G,GAAO,CAAA,GAEhB4G,EAAUA,EAAQ5G,GAInB,OADA4G,EAAQoB,GAAWhM,EACZsK,CACR,WAlJO,SAAkBjC,EAAMpL,GAC9B,IAAIiP,EACAC,EACJ,OAAO,YAAajJ,GACdiJ,GAIJ3D,aAAa0D,GACbA,EAAWlT,WACV,KACK3B,KAAKC,MAAQ6U,GAAWlP,IAC3BoL,KAAQnF,GACRiJ,EAAU9U,KAAKC,QAGjB2F,GAAS5F,KAAKC,MAAQ6U,MAXvB9D,KAAQnF,GACRiJ,EAAU9U,KAAKC,MAajB,CACD,iBAkJO,SAAwB4J,EAAQkL,EAAW,IACjD,MAAMC,EAAU,GAEhB,IAAK,MAAMrI,KAAOoI,EACZlL,EAAO8C,IACXqI,EAAQ1O,KAAKqG,GAIf,GAAIqI,EAAQtP,OAAS,EACpB,MAAM,IAAIiC,MAAM,mCAAmCqN,EAAQC,KAAK,SAGjE,OAAO,CACR,IC1NO,MAAMC,EACZC,mBAAqB,qBACrBA,6BAA+B,GAE/B,WAAA7S,CAAYK,EAAU,IACrBH,KAAKtD,GAAKyD,EAAQzD,GAClBsD,KAAK4S,IAAMzS,EAAQyS,IACnB5S,KAAK6S,WAAa1S,EAAQ0S,WAC1B7S,KAAKrB,KAAOwB,EAAQxB,MAAQ,OAE5BqB,KAAKG,QAAU,CACd2S,UAAW,KACXC,SAAU/S,KAAK4S,IAAIvL,OAAO0L,SAC1BvR,QAASxB,KAAK4S,IAAIvL,OAAO7F,QACzBuH,YAAa5I,EAAQ4I,aAAe,QACpCD,KAAM3I,EAAQ2I,MAAQ,SACtBH,aAAcxI,EAAQwI,cAAgB,UACtCC,gBAAiBzI,EAAQyI,iBAAmB,UAC5CC,UAAW1I,EAAQ0I,WAAa,UAChCmK,UAAU,EACVC,cAAc,EACdC,aAAc,CAAA,EACdC,yBAAyB,EACzBC,gBAAiBV,EAAWW,yBACzBlT,GAGJH,KAAKoQ,QAAU,KACfpQ,KAAKsT,aAAe,KACpBtT,KAAKuT,gBAAkB,KACvBvT,KAAKwT,SAAU,EACfxT,KAAKyT,WAAY,EAEjBzT,KAAK0T,MAAQ,CACZC,QAAQ,EACRC,WAAW,EACXC,cAAc,EACdlX,MAAO,GACPsB,QAAS,GACTwG,MAAO,GACPhD,YAAa,GACbqS,OAAQ,CAAA,GAGT9T,KAAK+T,cACN,CAEA,KAAAC,CAAMlB,GACL,OAAI9S,KAAKwT,SAAWxT,KAAKyT,UAAkBzT,KAEvCA,KAAKG,QAAQgT,yBAA2BnT,KAAKiU,yBAChDjU,KAAK4S,IAAIsB,SAAS7G,KAAK,oBAAqB,CAC3C8G,OAAQnU,KACRoU,OAAQ,uBAEFpU,OAGiB,iBAAd8S,IACVA,EAAYvE,SAAS8F,cAAcvB,IAG/BA,IACJA,EAAYvE,SAAS7M,MAGtB1B,KAAK8S,UAAYA,EACjB9S,KAAKoQ,QAAUpQ,KAAKsU,UACpBtU,KAAK8S,UAAUyB,YAAYvU,KAAKoQ,SAEhCpQ,KAAKwT,SAAU,EACfxT,KAAKwU,gBACLxU,KAAKyU,UAEDzU,KAAKG,QAAQ6S,UAChBhT,KAAK0U,OAGN1U,KAAK4S,IAAIsB,SAAS7G,KAAK,iBAAkB,CAAE8G,OAAQnU,OAC5CA,KACR,CAEA,IAAA0U,GAIC,OAHI1U,KAAKoQ,UACRpQ,KAAKoQ,QAAQuE,MAAMC,QAAU,SAEvB5U,IACR,CAEA,IAAA6U,GAIC,OAHI7U,KAAKoQ,UACRpQ,KAAKoQ,QAAQuE,MAAMC,QAAU,QAEvB5U,IACR,CAEA,SAAA8U,GACC9U,KAAK0T,MAAMC,QAAS,EAEa,UAA7B3T,KAAKG,QAAQ4I,aAChB/I,KAAK+U,oBACL5V,WAAW,KACVa,KAAKgV,oBACLhV,KAAKiV,eACLC,sBAAsB,KACjBlV,KAAKsT,cACRtT,KAAKsT,aAAa6B,UAAUC,IAAI,QAE7BpV,KAAKuT,iBACRvT,KAAKuT,gBAAgB4B,UAAUC,IAAI,WAGnC,OAEHpV,KAAKiV,eACLC,sBAAsB,KACjBlV,KAAKsT,cACRtT,KAAKsT,aAAa6B,UAAUC,IAAI,QAE7BpV,KAAKuT,iBACRvT,KAAKuT,gBAAgB4B,UAAUC,IAAI,UAIvC,CAEA,iBAAAL,GACC/U,KAAK0T,MAAME,WAAY,EAEvB5T,KAAKuT,gBAAkBhF,SAASqD,cAAc,OAC9C5R,KAAKuT,gBAAgB8B,UAAY,qBACjC9G,SAAS7M,KAAK6S,YAAYvU,KAAKuT,iBAE/BvT,KAAKsV,eAAiB/G,SAASqD,cAAc,OAC7C5R,KAAKsV,eAAeD,UAAY,yBAChCrV,KAAKsV,eAAexD,UAAY,gDAGhCvD,SAAS7M,KAAK6S,YAAYvU,KAAKsV,gBAE/BJ,sBAAsB,KACrBlV,KAAKuT,gBAAgB4B,UAAUC,IAAI,QACnCpV,KAAKsV,eAAeH,UAAUC,IAAI,SAEpC,CAEA,iBAAAJ,GACChV,KAAK0T,MAAME,WAAY,EACnB5T,KAAKsV,iBACRtV,KAAKsV,eAAeC,SACpBvV,KAAKsV,eAAiB,KAExB,CAEA,UAAAE,GACKxV,KAAKsT,cACRtT,KAAKsT,aAAa6B,UAAUI,OAAO,QAEhCvV,KAAKuT,iBACRvT,KAAKuT,gBAAgB4B,UAAUI,OAAO,QAGvCpW,WAAW,KACVa,KAAK0T,MAAMC,QAAS,EAChB3T,KAAKsT,cAAgBtT,KAAKsT,aAAamC,aAC1CzV,KAAKsT,aAAamC,WAAWC,YAAY1V,KAAKsT,cAC9CtT,KAAKsT,aAAe,MAEjBtT,KAAKuT,iBAAmBvT,KAAKuT,gBAAgBkC,aAChDzV,KAAKuT,gBAAgBkC,WAAWC,YAAY1V,KAAKuT,iBACjDvT,KAAKuT,gBAAkB,MAExBvT,KAAK2V,cACH,IACJ,CAEA,oBAAMzU,GACL,IAAIlB,KAAK0T,MAAMG,aAAf,CAEA7T,KAAK4V,aAEL,IACC5V,KAAK0T,MAAMG,cAAe,EAC1B7T,KAAK6V,sBAEL,MAAMxU,EAAU,CACf1E,MAAOqD,KAAK0T,MAAM/W,OAAS,WAC3BsB,QAAS+B,KAAK0T,MAAMzV,QACpBwG,MAAOzE,KAAK0T,MAAMjP,MAClBlD,SAAUvB,KAAKG,QAAQqB,QACvBC,YAAazB,KAAK0T,MAAMjS,aAGzB,IAAKzB,KAAK0T,MAAMzV,QAAQwT,OAEvB,YADAzR,KAAK8V,WAAW,uCAIjB,MAAMtQ,QAAiBxF,KAAK6S,WAAW3R,eAAeG,GAEtDrB,KAAK+V,mBAEL/V,KAAKgW,sBACLhW,KAAKwV,aAELxV,KAAK4S,IAAIsB,SAAS7G,KAAK,qBAAsB,CAC5C8G,OAAQnU,KACRiH,SAAUzB,GAEZ,CAAE,MAAO4D,GACRpJ,KAAK8V,WAAW,gDAChB9V,KAAK4S,IAAIsB,SAAS7G,KAAK,iBAAkB,CAAE8G,OAAQnU,KAAMoJ,SAC1D,CAAC,QACApJ,KAAK0T,MAAMG,cAAe,EAC1B7T,KAAK6V,qBACN,CAtC6B,CAuC9B,CAEA,kBAAAI,CAAmBC,GAClBlW,KAAKG,QAAQgW,MAAQD,EAAUC,MAC3BnW,KAAKoQ,SACRpQ,KAAKoW,cAEP,CAEA,OAAAC,GACKrW,KAAKyT,YAETzT,KAAKsW,YACLtW,KAAKwV,aAEDxV,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,SAG1CpQ,KAAKyT,WAAY,EACjBzT,KAAKwT,SAAU,EACfxT,KAAK4S,IAAIsB,SAAS7G,KAAK,mBAAoB,CAAE8G,OAAQnU,OACtD,CAEA,OAAAyU,GAAW,CACX,SAAA6B,GAAa,CAEb,gBAAAP,GACC,IACC,MAAMzO,EAAYtH,KAAK4S,IAAIvL,OAAOC,UAC5BiP,EAAa,GAAG7D,EAAW8D,eAAelP,IAC1C/G,EAAO,CACZkW,YAAajZ,KAAKC,MAClB+D,QAASxB,KAAKG,QAAQqB,SAEvBoI,aAAaQ,QAAQmM,EAAY5U,KAAKC,UAAUrB,GACjD,CAAE,MAAOmK,GACRqB,QAAQ2K,KAAK,uCAAwChM,EACtD,CACD,CAEA,qBAAAuJ,GACC,MAAM0C,EAA4C,GAA/B3W,KAAKG,QAAQiT,gBAAuB,GAAK,GAAK,IAC3D3V,EAAMD,KAAKC,MAEjB,GAAIuC,KAAK4S,IAAIvL,OAAOuP,iBACnB,IAIC,GAAInZ,EAHqB,IAAID,KAC5BwC,KAAK4S,IAAIvL,OAAOuP,kBACfC,UAC2BF,EAC5B,OAAO,CAET,CAAE,MAAOjM,GAET,CAGD,IACC,MAAMpD,EAAYtH,KAAK4S,IAAIvL,OAAOC,UAC5BiP,EAAa,GAAG7D,EAAW8D,eAAelP,IAC1C0C,EAASJ,aAAaK,QAAQsM,GAEpC,IAAKvM,EAAQ,OAAO,EAEpB,MAAMzJ,EAAOoB,KAAKuI,MAAMF,GAGxB,OAAOvM,EAFa8C,EAAKkW,YAEEE,CAC5B,CAAE,MAAOjM,GACR,OAAO,CACR,CACD,CAEA,uBAAAoM,GACC,IACC,MAAMxP,EAAYtH,KAAK4S,IAAIvL,OAAOC,UAC5BiP,EAAa,GAAG7D,EAAW8D,eAAelP,IAChDsC,aAAaS,WAAWkM,EACzB,CAAE,MAAO7L,GACRqB,QAAQ2K,KAAK,uCAAwChM,EACtD,CACD,CAEA,UAAAqM,GACC,OAAK/W,KAAKG,QAAQgT,0BACVnT,KAAKiU,uBACd,CAEA,OAAAK,GACC,MAAM,IAAInP,MAAM,mDACjB,CAEA,aAAAqP,GAEA,CAEA,YAAAT,GACC/T,KAAK8U,UAAY9U,KAAK8U,UAAUkC,KAAKhX,MACrCA,KAAKwV,WAAaxV,KAAKwV,WAAWwB,KAAKhX,MACvCA,KAAKkB,eAAiBlB,KAAKkB,eAAe8V,KAAKhX,KAChD,CAEA,YAAAiV,GACC,GAAIjV,KAAKsT,aAAc,OAEnBtT,KAAKG,QAAQ8S,eAAiBjT,KAAKuT,kBACtCvT,KAAKuT,gBAAkBhF,SAASqD,cAAc,OAC9C5R,KAAKuT,gBAAgB8B,UAAY,qBACjC9G,SAAS7M,KAAK6S,YAAYvU,KAAKuT,iBAE/BvT,KAAKuT,gBAAgB0D,iBAAiB,QAASjX,KAAKwV,aAGrD,MAAM0B,EACwB,UAA7BlX,KAAKG,QAAQ4I,YACV,iBACA,iBACEoO,EAAY,QAAQnX,KAAKG,QAAQ2I,OACvC9I,KAAKsT,aAAe/E,SAASqD,cAAc,OAC3C5R,KAAKsT,aAAa+B,UAAY,GAAG6B,KAAaC,IAC9CnX,KAAKsT,aAAaqB,MAAMyC,YACvB,kBACApX,KAAKG,QAAQwI,cAEd3I,KAAKsT,aAAaqB,MAAMyC,YACvB,aACApX,KAAKG,QAAQyI,iBAEd5I,KAAKsT,aAAaqB,MAAMyC,YAAY,eAAgBpX,KAAKG,QAAQ0I,WACjE7I,KAAKsT,aAAaxB,UAAY9R,KAAKqX,gBAEnC9I,SAAS7M,KAAK6S,YAAYvU,KAAKsT,cAC/BtT,KAAKsX,qBAEL,MAAMC,EAAavX,KAAKsT,aAAae,cAAc,mBAC/CkD,GACHpY,WAAW,IAAMoY,EAAWC,QAAS,IAEvC,CAEA,aAAAH,GACC,MAAO,maASoDrX,KAAKtD,yHAG7BsD,KAAKtD,oKAIjBsD,KAAK0T,MAAM/W,wJAI2BqD,KAAKtD,yFAE7BsD,KAAKtD,kLAK3BsD,KAAK0T,MAAMzV,qPAKV+B,KAAK0T,MAAMG,aAAe,aAAe,qHAO1D,CAEA,kBAAAyD,GACC,MAAMG,EAAQzX,KAAKsT,aAEnBmE,EACEpD,cAAc,kBACd4C,iBAAiB,QAASjX,KAAKwV,YAEpBiC,EAAMpD,cAAc,kBAC5B4C,iBAAiB,SAAWvM,IAChCA,EAAEgN,iBACF1X,KAAKkB,mBAGNuW,EACEpD,cAAc,uBACd4C,iBAAiB,QAAUvM,IAC3B1K,KAAK0T,MAAM/W,MAAQ+N,EAAEsD,OAAO7H,QAG9BsR,EACEpD,cAAc,4BACd4C,iBAAiB,QAAUvM,IAC3B1K,KAAK0T,MAAMzV,QAAUyM,EAAEsD,OAAO7H,QAGhC,MAAMwR,EAAgBjN,IACP,WAAVA,EAAEP,MACLnK,KAAKwV,aACLjH,SAASqJ,oBAAoB,UAAWD,KAG1CpJ,SAAS0I,iBAAiB,UAAWU,EACtC,CAEA,mBAAA9B,GACC,GAAI7V,KAAKsT,aAAc,CACtB,MAAMuE,EAAY7X,KAAKsT,aAAae,cAAc,oBAC9CwD,IACHA,EAAUhG,YAAc7R,KAAK0T,MAAMG,aAChC,aACA,gBACHgE,EAAUC,SAAW9X,KAAK0T,MAAMG,aAElC,CACD,CAEA,UAAAiC,CAAW1U,GACV,GAAIpB,KAAKsT,aAAc,CACtB,MAAMyE,EAAe/X,KAAKsT,aAAae,cAAc,mBACjD0D,IACHA,EAAalG,YAAczQ,EAC3B2W,EAAa5C,UAAUC,IAAI,QAE7B,CACD,CAEA,UAAAQ,GACC,GAAI5V,KAAKsT,aAAc,CACtB,MAAMyE,EAAe/X,KAAKsT,aAAae,cAAc,mBACjD0D,GACHA,EAAa5C,UAAUI,OAAO,OAEhC,CACD,CAEA,mBAAAS,GACC,MAAMgC,EAAezJ,SAASqD,cAAc,OAC5CoG,EAAa3C,UAAY,4CACzB2C,EAAalG,UAAY,yRAQzBvD,SAAS7M,KAAK6S,YAAYyD,GAE1B,MACMC,EAAoB,KACrBD,EAAavC,aAChBuC,EAAarD,MAAMuD,QAAU,IAC7B/Y,WAAW,KACN6Y,EAAavC,YAChBuC,EAAavC,WAAWC,YAAYsC,IAEnC,OARYA,EAAa3D,cAAc,kBAYnC4C,iBAAiB,QAASgB,GAEnC9Y,WAAW8Y,EAAmB,IAC/B,CAEA,UAAAtC,GACC3V,KAAK0T,MAAM/W,MAAQ,GACnBqD,KAAK0T,MAAMzV,QAAU,GACrB+B,KAAK0T,MAAMjP,MAAQ,GACnBzE,KAAK0T,MAAMI,OAAS,CAAA,CACrB,CAEA,YAAAsC,GAEA,CAEA,SAAA+B,GACCnY,KAAK8U,WACN,CAEA,UAAAsD,GACCpY,KAAKwV,YACN,EC7fM,MAAM6C,UAAqB3F,EACjC,WAAA5S,CAAYK,GACXkF,MAAM,IAAKlF,EAASxB,KAAM,WAC1BqB,KAAKsY,aAAc,CACpB,CAEA,OAAAhE,GACC,MAAMiE,EAAShK,SAASqD,cAAc,OA2BtC,OA1BA2G,EAAOlD,UAAY,mCAAmCrV,KAAKG,QAAQ4S,WACnEwF,EAAOzG,UAAY,q3CAqBf9R,KAAKG,QAAQ+S,cAChBjI,OAAOuN,OAAOD,EAAO5D,MAAO3U,KAAKG,QAAQ+S,cAGnCqF,CACR,CAEA,aAAA/D,GACC,MAAM+D,EAASvY,KAAKoQ,QAAQiE,cAAc,yBACpCoE,EAAezY,KAAKoQ,QAAQiE,cAAc,2BAC1CqE,EAAa1Y,KAAKoQ,QAAQiE,cAAc,yBAE9CoE,EAAaxB,iBAAiB,QAAUvM,IACvCA,EAAEiO,kBACFjO,EAAEgN,iBACF1X,KAAK4Y,aAGNF,EAAWzB,iBAAiB,QAAUvM,IACrCA,EAAEiO,kBACFjO,EAAEgN,iBACF1X,KAAK6Y,YAGNN,EAAOtB,iBAAiB,QAAUvM,IAEhCA,EAAEsD,OAAO8K,QAAQ,4BACjBpO,EAAEsD,OAAO8K,QAAQ,0BAKb9Y,KAAKsY,aACTtY,KAAK8U,aAGR,CAEA,QAAA8D,GACC5Y,KAAKsY,aAAc,EACnBtY,KAAKoQ,QAAQ+E,UAAUC,IAAI,YAC5B,CAEA,OAAAyD,GACC7Y,KAAKsY,aAAc,EACnBtY,KAAKoQ,QAAQ+E,UAAUI,OAAO,YAC/B,CAEA,KAAAvB,CAAMlB,GACLzN,MAAM2O,MAAMlB,EACb,CAEA,UAAAiG,CAAWpO,GACV,MAAMqO,EAAShZ,KAAKoQ,SAASiE,cAAc,kBACvC2E,IACHA,EAAOnH,YAAclH,EAEvB,CAEA,cAAAsO,CAAelG,GACd/S,KAAKG,QAAQ4S,SAAWA,EACpB/S,KAAKoQ,UACRpQ,KAAKoQ,QAAQiF,UAAYrV,KAAKoQ,QAAQiF,UAAUxG,QAC/C,mBACA,YAAYkE,KAGf,ECjGM,MAAMmG,UAAwBxG,EACpC,WAAA5S,CAAYK,GACXkF,MAAM,IAAKlF,EAASxB,KAAM,cAC1BqB,KAAKmZ,WAAa,GAClBnZ,KAAK4T,WAAY,EACjB5T,KAAKoZ,aAAe,KACpBpZ,KAAKqZ,eAAiB,KACtBrZ,KAAKsZ,aAAe,CACrB,CAEA,OAAAhF,GACC,MAAMxV,EAAUyP,SAASqD,cAAc,OAiBvC,OAhBA9S,EAAQuW,UAAY,6BAA6BrV,KAAKG,QAAQ4S,WAC9DjU,EAAQgT,UAAY,8VAKa9R,KAAKG,QAAQoZ,aAAe,0FAEzDvZ,KAAKG,QAAQqZ,UAAY,wCAA0C,4BAInExZ,KAAKG,QAAQ+S,cAChBjI,OAAOuN,OAAO1Z,EAAQ6V,MAAO3U,KAAKG,QAAQ+S,cAGpCpU,CACR,CAEA,aAAA0V,GACgBxU,KAAKoQ,QAAQiE,cAAc,0BACnC4C,iBAAiB,QAAS,KAChCjX,KAAKyZ,eAEP,CAEA,eAAMtB,GACDnY,KAAKoZ,eAETpZ,KAAK0T,MAAMC,QAAS,EACpB3T,KAAK0Z,eAE0B,IAA3B1Z,KAAKmZ,WAAWjW,cACblD,KAAK2Z,kBAGZ3Z,KAAKsZ,aAAe,EACpBtZ,KAAK4Z,0BAELrL,SAAS7M,KAAKiT,MAAMkF,SAAW,SAE/B3E,sBAAsB,KACjBlV,KAAKoZ,cACRpZ,KAAKoZ,aAAajE,UAAUC,IAAI,QAE7BpV,KAAKuT,iBACRvT,KAAKuT,gBAAgB4B,UAAUC,IAAI,UAGtC,CAEA,UAAAgD,GACC7J,SAAS7M,KAAKiT,MAAMkF,SAAW,GAE3B7Z,KAAKoZ,cACRpZ,KAAKoZ,aAAajE,UAAUI,OAAO,QAEhCvV,KAAKuT,iBACRvT,KAAKuT,gBAAgB4B,UAAUI,OAAO,QAGvCpW,WAAW,KACVa,KAAK0T,MAAMC,QAAS,EAChB3T,KAAKoZ,cAAgBpZ,KAAKoZ,aAAa3D,aAC1CzV,KAAKoZ,aAAa3D,WAAWC,YAAY1V,KAAKoZ,cAC9CpZ,KAAKoZ,aAAe,MAEjBpZ,KAAKuT,iBAAmBvT,KAAKuT,gBAAgBkC,aAChDzV,KAAKuT,gBAAgBkC,WAAWC,YAAY1V,KAAKuT,iBACjDvT,KAAKuT,gBAAkB,OAEtB,IACJ,CAEA,YAAAmG,GACC1Z,KAAKuT,gBAAkBhF,SAASqD,cAAc,OAC9C5R,KAAKuT,gBAAgB8B,UAAY,2BACjC9G,SAAS7M,KAAK6S,YAAYvU,KAAKuT,iBAC/BvT,KAAKuT,gBAAgB0D,iBAAiB,QAAS,IAAMjX,KAAKoY,cAE1DpY,KAAKoZ,aAAe7K,SAASqD,cAAc,OAC3C5R,KAAKoZ,aAAa/D,UAAY,kBAC9BrV,KAAKoZ,aAAatH,UAAY,gVAW9BvD,SAAS7M,KAAK6S,YAAYvU,KAAKoZ,cAE/BpZ,KAAKoZ,aACH/E,cAAc,8BACd4C,iBAAiB,QAAUvM,IAC3BA,EAAEiO,oBAGJ3Y,KAAKoZ,aACH/E,cAAc,0BACd4C,iBAAiB,QAAS,IAAMjX,KAAKoY,cAEvCpY,KAAK8Z,eAAkBpP,IACR,WAAVA,EAAEP,KACLnK,KAAKoY,cAGP7J,SAAS0I,iBAAiB,UAAWjX,KAAK8Z,eAC3C,CAEA,iBAAML,GACDzZ,KAAK+Z,mBAEL/Z,KAAKoZ,eACRpZ,KAAKoY,mBACC,IAAInZ,QAASC,GAAYC,WAAWD,EAAS,OAGpDc,KAAK0T,MAAMC,QAAS,EACpB3T,KAAKga,mBAE0B,IAA3Bha,KAAKmZ,WAAWjW,cACblD,KAAK2Z,kBAGZ3Z,KAAKia,uBAEL1L,SAAS7M,KAAKiT,MAAMkF,SAAW,SAE/B3E,sBAAsB,KACjBlV,KAAK+Z,mBACR/Z,KAAK+Z,iBAAiB5E,UAAUC,IAAI,QACpCpV,KAAKka,iBAEFla,KAAKma,0BACRna,KAAKma,yBAAyBhF,UAAUC,IAAI,UAG/C,CAEA,aAAA8E,GACC,MAAME,EAAS,CACd,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGKtH,EAAYvE,SAASqD,cAAc,OACzCkB,EAAUuC,UAAY,+BACtB9G,SAAS7M,KAAK6S,YAAYzB,GAE1B,IAAK,IAAI/D,EAAI,EAAGA,EALM,GAKaA,IAAK,CACvC,MAAMsL,EAAW9L,SAASqD,cAAc,OACxCyI,EAAShF,UAAY,qBACrBgF,EAAS1F,MAAMxD,KAAuB,IAAhBvD,KAAKC,SAAiB,IAC5CwM,EAAS1F,MAAM/L,gBACdwR,EAAOxM,KAAKoB,MAAMpB,KAAKC,SAAWuM,EAAOlX,SAC1CmX,EAAS1F,MAAM2F,eAAiC,GAAhB1M,KAAKC,SAAiB,IACtDwM,EAAS1F,MAAM4F,kBAAoC,EAAhB3M,KAAKC,SAAe,IAAM,IAE7D,MAAM2M,EAAS,CAAC,SAAU,SAAU,aAC9BC,EAAQD,EAAO5M,KAAKoB,MAAMpB,KAAKC,SAAW2M,EAAOtX,SACzC,WAAVuX,GACHJ,EAAS1F,MAAM+F,aAAe,MAC9BL,EAAS1F,MAAMjF,MAAwB,EAAhB9B,KAAKC,SAAe,EAAI,KAC/CwM,EAAS1F,MAAMhF,OAAS0K,EAAS1F,MAAMjF,OACnB,cAAV+K,GACVJ,EAAS1F,MAAMjF,MAAwB,EAAhB9B,KAAKC,SAAe,EAAI,KAC/CwM,EAAS1F,MAAMhF,OAAyB,GAAhB/B,KAAKC,SAAgB,EAAI,OAEjDwM,EAAS1F,MAAMjF,MAAwB,EAAhB9B,KAAKC,SAAe,EAAI,KAC/CwM,EAAS1F,MAAMhF,OAAS0K,EAAS1F,MAAMjF,OAGxCoD,EAAUyB,YAAY8F,EACvB,CAEAlb,WAAW,KACN2T,EAAU2C,YACb3C,EAAU2C,WAAWC,YAAY5C,IAEhC,KACJ,CAEA,YAAA6H,GACCpM,SAAS7M,KAAKiT,MAAMkF,SAAW,GAE3B7Z,KAAK+Z,kBACR/Z,KAAK+Z,iBAAiB5E,UAAUI,OAAO,QAEpCvV,KAAKma,0BACRna,KAAKma,yBAAyBhF,UAAUI,OAAO,QAGhDpW,WAAW,KACVa,KAAK0T,MAAMC,QAAS,EAChB3T,KAAK+Z,kBAAoB/Z,KAAK+Z,iBAAiBtE,aAClDzV,KAAK+Z,iBAAiBtE,WAAWC,YAAY1V,KAAK+Z,kBAClD/Z,KAAK+Z,iBAAmB,MAGxB/Z,KAAKma,0BACLna,KAAKma,yBAAyB1E,aAE9BzV,KAAKma,yBAAyB1E,WAAWC,YACxC1V,KAAKma,0BAENna,KAAKma,yBAA2B,MAE7Bna,KAAK4a,yBACRrM,SAASqJ,oBAAoB,UAAW5X,KAAK4a,0BAE5C,IACJ,CAEA,gBAAAZ,GACCha,KAAKma,yBAA2B5L,SAASqD,cAAc,OACvD5R,KAAKma,yBAAyB9E,UAAY,gCAC1C9G,SAAS7M,KAAK6S,YAAYvU,KAAKma,0BAC/Bna,KAAKma,yBAAyBlD,iBAAiB,QAAS,IACvDjX,KAAK2a,gBAGN3a,KAAK+Z,iBAAmBxL,SAASqD,cAAc,OAC/C5R,KAAK+Z,iBAAiB1E,UAAY,uBAClCrV,KAAK+Z,iBAAiBjI,UAAY,0HAGzB9R,KAAKG,QAAQxD,OAAS,8UAW/B4R,SAAS7M,KAAK6S,YAAYvU,KAAK+Z,kBAE/B/Z,KAAK+Z,iBACH1F,cAAc,mCACd4C,iBAAiB,QAAUvM,IAC3BA,EAAEiO,oBAGJ3Y,KAAK+Z,iBACH1F,cAAc,+BACd4C,iBAAiB,QAAS,IAAMjX,KAAK2a,gBAEvC3a,KAAK4a,wBAA2BlQ,IACjB,WAAVA,EAAEP,KACLnK,KAAK2a,gBAGPpM,SAAS0I,iBAAiB,UAAWjX,KAAK4a,wBAC3C,CAEA,oBAAAX,GACC,MAAMvY,EAAO1B,KAAK+Z,iBAAiB1F,cAClC,8BAGGrU,KAAK4T,YAIsB,IAA3B5T,KAAKmZ,WAAWjW,QAapBxB,EAAKoQ,UAAY,iDAEb9R,KAAKmZ,WAAW0B,IAAI,CAAClP,EAAWuB,IAAUlN,KAAK8a,yBAAyBnP,EAAWuB,IAAQuF,KAAK,0BAIpG/Q,EAAKqZ,iBAAiB,wBAAwB5P,QAAQ,CAAC6P,EAAM9N,KAC5D8N,EAAK/D,iBAAiB,QAAS,KAC9B,MAAMtL,EAAY3L,KAAKmZ,WAAWjM,GAClClN,KAAKib,kBAAkBtP,QArBxBjK,EAAKoQ,UAAY,sXAwBnB,CAEA,wBAAAgJ,CAAyBnP,EAAWuB,GACnC,MAAMgO,EAAWvP,EAAU7O,aAAe6O,EAAUwP,MAC9CC,EAAWzP,EAAU7O,aAAe6O,EAAUwP,MAC9CE,EAAO1P,EAAU3O,aACpBgD,KAAKsb,YAAY3P,EAAU3O,cAC3B,GAEH,MAAO,wDACyCkQ,kEAG5CgO,EACG,kFAEUE,WAAkBzP,EAAUhP,2DAGtC,wEAGD0e,EAAO,0CAA0CA,WAAgB,mBAElE1P,EAAU1O,QAAU0O,EAAU1O,OAAOiG,OAAS,EAC3C,6EAEAyI,EAAU1O,OACV4d,IACCU,GAAU,8EAC6CA,EAAMpe,OAAS,qBAAqB6C,KAAKwb,kBAAkBD,EAAMpe,OAAS,eAAeoe,EAAMre,iCAGvJuV,KAAK,0CAGL,yDAEoC9G,EAAUhP,2BAEjDgP,EAAU/O,SAAW+O,EAAU9O,YAC5B,8DAC0C8O,EAAU/O,SAAW+O,EAAU9O,gCAEzE,0DAMT,CAEA,qBAAM8c,GACL3Z,KAAK4T,WAAY,EAEjB,IACC,MAAM1F,QAAelO,KAAK6S,WAAW3S,gBACrCF,KAAKmZ,WAAajL,EAAO3N,MAAQ,GACjCP,KAAK4S,IAAIsB,SAAS7G,KAAK,mBAAoB,CAC1C8L,WAAYnZ,KAAKmZ,YAEnB,CAAE,MAAO/P,GACRpJ,KAAKmZ,WAAa,GAClBnZ,KAAK4S,IAAIsB,SAAS7G,KAAK,kBAAmB,CAAEjE,SAC7C,CAAC,QACApJ,KAAK4T,WAAY,CAClB,CACD,CAEA,uBAAAgG,GACC,MAAM3b,EAAU+B,KAAKoZ,aAAa/E,cAAc,4BAEhD,GAAIrU,KAAK4T,UACR,OAGD,GAA+B,IAA3B5T,KAAKmZ,WAAWjW,OAUnB,YATAjF,EAAQ6T,UAAY,uXAYrB,MAAMnG,EAAY3L,KAAKmZ,WAAWnZ,KAAKsZ,cACjC4B,EAAWvP,EAAU7O,aAAe6O,EAAUwP,MAC9CC,EAAWzP,EAAU7O,aAAe6O,EAAUwP,MAC9CM,EAAczb,KAAKmZ,WAAWjW,OAAS,EAE7CjF,EAAQ6T,UAAY,uDAGjBoJ,EACG,0EAEUE,WAAkBzP,EAAUhP,uDAGtC,+FAGiCgP,EAAUhP,yBAE7CgP,EAAU/O,SAAW+O,EAAU9O,YAC5B,wDACsC8O,EAAU/O,SAAW+O,EAAU9O,8BAErE,iFAGDmD,KAAKG,QAAQub,gBAAkB,+GAKjCD,EACG,mEAEAzb,KAAKmZ,WACL0B,IACA,CAACc,EAAG5M,IAAM,gDACkBA,IAAM/O,KAAKsZ,aAAe,SAAW,mBAAmBvK,8BAGpF0D,KAAK,sCAGL,mVAYPxU,EACEoW,cAAc,wBACd4C,iBAAiB,QAAS,KAC1BjX,KAAKib,kBAAkBtP,KAGzB1N,EACEoW,cAAc,2BACd4C,iBAAiB,QAAS,KAC1BjX,KAAKoY,aACLjZ,WAAW,IAAMa,KAAKyZ,cAAe,OAGnCgC,GACHxd,EAAQ8c,iBAAiB,kBAAkB5P,QAASyQ,IACnDA,EAAI3E,iBAAiB,QAAUvM,IAC9B,MAAMwC,EAAQ2O,SAASnR,EAAEsD,OAAO8N,QAAQ5O,MAAO,IAC/ClN,KAAKsZ,aAAepM,EACpBlN,KAAK4Z,6BAIT,CAEA,iBAAAqB,CAAkBtP,GAGjB,GAFA3L,KAAK4S,IAAIsB,SAAS7G,KAAK,iBAAkB,CAAE1B,cAEvCA,EAAUlN,KAAOkN,EAAU5O,KAAM,CACpC,MAAM0B,EACLkN,EAAUlN,KACV,GAAGuB,KAAKG,QAAQ4b,kBAAoB,MAAMpQ,EAAU5O,QACnB,IAA9BiD,KAAKG,QAAQ6b,aAChBzV,OAAO0V,KAAKxd,EAAK,SAAU,uBAE3B8H,OAAOC,SAASC,KAAOhI,CAEzB,CAEyC,mBAA9BuB,KAAKG,QAAQ+b,cACvBlc,KAAKG,QAAQ+b,aAAavQ,EAE5B,CAEA,WAAA2P,CAAYa,GAGX,OAFa,IAAI3e,KAAK2e,GAEVC,mBAAmB,QADf,CAAEC,KAAM,UAAWC,MAAO,QAASC,IAAK,WAEzD,CAEA,iBAAAf,CAAkBgB,GACjB,MAAMC,EAAMD,EAAS3N,QAAQ,IAAK,IAKlC,OADmB,KAHTgN,SAASY,EAAIC,OAAO,EAAG,GAAI,IAGN,KAFrBb,SAASY,EAAIC,OAAO,EAAG,GAAI,IAEM,KADjCb,SAASY,EAAIC,OAAO,EAAG,GAAI,KACmB,IACrC,GAAM,UAAY,SACtC,CAEA,SAAAC,GACC,MAAMC,EAAQ5c,KAAKoQ,SAASiE,cAAc,oBACtCuI,IACHA,EAAMjI,MAAMC,QAAU,OAExB,CAEA,SAAA4E,GACC,MAAMoD,EAAQ5c,KAAKoQ,SAASiE,cAAc,oBACtCuI,IACHA,EAAMjI,MAAMC,QAAU,QAExB,CAEA,aAAAiI,GACK7c,KAAKsZ,aAAetZ,KAAKmZ,WAAWjW,OAAS,IAChDlD,KAAKsZ,eACLtZ,KAAK4Z,0BAEP,CAEA,aAAAkD,GACK9c,KAAKsZ,aAAe,IACvBtZ,KAAKsZ,eACLtZ,KAAK4Z,0BAEP,CAEA,aAAMmD,GACL/c,KAAKmZ,WAAa,SACZnZ,KAAK2Z,kBACP3Z,KAAKoZ,eACRpZ,KAAKsZ,aAAe,EACpBtZ,KAAK4Z,2BAEF5Z,KAAK+Z,kBACR/Z,KAAKia,sBAEP,CAEA,KAAAjG,CAAMlB,GACLzN,MAAM2O,MAAMlB,EACb,CAEA,OAAAuD,GACKrW,KAAK8Z,gBACRvL,SAASqJ,oBAAoB,UAAW5X,KAAK8Z,gBAE1C9Z,KAAK4a,yBACRrM,SAASqJ,oBAAoB,UAAW5X,KAAK4a,yBAE9C5a,KAAKoY,aACLpY,KAAK2a,eACLtV,MAAMgR,SACP,ECzjBM,MAAM2G,UAAqBtK,EACjC,WAAA5S,CAAYK,GACXkF,MAAM,IAAKlF,EAASxB,KAAM,UAC3B,CAEA,OAAA2V,GACC,MAAMH,EAAS5F,SAASqD,cAAc,OA4CtC,OA3CAuC,EAAOkB,UAAY,yCACnBlB,EAAOrC,UAAY,iWAUE9R,KAAK0T,MAAM/W,mQASnBqD,KAAK0T,MAAMzV,oQAQH+B,KAAK0T,MAAMjP,sPAW5BzE,KAAKG,QAAQ+S,cAChBjI,OAAOuN,OAAOrE,EAAOQ,MAAO3U,KAAKG,QAAQ+S,cAGnCiB,CACR,CAEA,aAAAK,GACC,MAAMyI,EAAOjd,KAAKoQ,QAAQiE,cAAc,yBAExC4I,EAAKhG,iBAAiB,SAAWvM,IAChCA,EAAEgN,iBACF1X,KAAKkB,mBAGN+b,EAAK5I,cAAc,uBAAuB4C,iBAAiB,QAAUvM,IACpE1K,KAAK0T,MAAM/W,MAAQ+N,EAAEsD,OAAO7H,QAG7B8W,EACE5I,cAAc,4BACd4C,iBAAiB,QAAUvM,IAC3B1K,KAAK0T,MAAMzV,QAAUyM,EAAEsD,OAAO7H,QAGhC8W,EAAK5I,cAAc,uBAAuB4C,iBAAiB,QAAUvM,IACpE1K,KAAK0T,MAAMjP,MAAQiG,EAAEsD,OAAO7H,OAE9B,CAEA,SAAAgS,GACC,MAAM+E,EAAWld,KAAKoQ,QAAQiE,cAAc,4BACxC6I,GACHA,EAAS1F,OAEX,CAEA,UAAAY,GAEA,CAEA,mBAAApC,GACC,MAAM7B,EAASnU,KAAKoQ,QAAQiE,cAAc,4BACpC8I,EAAkBhJ,EAAOrC,UAE/BqC,EAAOrC,UAAY,4QASFqC,EAAOE,cAAc,oBAC7B4C,iBAAiB,QAAS,KAClC9C,EAAOrC,UAAYqL,EACnBnd,KAAKwU,gBACLxU,KAAK2V,cAEP,CAEA,UAAAG,CAAW1U,GACV,MAAM2W,EAAe/X,KAAKoQ,QAAQiE,cAAc,mBAC5C0D,IACHA,EAAalG,YAAczQ,EAC3B2W,EAAa5C,UAAUC,IAAI,QAE3BjW,WAAW,KACN4Y,GACHA,EAAa5C,UAAUI,OAAO,SAE7B,KAEL,CAEA,mBAAAM,GACC,MAAMgC,EAAY7X,KAAKoQ,QAAQiE,cAAc,oBACzCwD,IACHA,EAAUhG,YAAc7R,KAAK0T,MAAMG,aAChC,aACA,gBACHgE,EAAUC,SAAW9X,KAAK0T,MAAMG,aAElC,CAEA,WAAAuJ,CAAYzgB,GACX,MAAM0gB,EAAerd,KAAKoQ,SAASiE,cAAc,MAC7CgJ,IACHA,EAAaxL,YAAclV,EAE7B,CAEA,cAAA2gB,CAAepX,EAAOqX,GACrB,MAAMC,EAAQxd,KAAKoQ,SAASiE,cAAc,UAAUnO,OAChDsX,IACHA,EAAMD,YAAcA,EAEtB,EC/IM,MAAME,EACb,WAAA3d,CAAYK,EAAU,CAAA,GACrBH,KAAK0d,YAAc,OACnB1d,KAAK2T,QAAS,EACd3T,KAAK2d,YAAc,EACnB3d,KAAK4d,qBAAuB,KAG5B5d,KAAK6d,cAAgB,GACrB7d,KAAKwD,SAAW,CAAA,EAGhBxD,KAAK8d,aAAe,GACpB9d,KAAK+d,gBAAkB,GAGvB/d,KAAKge,mBAAqB,GAC1Bhe,KAAKie,eAAiB,GAGtBje,KAAKke,SAAW/d,EAAQ+d,UAAY,UACpCle,KAAKme,YAAche,EAAQge,aAAe,GAC1Cne,KAAKoe,eAAiBje,EAAQie,gBAAkB,mBAGhDpe,KAAKwH,YAAcrH,EAAQqH,aAAe,KAG1CxH,KAAKqe,cAAe,EACpBre,KAAKse,eAAiB,KAGtBte,KAAKue,YAAoC,IAAvBpe,EAAQoe,WAC1Bve,KAAKwe,iBAA8C,IAA5Bre,EAAQqe,gBAG/Bxe,KAAKye,cAAe,EACpBze,KAAK0e,YAAc,EACnB1e,KAAK2e,aAAe,uCAGpB3e,KAAK4e,YAAc,CAAA,EAGnB5e,KAAK4T,WAAY,EACjB5T,KAAK6e,mBAAoB,EAGzB7e,KAAK8e,WAAa,IAAIC,GACvB,CAIC,SAAAC,CAAUnS,GAET,OADA7M,KAAK8e,WAAW1J,IAAIvI,GACb,IAAM7M,KAAK8e,WAAWG,OAAOpS,EACrC,CAKA,OAAAqS,CAAQC,EAAY5e,GACnBP,KAAK8e,WAAW3T,QAASiU,GAAOA,EAAGD,EAAY5e,EAAMP,MACtD,CAKA,OAAAqf,CAAQC,GACP,MAAMC,EAAevf,KAAK0d,YAC1B1d,KAAK0d,YAAc4B,EACnBtf,KAAKkf,QAAQ,aAAc,CAAEK,eAAc7B,YAAa4B,GACzD,CAKA,OAAAE,CAAQ7L,GACP3T,KAAK2T,OAASA,EACd3T,KAAKkf,QAAQ,aAAc,CAAEvL,UAC9B,CAKA,qBAAA8L,CAAsBnc,GACrB,MAAMoc,EAAyB1f,KAAK4d,qBACpC5d,KAAK4d,qBAAuBta,EAC5BtD,KAAKkf,QAAQ,qBAAsB,CAAE5b,iBAAgBoc,0BACtD,CAKA,gBAAAC,CAAiB9B,GAChB7d,KAAK6d,cAAgBA,EACrB7d,KAAK4f,qBACL5f,KAAKkf,QAAQ,sBAAuB,CAAErB,iBACvC,CAKA,eAAAgC,CAAgBC,GACf9f,KAAK6d,cAAcla,QAAQmc,GAC3B9f,KAAK4f,qBACL5f,KAAKkf,QAAQ,oBAAqB,CAAEY,gBACrC,CAKA,WAAAC,CAAYzc,EAAgBE,GAC3BxD,KAAKwD,SAASF,GAAkBE,EAChCxD,KAAKkf,QAAQ,iBAAkB,CAAE5b,iBAAgBE,YAClD,CAKA,UAAAwc,CAAW1c,EAAgBlC,GACrBpB,KAAKwD,SAASF,KAClBtD,KAAKwD,SAASF,GAAkB,IAEjCtD,KAAKwD,SAASF,GAAgBQ,KAAK1C,GAGnC,MAAM6e,EAAOjgB,KAAK6d,cAActa,KAAMrB,GAAMA,EAAExF,KAAO4G,GACjD2c,IACHA,EAAKC,YAAc9e,EAAQnD,QAC3BgiB,EAAKE,gBAAkB/e,EAAQgf,UAC1Bhf,EAAQif,QACZJ,EAAKriB,QAAUqiB,EAAKriB,QAAU,GAAK,EACnCoC,KAAK4f,uBAIP5f,KAAKkf,QAAQ,eAAgB,CAAE5b,iBAAgBlC,WAChD,CAKA,kBAAAkf,CAAmBhd,EAAgBid,GAClC,MAAMN,EAAOjgB,KAAK6d,cAActa,KAAMrB,GAAMA,EAAExF,KAAO4G,GACrD,OAAK2c,GAILhV,OAAOuN,OAAOyH,EAAMM,GACpBvgB,KAAKkf,QAAQ,sBAAuB,CAAE5b,iBAAgBwc,aAAcG,IAC7DA,GALC,IAMT,CAKA,UAAAO,CAAWld,GACV,MAAM2c,EAAOjgB,KAAK6d,cAActa,KAAMrB,GAAMA,EAAExF,KAAO4G,GACjD2c,GAAQA,EAAKriB,OAAS,IACzBqiB,EAAKriB,OAAS,EACdoC,KAAK4f,qBACL5f,KAAKkf,QAAQ,mBAAoB,CAAE5b,mBAErC,CAKA,kBAAAsc,GACC5f,KAAK2d,YAAc3d,KAAK6d,cAAc5Z,OACrC,CAACC,EAAKhC,IAAMgC,GAAOhC,EAAEtE,QAAU,GAC/B,GAEDoC,KAAKkf,QAAQ,oBAAqB,CAAElb,MAAOhE,KAAK2d,aACjD,CAKA,eAAA8C,CAAgBC,GACf1gB,KAAK8d,aAAe4C,EACpB1gB,KAAKkf,QAAQ,qBAAsB,CAAEwB,YACtC,CAKA,kBAAAC,CAAmB3e,GAClBhC,KAAK+d,gBAAkB/b,EACvBhC,KAAKkf,QAAQ,mBAAoB,CAAEld,SACpC,CAKA,qBAAA4e,CAAsBC,GACrB7gB,KAAKge,mBAAqB6C,EAC1B7gB,KAAKkf,QAAQ,sBAAuB,CAAE2B,SACvC,CAKA,iBAAAC,CAAkBD,GACjB7gB,KAAKie,eAAiB4C,EACtB7gB,KAAKkf,QAAQ,kBAAmB,CAAE2B,SACnC,CAKA,qBAAAE,GACC,OAAO/gB,KAAK6d,cAActa,KAAMrB,GAAMA,EAAExF,KAAOsD,KAAK4d,qBACrD,CAKA,iBAAAoD,GACC,OAAOhhB,KAAKwD,SAASxD,KAAK4d,uBAAyB,EACpD,CAOA,wBAAAqD,CAAyBC,GACnBA,GAA4B,IAAlBA,EAAOhe,SAEtBlD,KAAKme,YAAc+C,EAAOrG,IAAKsG,GAC1BA,EAAMrV,QAAgBqV,EAAMrV,QACzBqV,EAAMtV,WAAa,KAE3B7L,KAAKkf,QAAQ,oBAAqB,CAAEf,YAAane,KAAKme,cACvD,CAKA,uBAAAiD,GACC,IAAKphB,KAAK+d,gBACT,OAAO/d,KAAK8d,aAEb,MAAM9b,EAAQhC,KAAK+d,gBAAgB5b,cACnC,OAAOnC,KAAK8d,aAAa7b,OACvBof,GACAA,EAAQ1kB,MAAMwF,cAAcvC,SAASoC,IACpCqf,EAAQxkB,aACRwkB,EAAQxkB,YAAYsF,cAAcvC,SAASoC,GAE/C,CAKA,KAAAsf,GACCthB,KAAK0d,YAAc,OACnB1d,KAAK4d,qBAAuB,KAC5B5d,KAAK+d,gBAAkB,GACvB/d,KAAKkf,QAAQ,QAAS,GACvB,ECzQM,MAAMqC,EACZ,WAAAzhB,CAAY4T,EAAOvT,EAAU,IAC5BH,KAAK0T,MAAQA,EACb1T,KAAKG,QAAU,CACd4S,SAAU5S,EAAQ4S,UAAY,eAC9BpK,aAAcxI,EAAQwI,cAAgB,aACnCxI,GAEJH,KAAKoQ,QAAU,KACfpQ,KAAKwhB,aAAe,IACrB,CAEA,MAAAC,GAgBC,OAfAzhB,KAAKoQ,QAAU7B,SAASqD,cAAc,OACtC5R,KAAKoQ,QAAQiF,UAAY,yCAAyCrV,KAAKG,QAAQ4S,WAE/E/S,KAAK0hB,iBACL1hB,KAAKwU,gBAELxU,KAAKwhB,aAAexhB,KAAK0T,MAAMsL,UAAU,CAACrgB,EAAM4B,KAClC,eAAT5B,GACHqB,KAAK2hB,cAEO,sBAAThjB,GACHqB,KAAK4hB,iBAIA5hB,KAAKoQ,OACb,CAEA,cAAAsR,GACC,MAAMG,EACL7hB,KAAK0T,MAAMiK,YAAc,EACtB,0CAA0C3d,KAAK0T,MAAMiK,YAAc,EAAI,KAAO3d,KAAK0T,MAAMiK,qBACzF,GAEJ3d,KAAKoQ,QAAQ0B,UAAY,o0CAYrB+P,2BAKA7hB,KAAKG,QAAQwI,cAChB3I,KAAKoQ,QAAQiE,cAAc,2BAA2BM,MAAMyC,YAAY,aAAcpX,KAAKG,QAAQwI,aAErG,CAEA,aAAA6L,GACCxU,KAAKoQ,QACHiE,cAAc,2BACd4C,iBAAiB,QAAS,KAC1BjX,KAAK0T,MAAM8L,SAASxf,KAAK0T,MAAMC,SAElC,CAEA,WAAAgO,GACC,MAAMG,EAAW9hB,KAAKoQ,QAAQiE,cAC7B,iCAEK0N,EAAY/hB,KAAKoQ,QAAQiE,cAC9B,kCAGGrU,KAAK0T,MAAMC,QACdmO,EAASnN,MAAMC,QAAU,OACzBmN,EAAUpN,MAAMC,QAAU,OAC1B5U,KAAKoQ,QAAQ+E,UAAUC,IAAI,6BAE3B0M,EAASnN,MAAMC,QAAU,OACzBmN,EAAUpN,MAAMC,QAAU,OAC1B5U,KAAKoQ,QAAQ+E,UAAUI,OAAO,2BAEhC,CAEA,YAAAqM,GACC,MAAMI,EAAgBhiB,KAAKoQ,QAAQiE,cAClC,6BAMD,GAJI2N,GACHA,EAAczM,SAGXvV,KAAK0T,MAAMiK,YAAc,IAAM3d,KAAK0T,MAAMC,OAAQ,CACrD,MAAMiJ,EAAQrO,SAASqD,cAAc,QACrCgL,EAAMvH,UAAY,2BAClBuH,EAAM/K,YACL7R,KAAK0T,MAAMiK,YAAc,EAAI,KAAO3d,KAAK0T,MAAMiK,YAChD3d,KAAKoQ,QAAQiE,cAAc,2BAA2BE,YAAYqI,EACnE,CACD,CAEA,IAAAlI,GACK1U,KAAKoQ,UACRpQ,KAAKoQ,QAAQuE,MAAMC,QAAU,QAE/B,CAEA,IAAAC,GACK7U,KAAKoQ,UACRpQ,KAAKoQ,QAAQuE,MAAMC,QAAU,OAE/B,CAEA,OAAAyB,GACKrW,KAAKwhB,cACRxhB,KAAKwhB,eAEFxhB,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,QAE3C,EC1HM,MAAM6R,EACZ,WAAAniB,CAAY4T,EAAOvT,EAAU,IAC5BH,KAAK0T,MAAQA,EACb1T,KAAKG,QAAUA,EACfH,KAAKoQ,QAAU,KACfpQ,KAAKwhB,aAAe,IACrB,CAEA,MAAAC,GAaC,OAZAzhB,KAAKoQ,QAAU7B,SAASqD,cAAc,OACtC5R,KAAKoQ,QAAQiF,UAAY,gBAEzBrV,KAAK0hB,iBACL1hB,KAAKwU,gBAELxU,KAAKwhB,aAAexhB,KAAK0T,MAAMsL,UAAWrgB,IAC5B,eAATA,GAAkC,sBAATA,GAC5BqB,KAAKkiB,qBAIAliB,KAAKoQ,OACb,CAEA,QAAA+R,GACC,MAAMC,EAAO,CACZ,CAAE1lB,GAAI,OAAQ6e,MAAO,OAAQ/c,KAAMwB,KAAKqiB,gBACxC,CACC3lB,GAAI,WACJ6e,MAAO,WACP/c,KAAMwB,KAAKsiB,mBACX1F,MAAO5c,KAAK0T,MAAMiK,cAgBpB,OAZI3d,KAAK0T,MAAM6K,YACd6D,EAAKte,KAAK,CAAEpH,GAAI,OAAQ6e,MAAO,OAAQ/c,KAAMwB,KAAKuiB,iBAG/CviB,KAAK0T,MAAM8K,iBACd4D,EAAKte,KAAK,CACTpH,GAAI,YACJ6e,MAAO,YACP/c,KAAMwB,KAAKwiB,sBAINJ,CACR,CAEA,cAAAV,GACC,MACMe,EADOziB,KAAKmiB,WAEhBtH,IAAK6H,IACL,MAAMC,EAAW3iB,KAAK0T,MAAMgK,cAAgBgF,EAAIhmB,GAC1CmlB,EACLa,EAAI9F,OAAS8F,EAAI9F,MAAQ,EACtB,qCAAqC8F,EAAI9F,MAAQ,EAAI,KAAO8F,EAAI9F,eAChE,GAEJ,MAAO,8CAC4B+F,EAAW,SAAW,iBAAiBD,EAAIhmB,oDAC1CgmB,EAAIlkB,4DACHkkB,EAAInH,2BACtCsG,iCAIHpP,KAAK,IAEPzS,KAAKoQ,QAAQ0B,UAAY2Q,CAC1B,CAEA,aAAAjO,GACCxU,KAAKoQ,QAAQ6G,iBAAiB,QAAUvM,IACvC,MAAMgY,EAAMhY,EAAEsD,OAAO8K,QAAQ,sBAC7B,GAAI4J,EAAK,CACR,MAAME,EAAQF,EAAI5G,QAAQ4G,IAC1B1iB,KAAK0T,MAAM2L,QAAQuD,EACpB,GAEF,CAEA,gBAAAV,GACcliB,KAAKoQ,QAAQ2K,iBAAiB,sBACtC5P,QAASuX,IACb,MAAMC,EAAWD,EAAI5G,QAAQ4G,MAAQ1iB,KAAK0T,MAAMgK,YAGhD,GAFAgF,EAAIvN,UAAU0N,OAAO,SAAUF,GAEP,aAApBD,EAAI5G,QAAQ4G,IAAoB,CACnC,MAAMV,EAAgBU,EAAIrO,cAAc,wBAGxC,GAFI2N,GAAeA,EAAczM,SAE7BvV,KAAK0T,MAAMiK,YAAc,EAAG,CAC/B,MAAMf,EAAQrO,SAASqD,cAAc,QACrCgL,EAAMvH,UAAY,sBAClBuH,EAAM/K,YACL7R,KAAK0T,MAAMiK,YAAc,EAAI,KAAO3d,KAAK0T,MAAMiK,YAChD+E,EAAInO,YAAYqI,EACjB,CACD,GAEF,CAEA,YAAAyF,GACC,MAAO,8dAGR,CAEA,gBAAAC,GACC,MAAO,6YAGR,CAEA,YAAAC,GACC,MAAO,qYAGR,CAEA,iBAAAC,GACC,MAAO,ybAGR,CAEA,OAAAnM,GACKrW,KAAKwhB,cACRxhB,KAAKwhB,eAEFxhB,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,QAE3C,ECrIM,MAAM0S,EACZ,WAAAhjB,CAAY4T,EAAOvT,EAAU,IAC5BH,KAAK0T,MAAQA,EACb1T,KAAKG,QAAU,CACd4S,SAAU5S,EAAQ4S,UAAY,kBAC3B5S,GAEJH,KAAKoQ,QAAU,KACfpQ,KAAK+iB,eAAiB,KACtB/iB,KAAKgjB,qBAAuB,KAC5BhjB,KAAKijB,aAAe,CAAA,EACpBjjB,KAAKwhB,aAAe,IACrB,CAEA,YAAA0B,CAAahmB,EAAMimB,GAClBnjB,KAAKijB,aAAa/lB,GAAQimB,CAC3B,CAEA,MAAA1B,GACCzhB,KAAKoQ,QAAU7B,SAASqD,cAAc,OACtC5R,KAAKoQ,QAAQiF,UAAY,mCAAmCrV,KAAKG,QAAQ4S,WAEzE/S,KAAKoQ,QAAQ0B,UAAY,wKAOzB9R,KAAK+iB,eAAiB,IAAId,EAAejiB,KAAK0T,MAAO1T,KAAKG,SAY1D,OAXqBH,KAAKoQ,QAAQiE,cAAc,wBACnCE,YAAYvU,KAAK+iB,eAAetB,UAE7CzhB,KAAKojB,qBAELpjB,KAAKwhB,aAAexhB,KAAK0T,MAAMsL,UAAWrgB,IAC5B,eAATA,GACHqB,KAAKojB,uBAIApjB,KAAKoQ,OACb,CAEA,kBAAAgT,GACC,MAAMC,EAAiBrjB,KAAKoQ,QAAQiE,cAAc,0BAE9CrU,KAAKgjB,sBAAwBhjB,KAAKgjB,qBAAqB3M,SAC1DrW,KAAKgjB,qBAAqB3M,UAG3BgN,EAAevR,UAAY,GAE3B,MAAMqR,EAAYnjB,KAAKijB,aAAajjB,KAAK0T,MAAMgK,aAC3CyF,GACHnjB,KAAKgjB,qBAAuB,IAAIG,EAAUnjB,KAAK0T,MAAO1T,KAAKG,SAC3DkjB,EAAe9O,YAAYvU,KAAKgjB,qBAAqBvB,WAErD4B,EAAevR,UAAY,mEACL9R,KAAK0T,MAAMgK,+BAGnC,CAEA,IAAAhJ,GACK1U,KAAKoQ,UACRpQ,KAAKoQ,QAAQuE,MAAMC,QAAU,QAC7BM,sBAAsB,KACrBlV,KAAKoQ,QAAQ+E,UAAUC,IAAI,UAG9B,CAEA,IAAAP,GACK7U,KAAKoQ,UACRpQ,KAAKoQ,QAAQ+E,UAAUI,OAAO,QAC9BpW,WAAW,KACNa,KAAKoQ,UACRpQ,KAAKoQ,QAAQuE,MAAMC,QAAU,SAE5B,KAEL,CAEA,SAAA0O,CAAUC,GACT,MAAMC,EAASxjB,KAAKoQ,QAAQiE,cAAc,2BACtCmP,IACHA,EAAO1R,UAAYyR,EAErB,CAEA,OAAAlN,GACKrW,KAAKwhB,cACRxhB,KAAKwhB,eAEFxhB,KAAK+iB,gBACR/iB,KAAK+iB,eAAe1M,UAEjBrW,KAAKgjB,sBAAwBhjB,KAAKgjB,qBAAqB3M,SAC1DrW,KAAKgjB,qBAAqB3M,UAEvBrW,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,QAE3C,EC1GM,MAAMqT,EACZ,WAAA3jB,CAAY4T,EAAOvT,EAAU,IAC5BH,KAAK0T,MAAQA,EACb1T,KAAKG,QAAUA,EACfH,KAAKoQ,QAAU,KACfpQ,KAAKwhB,aAAe,IACrB,CAEA,MAAAC,GAYC,OAXAzhB,KAAKoQ,QAAU7B,SAASqD,cAAc,OACtC5R,KAAKoQ,QAAQiF,UAAY,0CAEzBrV,KAAK0hB,iBAEL1hB,KAAKwhB,aAAexhB,KAAK0T,MAAMsL,UAAWrgB,IAC5B,oBAATA,GACHqB,KAAK0jB,yBAIA1jB,KAAKoQ,OACb,CAEA,cAAAsR,GACC,MAAMiC,EAAc3jB,KAAK4jB,qBAEzB5jB,KAAKoQ,QAAQ0B,UAAY,ssBAaT9R,KAAK0T,MAAMwK,8BACtByF,4JASL3jB,KAAK0jB,uBACL1jB,KAAKwU,eACN,CAEA,oBAAAkP,GACC,MAAMG,EAAqB7jB,KAAKoQ,QAAQiE,cACvC,6BAEK4J,EAAiBje,KAAK0T,MAAMuK,eAEJ,IAA1BA,EAAe/a,QAKnB2gB,EAAmB/R,UAAYmM,EAC7BpD,IAAKG,GAAShb,KAAK8jB,qBAAqB9I,IACxCvI,KAAK,IAEPzS,KAAK+jB,0BARJF,EAAmB/R,UAAY9R,KAAKgkB,mBAStC,CAEA,oBAAAF,CAAqB9I,GACpB,MAAMiJ,EACLjJ,EAAKkJ,MAAQlJ,EAAKkJ,KAAKhhB,OAAS,EAC7B,mDACA8X,EAAKkJ,KAAKrJ,IAAKsJ,GAAQ,qEAAqEA,YAAc1R,KAAK,oBAE/G,GAEE2R,EAAUpkB,KAAKsb,YAAYN,EAAKqJ,aAAerJ,EAAKK,MAE1D,MAAO,oEACqDL,EAAKte,iBAE9Dse,EAAKsJ,WACF,8EAEUtJ,EAAKsJ,oBAAoBtJ,EAAKre,6EAGxC,oEAGDsnB,sDACsCjJ,EAAKre,yBAC3Cqe,EAAKne,YAAc,8CAA8CmD,KAAKukB,cAAcvJ,EAAKne,YAAa,WAAa,4GAE3EunB,sYAQ9C,CAEA,kBAAAR,GACC,MAAMY,EAAUxkB,KAAK0T,MAAMyK,YAC3B,IAAKqG,GAA8B,IAAnBA,EAAQthB,OACvB,MAAO,8JAiBR,MAAO,mEAVashB,EAClBC,MAAM,EAAG,GACT5J,IAAK/c,GACiB,iBAAXA,GAAuBA,EAAOyO,WAAW,QAC5C,mDAAmDzO,gCAEpD,yCAAyCA,EAAO4mB,OAAO,GAAGC,uBAEjElS,KAAK,WAGR,CAEA,iBAAAuR,GACC,MAAO,sqBAWR,CAEA,WAAA1I,CAAYa,GACX,IAAKA,EAAY,MAAO,GAExB,OADa,IAAI3e,KAAK2e,GACVC,mBAAmB,QAAS,CACvCE,MAAO,QACPC,IAAK,UACLF,KAAM,WAER,CAEA,aAAAkI,CAAc5Z,EAAMia,GACnB,OAAKja,EACDA,EAAKzH,QAAU0hB,EAAkBja,EAC9BA,EAAKmD,UAAU,EAAG8W,GAAWnT,OAAS,MAF3B,EAGnB,CAEA,aAAA+C,GACCxU,KAAKoQ,QACHiE,cAAc,kBACd4C,iBAAiB,QAAS,KAC1BjX,KAAK0T,MAAM8L,SAAQ,KAGrBxf,KAAK+jB,wBACN,CAEA,sBAAAA,GACC/jB,KAAKoQ,QACH2K,iBAAiB,6BACjB5P,QAAS0Z,IACTA,EAAK5N,iBAAiB,QAAS,KAC9B,MAAM6N,EAAcD,EAAK/I,QAAQgJ,YAC3BC,EAAgB/kB,KAAK0T,MAAMuK,eAAe1a,KAC9CyhB,GAAMA,EAAEtoB,KAAOooB,GAEbC,GAAiBA,EAActmB,IAClC8H,OAAO0V,KAAK8I,EAActmB,IAAK,UACrBuB,KAAKG,QAAQ8kB,kBACvBjlB,KAAKG,QAAQ8kB,iBAAiBF,MAInC,CAEA,OAAA1O,GACKrW,KAAKwhB,cACRxhB,KAAKwhB,eAEFxhB,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,QAE3C,ECnMM,MAAM8U,EACZ,WAAAplB,CAAY4T,EAAOvT,EAAU,IAC5BH,KAAK0T,MAAQA,EACb1T,KAAKG,QAAUA,EACfH,KAAKoQ,QAAU,KACfpQ,KAAKwhB,aAAe,KACpBxhB,KAAKmlB,eAAiB,KACtBnlB,KAAKolB,WAAY,EACjBplB,KAAKqlB,iBAAmB,KACxBrlB,KAAKslB,uBAAwB,EAC7BtlB,KAAKulB,uBAAwB,EAC7BvlB,KAAKwlB,oBAAsB,EAC5B,CAEA,MAAA/D,GAkCC,OAjCAzhB,KAAKoQ,QAAU7B,SAASqD,cAAc,OACtC5R,KAAKoQ,QAAQiF,UAAY,qCAEzBrV,KAAK0hB,iBAEL1hB,KAAKwhB,aAAexhB,KAAK0T,MAAMsL,UAAU,CAACrgB,EAAM4B,KAErC,iBAAT5B,GACA4B,EAAK+C,iBAAmBtD,KAAK0T,MAAMkK,sBAEnC5d,KAAKylB,uBACLzlB,KAAK0lB,eAAenlB,EAAKa,SACzBpB,KAAK2lB,mBAEI,kBAAThnB,GACA4B,EAAK+C,iBAAmBtD,KAAK0T,MAAMkK,qBAEnC5d,KAAK4lB,qBAAqBrlB,EAAKslB,UAEtB,kBAATlnB,GACA4B,EAAK+C,iBAAmBtD,KAAK0T,MAAMkK,qBAEnC5d,KAAKylB,wBAEI,wBAAT9mB,GACA4B,EAAK+C,iBAAmBtD,KAAK0T,MAAMkK,sBAGhB,mBAATjf,GAA6B4B,EAAK+C,iBAAmBtD,KAAK0T,MAAMkK,uBAD1E5d,KAAK0hB,mBAMA1hB,KAAKoQ,OACb,CAEA,cAAAsR,GACC,MAAM5B,EAAe9f,KAAK0T,MAAMqN,wBAC1Bvd,EAAWxD,KAAK0T,MAAMsN,oBACtB8E,GAAqB9lB,KAAK0T,MAAMkK,qBAChCmI,GAAYD,GAA8C,WAAzBhG,GAAc1iB,OACrD4C,KAAKslB,sBAAwBS,EAE7B,MAAMC,EACe,IAApBxiB,EAASN,OACNlD,KAAKgkB,kBAAkB8B,GACvBtiB,EAASqX,IAAKoL,GAAQjmB,KAAKkmB,eAAeD,IAAMxT,KAAK,IAEnD0T,EAAanmB,KAAKomB,0BAA0BtG,GAC5CnjB,EAAQmpB,EACX,mBACAhG,GAAcnjB,OAAS,iBACpB4gB,EAAcuI,EACjB,+BACAC,EACC,sBACA,qBAEEM,EAAermB,KAAK0T,MAAMlM,aAAatK,MAAQ,GAErD8C,KAAKoQ,QAAQ0B,UAAY,sdAQpBqU,mDACmCxpB,+gBAUpCqpB,cACAD,EAAW,sLAKT,4QASHA,EAAW,GAAK,mYAQyCxI,+tCAmB0Cvd,KAAKsmB,YAAYD,smBAcvHrmB,KAAKqlB,iBAAmBrlB,KAAKoQ,QAAQiE,cACpC,+BAEDrU,KAAKwU,gBACLxU,KAAK2lB,kBACL3lB,KAAKumB,4BAGDvmB,KAAKulB,uBACRvlB,KAAKwmB,mBAEP,CAEA,iBAAAxC,CAAkB8B,GAAoB,GACrC,MAAMK,EAAanmB,KAAK4jB,qBAClBjF,EACL3e,KAAK0T,MAAMiL,cAAgB,0CACtB8H,EAAWzmB,KAAK0T,MAAM+K,aAE5B,MAAO,iGAEuC0H,wBACtCL,EAAoB,2BAA6B,wNAGZW,EAAW,gCAAkC,2DAC/EA,EAAW,mBAAqB9H,8CAI5C,CAEA,yBAAA+H,CAA0BjlB,GACzB,OAAKA,GAAsC,IAAvBA,EAAYyB,OACzBzB,EAAYoZ,IAAK8L,GACN,UAAbA,EAAIhoB,KACA,6CAA6CqB,KAAKsmB,YAAYK,EAAIloB,cAAcuB,KAAKsmB,YAAYK,EAAIzpB,MAAQ,uBAAuB8C,KAAKsmB,YAAYK,EAAIloB,WAE1J,2CAA2CuB,KAAKsmB,YAAYK,EAAIloB,mBAAmBuB,KAAKsmB,YAAYK,EAAIloB,oBAAoBuB,KAAKsmB,YAAYK,EAAIzpB,MAAQ,gEAEvJ8C,KAAKsmB,YAAYK,EAAIzpB,MAAQ,0GAGpCuV,KAAK,IAV6C,EAWtD,CAEA,cAAAyT,CAAe9kB,GACd,MAAMif,EAAQjf,EAAQif,MAChBuG,EAAevG,EAClB,wBACA,6BACGwG,EAAU7mB,KAAK8mB,mBAAmB1lB,EAAQgf,WAC1C2G,EAAkB/mB,KAAK0mB,0BAA0BtlB,EAAQK,aAEzDulB,EAAc5lB,EAAQnD,QAAU,0CAA0C+B,KAAKinB,sBAAsB7lB,EAAQnD,iBAAmB,GAEhIipB,EAAaF,EAAc,yCAAyCA,UAAsB,GAEhG,GAAI3G,EACH,MAAO,2CAC0BuG,kBAC7BM,gBACAH,oDACoCF,kCAMzC,MAAO,yCAC0BD,sDAFd5mB,KAAKmnB,oBAAoB/lB,EAAQgmB,mHAKThmB,EAAQgmB,QAAQlqB,MAAQ,8BAC9DgqB,gBACAH,oDACoCF,6CAI1C,CAEA,mBAAAM,CAAoBC,GACnB,GAAIA,GAAQC,UACX,MAAO,mDAAmDD,EAAOC,mBAAmBD,EAAOlqB,iBAG5F,MAAO,0CADUkqB,GAAQlqB,MAAQ,KAAKwnB,OAAO,GAAGC,qBAEjD,CAEA,yBAAAyB,CAA0BtG,GACzB,IAAKA,GAAcwH,cAAcpkB,OAChC,MAAO,gDAER,MAAMqkB,EAAIzH,EAAawH,aAAa,GACpC,OAAIC,EAAEF,UACE,mDAAmDE,EAAEF,mBAAmBE,EAAErqB,iBAE3E,0CAA0CqqB,EAAErqB,MAAQ,KAAKwnB,OAAO,GAAGC,qBAC3E,CAEA,kBAAAf,GACC,MAAMY,EAAUxkB,KAAK0T,MAAMyK,YAC3B,IAAKqG,GAA8B,IAAnBA,EAAQthB,OACvB,MAAO,2LAkBR,MAAO,uCAVashB,EAClBC,MAAM,EAAG,GACT5J,IAAK/c,GACiB,iBAAXA,GAAuBA,EAAOyO,WAAW,QAC5C,mDAAmDzO,gCAEpD,yCAAyCA,EAAO4mB,OAAO,GAAGC,uBAEjElS,KAAK,WAGR,CAEA,kBAAAqU,CAAmB1G,GAClB,IAAKA,EAAW,MAAO,GAEvB,OADa,IAAI5iB,KAAK4iB,GACVoH,mBAAmB,QAAS,CACvCC,KAAM,UACNC,OAAQ,UACRC,QAAQ,GAEV,CAEA,qBAAAV,CAAsBhpB,GACrB,OAAKA,EACEA,EACL4Q,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,MAAO,QALI,EAMtB,CAEA,cAAA6W,CAAetkB,GACd,MAAMwmB,EAAoB5nB,KAAKoQ,QAAQiE,cACtC,4BAEKwT,EAAaD,EAAkBvT,cAAc,yBAC/CwT,GACHA,EAAWtS,SAGZ,MAAMuS,EAAc9nB,KAAKkmB,eAAe9kB,GAClC2mB,EAAUxZ,SAASqD,cAAc,OACvCmW,EAAQjW,UAAYgW,EACpBF,EAAkBrT,YAAYwT,EAAQC,kBACvC,CAEA,eAAArC,GACC,MAAMiC,EAAoB5nB,KAAKoQ,QAAQiE,cACtC,4BAEGuT,GACHzoB,WAAW,KACVyoB,EAAkBK,UAAYL,EAAkBM,cAC9C,GAEL,CAEA,sBAAAC,GACC,MAAM3K,EAAQxd,KAAKoQ,QAAQiE,cAAc,4BACnC+T,EAAUpoB,KAAKoQ,QAAQiE,cAAc,2BACvCmJ,GAAS4K,IACZA,EAAQtQ,UAAY0F,EAAMrX,MAAMsL,QAA8C,IAApCzR,KAAKwlB,oBAAoBtiB,OAErE,CAEA,yBAAAqjB,GACC,MAAMzT,EAAY9S,KAAKoQ,QAAQiE,cAAc,0CAC7C,GAAKvB,EAAL,CAEA,GAAwC,IAApC9S,KAAKwlB,oBAAoBtiB,OAG5B,OAFA4P,EAAUhB,UAAY,QACtBgB,EAAU6B,MAAMC,QAAU,QAI3B9B,EAAU6B,MAAMC,QAAU,OAC1B9B,EAAUhB,UAAY9R,KAAKwlB,oBAAoB3K,IAAI,CAAC8L,EAAK5X,IAKjD,mEACkDA,kBALzC4X,EAAIhoB,KAAK4N,WAAW,SAEjC,gDAAgDoa,EAAI0B,iBAAiBroB,KAAKsmB,YAAYK,EAAIta,KAAKnP,YAC/F,gLAIyD6R,mEAG1D0D,KAAK,IAGRK,EAAUiI,iBAAiB,gCAAgC5P,QAASmd,IACnEA,EAAIrR,iBAAiB,QAAUvM,IAC9B,MAAM6d,EAAM1M,SAASnR,EAAE8d,cAAc1M,QAAQ5O,MAAO,IACpDlN,KAAKwlB,oBAAoBpY,OAAOmb,EAAK,GACrCvoB,KAAKumB,4BACLvmB,KAAKmoB,4BA5BS,CA+BjB,CAEA,aAAA3T,GACCxU,KAAKoQ,QACHiE,cAAc,uBACd4C,iBAAiB,QAAS,KAC1BjX,KAAK0T,MAAM2L,QAAQ,cAGrBrf,KAAKoQ,QACHiE,cAAc,kBACd4C,iBAAiB,QAAS,KAC1BjX,KAAK0T,MAAM8L,SAAQ,KAIrB,MAAMhC,EAAQxd,KAAKoQ,QAAQiE,cAAc,4BACnC+T,EAAUpoB,KAAKoQ,QAAQiE,cAAc,2BAEvCmJ,GAAS4K,IACZ5K,EAAMvG,iBAAiB,QAAS,KAE/BuG,EAAM7I,MAAMhF,OAAS,OACrB6N,EAAM7I,MAAMhF,OAAS/B,KAAK6a,IAAIjL,EAAM0K,aAAc,KAAO,KAGzDloB,KAAKmoB,yBAGD3K,EAAMrX,MAAMsL,QACfzR,KAAK0oB,iBAIPlL,EAAMvG,iBAAiB,UAAYvM,IACpB,UAAVA,EAAEP,KAAoBO,EAAEie,WAC3Bje,EAAEgN,iBACF1X,KAAK4oB,kBAIPR,EAAQnR,iBAAiB,QAAS,KACjCjX,KAAK4oB,kBAKP,MAAMC,EAAY7oB,KAAKoQ,QAAQiE,cAAc,6BACvCyU,EAAY9oB,KAAKoQ,QAAQiE,cAAc,iCAEzCwU,GAAaC,IAChBD,EAAU5R,iBAAiB,QAAS,KACnC6R,EAAUC,UAGXD,EAAU7R,iBAAiB,SAAWvM,IACrC,MAAMse,EAAQte,EAAEsD,OAAOgb,MAClBA,IACL5a,MAAM6a,KAAKD,GAAO7d,QAASkB,IAC1B,MAAM6c,EAAS,IAAIC,WACnBD,EAAOE,OAAUC,IAChBrpB,KAAKwlB,oBAAoB1hB,KAAK,CAC7BuI,OACAgc,QAASgB,EAAGrb,OAAOE,OACnBvP,KAAM0N,EAAK1N,OAEZqB,KAAKumB,4BACLvmB,KAAKmoB,0BAENe,EAAOI,cAAcjd,KAEtByc,EAAU3iB,MAAQ,OAKpB,MAAMojB,EAAavpB,KAAKoQ,QAAQiE,cAAc,0BACxCmV,EAAcxpB,KAAKoQ,QAAQiE,cAAc,2BACzCoV,EAAYzpB,KAAKoQ,QAAQiE,cAAc,yBAEzCkV,IACHA,EAAWtS,iBAAiB,QAAS,KACpC,MAAMyS,EAAU1pB,KAAK2pB,cAAcJ,EAAWpjB,MAAMsL,QACpD+X,EAAY1R,UAAY4R,IAGzBH,EAAWtS,iBAAiB,UAAYvM,IACzB,UAAVA,EAAEP,KAAoBqf,EAAY1R,WACrCpN,EAAEgN,iBACF1X,KAAK4pB,yBAKJJ,GACHA,EAAYvS,iBAAiB,QAAS,KACrCjX,KAAK4pB,uBAIHH,GACHA,EAAUxS,iBAAiB,QAAS,KACnCjX,KAAK6pB,sBAKP,MAAMjC,EAAoB5nB,KAAKoQ,QAAQiE,cAAc,4BACjDuT,GACHA,EAAkB3Q,iBAAiB,QAAUvM,IAE5C,MAAMof,EAAWpf,EAAEsD,OAAO8K,QAAQ,2BAClC,GAAIgR,EAAU,CACbpf,EAAEgN,iBACF,MAAMjZ,EAAMqrB,EAAShO,QAAQrd,IACvBvB,EAAO4sB,EAAShO,QAAQ5e,KAE9B,YADA8C,KAAK+pB,cAActrB,EAAKvB,EAEzB,CAGA,MAAM8sB,EAAMtf,EAAEsD,OAAO8K,QAAQ,4BAC7B,GAAIkR,EAAK,CACR,MAAMvrB,EAAMurB,EAAIlO,QAAQrd,KAAOurB,EAAIC,IACnC1jB,OAAO0V,KAAKxd,EAAK,SAClB,GAGH,CAEA,mBAAMsrB,CAActrB,EAAKvB,GACxB,IACC,MAAMsI,QAAiB8E,MAAM7L,GACvByrB,QAAa1kB,EAAS0kB,OACtBC,EAAUC,IAAIC,gBAAgBH,GAC9BI,EAAI/b,SAASqD,cAAc,KACjC0Y,EAAE7jB,KAAO0jB,EACTG,EAAEC,SAAWrtB,GAAQ,WACrBotB,EAAE3V,MAAMC,QAAU,OAClBrG,SAAS7M,KAAK6S,YAAY+V,GAC1BA,EAAEvB,QACFxa,SAAS7M,KAAKgU,YAAY4U,GAC1BF,IAAII,gBAAgBL,EACrB,CAAE,MAED5jB,OAAO0V,KAAKxd,EAAK,SAClB,CACD,CAEA,WAAA6nB,CAAY3b,GACX,OAAKA,EACEA,EAAKkE,QAAQ,KAAM,SAASA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,UAD3E,EAEnB,CAEA,aAAA8a,CAAcllB,GACb,MAAO,6BAA6B9E,KAAK8E,EAC1C,CAEA,iBAAA+hB,GACC,MAAMiE,EAAUzqB,KAAKoQ,QAAQiE,cAAc,4BAC3C,GAAIoW,EAAS,CACZA,EAAQ9V,MAAMC,QAAU,OACxB,MAAM2U,EAAakB,EAAQpW,cAAc,0BACrCkV,GACHpqB,WAAW,IAAMoqB,EAAW/R,QAAS,IAEvC,CACD,CAEA,yBAAAkT,GACK1qB,KAAK2qB,iBAAmB3qB,KAAKG,QAAQyqB,sBACxC5qB,KAAKG,QAAQyqB,oBAAoB5qB,KAAK2qB,gBAAiB3qB,KAAK6qB,4BAA8B,IAC1F7qB,KAAK2qB,gBAAkB,KACvB3qB,KAAK6qB,2BAA6B,KAEpC,CAEA,iBAAAhB,GACC7pB,KAAKulB,uBAAwB,EAC7B,MAAMkF,EAAUzqB,KAAKoQ,QAAQiE,cAAc,4BACvCoW,IACHA,EAAQ9V,MAAMC,QAAU,OAE1B,CAEA,wBAAMgV,GACL,MAAMkB,EAAY9qB,KAAKoQ,QAAQiE,cAAc,yBACvCkV,EAAavpB,KAAKoQ,QAAQiE,cAAc,0BACxCwD,EAAY7X,KAAKoQ,QAAQiE,cAAc,2BAEvCnX,EAAO4tB,GAAW3kB,MAAMsL,QAAU,GAClChN,EAAQ8kB,GAAYpjB,MAAMsL,OAEhC,GAAKhN,GAAUzE,KAAK2pB,cAAcllB,GAAlC,CAEAoT,EAAUC,UAAW,EACrBD,EAAUhG,YAAc,YAExB,IACK7R,KAAKG,QAAQ4qB,yBACV/qB,KAAKG,QAAQ4qB,kBAAkB,CAAE7tB,OAAMuH,UAGzCzE,KAAK0T,MAAMlM,cACfxH,KAAK0T,MAAMlM,YAAc,CAAA,GAE1BxH,KAAK0T,MAAMlM,YAAYtK,KAAOA,EAC9B8C,KAAK0T,MAAMlM,YAAY/C,MAAQA,EAE/BzE,KAAK6pB,oBACL7pB,KAAK0qB,2BACN,CAAE,MAAOthB,GACR2C,QAAQ3C,MAAM,mCAAoCA,GAClDyO,EAAUC,UAAW,EACrBD,EAAUhG,YAAc,cACzB,CAtB0C,CAuB3C,CAEA,kBAAM+W,GACL,GAAI5oB,KAAKslB,sBAAuB,OAChC,MAAM9H,EAAQxd,KAAKoQ,QAAQiE,cAAc,4BACnCpW,EAAUuf,EAAMrX,MAAMsL,OACtBuZ,EAAiBhrB,KAAKwlB,oBAAoBtiB,OAAS,EAEzD,IAAKjF,IAAY+sB,EAAgB,OAEjChrB,KAAKirB,cAGL,MAAMC,EAAoB,IAAIlrB,KAAKwlB,qBAE7BM,GAAqB9lB,KAAK0T,MAAMkK,qBAChCuN,GAAoBnrB,KAAK0T,MAAMlM,aAAa/C,MAElD,GAAIqhB,EAAmB,CAEtB,MAAMsF,EAAe,CACpB1uB,GAAI,OAASc,KAAKC,MAClBQ,QAASA,EACToiB,OAAO,EACPD,WAAW,IAAI5iB,MAAOE,cACtB+D,YAAaypB,EAAkBrQ,IAAKyP,IAAC,CACpC7rB,IAAK6rB,EAAEjC,QACP1pB,KAAM2rB,EAAE3rB,KAAK4N,WAAW,SAAW,QAAU,OAC7CrP,KAAMotB,EAAEje,KAAKnP,SAGf8C,KAAK0lB,eAAe0F,GACpBprB,KAAK2lB,kBAEDwF,GACHnrB,KAAK2qB,gBAAkB1sB,EACvB+B,KAAK6qB,2BAA6BK,EAClClrB,KAAKulB,uBAAwB,EAC7BpmB,WAAW,IAAMa,KAAKwmB,oBAAqB,MAEvCxmB,KAAKG,QAAQyqB,qBAChB5qB,KAAKG,QAAQyqB,oBAAoB3sB,EAASitB,EAG7C,KAAO,CACN,MAAM9pB,EAAU,CACf1E,GAAI,OAASc,KAAKC,MAClBQ,QAASA,EACToiB,OAAO,EACPD,WAAW,IAAI5iB,MAAOE,cACtB+D,YAAaypB,EAAkBrQ,IAAKyP,IAAC,CACpC7rB,IAAK6rB,EAAEjC,QACP1pB,KAAM2rB,EAAE3rB,KAAK4N,WAAW,SAAW,QAAU,OAC7CrP,KAAMotB,EAAEje,KAAKnP,SAIf8C,KAAK0T,MAAMsM,WAAWhgB,KAAK0T,MAAMkK,qBAAsBxc,GAEnDpB,KAAKG,QAAQkrB,eAChBrrB,KAAKG,QAAQkrB,cAAcrrB,KAAK0T,MAAMkK,qBAAsBxc,EAAS8pB,EAEvE,CAGA1N,EAAMrX,MAAQ,GACdqX,EAAM7I,MAAMhF,OAAS,OACrB3P,KAAKwlB,oBAAsB,GAC3BxlB,KAAKumB,4BACLvmB,KAAKmoB,wBACN,CAEA,YAAAO,GACK1oB,KAAKslB,yBACJtlB,KAAKolB,WAAaplB,KAAK0T,MAAMkK,uBACjC5d,KAAKolB,WAAY,EACbplB,KAAKG,QAAQmrB,UAChBtrB,KAAKG,QAAQmrB,SAAStrB,KAAK0T,MAAMkK,sBAAsB,IAIrD5d,KAAKmlB,gBACRxW,aAAa3O,KAAKmlB,gBAEnBnlB,KAAKmlB,eAAiBhmB,WAAW,KAChCa,KAAKirB,eACH,KACJ,CAEA,WAAAA,GACKjrB,KAAKolB,WAAaplB,KAAK0T,MAAMkK,uBAChC5d,KAAKolB,WAAY,EACbplB,KAAKG,QAAQmrB,UAChBtrB,KAAKG,QAAQmrB,SAAStrB,KAAK0T,MAAMkK,sBAAsB,IAGrD5d,KAAKmlB,iBACRxW,aAAa3O,KAAKmlB,gBAClBnlB,KAAKmlB,eAAiB,KAExB,CAEA,oBAAAS,CAAqBC,GACpB,GAAI7lB,KAAKqlB,iBAAkB,CAC1BrlB,KAAKqlB,iBAAiB1Q,MAAMC,QAAU,OACtC,MAAMoE,EAAShZ,KAAKqlB,iBAAiBhR,cACpC,0BAEG2E,IACHA,EAAOnH,YAAc,GAAGgU,GAAY,0BAErC7lB,KAAK2lB,iBACN,CACD,CAEA,oBAAAF,GACKzlB,KAAKqlB,mBACRrlB,KAAKqlB,iBAAiB1Q,MAAMC,QAAU,OAExC,CAEA,OAAAyB,GACKrW,KAAKwhB,cACRxhB,KAAKwhB,eAEFxhB,KAAKmlB,gBACRxW,aAAa3O,KAAKmlB,gBAEnBnlB,KAAKirB,cACDjrB,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,QAE3C,ECrsBM,MAAMmb,EACZ,WAAAzrB,CAAY4T,EAAOvT,EAAU,IAC5BH,KAAK0T,MAAQA,EACb1T,KAAKG,QAAUA,EACfH,KAAKoQ,QAAU,KACfpQ,KAAKwhB,aAAe,IACrB,CAEA,MAAAC,GAkBC,OAjBAzhB,KAAKoQ,QAAU7B,SAASqD,cAAc,OACtC5R,KAAKoQ,QAAQiF,UAAY,8CAEzBrV,KAAK0hB,iBACL1hB,KAAKwU,gBAELxU,KAAKwhB,aAAexhB,KAAK0T,MAAMsL,UAAWrgB,IAE/B,wBAATA,GACS,sBAATA,GACS,qBAATA,GACS,wBAATA,GAEAqB,KAAK0hB,mBAIA1hB,KAAKoQ,OACb,CAEA,cAAAsR,GACC,MAAM7D,EAAgB7d,KAAK0T,MAAMmK,cAC3B8F,EAAc3jB,KAAKwrB,qBAEzB,IAAIC,EAEHA,EAD4B,IAAzB5N,EAAc3a,OACG,6pBAYA,mEAEhB2a,EAAchD,IAAKoF,GAASjgB,KAAK0rB,wBAAwBzL,IAAOxN,KAAK,8BAK1EzS,KAAKoQ,QAAQ0B,UAAY,skBAWrB2Z,mLAK4C9H,8YAShD3jB,KAAKwU,eACN,CAEA,uBAAAkX,CAAwB5L,GACvB,MAAM6L,EAAc7L,EAAaliB,OAAS,EAAI,SAAW,GACnDguB,EAAU5rB,KAAK6rB,eAAe/L,EAAaK,iBAC3CwD,EAAc3jB,KAAK8rB,2BACxBhM,EAAawH,cAGd,MAAO,mDACoCqE,4BAAsC7L,EAAapjB,yEAEzFinB,0LAI4C7D,EAAanjB,OAAS,kFACvBivB,mGAG1C9L,EAAaliB,OAAS,EAAI,6CAA+C,gEAC5BoC,KAAK+rB,iBAAiBjM,EAAaI,2EAKvF,CAEA,0BAAA4L,CAA2BxE,GAC1B,IAAKA,GAAwC,IAAxBA,EAAapkB,OACjC,MAAO,gDAGR,MAAMqkB,EAAID,EAAa,GACvB,OAAIC,EAAEF,UACE,mDAAmDE,EAAEF,mBAAmBE,EAAErqB,iBAE3E,0CAA0CqqB,EAAErqB,MAAQ,KAAKwnB,OAAO,GAAGC,qBAC3E,CAEA,kBAAA6G,GACC,MAAMhH,EAAUxkB,KAAK0T,MAAMyK,YAC3B,IAAKqG,GAA8B,IAAnBA,EAAQthB,OACvB,MAAO,2LAkBR,MAAO,uCAVashB,EAClBC,MAAM,EAAG,GACT5J,IAAK/c,GACiB,iBAAXA,GAAuBA,EAAOyO,WAAW,QAC5C,mDAAmDzO,gCAEpD,yCAAyCA,EAAO4mB,OAAO,GAAGC,uBAEjElS,KAAK,WAGR,CAEA,cAAAoZ,CAAezL,GACd,IAAKA,EAAW,MAAO,GACvB,MAAM/E,EAAO,IAAI7d,KAAK4iB,GAEhB4L,EADM,IAAIxuB,KACK6d,EACf4Q,EAAWre,KAAKoB,MAAMgd,EAAS,KAC/BE,EAAYte,KAAKoB,MAAMgd,EAAS,MAChCG,EAAWve,KAAKoB,MAAMgd,EAAS,OAErC,OAAIC,EAAW,EAAU,MACrBA,EAAW,GAAW,GAAGA,KACzBC,EAAY,GAAW,GAAGA,KAC1BC,EAAW,EAAU,GAAGA,KACrB9Q,EAAKe,mBAAmB,QAAS,CAAEE,MAAO,QAASC,IAAK,WAChE,CAEA,gBAAAwP,CAAiB3qB,GAChB,IAAKA,EAAS,MAAO,kBAErB,OAAIA,EAAQ8B,QADM,GACsB9B,EACjCA,EAAQ0M,UAAU,EAFP,IAEuB,KAC1C,CAEA,aAAA0G,GACC,MAAM4X,EAAWpsB,KAAKoQ,QAAQiE,cAAc,kBACxC+X,GACHA,EAASnV,iBAAiB,QAAS,KAClCjX,KAAK0T,MAAM8L,SAAQ,KAIrBxf,KAAKoQ,QACH2K,iBAAiB,gCACjB5P,QAAS6P,IACTA,EAAK/D,iBAAiB,QAAS,KAC9B,MAAMoV,EAASrR,EAAKc,QAAQxY,eAC5BtD,KAAK0T,MAAM+L,sBAAsB4M,GACjCrsB,KAAK0T,MAAM8M,WAAW6L,GACtBrsB,KAAK0T,MAAM2L,QAAQ,QAEfrf,KAAKG,QAAQmsB,sBAChBtsB,KAAKG,QAAQmsB,qBAAqBD,OAKtC,MAAME,EAAYvsB,KAAKoQ,QAAQiE,cAAc,8BACzCkY,GACHA,EAAUtV,iBAAiB,QAAS,KACnCjX,KAAKwsB,yBAGR,CAEA,qBAAAA,GAEC,MAAMC,EAAmBzsB,KAAK0T,MAAMmK,cAActa,KAChDrB,GAAmB,SAAbA,EAAE9E,QAGNqvB,GACHzsB,KAAK0T,MAAM+L,sBAAsBgN,EAAiB/vB,IAClDsD,KAAK0T,MAAM8M,WAAWiM,EAAiB/vB,IACvCsD,KAAK0T,MAAM2L,QAAQ,QACfrf,KAAKG,QAAQmsB,sBAChBtsB,KAAKG,QAAQmsB,qBAAqBG,EAAiB/vB,MAGpDsD,KAAK0T,MAAM+L,sBAAsB,MAC7Bzf,KAAKG,QAAQusB,uBAChB1sB,KAAKG,QAAQusB,yBAEb1sB,KAAK0T,MAAM2L,QAAQ,QAGtB,CAEA,OAAAhJ,GACKrW,KAAKwhB,cACRxhB,KAAKwhB,eAEFxhB,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,QAE3C,ECpOM,MAAMuc,EACZ,WAAA7sB,CAAY4T,EAAOvT,EAAU,IAC5BH,KAAK0T,MAAQA,EACb1T,KAAKG,QAAUA,EACfH,KAAKoQ,QAAU,KACfpQ,KAAKwhB,aAAe,IACrB,CAEA,MAAAC,GAYC,OAXAzhB,KAAKoQ,QAAU7B,SAASqD,cAAc,OACtC5R,KAAKoQ,QAAQiF,UAAY,qCAEzBrV,KAAK0hB,iBAEL1hB,KAAKwhB,aAAexhB,KAAK0T,MAAMsL,UAAWrgB,IAC5B,uBAATA,GAA0C,qBAATA,GACpCqB,KAAK4sB,2BAIA5sB,KAAKoQ,OACb,CAEA,cAAAsR,GACC,MAAMmL,EAAc7sB,KAAK0T,MAAMqK,iBAAmB,GAE5C+O,GADc9sB,KAAK0T,MAAMoK,cAAgB,IACX5a,OAEpClD,KAAKoQ,QAAQ0B,UAAY,mwBAgBZ+a,qfAURC,4GAML9sB,KAAK4sB,yBACL5sB,KAAKwU,eACN,CAEA,sBAAAoY,GACC,MAAMG,EAAuB/sB,KAAKoQ,QAAQiE,cACzC,+BAEK2Y,EAAchtB,KAAK0T,MAAMoK,cAAgB,GACzC+O,GAAe7sB,KAAK0T,MAAMqK,iBAAmB,IAAI5b,cAEjD8qB,EAAsBJ,EACzBG,EAAY/qB,OACXC,GACAA,EAAEvF,MAAMwF,cAAcvC,SAASitB,IAC9B3qB,EAAErF,aAAeqF,EAAErF,YAAYsF,cAAcvC,SAASitB,IAExDG,EAEGE,EAAWltB,KAAKoQ,QAAQiE,cAC7B,sCAEG6Y,IACHA,EAASrb,YAAc,GAAGob,EAAoB/pB,sBAGZ,IAA/B+pB,EAAoB/pB,QAKxB6pB,EAAqBjb,UAAYmb,EAC/BpS,IAAKsS,GAAentB,KAAKotB,sBAAsBD,IAC/C1a,KAAK,IAEPzS,KAAKqtB,2BARJN,EAAqBjb,UAAY9R,KAAKgkB,mBASxC,CAEA,qBAAAoJ,CAAsBD,GACrB,MAAM5uB,EAAe4uB,EAAW5uB,cAAgB,EAChD,MAAO,sEACuD4uB,EAAWzwB,wHAExBywB,EAAWxwB,mEACbwwB,EAAWtwB,aAAe,mEACtB0B,kXAOpD,CAEA,iBAAAylB,GAGC,OAFoBhkB,KAAK0T,MAAMqK,gBAGvB,6hBAaD,knBAWR,CAEA,aAAAvJ,GACCxU,KAAKoQ,QACHiE,cAAc,kBACd4C,iBAAiB,QAAS,KAC1BjX,KAAK0T,MAAM8L,SAAQ,KAMrB,IAAI8N,EAHgBttB,KAAKoQ,QAAQiE,cAChC,gCAGW4C,iBAAiB,QAAUvM,IACtCiE,aAAa2e,GACbA,EAAgBnuB,WAAW,KAC1Ba,KAAK0T,MAAMiN,mBAAmBjW,EAAEsD,OAAO7H,QACrC,OAGJnG,KAAKqtB,yBACN,CAEA,uBAAAA,GACCrtB,KAAKoQ,QACH2K,iBAAiB,8BACjB5P,QAAS6P,IACTA,EAAK/D,iBAAiB,QAAS,KAC9B,MAAMsW,EAAevS,EAAKc,QAAQyR,aAC5BJ,EAAantB,KAAK0T,MAAMoK,aAAava,KACzCrB,GAAMA,EAAExF,KAAO6wB,GAEbJ,GAAcA,EAAW1uB,IAC5B8H,OAAO0V,KAAKkR,EAAW1uB,IAAK,UAClBuB,KAAKG,QAAQqtB,gBACvBxtB,KAAKG,QAAQqtB,eAAeL,MAIjC,CAEA,OAAA9W,GACKrW,KAAKwhB,cACRxhB,KAAKwhB,eAEFxhB,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,QAE3C,EC9LM,MAAMqd,EACZ,WAAA3tB,CAAY4T,EAAOvT,EAAU,IAC5BH,KAAK0T,MAAQA,EACb1T,KAAKG,QAAUA,EACfH,KAAKoQ,QAAU,KACfpQ,KAAKwhB,aAAe,IACrB,CAEA,MAAAC,GAgBC,OAfAzhB,KAAKoQ,QAAU7B,SAASqD,cAAc,OACtC5R,KAAKoQ,QAAQiF,UAAY,qCAEzBrV,KAAK0hB,iBAEL1hB,KAAKwhB,aAAexhB,KAAK0T,MAAMsL,UAAWrgB,IAE/B,wBAATA,GACS,wBAATA,GACS,uBAATA,GAEAqB,KAAK0hB,mBAIA1hB,KAAKoQ,OACb,CAEA,cAAAsR,GACC,MAAMiC,EAAc3jB,KAAKwrB,qBACnBkC,EAAsB1tB,KAAK2tB,yBAEjC3tB,KAAKoQ,QAAQ0B,UAAY,0JAInB9R,KAAKG,QAAQytB,QAAU,aAAa5tB,KAAKG,QAAQytB,iBAAiB5tB,KAAK0T,MAAMwK,eAAiB,uEAE3DyF,inBASE3jB,KAAK0T,MAAM0K,oCACjDpe,KAAK6tB,iHAKN7tB,KAAK8tB,qCAEL9tB,KAAK+tB,oCAELL,wBAIJ1tB,KAAKwU,eACN,CAEA,kBAAAgX,GACC,MAAMhH,EAAUxkB,KAAK0T,MAAMyK,YAC3B,IAAKqG,GAA8B,IAAnBA,EAAQthB,OACvB,MAAO,2LAkBR,MAAO,uCAVashB,EAClBC,MAAM,EAAG,GACT5J,IAAK/c,GACiB,iBAAXA,GAAuBA,EAAOyO,WAAW,QAC5C,mDAAmDzO,gCAEpD,yCAAyCA,EAAO4mB,OAAO,GAAGC,uBAEjElS,KAAK,WAGR,CAEA,yBAAAob,GACC,MAAMpH,EAAWzmB,KAAK0T,MAAM+K,aACtBE,EACL3e,KAAK0T,MAAMiL,cAAgB,0CAE5B,OAAI8H,EACI,sPAQD,8LAGuC9H,8BAG/C,CAEA,oBAAAmP,GACC,MAAMrB,EAAmBzsB,KAAK0T,MAAMmK,cAActa,KAChDrB,GAAmB,SAAbA,EAAE9E,QAGV,GAAIqvB,EAAkB,CACrB,MAAMpE,EAAUoE,EAAiBvM,YAC7BuM,EAAiBvM,YAAYhd,OAAS,GACtCupB,EAAiBvM,YAAYpS,UAAU,EAAG,IAAM,MAChD2e,EAAiBvM,YAClB,6BAEH,MAAO,0GACyFuM,EAAiB/vB,+MAG9D2rB,oGAKpD,CAEA,MAAO,+JAMR,CAEA,mBAAA0F,GACC,IAAK/tB,KAAKG,QAAQ6tB,gBACjB,MAAO,GAGR,MAAMrxB,MAAEA,EAAKE,YAAEA,EAAWue,SAAEA,EAAQ6S,OAAEA,GACrCjuB,KAAKG,QAAQ6tB,gBAEd,MAAO,0DAEH5S,EAAW,aAAaA,WAAkBze,mFAAyF,4EAE9HA,wBACDE,kCAEJoxB,EAAS,oFAAoFA,EAAOtvB,qBAAqBsvB,EAAO9nB,UAAU8nB,EAAO1S,iBAAmB,wBAGzK,CAEA,sBAAAoS,GACC,MAAM1P,EAAiBje,KAAK0T,MAAMsK,mBAClC,GAA8B,IAA1BC,EAAe/a,OAClB,MAAO,GA0BR,MAAO,mEAvBe+a,EACpBpD,IACCG,GAAS,yEACqDA,EAAKte,iBAEnEse,EAAKsJ,WACF,mFAEUtJ,EAAKsJ,oBAAoBtJ,EAAKre,+DACxCqe,EAAKkT,UAAY,qDAAqDlT,EAAKkT,mBAAqB,iCAGhG,8HAG+ClT,EAAKre,uEACPqe,EAAKne,aAAe,8CAKrE4V,KAAK,yBAOR,CAEA,WAAA6I,CAAYa,GACX,IAAKA,EAAY,MAAO,GACxB,MAAMd,EAAO,IAAI7d,KAAK2e,GAChB1e,EAAM,IAAID,KACV2uB,EAAWve,KAAKoB,OAAOvR,EAAM4d,GAAI,OAEvC,OAAiB,IAAb8Q,EAAuB,QACV,IAAbA,EAAuB,YACvBA,EAAW,EAAU,GAAGA,SACrB9Q,EAAKe,mBAAmB,QAAS,CAAEE,MAAO,QAASC,IAAK,WAChE,CAEA,aAAA/H,GACCxU,KAAKoQ,QACHiE,cAAc,kBACd4C,iBAAiB,QAAS,KAC1BjX,KAAK0T,MAAM8L,SAAQ,KAIrB,MAAM2O,EAASnuB,KAAKoQ,QAAQiE,cAAc,+BACtC8Z,GACHA,EAAOlX,iBAAiB,QAAS,KAChC,MAAMoV,EAAS8B,EAAOrS,QAAQxY,eAC1B+oB,GAEHrsB,KAAK0T,MAAM+L,sBAAsB4M,GACjCrsB,KAAK0T,MAAM2L,QAAQ,QACfrf,KAAKG,QAAQmsB,sBAChBtsB,KAAKG,QAAQmsB,qBAAqBD,KAInCrsB,KAAK0T,MAAM+L,sBAAsB,MACjCzf,KAAK0T,MAAM2L,QAAQ,WAKtBrf,KAAKoQ,QACH2K,iBAAiB,kCACjB5P,QAAS6P,IACTA,EAAK/D,iBAAiB,QAAS,KAC9BjX,KAAK0T,MAAM2L,QAAQ,iBAItB,MAAM+O,EAAYpuB,KAAKoQ,QAAQiE,cAC9B,iCAEG+Z,GACHA,EAAUnX,iBAAiB,QAAS,KACnCjX,KAAK0T,MAAM2L,QAAQ,eAIrB,MAAMgP,EAAcruB,KAAKoQ,QAAQiE,cAChC,gCAEGga,GACHA,EAAYpX,iBAAiB,QAAS,KACrC,MAAMgX,EAASI,EAAYvS,QAAQmS,OAC7B9nB,EAAQkoB,EAAYvS,QAAQ3V,MACnB,QAAX8nB,EACH1nB,OAAO0V,KAAK9V,EAAO,UACE,SAAX8nB,GACVjuB,KAAK0T,MAAM2L,QAAQlZ,IAIvB,CAEA,OAAAkQ,GACKrW,KAAKwhB,cACRxhB,KAAKwhB,eAEFxhB,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,QAE3C,ECnRM,MAAMke,EACZ,WAAAxuB,CAAY4T,EAAOvT,EAAU,IAC5BH,KAAK0T,MAAQA,EACb1T,KAAKG,QAAUA,EACfH,KAAKoQ,QAAU,KACfpQ,KAAKuuB,eAAgB,CACtB,CAEA,MAAA9M,GAMC,OALAzhB,KAAKoQ,QAAU7B,SAASqD,cAAc,OACtC5R,KAAKoQ,QAAQiF,UAAY,wCAEzBrV,KAAK0hB,iBAEE1hB,KAAKoQ,OACb,CAEA,cAAAsR,GACC,MAAM2E,EAAermB,KAAK0T,MAAMlM,aAAatK,MAAQ,GAC/CsxB,EAAgBxuB,KAAK0T,MAAMlM,aAAa/C,OAAS,GAEvDzE,KAAKoQ,QAAQ0B,UAAY,kdAWV9R,KAAKsmB,YAAYD,oWAWjBrmB,KAAKsmB,YAAYkI,0zBAqBhCxuB,KAAKwU,eACN,CAEA,kBAAAoP,GACC,MAAMY,EAAUxkB,KAAK0T,MAAMyK,YAC3B,IAAKqG,GAA8B,IAAnBA,EAAQthB,OACvB,MAAO,2LAkBR,MAAO,uCAVashB,EAClBC,MAAM,EAAG,GACT5J,IAAK/c,GACiB,iBAAXA,GAAuBA,EAAOyO,WAAW,QAC5C,mDAAmDzO,gCAEpD,yCAAyCA,EAAO4mB,OAAO,GAAGC,uBAEjElS,KAAK,WAGR,CAEA,WAAA6T,CAAY3b,GACX,OAAKA,EACEA,EACLkE,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UALE,EAMnB,CAEA,aAAA2F,GAEC,MAAMyI,EAAOjd,KAAKoQ,QAAQiE,cAAc,QAClCkV,EAAavpB,KAAKoQ,QAAQiE,cAAc,4BACxCwD,EAAY7X,KAAKoQ,QAAQiE,cAAc,6BACvCoa,EAAUzuB,KAAKoQ,QAAQiE,cAAc,2BAErCqa,EAAe,KACpB,MAAMjqB,EAAQ8kB,EAAWpjB,MAAMsL,OACzBkd,EAAe3uB,KAAK2pB,cAAcllB,GAExC,OADAoT,EAAUC,UAAY6W,EACfA,GAGRpF,EAAWtS,iBAAiB,QAAS,KACpCjX,KAAK4uB,YAAY,yBACjBF,MAGDnF,EAAWtS,iBAAiB,OAAQ,KACnC,MAAMxS,EAAQ8kB,EAAWpjB,MAAMsL,OAC3BhN,IAAUzE,KAAK2pB,cAAcllB,IAChCzE,KAAK8V,WAAW,wBAAyB,gCAI3C2Y,EAAQxX,iBAAiB,QAAS,KACjCjX,KAAK0T,MAAM2L,QAAQ,UAGpBpC,EAAKhG,iBAAiB,SAAUxW,MAAOiK,IACtCA,EAAEgN,iBACE1X,KAAKuuB,gBACJG,UAIC1uB,KAAK6uB,gBAHV7uB,KAAK8V,WAAW,wBAAyB,iCAM3C4Y,IAEAvvB,WAAW,IAAMoqB,EAAW/R,QAAS,IACtC,CAEA,aAAAmS,CAAcllB,GAEb,MADmB,6BACD9E,KAAK8E,EACxB,CAEA,UAAAqR,CAAWgZ,EAAW1tB,GACrB,MAAM2tB,EAAU/uB,KAAKoQ,QAAQiE,cAAc,IAAIya,KAC3CC,IACHA,EAAQld,YAAczQ,EACtB2tB,EAAQpa,MAAMC,QAAU,QAE1B,CAEA,WAAAga,CAAYE,GACX,MAAMC,EAAU/uB,KAAKoQ,QAAQiE,cAAc,IAAIya,KAC3CC,IACHA,EAAQld,YAAc,GACtBkd,EAAQpa,MAAMC,QAAU,OAE1B,CAEA,mBAAMia,GACL,MAAM/D,EAAY9qB,KAAKoQ,QAAQiE,cAAc,2BACvCkV,EAAavpB,KAAKoQ,QAAQiE,cAAc,4BACxCwD,EAAY7X,KAAKoQ,QAAQiE,cAAc,6BACvC2a,EAAanX,EAAUxD,cAAc,kCACrC4a,EAAgBpX,EAAUxD,cAAc,qCAExCnX,EAAO4tB,EAAU3kB,MAAMsL,OACvBhN,EAAQ8kB,EAAWpjB,MAAMsL,OAE/BzR,KAAKuuB,eAAgB,EACrB1W,EAAUC,UAAW,EACrBkX,EAAWra,MAAMC,QAAU,OAC3Bqa,EAActa,MAAMC,QAAU,cAE9B,IACK5U,KAAKG,QAAQ4qB,yBACV/qB,KAAKG,QAAQ4qB,kBAAkB,CAAE7tB,OAAMuH,UAGzCzE,KAAK0T,MAAMlM,cACfxH,KAAK0T,MAAMlM,YAAc,CAAA,GAE1BxH,KAAK0T,MAAMlM,YAAYtK,KAAOA,EAC9B8C,KAAK0T,MAAMlM,YAAY/C,MAAQA,EAE/BzE,KAAKuuB,eAAgB,EAErBvuB,KAAK0T,MAAM2L,QAAQ,OACpB,CAAE,MAAOjW,GACR2C,QAAQ3C,MAAM,2CAA4CA,GAC1DpJ,KAAK8V,WAAW,wBAAyB,2CAEzC9V,KAAKuuB,eAAgB,EACrB1W,EAAUC,UAAW,EACrBkX,EAAWra,MAAMC,QAAU,SAC3Bqa,EAActa,MAAMC,QAAU,MAC/B,CACD,CAEA,OAAAyB,GACKrW,KAAKoQ,SAAWpQ,KAAKoQ,QAAQqF,YAChCzV,KAAKoQ,QAAQqF,WAAWC,YAAY1V,KAAKoQ,QAE3C,EC9MM,MAAM8e,EACZ,WAAApvB,CAAYuH,EAAS,IACpBrH,KAAK0H,QAAUL,EAAOK,SAAW,GACjC1H,KAAKsH,UAAYD,EAAOC,WAAa,GACrCtH,KAAKgB,aAAeqG,EAAOrG,cAAgB,KAC3ChB,KAAKK,KAAOgH,EAAOhH,OAAQ,EAE3BL,KAAKkI,GAAK,KACVlI,KAAKmvB,kBAAoB,EACzBnvB,KAAKovB,qBAAuB,EAC5BpvB,KAAKqvB,eAAiB,IACtBrvB,KAAKsvB,aAAe,KACpBtvB,KAAKuvB,aAAc,EAGnBvvB,KAAK8e,WAAa,IAAIpS,IAGtB1M,KAAKwvB,QAAUxvB,KAAKwvB,QAAQxY,KAAKhX,MACjCA,KAAKyvB,WAAazvB,KAAKyvB,WAAWzY,KAAKhX,MACvCA,KAAK0vB,SAAW1vB,KAAK0vB,SAAS1Y,KAAKhX,MACnCA,KAAK2vB,SAAW3vB,KAAK2vB,SAAS3Y,KAAKhX,KACpC,CAKA,OAAA4vB,CAAQ5uB,EAAe,MAKtB,GAJIA,IACHhB,KAAKgB,aAAeA,IAGhBhB,KAAKgB,aAET,YADA+K,QAAQ2K,KAAK,yCAKd,GAAI1W,KAAKK,KAIR,OAHAL,KAAKuvB,aAAc,EACnBvvB,KAAK6vB,MAAM,YAAa,SACxB7vB,KAAK8vB,sBAKN,MAAMC,EAA0C,WAA7BxpB,OAAOC,SAASwpB,SAAwB,OAAS,MACpE,IAAIC,EAAQjwB,KAAK0H,QAAQmH,QAAQ,WAAYkhB,GAC7CE,EAAQA,EAAMphB,QAAQ,UAAW,IACjCohB,EAAQ,GAAGA,sCAA0CC,mBAAmBlwB,KAAKgB,gBAE7E,IACChB,KAAKkI,GAAK,IAAIioB,UAAUF,GACxBjwB,KAAKkI,GAAGkoB,OAASpwB,KAAKwvB,QACtBxvB,KAAKkI,GAAGmoB,UAAYrwB,KAAKyvB,WACzBzvB,KAAKkI,GAAGooB,QAAUtwB,KAAK0vB,SACvB1vB,KAAKkI,GAAGqoB,QAAUvwB,KAAK2vB,QACxB,CAAE,MAAOvmB,GACR2C,QAAQ3C,MAAM,gCAAiCA,GAC/CpJ,KAAKwwB,oBACN,CACD,CAKA,UAAAC,GACCzwB,KAAKuvB,aAAc,EACnBvvB,KAAKmvB,kBAAoBnvB,KAAKovB,qBAE1BpvB,KAAKsvB,eACRoB,cAAc1wB,KAAKsvB,cACnBtvB,KAAKsvB,aAAe,MAGjBtvB,KAAKkI,KACRlI,KAAKkI,GAAGyoB,QACR3wB,KAAKkI,GAAK,MAGPlI,KAAK4wB,gBACRF,cAAc1wB,KAAK4wB,eACnB5wB,KAAK4wB,cAAgB,KAEvB,CAQA,EAAAjkB,CAAGC,EAAOC,GAKT,OAJK7M,KAAK8e,WAAWhS,IAAIF,IACxB5M,KAAK8e,WAAW/R,IAAIH,EAAO,IAAImS,KAEhC/e,KAAK8e,WAAWjU,IAAI+B,GAAOwI,IAAIvI,GACxB,IAAM7M,KAAK8e,WAAWjU,IAAI+B,GAAOqS,OAAOpS,EAChD,CAKA,GAAAG,CAAIJ,EAAOC,GACN7M,KAAK8e,WAAWhS,IAAIF,IACvB5M,KAAK8e,WAAWjU,IAAI+B,GAAOqS,OAAOpS,EAEpC,CAKA,IAAAgkB,CAAKlyB,EAAM0C,EAAU,IACfrB,KAAKuvB,YAKNvvB,KAAKK,KAER0L,QAAQC,IAAI,4BAA6BrN,EAAM0C,GAI5CrB,KAAKkI,IAAMlI,KAAKkI,GAAG4oB,aAAeX,UAAUY,MAC/C/wB,KAAKkI,GAAG2oB,KAAKlvB,KAAKC,UAAU,CAAEjD,OAAM0C,aAXpC0K,QAAQ2K,KAAK,iDAaf,CAIA,OAAA8Y,GACCzjB,QAAQC,IAAI,yBACZhM,KAAKuvB,aAAc,EACnBvvB,KAAKmvB,kBAAoB,EACzBnvB,KAAK6vB,MAAM,YAAa,IAGxB7vB,KAAKsvB,aAAe0B,YAAY,KAC/BhxB,KAAK6wB,KAAK,OAAQ,KAChB,IACJ,CAEA,UAAApB,CAAW7iB,GACV,IACC,MAAMrM,EAAOoB,KAAKuI,MAAM0C,EAAMrM,OACxB5B,KAAEA,EAAI0C,QAAEA,GAAYd,EAG1B,OAAQ5B,GACP,IAAK,cACJqB,KAAK6vB,MAAM,UAAWxuB,GACtB,MACD,IAAK,iBACJrB,KAAK6vB,MAAM,iBAAkBxuB,GAC7B,MACD,IAAK,iBACJrB,KAAK6vB,MAAM,iBAAkBxuB,GAC7B,MACD,IAAK,uBACJrB,KAAK6vB,MAAM,uBAAwBxuB,GACnC,MACD,IAAK,sBACJrB,KAAK6vB,MAAM,sBAAuBxuB,GAClC,MACD,IAAK,uBACJrB,KAAK6vB,MAAM,uBAAwBxuB,GACnC,MACD,IAAK,OAEJ,MACD,QACC0K,QAAQC,IAAI,6BAA8BrN,EAAM0C,GAEnD,CAAE,MAAO+H,GACR2C,QAAQ3C,MAAM,uCAAwCA,EACvD,CACD,CAEA,QAAAsmB,CAAS9iB,GACRb,QAAQC,IAAI,4BAA6BY,EAAMqkB,KAAMrkB,EAAMwH,QAC3DpU,KAAKuvB,aAAc,EAEfvvB,KAAKsvB,eACRoB,cAAc1wB,KAAKsvB,cACnBtvB,KAAKsvB,aAAe,MAGrBtvB,KAAK6vB,MAAM,eAAgB,CAAEoB,KAAMrkB,EAAMqkB,KAAM7c,OAAQxH,EAAMwH,SAC7DpU,KAAKwwB,oBACN,CAEA,QAAAb,CAASvmB,GACR2C,QAAQ3C,MAAM,qBAAsBA,GACpCpJ,KAAK6vB,MAAM,QAAS,CAAEzmB,SACvB,CAEA,kBAAAonB,GACC,GAAIxwB,KAAKmvB,mBAAqBnvB,KAAKovB,qBAGlC,OAFArjB,QAAQC,IAAI,mDACZhM,KAAK6vB,MAAM,mBAAoB,IAIhC7vB,KAAKmvB,oBACL,MAAMpwB,EAAQiB,KAAKqvB,eAAiBzhB,KAAKsB,IAAI,EAAGlP,KAAKmvB,kBAAoB,GACzEpjB,QAAQC,IACP,+BAA+BjN,gBAAoBiB,KAAKmvB,sBAGzDhwB,WAAW,KACVa,KAAK4vB,WACH7wB,EACJ,CAEA,KAAA8wB,CAAMjjB,EAAOrM,GACRP,KAAK8e,WAAWhS,IAAIF,IACvB5M,KAAK8e,WAAWjU,IAAI+B,GAAOzB,QAAS0B,IACnC,IACCA,EAAStM,EACV,CAAE,MAAO6I,GACR2C,QAAQ3C,MAAM,wBAAwBwD,aAAkBxD,EACzD,GAGH,CAGA,mBAAA0mB,GAEC9vB,KAAK4wB,cAAgBI,YAAY,KAEjBpjB,KAAKC,SACP,KACZ7N,KAAK6vB,MAAM,iBAAkB,CAC5BqB,gBAAiB,SACjBC,QAAS,UACTC,UAAW,QACXC,UAAU,IAIXlyB,WAAW,KACVa,KAAK6vB,MAAM,iBAAkB,CAC5BqB,gBAAiB,SACjBC,QAAS,aAER,OAEF,IACJ,CAKA,eAAAG,CAAgBhuB,EAAgBlC,GAC3BpB,KAAKK,MACRL,KAAK6vB,MAAM,UAAW,CACrBqB,gBAAiB5tB,EACjBlC,QAAS,CACR1E,GAAI,OAASc,KAAKC,MAClBQ,QAASmD,EAAQnD,QACjBC,YAAakD,EAAQlD,aAAe,QACpCC,YAAaiD,EAAQjD,aAAe,UACpCC,cAAegD,EAAQhD,eAAiB,KACxCT,YAAY,IAAIH,MAAOE,gBAI3B,ECpQM,MAAM6zB,UAAwB7e,EACpC,WAAA5S,CAAYK,GACXkF,MAAM,IAAKlF,EAASxB,KAAM,cAE1BqB,KAAKwxB,iBAAmB,CACvBze,SAAU5S,EAAQ4S,UAAY,eAC9BoD,MAAOhW,EAAQgW,OAAS,QACxB+H,SAAU/d,EAAQ+d,UAAY,UAC9BC,YAAahe,EAAQge,aAAe,GACpCC,eAAgBje,EAAQie,gBAAkB,mBAC1CG,YAAmC,IAAvBpe,EAAQoe,WACpBC,iBAA6C,IAA5Bre,EAAQqe,gBACzBoP,QAASztB,EAAQytB,SAAW,iCAC5BI,gBAAiB7tB,EAAQ6tB,iBAAmB,KAC5CrlB,aAAcxI,EAAQwI,cAAgB,UACtC0iB,cAAelrB,EAAQkrB,eAAiB,KACxCmC,eAAgBrtB,EAAQqtB,gBAAkB,KAC1CvI,iBAAkB9kB,EAAQ8kB,kBAAoB,MAG/CjlB,KAAKyxB,eAAiB,IAAIhU,EAAe,CACxCS,SAAUle,KAAKwxB,iBAAiBtT,SAChCC,YAAane,KAAKwxB,iBAAiBrT,YACnCC,eAAgBpe,KAAKwxB,iBAAiBpT,eACtCG,WAAYve,KAAKwxB,iBAAiBjT,WAClCC,gBAAiBxe,KAAKwxB,iBAAiBhT,gBACvChX,YAAaxH,KAAK4S,KAAKC,YAAYpJ,kBAAoB,OAGxDzJ,KAAK0xB,SAAW,KAChB1xB,KAAKyX,MAAQ,KACbzX,KAAK2xB,UAAY,KACjB3xB,KAAK4xB,iBAAmB,GAExB5xB,KAAK6xB,kBAAoB7xB,KAAK6xB,kBAAkB7a,KAAKhX,MACrDA,KAAK8xB,wBAA0B9xB,KAAK8xB,wBAAwB9a,KAAKhX,MACjEA,KAAK+xB,qBAAuB/xB,KAAK+xB,qBAAqB/a,KAAKhX,MAC3DA,KAAKgyB,qBAAuBhyB,KAAKgyB,qBAAqBhb,KAAKhX,MAC3DA,KAAKiyB,0BAA4BjyB,KAAKiyB,0BAA0Bjb,KAAKhX,KACtE,CAEA,OAAAsU,GACC,MAAMxB,EAAYvE,SAASqD,cAAc,OAsCzC,OArCAkB,EAAUuC,UAAY,0BAA0BrV,KAAKwxB,iBAAiBrb,QACtErD,EAAU6B,MAAMud,OAAS,SAEzBlyB,KAAK0xB,SAAW,IAAInQ,EAAkBvhB,KAAKyxB,eAAgB,CAC1D1e,SAAU/S,KAAKwxB,iBAAiBze,SAChCpK,aAAc3I,KAAKwxB,iBAAiB7oB,eAErCmK,EAAUyB,YAAYvU,KAAK0xB,SAASjQ,UAEpCzhB,KAAKyX,MAAQ,IAAIqL,EAAe9iB,KAAKyxB,eAAgB,CACpD1e,SAAU/S,KAAKwxB,iBAAiBze,SAChCoD,MAAOnW,KAAKwxB,iBAAiBrb,MAC7BxN,aAAc3I,KAAKwxB,iBAAiB7oB,aACpCilB,QAAS5tB,KAAKwxB,iBAAiB5D,QAC/BI,gBAAiBhuB,KAAKwxB,iBAAiBxD,gBACvC3C,cACCrrB,KAAKwxB,iBAAiBnG,eACtBrrB,KAAKmyB,mBAAmBnb,KAAKhX,MAC9B4qB,oBAAqB5qB,KAAKoyB,yBAAyBpb,KAAKhX,MACxDsrB,SAAUtrB,KAAK+E,oBAAoBiS,KAAKhX,MACxCssB,qBAAsBtsB,KAAKqyB,0BAA0Brb,KAAKhX,MAC1D0sB,uBAAwB1sB,KAAKsyB,4BAA4Btb,KAAKhX,MAC9D+qB,kBAAmB/qB,KAAKuyB,uBAAuBvb,KAAKhX,MACpDwtB,eAAgBxtB,KAAKwxB,iBAAiBhE,eACtCvI,iBAAkBjlB,KAAKwxB,iBAAiBvM,mBAGzCjlB,KAAKyX,MAAMyL,aAAa,OAAQuK,GAChCztB,KAAKyX,MAAMyL,aAAa,WAAYqI,GACpCvrB,KAAKyX,MAAMyL,aAAa,OAAQgC,GAChCllB,KAAKyX,MAAMyL,aAAa,UAAWoL,GACnCtuB,KAAKyX,MAAMyL,aAAa,OAAQyJ,GAChC3sB,KAAKyX,MAAMyL,aAAa,YAAaO,GAErC3Q,EAAUyB,YAAYvU,KAAKyX,MAAMgK,UACjCzhB,KAAKyX,MAAM5C,OAEJ/B,CACR,CAEA,aAAA0B,GACCxU,KAAKwyB,kBAAoBxyB,KAAKyxB,eAAezS,UAAU,CAACrgB,EAAM4B,KAChD,eAAT5B,GACHqB,KAAK6xB,kBAAkBtxB,EAAKoT,QAEhB,uBAAThV,GACHqB,KAAKyyB,gCACJlyB,EAAK+C,eACL/C,EAAKmf,yBAIT,CAEA,iBAAAmS,CAAkBle,GACbA,GACH3T,KAAKyX,MAAM/C,OACX1U,KAAK4S,IAAIsB,SAAS7G,KAAK,mBAAoB,CAAE8G,OAAQnU,SAErDA,KAAKyX,MAAM5C,OACX7U,KAAKyxB,eAAenQ,QACpBthB,KAAK4S,IAAIsB,SAAS7G,KAAK,mBAAoB,CAAE8G,OAAQnU,OAEvD,CAEA,+BAAAyyB,CAAgCnvB,EAAgBoc,GAC3CA,GAA0B1f,KAAK2xB,WAClC3xB,KAAK2xB,UAAUd,KAAK,2BAA4B,CAC/CK,gBAAiBxR,IAGfpc,GAAkBtD,KAAK2xB,WAC1B3xB,KAAK2xB,UAAUd,KAAK,yBAA0B,CAC7CK,gBAAiB5tB,GAGpB,CAED,8BAAM8uB,CAAyBM,EAAgBC,GAC9C,IAEC,IAAK3yB,KAAKyxB,eAAepT,aAOxB,OALAre,KAAKyxB,eAAenT,eAAiB,CACpCrgB,QAASy0B,EACTjxB,YAAakxB,GAEd3yB,KAAKyxB,eAAepS,QAAQ,WACrB,KAIR,MAAMoN,EAAmBzsB,KAAKyxB,eAAe5T,cAActa,KACzDrB,GAAmB,SAAbA,EAAE9E,QAGV,OAAIqvB,GACHzsB,KAAKyxB,eAAehS,sBAAsBgN,EAAiB/vB,UACrDsD,KAAKmyB,mBACV1F,EAAiB/vB,GACjB,CAAEuB,QAASy0B,GACXC,GAEMlG,SAGKzsB,KAAK4yB,qBACjBF,EACA,GACAC,EAEF,CAAE,MAAOvpB,GAER,OADA2C,QAAQ3C,MAAM,kDAAmDA,GAC1D,IACR,CACD,CAEC,+BAAMipB,CAA0B/uB,GAC/B,UACOtD,KAAK6yB,cAAcvvB,EAC1B,CAAE,MAAO8F,GACR2C,QAAQ3C,MAAM,8CAA+CA,EAC9D,CACD,CAEA,2BAAAkpB,GACC,MAAM7F,EAAmBzsB,KAAKyxB,eAAe5T,cAActa,KACzDrB,GAAmB,SAAbA,EAAE9E,QAGNqvB,GACHzsB,KAAKyxB,eAAehS,sBAAsBgN,EAAiB/vB,IAC3DsD,KAAKyxB,eAAepS,QAAQ,QAC5Brf,KAAKqyB,0BAA0B5F,EAAiB/vB,MAEhDsD,KAAKyxB,eAAehS,sBAAsB,MAC1Czf,KAAKyxB,eAAepS,QAAQ,QAE9B,CAED,4BAAMkT,CAAuBO,GAC5B,IACC,MAAMttB,QAAiBxF,KAAK6S,WAAWtO,gBAAgB,CACtDrH,KAAM41B,EAAY51B,KAClBuH,MAAOquB,EAAYruB,QAGpB,GAAIe,EAASpI,OAAQ,CACpB2O,QAAQC,IAAI,wCAAyCxG,EAASjF,KAAKiE,YAG9DxE,KAAKyxB,eAAejqB,cACxBxH,KAAKyxB,eAAejqB,YAAc,CAAA,GAEnCxH,KAAKyxB,eAAejqB,YAAYtK,KAAO41B,EAAY51B,KACnD8C,KAAKyxB,eAAejqB,YAAY/C,MAAQquB,EAAYruB,MACpDzE,KAAKyxB,eAAepT,cAAe,EAGnC,MAAMC,EAAiBte,KAAKyxB,eAAenT,eACvCA,GACHte,KAAKyxB,eAAenT,eAAiB,WAC/Bte,KAAK4yB,qBACVtU,EAAergB,QACf,GACAqgB,EAAe7c,cAGhBzB,KAAKyxB,eAAepS,QAAQ,OAE9B,CAEA,OAAO7Z,CACR,CAAE,MAAO4D,GAER,MADA2C,QAAQ3C,MAAM,gDAAiDA,GACzDA,CACP,CACD,CAEC,uBAAM2pB,CAAkB5mB,EAAYC,GACnC,IACC,MAAM5G,QAAiBxF,KAAK6S,WAAW3G,WAAWC,EAAYC,GAC9D,GAAI5G,EAASpI,QAAUoI,EAAS/G,IAC/B,OAAO+G,EAAS/G,IAEjB,MAAM,IAAI0G,MAAM,gBACjB,CAAE,MAAOiE,GAER,MADA2C,QAAQ3C,MAAM,2CAA4CA,GACpDA,CACP,CACD,CAEA,+BAAM4pB,CAA0BL,GAC/B,IAAKA,GAAoD,IAA9BA,EAAmBzvB,OAAc,MAAO,GAEnE,MAAM+vB,EAAW,GACjB,IAAK,MAAMtM,KAAOgM,EACjB,IACC,MAAMO,QAAelzB,KAAK+yB,kBAAkBpM,EAAI0B,QAAS1B,EAAIta,KAAKnP,MAClE+1B,EAASnvB,KAAK,CACbrF,IAAKy0B,EACLv0B,KAAMgoB,EAAIhoB,KAAK4N,WAAW,SAAW,QAAU,OAC/CrP,KAAMypB,EAAIta,KAAKnP,MAEjB,CAAE,MAAOi2B,GACRpnB,QAAQ3C,MACP,uDACAud,EAAIta,KAAKnP,KACTi2B,EAEF,CAED,OAAOF,CACR,CAEA,wBAAMd,CAAmB7uB,EAAgBlC,EAASuxB,GACjD3yB,KAAK4S,IAAIsB,SAAS7G,KAAK,wBAAyB,CAC/C8G,OAAQnU,KACRsD,iBACAlC,YAGD,IACC,MAAMgyB,QACCpzB,KAAKgzB,0BAA0BL,GAEhCntB,QAAiBxF,KAAK6S,WAAWjP,YAAYN,EAAgB,CAClErF,QAASmD,EAAQnD,QACjBwD,YAAa2xB,IAGV5tB,EAASpI,QAAUoI,EAASjF,MAC/BwL,QAAQC,IAAI,kCAAmCxG,EAASjF,KAAK7D,IAG1DsD,KAAK6S,YAAYxS,MACpBlB,WAAW,KACV,MAAMk0B,EAAe,CACpB32B,GAAI,OAASc,KAAKC,MAClBQ,QAAS,uDACToiB,OAAO,EACPD,WAAW,IAAI5iB,MAAOE,cACtB0pB,OAAQ,CACPlqB,KAAM,eACNmqB,UAAW,OAGbrnB,KAAKyxB,eAAezR,WAAW1c,EAAgB+vB,IAC7C,KAEL,CAAE,MAAOjqB,GACR2C,QAAQ3C,MAAM,4CAA6CA,EAC5D,CACD,CAEA,uBAAA0oB,CAAwBvxB,GACvB,MAAM2wB,gBAAEA,EAAe9vB,QAAEA,GAAYb,EAErC,IAAIkB,EAAc,GAClB,GAAIL,EAAQK,YACX,IACCA,EACgC,iBAAxBL,EAAQK,YACZE,KAAKuI,MAAM9I,EAAQK,aACnBL,EAAQK,WACb,CAAE,MAAOiJ,GAET,CAGD,MAAM0gB,EAAe,CACpB1uB,GAAI0E,EAAQ1E,GACZuB,QAASmD,EAAQnD,QACjBoiB,MAA+B,aAAxBjf,EAAQlD,YACfkiB,UAAWhf,EAAQzD,WACnB8D,YAAaA,EAAYyB,OAAS,EAAIzB,OAAcmP,EACpDwW,OAAQ,CACPlqB,KAAMkE,EAAQjD,aAAe,UAC7BkpB,UAAWjmB,EAAQhD,eAAiB,OAItC4B,KAAKyxB,eAAezR,WAAWkR,EAAiB9F,GAG9CprB,KAAKyxB,eAAe9d,QACrB3T,KAAKyxB,eAAe7T,uBAAyBsT,GAE7ClxB,KAAK4f,oBAEP,CAEA,oBAAAmS,CAAqBxxB,GAChBA,EAAK8wB,UACRrxB,KAAKyxB,eAAevS,QAAQ,gBAAiB,CAC5C5b,eAAgB/C,EAAK2wB,gBACrBrL,SAAUtlB,EAAK6wB,WAGlB,CAEA,oBAAAY,CAAqBzxB,GACpBP,KAAKyxB,eAAevS,QAAQ,gBAAiB,CAC5C5b,eAAgB/C,EAAK2wB,iBAEvB,CAEA,yBAAAe,CAA0B1xB,GACzB,MAAM+C,EACL/C,GAAM2wB,iBAAmB3wB,GAAM7D,IAAM6D,GAAMuf,cAAcpjB,GACrD4G,GAELtD,KAAKyxB,eAAenR,mBAAmBhd,EAAgB,CAAElG,OAAQ,UAClE,CAEA,wBAAMwiB,GACL,IACC,MAAMpa,QAAiBxF,KAAK6S,WAAW9O,iBACnCyB,EAASpI,QAAUoI,EAASjF,OAC/BP,KAAKyxB,eAAe9T,YAAcnY,EAASjF,KAAK4D,cAAgB,EAChEnE,KAAKyxB,eAAevS,QAAQ,oBAAqB,CAChDlb,MAAOhE,KAAKyxB,eAAe9T,cAG9B,CAAE,MAAOvU,GACR2C,QAAQ3C,MAAM,gDAAiDA,EAChE,CACD,CAEA,cAAAkqB,GACKtzB,KAAK2xB,WACR3xB,KAAK2xB,UAAUlB,aAGhBzwB,KAAK2xB,UAAY,IAAIzC,EAAiB,CACrCxnB,QAAS1H,KAAK6S,WAAWnL,QACzBJ,UAAWtH,KAAK6S,WAAWvL,UAC3BtG,aAAchB,KAAK6S,WAAW7R,aAC9BX,KAAML,KAAK6S,WAAWxS,OAGvBL,KAAK4xB,iBAAiB9tB,KACrB9D,KAAK2xB,UAAUhlB,GAAG,UAAW3M,KAAK8xB,0BAEnC9xB,KAAK4xB,iBAAiB9tB,KACrB9D,KAAK2xB,UAAUhlB,GAAG,iBAAkB3M,KAAK+xB,uBAE1C/xB,KAAK4xB,iBAAiB9tB,KACrB9D,KAAK2xB,UAAUhlB,GAAG,iBAAkB3M,KAAKgyB,uBAE1ChyB,KAAK4xB,iBAAiB9tB,KACrB9D,KAAK2xB,UAAUhlB,GAAG,sBAAuB3M,KAAKiyB,4BAE/CjyB,KAAK4xB,iBAAiB9tB,KACrB9D,KAAK2xB,UAAUhlB,GAAG,YAAa,KAC9BZ,QAAQC,IAAI,yCACRhM,KAAKyxB,eAAe7T,sBACvB5d,KAAK2xB,UAAUd,KAAK,yBAA0B,CAC7CK,gBAAiBlxB,KAAKyxB,eAAe7T,0BAKzC5d,KAAK4xB,iBAAiB9tB,KACrB9D,KAAK2xB,UAAUhlB,GAAG,eAAgB,KACjCZ,QAAQC,IAAI,+CAIdhM,KAAK2xB,UAAU/B,SAChB,CAEA,IAAA3T,GACCjc,KAAKyxB,eAAejS,SAAQ,EAC7B,CAEA,KAAAmR,GACC3wB,KAAKyxB,eAAejS,SAAQ,EAC7B,CAEA,MAAAqD,GACC7iB,KAAKyxB,eAAejS,SAASxf,KAAKyxB,eAAe9d,OAClD,CAEA,UAAA4f,CAAWjU,GACVtf,KAAKyxB,eAAepS,QAAQC,GACvBtf,KAAKyxB,eAAe9d,QACxB3T,KAAKic,MAEP,CAEA,gBAAA0D,CAAiB9B,GAChB7d,KAAKyxB,eAAe9R,iBAAiB9B,EACtC,CAEA,UAAAmC,CAAW1c,EAAgBlC,GAC1BpB,KAAKyxB,eAAezR,WAAW1c,EAAgBlC,EAChD,CAEA,eAAAqf,CAAgBC,GACf1gB,KAAKyxB,eAAehR,gBAAgBC,EACrC,CAEA,qBAAAE,CAAsBC,GACrB7gB,KAAKyxB,eAAe7Q,sBAAsBC,EAC3C,CAEA,iBAAAC,CAAkBD,GACjB7gB,KAAKyxB,eAAe3Q,kBAAkBD,EACvC,CAEA,cAAA2S,CAAexvB,GACdhE,KAAKyxB,eAAe9T,YAAc3Z,EAClChE,KAAKyxB,eAAevS,QAAQ,oBAAqB,CAAElb,SACpD,CAEA,QAAAyvB,GACC,MAAO,CACN9f,OAAQ3T,KAAKyxB,eAAe9d,OAC5B+J,YAAa1d,KAAKyxB,eAAe/T,YACjCC,YAAa3d,KAAKyxB,eAAe9T,YACjCE,cAAe7d,KAAKyxB,eAAe5T,cAErC,CAEA,qBAAM6V,GACL,IACC,MAAM7V,QAAsB7d,KAAK2zB,sBACjC3zB,KAAKyxB,eAAe9R,iBAAiB9B,EACtC,CAAE,MAAOzU,GACR2C,QAAQ3C,MAAM,kDAAmDA,EAClE,CAEA,GAAIpJ,KAAKwxB,iBAAiBjT,WACzB,IACC,MAAMmC,QAAiB1gB,KAAK4zB,qBAC5B5zB,KAAKyxB,eAAehR,gBAAgBC,EACrC,CAAE,MAAOtX,GACR2C,QAAQ3C,MAAM,kDAAmDA,EAClE,CAGD,GAAIpJ,KAAKwxB,iBAAiBhT,gBACzB,IACC,MAAMqV,UAAEA,EAAS5V,eAAEA,SAAyBje,KAAK8zB,kBACjD9zB,KAAKyxB,eAAe7Q,sBAAsBiT,GAC1C7zB,KAAKyxB,eAAe3Q,kBAAkB7C,EACvC,CAAE,MAAO7U,GACR2C,QAAQ3C,MAAM,8CAA+CA,EAC9D,CAEF,CAEA,yBAAMuqB,GACL,IACC,MAAMnuB,QAAiBxF,KAAK6S,WAAW9P,mBACvC,OAAIyC,EAASpI,QAAUoI,EAASjF,KACxBiF,EAASjF,KAAKsa,IAAKoF,IAAI,CAC7BvjB,GAAIujB,EAAKvjB,GACTC,MACCsjB,EAAK3iB,SACL,aAAa2iB,EAAKpiB,eAAeX,MAAQ,YAC1CoqB,aAAcrH,EAAKpiB,cAChB,CACA,CACCX,KAAM+iB,EAAKpiB,cAAcX,KACzBmqB,UAAWpH,EAAKpiB,cAAcC,SAG/B,CAAC,CAAEZ,KAAM,UAAWmqB,UAAW,OAClCnH,YAAaD,EAAKoI,SAAWpI,EAAK8T,SAAW,GAC7C5T,gBAAiBF,EAAK1iB,gBACtBK,OAAQqiB,EAAKriB,QAAU,EACvBR,OAAQ6iB,EAAK7iB,UAGR,EACR,CAAE,MAAOgM,GAER,OADA2C,QAAQ3C,MAAM,mDAAoDA,GAC3D,EACR,CACD,CAEA,wBAAMwqB,GACL,IACC,MAAMpuB,QAAiBxF,KAAK6S,WAAW/Q,qBACvC,OAAI0D,EAASpI,QAAUoI,EAASjF,KACxBiF,EAASjF,KAAKsa,IAAKsS,IAAU,CACnCzwB,GAAIywB,EAAWzwB,GACfC,MAAOwwB,EAAWxwB,OAASwwB,EAAWjwB,KACtCL,YAAaswB,EAAWtwB,aAAe,GACvC0B,aACC4uB,EAAW6G,eAAiB7G,EAAW5uB,cAAgB,EACxDC,KAAM2uB,EAAW3uB,MAAQ,eACzBC,IAAK0uB,EAAW1uB,KAAO,UAAU0uB,EAAWpwB,MAAQowB,EAAWzwB,QAG1D,EACR,CAAE,MAAO0M,GAER,OADA2C,QAAQ3C,MAAM,mDAAoDA,GAC3D,EACR,CACD,CAEA,mBAAMypB,CAAcvvB,GACnB,IACC,MAAMkC,QAAiBxF,KAAK6S,WAAWxP,gBAAgBC,GACvD,GAAIkC,EAASpI,QAAUoI,EAASjF,KAAM,CACrC,MAAMiD,GAAYgC,EAASjF,KAAKiD,UAAY,IAAIqX,IAAKoL,IACpD,IAAIxkB,EACJ,GAAIwkB,EAAIxkB,YACP,IACCA,EAC4B,iBAApBwkB,EAAIxkB,YACRE,KAAKuI,MAAM+b,EAAIxkB,aACfwkB,EAAIxkB,WACT,CAAE,MAAOiJ,GAET,CAED,MAAO,CACNhO,GAAIupB,EAAIvpB,GACRuB,QAASgoB,EAAIhoB,QACboiB,MAA2B,aAApB4F,EAAI/nB,YACXkiB,UAAW6F,EAAItoB,WACf8D,YACCA,GAAeA,EAAYyB,OAAS,EAAIzB,OAAcmP,EACvDwW,OAAQ,CACPlqB,KACC+oB,EAAI9nB,cACiB,aAApB8nB,EAAI/nB,YAA6B,MAAQ,WAC3CmpB,UAAWpB,EAAI7nB,eAAiB,SASnC,OALA4B,KAAKyxB,eAAe1R,YAAYzc,EAAgBE,SAE1CxD,KAAK6S,WAAWxO,uBAAuBf,GAC7CtD,KAAKyxB,eAAejR,WAAWld,GAExBE,CACR,CACA,MAAO,EACR,CAAE,MAAO4F,GAER,OADA2C,QAAQ3C,MAAM,8CAA+CA,GACtD,EACR,CACD,CAEA,0BAAMwpB,CAAqBxxB,EAAS9D,EAAU,GAAIq1B,EAAqB,IACtE,IACC,MAAMS,QACCpzB,KAAKgzB,0BAA0BL,GAEtC5mB,QAAQC,IAAI,6CAA8C,CACzD5K,UACA6yB,gBAAiBb,EAAoBlwB,OACrCgxB,WAAYl0B,KAAK6S,WAAWtK,iBAC5BvH,aAAchB,KAAK6S,WAAW7R,aAC3BhB,KAAK6S,WAAW7R,aAAa8M,UAAU,EAAG,IAAM,MAChD,KACHpG,QAAS1H,KAAK6S,WAAWnL,QACzBrH,KAAML,KAAK6S,WAAWxS,OAGvB,MAAMmF,QAAiBxF,KAAK6S,WAAWpP,kBAAkB,CACxDrC,UACA9D,UACAmE,YAAa2xB,IAKd,GAFArnB,QAAQC,IAAI,2CAA4CxG,GAEpDA,EAASpI,QAAUoI,EAASjF,KAAM,CACrC,MAAM0f,EAAOza,EAASjF,KAChB4zB,EAAkB,CACvBz3B,GAAIujB,EAAKvjB,GACTC,MAAOsjB,EAAK3iB,SAAW,mBACvBgqB,aAAc,CAAC,CAAEpqB,KAAM,UAAWmqB,UAAW,OAC7CnH,YAAa9e,EACb+e,gBAAiBF,EAAKtiB,aAAc,IAAIH,MAAOE,cAC/CE,OAAQ,EACRR,OAAQ,QAiBT,OAdA4C,KAAKyxB,eAAe5R,gBAAgBsU,GAEpCn0B,KAAKyxB,eAAe1R,YAAYE,EAAKvjB,GAAI,CACxC,CACCA,GAAI,OAASc,KAAKC,MAClBQ,QAASmD,EACTif,OAAO,EACPD,WAAW,IAAI5iB,MAAOE,iBAIxBsC,KAAKyxB,eAAehS,sBAAsBQ,EAAKvjB,IAC/CsD,KAAKyxB,eAAepS,QAAQ,QAErBY,CACR,CACA,OAAO,IACR,CAAE,MAAO7W,GAER,OADA2C,QAAQ3C,MAAM,kDAAmDA,GAC1D,IACR,CACD,CAEA,yBAAMrE,CAAoBzB,EAAgB0B,GACzC,UACOhF,KAAK6S,WAAW9N,oBAAoBzB,EAAgB0B,EAC3D,CAAE,MAAOoE,GAET,CACD,CAEA,4BAAMgrB,GACL,IACC,MAAM5uB,QAAiBxF,KAAK6S,WAAWjQ,oBACvC,OAAI4C,EAASpI,QAAUoI,EAASjF,MAC/BP,KAAKyxB,eAAehT,aAAejZ,EAASjF,KAAKsC,cACjD7C,KAAKyxB,eAAe/S,YAAclZ,EAASjF,KAAKuC,cAAgB,EAChE9C,KAAKyxB,eAAe9S,aAAenZ,EAASjF,KAAKoC,eAAiB,GAE9D6C,EAASjF,KAAKqL,kBACjB5L,KAAKyxB,eAAexQ,yBACnBzb,EAASjF,KAAKqL,kBAIhB5L,KAAKyxB,eAAevS,QAAQ,qBAAsB1Z,EAASjF,MACpDiF,EAASjF,MAEV,CAAEsC,eAAe,EAAOC,aAAc,EAC9C,CAAE,MAAOsG,GAER,OADA2C,QAAQ3C,MAAM,kDAAmDA,GAC1D,CAAEvG,eAAe,EAAOC,aAAc,EAC9C,CACD,CAEA,qBAAMgxB,GACL,GAAI9zB,KAAK6S,YAAYxS,KACpB,MAAO,CACNwzB,UAAW,CACV,CACCn3B,GAAI,cACJC,MAAO,6BACPE,YACC,iEACDqnB,KAAM,CAAC,eACPI,WAAY,mDACZ4J,UAAW,KACX7J,YAAa,IAAI7mB,KAChBA,KAAKC,MAAQ,SACZC,cACFe,IAAK,KAEN,CACC/B,GAAI,cACJC,MAAO,oCACPE,YACC,uIACDqnB,KAAM,CAAC,cAAe,MACtBI,WACC,8DACD4J,UAAW,2CACX7J,YAAa,IAAI7mB,KAChBA,KAAKC,MAAQ,OACZC,cACFe,IAAK,KAEN,CACC/B,GAAI,cACJC,MAAO,kDACPE,YACC,uHACDqnB,KAAM,CAAC,UACPI,WACC,gEACD4J,UAAW,oDACX7J,YAAa,IAAI7mB,KAChBA,KAAKC,MAAQ,QACZC,cACFe,IAAK,MAGPwf,eAAgB,CACf,CACCvhB,GAAI,cACJC,MAAO,kCACPE,YACC,yFACDqnB,KAAM,CAAC,aACPI,WACC,oEACD4J,UAAW,KACX7J,YAAa,IAAI7mB,KAChBA,KAAKC,MAAQ,OACZC,cACFe,IAAK,KAEN,CACC/B,GAAI,cACJC,MAAO,yCACPE,YACC,sGACDqnB,KAAM,CAAC,cAAe,MACtBI,WACC,oFACD4J,UAAW,KACX7J,YAAa,IAAI7mB,KAChBA,KAAKC,MAAQ,QACZC,cACFe,IAAK,OAMT,MAGM41B,UAHiBr0B,KAAK6S,WAAW3S,cAAc,CAAEkD,MAAO,MAClC7C,MAAQ,IAELsa,IAAKG,IAAI,CACvCte,GAAIse,EAAKte,GACTC,MAAOqe,EAAKre,MACZE,YAAame,EAAKpe,SAAWoe,EAAKne,aAAe,GACjDqnB,KAAMlJ,EAAK/d,OAAS+d,EAAK/d,OAAO4d,IAAKU,GAAUA,EAAMre,MAAQ,GAC7DonB,WAAYtJ,EAAKle,aAAe,KAChCoxB,UAAW,KACX7J,YAAarJ,EAAKhe,aAClByB,IAAKuc,EAAKje,KAAO,cAAcie,EAAKje,OAAS,OAG9C,MAAO,CACN82B,UAAWQ,EAAY5P,MAAM,EAAG,GAChCxG,eAAgBoW,EAElB,CAED,aAAM5f,GACLzU,KAAK0zB,kBAED1zB,KAAK6S,YAAY7R,cACpBhB,KAAKszB,iBAGNtzB,KAAKo0B,yBAELp0B,KAAKs0B,sBAAwBtD,YAAY,KACxChxB,KAAKo0B,0BACH,IACJ,CAEC,SAAA9d,GACKtW,KAAKwyB,mBACRxyB,KAAKwyB,oBAGFxyB,KAAK2xB,WACR3xB,KAAK2xB,UAAUlB,aAGhBzwB,KAAK4xB,iBAAiBzmB,QAASopB,GAAUA,KACzCv0B,KAAK4xB,iBAAmB,GAEpB5xB,KAAKs0B,uBACR5D,cAAc1wB,KAAKs0B,sBAErB,CAEA,OAAAje,GACKrW,KAAK0xB,UACR1xB,KAAK0xB,SAASrb,UAEXrW,KAAKyX,OACRzX,KAAKyX,MAAMpB,UAEZrW,KAAKsW,YACLjR,MAAMgR,SACP,ECj0BM,MAAMme,UAAqB9hB,EACjC,WAAA5S,CAAYK,GACXkF,MAAM,IAAKlF,EAASxB,KAAM,WAE1BqB,KAAKy0B,cAAgB,CACpB5tB,SAAU1G,EAAQ0G,UAAY,KAC9B6tB,WAAYv0B,EAAQu0B,YAAc,MAClC3hB,SAAU5S,EAAQ4S,UAAY,eAC9BpW,MAAOwD,EAAQxD,OAAS,KACxBE,YAAasD,EAAQtD,aAAe,KACpC83B,SAAUx0B,EAAQw0B,UAAY,KAC9BC,UAAWz0B,EAAQy0B,WAAa,KAChCC,gBAAiB10B,EAAQ00B,iBAAmB,GAC5CC,SAAU30B,EAAQ20B,UAAY,KAC9BC,UAAW50B,EAAQ40B,WAAa,MAGjC/0B,KAAKg1B,YAAc,CAClBC,MAAO,KACPhuB,SAAU,GACViuB,cAAe,CAAA,EACfC,WAAW,EAEb,CAEA,OAAA7gB,GACC,MAAMxB,EAAYvE,SAASqD,cAAc,OAEzC,OADAkB,EAAUuC,UAAY,4BACfvC,CACR,CAEA,aAAA0B,GAEA,CAEA,IAAAE,GAOC,OANA1U,KAAKo1B,gBACLp1B,KAAKg1B,YAAYG,WAAY,EAC7Bn1B,KAAK4S,IAAIsB,SAAS7G,KAAK,eAAgB,CACtC8G,OAAQnU,KACRrB,KAAMqB,KAAKy0B,cAAcC,aAEnB10B,IACR,CAEA,IAAA6U,GAEC,OADA7U,KAAKq1B,eACEr1B,IACR,CAEA,aAAAo1B,GACCp1B,KAAKq1B,eAEL,MAAMhuB,EAASrH,KAAKs1B,mBAEgB,WAAhCt1B,KAAKy0B,cAAc1hB,WACtB/S,KAAKuT,gBAAkBhF,SAASqD,cAAc,OAC9C5R,KAAKuT,gBAAgB8B,UAAY,2BACjC9G,SAAS7M,KAAK6S,YAAYvU,KAAKuT,iBAC/BvT,KAAKuT,gBAAgB0D,iBAAiB,QAAS,IAC9CjX,KAAKu1B,mBAIPv1B,KAAKw1B,cAAgBjnB,SAASqD,cAAc,OAC5C5R,KAAKw1B,cAAcngB,UAAY,mCAAmCrV,KAAKy0B,cAAc1hB,WAErF/S,KAAKw1B,cAAc1jB,UAAY,2GAEMzK,EAAO1K,4DACF0K,EAAOxK,+DACTwK,EAAOouB,+PAO/ClnB,SAAS7M,KAAK6S,YAAYvU,KAAKw1B,eAC/Bx1B,KAAK01B,sBAELxgB,sBAAsB,KACrBlV,KAAKw1B,cAAc7gB,MAAMuD,QAAU,IACnClY,KAAKw1B,cAAc7gB,MAAMghB,UACQ,WAAhC31B,KAAKy0B,cAAc1hB,SAChB,iCACA,iBAEN,CAEA,gBAAAuiB,GACC,MAAMM,EAAU,CACfC,IAAK,CACJl5B,MACCqD,KAAKy0B,cAAc93B,OAAS,sCAC7BE,YACCmD,KAAKy0B,cAAc53B,aACnB,4FACD44B,KAAM,8DAEF,IAAIrnB,MAAM,IAAIyC,QACdgK,IACCmK,GAAM,uEAC8CA,MAAMA,4BAG3DvS,KAAK,4FAGCzS,KAAKy0B,cAAcE,UAAY,0CAC/B30B,KAAKy0B,cAAcG,WAAa,oDAI3CkB,KAAM,CACLn5B,MAAOqD,KAAKy0B,cAAc93B,OAAS,yBACnCE,YACCmD,KAAKy0B,cAAc53B,aACnB,iEACD44B,KAAM,+DAEF,CAAC,KAAM,KAAM,KAAM,KAAM,MACzB5a,IACA,CAACkb,EAAOhnB,IAAM,wEACwCA,EAAI,MAAMgnB,4BAGhEtjB,KAAK,4FAGCzS,KAAKy0B,cAAcE,UAAY,iDAC/B30B,KAAKy0B,cAAcG,WAAa,uDAI3CoB,IAAK,CACJr5B,MAAOqD,KAAKy0B,cAAc93B,OAAS,mBACnCE,YACCmD,KAAKy0B,cAAc53B,aACnB,iDACD44B,KAAM,8DAEF,CAAC,iBAAkB,YAAa,UAAW,OAAQ,aACnD5a,IACA,CAACU,EAAOxM,IAAM,uEACuCA,EAAI,MAAMwM,4BAG/D9I,KAAK,mCAIVwjB,OAAQ,CACPt5B,MAAOqD,KAAKy0B,cAAc93B,OAAS,iBACnCE,YACCmD,KAAKy0B,cAAc53B,aACnB,gDACD44B,KAAMz1B,KAAKk2B,2BAIb,OAAON,EAAQ51B,KAAKy0B,cAAcC,aAAekB,EAAQC,GAC1D,CAEA,sBAAAK,GACC,OACEl2B,KAAKy0B,cAAcI,iBAC0B,IAA9C70B,KAAKy0B,cAAcI,gBAAgB3xB,OA4B7BlD,KAAKy0B,cAAcI,gBACxBha,IACA,CAACxY,EAAG6K,IAAU,0EAEa7K,EAAEkZ,0BAC3Bvb,KAAKm2B,qBAAqB9zB,EAAG6K,0BAI/BuF,KAAK,IAnCC,0rBAcF,CAAC,QAAS,SAAU,UAAW,UAC/BoI,IACCub,GAAS,uEAC2CA,MAASA,4BAG9D3jB,KAAK,+CAgBZ,CAEA,oBAAA0jB,CAAqBE,EAAUnpB,GAC9B,OAAQmpB,EAAS13B,MAChB,IAAK,SACJ,MAAO,qEACkD03B,EAAS35B,IAAMwQ,qCACnDmpB,EAAS9Y,aAAe,4CACzC8Y,EAASl2B,QAAQ0a,IAAKyb,GAAQ,kBAAkBA,EAAInwB,UAAUmwB,EAAI/a,kBAAkB9I,KAAK,qCAG9F,IAAK,OACJ,MAAO,+EAC4D4jB,EAAS35B,IAAMwQ,mBAAuBmpB,EAAS9Y,aAAe,iBAElI,QACC,MAAO,GAEV,CAEA,mBAAAmY,GACC,IAAK11B,KAAKw1B,cAAe,OAERx1B,KAAKw1B,cAAcnhB,cAAc,0BACzC4C,iBAAiB,QAAS,IAAMjX,KAAKu1B,kBAE5Bv1B,KAAKw1B,cAAcnhB,cACpC,2BAES4C,iBAAiB,QAAS,IAAMjX,KAAK6uB,iBAE9B7uB,KAAKw1B,cAAcnhB,cACnC,6BAEQ4C,iBAAiB,QAAUvM,IACnC1K,KAAKg1B,YAAY/tB,SAAWyD,EAAEsD,OAAO7H,QAGtCnG,KAAKu2B,4BAELv2B,KAAK8Z,eAAkBpP,IACR,WAAVA,EAAEP,KACLnK,KAAKu1B,kBAGPhnB,SAAS0I,iBAAiB,UAAWjX,KAAK8Z,eAC3C,CAEA,yBAAAyc,GACC,MAAM53B,EAAOqB,KAAKy0B,cAAcC,WAEnB,QAAT/1B,GACHqB,KAAKw1B,cACHza,iBAAiB,4BACjB5P,QAASmd,IACTA,EAAIrR,iBAAiB,QAAS,IAC7BjX,KAAKw2B,WAAW3a,SAASyM,EAAIxM,QAAQmZ,WAK5B,SAATt2B,GACHqB,KAAKw1B,cACHza,iBAAiB,6BACjB5P,QAASmd,IACTA,EAAIrR,iBAAiB,QAAS,IAC7BjX,KAAKy2B,YAAY5a,SAASyM,EAAIxM,QAAQmZ,WAK7B,QAATt2B,GACHqB,KAAKw1B,cACHza,iBAAiB,4BACjB5P,QAASmd,IACTA,EAAIrR,iBAAiB,QAAS,IAC7BjX,KAAK02B,WAAW7a,SAASyM,EAAIxM,QAAQmZ,WAK5B,WAATt2B,IACHqB,KAAKw1B,cACHza,iBAAiB,6BACjB5P,QAASmd,IACTA,EAAIrR,iBAAiB,QAAS,IAC7BjX,KAAK22B,iBAAiBrO,EAAIxM,QAAQsa,SAIrCp2B,KAAKw1B,cACHza,iBAAiB,2BACjB5P,QAASyrB,IACTA,EAAO3f,iBAAiB,SAAWvM,IAClC1K,KAAKg1B,YAAYE,cAAc0B,EAAO9a,QAAQua,UAC7C3rB,EAAEsD,OAAO7H,UAIbnG,KAAKw1B,cACHza,iBAAiB,0BACjB5P,QAASqS,IACTA,EAAMvG,iBAAiB,QAAUvM,IAChC1K,KAAKg1B,YAAYE,cAAc1X,EAAM1B,QAAQua,UAC5C3rB,EAAEsD,OAAO7H,UAIf,CAEA,UAAAqwB,CAAWvB,GACVj1B,KAAKg1B,YAAYC,MAAQA,EACzBj1B,KAAKw1B,cACHza,iBAAiB,4BACjB5P,QAASmd,IACQzM,SAASyM,EAAIxM,QAAQmZ,SACrBA,EAChB3M,EAAInT,UAAUC,IAAI,YAElBkT,EAAInT,UAAUI,OAAO,aAGzB,CAEA,WAAAkhB,CAAYxB,GACXj1B,KAAKg1B,YAAYC,MAAQA,EACzBj1B,KAAKw1B,cACHza,iBAAiB,6BACjB5P,QAASmd,IACQzM,SAASyM,EAAIxM,QAAQmZ,SACrBA,EAChB3M,EAAInT,UAAUC,IAAI,YAElBkT,EAAInT,UAAUI,OAAO,aAGzB,CAEA,UAAAmhB,CAAWzB,GACVj1B,KAAKg1B,YAAYC,MAAQA,EACzBj1B,KAAKw1B,cACHza,iBAAiB,4BACjB5P,QAASmd,IACQzM,SAASyM,EAAIxM,QAAQmZ,SACrBA,EAChB3M,EAAInT,UAAUC,IAAI,YAElBkT,EAAInT,UAAUI,OAAO,aAGzB,CAEA,gBAAAohB,CAAiBP,GAChBp2B,KAAKg1B,YAAYE,cAAc2B,UAAYT,EAC3Cp2B,KAAKw1B,cACHza,iBAAiB,6BACjB5P,QAASmd,IACLA,EAAIxM,QAAQsa,OAASA,EACxB9N,EAAInT,UAAUC,IAAI,YAElBkT,EAAInT,UAAUI,OAAO,aAGzB,CAEA,mBAAMsZ,GACL,MAAMlwB,EAAOqB,KAAKy0B,cAAcC,WAEhC,IACW,QAAT/1B,GAA2B,SAATA,GAA4B,QAATA,IACX,OAA3BqB,KAAKg1B,YAAYC,MAGjB,YADAj1B,KAAK8V,WAAW,0BAIjB,MAAMhP,EAAe,CACpBE,OAAQhH,KAAKg1B,YAAYC,MACzBhuB,SAAUjH,KAAKg1B,YAAY/tB,SAC3BC,QAASlH,KAAKg1B,YAAYE,eAGrB1vB,EAAW,CAChB7G,KAAMA,EACNs2B,MAAOj1B,KAAKg1B,YAAYC,MACxBhuB,SAAUjH,KAAKg1B,YAAY/tB,SAC3BiuB,cAAel1B,KAAKg1B,YAAYE,cAChC9U,WAAW,IAAI5iB,MAAOE,eAGnBsC,KAAKy0B,cAAcK,UACtB90B,KAAKy0B,cAAcK,SAAStvB,GAG7B,IACC,MAAMqB,EACL7G,KAAKy0B,cAAc5tB,UAAY,SAASlI,KAAQnB,KAAKC,cAChDuC,KAAK6S,WAAWjM,qBAAqBC,EAAUC,EACtD,CAAE,MAAOsC,GACR2C,QAAQ3C,MAAM,0CAA2CA,EAC1D,CAEApJ,KAAK4S,IAAIsB,SAAS7G,KAAK,mBAAoB,CAAE8G,OAAQnU,KAAMwF,aAE3DxF,KAAKq1B,eACLr1B,KAAK82B,0BACN,CAEA,oBAAMvB,GACL,GAAIv1B,KAAKy0B,cAAc5tB,SACtB,UACO7G,KAAK6S,WAAW1L,cAAcnH,KAAKy0B,cAAc5tB,SACxD,CAAE,MAAOuC,GACR2C,QAAQ3C,MAAM,2CAA4CA,EAC3D,CAGGpJ,KAAKy0B,cAAcM,WACtB/0B,KAAKy0B,cAAcM,YAEpB/0B,KAAK4S,IAAIsB,SAAS7G,KAAK,mBAAoB,CAAE8G,OAAQnU,OACrDA,KAAKq1B,cACN,CAEA,UAAAvf,CAAW1U,GACV,MAAM21B,EAAW/2B,KAAKw1B,cAAcnhB,cAAc,0BAC9C0iB,GAAUA,EAASxhB,SAEvB,MAAMnM,EAAQmF,SAASqD,cAAc,OACrCxI,EAAMiM,UAAY,wBAClBjM,EAAMyI,YAAczQ,EAEpB,MAAMyW,EAAY7X,KAAKw1B,cAAcnhB,cACpC,2BAEDwD,EAAUpC,WAAWuhB,aAAa5tB,EAAOyO,GAEzC1Y,WAAW,IAAMiK,EAAMmM,SAAU,IAClC,CAEA,wBAAAuhB,GACC,MAAM9e,EAAezJ,SAASqD,cAAc,OAC5CoG,EAAa3C,UAAY,0BACzB2C,EAAalG,UAAY,wIAMzBvD,SAAS7M,KAAK6S,YAAYyD,GAE1B7Y,WAAW,KACV6Y,EAAarD,MAAMuD,QAAU,IAC7BF,EAAarD,MAAMsiB,WAAa,oBAChC93B,WAAW,IAAM6Y,EAAazC,SAAU,MACtC,IACJ,CAEA,YAAA8f,GACKr1B,KAAK8Z,iBACRvL,SAASqJ,oBAAoB,UAAW5X,KAAK8Z,gBAC7C9Z,KAAK8Z,eAAiB,MAGvB,MAAMod,EAAWl3B,KAAKw1B,cAChB2B,EAAan3B,KAAKuT,gBAEpB2jB,IACHA,EAASviB,MAAMuD,QAAU,IACzBgf,EAASviB,MAAMghB,UACkB,WAAhC31B,KAAKy0B,cAAc1hB,SAChB,oCACA,mBACJ5T,WAAW,KACN+3B,GAAYA,EAASzhB,YACxByhB,EAASzhB,WAAWC,YAAYwhB,IAE/B,KACHl3B,KAAKw1B,cAAgB,MAGlB2B,IACHA,EAAWxiB,MAAMuD,QAAU,IAC3B/Y,WAAW,KACNg4B,GAAcA,EAAW1hB,YAC5B0hB,EAAW1hB,WAAWC,YAAYyhB,IAEjC,KACHn3B,KAAKuT,gBAAkB,MAGxBvT,KAAKg1B,YAAc,CAClBC,MAAO,KACPhuB,SAAU,GACViuB,cAAe,CAAA,EACfC,WAAW,EAEb,CAEA,OAAA9e,GACCrW,KAAKq1B,eACLhwB,MAAMgR,SACP,EC3fM,MAAM+gB,UAAkB1kB,EAC9B,WAAA5S,CAAYK,GACXkF,MAAM,IAAKlF,EAASxB,KAAM,OAC3B,CAEA,OAAA2V,GACC,MAAMoO,EAAMnU,SAASqD,cAAc,OAYnC,OAXA8Q,EAAIrN,UAAY,gDAAgDrV,KAAKG,QAAQ4S,WAC7E2P,EAAI5Q,UAAY,0HAMZ9R,KAAKG,QAAQ+S,cAChBjI,OAAOuN,OAAOkK,EAAI/N,MAAO3U,KAAKG,QAAQ+S,cAGhCwP,CACR,CAEA,aAAAlO,GACaxU,KAAKoQ,QAAQiE,cAAc,yBACnC4C,iBAAiB,QAASjX,KAAKmY,UACpC,CAEA,UAAAY,CAAWpO,GACV,MAAM0sB,EAAcr3B,KAAKoQ,SAASiE,cAAc,sBAC5CgjB,IACHA,EAAYxlB,YAAclH,EAE5B,CAEA,cAAAsO,CAAelG,GACd/S,KAAKG,QAAQ4S,SAAWA,EACpB/S,KAAKoQ,UACRpQ,KAAKoQ,QAAQiF,UAAYrV,KAAKoQ,QAAQiF,UAAUxG,QAC/C,mBACA,YAAYkE,KAGf,ECnCM,MAAMukB,EACZ3kB,eAAiB,IAAIjG,IAAI,CACxB,CAAC,SAAU2L,GACX,CAAC,MAAO+e,GACR,CAAC,SAAUpa,GACX,CAAC,SAAUwX,GACX,CAAC,YAAajD,GACd,CAAC,YAAarY,KAGf,eAAOqe,CAAS54B,EAAM64B,GACrB,GAAoB,iBAAT74B,IAAsBA,EAAK8S,OACrC,MAAM,IAAIvM,EAAS,0CAGpB,GAA2B,mBAAhBsyB,EACV,MAAM,IAAItyB,EAAS,+CAGpBlF,KAAKy3B,QAAQ1qB,IAAIpO,EAAM64B,EACxB,CAEA,aAAOE,CAAO/4B,EAAMwB,EAAU,IAC7B,MAAMq3B,EAAcx3B,KAAKy3B,QAAQ5sB,IAAIlM,GAErC,IAAK64B,EAAa,CACjB,MAAMG,EAAiBvpB,MAAM6a,KAAKjpB,KAAKy3B,QAAQ5mB,QAAQ4B,KAAK,MAC5D,MAAM,IAAIvN,EACT,wBAAwBvG,uBAA0Bg5B,IAEpD,CAEA,IACC,OAAO,IAAIH,EAAYr3B,EACxB,CAAE,MAAOiJ,GACR,MAAM,IAAIlE,EACT,oCAAoCvG,OAAUyK,EAAMhI,UACpDgI,EAEF,CACD,CAEA,wBAAOwuB,GACN,OAAOxpB,MAAM6a,KAAKjpB,KAAKy3B,QAAQ5mB,OAChC,CAEA,uBAAOgnB,CAAiBl5B,GACvB,OAAOqB,KAAKy3B,QAAQ3qB,IAAInO,EACzB,CAEA,iBAAOm5B,CAAWn5B,GACjB,OAAOqB,KAAKy3B,QAAQxY,OAAOtgB,EAC5B,CAEA,YAAO6O,GACNxN,KAAKy3B,QAAQjqB,OACd,CAEA,qBAAOuqB,CAAep5B,GACrB,OAAOqB,KAAKy3B,QAAQ5sB,IAAIlM,EACzB,EC9DM,MAAMq5B,EACZ,WAAAl4B,CAAYuH,EAAS,IACpBrH,KAAKqH,OAASrH,KAAKi4B,wBAAwB5wB,GAC3CrH,KAAKk4B,aAAc,EACnBl4B,KAAKy3B,QAAU,IAAI/qB,IACnB1M,KAAKkU,SAAW,IAAI1H,EAEpBxM,KAAK6S,WAAa,IAAItH,EAAW,CAChC1D,OAAQ7H,KAAKqH,OAAOQ,OACpBP,UAAWtH,KAAKqH,OAAOC,UACvB6wB,OAAQn4B,KAAKqH,OAAO8wB,OACpBn3B,aAAchB,KAAKqH,OAAOrG,aAC1BwG,YAAaxH,KAAKqH,OAAOG,YACzBnH,KAAML,KAAKqH,OAAOhH,KAClB+3B,MAAOp4B,KAAKqH,OAAO+wB,MACnB3wB,IAAKzH,KAAKqH,OAAOI,MAGlBzH,KAAK+T,cACN,CAEA,UAAMzL,GACL,GAAItI,KAAKk4B,YACR,MAAO,CAAEG,oBAAoB,GAG9B,IACC,MAAMC,QAAiBt4B,KAAK6S,WAAWvK,KAAKtI,KAAKqH,OAAOG,aAYxD,OAVI8wB,EAASjxB,SACZrH,KAAKqH,OAAS0G,EAAUuqB,EAASjxB,OAAQrH,KAAKqH,SAG/CrH,KAAKk4B,aAAc,EACnBl4B,KAAKkU,SAAS7G,KAAK,kBAAmB,CACrChG,OAAQrH,KAAKqH,OACbrG,aAAcs3B,EAASt3B,eAGjB,CACNk3B,aAAa,EACb7wB,OAAQixB,EAASjxB,QAAU,CAAA,EAC3BrG,aAAcs3B,EAASt3B,aACvBgI,UAAWsvB,EAAStvB,UAEtB,CAAE,MAAOI,GAER,MADApJ,KAAKkU,SAAS7G,KAAK,YAAa,CAAEjE,UAC5B,IAAIlE,EAAS,6BAA6BkE,EAAMhI,UAAWgI,EAClE,CACD,CAEA,YAAAmvB,CAAa55B,EAAO,SAAUwB,EAAU,CAAA,GACvC,IAAKH,KAAKk4B,YACT,MAAM,IAAIhzB,EACT,uEAIF,MAAMY,EAAW4H,EAAW,UACtB8qB,EAAgB,CACrB97B,GAAIoJ,EACJ8M,IAAK5S,KACL6S,WAAY7S,KAAK6S,cACd7S,KAAKqH,UACLlH,GAGJ,IACC,MAAMgU,EAASmjB,EAAcI,OAAO/4B,EAAM65B,GAG1C,OAFAx4B,KAAKy3B,QAAQ1qB,IAAIjH,EAAUqO,GAC3BnU,KAAKkU,SAAS7G,KAAK,iBAAkB,CAAE8G,SAAQxV,SACxCwV,CACR,CAAE,MAAO/K,GACR,MAAM,IAAIlE,EAAS,4BAA4BkE,EAAMhI,UAAWgI,EACjE,CACD,CAEA,SAAAqvB,CAAU/7B,GACT,OAAOsD,KAAKy3B,QAAQ5sB,IAAInO,EACzB,CAEA,sBAAM2J,CAAiBC,EAAU,IAChC,IAAKtG,KAAKk4B,YACT,MAAM,IAAIhzB,EACT,uEAIF,IAEC,aADqBlF,KAAK6S,WAAWxM,iBAAiBC,IACxC/F,MAAQ,EACvB,CAAE,MAAO6I,GAER,MADApJ,KAAKkU,SAAS7G,KAAK,YAAa,CAAEjE,UAC5B,IAAIlE,EACT,mCAAmCkE,EAAMhI,UACzCgI,EAEF,CACD,CAEA,oBAAMsvB,CAAe7xB,EAAU1G,EAAU,IACxC,IAAKH,KAAKk4B,YACT,MAAM,IAAIhzB,EACT,sEAIF,MACMyzB,SADgB34B,KAAKqG,oBACE9C,KAAMq1B,GAAMA,EAAEl8B,KAAOmK,GAElD,IAAK8xB,EACJ,MAAM,IAAIzzB,EACT,mBAAmB2B,8BAIrB,OAAO7G,KAAK64B,WAAW,CACtBhyB,SAAU8xB,EAAaj8B,GACvBg4B,WAAYiE,EAAah6B,KACzBhC,MAAOg8B,EAAah8B,MACpBE,YAAa87B,EAAa97B,YAC1B83B,SAAUgE,EAAa/5B,UACvBg2B,UAAW+D,EAAa95B,WACxBg2B,gBAAiB8D,EAAaG,aAC3B34B,GAEL,CAEA,UAAA04B,CAAW14B,EAAU,IACpB,IAAKH,KAAKk4B,YACT,MAAM,IAAIhzB,EACT,sEAIF,MAAM6zB,EAAe/4B,KAAKu4B,aAAa,SAAU,CAChD1xB,SAAU1G,EAAQ0G,SAClB6tB,WAAYv0B,EAAQu0B,YAAcv0B,EAAQxB,MAAQ,MAClDoU,SAAU5S,EAAQ4S,UAAY,eAC9BoD,MAAOhW,EAAQgW,OAASnW,KAAKqH,OAAO8O,OAAS,QAC7CxZ,MAAOwD,EAAQxD,MACfE,YAAasD,EAAQtD,YACrB83B,SAAUx0B,EAAQw0B,SAClBC,UAAWz0B,EAAQy0B,UACnBC,gBAAiB10B,EAAQ00B,gBACzBC,SAAU30B,EAAQ20B,SAClBC,UAAW50B,EAAQ40B,YAMpB,OAHAgE,EAAa/kB,QACb+kB,EAAarkB,OAENqkB,CACR,CAEA,aAAAC,CAAc74B,EAAU,IACvB,IAAKH,KAAKk4B,YACT,MAAM,IAAIhzB,EACT,wEAIF,MAAM+zB,EAAkBj5B,KAAKu4B,aAAa,YAAa,CACtDxlB,SAAU5S,EAAQ4S,UAAY,eAC9BoD,MAAOhW,EAAQgW,OAASnW,KAAKqH,OAAO8O,OAAS,QAC7CxZ,MAAOwD,EAAQxD,OAAS,aACxB4c,YAAapZ,EAAQoZ,aAAe,aACpCC,WAAiC,IAAtBrZ,EAAQqZ,UACnBkC,eAAgBvb,EAAQub,gBAAkB,cAC1CK,iBAAkB5b,EAAQ4b,iBAC1BC,aAAc7b,EAAQ6b,aACtBE,aAAc/b,EAAQ+b,eAMvB,OAHA+c,EAAgBjlB,QAChBilB,EAAgBvkB,OAETukB,CACR,CAEA,mBAAM/4B,CAAcC,EAAU,IAC7B,IAAKH,KAAKk4B,YACT,MAAM,IAAIhzB,EACT,0EAIF,IAEC,aADqBlF,KAAK6S,WAAW3S,cAAcC,IACrCI,MAAQ,EACvB,CAAE,MAAO6I,GAER,MADApJ,KAAKkU,SAAS7G,KAAK,YAAa,CAAEjE,UAC5B,IAAIlE,EAAS,+BAA+BkE,EAAMhI,UAAWgI,EACpE,CACD,CAEA,aAAA8vB,GACC,OAAO9qB,MAAM6a,KAAKjpB,KAAKy3B,QAAQ0B,SAChC,CAEA,aAAAC,CAAc18B,GACb,MAAMyX,EAASnU,KAAKy3B,QAAQ5sB,IAAInO,GAChC,QAAIyX,IACHA,EAAOkC,UACPrW,KAAKy3B,QAAQxY,OAAOviB,GACpBsD,KAAKkU,SAAS7G,KAAK,iBAAkB,CAAEvH,SAAUpJ,KAC1C,EAGT,CAEA,iBAAA28B,GACC,IAAK,MAAMllB,KAAUnU,KAAKy3B,QAAQ0B,SACjChlB,EAAOkC,UAERrW,KAAKy3B,QAAQjqB,QACbxN,KAAKkU,SAAS7G,KAAK,kBACpB,CAEA,YAAAisB,CAAapjB,GACZ,MAAMqjB,EAAY,IAAKv5B,KAAKqH,QAC5BrH,KAAKqH,OAASrH,KAAKi4B,wBAAwB/hB,EAAWlW,KAAKqH,QAE3D,IAAK,MAAM8M,KAAUnU,KAAKy3B,QAAQ0B,SACjChlB,EAAO8B,mBAAmBjW,KAAKqH,QAGhCrH,KAAKkU,SAAS7G,KAAK,iBAAkB,CACpCksB,YACArjB,UAAWlW,KAAKqH,QAElB,CAEA,cAAAkC,CAAe/B,GACdxH,KAAKqH,OAAOG,YAAcA,EACtBxH,KAAK6S,YACR7S,KAAK6S,WAAWtJ,eAAe/B,GAEhCxH,KAAKkU,SAAS7G,KAAK,eAAgB,CAAE7F,eACtC,CAEA,cAAAiC,GACC,OACCzJ,KAAKqH,OAAOG,cACXxH,KAAK6S,WAAa7S,KAAK6S,WAAWpJ,iBAAmB,KAExD,CAEA,kBAAM+vB,CAAaC,EAAiB,MAQnC,OAPAz5B,KAAK6S,WAAWnJ,eAChB1J,KAAKk4B,aAAc,EAEfuB,GACHz5B,KAAKuJ,eAAekwB,GAGdz5B,KAAKsI,MACb,CAEA,EAAAqE,CAAGC,EAAOC,GAET,OADA7M,KAAKkU,SAASvH,GAAGC,EAAOC,GACjB7M,IACR,CAEA,GAAAgN,CAAIJ,EAAOC,GAEV,OADA7M,KAAKkU,SAASlH,IAAIJ,EAAOC,GAClB7M,IACR,CAEA,IAAAsN,CAAKV,EAAOC,GAEX,OADA7M,KAAKkU,SAAS5G,KAAKV,EAAOC,GACnB7M,IACR,CAEA,IAAAqN,CAAKT,EAAOrM,GAEX,OADAP,KAAKkU,SAAS7G,KAAKT,EAAOrM,GACnBP,IACR,CAEA,OAAAqW,GACCrW,KAAKq5B,oBACLr5B,KAAKkU,SAASwlB,qBACd15B,KAAK6S,WAAWnJ,eAChB1J,KAAKk4B,aAAc,EACnBl4B,KAAKkU,SAAS7G,KAAK,gBACpB,CAEA,wBAAAssB,CAAyBC,EAAe,IACvC,MAAMjjB,EAA4B,GAAfijB,EAAoB,GAAK,GAAK,IAC3Cn8B,EAAMD,KAAKC,MAEjB,GAAIuC,KAAKqH,OAAOuP,iBACf,IAIC,GAAInZ,EAHqB,IAAID,KAC5BwC,KAAKqH,OAAOuP,kBACXC,UAC2BF,EAC5B,OAAO,CAET,CAAE,MAAOjM,GAET,CAGD,IACC,MAAM6L,EAAa,sBAAsBvW,KAAKqH,OAAOC,YAC/C0C,EAASJ,aAAaK,QAAQsM,GACpC,IAAKvM,EAAQ,OAAO,EAGpB,OAAOvM,EADMkE,KAAKuI,MAAMF,GACNyM,YAAcE,CACjC,CAAE,MAAOjM,GACR,OAAO,CACR,CACD,CAEA,+BAAAmvB,GACC,IACC,MAAMtjB,EAAa,sBAAsBvW,KAAKqH,OAAOC,YACrDsC,aAAaS,WAAWkM,GACxBvW,KAAKkU,SAAS7G,KAAK,2BACpB,CAAE,MAAO3C,GACRqB,QAAQ2K,KAAK,qCAAsChM,EACpD,CACD,CAEA,kBAAAovB,GACC,GAAsB,oBAAXvzB,OACV,MAAO,aAGR,MAAMwzB,EAAWxzB,OAAOC,SAASuzB,SAAS53B,cAE1C,OACC43B,EAASn6B,SAAS,YAClBm6B,EAASn6B,SAAS,cAClBm6B,EAASn6B,SAAS,cAClBm6B,EAASn6B,SAAS,UAEX,UAGD,YACR,CAEA,uBAAAq4B,CAAwB/hB,EAAW8jB,EAAiB,IACnD,MAaMC,EAAelsB,EACpBA,EAdqB,CACrBlG,OAAQ,KACRP,UAAW,KACXE,YAAa,KACbuL,SAAU,eACVoD,MAAO,QACP3U,QAAS,UACTwR,UAAU,EACVolB,OAAO,EACP/3B,MAAM,EACNoH,IAAKzH,KAAK85B,sBAIeE,GACzB9jB,GAOD,GAJKA,EAAUzO,KAAQuyB,EAAevyB,MACrCwyB,EAAaxyB,IAAMzH,KAAK85B,uBAGpBG,EAAa3yB,UACjB,MAAM,IAAIvB,EAAY,6CAOvB,OAJIk0B,EAAazyB,aAChBxH,KAAKk6B,qBAAqBD,EAAazyB,aAGjCyyB,CACR,CAEA,oBAAAC,CAAqB1yB,GACpB,IAAKA,EAAY2pB,UAAY3pB,EAAY/C,MACxC,MAAM,IAAIsB,EACT,uDAIF,MAAMo0B,EAAiB,CACtBhJ,QAAS,SACT1sB,MAAO,SACPvH,KAAM,SACNk9B,cAAe,SACfx1B,QAAS,UAGV,IAAK,MAAOuF,EAAKkwB,KAAiBpvB,OAAOC,QAAQivB,GAChD,GAAI3yB,EAAY2C,WAAe3C,EAAY2C,KAASkwB,EACnD,MAAM,IAAIt0B,EACT,uBAAuBoE,uBAAyBkwB,KAIpD,CAEA,YAAAtmB,GACC/T,KAAKu4B,aAAev4B,KAAKu4B,aAAavhB,KAAKhX,MAC3CA,KAAKo5B,cAAgBp5B,KAAKo5B,cAAcpiB,KAAKhX,MAC7CA,KAAKs5B,aAAet5B,KAAKs5B,aAAatiB,KAAKhX,KAC5C,CAEA,aAAO03B,CAAOrwB,GACb,OAAO,IAAI2wB,EAAY3wB,EACxB,CAEA,0BAAaizB,CAAcjzB,GAC1B,MAAMuL,EAAM,IAAIolB,EAAY3wB,GAE5B,aADMuL,EAAItK,OACHsK,CACR,CAEA,iCAAO2nB,CAA2BC,GACjC,OAAKA,EAEE,CACNrJ,QAASqJ,EAASC,KAAOD,EAAS99B,IAAM89B,EAASrJ,QACjD1sB,MAAO+1B,EAAS/1B,MAChBvH,KAAMs9B,EAASt9B,MAAQs9B,EAASE,cAAgBF,EAAS3uB,UACzDuuB,cAAe,CACdO,KAAMH,EAASG,KACfC,KAAMJ,EAASI,MAAQJ,EAASK,cAAcD,QAC1CJ,EAASJ,eAAiB,IAE/Bx1B,QACC41B,EAAS51B,SAAW41B,EAASM,aAC1B,CACAp+B,GAAI89B,EAAS51B,SAASlI,IAAM89B,EAASM,cAAcp+B,GACnDQ,KAAMs9B,EAAS51B,SAAS1H,MAAQs9B,EAASM,cAAc59B,KACvD69B,cAAeP,EAAS51B,SAASm2B,oBAEjCnqB,GAlBiB,IAoBvB,ECzaD,SAASoqB,IACR,GACqB,oBAAbzsB,WACNA,SAAS8F,cAAc,wBACvB,CACD,MAAMM,EAAQpG,SAASqD,cAAc,SACrC+C,EAAMjY,GAAK,sBACXiY,EAAM9C,YClBNopB,8j1DDmBA1sB,SAAS2sB,KAAK3mB,YAAYI,EAC3B,CACD,CAEA,SAASwmB,IACR,GAAsB,oBAAX50B,QAA0BA,OAAO60B,kBAAmB,CAC9DJ,IAEA,MAAM3zB,EAAS,IAAKd,OAAO60B,mBACrBxoB,EAAM,IAAIolB,EAAY3wB,GAE5BuL,EACEtK,OACA+yB,KAAM/C,IAGN,GAFA/xB,OAAOyxB,YAAYsD,SAAW1oB,EAE1BrM,OAAO60B,kBAAkBG,WAAY,EACxBntB,MAAMC,QAAQ9H,OAAO60B,kBAAkBG,YACpDh1B,OAAO60B,kBAAkBG,WACzB,CAACh1B,OAAO60B,kBAAkBG,aAErBpwB,QAASqwB,IAChB,IACgB5oB,EAAI2lB,aAClBiD,EAAa78B,MAAQ,SACrB68B,GAEMxnB,MAAMwnB,EAAa1oB,UAC3B,CAAE,MAAO1J,GACR2C,QAAQ3C,MAAM,yCAA0CA,EACzD,GAEF,CAEA,GAA2B,oBAAhBqyB,YAA6B,CACvC,MAAM7uB,EAAQ,IAAI6uB,YAAY,mBAAoB,CACjDC,OAAQ,CAAE9oB,MAAKvL,SAAQixB,cAExB/xB,OAAOo1B,cAAc/uB,EACtB,IAEAgvB,MAAOxyB,IAGP,GAFA2C,QAAQ3C,MAAM,4CAA6CA,GAEhC,oBAAhBqyB,YAA6B,CACvC,MAAM7uB,EAAQ,IAAI6uB,YAAY,mBAAoB,CACjDC,OAAQ,CAAEtyB,QAAO/B,SAAQw0B,MAAO,oBAEjCt1B,OAAOo1B,cAAc/uB,EACtB,GAEH,CACD,CAYK,MAACkvB,EAAoB,CACzB9D,cACAtlB,aACA2F,eACAa,kBACAke,YACApa,eACAwX,eACAjD,kBACA+F,gBACA9qB,WACAjB,aACArG,WACDK,SAACA,EACAK,cACAG,cACAE,kBACA81B,UACArE,OAASrwB,IACR2zB,IACO,IAAIhD,EAAY3wB,IAExB20B,QAAS,QACTV,SAAU,KAEVW,QAAS,IAAMC,QAAQJ,EAAkBR,UACzCa,YAAa,IAAML,EAAkBR,SAErC/xB,eAAiB/B,IACZs0B,EAAkBR,SACrBQ,EAAkBR,SAAS/xB,eAAe/B,GAEpB,oBAAXjB,SACVA,OAAO61B,uBAAyB50B,IAKnC60B,aAAc57B,MAAO4G,EAAQG,KAC5BwzB,IACA,MAAMsB,EAAa,IAAKj1B,EAAQG,eAC1BoL,EAAM,IAAIolB,EAAYsE,GAO5B,aANM1pB,EAAItK,OAEY,oBAAX/B,SACVA,OAAOyxB,YAAYsD,SAAW1oB,GAGxBA,GAGR2pB,QAAU1vB,IACa,oBAAXtG,SACNu1B,EAAkBG,UACrBpvB,EAASivB,EAAkBR,UAE3B/0B,OAAO0Q,iBACN,mBACCrK,IACAC,EAASD,EAAM8uB,OAAO9oB,IAAKhG,EAAM8uB,SAElC,CAAEpuB,MAAM,MAMZkvB,QAAU3vB,IACa,oBAAXtG,QACVA,OAAO0Q,iBAAiB,mBAAqBrK,IAC5CC,EAASD,EAAM8uB,OAAOtyB,MAAOwD,EAAM8uB,WAKtCe,mBAAoBzE,EAAYuC,4BAGX,oBAAXh0B,SACVA,OAAOyxB,YAAc8D,EAxFG,oBAAbvtB,WACkB,YAAxBA,SAASuiB,WACZviB,SAAS0I,iBAAiB,mBAAoBkkB,GAE9Ch8B,WAAWg8B,EAAU"}
|