@adzen/doohbot 1.0.7 → 1.0.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"adzen-doohbot.mjs","sources":["../../../src/lib/shared/material/material.module.ts","../../../src/lib/const/doohbot-constant.ts","../../../src/lib/core/config/doohbot-config.default.ts","../../../src/lib/core/config/doohbot-config.token.ts","../../../src/lib/core/config/doohbot-config.service.ts","../../../src/lib/core/utils/logger.service.ts","../../../src/lib/core/http/http.service.ts","../../../src/lib/core/http/http-stream.service.ts","../../../src/lib/app/chat/services/chat-api.service.ts","../../../src/lib/shared/snackbar/snackbar.component.ts","../../../src/lib/shared/snackbar/snackbar.component.html","../../../src/lib/shared/snackbar/snackbar.service.ts","../../../src/lib/app/chat/services/chat-history.service.ts","../../../src/lib/core/models/doohbot-config.model.ts","../../../src/lib/core/environments/environment.ts","../../../src/lib/core/auth/storage.service.ts","../../../src/lib/core/auth/auth.service.ts","../../../src/lib/core/services/markdown.service.ts","../../../src/lib/app/chat/chat.service.ts","../../../src/lib/app/chat/components/chat-button/chat-button.component.ts","../../../src/lib/app/chat/components/chat-button/chat-button.component.html","../../../src/lib/predefined_messages.ts","../../../src/lib/app/chat/components/chat-input/chat-input.component.ts","../../../src/lib/app/chat/components/chat-input/chat-input.component.html","../../../src/lib/shared/confirmation-dialog/confirmation-dialog.component.ts","../../../src/lib/shared/confirmation-dialog/confirmation-dialog.component.html","../../../src/lib/shared/input-dialog/input-dialog.component.ts","../../../src/lib/shared/input-dialog/input-dialog.component.html","../../../src/lib/shared/confirmation-dialog/dialog.service.ts","../../../src/lib/app/chat/components/chat-history/chat-history.component.ts","../../../src/lib/app/chat/components/chat-history/chat-history.component.html","../../../src/lib/app/personalization/personalization.service.ts","../../../src/lib/core/services/theme.service.ts","../../../src/lib/app/chat/components/chat-header/chat-header.component.ts","../../../src/lib/app/chat/components/chat-header/chat-header.component.html","../../../src/lib/app/login/login-form.component.ts","../../../src/lib/app/login/login-form.component.html","../../../src/lib/app/chat/components/chat-footer/chat-footer.component.ts","../../../src/lib/app/chat/components/chat-footer/chat-footer.component.html","../../../src/lib/shared/chips/chips.component.ts","../../../src/lib/shared/chips/chips.component.html","../../../src/lib/app/personalization/sections/preferences/preferences-section.component.ts","../../../src/lib/app/personalization/sections/preferences/preferences-section.component.html","../../../src/lib/app/personalization/sections/terms/terms-section.component.ts","../../../src/lib/app/personalization/sections/terms/terms-section.component.html","../../../src/lib/app/personalization/sections/account/account-section.component.ts","../../../src/lib/app/personalization/sections/account/account-section.component.html","../../../src/lib/app/personalization/sections/instruction/instruction-section.component.ts","../../../src/lib/app/personalization/sections/instruction/instruction-section.component.html","../../../src/lib/app/personalization/personalization-dialog.component.ts","../../../src/lib/app/personalization/personalization-dialog.component.html","../../../src/lib/const/utf8.ts","../../../src/lib/shared/utils/typewriter.ts","../../../src/lib/app/chat/components/chat-message/chat-message.component.ts","../../../src/lib/app/chat/components/chat-message/chat-message.component.html","../../../src/lib/app/chat/components/chat-message-container/chat-message-container.component.ts","../../../src/lib/app/chat/components/chat-message-container/chat-message-container.component.html","../../../src/lib/core/directives/draggable-dialog.directive.ts","../../../src/lib/core/directives/resizable-dialog.directive.ts","../../../src/lib/shared/notification-banner/notification-banner.component.ts","../../../src/lib/shared/notification-banner/notification-banner.component.html","../../../src/lib/core/directives/fullscreen.directive.ts","../../../src/lib/app/chat/components/chat-window/chat-window.component.ts","../../../src/lib/app/chat/components/chat-window/chat-window.component.html","../../../src/lib/core/services/license.service.ts","../../../src/lib/doohbot.component.ts","../../../src/lib/doohbot.component.html","../../../src/lib/doohbot.service.ts","../../../src/lib/core/config/doohbot-config.resolver.ts","../../../src/lib/core/interceptors/auth.interceptor.ts","../../../src/lib/core/interceptors/http-logging.interceptor.ts","../../../src/lib/core/services/global-error-handler.ts","../../../src/lib/doohbot.providers.ts","../../../src/public-api.ts","../../../src/adzen-doohbot.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\n\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\n\r\nconst MATERIAL_MODULES = [\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n MatMenuModule,\r\n MatTooltipModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatSlideToggleModule,\r\n MatDividerModule,\r\n MatSnackBarModule,\r\n MatProgressSpinnerModule,\r\n];\r\n\r\n@NgModule({\r\n imports: MATERIAL_MODULES,\r\n exports: MATERIAL_MODULES,\r\n})\r\nexport class SharedMaterialModule {}\r\n","export const doohbotConst = {\r\n //LIVE ASSETS\r\n // APP_LOGO: 'https://iili.io/f3qSQJn.md.png',\r\n // USER_AVATAR: 'https://iili.io/KpEYoCP.png',\r\n // BOT_AVATAR: 'https://iili.io/KpER0Ge.png',\r\n\r\n // ==================\r\n\r\n //png ASSETS\r\n // APP_LOGO: 'assets/logo.svg',\r\n // APP_TEXT_LOGO: 'assets/title.svg',\r\n // APP_HEADER_LOGO: 'assets/header_logo.svg',\r\n // USER_AVATAR: 'assets/profile.png',\r\n // BOT_AVATAR: 'assets/bot.png',\r\n\r\n // ==================\r\n\r\n // Application Constants Text\r\n appTitle: 'Doohbot',\r\n appSubtitle: 'Welcome to Doohbot',\r\n welcomeDescription:\r\n 'We provide a powerful live chat platform to help businesses connect with their customers, offer support, and increase sales through real-time conversations.',\r\n hintText: 'How can I assist you today?',\r\n\r\n // ==================\r\n\r\n // base64_ASSETS\r\n\r\n appLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDE1MCAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc2XzE0MzgpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc2XzE0MzgpIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSI2LjAwMzA2IiB5MT0iNiIgeDI9IjE0Mi45NzIiIHkyPSIxNDMuMjI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSIxNDMuMjI3IiB5MT0iNzYuODA0NiIgeDI9IjI2LjAwMSIgeTI9IjEyMi45NjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzNzZfMTQzOCIgeDE9IjU4LjI1NDEiIHkxPSI1OC4xNjciIHgyPSI1My45MTE3IiB5Mj0iMTMyLjk1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzIzNzZfMTQzOCI+CjxwYXRoIGQ9Ik02IDZIMTEzLjIyN0MxMjkuNzk1IDYgMTQzLjIyNyAxOS40MzE1IDE0My4yMjcgMzZWMTEyLjk3NUMxNDMuMjI3IDEyOS41NDQgMTI5Ljc5NSAxNDIuOTc1IDExMy4yMjcgMTQyLjk3NUg2VjZaIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=',\r\n appTextLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDc3IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgNDc3IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNDUzLjkzMiA4Ny4wMjZDNDUyLjI0OSA4Ny4wMjYgNDUxLjI4NyA4Ni40MjUgNDUwLjA4NSA4NS4yMjI5TDQ0My43MTQgNzkuODEzNkM0NDIuNTEyIDc4LjYxMTUgNDQxLjkxMSA3Ny4yODkyIDQ0MS45MTEgNzUuNDg2MVY0MC44NjYySDQzMy42MTdWMzIuNDUxNkw0NDkuMTI0IDE1LjAyMTVINDUzLjIxMVYzMS4yNDk2SDQ3MC42NDFWNDAuODY2Mkg0NTMuMjExVjc2LjY4ODJINDcxLjAwMlY4Ny4wMjZINDUzLjkzMloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTM3NS44MTkgODcuMDE4N0MzNzQuNjE3IDg3LjAxODcgMzczLjA1NCA4Ni42NTggMzcxLjQ5MiA4NS4wOTUzTDM2Ni4yMDIgNzkuODA2MkMzNjUuMTIgNzguNjA0MSAzNjQuNjQgNzcuMDQxNCAzNjQuNjQgNzUuNTk4OVY0Mi42NjE5QzM2NC42NCA0MC45NzkgMzY1LjI0MSAzOS41MzY1IDM2Ni4yMDIgMzguNDU0N0wzNzEuNDkyIDMzLjE2NTVDMzcyLjkzNCAzMS43MjMgMzc0LjQ5NyAzMS4yNDIyIDM3NS44MTkgMzEuMjQyMkg0MTAuNjhDNDEyLjM2MyAzMS4yNDIyIDQxMy42ODUgMzEuODQzMiA0MTQuODg3IDMzLjA0NTNMNDIwLjI5NiAzOC4zMzQ0QzQyMS42MTkgMzkuNjU2NyA0MjIuMSA0MC45NzkgNDIyLjEgNDIuNjYxOVY3NS41OTg5QzQyMi4xIDc3LjI4MTggNDIxLjYxOSA3OC42MDQxIDQyMC4yOTYgNzkuOTI2NEw0MTQuODg3IDg1LjIxNTVDNDEzLjY4NSA4Ni40MTc2IDQxMi4zNjMgODcuMDE4NyA0MTAuNjggODcuMDE4N0gzNzUuODE5Wk0zNzUuOTM5IDc2LjgwMUg0MTAuOFY0MS40NTk5SDM3NS45MzlWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzQ5LjY0NCAzOC40NTYxQzM1MC44NDYgMzkuNzc4NCAzNTEuNDQ3IDQxLjEwMDcgMzUxLjQ0NyA0Mi43ODM2Vjc1LjYwMDRDMzUxLjQ0NyA3Ny4yODMzIDM1MC44NDYgNzguNjA1NiAzNDkuNjQ0IDc5LjkyNzlMMzQ0LjIzNCA4NS4yMTdDMzQzLjAzMiA4Ni41MzkzIDM0MS40NyA4Ny4wMjAxIDMzOS45MDcgODcuMDIwMUgzMTQuOTAzQzMxMi42MTkgODcuMDIwMSAzMTEuMjk3IDg2LjQxOTEgMzA5LjQ5NCA4NC40OTU4TDMwNi4xMjggODAuODg5NVY4Ny4wMjAxSDI5NC45NDlWNkgzMDYuMTI4VjM3LjM3NDNMMzA5LjQ5NCAzMy44ODgyQzMxMS40MTcgMzEuODQ0NyAzMTIuNjE5IDMxLjM2MzkgMzE0LjkwMyAzMS4zNjM5SDMzOS45MDdDMzQxLjU5IDMxLjM2MzkgMzQzLjAzMiAzMS44NDQ3IDM0NC4yMzQgMzMuMDQ2OEwzNDkuNjQ0IDM4LjQ1NjFaTTM0MC4xNDcgNzYuODAyNVY0MS40NjEzSDMwNi4xMjhWNzYuODAyNUgzNDAuMTQ3WiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMjc2LjUxMiAzOC40NTYxQzI3Ny43MTQgMzkuNzc4NCAyNzguMzE1IDQxLjEwMDcgMjc4LjMxNSA0Mi43ODM2Vjg3LjAyMDFIMjY3LjAxNlY0MS40NjEzSDIzMi44NzZWODcuMDIwMUgyMjEuNjk3VjZIMjMyLjg3NlYzNy40OTQ1TDIzNi4zNjIgMzMuODg4MkMyMzguNDA2IDMxLjg0NDcgMjM5LjQ4OCAzMS4zNjM5IDI0MS43NzIgMzEuMzYzOUgyNjYuNzc1QzI2OC40NTggMzEuMzYzOSAyNjkuOTAxIDMxLjg0NDcgMjcxLjEwMyAzMy4wNDY4TDI3Ni41MTIgMzguNDU2MVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTE2MC4wNTUgODcuMDE4N0MxNTguODUzIDg3LjAxODcgMTU3LjI5IDg2LjY1OCAxNTUuNzI3IDg1LjA5NTNMMTUwLjQzOCA3OS44MDYyQzE0OS4zNTYgNzguNjA0MSAxNDguODc1IDc3LjA0MTQgMTQ4Ljg3NSA3NS41OTg5VjQyLjY2MTlDMTQ4Ljg3NSA0MC45NzkgMTQ5LjQ3NyAzOS41MzY1IDE1MC40MzggMzguNDU0N0wxNTUuNzI3IDMzLjE2NTVDMTU3LjE3IDMxLjcyMyAxNTguNzMzIDMxLjI0MjIgMTYwLjA1NSAzMS4yNDIySDE5NC45MTZDMTk2LjU5OCAzMS4yNDIyIDE5Ny45MjEgMzEuODQzMiAxOTkuMTIzIDMzLjA0NTNMMjA0LjUzMiAzOC4zMzQ0QzIwNS44NTUgMzkuNjU2NyAyMDYuMzM1IDQwLjk3OSAyMDYuMzM1IDQyLjY2MTlWNzUuNTk4OUMyMDYuMzM1IDc3LjI4MTggMjA1Ljg1NSA3OC42MDQxIDIwNC41MzIgNzkuOTI2NEwxOTkuMTIzIDg1LjIxNTVDMTk3LjkyMSA4Ni40MTc2IDE5Ni41OTggODcuMDE4NyAxOTQuOTE2IDg3LjAxODdIMTYwLjA1NVpNMTYwLjE3NSA3Ni44MDFIMTk1LjAzNlY0MS40NTk5SDE2MC4xNzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNODguOTE0OCA4Ny4wMTg3Qzg3LjcxMjcgODcuMDE4NyA4Ni4xNSA4Ni42NTggODQuNTg3MyA4NS4wOTUzTDc5LjI5ODEgNzkuODA2MkM3OC4yMTYyIDc4LjYwNDEgNzcuNzM1NCA3Ny4wNDE0IDc3LjczNTQgNzUuNTk4OVY0Mi42NjE5Qzc3LjczNTQgNDAuOTc5IDc4LjMzNjQgMzkuNTM2NSA3OS4yOTgxIDM4LjQ1NDdMODQuNTg3MyAzMy4xNjU1Qzg2LjAyOTggMzEuNzIzIDg3LjU5MjUgMzEuMjQyMiA4OC45MTQ4IDMxLjI0MjJIMTIzLjc3NUMxMjUuNDU4IDMxLjI0MjIgMTI2Ljc4MSAzMS44NDMyIDEyNy45ODMgMzMuMDQ1M0wxMzMuMzkyIDM4LjMzNDRDMTM0LjcxNCAzOS42NTY3IDEzNS4xOTUgNDAuOTc5IDEzNS4xOTUgNDIuNjYxOVY3NS41OTg5QzEzNS4xOTUgNzcuMjgxOCAxMzQuNzE0IDc4LjYwNDEgMTMzLjM5MiA3OS45MjY0TDEyNy45ODMgODUuMjE1NUMxMjYuNzgxIDg2LjQxNzYgMTI1LjQ1OCA4Ny4wMTg3IDEyMy43NzUgODcuMDE4N0g4OC45MTQ4Wk04OS4wMzUgNzYuODAxSDEyMy44OTZWNDEuNDU5OUg4OS4wMzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNNTEuMTk4NiA2SDYyLjM3OFY4Ny4wMjAxSDUxLjE5ODZWODAuODg5NUw0Ny44MzI3IDg0LjQ5NThDNDYuMDI5NiA4Ni40MTkxIDQ0LjcwNzMgODcuMDIwMSA0Mi40MjMzIDg3LjAyMDFIMTcuNDE5OUMxNS44NTcxIDg3LjAyMDEgMTQuMjk0NCA4Ni41MzkzIDEzLjA5MjMgODUuMjE3TDcuODAzMTQgNzkuOTI3OUM2LjQ4MDg0IDc4LjYwNTYgNiA3Ny4yODMzIDYgNzUuNjAwNFY0Mi43ODM2QzYgNDEuMTAwNyA2LjQ4MDg0IDM5Ljc3ODQgNy44MDMxNCAzOC40NTYxTDEzLjA5MjMgMzMuMDQ2OEMxNC4yOTQ0IDMxLjg0NDcgMTUuNzM2OSAzMS4zNjM5IDE3LjQxOTkgMzEuMzYzOUg0Mi40MjMzQzQ0LjcwNzMgMzEuMzYzOSA0NS45MDk0IDMxLjg0NDcgNDcuODMyNyAzMy44ODgyTDUxLjE5ODYgMzcuMzc0M1Y2Wk0xNy4xNzk0IDc2LjgwMjVINTEuMTk4NlY0MS40NjEzSDE3LjE3OTRWNzYuODAyNVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTIxLjgzMyA1OC4xNTYySDI3LjQyMTNWNjMuNzQ0NUgyMS44MzNWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTMxLjE0NiA1OC4xNTYySDM2LjczNDNWNjMuNzQ0NUgzMS4xNDZWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTQwLjQ1ODUgNTguMTU2Mkg0Ni4wNDY4VjYzLjc0NDVINDAuNDU4NVY1OC4xNTYyWiIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzg3LjA4MiIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iNDAwLjcxMyIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzkzLjE5MiIgY3k9IjkuOTE4MjgiIHJ4PSIzLjcwNTQxIiByeT0iMy43MDUzOSIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzgwLjIyNCAyOS4zNjkxQzM4MC4yMjQgMjguMTAyNCAzODEuNTUxIDI3LjAzMjQgMzgzLjkxMyAyNi4xMzY2QzM4Ni4yNzUgMjUuMjQwOSAzODkuNDc5IDI0LjczNzcgMzkyLjgxOSAyNC43Mzc3QzM5Ni4xNiAyNC43Mzc3IDM5OS4zNjMgMjUuMjQwOSA0MDEuNzI1IDI2LjEzNjZDNDA0LjA4OCAyNy4wMzI0IDQwNS4yMzQgMjguMTAyNCA0MDUuMjM0IDI5LjM2OTFIMzkyLjcyOUgzODAuMjI0WiIgZmlsbD0iIzI4MDBGRiIvPgo8cmVjdCB4PSIzOTEuMzQiIHk9IjEwLjg0MzgiIHdpZHRoPSIzLjcwNTQxIiBoZWlnaHQ9IjE1Ljc0NzkiIGZpbGw9IiMyODAwRkYiLz4KPC9zdmc+Cg==',\r\n appHeaderLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjYzIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDY2MyAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc0XzE1NDYpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYpIi8+CjwvZz4KPHBhdGggZD0iTTYzMi40MzggNTguMDA3OEg2NDkuODY3VjY3LjYyNEg2MzIuNDM4VjEwMy40NDZINjUwLjIyOVYxMTMuNzg0SDYzMy4xNThDNjMxLjQ3NiAxMTMuNzg0IDYzMC41MTQgMTEzLjE4MiA2MjkuMzEyIDExMS45OEw2MjIuOTQgMTA2LjU3MUM2MjEuNzM5IDEwNS4zNjkgNjIxLjEzOCAxMDQuMDQ3IDYyMS4xMzggMTAyLjI0NFY2Ny42MjRINjEyLjg0NFY1OS4yMDlMNjI4LjM1MSA0MS43NzkzSDYzMi40MzhWNTguMDA3OFpNMjQxLjYwNCAxMTMuNzc4SDIzMC40MjVWMTA3LjY0N0wyMjcuMDYgMTExLjI1NEMyMjUuMjU2IDExMy4xNzcgMjIzLjkzMyAxMTMuNzc4IDIyMS42NDkgMTEzLjc3OEgxOTYuNjQ2QzE5NS4wODQgMTEzLjc3OCAxOTMuNTIxIDExMy4yOTcgMTkyLjMxOSAxMTEuOTc1TDE4Ny4wMjkgMTA2LjY4NkMxODUuNzA3IDEwNS4zNjMgMTg1LjIyNyAxMDQuMDQxIDE4NS4yMjcgMTAyLjM1OFY2OS41NDFDMTg1LjIyNyA2Ny44NTg0IDE4NS43MDcgNjYuNTM2IDE4Ny4wMjkgNjUuMjEzOUwxOTIuMzE5IDU5LjgwNDdDMTkzLjUyMSA1OC42MDI3IDE5NC45NjQgNTguMTIyMSAxOTYuNjQ2IDU4LjEyMjFIMjIxLjY0OUMyMjMuOTMzIDU4LjEyMjEgMjI1LjEzNiA1OC42MDMgMjI3LjA2IDYwLjY0NjVMMjMwLjQyNSA2NC4xMzE4VjMyLjc1NzhIMjQxLjYwNFYxMTMuNzc4Wk00MTIuMTAzIDY0LjI1Mkw0MTUuNTg5IDYwLjY0NjVDNDE3LjYzMiA1OC42MDMgNDE4LjcxNCA1OC4xMjIxIDQyMC45OTggNTguMTIyMUg0NDYuMDAyQzQ0Ny42ODUgNTguMTIyMSA0NDkuMTI3IDU4LjYwMjcgNDUwLjMyOSA1OS44MDQ3TDQ1NS43MzggNjUuMjEzOUM0NTYuOTQgNjYuNTM2IDQ1Ny41NDIgNjcuODU4MyA0NTcuNTQyIDY5LjU0MVYxMTMuNzc4SDQ0Ni4yNDJWNjguMjE4OEg0MTIuMTAzVjExMy43NzhINDAwLjkyNFYzMi43NTc4SDQxMi4xMDNWNjQuMjUyWk00ODUuMzU0IDY0LjEzMThMNDg4LjcyMSA2MC42NDY1QzQ5MC42NDQgNTguNjAzIDQ5MS44NDYgNTguMTIyMSA0OTQuMTMgNTguMTIyMUg1MTkuMTM0QzUyMC44MTcgNTguMTIyMSA1MjIuMjU5IDU4LjYwMjcgNTIzLjQ2MSA1OS44MDQ3TDUyOC44NyA2NS4yMTM5QzUzMC4wNzIgNjYuNTM2IDUzMC42NzQgNjcuODU4MyA1MzAuNjc0IDY5LjU0MVYxMDIuMzU4QzUzMC42NzQgMTA0LjA0MSA1MzAuMDcyIDEwNS4zNjMgNTI4Ljg3IDEwNi42ODZMNTIzLjQ2MSAxMTEuOTc1QzUyMi4yNTkgMTEzLjI5NyA1MjAuNjk2IDExMy43NzggNTE5LjEzNCAxMTMuNzc4SDQ5NC4xM0M0OTEuODQ2IDExMy43NzggNDkwLjUyNCAxMTMuMTc3IDQ4OC43MjEgMTExLjI1NEw0ODUuMzU0IDEwNy42NDdWMTEzLjc3OEg0NzQuMTc2VjMyLjc1NzhINDg1LjM1NFY2NC4xMzE4Wk0zMDMuMDAyIDU4QzMwNC42ODUgNTggMzA2LjAwNyA1OC42MDA5IDMwNy4yMDkgNTkuODAyN0wzMTIuNjE5IDY1LjA5MThDMzEzLjk0MSA2Ni40MTQxIDMxNC40MjIgNjcuNzM3IDMxNC40MjIgNjkuNDE5OVYxMDIuMzU2QzMxNC40MjIgMTA0LjAzOSAzMTMuOTQxIDEwNS4zNjIgMzEyLjYxOSAxMDYuNjg1TDMwNy4yMDkgMTExLjk3NEMzMDYuMDA3IDExMy4xNzYgMzA0LjY4NSAxMTMuNzc2IDMwMy4wMDIgMTEzLjc3NkgyNjguMTQyQzI2Ni45NCAxMTMuNzc2IDI2NS4zNzYgMTEzLjQxNiAyNjMuODEzIDExMS44NTRMMjU4LjUyNCAxMDYuNTY0QzI1Ny40NDMgMTA1LjM2MiAyNTYuOTYyIDEwMy43OTkgMjU2Ljk2MiAxMDIuMzU2VjY5LjQxOTlDMjU2Ljk2MiA2Ny43MzcyIDI1Ny41NjMgNjYuMjk0NyAyNTguNTI0IDY1LjIxMjlMMjYzLjgxMyA1OS45MjI5QzI2NS4yNTYgNTguNDgwNCAyNjYuODE5IDU4IDI2OC4xNDIgNThIMzAzLjAwMlpNMzc0LjE0MyA1OEMzNzUuODI1IDU4LjAwMDEgMzc3LjE0OCA1OC42MDA4IDM3OC4zNSA1OS44MDI3TDM4My43NTkgNjUuMDkxOEMzODUuMDgxIDY2LjQxNDEgMzg1LjU2MiA2Ny43MzcgMzg1LjU2MiA2OS40MTk5VjEwMi4zNTZDMzg1LjU2MiAxMDQuMDM5IDM4NS4wODEgMTA1LjM2MiAzODMuNzU5IDEwNi42ODVMMzc4LjM1IDExMS45NzRDMzc3LjE0OCAxMTMuMTc2IDM3NS44MjUgMTEzLjc3NiAzNzQuMTQzIDExMy43NzZIMzM5LjI4MUMzMzguMDc5IDExMy43NzYgMzM2LjUxNyAxMTMuNDE2IDMzNC45NTQgMTExLjg1NEwzMjkuNjY1IDEwNi41NjRDMzI4LjU4MyAxMDUuMzYyIDMyOC4xMDMgMTAzLjc5OSAzMjguMTAzIDEwMi4zNTZWNjkuNDE5OUMzMjguMTAzIDY3LjczNzEgMzI4LjcwMyA2Ni4yOTQ4IDMyOS42NjUgNjUuMjEyOUwzMzQuOTU0IDU5LjkyMjlDMzM2LjM5NiA1OC40ODA3IDMzNy45NTkgNTguMDAwMSAzMzkuMjgxIDU4SDM3NC4xNDNaTTU4OS45MDYgNThDNTkxLjU4OSA1OCA1OTIuOTExIDU4LjYwMDkgNTk0LjExMyA1OS44MDI3TDU5OS41MjMgNjUuMDkxOEM2MDAuODQ2IDY2LjQxNDEgNjAxLjMyNiA2Ny43MzcgNjAxLjMyNiA2OS40MTk5VjEwMi4zNTZDNjAxLjMyNiAxMDQuMDM5IDYwMC44NDYgMTA1LjM2MiA1OTkuNTIzIDEwNi42ODVMNTk0LjExMyAxMTEuOTc0QzU5Mi45MTEgMTEzLjE3NiA1OTEuNTg5IDExMy43NzYgNTg5LjkwNiAxMTMuNzc2SDU1NS4wNDZDNTUzLjg0NCAxMTMuNzc2IDU1Mi4yOCAxMTMuNDE2IDU1MC43MTggMTExLjg1NEw1NDUuNDI5IDEwNi41NjRDNTQ0LjM0NyAxMDUuMzYyIDU0My44NjYgMTAzLjc5OSA1NDMuODY2IDEwMi4zNTZWNjkuNDE5OUM1NDMuODY2IDY3LjczNzIgNTQ0LjQ2NyA2Ni4yOTQ3IDU0NS40MjkgNjUuMjEyOUw1NTAuNzE4IDU5LjkyMjlDNTUyLjE2IDU4LjQ4MDQgNTUzLjcyNCA1OCA1NTUuMDQ2IDU4SDU4OS45MDZaTTE5Ni40MDYgMTAzLjU2MUgyMzAuNDI1VjY4LjIxODhIMTk2LjQwNlYxMDMuNTYxWk00ODUuMzU0IDEwMy41NjFINTE5LjM3NFY2OC4yMTg4SDQ4NS4zNTRWMTAzLjU2MVpNMjY4LjI2MiAxMDMuNTU5SDMwMy4xMjJWNjguMjE3OEgyNjguMjYyVjEwMy41NTlaTTMzOS40MDEgMTAzLjU1OUgzNzQuMjYzVjY4LjIxNzhIMzM5LjQwMVYxMDMuNTU5Wk01NTUuMTY2IDEwMy41NTlINTkwLjAyNlY2OC4yMTc4SDU1NS4xNjZWMTAzLjU1OVpNMjA2LjY0NyA5MC41MDJIMjAxLjA2Vjg0LjkxNDFIMjA2LjY0N1Y5MC41MDJaTTIxNS45NjEgOTAuNTAySDIxMC4zNzNWODQuOTE0MUgyMTUuOTYxVjkwLjUwMlpNMjI1LjI3MyA5MC41MDJIMjE5LjY4NlY4NC45MTQxSDIyNS4yNzNWOTAuNTAyWk01NjYuMzA5IDgyLjExODJDNTY4LjQ2IDgyLjExODIgNTcwLjIwNCA4My44NjI2IDU3MC4yMDQgODYuMDEzN0M1NzAuMjA0IDg4LjE2NDYgNTY4LjQ2IDg5LjkwODIgNTY2LjMwOSA4OS45MDgyQzU2NC4xNTggODkuOTA4MSA1NjIuNDE0IDg4LjE2NDUgNTYyLjQxNCA4Ni4wMTM3QzU2Mi40MTQgODMuODYyNyA1NjQuMTU4IDgyLjExODMgNTY2LjMwOSA4Mi4xMTgyWk01NzkuOTM5IDgyLjExODJDNTgyLjA5MSA4Mi4xMTgyIDU4My44MzQgODMuODYyNiA1ODMuODM0IDg2LjAxMzdDNTgzLjgzNCA4OC4xNjQ2IDU4Mi4wOSA4OS45MDgyIDU3OS45MzkgODkuOTA4MkM1NzcuNzg4IDg5LjkwODIgNTc2LjA0NSA4OC4xNjQ2IDU3Ni4wNDUgODYuMDEzN0M1NzYuMDQ1IDgzLjg2MjYgNTc3Ljc4OCA4Mi4xMTgyIDU3OS45MzkgODIuMTE4MlpNNTcyLjQxOSAzMi45NzA3QzU3NC40NjUgMzIuOTcwNyA1NzYuMTI0IDM0LjYyOTUgNTc2LjEyNCAzNi42NzU4QzU3Ni4xMjQgMzguMDQ3IDU3NS4zNzkgMzkuMjQzIDU3NC4yNzEgMzkuODgzOFY1MS41NzIzQzU3Ni43ODUgNTEuNzQzNCA1NzkuMTIxIDUyLjIwMDMgNTgwLjk1MiA1Mi44OTQ1QzU4My4zMTQgNTMuNzkwMiA1ODQuNDYxIDU0Ljg2MDQgNTg0LjQ2MSA1Ni4xMjdINTU5LjQ1QzU1OS40NTEgNTQuODYwNCA1NjAuNzc4IDUzLjc5MDIgNTYzLjE0IDUyLjg5NDVDNTY1LjE1IDUyLjEzMjEgNTY3Ljc3MSA1MS42NTU2IDU3MC41NjYgNTEuNTMwM1YzOS44ODQ4QzU2OS40NTkgMzkuMjQ0IDU2OC43MTQgMzguMDQ3MiA1NjguNzE0IDM2LjY3NThDNTY4LjcxNCAzNC42Mjk1IDU3MC4zNzMgMzIuOTcwNyA1NzIuNDE5IDMyLjk3MDdaIiBmaWxsPSIjMjgwMEZGIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iNi4wMDMwNiIgeTE9IjYiIHgyPSIxNDIuOTcyIiB5Mj0iMTQzLjIyNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iMTQzLjIyNyIgeTE9Ijc2LjgwNDYiIHgyPSIyNi4wMDEiIHkyPSIxMjIuOTY0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYiIHgxPSI1OC4yNTQxIiB5MT0iNTguMTY3IiB4Mj0iNTMuOTExNyIgeTI9IjEzMi45NTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMzc0XzE1NDYiPgo8cGF0aCBkPSJNNiA2SDExMy4yMjdDMTI5Ljc5NSA2IDE0My4yMjcgMTkuNDMxNSAxNDMuMjI3IDM2VjExMi45NzVDMTQzLjIyNyAxMjkuNTQ0IDEyOS43OTUgMTQyLjk3NSAxMTMuMjI3IDE0Mi45NzVINlY2WiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',\r\n userAvatar:\r\n 'data:image/png;base64,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',\r\n botAvatar:\r\n 'data:image/png;base64,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',\r\n};\r\n","import { DoohbotConfig } from './doohbot-config.model';\r\n\r\n/**\r\n * Default Doohbot configuration values.\r\n * Applied when no user overrides are provided.\r\n */\r\nexport const DEFAULT_DOOHBOT_CONFIG: DoohbotConfig = {\r\n // Runtime environment\r\n environment: 'development',\r\n\r\n // License file\r\n licenseFilePath: undefined,\r\n\r\n // Client-side encryption key (optional, fallback will be used)\r\n storageSecret: undefined,\r\n\r\n // Chat API mode (streaming by default)\r\n useNonStreamingChat: false, // true for non-streaming, false for streaming\r\n\r\n // API integration defaults\r\n api: {\r\n baseUrl: 'https://api.doohbot.com/api/',\r\n apiKey: undefined,\r\n enableRetry: true,\r\n retryAttempts: 2,\r\n retryDelay: 1000,\r\n },\r\n\r\n // Theme / visual customization\r\n theme: {\r\n enableDrag: false,\r\n enableResize: false,\r\n buttonStyle: 'fab',\r\n fontFamily: 'Inter, Roboto, sans-serif',\r\n palette: 'doohbot',\r\n },\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { DoohbotConfig } from './doohbot-config.model';\r\n\r\n/**\r\n * Injection token for Doohbot configuration.\r\n * Used to inject user-provided or default config into services.\r\n */\r\nexport const DOOHBOT_CONFIG = new InjectionToken<DoohbotConfig>('DOOHBOT_CONFIG');\r\n","import { Inject, Injectable, Optional, signal, WritableSignal, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { DoohbotConfig } from './doohbot-config.model';\r\nimport { DEFAULT_DOOHBOT_CONFIG } from './doohbot-config.default';\r\nimport { DOOHBOT_CONFIG } from './doohbot-config.token';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\nimport { DoohbotApiConfig } from '../models/api-config.model';\r\nimport { DoohbotAuthConfig } from '../models/auth-config.model';\r\n\r\n/**\r\n * Centralized service for managing Doohbot configuration.\r\n * Provides reactive access and runtime updates.\r\n * Singleton via providedIn: 'root'.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DoohbotConfigService implements OnDestroy {\r\n // Use DoohbotConfig for type-safe signal\r\n private configSignal: WritableSignal<DoohbotConfig>;\r\n\r\n // Legacy Observable support\r\n private readonly configSubject: BehaviorSubject<DoohbotConfig>;\r\n public readonly config$: Observable<DoohbotConfig>;\r\n\r\n /**\r\n * Current runtime environment for Doohbot.\r\n *\r\n * Drives environment-specific behavior such as:\r\n * - API behavior\r\n * - logging verbosity\r\n * - feature toggles\r\n * - safety defaults\r\n *\r\n * This value is mandatory and always resolved during bootstrap.\r\n */\r\n readonly environment = (): DoohbotConfig['environment'] => this.configSignal().environment;\r\n\r\n /**\r\n * Path to the public license file.\r\n * Returns an empty string if not configured.\r\n */\r\n readonly licenseFilePath = (): string => this.configSignal().licenseFilePath ?? '';\r\n\r\n /**\r\n * Secret used for encrypting persisted client-side data.\r\n * If not provided, default will be used.\r\n */\r\n readonly storageSecret = (): string => this.configSignal().storageSecret ?? '';\r\n\r\n /**\r\n * Chats use the `streaming` by default.\r\n * Pass `true` to use normal http calls for chat.\r\n */\r\n readonly useNonStreamingChat = (): boolean => this.configSignal().useNonStreamingChat ?? false;\r\n\r\n /**\r\n * Full API configuration object.\r\n * Undefined if API integration is not configured.\r\n */\r\n readonly api = (): DoohbotApiConfig | undefined => this.configSignal().api;\r\n\r\n /**\r\n * Authentication configuration object.\r\n * Undefined if authentication is not configured.\r\n */\r\n readonly auth = (): DoohbotAuthConfig | undefined => this.configSignal().auth;\r\n\r\n /**\r\n * Theme customization configuration.\r\n * Undefined if no theme overrides are provided.\r\n */\r\n readonly theme = (): DoohbotThemeConfig | undefined => this.configSignal().theme;\r\n\r\n constructor(\r\n @Optional()\r\n @Inject(DOOHBOT_CONFIG)\r\n injectedConfig: Partial<DoohbotConfig> = {},\r\n ) {\r\n // Merge injected config with defaults\r\n const mergedConfig: DoohbotConfig = {\r\n ...DEFAULT_DOOHBOT_CONFIG,\r\n ...injectedConfig,\r\n };\r\n\r\n this.validateConfig(mergedConfig);\r\n\r\n // Initialize state\r\n this.configSignal = signal(mergedConfig);\r\n this.configSubject = new BehaviorSubject<DoohbotConfig>(mergedConfig);\r\n this.config$ = this.configSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Update configuration at runtime.\r\n * @param value Partial config updates\r\n */\r\n update(value: Partial<DoohbotConfig>): void {\r\n if ('environment' in value) {\r\n throw new Error('environment cannot be changed at runtime');\r\n }\r\n\r\n const newConfig = { ...this.configSignal(), ...value };\r\n this.validateConfig(newConfig);\r\n\r\n this.configSignal.set(newConfig);\r\n this.configSubject.next(newConfig);\r\n }\r\n\r\n private validateConfig(config: DoohbotConfig): void {\r\n // environment\r\n if (!config.environment) {\r\n throw new Error('environment is required');\r\n }\r\n\r\n // license\r\n if (config.licenseFilePath && typeof config.licenseFilePath !== 'string') {\r\n throw new Error('licenseFilePath must be a string');\r\n }\r\n\r\n // API config\r\n if (config.api) {\r\n const api = config.api;\r\n\r\n if (!api.baseUrl) {\r\n throw new Error('api.baseUrl is required when api config is provided');\r\n }\r\n\r\n if (api.retryAttempts !== undefined && api.retryAttempts < 0) {\r\n throw new Error('api.retryAttempts must be >= 0');\r\n }\r\n\r\n if (api.retryDelay !== undefined && api.retryDelay < 0) {\r\n throw new Error('api.retryDelay must be >= 0');\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.configSubject.complete();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class Logger {\r\n private static instance: Logger | null = null;\r\n\r\n private prefix = '[Doohbot] ======> ';\r\n\r\n private styles = {\r\n info: 'color:#0995e6; font-weight:500',\r\n warn: 'color:#ff9800; font-weight:600',\r\n error: 'color:#f44336; font-weight:700',\r\n };\r\n\r\n constructor(private configService: DoohbotConfigService) {\r\n Logger.instance = this;\r\n }\r\n\r\n /** bind once */\r\n static init(instance: Logger): void {\r\n Logger.instance = instance;\r\n this.info('[Logger]: has been initialized!!!');\r\n }\r\n\r\n // internal guard\r\n private canLog(): boolean {\r\n return this.configService.environment() !== 'production';\r\n }\r\n\r\n // instance methods\r\n info(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return;\r\n try {\r\n console.info(`%c${this.prefix} ${message}`, this.styles.info, ...args);\r\n } catch {\r\n console.info(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n warn(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return;\r\n try {\r\n console.warn(`%c${this.prefix} ${message}`, this.styles.warn, ...args);\r\n } catch {\r\n console.warn(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n error(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return;\r\n try {\r\n console.error(`%c${this.prefix} ${message}`, this.styles.error, ...args);\r\n } catch {\r\n console.error(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n // static facade\r\n private static get logger(): Logger {\r\n if (!Logger.instance) {\r\n // Consider a graceful fallback or a queue-based logger.\r\n throw new Error(\r\n 'LoggerService not initialized. Instantiate LoggerService during app bootstrap.',\r\n );\r\n }\r\n return Logger.instance;\r\n }\r\n\r\n static info(message: string, ...args: unknown[]): void {\r\n Logger.logger.info(message, ...args);\r\n }\r\n\r\n static warn(message: string, ...args: unknown[]): void {\r\n Logger.logger.warn(message, ...args);\r\n }\r\n\r\n static error(message: string, ...args: unknown[]): void {\r\n Logger.logger.error(message, ...args);\r\n }\r\n}\r\n","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { delay, retry, map, catchError, of, firstValueFrom } from 'rxjs';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpService {\r\n constructor(\r\n private http: HttpClient,\r\n private configService: DoohbotConfigService,\r\n ) {}\r\n\r\n get apiUrl(): string {\r\n const apiBaseUrl = this.configService.api()?.baseUrl ?? '';\r\n Logger.info('HttpService: Initialized apiUrl', apiBaseUrl);\r\n return apiBaseUrl;\r\n }\r\n\r\n async get(\r\n url: string,\r\n param?: object,\r\n nestedParam = false,\r\n showLoader = false,\r\n refresh = true,\r\n headers?: HttpHeaders,\r\n ): Promise<any> {\r\n // Build Params\r\n const params = (nestedParam ? this.buildHttpParams({}, param, '') : param) as HttpParams;\r\n\r\n Logger.info('HttpService: get()', url, params, headers);\r\n return await firstValueFrom(\r\n this.http\r\n .get(`${this.apiUrl}${url}`, {\r\n params: params,\r\n // withCredentials: true,\r\n headers,\r\n })\r\n .pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n // This prevents callers from using try/catch effectively. Consider re-throwing or using an error wrapper.\r\n Logger.info('HttpService: get() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n private buildHttpParams(params: any, data: any, currentPath: string) {\r\n Object.keys(data).forEach((key) => {\r\n if (data[key] instanceof Object && !(data[key] instanceof Array)) {\r\n this.buildHttpParams(params, data[key], `${currentPath}${key}.`);\r\n } else {\r\n params[`${currentPath}${key}`] = data[key];\r\n }\r\n });\r\n }\r\n\r\n async post(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n Logger.info('HttpService: post()', url, param, headers);\r\n // This casting might lead to runtime errors if the backend expects application/json.\r\n return await firstValueFrom(\r\n this.http.post(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info('HttpService: post() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n async patch(\r\n url: string,\r\n param?: object,\r\n showLoader = false,\r\n headers?: HttpHeaders,\r\n ): Promise<any> {\r\n Logger.info('HttpService: patch()', url, param, headers);\r\n return await firstValueFrom(\r\n this.http.patch(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info('HttpService: patch() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n async put(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n Logger.info('HttpService: put()', url, param, headers);\r\n return await firstValueFrom(\r\n this.http.put(`${this.apiUrl}${url}`, param, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info('HttpService: put() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n async delete(\r\n url: string,\r\n param?: object,\r\n showLoader = false,\r\n headers?: HttpHeaders,\r\n ): Promise<any> {\r\n let params = {};\r\n params = param as HttpParams;\r\n\r\n Logger.info('HttpService: delete()', url, param, headers);\r\n return await firstValueFrom(\r\n this.http.delete(`${this.apiUrl}${url}`, { body: param, headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info('HttpService: delete() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n}\r\n","import { Logger } from './../utils/logger.service';\r\nimport { Injectable, NgZone } from '@angular/core';\r\nimport { HttpClient, HttpEventType, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { ChatStreamResponse } from '../../app/chat/model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpStreamService {\r\n constructor(\r\n private ngZone: NgZone,\r\n private http: HttpClient,\r\n ) {}\r\n\r\n /**\r\n * Creates a POST-based HTTP streaming connection using fetch()\r\n */\r\n createHttpStream(\r\n url: string,\r\n body: any,\r\n headers?: Record<string, string>,\r\n ): Observable<ChatStreamResponse> {\r\n // but ensures the manual line-splitting logic handles all UTF-8 characters and multi-line data correctly.\r\n return new Observable<ChatStreamResponse>((observer) => {\r\n // Note: Authorization header is added automatically by AuthInterceptor\r\n let requestHeaders = new HttpHeaders({\r\n 'content-type': 'application/json',\r\n accept: 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n });\r\n\r\n if (headers) {\r\n Object.keys(headers).forEach((key) => {\r\n requestHeaders = requestHeaders.set(key, headers[key]);\r\n });\r\n }\r\n\r\n const req = this.http.request('POST', url, {\r\n body,\r\n headers: requestHeaders,\r\n reportProgress: true,\r\n observe: 'events',\r\n responseType: 'text',\r\n });\r\n\r\n let lastLoaded = 0;\r\n\r\n const sub = req.subscribe({\r\n next: (event) => {\r\n if (event.type === HttpEventType.DownloadProgress) {\r\n // Process the new chunk of data\r\n const fullText = (event as any).partialText;\r\n if (!fullText) return;\r\n\r\n const newText = fullText.slice(lastLoaded);\r\n lastLoaded = fullText.length;\r\n\r\n const lines = newText.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.trim() === '') continue;\r\n\r\n if (line.startsWith('data: ')) {\r\n const dataStr = line.substring(6).trim();\r\n\r\n if (dataStr === '[DONE]') {\r\n this.ngZone.run(() => observer.complete());\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(dataStr);\r\n // Consider using discrete signals or a more optimized zone strategy.\r\n this.ngZone.run(() =>\r\n observer.next({\r\n content: parsed.content ?? parsed.message ?? '',\r\n type: parsed.type ?? 'chunk',\r\n id: parsed.response_id ?? '',\r\n created_at: parsed.created_at ?? '',\r\n sources: parsed.sources ?? [],\r\n error: parsed.error,\r\n }),\r\n );\r\n } catch (e) {\r\n Logger.warn('Failed to parse SSE data:', dataStr, e);\r\n }\r\n }\r\n }\r\n } else if (event.type === HttpEventType.Response) {\r\n this.ngZone.run(() => observer.complete());\r\n }\r\n },\r\n error: (err) => {\r\n this.ngZone.run(() => observer.error(err));\r\n },\r\n complete: () => {\r\n this.ngZone.run(() => observer.complete());\r\n },\r\n });\r\n\r\n return () => sub.unsubscribe();\r\n });\r\n }\r\n}\r\n","import { Logger } from './../../../core/utils/logger.service';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ChatHistoryData, ChatHistoryRequest, ChatMessage } from '../model/chat-history.model';\r\nimport { HttpStreamService } from '../../../core/http/http-stream.service';\r\nimport { HttpService } from '../../../core/http/http.service';\r\nimport { ApiResponse } from '../../../core/models/api-response.model';\r\nimport { ChatRequest } from '../model/chat-request.model';\r\nimport { ChatResponse } from '../model/chat-response.model';\r\nimport { ChatStreamResponse } from '../model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatApiService {\r\n\r\n constructor(\r\n private http: HttpService,\r\n private httpStreamService: HttpStreamService,\r\n ) {\r\n Logger.info('ChatApiService: Initialized');\r\n }\r\n\r\n /**\r\n * Send chat message and get full response\r\n */\r\n sendMessage(request?: ChatRequest, showLoader = false): Promise<ApiResponse<ChatResponse>> {\r\n return this.http.post('chats/ask', request, showLoader);\r\n }\r\n\r\n /**\r\n * Send chat message and get streaming response\r\n */\r\n sendMessageStream(request: ChatRequest): Observable<ChatStreamResponse> {\r\n return this.httpStreamService.createHttpStream(`${this.http.apiUrl}chats/stream`, request);\r\n }\r\n\r\n getChatHistory(\r\n request: ChatHistoryRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<ChatHistoryData>> {\r\n return this.http.post('chats/sessions', request, showLoader);\r\n }\r\n\r\n getChatSession(\r\n chatSessionId: string,\r\n showLoader = false,\r\n ): Promise<ApiResponse<ChatMessage[]>> {\r\n return this.http.get(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.http.delete(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n // }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.clearChatHistory(\r\n // { chat_session_ids: [chatSessionId], delete_all: false },\r\n // showLoader,\r\n // );\r\n // }\r\n\r\n deleteChatSession(chatSessionId: string, showLoader = false): Promise<ApiResponse<void>> {\r\n const body = { chat_session_ids: [chatSessionId], delete_all: false };\r\n return this.http.delete('chats/sessions', body, showLoader);\r\n }\r\n\r\n updateChatTitle(\r\n chatSessionId: string,\r\n title: string,\r\n showLoader = false,\r\n ): Promise<ApiResponse<void>> {\r\n return this.http.patch(`chats/sessions/${chatSessionId}/title`, { title }, showLoader);\r\n }\r\n\r\n clearChatHistory(request?: object, showLoader = false): Promise<ApiResponse<void>> {\r\n return this.http.delete('chats/sessions', request, showLoader);\r\n }\r\n}\r\n","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { SharedMaterialModule } from '../material/material.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\n\r\n@Component({\r\n selector: 'app-snackbar',\r\n templateUrl: './snackbar.component.html',\r\n styleUrls: ['./snackbar.component.scss'],\r\n standalone: true,\r\n imports: [SharedMaterialModule, CommonModule],\r\n})\r\nexport class SnackBar implements OnInit {\r\n // private snackBarRef = inject(MatSnackBarRef);\r\n // private data = inject(MAT_SNACK_BAR_DATA);\r\n\r\n public message: string | null = null;\r\n public type: SnackBarError = 'error';\r\n\r\n constructor(\r\n @Inject(MAT_SNACK_BAR_DATA) public data: any,\r\n private snackBarRef: MatSnackBarRef<any>,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.message = this.data.message;\r\n this.type = this.data.type || 'error';\r\n }\r\n\r\n close() {\r\n this.snackBarRef.dismiss();\r\n }\r\n\r\n get icon(): string {\r\n switch (this.type) {\r\n case 'success':\r\n return 'check_circle';\r\n case 'error':\r\n return 'error';\r\n case 'warn':\r\n return 'warning';\r\n case 'info':\r\n return 'info';\r\n default:\r\n return 'info';\r\n }\r\n }\r\n}\r\n","<div class=\"snackbar-message\" [ngClass]=\"'type-' + type\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">{{ icon }}</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\nimport { SnackBar } from './snackbar.component';\r\n\r\nexport interface SnackbarConfig {\r\n message: string;\r\n duration?: number;\r\n type: SnackBarError;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SnackbarService {\r\n constructor(private snackBar: MatSnackBar) {}\r\n\r\n // Generic show method\r\n private show(message: string, duration: number, type: SnackBarError) {\r\n this.snackBar.openFromComponent(SnackBar, {\r\n duration: duration,\r\n data: { message, type },\r\n horizontalPosition: 'end',\r\n verticalPosition: 'bottom',\r\n panelClass: [`snackbar-${type}`],\r\n });\r\n }\r\n\r\n // Convenience methods\r\n success(message: string, duration: number = 3000) {\r\n this.show(message, duration, 'success');\r\n }\r\n\r\n warn(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'warn');\r\n }\r\n\r\n error(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'error');\r\n }\r\n\r\n info(message: string, duration: number = 4000) {\r\n this.show(message, duration, 'info');\r\n }\r\n\r\n clear() {\r\n this.snackBar.dismiss();\r\n }\r\n}\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { ChatApiService } from './chat-api.service';\r\nimport { ChatSessionDto } from '../model/chat-session.model';\r\nimport { Message } from '../../../core/models/message';\r\nimport { ChatSessionResponse, ChatMessage } from '../model/chat-history.model';\r\nimport { Logger } from '../../../core/utils/logger.service';\r\nimport { SnackbarService } from '../../../shared/snackbar/snackbar.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatHistoryService {\r\n private chatApiService = inject(ChatApiService);\r\n private snackbar = inject(SnackbarService);\r\n\r\n // History State Signals\r\n public sessions = signal<ChatSessionDto[]>([]);\r\n public isLoading = signal<boolean>(false);\r\n public isLoadingMore = signal<boolean>(false);\r\n public hasMore = signal<boolean>(true);\r\n public historyOffset = signal<number>(0);\r\n public isCacheValid = signal<boolean>(false);\r\n public processingSessionId = signal<string | null>(null);\r\n\r\n /**\r\n * Map API session response to ChatSession model\r\n */\r\n public mapSessionResponseToSession(\r\n sessionResponse: ChatSessionResponse,\r\n userId: string,\r\n ): ChatSessionDto {\r\n // Use last_message_at or created_at or current time\r\n const timestamp = sessionResponse.last_message_at\r\n ? new Date(sessionResponse.last_message_at)\r\n : sessionResponse.created_at\r\n ? new Date(sessionResponse.created_at)\r\n : new Date();\r\n\r\n Logger.info('Mapping session response:', sessionResponse);\r\n\r\n // Map messages from the session if they exist\r\n let messages: Message[] = [];\r\n if (sessionResponse.messages && Array.isArray(sessionResponse.messages)) {\r\n messages = sessionResponse.messages.map((msg: ChatMessage) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n\r\n // Use response_id as primary ID, fallback to chat_session_id\r\n const sessionId = sessionResponse.response_id || sessionResponse.chat_session_id || '';\r\n\r\n return {\r\n response_id: sessionId,\r\n last_message_at: timestamp,\r\n title: sessionResponse.title || 'Previous Conversation',\r\n userId: userId,\r\n messages: messages,\r\n };\r\n }\r\n\r\n /**\r\n * Load all chat sessions for a specific user\r\n */\r\n async loadSessions(userId: string, forceRefresh = false): Promise<void> {\r\n Logger.info('loadSessions called', { userId, forceRefresh });\r\n\r\n if (this.isCacheValid() && !forceRefresh && this.sessions().length > 0) {\r\n Logger.info('Cache is valid. Skipping API call.');\r\n return;\r\n }\r\n\r\n this.isLoading.set(true);\r\n this.historyOffset.set(0);\r\n\r\n try {\r\n const result = await this.chatApiService.getChatHistory({ limit: 50, offset: 0 });\r\n\r\n if (result?.success && result.data?.sessions) {\r\n const remoteSessions = result.data.sessions.map((s) =>\r\n this.mapSessionResponseToSession(s, userId),\r\n );\r\n const hasMore =\r\n (result.data.offset ?? 0) + remoteSessions.length < (result.data.total ?? 0);\r\n\r\n this.sessions.set(remoteSessions);\r\n this.hasMore.set(hasMore);\r\n this.historyOffset.set(remoteSessions.length);\r\n this.isCacheValid.set(true);\r\n\r\n Logger.info(`Loaded ${remoteSessions.length} sessions. Cache valid: true`);\r\n } else {\r\n this.sessions.set([]);\r\n this.hasMore.set(false);\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to load history');\r\n Logger.error('ChatHistoryService: Failed to load history', err);\r\n this.sessions.set([]);\r\n this.hasMore.set(false);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Load more sessions for infinite scroll\r\n */\r\n async loadMoreSessions(userId: string): Promise<void> {\r\n if (!this.hasMore() || this.isLoadingMore()) return;\r\n\r\n const offset = this.historyOffset();\r\n this.isLoadingMore.set(true);\r\n\r\n try {\r\n const result = await this.chatApiService.getChatHistory({ limit: 50, offset });\r\n\r\n if (result?.success && result.data?.sessions) {\r\n const remoteSessions = result.data.sessions.map((s) =>\r\n this.mapSessionResponseToSession(s, userId),\r\n );\r\n const hasMore =\r\n (result.data.offset ?? 0) + remoteSessions.length < (result.data.total ?? 0);\r\n\r\n this.sessions.set([...this.sessions(), ...remoteSessions]);\r\n this.hasMore.set(hasMore);\r\n this.historyOffset.set(offset + remoteSessions.length);\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to load more history');\r\n Logger.error('ChatHistoryService: Failed to load more history', err);\r\n } finally {\r\n this.isLoadingMore.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Load messages for a specific session\r\n */\r\n async loadSessionMessages(sessionId: string): Promise<Message[]> {\r\n try {\r\n const result = await this.chatApiService.getChatSession(sessionId);\r\n\r\n if (result.success && result.data) {\r\n // Interleave user and assistant messages\r\n const messages: ChatMessage[] = [];\r\n const users = result.data.filter((m) => m.role === 'user');\r\n const assistants = result.data.filter((m) => m.role === 'model');\r\n const maxLength = Math.max(users.length, assistants.length);\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n if (users[i]) messages.push(users[i]);\r\n if (assistants[i]) messages.push(assistants[i]);\r\n }\r\n\r\n return messages.map((msg) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to load messages');\r\n Logger.error('ChatHistoryService: Failed to load messages', err);\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Delete a specific session\r\n */\r\n async deleteSession(sessionId: string, userId: string): Promise<void> {\r\n this.processingSessionId.set(sessionId);\r\n try {\r\n const result = await this.chatApiService.deleteChatSession(sessionId);\r\n if (result?.success) {\r\n this.sessions.update((prev) => prev.filter((s) => s.response_id !== sessionId));\r\n this.snackbar.success('Conversation deleted successfully');\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to delete chat');\r\n Logger.error('ChatHistoryService: Failed to delete session', err);\r\n } finally {\r\n this.processingSessionId.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Delete all history\r\n */\r\n async deleteAllHistory(userId: string): Promise<void> {\r\n this.isLoading.set(true);\r\n try {\r\n const result = await this.chatApiService.clearChatHistory({ delete_all: true });\r\n if (result?.success) {\r\n this.sessions.set([]);\r\n this.isCacheValid.set(false);\r\n this.snackbar.success('Chat history cleared');\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to clear history');\r\n Logger.error('ChatHistoryService: Failed to clear history', err);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Update session title\r\n */\r\n async updateSessionTitle(sessionId: string, newTitle: string, userId: string): Promise<boolean> {\r\n this.processingSessionId.set(sessionId);\r\n try {\r\n const result = await this.chatApiService.updateChatTitle(sessionId, newTitle);\r\n const success = !!result?.success;\r\n\r\n if (success) {\r\n this.sessions.update((prev) =>\r\n prev.map((s) => (s.response_id === sessionId ? { ...s, title: newTitle } : s)),\r\n );\r\n this.snackbar.success('Title updated successfully');\r\n }\r\n return success;\r\n } catch (err) {\r\n this.snackbar.error('Failed to update title');\r\n Logger.error('ChatHistoryService: Failed to update title', err);\r\n return false;\r\n } finally {\r\n this.processingSessionId.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Invalidate cache\r\n */\r\n invalidateCache(): void {\r\n this.isCacheValid.set(false);\r\n this.historyOffset.set(0);\r\n this.hasMore.set(true);\r\n }\r\n\r\n /**\r\n * Create a new chat session DTO locally\r\n */\r\n public createSession(userId: string, sessionId: string): ChatSessionDto {\r\n return {\r\n response_id: sessionId,\r\n last_message_at: new Date(),\r\n title: 'New Conversation',\r\n messages: [],\r\n userId,\r\n };\r\n }\r\n\r\n /**\r\n * Clear all history state\r\n */\r\n clearState(): void {\r\n this.sessions.set([]);\r\n this.isLoading.set(false);\r\n this.isLoadingMore.set(false);\r\n this.hasMore.set(true);\r\n this.historyOffset.set(0);\r\n this.isCacheValid.set(false);\r\n this.processingSessionId.set(null);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { AuthMode } from '../types/auth-mode.type';\r\nimport { TenantResolutionStrategy } from '../types/tenant-resolution-strategy.type';\r\nimport { PromptMode } from '../types/prompt-mode.type';\r\n\r\n/**\r\n * Advanced configuration for Doohbot package\r\n * Supports both simple and complex use cases\r\n */\r\nexport interface DoohbotAdvancedConfig {\r\n /**\r\n * Authentication mode\r\n * - 'manual': You provide platformTenant, subTenant, agent manually\r\n * - 'auto': Package reads from your auth service via resolver\r\n * @default 'manual'\r\n */\r\n authMode?: AuthMode;\r\n\r\n /**\r\n * Tenant resolution strategy\r\n * - 'static': Use fixed values provided via inputs\r\n * - 'dynamic': Automatically update when auth state changes\r\n * - 'callback': Use custom resolver function\r\n * @default 'static'\r\n */\r\n tenantResolution?: TenantResolutionStrategy;\r\n\r\n /**\r\n * Auto-configure from localStorage key\r\n * If provided, package will read auth data from localStorage\r\n * Example: 'auth_user' or 'saas_session'\r\n */\r\n autoConfigFromStorage?: string;\r\n\r\n /**\r\n * Enable multi-tenant mode\r\n * Allows switching between different tenant contexts\r\n * @default false\r\n */\r\n enableMultiTenant?: boolean;\r\n\r\n /**\r\n * Persist chat history per tenant\r\n * @default true\r\n */\r\n persistChatPerTenant?: boolean;\r\n\r\n /**\r\n * Custom authentication header name\r\n * @default 'Authorization'\r\n */\r\n authHeaderName?: string;\r\n\r\n /**\r\n * Custom authentication header format\r\n * Use {token} as placeholder\r\n * @default 'Bearer {token}'\r\n */\r\n authHeaderFormat?: string;\r\n\r\n /**\r\n * Enable role-based features\r\n * Shows/hides features based on user permissions\r\n * @default false\r\n */\r\n enableRoleBasedFeatures?: boolean;\r\n\r\n /**\r\n * User permissions (for role-based features)\r\n */\r\n userPermissions?: string[];\r\n\r\n /**\r\n * Callback when authentication fails\r\n */\r\n onAuthFailure?: (error: any) => void;\r\n\r\n /**\r\n * Enable debug mode (logs configuration and requests)\r\n * @default false\r\n */\r\n debugMode?: boolean;\r\n\r\n /**\r\n * Prompt mode for chat responses\r\n * @default 'markdown'\r\n */\r\n promptMode?: PromptMode;\r\n}\r\n\r\n/**\r\n * Injection token for advanced configuration\r\n */\r\nexport const DOOHBOT_ADVANCED_CONFIG = new InjectionToken<DoohbotAdvancedConfig>(\r\n 'DOOHBOT_ADVANCED_CONFIG',\r\n {\r\n providedIn: 'root',\r\n factory: () => ({\r\n authMode: 'manual',\r\n tenantResolution: 'static',\r\n enableMultiTenant: false,\r\n persistChatPerTenant: true,\r\n authHeaderName: 'Authorization',\r\n authHeaderFormat: 'Bearer {token}',\r\n enableRoleBasedFeatures: false,\r\n debugMode: false,\r\n }),\r\n },\r\n);\r\n","// environment.ts\r\nexport const environment = {\r\n production: false,\r\n storageSecret: 'RcmDfQZ0AN2Zryn3pJ+HXNX4Nr7zQ6rV0UDsrCV9Jt5XzG4TW+1R3pIYOM03h77WMaZp8XnCBEQnelwGvuk3iQ==',\r\n};\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport { DoohbotConfig } from '../config/doohbot-config.model';\r\nimport { DOOHBOT_CONFIG } from '../config/doohbot-config.token';\r\nimport { environment } from '../environments/environment';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class StorageService {\r\n private readonly storageKey = 'doohbot_storage';\r\n private readonly secretKey: string;\r\n\r\n constructor(@Inject(DOOHBOT_CONFIG) config: DoohbotConfig) {\r\n // Use config override if provided, otherwise fall back to environment\r\n this.secretKey = config.storageSecret ?? environment.storageSecret ?? '';\r\n }\r\n\r\n /**\r\n * Store a value under the given key.\r\n * @param key The key to store the value under.\r\n * @param value The value to store (any serializable object).\r\n * @param session If true, use sessionStorage; otherwise localStorage.\r\n */\r\n set<T>(key: string, value: T, session = false): void {\r\n try {\r\n const storage = session ? sessionStorage : localStorage;\r\n const payload = this.getAll(storage);\r\n payload[key] = value;\r\n storage.setItem(this.storageKey, this.encrypt(JSON.stringify(payload)));\r\n } catch (error) {\r\n console.error('Failed to set value in storage:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Retrieve a stored value by key.\r\n * @param key The key to retrieve.\r\n * @param session If true, use sessionStorage; otherwise localStorage.\r\n * @returns The stored value or null if not found.\r\n */\r\n get<T>(key: string, session = false): T | null {\r\n try {\r\n const storage = session ? sessionStorage : localStorage;\r\n const data = storage.getItem(this.storageKey);\r\n if (!data) return null;\r\n\r\n const decrypted = this.decrypt(data);\r\n if (!decrypted) return null;\r\n\r\n const parsed = JSON.parse(decrypted) as Record<string, unknown>;\r\n return (parsed[key] as T) ?? null;\r\n } catch (error) {\r\n console.error('Failed to retrieve key from storage:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Remove a specific key from storage.\r\n * @param key The key to remove.\r\n * @param session If true, remove from sessionStorage; otherwise localStorage.\r\n */\r\n remove(key: string, session = false): void {\r\n try {\r\n const storage = session ? sessionStorage : localStorage;\r\n const payload = this.getAll(storage);\r\n delete payload[key];\r\n storage.setItem(this.storageKey, this.encrypt(JSON.stringify(payload)));\r\n } catch (error) {\r\n console.error('Failed to remove key from storage:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Clear all Doohbot-related storage from both localStorage and sessionStorage.\r\n */\r\n clearStorage(): void {\r\n localStorage.removeItem(this.storageKey);\r\n sessionStorage.removeItem(this.storageKey);\r\n }\r\n\r\n /**\r\n * Validate storage integrity without mutating it.\r\n * @param session If true, validate sessionStorage; otherwise localStorage.\r\n * @returns True if storage can be decrypted successfully.\r\n */\r\n isValid(session = false): boolean {\r\n try {\r\n const storage = session ? sessionStorage : localStorage;\r\n const data = storage.getItem(this.storageKey);\r\n if (!data) return false;\r\n return this.decrypt(data) !== null;\r\n } catch (error) {\r\n console.error('Failed to validate storage integrity:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Get all stored values.\r\n * @param storage The storage medium to use.\r\n * @returns Object of all stored key/value pairs.\r\n */\r\n private getAll(storage: Storage): Record<string, unknown> {\r\n try {\r\n const data = storage.getItem(this.storageKey);\r\n if (!data) return {};\r\n const decrypted = this.decrypt(data);\r\n return decrypted ? JSON.parse(decrypted) : {};\r\n } catch (error) {\r\n console.error('Failed to retrieve all storage values:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * Encrypt a string before storing.\r\n * @param plainText The string to encrypt.\r\n * @returns Encrypted string.\r\n */\r\n private encrypt(plainText: string): string {\r\n return CryptoJS.AES.encrypt(plainText, this.secretKey).toString();\r\n }\r\n\r\n /**\r\n * Decrypt a string from storage.\r\n * @param cipherText The encrypted string.\r\n * @returns Decrypted string, or null if decryption fails.\r\n */\r\n private decrypt(cipherText: string): string | null {\r\n try {\r\n const bytes = CryptoJS.AES.decrypt(cipherText, this.secretKey);\r\n const decrypted = bytes.toString(CryptoJS.enc.Utf8);\r\n return decrypted || null;\r\n } catch (error) {\r\n console.error('Failed to decrypt storage value:', error);\r\n return null;\r\n }\r\n return null;\r\n }\r\n}\r\n","import { computed, Injectable, signal } from '@angular/core';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport {\r\n BehaviorSubject,\r\n combineLatest,\r\n filter,\r\n from,\r\n Observable,\r\n of,\r\n switchMap,\r\n take,\r\n distinctUntilChanged,\r\n} from 'rxjs';\r\nimport { AuthResult } from './models/auth-result.model';\r\nimport { FederatedLoginRequest } from './models/federated-login-request.model';\r\nimport { LoginRequest } from './models/login-request.model';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { StorageService } from './storage.service';\r\nimport { RefreshRequest } from './models/refresh-request.model';\r\nimport { HttpService } from '../http/http.service';\r\nimport { ApiResponse } from '../models/api-response.model';\r\nimport { HttpHeaders } from '@angular/common/http';\r\nimport { Logger } from '../utils/logger.service';\r\nimport { SnackbarService } from '../../shared/snackbar/snackbar.service';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\n\r\ntype PrereqStatus = 'success' | 'failed' | 'pending';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n private jwtHelper = new JwtHelperService();\r\n\r\n private readonly _isAuthenticated = signal<boolean>(false);\r\n readonly isAuthenticated$ = toObservable(this._isAuthenticated).pipe(distinctUntilChanged());\r\n\r\n private readonly rememberMeSubject = new BehaviorSubject<boolean | null>(null);\r\n private readonly federatedAuthTokenSubject = new BehaviorSubject<string | null>(null);\r\n private readonly licenseFileSubject = new BehaviorSubject<Map<string, string> | null>(null);\r\n private readonly licenseCodeSubject = new BehaviorSubject<string | null>(null);\r\n\r\n private readonly _isAuthenticating = signal<boolean>(false);\r\n private readonly _loginErrorMessage = signal<string | null>(null);\r\n\r\n // verified auth data\r\n private readonly _errors = {\r\n federatedAuthToken: signal<string | null>(null),\r\n licenseFile: signal<string | null>(null),\r\n licenseCode: signal<string | null>(null),\r\n };\r\n\r\n /** Gets the last login error message */\r\n readonly loginErrorMessage = computed(() => this._loginErrorMessage());\r\n\r\n /** Computed prerequisites status */\r\n readonly prerequisitesStatus = computed(() => ({\r\n federatedToken: this.getStatus(this.federatedAuthToken(), this._errors.federatedAuthToken()),\r\n licenseFile: this.getStatus(this.licenseFile(), this._errors.licenseFile()),\r\n licenseCode: this.getStatus(this.licenseCode(), this._errors.licenseCode()),\r\n }));\r\n\r\n /** True if all prerequisites are satisfied */\r\n readonly allPrerequisitesMet = computed(() => {\r\n const status = this.prerequisitesStatus();\r\n return (\r\n status.federatedToken === 'success' &&\r\n status.licenseFile === 'success' &&\r\n status.licenseCode === 'success'\r\n );\r\n });\r\n\r\n private getStatus(value: unknown, error: unknown): PrereqStatus {\r\n if (value) return 'success';\r\n if (error) return 'failed';\r\n return 'pending';\r\n }\r\n\r\n private apiBaseUrl = '';\r\n\r\n // Public accessors for auth state and user info\r\n /** Gets if user is authenticated */\r\n readonly isAuthenticated = computed(() => this._isAuthenticated());\r\n\r\n /** Gets if user is currently authenticating */\r\n readonly isAuthenticating = computed(() => this._isAuthenticating());\r\n\r\n /** Sets remember_me */\r\n readonly setRememberMe = (value: boolean = false): void => {\r\n this.rememberMeSubject.next(value);\r\n this.storageService.set('remember_me', value);\r\n };\r\n\r\n /** Gets remember_me */\r\n readonly rememberMe = (): boolean | false => this.storageService.get('remember_me') ?? false;\r\n\r\n /** `user_id` of logged in user */\r\n readonly userId = (): string | null => this.storageService.get<string>('user_id');\r\n\r\n /** `username` of logged in user */\r\n readonly username = (): string => this.storageService.get<string>('username') ?? 'User';\r\n\r\n /** Logged-in user avatar URL */\r\n readonly profileImageUrl = (): string | null =>\r\n this.storageService.get<string>('profile_image_url') ?? '';\r\n\r\n /** `email` of logged in user */\r\n readonly email = (): string | null =>\r\n this.storageService.get<string>('email') ?? 'user@gmail.com';\r\n\r\n /** `roles` of logged in user */\r\n readonly roles = (): string | null => this.storageService.get<string>('roles');\r\n\r\n /** `permissions` of logged in user */\r\n readonly permissions = (): string | null => this.storageService.get<string>('permissions');\r\n\r\n /** `organization_id` of logged in user */\r\n readonly organizationId = (): string | null => this.storageService.get<string>('organization_id');\r\n\r\n /** `company_id` of logged in user */\r\n readonly companyId = (): string | null => this.storageService.get<string>('company_id');\r\n\r\n /** `access_token` of logged in user */\r\n readonly accessToken = (): string | null => this.storageService.get<string>('access_token');\r\n\r\n /** `refresh_token` of logged in user */\r\n readonly refreshToken = (): string | null => this.storageService.get<string>('refresh_token');\r\n\r\n /** Resolved API base URL */\r\n readonly apiUrl = (): string => this.configService.api()?.baseUrl ?? '';\r\n\r\n /** Sets current license file */\r\n readonly setLicenseFile = (data: Map<string, string> | null): void => {\r\n this.licenseFileSubject.next(data);\r\n };\r\n\r\n /** Gets current license file */\r\n readonly licenseFile = (): Map<string, string> | null => this.licenseFileSubject.value;\r\n\r\n /** Sets current federated auth token */\r\n readonly setFederatedAuthToken = (token: string | undefined): void => {\r\n this.federatedAuthTokenSubject.next(token ?? null);\r\n };\r\n\r\n /** Gets current federated auth token */\r\n readonly federatedAuthToken = (): string | null => this.federatedAuthTokenSubject.value;\r\n\r\n /** Sets current license_code */\r\n readonly setLicenseCode = (code: string | null): void => {\r\n this.licenseCodeSubject.next(code);\r\n };\r\n\r\n /** Gets current license_code */\r\n readonly licenseCode = (): string | null => this.licenseCodeSubject.value;\r\n\r\n /** Gets current license key for active license code */\r\n readonly currentLicenseKey = (): string | null => {\r\n const code = this.licenseCodeSubject.value;\r\n const map = this.licenseFileSubject.value;\r\n return code && map ? (map.get(code) ?? null) : null;\r\n };\r\n\r\n constructor(\r\n private http: HttpService,\r\n private storageService: StorageService,\r\n private configService: DoohbotConfigService,\r\n private snackbar: SnackbarService,\r\n ) {\r\n this.apiBaseUrl = this.configService.api()?.baseUrl ?? '';\r\n\r\n // Attempt to restore authentication state on service initialization.\r\n // This will check for valid tokens and refresh if necessary.\r\n this.authenticate().subscribe();\r\n }\r\n\r\n /**\r\n * Authenticate user based on stored tokens or refresh tokens.\r\n */\r\n private authenticate(): Observable<void> {\r\n const accessToken = this.accessToken();\r\n\r\n if (!accessToken) {\r\n //! For production ( Backend Validation )\r\n this._isAuthenticated.set(false);\r\n return of(void 0);\r\n }\r\n\r\n // Access token valid\r\n if (!this.isTokenExpired()) {\r\n this._isAuthenticated.set(true);\r\n return of(void 0);\r\n }\r\n\r\n // Token expired\r\n this._isAuthenticated.set(false);\r\n return of(void 0);\r\n\r\n // // Access Token expired -> try refresh\r\n // const refreshToken = this.refreshToken();\r\n // if (!refreshToken) {\r\n // this.clearAuth();\r\n // return of(void 0);\r\n // }\r\n\r\n // // Access expired but refresh token exists → attempt refresh\r\n // // Attempt refresh\r\n // return this.refreshLogin().pipe(\r\n // tap((result) => {\r\n // if (!result) {\r\n // this.clearAuth();\r\n // }\r\n // }),\r\n // map(() => void 0),\r\n // );\r\n }\r\n\r\n // /**\r\n // * Refresh login token.\r\n // */\r\n // refreshLogin(): Observable<AuthResult | null> {\r\n // try {\r\n // const refreshToken = this.refreshToken();\r\n // if (!refreshToken) {\r\n // this.clearAuth();\r\n // return of(null);\r\n // }\r\n\r\n // return from(\r\n // this.refreshLoginHttpHelper({\r\n // refresh_token: refreshToken,\r\n // } as RefreshRequest),\r\n // ).pipe(\r\n // map((result) => {\r\n // return result.data ?? null;\r\n // }),\r\n // tap((data) => {\r\n // if (!data?.access_token || !data?.refresh_token) {\r\n // Logger.error('Failed to re-login');\r\n // this._isAuthenticated.set(false);\r\n // return;\r\n // }\r\n\r\n // this.setSession(data);\r\n // this._isAuthenticated.set(true);\r\n // }),\r\n // catchError(() => {\r\n // this.clearAuth();\r\n // return of(null);\r\n // }),\r\n // finalize(() => {\r\n // // this.isRefreshing = false;\r\n // }),\r\n // shareReplay(1),\r\n // );\r\n // } catch (error) {\r\n // throw new Error('Unable to authenticate user');\r\n // }\r\n // }\r\n\r\n /**\r\n * True if doohbot API requests that are auth-related\r\n */\r\n isAuthUrl(url: string): boolean {\r\n try {\r\n const requestUrl = new URL(url, window.location.origin);\r\n const path = requestUrl.pathname.toLowerCase();\r\n const isDoohbotApi = this.isConsumerApiRequest(url);\r\n return (\r\n isDoohbotApi &&\r\n ['/auth/login', '/auth/federated/login', '/auth/refresh'].some((authPath) =>\r\n path.endsWith(authPath),\r\n )\r\n );\r\n } catch (error) {\r\n Logger.error('Error checking if URL is auth URL:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * True if if not a consumer API request (e.g. external API calls)\r\n */\r\n isConsumerApiRequest(url: string): boolean {\r\n try {\r\n const requestUrl = new URL(url, window.location.origin);\r\n const apiUrl = new URL(this.apiBaseUrl);\r\n return requestUrl.host === apiUrl.host;\r\n } catch (error) {\r\n Logger.error('Error checking if URL is doohbot API URL:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the federated authentication flow.\r\n *\r\n * Validates all required prerequisites (configuration, license, tokens)\r\n * and triggers authentication only when the system is in a valid state.\r\n *\r\n * This method is idempotent and safe to call multiple times; authentication\r\n * will execute only once when all conditions are satisfied.\r\n */\r\n initFederatedAuthFlow() {\r\n combineLatest([\r\n this.federatedAuthTokenSubject,\r\n this.rememberMeSubject,\r\n this.licenseFileSubject,\r\n this.licenseCodeSubject,\r\n ])\r\n .pipe(\r\n filter(\r\n ([federatedToken, rememberMe, licenseFile, licenseCode]) =>\r\n !!federatedToken && rememberMe !== null && !!licenseFile && !!licenseCode,\r\n ),\r\n take(1),\r\n switchMap(() => {\r\n // Login if no accessToken or is expired\r\n const accessToken = this.accessToken();\r\n const isExpiredToken = this.isTokenExpired(accessToken);\r\n if (isExpiredToken || !accessToken) {\r\n const loginRequest: FederatedLoginRequest = {\r\n access_token: this.federatedAuthTokenSubject.value!,\r\n remember_me: this.rememberMe(),\r\n };\r\n\r\n return from(this.federatedLogin(loginRequest));\r\n }\r\n\r\n return of(false);\r\n }),\r\n )\r\n .subscribe((success) => {\r\n if (!success) {\r\n return;\r\n }\r\n\r\n // Restores authenticated state\r\n return this.authenticate();\r\n });\r\n }\r\n\r\n /**\r\n * Authenticate user with federated credentials\r\n */\r\n\r\n async federatedLogin(param: FederatedLoginRequest): Promise<boolean> {\r\n this._isAuthenticating.set(true);\r\n try {\r\n const result: ApiResponse<{ access_token: string; refresh_token: string }> =\r\n await this.federateLoginHttpHelper(param);\r\n\r\n if (result.success && result.data) {\r\n const authResult = {\r\n access_token: result.data.access_token,\r\n refresh_token: param.remember_me ? result.data.refresh_token : '',\r\n };\r\n\r\n this.setSession(authResult, param.remember_me);\r\n this._loginErrorMessage.set(null);\r\n return true;\r\n } else {\r\n const errorMessage = this.extractErrorMessage(result);\r\n this.snackbar.error(errorMessage);\r\n this._loginErrorMessage.set(errorMessage);\r\n\r\n this._isAuthenticated.set(false);\r\n this.clearAuth();\r\n return false;\r\n }\r\n } catch (error: any) {\r\n const errorMessage = this.extractErrorMessage(error);\r\n this.snackbar.error(errorMessage);\r\n this._loginErrorMessage.set(errorMessage);\r\n\r\n this._isAuthenticated.set(false);\r\n this.clearAuth();\r\n return false;\r\n } finally {\r\n this._isAuthenticating.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Initializes session authentication flow for session auth mode.\r\n */\r\n initSessionAuthFlow(session: AuthResult | undefined): void {\r\n if (!session) {\r\n // this.authError.set('AuthResult is required for session mode.');\r\n this.snackbar.error('Something went wrong');\r\n return;\r\n }\r\n\r\n const token = session.access_token;\r\n if (!token) {\r\n this.snackbar.error('Invalid session data');\r\n return;\r\n }\r\n\r\n if (this.isTokenExpired(token)) {\r\n this.snackbar.error('Session Expired');\r\n this._isAuthenticated.set(false);\r\n return;\r\n }\r\n\r\n // Token is valid; set session\r\n this.setSession(session);\r\n this._isAuthenticated.set(true);\r\n\r\n // Trigger post-login initialization\r\n this.authenticate();\r\n }\r\n\r\n /**\r\n * Authenticate user with credentials\r\n */\r\n async login(param: LoginRequest): Promise<boolean> {\r\n this._isAuthenticating.set(true);\r\n try {\r\n const result = await this.loginHttpHelper(param);\r\n if (result && result.success && result.data) {\r\n this.setSession(result.data, param.rememberMe);\r\n this._loginErrorMessage.set(null);\r\n return true;\r\n } else {\r\n const errorMessage = this.extractErrorMessage(result);\r\n this.snackbar.error(errorMessage);\r\n this._loginErrorMessage.set(errorMessage);\r\n this._isAuthenticated.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n const errorMessage = this.extractErrorMessage(error);\r\n this.snackbar.error(errorMessage);\r\n this._loginErrorMessage.set(errorMessage);\r\n this._isAuthenticated.set(false);\r\n return false;\r\n } finally {\r\n this._isAuthenticating.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Logout user by clearing session and tokens, and calling logout API to invalidate refresh token.\r\n */\r\n async logout(): Promise<boolean> {\r\n const refreshToken = this.refreshToken();\r\n if (!refreshToken) {\r\n /**\r\n * If no \"refresh_token\" exists, simply clear auth without calling logout API.\r\n * This handles cases where user logged in without \"remember_me\" and the access token expired.\r\n *\r\n * Refresh token would not be in storage in this case, because we store it in sessionStorage for non-rememberMe logins,\r\n * which gets cleared when the browser/tab is closed.\r\n * So if \"refresh_token\" is missing, it likely means the user is already effectively logged out or in a state where logout API call is unnecessary.\r\n */\r\n this.clearAuth();\r\n return true;\r\n }\r\n\r\n try {\r\n const result = await this.logoutHttpHelper(refreshToken);\r\n if (result?.success) {\r\n this.clearAuth();\r\n return true;\r\n } else {\r\n this.snackbar.error('Logout failed');\r\n return false;\r\n }\r\n } catch (error) {\r\n this.snackbar.error('Logout failed');\r\n Logger.error('Logout failed', error);\r\n return false;\r\n }\r\n }\r\n\r\n // Http Helpers\r\n private async federateLoginHttpHelper(\r\n param: FederatedLoginRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n const header = this.buildLicenseHeader();\r\n return this.http.post('auth/federated/login', param, showLoader, header);\r\n }\r\n\r\n private loginHttpHelper(\r\n param?: LoginRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/login', param, showLoader);\r\n }\r\n\r\n private refreshLoginHttpHelper(\r\n param?: RefreshRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/refresh', param, showLoader);\r\n }\r\n\r\n private logoutHttpHelper(refreshToken: string, showLoader = false): Promise<ApiResponse<void>> {\r\n // Explicitly set the library's access token to override any project token\r\n const accessToken = this.accessToken();\r\n let headers = new HttpHeaders().set('X-Skip-Auth-Header', 'true');\r\n\r\n // Add the library's access token\r\n if (accessToken) {\r\n headers = headers.set('Authorization', `Bearer ${accessToken}`);\r\n }\r\n\r\n return this.http.post('auth/logout', { refresh_token: refreshToken }, showLoader, headers);\r\n }\r\n\r\n private buildLicenseHeader(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n const licenseKey = this.currentLicenseKey();\r\n if (!licenseKey) {\r\n Logger.warn('License key missing — request sent without license header');\r\n return headers;\r\n }\r\n\r\n return headers.set('x-license-key', licenseKey);\r\n }\r\n\r\n // Utility\r\n private setSession(session: AuthResult, rememberMe?: boolean | null | undefined) {\r\n if (rememberMe === null || rememberMe === undefined) {\r\n rememberMe = this.rememberMe();\r\n }\r\n\r\n const user = this.jwtHelper.decodeToken(session.access_token);\r\n\r\n // Should store tokens based on rememberMe preference (localStorage for rememberMe, sessionStorage for non-rememberMe)\r\n this.storageService.set('access_token', session.access_token);\r\n this.storageService.set('refresh_token', session.refresh_token, !rememberMe);\r\n\r\n this.storageService.set('user_id', user?.user_id);\r\n this.storageService.set('username', user?.username);\r\n this.storageService.set('email', user?.email);\r\n this.storageService.set('roles', user?.roles);\r\n this.storageService.set('permissions', user?.permissions);\r\n this.storageService.set('organization_id', user?.organization_id);\r\n this.storageService.set('company_id', user?.company_id);\r\n this.storageService.set('office_id', user?.office_id);\r\n this.storageService.set('profile_image_url', user?.profile_image_url);\r\n\r\n // Notify subscribers\r\n this._isAuthenticated.set(true);\r\n }\r\n\r\n private isTokenExpired(accessToken?: string | null): boolean {\r\n let token = accessToken || this.accessToken();\r\n if (token) {\r\n return this.jwtHelper.isTokenExpired(token);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * Clear all authentication related data from local storage, session storage, cache, and tokens.\r\n * This method is called when the user logs out.\r\n */\r\n clearAuth() {\r\n this.storageService.clearStorage();\r\n this._isAuthenticated.set(false);\r\n Logger.info('[Auth] Auth cleared successfully');\r\n }\r\n\r\n private extractErrorMessage(error: any): string {\r\n if (!error) return 'Something went wrong';\r\n\r\n // If it's an HttpErrorResponse (standard Angular), the backend body is in .error\r\n // If HttpService returns 'of(error)', result might be the HttpErrorResponse object\r\n const backendData = error.error || error;\r\n\r\n const message =\r\n backendData.message ||\r\n backendData.errorCode ||\r\n error.message ||\r\n 'Something went wrong. Please try again later.';\r\n\r\n return message;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport MarkdownIt from 'markdown-it';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MarkdownService {\r\n private md = new MarkdownIt({\r\n html: false, // Disable HTML tags for security\r\n linkify: true, // Auto-convert URLs to links\r\n typographer: true, // Smart quotes, dashes, etc.\r\n breaks: true, // ✅ Convert \\n to <br> (CRITICAL for line breaks)\r\n xhtmlOut: true, // Use XHTML-compatible output\r\n });\r\n\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n convert(markdown: string): SafeHtml {\r\n if (!markdown || markdown.trim() === '') {\r\n return '';\r\n }\r\n\r\n try {\r\n // marked.parse() is synchronous by default\r\n const html = this.md.render(markdown);\r\n return this.sanitizer.bypassSecurityTrustHtml(html);\r\n } catch (error) {\r\n console.error('Markdown parsing error:', error);\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n markdown.replace(/</g, '&lt;').replace(/>/g, '&gt;'),\r\n );\r\n }\r\n }\r\n}\r\n","import { Injectable, signal, inject, computed } from '@angular/core';\r\nimport { Subject, lastValueFrom } from 'rxjs';\r\nimport { ChatSessionDto } from './model/chat-session.model';\r\nimport { ChatHistoryService } from './services/chat-history.service';\r\nimport { ChatApiService } from './services/chat-api.service';\r\nimport { DOOHBOT_ADVANCED_CONFIG } from '../../core/models/doohbot-config.model';\r\nimport { Message } from '../../core/models/message';\r\nimport { PromptMode } from '../../core/types/prompt-mode.type';\r\nimport { ChatRequest } from './model/chat-request.model';\r\nimport { ChatStreamMessage } from './model/chat-stream-message.model';\r\nimport { AuthService } from './../../core/auth/auth.service';\r\n\r\nimport { DoohbotConfigService } from '../../core/config/doohbot-config.service';\r\nimport { Logger } from '../../core/utils/logger.service';\r\nimport { MarkdownService } from '../../core/services/markdown.service';\r\nimport { SnackbarService } from '../../shared/snackbar/snackbar.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatService {\r\n // Dependencies\r\n private apiService = inject(ChatApiService);\r\n private snackbar = inject(SnackbarService);\r\n private authService = inject(AuthService);\r\n private configService = inject(DoohbotConfigService);\r\n private config = inject(DOOHBOT_ADVANCED_CONFIG, { optional: true });\r\n private chatHistoryService = inject(ChatHistoryService);\r\n private markdownService = inject(MarkdownService);\r\n private chatSessions = this.chatHistoryService.sessions;\r\n\r\n //! ===================== UI STATE SIGNALS ============================\r\n\r\n /**\r\n * Whether the chat window is currently open\r\n */\r\n public isChatOpen = signal(false);\r\n\r\n /**\r\n * Whether the history sidebar is currently open\r\n */\r\n public isHistorySidebarOpen = signal(false);\r\n\r\n /**\r\n * Whether the chat is in fullscreen mode\r\n */\r\n public isFullScreen = signal(false);\r\n\r\n /**\r\n * ID of the last message that was read by the user\r\n */\r\n private lastReadMessageId = signal<string | null>(null);\r\n\r\n /**\r\n * Computed number of unread bot messages\r\n */\r\n public unreadCount = computed(() => {\r\n if (this.isChatOpen()) {\r\n return 0; // No unread when chat is open\r\n }\r\n\r\n const messages = this.messages();\r\n if (messages.length === 0) return 0;\r\n\r\n const lastReadId = this.lastReadMessageId();\r\n let lastReadIndex = -1;\r\n\r\n if (lastReadId !== null) {\r\n lastReadIndex = messages.findIndex((msg) => msg.id === lastReadId);\r\n }\r\n\r\n // Count unread bot messages after last read position\r\n const unreadBotMessages = messages\r\n .slice(lastReadIndex + 1)\r\n .filter((msg) => msg.sender === 'model');\r\n\r\n return unreadBotMessages.length;\r\n });\r\n\r\n //! ===================== EFFECTS ========================\r\n\r\n /**\r\n * Effect to automatically mark messages as read when chat is opened\r\n */\r\n // private markAsReadEffect = effect(\r\n // () => {\r\n // const isOpen = this.isChatOpen();\r\n // const msgs = this.messages();\r\n\r\n // if (isOpen && msgs.length > 0) {\r\n // const lastMessage = msgs[msgs.length - 1];\r\n // if (lastMessage?.id) {\r\n // const currentLastRead = this.lastReadMessageId();\r\n // if (lastMessage.id !== currentLastRead) {\r\n // this.lastReadMessageId.set(lastMessage.id);\r\n // }\r\n // }\r\n // }\r\n // },\r\n // { allowSignalWrites: true },\r\n // );\r\n\r\n // Public messages signal for current context\r\n public messages = signal<Message[]>([]);\r\n\r\n /**\r\n * Determine if suggestion chips should be shown\r\n */\r\n public showSuggestionChips = computed(() => {\r\n const msgs = this.messages();\r\n if (msgs.length === 0) return false;\r\n const lastBotMsg = [...msgs].reverse().find((m) => m.sender === 'model');\r\n return lastBotMsg?.showSuggestions === true;\r\n });\r\n\r\n // Active session signal\r\n public activeSession = signal<ChatSessionDto | null>(null);\r\n\r\n // UI state signals (Keep these here as they are relevant to the Chat UI state)\r\n public isLoadingApi = signal<boolean>(false);\r\n public isBotTyping = signal<boolean>(false);\r\n public promptMode = signal<PromptMode>('markdown');\r\n\r\n //! Controls whether to use Streaming API (default) or Standard API\r\n // public isStreaming = computed(() => !this.configService.api);\r\n public isStreaming = computed(() => !this.configService.useNonStreamingChat());\r\n\r\n messagesStream: Array<ChatStreamMessage> = [];\r\n currentResponse = '';\r\n\r\n getFallbackError(): string {\r\n return 'Something went wrong. Please try again.';\r\n }\r\n\r\n constructor() {\r\n Logger.info('ChatService: Initialized');\r\n\r\n // Initialize prompt mode from config if available\r\n if (this.config?.promptMode) {\r\n this.promptMode.set(this.config.promptMode);\r\n }\r\n }\r\n\r\n //! =================== UI STATE METHODS ===========================\r\n\r\n /**\r\n * Toggle the chat window open/close state\r\n */\r\n toggleChat(): void {\r\n const currentlyOpen = this.isChatOpen();\r\n this.isChatOpen.update((open) => !open);\r\n\r\n // Mark messages as read when opening chat\r\n if (!currentlyOpen) {\r\n const msgs = this.messages();\r\n if (msgs.length > 0) {\r\n const lastMessage = msgs[msgs.length - 1];\r\n this.lastReadMessageId.set(lastMessage.id ?? null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the history sidebar open/close state\r\n */\r\n toggleHistorySidebar(): void {\r\n this.isHistorySidebarOpen.update((open) => !open);\r\n }\r\n\r\n /**\r\n * Close the chat window\r\n */\r\n closeChat(): void {\r\n this.isChatOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the chat window\r\n */\r\n openChat(): void {\r\n this.isChatOpen.set(true);\r\n }\r\n\r\n /**\r\n * Close the history sidebar\r\n */\r\n closeHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the history sidebar\r\n */\r\n openHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(true);\r\n }\r\n\r\n /**\r\n * Toggle fullscreen mode\r\n */\r\n toggleFullscreen(): void {\r\n this.isFullScreen.update((fs) => !fs);\r\n }\r\n\r\n /**\r\n * Set fullscreen state\r\n */\r\n setFullscreen(isFullscreen: boolean): void {\r\n this.isFullScreen.set(isFullscreen);\r\n }\r\n\r\n /**\r\n * Manually mark messages as read up to a specific message ID\r\n */\r\n markMessagesAsRead(messageId: string): void {\r\n this.lastReadMessageId.set(messageId);\r\n }\r\n\r\n /**\r\n * Reset last read message ID\r\n */\r\n resetLastRead(): void {\r\n this.lastReadMessageId.set(null);\r\n }\r\n\r\n /**\r\n * Get the last read message ID\r\n */\r\n getLastReadMessageId(): string | null {\r\n return this.lastReadMessageId();\r\n }\r\n\r\n //! ==================== STATE MANAGEMENT ====================\r\n\r\n /**\r\n * Start a new chat session\r\n */\r\n public startNewSession(sessionId?: string): void {\r\n const userId = this.authService.userId();\r\n if (!userId) {\r\n throw new Error('Unauthorized user');\r\n }\r\n\r\n this.isBotTyping.set(false);\r\n this.isLoadingApi.set(false);\r\n\r\n const newSession = this.chatHistoryService.createSession(userId, sessionId || '');\r\n this.activeSession.set(newSession);\r\n this.messages.set([]);\r\n }\r\n\r\n /**\r\n * Load an existing session\r\n */\r\n public loadSession(session: ChatSessionDto): void {\r\n Logger.info(\r\n '[ChatService] Loading session:',\r\n session.response_id,\r\n 'Messages:',\r\n session.messages.length,\r\n );\r\n this.activeSession.set(session);\r\n // Load session messages and convert markdown for completed model messages\r\n this.messages.set(\r\n session.messages.map((m) =>\r\n m.sender === 'model' && m.completed\r\n ? {\r\n ...m,\r\n textHtml: this.markdownService.convert(m.text),\r\n }\r\n : m,\r\n ),\r\n );\r\n Logger.info('[ChatService] Messages signal updated. Current count:', this.messages().length);\r\n }\r\n\r\n /**\r\n * Get active session\r\n */\r\n public getActiveSession(): ChatSessionDto | null {\r\n return this.activeSession();\r\n }\r\n\r\n /**\r\n * Clear messages for current session and start new one\r\n */\r\n clearMessages(): void {\r\n this.messages.set([]);\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Add message to current session\r\n */\r\n public addMessage(message: Message): void {\r\n const newMessage = { ...message, timestamp: new Date() };\r\n\r\n // Update current messages signal\r\n this.messages.update((msgs) => [...msgs, newMessage]);\r\n }\r\n\r\n /**\r\n * Continue a chat session\r\n */\r\n public async continueSession(sessionId: string): Promise<void> {\r\n Logger.info(`[ChatService] continuing session: ${sessionId}`);\r\n this.isLoadingApi.set(true);\r\n try {\r\n const result = await this.chatHistoryService.loadSessionMessages(sessionId);\r\n const loadedMessages = result || [];\r\n const sessionFromList = this.chatSessions().find((s) => s.response_id === sessionId);\r\n\r\n if (sessionFromList) {\r\n sessionFromList.messages = loadedMessages;\r\n this.loadSession(sessionFromList);\r\n } else {\r\n const timestamp =\r\n loadedMessages.length > 0\r\n ? loadedMessages[loadedMessages.length - 1].timestamp || new Date()\r\n : new Date();\r\n\r\n const userId = this.authService.userId();\r\n if (!userId) {\r\n throw new Error('Unauthorized user');\r\n }\r\n\r\n const newSession: ChatSessionDto = {\r\n response_id: sessionId,\r\n last_message_at: timestamp,\r\n title: 'Previous Conversation',\r\n messages: loadedMessages,\r\n userId,\r\n };\r\n this.loadSession(newSession);\r\n }\r\n this.openChat();\r\n } finally {\r\n this.isLoadingApi.set(false);\r\n }\r\n }\r\n\r\n //! ==================== MESSAGE PROCESSING ====================\r\n\r\n /**\r\n * Process a user message: add it, get bot reply, and add bot reply\r\n */\r\n public async sendMessage(text: string, maxLength: number = 4000): Promise<void> {\r\n const trimmedText = text.trim();\r\n if (!trimmedText) return;\r\n\r\n if (trimmedText.length > maxLength) {\r\n this.snackbar.error('Message too long.');\r\n return;\r\n }\r\n\r\n const requestSession = this.activeSession();\r\n\r\n this.addMessage({\r\n sender: 'user',\r\n text: trimmedText,\r\n completed: true,\r\n isHistory: false,\r\n id: this.generateMessageId(),\r\n timestamp: new Date(),\r\n });\r\n\r\n this.isBotTyping.set(true);\r\n this.isLoadingApi.set(true);\r\n\r\n try {\r\n const request = this.buildChatRequest(trimmedText);\r\n\r\n if (this.isStreaming()) {\r\n // STREAMING HANDLES MODEL MESSAGE ITSELF\r\n await this.stream(request);\r\n } else {\r\n // NON-STREAMING RETURNS FULL TEXT\r\n const response = await this.ask(request);\r\n\r\n if (this.activeSession() === requestSession && response) {\r\n this.addMessage({\r\n sender: 'model',\r\n text: response,\r\n completed: true,\r\n isHistory: false,\r\n id: this.generateMessageId(),\r\n });\r\n }\r\n }\r\n } finally {\r\n if (this.activeSession() === requestSession) {\r\n this.isBotTyping.set(false);\r\n this.isLoadingApi.set(false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generates a unique message ID to prevent collisions\r\n */\r\n private generateMessageId(): string {\r\n return crypto.randomUUID();\r\n }\r\n\r\n /**\r\n * Builds a chat request payload with the given user text and optional active session\r\n * @param {string} userInput - The text provided by the user\r\n * @returns {ChatRequest} - A chat request payload with the user text and optional active session\r\n * @memberof ChatService\r\n */\r\n\r\n private buildChatRequest(userText: string): ChatRequest {\r\n const request: ChatRequest = {\r\n query: userText,\r\n organization_id: this.authService.organizationId() || '',\r\n prompt_mode: this.promptMode(),\r\n };\r\n\r\n // Continue conversation if active session exists and has a backend ID\r\n if (this.activeSession()?.response_id) {\r\n request.response_id = this.activeSession()?.response_id;\r\n Logger.info('>>>> conversation continued:', this.activeSession()?.response_id);\r\n } else {\r\n Logger.info('>>>> new conversation started');\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Send chat message using standard endpoint and return the response content.\r\n */\r\n private async ask(request: ChatRequest): Promise<string> {\r\n Logger.info('>>>>Using Standard Chat Endpoint<<<<');\r\n\r\n const currentSession = this.activeSession();\r\n\r\n try {\r\n const response = await this.apiService.sendMessage(request, true); // returns Promise<ApiResponse<ChatResponse>>\r\n\r\n if (this.activeSession() === currentSession) {\r\n this.isLoadingApi.set(false);\r\n }\r\n\r\n if (response?.success && response.data) {\r\n if (\r\n this.activeSession() === currentSession &&\r\n this.activeSession() &&\r\n !this.activeSession()?.response_id\r\n ) {\r\n // First message response - capture the real session ID\r\n const session = this.activeSession();\r\n if (session) session.response_id = response.data.id;\r\n // Invalidate cache to ensure history list updates\r\n this.chatHistoryService.invalidateCache();\r\n }\r\n return response.data.content || this.getFallbackError();\r\n } else {\r\n return this.getFallbackError();\r\n }\r\n } catch (error) {\r\n Logger.error('Ask error:', error);\r\n\r\n if (this.activeSession() === currentSession) {\r\n this.isLoadingApi.set(false);\r\n this.isBotTyping.set(false);\r\n }\r\n\r\n return this.getFallbackError();\r\n }\r\n }\r\n\r\n private async stream(request: ChatRequest): Promise<void> {\r\n Logger.info('>>>>Using Stream Chat Endpoint<<<<');\r\n\r\n const assistantMessage: Message = {\r\n id: this.generateMessageId(),\r\n sender: 'model',\r\n text: '',\r\n chunks: [],\r\n timestamp: new Date(),\r\n completed: false,\r\n isHistory: false,\r\n showSuggestions: false,\r\n };\r\n\r\n const requestSession = this.activeSession();\r\n const streamComplete$ = new Subject<void>();\r\n let hasStarted = false;\r\n\r\n this.apiService.sendMessageStream(request).subscribe({\r\n next: (chunk) => {\r\n if (this.activeSession() !== requestSession) return;\r\n\r\n if (!hasStarted) {\r\n hasStarted = true;\r\n this.isBotTyping.set(false);\r\n\r\n this.addMessage(assistantMessage);\r\n\r\n // capture backend session id once\r\n const session = this.activeSession();\r\n if (session && !session.response_id && chunk.response_id) {\r\n session.response_id = chunk.response_id;\r\n this.chatHistoryService.invalidateCache();\r\n }\r\n }\r\n\r\n if (!chunk.content) return;\r\n\r\n const newText = assistantMessage.text + chunk.content;\r\n assistantMessage.text = newText;\r\n\r\n const html = this.markdownService.convert(newText);\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id ? { ...m, text: newText, textHtml: html } : m,\r\n ),\r\n );\r\n },\r\n complete: () => {\r\n if (this.activeSession() !== requestSession) return;\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) => (m.id === assistantMessage.id ? { ...m, completed: true } : m)),\r\n );\r\n\r\n streamComplete$.next();\r\n streamComplete$.complete();\r\n },\r\n error: () => {\r\n if (this.activeSession() !== requestSession) return;\r\n\r\n const fallback = this.getFallbackError();\r\n const html = this.markdownService.convert(fallback);\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id\r\n ? { ...m, text: fallback, textHtml: html, completed: true }\r\n : m,\r\n ),\r\n );\r\n\r\n streamComplete$.next();\r\n streamComplete$.complete();\r\n },\r\n });\r\n\r\n await lastValueFrom(streamComplete$);\r\n }\r\n}\r\n","import { ButtonStyle } from './../../../../core/models/theme-config.model';\r\nimport { DoohbotConfigService } from './../../../../core/config/doohbot-config.service';\r\nimport { Component, computed, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { ChatService } from '../../chat.service';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\n\r\n@Component({\r\n selector: 'app-chat-button',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-button.component.html',\r\n styleUrls: ['./chat-button.component.scss'],\r\n})\r\nexport class ChatButtonComponent implements OnInit {\r\n isChatOpen = this.chatService.isChatOpen;\r\n unreadCount = this.chatService.unreadCount;\r\n isAuthenticating = this.authService.isAuthenticating;\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n public readonly buttonStyle = computed<ButtonStyle>(() => {\r\n return this.configService.theme()?.buttonStyle ?? 'fab';\r\n });\r\n\r\n isSidebar = computed(() => {\r\n // return this.buttonStyle().startsWith('sidebar');\r\n return this.buttonStyle() === 'sidebar';\r\n });\r\n\r\n sidebarPosition = computed((): 'top' | 'center' | 'bottom' => {\r\n if (!this.isSidebar()) return 'center';\r\n if (this.buttonStyle() === 'sidebar') return 'center';\r\n return this.buttonStyle().split('-')[1] as 'top' | 'center' | 'bottom';\r\n });\r\n\r\n constructor(\r\n private chatService: ChatService,\r\n private configService: DoohbotConfigService,\r\n private authService: AuthService,\r\n ) {}\r\n\r\n ngOnInit(): void {}\r\n\r\n onToggle() {\r\n this.chatService.toggleChat();\r\n }\r\n}\r\n","<!-- fab -->\r\n@if (buttonStyle() === 'fab' && !isChatOpen()) {\r\n <button class=\"chat-fab\" (click)=\"onToggle()\" [disabled]=\"isAuthenticating()\">\r\n <div class=\"fab-content\" [class.loading]=\"isAuthenticating()\">\r\n <img style=\"width: 30px; height: 30px\" [src]=\"doohbotConst.appLogo\" />\r\n @if (unreadCount() > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount() > 9 ? '9+' : unreadCount() }}\r\n </span>\r\n }\r\n </div>\r\n @if (isAuthenticating()) {\r\n <div class=\"fab-loader\">\r\n <mat-spinner diameter=\"34\"></mat-spinner>\r\n </div>\r\n }\r\n </button>\r\n}\r\n\r\n<!-- sidebar button -->\r\n@if (isSidebar() && !isChatOpen()) {\r\n <button class=\"chat-sidebar\" (click)=\"onToggle()\" [ngClass]=\"sidebarPosition()\">\r\n <img\r\n style=\"transform: rotate(-90deg); width: 100px; height: 45px\"\r\n [src]=\"doohbotConst.appTextLogo\"\r\n />\r\n\r\n @if (unreadCount() > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount() > 9 ? '9+' : unreadCount() }}\r\n </span>\r\n }\r\n </button>\r\n}\r\n","export const PredefinedMessages = [\r\n 'Creating a proposal.',\r\n 'What is a screen?',\r\n 'What does SOV stand for?',\r\n];\r\n","import { Component, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { ChatService } from '../../chat.service';\r\n\r\n@Component({\r\n selector: 'app-chat-input',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-input.component.html',\r\n styleUrls: ['./chat-input.component.scss'],\r\n})\r\nexport class ChatInputComponent {\r\n //output\r\n send = output<string>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n constructor(public chatService: ChatService) {}\r\n\r\n onSend(text: string) {\r\n if (text.trim()) {\r\n this.send.emit(text);\r\n }\r\n }\r\n}\r\n","<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input\r\n #messageInput\r\n type=\"text\"\r\n [disabled]=\"chatService.isBotTyping()\"\r\n (keydown.enter)=\"\r\n !chatService.isBotTyping() && onSend(messageInput.value);\r\n !chatService.isBotTyping() && (messageInput.value = '')\r\n \"\r\n [placeholder]=\"doohbotConst.hintText\"\r\n />\r\n\r\n <button\r\n [disabled]=\"chatService.isBotTyping()\"\r\n (click)=\"onSend(messageInput.value); messageInput.value = ''\"\r\n >\r\n <mat-icon [class.disabled-icon]=\"chatService.isBotTyping()\">north</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { SharedMaterialModule } from '../material/material.module';\r\n\r\nexport interface ConfirmationDialogData {\r\n title: string;\r\n message: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n}\r\n\r\n@Component({\r\n selector: 'app-confirmation-dialog',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './confirmation-dialog.component.html',\r\n styleUrl: './confirmation-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfirmationDialogComponent {\r\n readonly dialogRef = inject(MatDialogRef<ConfirmationDialogComponent>);\r\n readonly data = inject<ConfirmationDialogData>(MAT_DIALOG_DATA);\r\n}\r\n","<div class=\"dialog-container\">\r\n <div class=\"dialog-header\">\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n </div>\r\n\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n @if (data.cancelText) {\r\n <button mat-button class=\"cancel-btn\" (click)=\"dialogRef.close(false)\" type=\"button\">\r\n {{ data.cancelText }}\r\n </button>\r\n }\r\n <button\r\n mat-raised-button\r\n class=\"confirm-btn\"\r\n [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n (click)=\"dialogRef.close(true)\"\r\n type=\"button\"\r\n >\r\n {{ data.confirmText || 'Confirm' }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>\r\n","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { SharedMaterialModule } from '../material/material.module';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface InputDialogData {\r\n title: string;\r\n message: string;\r\n initialValue: string;\r\n placeholder?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n}\r\n\r\n@Component({\r\n selector: 'app-input-dialog',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule, FormsModule],\r\n templateUrl: './input-dialog.component.html',\r\n styleUrls: ['./input-dialog.component.scss'],\r\n})\r\nexport class InputDialogComponent {\r\n public value: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<InputDialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: InputDialogData,\r\n ) {\r\n this.value = data.initialValue;\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Save';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.placeholder = this.data.placeholder || 'Enter value...';\r\n this.data.confirmButtonColor = this.data.confirmButtonColor || 'primary';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(null);\r\n }\r\n\r\n onConfirm(): void {\r\n if (this.value && this.value.trim()) {\r\n this.dialogRef.close(this.value.trim());\r\n }\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n <div class=\"input-group\">\r\n <input type=\"text\" class=\"dialog-input\" [(ngModel)]=\"value\" [placeholder]=\"data.placeholder\"\r\n (keyup.enter)=\"onConfirm()\" focus=\"true\" />\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\">{{ data.cancelText }}</button>\r\n <button mat-flat-button class=\"confirm-btn\" [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n [class.primary-btn]=\"data.confirmButtonColor === 'primary'\"\r\n [class.accent-btn]=\"data.confirmButtonColor === 'accent'\" [disabled]=\"!value.trim()\" (click)=\"onConfirm()\">\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>","import { ComponentType } from '@angular/cdk/portal';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { MatDialog, MatDialogConfig } from '@angular/material/dialog';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport {\r\n ConfirmationDialogComponent,\r\n ConfirmationDialogData,\r\n} from './confirmation-dialog.component';\r\nimport { InputDialogComponent, InputDialogData } from '../input-dialog/input-dialog.component';\r\n\r\nexport interface DialogOptions<D = unknown> extends MatDialogConfig<D> {\r\n width?: string;\r\n}\r\n\r\nconst DEFAULT_DIALOG_OPTIONS: DialogOptions = {\r\n width: '560px',\r\n panelClass: 'app-dialog',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n // enterAnimationDuration: '0ms',\r\n // exitAnimationDuration: '0ms',\r\n};\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DialogService {\r\n private readonly dialog = inject(MatDialog);\r\n\r\n /**\r\n * Open any component as a Material dialog.\r\n * Returns an Observable that emits the dialog result when closed.\r\n */\r\n open<T, D = unknown, R = unknown>(\r\n component: ComponentType<T>,\r\n options: DialogOptions<D> = {},\r\n ): Observable<R | undefined> {\r\n const ref = this.dialog.open<T, D, R>(component, {\r\n ...DEFAULT_DIALOG_OPTIONS,\r\n ...options,\r\n } as MatDialogConfig<D>);\r\n return ref.afterClosed();\r\n }\r\n\r\n /**\r\n * Show a confirmation dialog.\r\n * true = confirmed, false/undefined = cancelled.\r\n */\r\n confirm(\r\n data: Omit<ConfirmationDialogData, 'cancelText' | 'confirmText'> & {\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n },\r\n ): Observable<boolean | undefined> {\r\n return this.open<ConfirmationDialogComponent, ConfirmationDialogData, boolean>(\r\n ConfirmationDialogComponent,\r\n {\r\n width: '400px',\r\n data: {\r\n confirmText: data.confirmText ?? 'Confirm',\r\n cancelText: data.cancelText ?? 'Cancel',\r\n confirmButtonColor: data.confirmButtonColor ?? 'primary',\r\n ...data,\r\n },\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Show an informational alert dialog.\r\n */\r\n alert(data: {\r\n title: string;\r\n message: string;\r\n okText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n }): Observable<boolean | undefined> {\r\n return this.confirm({\r\n ...data,\r\n confirmText: data.okText ?? 'OK',\r\n cancelText: '', // Empty string hides the cancel button in the template\r\n });\r\n }\r\n\r\n /**\r\n * Open an input dialog.\r\n * Returns the string value if confirmed, null if cancelled.\r\n */\r\n openInput(data: InputDialogData): Observable<string | null> {\r\n return this.open<InputDialogComponent, InputDialogData, string | null>(InputDialogComponent, {\r\n width: '400px',\r\n data,\r\n }).pipe(map((value) => value ?? null));\r\n }\r\n}\r\n","import { AuthService } from '../../../../core/auth/auth.service';\r\nimport { Component, computed, OnInit, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { DialogService } from '../../../../shared/confirmation-dialog/dialog.service';\r\nimport { ChatSessionDto, ChatSessionGroup } from '../../model/chat-session.model';\r\nimport { input, output } from '@angular/core';\r\nimport { ChatService } from '../../chat.service';\r\n\r\n@Component({\r\n selector: 'app-chat-history',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-history.component.html',\r\n styleUrls: ['./chat-history.component.scss'],\r\n})\r\nexport class ChatHistoryComponent implements OnInit {\r\n //inputs\r\n sessions = input<ChatSessionDto[]>([]);\r\n isOpen = input(false);\r\n // userName = input('User');\r\n isLoading = input(false);\r\n hasMoreSessions = input(false);\r\n isLoadingMore = input(false);\r\n processingSessionId = input<string | null>(null);\r\n activeSessionId = input<string | null>(null); // The ID of the currently active session\r\n // isFullScreen = input(false);\r\n\r\n //outputs\r\n sessionSelected = output<ChatSessionDto>();\r\n sessionDeleted = output<string>();\r\n closed = output<void>();\r\n loadMore = output<void>();\r\n refresh = output<void>();\r\n sessionRenamed = output<{ sessionId: string; newTitle: string }>();\r\n deleteAll = output<void>();\r\n\r\n // Use computed to automatically regroup when sessions change\r\n chatHistory = computed(() => {\r\n // Access signals\r\n const sessionsList = this.sessions();\r\n return this.groupSessions(sessionsList);\r\n });\r\n\r\n isFullScreen = signal(false);\r\n constructor(\r\n private dialogService: DialogService,\r\n private chatService: ChatService,\r\n public authService: AuthService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.isFullScreen = this.chatService.isFullScreen;\r\n }\r\n\r\n // Logic extracted to stand-alone method for computed usage\r\n private groupSessions(sessions: ChatSessionDto[]): ChatSessionGroup[] {\r\n const now = new Date();\r\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const yesterday = new Date(today);\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n const weekAgo = new Date(today);\r\n weekAgo.setDate(weekAgo.getDate() - 7);\r\n\r\n const groups: ChatSessionGroup[] = [\r\n { label: 'Today', sessions: [] },\r\n { label: 'Yesterday', sessions: [] },\r\n { label: 'This Week', sessions: [] },\r\n { label: 'Older', sessions: [] },\r\n ];\r\n\r\n // Deduplicate sessions by ID to prevent NG0955 error\r\n // Filter out sessions without IDs (new sessions not yet persisted)\r\n const sessionsWithIds = sessions.filter((s) => s.response_id !== null);\r\n const uniqueSessionsMap = new Map<string, ChatSessionDto>();\r\n sessionsWithIds.forEach((s) => uniqueSessionsMap.set(s.response_id!, s));\r\n const uniqueSessions = Array.from(uniqueSessionsMap.values());\r\n\r\n // Sort sessions by timestamp (newest first)\r\n const sortedSessions = uniqueSessions.sort(\r\n (a, b) => new Date(b.last_message_at).getTime() - new Date(a.last_message_at).getTime(),\r\n );\r\n\r\n sortedSessions.forEach((session) => {\r\n const sessionDate = new Date(session.last_message_at);\r\n const sessionDayStart = new Date(\r\n sessionDate.getFullYear(),\r\n sessionDate.getMonth(),\r\n sessionDate.getDate(),\r\n );\r\n\r\n if (sessionDayStart.getTime() === today.getTime()) {\r\n groups[0].sessions.push(session);\r\n } else if (sessionDayStart.getTime() === yesterday.getTime()) {\r\n groups[1].sessions.push(session);\r\n } else if (sessionDayStart.getTime() >= weekAgo.getTime()) {\r\n groups[2].sessions.push(session);\r\n } else {\r\n groups[3].sessions.push(session);\r\n }\r\n });\r\n\r\n // Filter out empty groups\r\n return groups.filter((g) => g.sessions.length > 0);\r\n }\r\n\r\n onSessionClick(session: ChatSessionDto): void {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onEditClick(event: Event, session: ChatSessionDto): void {\r\n event.stopPropagation();\r\n this.dialogService\r\n .openInput({\r\n title: 'Rename Conversation',\r\n message: 'Enter a new title for this conversation:',\r\n initialValue: session.title,\r\n placeholder: 'New title...',\r\n confirmText: 'Rename',\r\n })\r\n .subscribe((newTitle) => {\r\n if (\r\n newTitle !== null &&\r\n newTitle.trim() !== '' &&\r\n newTitle !== session.title &&\r\n session.response_id\r\n ) {\r\n this.sessionRenamed.emit({ sessionId: session.response_id, newTitle: newTitle.trim() });\r\n }\r\n });\r\n }\r\n\r\n onDeleteClick(event: Event, sessionId: string): void {\r\n if (!sessionId) return;\r\n event.stopPropagation();\r\n this.dialogService\r\n .confirm({\r\n title: 'Confirm Delete',\r\n message: 'Are you sure you want to delete this conversation? This action cannot be undone.',\r\n confirmText: 'Delete',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.sessionDeleted.emit(sessionId);\r\n }\r\n });\r\n }\r\n\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n\r\n formatTime(date: Date): string {\r\n return new Date(date).toLocaleTimeString('en-US', {\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n }\r\n\r\n formatDate(date: Date): string {\r\n return new Date(date).toLocaleDateString('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n }\r\n\r\n /**\r\n * Handle scroll event for infinite scroll\r\n */\r\n onScroll(event: Event): void {\r\n const element = event.target as HTMLElement;\r\n const scrollTop = element.scrollTop;\r\n const scrollHeight = element.scrollHeight;\r\n const clientHeight = element.clientHeight;\r\n\r\n // Check if scrolled near bottom (within 100px)\r\n const scrollBottom = scrollHeight - scrollTop - clientHeight;\r\n if (\r\n scrollBottom < 100 &&\r\n this.hasMoreSessions() &&\r\n !this.isLoadingMore() &&\r\n !this.isLoading()\r\n ) {\r\n this.loadMore.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Handle manual refresh\r\n */\r\n onRefresh(): void {\r\n this.refresh.emit();\r\n }\r\n\r\n /**\r\n * Handle clear all history\r\n */\r\n onClearAllClick(): void {\r\n this.dialogService\r\n .confirm({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.deleteAll.emit();\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"history-sidebar\" [class.open]=\"isOpen()\">\r\n <div class=\"sidebar-header\">\r\n <div class=\"marquee-container\">\r\n <h3 class=\"marquee-text\">{{ authService.username() }}</h3>\r\n </div>\r\n <button class=\"refresh-btn\" type=\"button\" (click)=\"onRefresh()\" matTooltip=\"Refresh history\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n\r\n @if (!isFullScreen()) {\r\n <button class=\"close-btn\" (click)=\"onClose()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"sidebar-content\" (scroll)=\"onScroll($event)\">\r\n @if (isLoading()) {\r\n <div class=\"loader-container\">\r\n <div class=\"loader\"></div>\r\n <p>Loading history...</p>\r\n </div>\r\n }\r\n\r\n @if (!isLoading() && sessions().length === 0) {\r\n <div class=\"empty-state\">\r\n <mat-icon>history</mat-icon>\r\n <p>No chat history yet</p>\r\n <span>Start a conversation to see it here</span>\r\n </div>\r\n }\r\n\r\n @if (!isLoading()) {\r\n @for (group of chatHistory(); track group.label) {\r\n <div class=\"session-group\">\r\n <div class=\"group-label\">{{ group.label }}</div>\r\n <div class=\"session-list\">\r\n @for (session of group.sessions; track session.response_id) {\r\n <div\r\n class=\"session-item\"\r\n [class.active]=\"activeSessionId() === session.response_id\"\r\n (click)=\"onSessionClick(session)\"\r\n >\r\n <div class=\"session-content\">\r\n <div class=\"session-title\">{{ session.title }}</div>\r\n <div class=\"session-time\">\r\n {{ formatTime(session.last_message_at) }} ·\r\n {{ formatDate(session.last_message_at) }}\r\n </div>\r\n </div>\r\n <div class=\"session-actions\">\r\n <button\r\n class=\"edit-btn\"\r\n [disabled]=\"processingSessionId() === session.response_id\"\r\n (click)=\"onEditClick($event, session)\"\r\n matTooltip=\"Edit\"\r\n >\r\n @if (processingSessionId() !== session.response_id) {\r\n <mat-icon>edit</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n <button\r\n class=\"delete-btn\"\r\n [disabled]=\"processingSessionId() === session.response_id\"\r\n (click)=\"onDeleteClick($event, session.response_id)\"\r\n matTooltip=\"Delete\"\r\n >\r\n @if (processingSessionId() !== session.response_id) {\r\n <mat-icon>delete</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Loading more indicator -->\r\n @if (isLoadingMore()) {\r\n <div class=\"loading-more\">\r\n <div class=\"loader-small\"></div>\r\n <p>Loading more...</p>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { Injectable, signal, inject, effect } from '@angular/core';\r\nimport { StorageService } from '../../core/auth/storage.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { HttpService } from '../../core/http/http.service';\r\nimport { ApiResponse } from '../../core/models/api-response.model';\r\n\r\nexport interface Characteristics {\r\n warm: string;\r\n enthusiastic: string;\r\n headersAndLists: string;\r\n emoji: string;\r\n}\r\n\r\nexport interface AboutYou {\r\n nickname: string;\r\n occupation: string;\r\n}\r\n\r\nexport interface CustomInstructions {\r\n instructions?: string;\r\n preferences?: string;\r\n user_context_id?: string;\r\n}\r\n\r\nexport interface AppearanceSettings {\r\n theme: 'light' | 'dark' | 'auto';\r\n language: string;\r\n}\r\n\r\nexport interface PersonalizationSettings {\r\n customInstructions: CustomInstructions;\r\n appearance: AppearanceSettings;\r\n meta: {\r\n version: number;\r\n lastUpdated: number;\r\n };\r\n}\r\n\r\nconst BASE_STORAGE_KEY = 'app.personalization.v1';\r\n\r\nconst DEFAULT_SETTINGS: PersonalizationSettings = {\r\n customInstructions: { instructions: '', preferences: '' },\r\n appearance: {\r\n theme: 'auto',\r\n language: 'en',\r\n },\r\n meta: {\r\n version: 1,\r\n lastUpdated: Date.now(),\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PersonalizationService {\r\n private storage = inject(StorageService);\r\n private authService = inject(AuthService);\r\n\r\n // State Signals\r\n private _settings = signal<PersonalizationSettings>(DEFAULT_SETTINGS);\r\n public settings = this._settings.asReadonly();\r\n\r\n constructor(private http: HttpService) {\r\n // Reload settings when auth status changes (user logins or logouts)\r\n effect(\r\n () => {\r\n // const status = this.authStatus();\r\n this._settings.set(this.loadSettings());\r\n },\r\n { allowSignalWrites: true }, // TODO:allowSignalWrites\r\n );\r\n // Automatically persist changes when settings signal updates\r\n effect(() => {\r\n const currentSettings = this._settings();\r\n this.saveSettings(currentSettings);\r\n });\r\n }\r\n\r\n private getStorageKey(): string {\r\n const userId = this.authService.userId();\r\n return userId ? `${BASE_STORAGE_KEY}_${userId}` : BASE_STORAGE_KEY;\r\n }\r\n\r\n /**\r\n * Update custom instructions\r\n */\r\n updateInstructions(instructions: Partial<CustomInstructions>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n customInstructions: {\r\n instructions: instructions.instructions ?? '',\r\n preferences: instructions.preferences ?? '',\r\n user_context_id: instructions.user_context_id ?? s.customInstructions.user_context_id,\r\n },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n /**\r\n * Update appearance settings\r\n */\r\n updateAppearance(appearance: Partial<AppearanceSettings>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n appearance: { ...s.appearance, ...appearance },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n /**\r\n * Reset all personalization to defaults\r\n */\r\n resetToDefaults() {\r\n this._settings.set({\r\n ...DEFAULT_SETTINGS,\r\n meta: { ...DEFAULT_SETTINGS.meta, lastUpdated: Date.now() },\r\n });\r\n }\r\n\r\n async saveCustomInstructions(data: CustomInstructions) {\r\n try {\r\n const current = this._settings().customInstructions;\r\n\r\n let res: ApiResponse<CustomInstructions> | null = null;\r\n\r\n if (current?.user_context_id) {\r\n // Update existing record\r\n res = await this.http.put(\r\n `users-context/`,\r\n data,\r\n true, // showLoader\r\n );\r\n } else {\r\n // Create new record\r\n res = await this.http.post('users-context/', data, true);\r\n }\r\n\r\n if (res?.success && res.data) {\r\n await this.updateInstructions({\r\n instructions: res.data.instructions ?? current?.instructions ?? '',\r\n preferences: res.data.preferences ?? current?.preferences ?? '',\r\n user_context_id: res.data.user_context_id ?? current?.user_context_id,\r\n });\r\n }\r\n } catch (e) {\r\n console.error('Failed saving custom instructions', e);\r\n }\r\n }\r\n\r\n loadCustomInstructions() {\r\n this.getCustomInstructionHttpHelper(true)\r\n .then((res) => {\r\n if (res?.success && res.data) {\r\n this.updateInstructions({\r\n instructions: res.data.instructions ?? '',\r\n preferences: res.data.preferences ?? '',\r\n user_context_id: res.data.user_context_id,\r\n });\r\n }\r\n })\r\n .catch((e) => {\r\n console.error('Failed loading user custom instructions', e);\r\n });\r\n }\r\n\r\n getCustomInstructionHttpHelper(showLoader = false): Promise<ApiResponse<CustomInstructions>> {\r\n const userId = this.authService.userId();\r\n return this.http.get(`users-context/${userId}`, undefined, false, showLoader);\r\n }\r\n\r\n private loadSettings(): PersonalizationSettings {\r\n try {\r\n const key = this.getStorageKey();\r\n // StorageService.get handles decryption/parsing\r\n const saved = this.storage.get(key) as any;\r\n if (saved) {\r\n return {\r\n ...DEFAULT_SETTINGS,\r\n ...saved,\r\n appearance: {\r\n ...DEFAULT_SETTINGS.appearance,\r\n ...(saved.appearance || {}),\r\n },\r\n };\r\n }\r\n } catch (e) {\r\n console.error('Failed to load personalization settings', e);\r\n }\r\n\r\n // Return defaults\r\n return {\r\n ...DEFAULT_SETTINGS,\r\n appearance: {\r\n ...DEFAULT_SETTINGS.appearance,\r\n },\r\n };\r\n }\r\n\r\n private saveSettings(settings: PersonalizationSettings) {\r\n const key = this.getStorageKey();\r\n this.storage.set(key, settings);\r\n }\r\n}\r\n","import {\r\n effect,\r\n ElementRef,\r\n Injectable,\r\n OnDestroy,\r\n Renderer2,\r\n RendererFactory2,\r\n signal,\r\n} from '@angular/core';\r\nimport { OverlayContainer } from '@angular/cdk/overlay';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\nimport { PersonalizationService } from '../../app/personalization/personalization.service';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService implements OnDestroy {\r\n private renderer: Renderer2;\r\n\r\n private _theme = signal<ThemeMode>('auto');\r\n public theme = this._theme.asReadonly();\r\n\r\n private _activeTheme = signal<'light-theme' | 'dark-theme'>('light-theme');\r\n public activeTheme = this._activeTheme.asReadonly();\r\n\r\n private observer: MutationObserver | null = null;\r\n private rootElement: HTMLElement | null = null;\r\n\r\n constructor(\r\n rendererFactory: RendererFactory2,\r\n private overlay: OverlayContainer,\r\n private personalization: PersonalizationService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n\r\n /**\r\n * Sync theme + primary color with personalization\r\n */\r\n effect(\r\n () => {\r\n const settings = this.personalization.settings();\r\n const mode = settings.appearance.theme;\r\n\r\n this._theme.set(mode);\r\n this.updateActiveTheme(mode);\r\n\r\n const configPrimaryColor = this.configService.theme()?.primaryColor;\r\n if (configPrimaryColor) {\r\n this.applyPrimaryColorToGlobal(configPrimaryColor);\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n }\r\n\r\n /**\r\n * Called by DoohbotComponent during init\r\n */\r\n public setThemeConfig(elementRef: ElementRef, isDarkMode?: boolean) {\r\n const host = elementRef.nativeElement;\r\n this.rootElement = host;\r\n\r\n const config = this.configService.theme();\r\n\r\n const activeTheme =\r\n isDarkMode !== undefined ? (isDarkMode ? 'dark-theme' : 'light-theme') : this._activeTheme();\r\n\r\n this.renderer.removeClass(host, 'light-theme');\r\n this.renderer.removeClass(host, 'dark-theme');\r\n this.renderer.addClass(host, activeTheme);\r\n\r\n /**\r\n * Always apply palette\r\n */\r\n const palette = config?.palette || 'doohbot';\r\n this.applyPaletteToGlobal(palette);\r\n\r\n /**\r\n * Apply CSS overrides if provided\r\n */\r\n this.applyCssVariables(host, config);\r\n }\r\n\r\n public applyPrimaryColorToGlobal(colorInput: string) {\r\n if (!colorInput || colorInput === 'default') return;\r\n\r\n let color = colorInput;\r\n\r\n if (color.includes(',')) {\r\n const parts = color.split(',').map((p) => p.trim());\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n color = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n }\r\n\r\n const targetElement = this.rootElement;\r\n if (!targetElement) return;\r\n\r\n const overlayContainer = this.overlay.getContainerElement();\r\n const onPrimary = this.getContrastColor(color);\r\n\r\n targetElement.style.setProperty('--db-primary', color);\r\n targetElement.style.setProperty('--db-primary-rgb', this.hexToRgb(color));\r\n targetElement.style.setProperty('--db-bg-user-msg', color);\r\n targetElement.style.setProperty('--db-text-user-msg', onPrimary);\r\n\r\n overlayContainer.style.setProperty('--db-primary', color);\r\n overlayContainer.style.setProperty('--db-primary-rgb', this.hexToRgb(color));\r\n }\r\n\r\n private hexToRgb(hex: string): string {\r\n const cleanHex = hex.replace('#', '');\r\n const r = parseInt(cleanHex.substring(0, 2), 16);\r\n const g = parseInt(cleanHex.substring(2, 4), 16);\r\n const b = parseInt(cleanHex.substring(4, 6), 16);\r\n return `${r}, ${g}, ${b}`;\r\n }\r\n\r\n private getContrastColor(hex: string): string {\r\n const cleanHex = hex.replace('#', '');\r\n const r = parseInt(cleanHex.substring(0, 2), 16);\r\n const g = parseInt(cleanHex.substring(2, 4), 16);\r\n const b = parseInt(cleanHex.substring(4, 6), 16);\r\n\r\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n\r\n return luminance > 0.6 ? '#000000' : '#ffffff';\r\n }\r\n\r\n setTheme(mode: ThemeMode): void {\r\n this.personalization.updateAppearance({ theme: mode });\r\n }\r\n\r\n private updateActiveTheme(mode: ThemeMode) {\r\n this.cleanupObservers();\r\n\r\n if (mode === 'auto') {\r\n this.handleAutoTheme();\r\n } else {\r\n const themeToApply = mode === 'dark' ? 'dark-theme' : 'light-theme';\r\n this._activeTheme.set(themeToApply);\r\n this.applyThemeToGlobal(themeToApply);\r\n }\r\n }\r\n\r\n private handleAutoTheme() {\r\n // Initial detection\r\n this.detectAndApplyParentTheme();\r\n\r\n // Watch for changes in parent\r\n this.observer = new MutationObserver(() => {\r\n this.detectAndApplyParentTheme();\r\n });\r\n\r\n this.observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n\r\n this.observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n }\r\n\r\n private detectAndApplyParentTheme() {\r\n const isDark = this.isParentDark();\r\n const newTheme = isDark ? 'dark-theme' : 'light-theme';\r\n\r\n // Only update if changed to avoid unnecessary DOM updates\r\n if (this._activeTheme() !== newTheme) {\r\n this._activeTheme.set(newTheme);\r\n this.applyThemeToGlobal(newTheme);\r\n }\r\n }\r\n\r\n private isParentDark(): boolean {\r\n const body = document.body;\r\n const html = document.documentElement;\r\n // Check for common class names\r\n\r\n const darkClasses = ['dark', 'dark-theme', 'dark-mode', 'night-mode'];\r\n\r\n const hasDarkClass = (el: HTMLElement) => darkClasses.some((c) => el.classList.contains(c));\r\n\r\n if (hasDarkClass(body) || hasDarkClass(html)) return true;\r\n // Check for data-theme attribute\r\n\r\n if (body.getAttribute('data-theme') === 'dark' || html.getAttribute('data-theme') === 'dark')\r\n return true;\r\n // Check for Bootstrap 5.3+ data-bs-theme\r\n\r\n if (\r\n body.getAttribute('data-bs-theme') === 'dark' ||\r\n html.getAttribute('data-bs-theme') === 'dark'\r\n )\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n private applyThemeToGlobal(theme: 'light-theme' | 'dark-theme') {\r\n const overlayContainer = this.overlay.getContainerElement();\r\n // Apply to the package root element to ensure local isolation\r\n\r\n if (this.rootElement) {\r\n this.renderer.removeClass(this.rootElement, 'light-theme');\r\n this.renderer.removeClass(this.rootElement, 'dark-theme');\r\n this.renderer.addClass(this.rootElement, theme);\r\n }\r\n // Also apply to overlay container (for menus/dialogs)\r\n\r\n this.renderer.removeClass(overlayContainer, 'light-theme');\r\n this.renderer.removeClass(overlayContainer, 'dark-theme');\r\n this.renderer.addClass(overlayContainer, theme);\r\n }\r\n\r\n private applyPaletteToGlobal(palette: string) {\r\n if (!this.rootElement) return;\r\n\r\n const overlayContainer = this.overlay.getContainerElement();\r\n\r\n const paletteClasses = [\r\n 'db-theme-doohbot',\r\n 'db-theme-aqua',\r\n 'db-theme-candy',\r\n 'db-theme-forest',\r\n 'db-theme-midnight',\r\n 'db-theme-sunset',\r\n 'db-theme-slate',\r\n ];\r\n\r\n const apply = (el: HTMLElement) => {\r\n paletteClasses.forEach((cls) => this.renderer.removeClass(el, cls));\r\n this.renderer.addClass(el, `db-theme-${palette}`);\r\n };\r\n\r\n apply(this.rootElement);\r\n apply(overlayContainer);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupObservers();\r\n }\r\n\r\n private cleanupObservers() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n }\r\n\r\n public applyCssVariables(element: HTMLElement, config?: DoohbotThemeConfig) {\r\n if (!config) return;\r\n\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n\r\n const applyColor = (input: string | undefined, variable: string) => {\r\n if (!input) return;\r\n\r\n const parts = input.split(',').map((p) => p.trim());\r\n const color = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n\r\n element.style.setProperty(`--${variable}`, color);\r\n this.overlay.getContainerElement().style.setProperty(`--${variable}`, color);\r\n };\r\n\r\n applyColor(config.secondaryColor, 'db-secondary');\r\n\r\n // Backgrounds\r\n applyColor(config.backgroundColor, 'db-bg-color');\r\n applyColor(config.chatInputColor, 'db-bg-chat-input');\r\n\r\n // Text Colors\r\n applyColor(config.textColor, 'db-text-primary');\r\n applyColor(config.secondaryTextColor, 'db-text-secondary');\r\n applyColor(config.textAltColor, 'db-text-tertiary');\r\n applyColor(config.hintTextColor, 'db-text-hint');\r\n\r\n // Button Colors\r\n applyColor(config.buttonColor, 'db-color-button');\r\n\r\n // Message Colors\r\n applyColor(config.userMessageColor, 'db-bg-user-msg');\r\n applyColor(config.botMessageColor, 'db-bg-bot-msg');\r\n\r\n // Message Text Colors\r\n applyColor(config.userTextColor, 'db-text-user-msg');\r\n applyColor(config.botTextColor, 'db-text-bot-msg');\r\n\r\n // Borders\r\n applyColor(config.borderColor, 'db-border-color');\r\n applyColor(config.borderShadowColor, 'db-border-shadow');\r\n applyColor(config.borderTopColor, 'db-border-top');\r\n\r\n // Indicators\r\n applyColor(config.typingIndicatorColor, 'db-color-typing');\r\n }\r\n}\r\n","import { ButtonStyle } from './../../../../core/models/theme-config.model';\r\nimport { DoohbotConfigService } from './../../../../core/config/doohbot-config.service';\r\nimport { Component, computed, input, OnInit, output, signal, inject } from '@angular/core';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { map } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { ThemeService } from '../../../../core/services/theme.service';\r\nimport { ChatService } from '../../chat.service';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\n\r\n@Component({\r\n selector: 'app-chat-header',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-header.component.html',\r\n styleUrls: ['./chat-header.component.scss'],\r\n})\r\nexport class ChatHeaderComponent implements OnInit {\r\n //inputs\r\n settingsMenu = input<any>();\r\n isNewChatDisabled = input(false);\r\n\r\n //outputs\r\n toggleFullScreen = output<void>();\r\n toggleHistorySidebar = output<void>();\r\n clearChat = output<void>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n public readonly buttonStyle = computed<ButtonStyle>(() => {\r\n return this.configService.theme()?.buttonStyle ?? 'fab';\r\n });\r\n\r\n public isFullScreen = signal(false);\r\n\r\n private breakpointObserver = inject(BreakpointObserver);\r\n public isMobile = toSignal(\r\n this.breakpointObserver.observe('(max-width: 768px)').pipe(map((result) => result.matches)),\r\n { initialValue: false },\r\n );\r\n\r\n constructor(\r\n private configService: DoohbotConfigService,\r\n public themeService: ThemeService,\r\n public chatService: ChatService,\r\n public authService: AuthService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.isFullScreen = this.chatService.isFullScreen;\r\n }\r\n\r\n onToggleChat() {\r\n this.chatService.toggleChat();\r\n // this.toggleChat.emit();\r\n }\r\n\r\n openHistorySidebar() {\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onStartNewConversation() {\r\n this.chatService.startNewSession();\r\n this.chatService.closeHistorySidebar();\r\n }\r\n}\r\n","<div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img class=\"chat-logo\" [src]=\"doohbotConst.appLogo\" alt=\"Logo\" />\r\n <h2>{{ doohbotConst.appTitle }}</h2>\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- New chat Button -->\r\n @if (authService.isAuthenticated()) {\r\n <button class=\"header-button\" (click)=\"onStartNewConversation()\" matTooltip=\"New Chat\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- History Button -->\r\n @if (authService.isAuthenticated() && (!isFullScreen() || isMobile())) {\r\n <button class=\"header-button\" (click)=\"openHistorySidebar()\" matTooltip=\"History\">\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- Full-Screen Button -->\r\n <button class=\"header-button\" (click)=\"onToggleFullScreen()\" matTooltip=\"Fullscreen\">\r\n <mat-icon>{{ isFullScreen() ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n </button>\r\n\r\n <!-- Profile Avatar / Menu Button -->\r\n @if (authService.isAuthenticated()) {\r\n <button\r\n class=\"header-button avatar-button\"\r\n [matMenuTriggerFor]=\"settingsMenu()\"\r\n matTooltip=\"Profile\"\r\n >\r\n @if (authService.profileImageUrl()) {\r\n <img [src]=\"authService.profileImageUrl()\" class=\"profile-avatar\" alt=\"Profile\" />\r\n } @else {\r\n <mat-icon>account_circle</mat-icon>\r\n }\r\n </button>\r\n }\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\" matTooltip=\"Minimize\">\r\n <mat-icon style=\"line-height: 0.3rem\">minimize</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n","import { Component, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SharedMaterialModule } from '../../shared/material/material.module';\r\nimport { doohbotConst } from '../../const/doohbot-constant';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\n\r\n@Component({\r\n selector: 'app-login-form',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, SharedMaterialModule],\r\n templateUrl: './login-form.component.html',\r\n styleUrls: ['./login-form.component.scss'],\r\n})\r\nexport class LoginFormComponent {\r\n public loginUsername = '';\r\n public loginPassword = '';\r\n public showPassword = false;\r\n public rememberMe = false;\r\n readonly doohbotConst = doohbotConst;\r\n readonly isLoggingIn = signal(false);\r\n\r\n constructor(private authService: AuthService) {}\r\n\r\n togglePasswordVisibility() {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n async onLoginSubmit() {\r\n if (!this.loginUsername || !this.loginPassword) return;\r\n\r\n this.isLoggingIn.set(true);\r\n\r\n try {\r\n await this.authService.login({\r\n username: this.loginUsername.toLowerCase(),\r\n password: this.loginPassword,\r\n rememberMe: this.rememberMe,\r\n });\r\n } finally {\r\n this.isLoggingIn.set(false);\r\n }\r\n }\r\n}\r\n","<div class=\"login-wrapper\">\r\n <form\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n #loginForm=\"ngForm\"\r\n >\r\n <img [src]=\"doohbotConst.appLogo\" alt=\"Welcome\" class=\"logo-image\" style=\"border-radius: 0px\" />\r\n <h3 class=\"login-title\">Login</h3>\r\n\r\n <div class=\"login-fields\">\r\n <!-- Username Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Username</label>\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n #username=\"ngModel\"\r\n placeholder=\"Enter your username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n @if (username.invalid && (username.dirty || username.touched)) {\r\n <span class=\"error-text\"> Username is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Password Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Password</label>\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n #password=\"ngModel\"\r\n placeholder=\"Enter your password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n @if (password.invalid && (password.dirty || password.touched)) {\r\n <span class=\"error-text\"> Password is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Remember Me -->\r\n <div class=\"remember-me-container\">\r\n <label class=\"remember-me-label\">\r\n <input\r\n type=\"checkbox\"\r\n name=\"rememberMe\"\r\n [(ngModel)]=\"rememberMe\"\r\n class=\"remember-me-checkbox\"\r\n />\r\n <span class=\"remember-me-text\">Remember me</span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button\r\n type=\"submit\"\r\n class=\"auth-btn primary\"\r\n [disabled]=\"loginForm.invalid || isLoggingIn()\"\r\n >\r\n {{ isLoggingIn() ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n </form>\r\n</div>\r\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chat-footer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chat-footer.component.html',\r\n styleUrls: ['./chat-footer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChatFooterComponent {\r\n showDisclaimer = input(false);\r\n}\r\n","@if (showDisclaimer()) {\r\n <div class=\"chat-footer-container\">\r\n <p class=\"disclaimer\">AI-generated content may not be accurate.</p>\r\n </div>\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chips',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chips.component.html',\r\n styleUrls: ['./chips.component.scss'],\r\n})\r\nexport class Chips {\r\n @Input() messages: string[] = []; // messages array\r\n @Input() disabled = false;\r\n @Output() chipClick = new EventEmitter<string>(); // emit clicked chip\r\n\r\n onChipClick(msg: string) {\r\n if (this.disabled) return;\r\n this.chipClick.emit(msg);\r\n }\r\n}\r\n","@if (messages.length > 0) {\r\n <div class=\"predefined-chips\">\r\n @for (msg of messages; track msg) {\r\n <button class=\"chip\" (click)=\"onChipClick(msg)\">\r\n {{ msg }}\r\n </button>\r\n }\r\n </div>\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\n\r\n@Component({\r\n selector: 'app-preferences-section',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './preferences-section.component.html',\r\n styleUrls: ['./preferences-section.component.scss'],\r\n})\r\nexport class PreferencesSectionComponent {\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() defaultColor: string = 'doohbot';\r\n @Input() username: string = 'User';\r\n @Input() userImageUrl: string | null = null;\r\n @Input() userRole: string = 'Doohbot User';\r\n\r\n // get initials(): string {\r\n // return this.username ? this.username.charAt(0).toUpperCase() : 'U';\r\n // }\r\n\r\n @Output() onThemeSelect = new EventEmitter<'light' | 'dark' | 'auto'>();\r\n @Output() onLanguageSelect = new EventEmitter<string>();\r\n @Output() onSave = new EventEmitter<void>();\r\n @Output() onReset = new EventEmitter<void>();\r\n\r\n public languages = [\r\n { code: 'en', label: 'English' },\r\n { code: 'es', label: 'Spanish' },\r\n { code: 'fr', label: 'French' },\r\n { code: 'de', label: 'German' },\r\n { code: 'it', label: 'Italian' },\r\n { code: 'pt', label: 'Portuguese' },\r\n { code: 'zh', label: 'Chinese' },\r\n { code: 'ja', label: 'Japanese' },\r\n { code: 'ko', label: 'Korean' },\r\n { code: 'ar', label: 'Arabic' },\r\n { code: 'hi', label: 'Hindi' },\r\n ];\r\n\r\n // Color and Style helpers removed\r\n\r\n getThemeIcon(theme: string): string {\r\n switch (theme) {\r\n case 'light':\r\n return 'light_mode';\r\n case 'dark':\r\n return 'dark_mode';\r\n default:\r\n return 'brightness_auto';\r\n }\r\n }\r\n\r\n getThemeLabel(theme: string): string {\r\n switch (theme) {\r\n case 'light':\r\n return 'Light Mode';\r\n case 'dark':\r\n return 'Dark Mode';\r\n default:\r\n return 'System';\r\n }\r\n }\r\n\r\n getLanguageLabel(code: string): string {\r\n return this.languages.find((l) => l.code === code)?.label || 'Select';\r\n }\r\n\r\n // Style and Picker helpers removed\r\n}\r\n","<div class=\"preferences-container\">\r\n <header class=\"pane-header\">\r\n <h1>General & Profile</h1>\r\n <p>Manage your profile and customize how your assistant looks.</p>\r\n </header>\r\n\r\n <div class=\"profile-card\">\r\n <div class=\"avatar-section\">\r\n <div class=\"letter-avatar\" [class.has-image]=\"!!userImageUrl\">\r\n @if (userImageUrl) {\r\n <img [src]=\"userImageUrl\" [alt]=\"username\" class=\"profile-img\" />\r\n } @else {\r\n <!-- {{ initials }} -->\r\n <mat-icon class=\"user-avatar-icon\">account_circle</mat-icon>\r\n }\r\n </div>\r\n <div class=\"user-main-info\">\r\n <h2>{{ username }}</h2>\r\n <p class=\"role-badge\">{{ userRole }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"info-grid\">\r\n <div class=\"info-item\">\r\n <label>Full Name</label>\r\n <div class=\"info-value\">{{ username }}</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Email Address</label>\r\n <div class=\"info-value\">user&#64;adzen.tech</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Organization</label>\r\n <div class=\"info-value\">Adzen Tech Private Limited</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Member Since</label>\r\n <div class=\"info-value\">January 2026</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"settings-list\">\r\n <!-- Appearance Row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Appearance</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select\r\n [value]=\"settings.appearance.theme\"\r\n (selectionChange)=\"onThemeSelect.emit($event.value)\"\r\n >\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <mat-icon>{{ getThemeIcon(settings.appearance.theme) }}</mat-icon>\r\n <span>{{ getThemeLabel(settings.appearance.theme) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"light\">\r\n <div class=\"option-content\">\r\n <mat-icon>light_mode</mat-icon>\r\n <span>Light Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"dark\">\r\n <div class=\"option-content\">\r\n <mat-icon>dark_mode</mat-icon>\r\n <span>Dark Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"auto\">\r\n <div class=\"option-content\">\r\n <mat-icon>brightness_auto</mat-icon>\r\n <span>System</span>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Language Row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Language</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select\r\n [value]=\"settings.appearance.language\"\r\n (selectionChange)=\"onLanguageSelect.emit($event.value)\"\r\n >\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <span>{{ getLanguageLabel(settings.appearance.language) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n @for (lang of languages; track lang.code) {\r\n <mat-option [value]=\"lang.code\">\r\n {{ lang.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Voice Placeholder -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Voice</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Cove</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Data Controls Placeholder -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Data controls</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Manage</button>\r\n </div>\r\n </div>-->\r\n </div>\r\n\r\n <div class=\"section-actions\">\r\n <button mat-button class=\"pill-btn\" (click)=\"onReset.emit()\">Reset to defaults</button>\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" (click)=\"onSave.emit()\">Save</button>\r\n </div>\r\n</div>\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-terms-section',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './terms-section.component.html',\r\n styleUrls: ['./terms-section.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TermsSectionComponent { }\r\n","<div class=\"terms-container\">\r\n <header class=\"pane-header\">\r\n <h1>Terms and Conditions</h1>\r\n <!-- <p class=\"last-updated\">Last updated: January 9, 2026</p> -->\r\n </header>\r\n\r\n <div class=\"terms-card\">\r\n <div class=\"terms-content\">\r\n <section>\r\n <h4>1. Acceptance of Terms</h4>\r\n <p>\r\n By using Doohbot, you agree to comply with and be bound by these terms and conditions.\r\n Please read them carefully.\r\n </p>\r\n </section>\r\n\r\n <section>\r\n <h4>2. Privacy & Data</h4>\r\n <p>\r\n We value your privacy. Your chat history and personalization settings are stored locally\r\n or securely on our servers to improve your experience.\r\n </p>\r\n </section>\r\n\r\n <section>\r\n <h4>3. Usage Guidelines</h4>\r\n <p>\r\n Doohbot is intended for professional use within the Doohclick ecosystem. Misuse or\r\n automated scraping is strictly prohibited.\r\n </p>\r\n </section>\r\n\r\n <div class=\"full-terms-link\">\r\n <a href=\"#\">View Full Terms and Conditions →</a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { DoohbotConfigService } from './../../../../core/config/doohbot-config.service';\r\nimport { Component, Input, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { DialogService } from '../../../../shared/confirmation-dialog/dialog.service';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\n\r\nexport interface ActiveSession {\r\n id: string;\r\n device: string;\r\n location: string;\r\n created: string;\r\n updated: string;\r\n isCurrent?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'app-account-section',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './account-section.component.html',\r\n styleUrls: ['./account-section.component.scss'],\r\n})\r\nexport class AccountSectionComponent {\r\n @Input() organizationId: string = '';\r\n public isCopied = false;\r\n\r\n constructor(\r\n public authService: AuthService,\r\n public config: DoohbotConfigService,\r\n private dialogService: DialogService,\r\n private cd: ChangeDetectorRef,\r\n ) {}\r\n\r\n ngOnInit() {\r\n if (!this.organizationId) {\r\n this.organizationId = this.authService.organizationId() || '';\r\n }\r\n }\r\n\r\n @Output() onDeleteAllHistory = new EventEmitter<void>();\r\n @Output() onLogoutSession = new EventEmitter<string>();\r\n @Output() onDeleteAccount = new EventEmitter<void>();\r\n\r\n onLogout() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Logout',\r\n message: 'Are you sure you want to log out?',\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.authService.logout();\r\n }\r\n });\r\n }\r\n\r\n public sessions: ActiveSession[] = [\r\n {\r\n id: 'session-1',\r\n device: 'Chrome (Windows)',\r\n location: 'Kathmandu, Bagmati Province, NP',\r\n created: 'Jan 9, 2026, 9:21 AM',\r\n updated: 'Jan 9, 2026, 9:21 AM',\r\n isCurrent: true,\r\n },\r\n ];\r\n\r\n copyOrgId() {\r\n const orgId = this.authService.organizationId();\r\n if (orgId) {\r\n navigator.clipboard.writeText(orgId);\r\n this.isCopied = true;\r\n this.cd.detectChanges();\r\n\r\n setTimeout(() => {\r\n this.isCopied = false;\r\n this.cd.detectChanges();\r\n }, 800);\r\n }\r\n }\r\n\r\n confirmLogoutSession(session: ActiveSession) {\r\n this.dialogService\r\n .confirm({\r\n title: 'Log out of session',\r\n message: `Are you sure you want to log out from ${session.device} at ${session.location}?`,\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) this.onLogoutSession.emit(session.id);\r\n });\r\n }\r\n\r\n confirmDeleteAllHistory() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) this.onDeleteAllHistory.emit();\r\n });\r\n }\r\n\r\n confirmDeleteAccount() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Delete Your Account',\r\n message:\r\n 'This will permanently delete your account and all associated data. This action is irreversible. Are you absolutely sure?',\r\n confirmText: 'Delete Account',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) this.onDeleteAccount.emit();\r\n });\r\n }\r\n}\r\n","<div class=\"account-container\">\r\n <header class=\"pane-header\">\r\n <h1>Account Settings</h1>\r\n <p>Manage your account details and personal information.</p>\r\n </header>\r\n\r\n <div class=\"settings-list\">\r\n <!-- Logout row -->\r\n @if (authService.isAuthenticated() && config.auth()?.mode == 'manual') {\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Log out</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn primary\" (click)=\"onLogout()\">Logout</button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Delete all chats row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Delete all chats</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmDeleteAllHistory()\">Delete all</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Export data row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Export data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Export</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Org ID row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Organization ID</span>\r\n <span class=\"row-sublabel\">Used for workspace identification</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <code class=\"org-id\">{{ organizationId }}</code>\r\n <button mat-icon-button (click)=\"copyOrgId()\" [matTooltip]=\"isCopied ? 'Copied!' : 'Copy ID'\">\r\n <mat-icon>{{ isCopied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Logout all row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Global Logout</span>\r\n <span class=\"row-sublabel\">Sign out from all active devices</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmLogoutAll()\">Logout all</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Delete account row -->\r\n <!-- <div class=\"settings-row no-border\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label danger-text\">Delete account</span>\r\n <span class=\"row-sublabel\">Permanently delete your profile and data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger-filled\" (click)=\"confirmDeleteAccount()\">Delete Account</button>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Active Sessions Section -->\r\n <!-- <div class=\"sessions-section\">\r\n <h3>Active sessions</h3>\r\n <div class=\"sessions-table-container\">\r\n <table class=\"sessions-table\">\r\n <thead>\r\n <tr>\r\n <th>Device</th>\r\n <th>Location</th>\r\n <th>Created</th>\r\n <th>Updated</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (session of sessions; track session.id) {\r\n <tr [class.current]=\"session.isCurrent\">\r\n <td>\r\n <div class=\"device-cell\">\r\n <mat-icon>{{ session.device.includes('Windows') ? 'laptop' : 'smartphone' }}</mat-icon>\r\n <div class=\"device-info\">\r\n <span class=\"device-name\">{{ session.device }}</span>\r\n @if (session.isCurrent) {\r\n <span class=\"current-badge\">Current</span>\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n <td>{{ session.location }}</td>\r\n <td>{{ session.created }}</td>\r\n <td>{{ session.updated }}</td>\r\n <td class=\"action-cell\">\r\n @if (!session.isCurrent) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"sessionMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #sessionMenu=\"matMenu\" xPosition=\"before\">\r\n <button mat-menu-item (click)=\"confirmLogoutSession(session)\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Log out of session</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n </div> -->\r\n</div>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\n\r\n@Component({\r\n selector: 'app-instruction-section',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, SharedMaterialModule],\r\n templateUrl: './instruction-section.component.html',\r\n styleUrls: ['./instruction-section.component.scss'],\r\n})\r\nexport class InstructionSectionComponent {\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() hasChanges = false;\r\n @Output() onSave = new EventEmitter<void>();\r\n}\r\n","<div class=\"instruction-container\">\r\n <header class=\"pane-header\">\r\n <h1>Personalization</h1>\r\n <p>Tell us more about yourself and how you want the assistant to respond.</p>\r\n </header>\r\n\r\n <div class=\"instruction-card\">\r\n <div class=\"instruction-fields\">\r\n <div class=\"field-item\">\r\n <label>What should the assistant know about you?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.preferences\"\r\n placeholder=\"e.g. I prefer code examples in TypeScript...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"field-item\">\r\n <label>How should the assistant respond?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.instructions\"\r\n placeholder=\"e.g. Be concise and use bullet points...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"section-actions\">\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" [disabled]=\"!hasChanges\" (click)=\"onSave.emit()\">\r\n Save\r\n </button>\r\n </div>\r\n</div>","import { Component, inject, OnDestroy, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { SharedMaterialModule } from '../../shared/material/material.module';\r\nimport { PreferencesSectionComponent } from './sections/preferences/preferences-section.component';\r\nimport { TermsSectionComponent } from './sections/terms/terms-section.component';\r\nimport { AccountSectionComponent } from './sections/account/account-section.component';\r\nimport { ChatHistoryService } from '../chat/services/chat-history.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { PersonalizationService, PersonalizationSettings } from './personalization.service';\r\nimport { DialogService } from '../../shared/confirmation-dialog/dialog.service';\r\nimport { SnackbarService } from '../../shared/snackbar/snackbar.service';\r\nimport { InstructionSectionComponent } from './sections/instruction/instruction-section.component';\r\n\r\n@Component({\r\n selector: 'app-personalization-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n SharedMaterialModule,\r\n PreferencesSectionComponent,\r\n InstructionSectionComponent,\r\n TermsSectionComponent,\r\n AccountSectionComponent,\r\n ],\r\n templateUrl: './personalization-dialog.component.html',\r\n styleUrls: ['./personalization-dialog.component.scss'],\r\n})\r\nexport class PersonalizationDialogComponent implements OnDestroy {\r\n public personalization = inject(PersonalizationService);\r\n private authService = inject(AuthService);\r\n private chatHistory = inject(ChatHistoryService);\r\n\r\n // Local copy of settings for editing\r\n public settings: PersonalizationSettings = JSON.parse(\r\n JSON.stringify(this.personalization.settings()),\r\n );\r\n\r\n public activeSection = 'preferences';\r\n\r\n public sections = [\r\n { id: 'preferences', label: 'General', icon: 'tune', type: 'item' },\r\n { id: 'general', label: 'Personalization', icon: 'settings_suggest', type: 'item' },\r\n { id: 'account_settings', label: 'Account & Security', icon: 'manage_accounts', type: 'item' },\r\n { id: 'terms', label: 'Terms & Conditions', icon: 'description', type: 'item' },\r\n ];\r\n\r\n constructor(\r\n private dialogRef: MatDialogRef<PersonalizationDialogComponent>,\r\n private dialogService: DialogService,\r\n private snackbar: SnackbarService,\r\n ) {\r\n effect(() => {\r\n const s = this.personalization.settings();\r\n this.settings = structuredClone(s);\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.personalization.loadCustomInstructions();\r\n }\r\n\r\n onSave() {\r\n if (this.activeSection === 'preferences') {\r\n this.personalization.updateAppearance(this.settings.appearance);\r\n // Re-apply to ensure consistency (effect handles it, but just in case)\r\n this.snackbar.success('Appearance settings saved');\r\n } else if (this.activeSection === 'general') {\r\n this.personalization.saveCustomInstructions(this.settings.customInstructions);\r\n this.snackbar.success('Settings saved');\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n ngOnDestroy() {\r\n // No color revert needed since primaryColor is config-driven\r\n }\r\n\r\n onReset() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Reset to Defaults',\r\n message:\r\n 'Are you sure you want to reset preferences to default settings? This action cannot be undone.',\r\n confirmText: 'Reset',\r\n cancelText: 'Cancel',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) {\r\n // Only reset the current section\r\n if (this.activeSection === 'preferences') {\r\n // Reset only appearance settings to defaults\r\n this.personalization.resetToDefaults();\r\n // Re-clone settings to update UI\r\n this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));\r\n }\r\n }\r\n });\r\n }\r\n\r\n selectTheme(theme: 'light' | 'dark' | 'auto') {\r\n this.settings.appearance.theme = theme;\r\n }\r\n\r\n selectLanguage(language: string) {\r\n this.settings.appearance.language = language;\r\n }\r\n\r\n selectSection(sectionId: string) {\r\n if (this.sections.find((s) => s.id === sectionId && s.type === 'item')) {\r\n this.activeSection = sectionId;\r\n }\r\n }\r\n\r\n get hasChanges(): boolean {\r\n if (this.activeSection === 'preferences') return this.hasPreferencesChanges();\r\n if (this.activeSection === 'general') return this.hasInstructionChanges();\r\n return false;\r\n }\r\n\r\n hasPreferencesChanges(): boolean {\r\n const original = this.personalization.settings().appearance;\r\n const current = this.settings.appearance;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n hasInstructionChanges(): boolean {\r\n const original = this.personalization.settings().customInstructions;\r\n const current = this.settings.customInstructions;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n get username(): string {\r\n return this.authService.username();\r\n }\r\n\r\n get userImageUrl(): string | null {\r\n return this.authService.profileImageUrl();\r\n }\r\n\r\n get userRole(): string {\r\n return this.authService.roles() || '';\r\n }\r\n\r\n // Color helpers removed\r\n\r\n async deleteAllHistory() {\r\n const userId = this.authService.userId() || '';\r\n await this.chatHistory.deleteAllHistory(userId);\r\n }\r\n\r\n logout() {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n deleteAccount() {\r\n console.log('Deleting account...');\r\n }\r\n}\r\n","<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"dialog-content-body\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div\r\n class=\"nav-item\"\r\n [class.active]=\"activeSection === section.id\"\r\n (click)=\"selectSection(section.id)\"\r\n >\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section\r\n [settings]=\"settings\"\r\n [username]=\"username\"\r\n [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\"\r\n (onThemeSelect)=\"selectTheme($event)\"\r\n (onLanguageSelect)=\"selectLanguage($event)\"\r\n (onSave)=\"onSave()\"\r\n (onReset)=\"onReset()\"\r\n >\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Security Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section\r\n (onDeleteAllHistory)=\"deleteAllHistory()\"\r\n (onLogout)=\"logout()\"\r\n (onDeleteAccount)=\"deleteAccount()\"\r\n ></app-account-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-instruction-section\r\n [settings]=\"settings\"\r\n [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"\r\n ></app-instruction-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </div>\r\n</div>\r\n","export const AppEmoji = {\r\n waveHand: '\\u{1F44B}',\r\n robotFace: '\\u{1F916}',\r\n partyPopper: '\\u{1F389}',\r\n thinkingFace: '\\u{1F914}',\r\n thumbsUp: '\\u{1F44D}',\r\n thumbsDown: '\\u{1F44E}',\r\n redHeart: '\\u{2764}\\u{FE0F}',\r\n};\r\n","import { signal } from '@angular/core';\r\n\r\nexport class Typewriter {\r\n private buffer = signal('');\r\n private queue = '';\r\n private typing = signal(false);\r\n private rafId: number | null = null;\r\n private lastTime = 0;\r\n\r\n constructor(private config: { msPerChar?: number } = {}) { }\r\n\r\n append(text: string) {\r\n if (!text) return;\r\n this.queue += text;\r\n if (!this.typing()) this.start();\r\n }\r\n\r\n private start() {\r\n this.typing.set(true);\r\n const msPerChar = this.config.msPerChar ?? 20;\r\n\r\n const tick = (time: number) => {\r\n if (!this.lastTime) this.lastTime = time;\r\n\r\n const delta = time - this.lastTime;\r\n const charsToAdd = Math.floor(delta / msPerChar);\r\n\r\n if (charsToAdd > 0 && this.queue.length) {\r\n const slice = this.queue.slice(0, charsToAdd);\r\n this.queue = this.queue.slice(charsToAdd);\r\n this.buffer.update(v => v + slice);\r\n this.lastTime = time;\r\n }\r\n\r\n if (!this.queue.length) {\r\n this.typing.set(false);\r\n this.lastTime = 0;\r\n this.rafId = null;\r\n return;\r\n }\r\n\r\n this.rafId = requestAnimationFrame(tick);\r\n };\r\n\r\n this.rafId = requestAnimationFrame(tick);\r\n }\r\n\r\n displayedText() {\r\n return this.buffer();\r\n }\r\n\r\n isTyping = this.typing;\r\n\r\n reset() {\r\n this.queue = '';\r\n this.buffer.set('');\r\n this.typing.set(false);\r\n this.lastTime = 0;\r\n if (this.rafId) cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n}\r\n","import { AuthService } from './../../../../core/auth/auth.service';\r\nimport { Component, input, output, computed, effect, signal, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { MarkdownService } from '../../../../core/services/markdown.service';\r\nimport { Typewriter } from '../../../../shared/utils/typewriter';\r\n\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\n\r\n@Component({\r\n selector: 'app-chat-message',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-message.component.html',\r\n styleUrls: ['./chat-message.component.scss'],\r\n})\r\nexport class ChatMessageComponent implements OnInit {\r\n message = input.required<Message>();\r\n doohbotConst = input.required<any>();\r\n appEmoji = input<any>();\r\n\r\n profileImageUrl = signal<string | null>(null);\r\n\r\n copyMessage = output<Message>();\r\n\r\n private typewriter = new Typewriter({ msPerChar: 4 }); //! speed of typing\r\n private lastLength = 0;\r\n\r\n isTyping = this.typewriter.isTyping;\r\n\r\n displayHtml = computed(() => {\r\n const msg = this.message();\r\n\r\n if (msg.sender === 'user') return '';\r\n\r\n if (msg.completed || msg.isHistory) {\r\n return msg.textHtml || this.markdownService.convert(msg.text);\r\n }\r\n\r\n return this.markdownService.convert(this.typewriter.displayedText());\r\n });\r\n\r\n constructor(\r\n private markdownService: MarkdownService,\r\n public authService: AuthService,\r\n ) {\r\n effect(() => {\r\n const msg = this.message();\r\n\r\n if (msg.sender !== 'model' || msg.isHistory) return;\r\n\r\n const text = msg.text ?? '';\r\n\r\n if (text.length > this.lastLength) {\r\n const delta = text.slice(this.lastLength);\r\n this.lastLength = text.length;\r\n this.typewriter.append(delta);\r\n }\r\n\r\n if (msg.completed) {\r\n this.lastLength = text.length;\r\n // this.typewriter.finish();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.profileImageUrl.set(this.authService.profileImageUrl() ?? doohbotConst.userAvatar);\r\n }\r\n\r\n onCopy() {\r\n this.copyMessage.emit(this.message());\r\n }\r\n}\r\n","<div\r\n class=\"message\"\r\n [class.user]=\"message().sender === 'user'\"\r\n [class.assistant]=\"message().sender === 'model'\"\r\n [class.streaming]=\"!message().completed && message().sender === 'model'\"\r\n>\r\n <!-- Message Bubble -->\r\n <div class=\"message-content\">\r\n <!-- User chat bubble -->\r\n @if (message().sender === 'user') {\r\n <div class=\"user-message-wrapper\">\r\n <div class=\"user\">\r\n <span>{{ message().text }}</span>\r\n </div>\r\n <button class=\"action-btn copy-btn user-copy\" (click)=\"onCopy()\" matTooltip=\"Copy message\">\r\n <mat-icon>{{ message().copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Assistant chat bubble -->\r\n @if (message().sender === 'model') {\r\n <div class=\"assistant\">\r\n <!-- Content (Typewriter or Static) -->\r\n <!-- We use [innerHTML] for both typing and static states now, powered by displayHtml computed signal -->\r\n @if (message().text || message().textHtml) {\r\n <span class=\"markdown-content\" [innerHTML]=\"displayHtml()\"></span>\r\n }\r\n\r\n <!-- Loading state (no content yet) -->\r\n <!-- @if (!message().completed && (!message().text || message().text === '')) {\r\n <div class=\"typing-indicator\">\r\n <span class=\"thinking-text\">Thinking...</span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n } -->\r\n\r\n <!-- Message Footer (only when completed) -->\r\n @if (message().completed) {\r\n <div class=\"message-footer\">\r\n <p class=\"footer-text\">\r\n This chat uses AI-generated content. Verify critical information.\r\n </p>\r\n <div class=\"message-actions\">\r\n <button class=\"action-btn copy-btn\" (click)=\"onCopy()\" matTooltip=\"Copy message\">\r\n <mat-icon>{{ message().copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n <button class=\"action-btn more-btn\" matTooltip=\"More actions\">\r\n <mat-icon>more_horiz</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Avatar (User on Right) -->\r\n <!-- @if (message().sender === 'user') {\r\n <div class=\"avatar-container\">\r\n @if (authService.profileImageUrl()) {\r\n <img class=\"user-avatar\" [src]=\"authService.profileImageUrl()\" alt=\"User Avatar\" />\r\n } @else {\r\n <mat-icon class=\"user-avatar-icon\">account_circle</mat-icon>\r\n }\r\n </div>\r\n } -->\r\n</div>\r\n","import { PredefinedMessages } from './../../../../predefined_messages';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { AppEmoji } from '../../../../const/utf8';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { ChatMessageComponent } from '../chat-message/chat-message.component';\r\nimport { ChatService } from '../../chat.service';\r\n\r\n@Component({\r\n selector: 'app-chat-message-container',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule, ChatMessageComponent],\r\n templateUrl: './chat-message-container.component.html',\r\n styleUrls: ['./chat-message-container.component.scss'],\r\n})\r\nexport class ChatMessageContainer implements OnInit, AfterViewInit, OnDestroy {\r\n //outputs\r\n suggestionClick = output<string>();\r\n\r\n @ViewChild('chatMessages') private chatMessagesContainer!: ElementRef;\r\n private mutationObserver!: MutationObserver;\r\n\r\n //const\r\n appEmoji = AppEmoji;\r\n readonly doohbotConst = doohbotConst;\r\n\r\n isNearBottom: boolean = true;\r\n private readonly SCROLL_TOLERANCE = 5; // Increased tolerance for better stickiness\r\n\r\n // messages = signal<Message[]>([]);\r\n public predefinedMessages = signal<string[]>(PredefinedMessages);\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n public authService: AuthService,\r\n public chatService: ChatService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n // this.messages.set(this.chatService.messages());\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.chatMessagesContainer) return;\r\n\r\n this.mutationObserver = new MutationObserver(() => {\r\n // PROACTIVE SCROLLING:\r\n // While bot is typing or responding, we want to stay at the bottom.\r\n // We only skip if the user has scrolled up significantly (beyond tolerance).\r\n if (this.isNearBottom) {\r\n this.scrollToBottom('auto');\r\n }\r\n });\r\n\r\n this.mutationObserver.observe(this.chatMessagesContainer.nativeElement, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true,\r\n });\r\n\r\n // Initial scroll\r\n // setTimeout(() => this.scrollToBottom('auto'), 200);\r\n }\r\n\r\n trackByMessageId(index: number, item: any): string {\r\n return item.id || index.toString();\r\n }\r\n\r\n onScroll(): void {\r\n if (!this.chatMessagesContainer) return;\r\n const element = this.chatMessagesContainer.nativeElement;\r\n\r\n // Check if we are at the bottom within tolerance.\r\n // If bot is typing, we increase tolerance to make it harder to 'lose' the stickiness.\r\n const tolerance = this.chatService.isBotTyping()\r\n ? this.SCROLL_TOLERANCE * 2\r\n : this.SCROLL_TOLERANCE;\r\n\r\n const atBottom = element.scrollHeight - element.scrollTop - element.clientHeight <= tolerance;\r\n\r\n this.isNearBottom = atBottom;\r\n }\r\n\r\n scrollToBottom(behavior: ScrollBehavior = 'smooth'): void {\r\n if (!this.chatMessagesContainer) {\r\n return;\r\n }\r\n const container = this.chatMessagesContainer.nativeElement;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: behavior,\r\n });\r\n // If artificially scrolling, assume we are at bottom\r\n if (behavior === 'auto') {\r\n this.isNearBottom = true;\r\n }\r\n }\r\n\r\n onPredefinedClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n copyMessage(message: Message): void {\r\n if (!message.text) return;\r\n\r\n navigator.clipboard.writeText(message.text).then(() => {\r\n message.copied = true;\r\n this.cdr.markForCheck(); // force UI update\r\n\r\n setTimeout(() => {\r\n message.copied = false;\r\n this.cdr.markForCheck(); // update again\r\n }, 800);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n}\r\n","<div #chatMessages class=\"chat-messages\" (scroll)=\"onScroll()\">\r\n <!-- Welcome Screen -->\r\n @if (chatService.messages().length === 0 && !chatService.isBotTyping()) {\r\n <div class=\"welcome-screen\">\r\n <img\r\n [src]=\"doohbotConst.appLogo\"\r\n alt=\"Welcome\"\r\n class=\"welcome-image\"\r\n style=\"border-radius: 0px\"\r\n />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n @if (authService.username()) {\r\n <div class=\"marquee-container\">\r\n <h2 class=\"welcome-greeting\">\r\n Hi, {{ authService.username() }}!\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n </div>\r\n }\r\n\r\n <h3>{{ doohbotConst.appSubtitle }}</h3>\r\n <p>{{ doohbotConst.welcomeDescription }}</p>\r\n </div>\r\n } @else if (chatService.isLoadingApi() && chatService.messages().length === 0) {\r\n <div class=\"loader-container\">\r\n <div class=\"loader\"></div>\r\n <p>Loading messages...</p>\r\n </div>\r\n }\r\n\r\n <!-- Chat Messages -->\r\n <app-chat-message\r\n *ngFor=\"let message of chatService.messages(); trackBy: trackByMessageId\"\r\n [message]=\"message\"\r\n [doohbotConst]=\"doohbotConst\"\r\n [appEmoji]=\"appEmoji\"\r\n (copyMessage)=\"copyMessage($event)\"\r\n >\r\n </app-chat-message>\r\n\r\n <!-- Standalone Typing Indicator (Fallback if no message added yet) -->\r\n @if (\r\n chatService.isBotTyping() &&\r\n chatService.messages().length > 0 &&\r\n chatService.messages()[chatService.messages().length - 1]?.sender !== 'model'\r\n ) {\r\n <div class=\"message assistant\">\r\n <div class=\"message-content\">\r\n <div class=\"assistant\">\r\n <div class=\"typing-indicator\">\r\n <span class=\"thinking-text\">Thinking</span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Scroll to Bottom Button -->\r\n @if (!isNearBottom && (chatService.messages().length > 0 || chatService.isBotTyping())) {\r\n <button class=\"scroll-bottom-btn\" (click)=\"scrollToBottom('smooth')\">\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n }\r\n</div>\r\n","import {\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n OnInit,\r\n Renderer2,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[draggableDialog]',\r\n standalone: true,\r\n})\r\nexport class DraggableDialogDirective implements OnInit, OnChanges {\r\n private isDragging = false;\r\n private startX = 0;\r\n private startY = 0;\r\n private offsetX = 0;\r\n private offsetY = 0;\r\n\r\n @Input('dragHandle') dragHandleSelector: string | undefined;\r\n @Input() enableDrag = false;\r\n\r\n private dragHandle: HTMLElement | undefined;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.updateDragState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableDrag']) {\r\n this.updateDragState();\r\n }\r\n }\r\n\r\n private updateDragState() {\r\n if (this.enableDrag) {\r\n if (this.dragHandleSelector) {\r\n this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);\r\n } else {\r\n this.dragHandle = this.el.nativeElement; // fallback\r\n }\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'grab');\r\n }\r\n } else {\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'default');\r\n }\r\n // We don't need to unset dragHandle, just ensure the cursor is reset and the mousedown check respects the flag?\r\n // Actually, the mousedown listener is always active. We should check enableDrag inside mousedown.\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableDrag) return;\r\n if (event.defaultPrevented) return; // Respect other handlers (like resize)\r\n\r\n if (!this.dragHandle) return;\r\n\r\n const target = event.target as HTMLElement;\r\n\r\n // Ensure we only drag when clicking inside the drag handle\r\n if (!this.dragHandle.contains(target)) {\r\n return;\r\n }\r\n\r\n // Prevent dragging from resize handles\r\n if (target.hasAttribute('data-dir') || target.classList.contains('doohbot-resize-handle')) {\r\n return;\r\n }\r\n\r\n // Prevent dragging when interacting with controls (buttons, inputs, links, etc.)\r\n const tagName = target.tagName;\r\n if (['BUTTON', 'INPUT', 'TEXTAREA', 'A', 'SELECT', 'MAT-ICON'].includes(tagName)) return;\r\n\r\n // Also ignore if clicking inside a child of a control element\r\n if (target.closest('button, a, input, textarea, select')) return;\r\n\r\n // Optional: explicit opt-out class\r\n if (target.classList.contains('no-drag') || target.closest('.no-drag')) return;\r\n\r\n this.isDragging = true;\r\n this.startX = event.clientX - this.offsetX;\r\n this.startY = event.clientY - this.offsetY;\r\n\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'grabbing');\r\n }\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging) return;\r\n\r\n // Calculate raw offset\r\n let newOffsetX = event.clientX - this.startX;\r\n let newOffsetY = event.clientY - this.startY;\r\n\r\n // Get element dimensions to calculate max allowed offsets\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n // Total space allowed to move is the window size minus the element size\r\n // Note: rect.width and rect.height remain constant during drag (unless resized)\r\n const maxX = window.innerWidth - rect.width;\r\n const maxY = window.innerHeight - rect.height;\r\n\r\n // Since our translation is relative to the *initial* position of the element,\r\n // we need to calculate boundaries relative to where the translation originated.\r\n // However, it's easier to clamp the actual screen coordinates of the top-left corner.\r\n\r\n // Current absolute top-left without clamp\r\n const absoluteX = rect.left - this.offsetX + newOffsetX;\r\n const absoluteY = rect.top - this.offsetY + newOffsetY;\r\n\r\n // Clamp the absolute target positions\r\n const clampedX = Math.max(0, Math.min(absoluteX, maxX));\r\n const clampedY = Math.max(0, Math.min(absoluteY, maxY));\r\n\r\n // Adjust the offsets based on how much we had to clamp\r\n newOffsetX += clampedX - absoluteX;\r\n newOffsetY += clampedY - absoluteY;\r\n\r\n this.offsetX = newOffsetX;\r\n this.offsetY = newOffsetY;\r\n\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'transform',\r\n `translate(${this.offsetX}px, ${this.offsetY}px)`,\r\n );\r\n }\r\n\r\n @HostListener('document:mouseup', [])\r\n onMouseUp() {\r\n this.isDragging = false;\r\n\r\n if (this.dragHandle && this.enableDrag) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'grab');\r\n }\r\n }\r\n}\r\n","// resizable-dialog.directive.ts\r\nimport {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[resizableDialog]',\r\n standalone: true,\r\n})\r\nexport class ResizableDialogDirective implements OnInit, OnDestroy, OnChanges {\r\n private resizeHandles: HTMLElement[] = [];\r\n private activeHandle: string | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n private startLeft = 0;\r\n private startTop = 0;\r\n private startRect!: DOMRect;\r\n\r\n @Input() enableResize = false;\r\n\r\n // Define resize directions\r\n private directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.updateResizeState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableResize']) {\r\n this.updateResizeState();\r\n }\r\n }\r\n\r\n private updateResizeState() {\r\n if (this.enableResize) {\r\n if (this.resizeHandles.length === 0) {\r\n this.setStyle();\r\n this.createResizeHandles();\r\n }\r\n } else {\r\n this.removeResizeHandles();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeResizeHandles();\r\n }\r\n\r\n private setStyle() {\r\n const element = this.el.nativeElement;\r\n const currentPosition = getComputedStyle(element).position;\r\n\r\n if (currentPosition !== 'fixed' && currentPosition !== 'absolute') {\r\n this.renderer.setStyle(element, 'position', 'absolute');\r\n }\r\n\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'boxSizing', 'border-box');\r\n }\r\n\r\n private createResizeHandles() {\r\n this.directions.forEach((dir) => {\r\n const handle = this.renderer.createElement('div');\r\n this.renderer.setAttribute(handle, 'data-dir', dir);\r\n this.renderer.addClass(handle, 'doohbot-resize-handle');\r\n this.renderer.setStyle(handle, 'position', 'absolute');\r\n this.renderer.setStyle(handle, 'background', 'transparent');\r\n this.renderer.setStyle(handle, 'zIndex', '2000'); // High z-index to sit above content\r\n this.renderer.setStyle(handle, 'userSelect', 'none');\r\n\r\n // Set size and position based on direction\r\n if (dir.includes('e') || dir.includes('w')) {\r\n this.renderer.setStyle(handle, 'width', '15px'); // Slightly larger hit area\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');\r\n this.renderer.setStyle(handle, 'top', '0');\r\n this.renderer.setStyle(handle, 'bottom', '0');\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-5px' : null); // Extend slightly out\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-5px' : null);\r\n }\r\n if (dir.includes('n') || dir.includes('s')) {\r\n this.renderer.setStyle(handle, 'height', '15px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');\r\n this.renderer.setStyle(handle, 'left', '0');\r\n this.renderer.setStyle(handle, 'right', '0');\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-5px' : null);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-5px' : null);\r\n }\r\n if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {\r\n this.renderer.setStyle(handle, 'width', '20px');\r\n this.renderer.setStyle(handle, 'height', '20px');\r\n this.renderer.setStyle(handle, 'borderRadius', '50%');\r\n this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-10px' : null);\r\n }\r\n\r\n this.renderer.appendChild(this.el.nativeElement, handle);\r\n this.resizeHandles.push(handle);\r\n });\r\n }\r\n\r\n private removeResizeHandles() {\r\n this.resizeHandles.forEach((handle) => {\r\n this.renderer.removeChild(this.el.nativeElement, handle);\r\n });\r\n this.resizeHandles = [];\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableResize) return;\r\n if (event.defaultPrevented) return; // Respect other handlers\r\n\r\n const target = event.target as HTMLElement;\r\n const dir = target.getAttribute('data-dir');\r\n if (!dir) return;\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n\r\n this.activeHandle = dir;\r\n this.startRect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = parseFloat(this.getComputedStyleValue('width'));\r\n this.startHeight = parseFloat(this.getComputedStyleValue('height'));\r\n this.startLeft = parseFloat(this.getComputedStyleValue('left'));\r\n this.startTop = parseFloat(this.getComputedStyleValue('top'));\r\n\r\n // Prevent text selection during resize\r\n document.body.classList.add('no-select');\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.activeHandle) return;\r\n\r\n const dx = event.clientX - this.startX;\r\n const dy = event.clientY - this.startY;\r\n\r\n let newWidth = this.startWidth;\r\n let newHeight = this.startHeight;\r\n let newLeft = this.startLeft;\r\n let newTop = this.startTop;\r\n\r\n const minWidth = 420;\r\n const minHeight = 600;\r\n\r\n // Horizontal resize\r\n if (this.activeHandle.includes('e')) {\r\n newWidth = Math.max(\r\n minWidth,\r\n Math.min(this.startWidth + dx, window.innerWidth - this.startLeft),\r\n );\r\n }\r\n if (this.activeHandle.includes('w')) {\r\n // Proposed new width\r\n let proposedWidth = Math.max(minWidth, this.startWidth - dx);\r\n // Determine max possible width bounded by the right edge (which stays static on west resize)\r\n const maxPossibleWidth = this.startLeft + this.startWidth;\r\n\r\n newWidth = Math.min(proposedWidth, maxPossibleWidth);\r\n newLeft = this.startLeft + this.startWidth - newWidth;\r\n\r\n // Prevent dragging off the left edge of the screen\r\n if (newLeft < 0) {\r\n newLeft = 0;\r\n newWidth = this.startLeft + this.startWidth; // Cap width exactly at left=0\r\n }\r\n }\r\n\r\n // Vertical resize\r\n if (this.activeHandle.includes('s')) {\r\n newHeight = Math.max(\r\n minHeight,\r\n Math.min(this.startHeight + dy, window.innerHeight - this.startRect.top),\r\n );\r\n }\r\n if (this.activeHandle.includes('n')) {\r\n // Proposed new height\r\n let proposedHeight = Math.max(minHeight, this.startHeight - dy);\r\n // Determine max possible height bounded by the bottom edge (which stays static on north resize)\r\n const maxPossibleHeight = this.startRect.bottom;\r\n\r\n newHeight = Math.min(proposedHeight, maxPossibleHeight);\r\n newTop = this.startTop + this.startHeight - newHeight;\r\n\r\n // Prevent dragging off the top edge of the screen\r\n if (this.startRect.bottom - newHeight < 0) {\r\n newHeight = this.startRect.bottom; // Cap height exactly at top=0\r\n newTop = this.startTop + this.startHeight - newHeight;\r\n }\r\n }\r\n\r\n // Apply changes\r\n this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (this.activeHandle) {\r\n this.activeHandle = null;\r\n document.body.classList.remove('no-select');\r\n }\r\n }\r\n\r\n private getComputedStyleValue(property: string): string {\r\n return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';\r\n }\r\n}\r\n","import { Component, computed, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../material/material.module';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\n\r\n@Component({\r\n selector: 'app-notification-banner',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './notification-banner.component.html',\r\n styleUrls: ['./notification-banner.component.scss'],\r\n})\r\nexport class NotificationBannerComponent {\r\n private authService = inject(AuthService);\r\n //\r\n readonly isUpdating = computed(() => this.authService.isAuthenticating());\r\n readonly errorMessage = computed(() => this.authService.loginErrorMessage());\r\n readonly allPrerequisitesCheck = computed(() => this.authService.allPrerequisitesMet());\r\n\r\n readonly statusIcon = computed(() => {\r\n if (this.isUpdating()) return 'autorenew';\r\n if (this.errorMessage()) return 'error_outline';\r\n if (this.allPrerequisitesCheck()) return 'verified';\r\n return 'hourglass_empty';\r\n });\r\n\r\n readonly statusTitle = computed(() => {\r\n if (this.isUpdating()) return 'Processing...';\r\n if (this.errorMessage()) return 'Authentication Failed';\r\n if (this.allPrerequisitesCheck()) return 'Ready to Connect';\r\n return 'Processing';\r\n });\r\n\r\n readonly statusMessage = computed(() => {\r\n if (this.isUpdating()) return 'Please wait until complete';\r\n if (this.errorMessage()) return this.errorMessage() || '';\r\n if (this.allPrerequisitesCheck()) return 'All requirements satisfied.';\r\n return 'Please wait until it completes.';\r\n });\r\n\r\n readonly statusClass = computed(() => {\r\n if (this.isUpdating()) return 'updating';\r\n if (this.errorMessage()) return 'error';\r\n if (this.allPrerequisitesCheck()) return 'success';\r\n return '';\r\n });\r\n\r\n readonly federatedTokenStatus = computed(\r\n () => this.authService.prerequisitesStatus().federatedToken,\r\n );\r\n readonly licenseFileStatus = computed(() => this.authService.prerequisitesStatus().licenseFile);\r\n readonly licenseCodeStatus = computed(() => this.authService.prerequisitesStatus().licenseCode);\r\n}\r\n","<div class=\"banner-wrapper\">\r\n <div class=\"glass-banner\">\r\n <div class=\"banner-glow\"></div>\r\n <div class=\"banner-inner\">\r\n <div class=\"header-section\">\r\n <div class=\"icon-orb\">\r\n <mat-icon>security</mat-icon>\r\n </div>\r\n <div class=\"text-content\">\r\n <h3>Login Process</h3>\r\n <!-- <p>Verification of authentication</p> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"status-section\">\r\n <div class=\"status-card\" [class]=\"statusClass()\">\r\n <div class=\"icon-orb\">\r\n <mat-icon>{{ statusIcon() }}</mat-icon>\r\n </div>\r\n <div class=\"status-text\">\r\n <h4>{{ statusTitle() }}</h4>\r\n <p>{{ statusMessage() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"status-grid\" *ngIf=\"!allPrerequisitesCheck()\">\r\n <div class=\"status-card\" [class]=\"licenseFileStatus()\">\r\n <div class=\"card-glow\"></div>\r\n <mat-icon>security</mat-icon>\r\n <span class=\"status-label\">License</span>\r\n <span class=\"status-tag\">{{ licenseFileStatus() }}</span>\r\n </div>\r\n\r\n <div class=\"status-card\" [class]=\"licenseCodeStatus()\">\r\n <div class=\"card-glow\"></div>\r\n <mat-icon>data_object</mat-icon>\r\n <span class=\"status-label\">License Code</span>\r\n <span class=\"status-tag\">{{ licenseCodeStatus() }}</span>\r\n </div>\r\n\r\n <div class=\"status-card\" [class]=\"federatedTokenStatus()\">\r\n <div class=\"card-glow\"></div>\r\n <mat-icon>vpn_key</mat-icon>\r\n <span class=\"status-label\">Authentication Token</span>\r\n <span class=\"status-tag\">{{ federatedTokenStatus() }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n Input,\r\n HostListener,\r\n inject,\r\n OnDestroy,\r\n NgZone,\r\n} from '@angular/core';\r\n\r\nexport type FullscreenMode = 'browser' | 'viewport' | 'contained';\r\n\r\n/**\r\n * Adds fullscreen behavior to the host element via various strategies.\r\n *\r\n * @example\r\n * // 1. Attribute usage:\r\n * <div [appFullscreen]=\"'viewport'\" #fs=\"appFullscreen\"></div>\r\n *\r\n * // 2. hostDirectives usage:\r\n * hostDirectives: [{\r\n * directive: FullscreenDirective,\r\n * inputs: ['appFullscreen: fullscreenMode']\r\n * }]\r\n */\r\n@Directive({\r\n selector: '[appFullscreen]',\r\n standalone: true,\r\n exportAs: 'appFullscreen',\r\n})\r\nexport class FullscreenDirective implements OnDestroy {\r\n private el = inject(ElementRef<HTMLElement>);\r\n private renderer = inject(Renderer2);\r\n private zone = inject(NgZone);\r\n\r\n @Input('appFullscreen') fullscreenMode: FullscreenMode = 'viewport';\r\n\r\n private active = false;\r\n private resizeObserver?: ResizeObserver;\r\n private originalStyles: Partial<CSSStyleDeclaration> = {};\r\n\r\n @HostListener('document:fullscreenchange')\r\n onBrowserFullscreenChange(): void {\r\n if (this.fullscreenMode === 'browser') {\r\n this.active = document.fullscreenElement === this.el.nativeElement;\r\n }\r\n }\r\n\r\n async enter(): Promise<void> {\r\n const element = this.el.nativeElement;\r\n\r\n // Add mode attribute for SCSS\r\n this.renderer.setAttribute(element, 'data-fs-mode', this.fullscreenMode);\r\n\r\n if (this.fullscreenMode === 'browser') {\r\n await element.requestFullscreen().catch(console.error);\r\n return;\r\n }\r\n\r\n this.storeOriginalStyles(element);\r\n\r\n if (this.fullscreenMode === 'contained') {\r\n // Position absolutely inside current parent\r\n this.applyStyles(element, {\r\n display: 'block',\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n right: '0',\r\n bottom: '0',\r\n width: '100%',\r\n height: '100%',\r\n zIndex: '10', // Optional, keep below consumer sidebar\r\n });\r\n\r\n const parent = this.renderer.parentNode(element);\r\n if (parent && parent instanceof HTMLElement) {\r\n // Force the consumer's container to be the anchor\r\n this.renderer.setStyle(parent, 'position', 'relative');\r\n this.renderer.setStyle(parent, 'overflow', 'hidden');\r\n this.startObserving(parent);\r\n }\r\n } else if (this.fullscreenMode === 'viewport') {\r\n this.applyStyles(element, {\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n width: '100vw',\r\n height: '100vh',\r\n zIndex: '9999',\r\n });\r\n }\r\n\r\n this.active = true;\r\n }\r\n\r\n async exit(): Promise<void> {\r\n const element = this.el.nativeElement;\r\n this.renderer.removeAttribute(element, 'data-fs-mode');\r\n if (this.fullscreenMode === 'browser') {\r\n if (document.fullscreenElement) await document.exitFullscreen().catch(console.error);\r\n return;\r\n }\r\n\r\n this.stopObserving();\r\n this.restoreOriginalStyles(element);\r\n this.active = false;\r\n }\r\n\r\n private startObserving(target: HTMLElement): void {\r\n this.stopObserving(); // Clean up existing\r\n\r\n // Run outside Angular zone to avoid triggering change detection on every pixel change\r\n this.zone.runOutsideAngular(() => {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // If the sidebar pushes the container, the 100% width\r\n // will naturally adjust because of 'position: absolute'\r\n // Use this callback if you need to run custom logic on resize.\r\n });\r\n this.resizeObserver.observe(target);\r\n });\r\n }\r\n\r\n private stopObserving(): void {\r\n this.resizeObserver?.disconnect();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stopObserving();\r\n }\r\n\r\n private applyStyles(element: HTMLElement, styles: Record<string, string>): void {\r\n // Always include box-sizing when forcing dimensions\r\n this.renderer.setStyle(element, 'box-sizing', 'border-box');\r\n\r\n Object.entries(styles).forEach(([prop, val]) => this.renderer.setStyle(element, prop, val));\r\n }\r\n\r\n private storeOriginalStyles(element: HTMLElement): void {\r\n this.originalStyles = {\r\n position: element.style.position,\r\n top: element.style.top,\r\n left: element.style.left,\r\n width: element.style.width,\r\n height: element.style.height,\r\n zIndex: element.style.zIndex,\r\n };\r\n }\r\n\r\n private restoreOriginalStyles(element: HTMLElement): void {\r\n Object.entries(this.originalStyles).forEach(([key, value]) => {\r\n this.renderer.setStyle(element, key, value || '');\r\n });\r\n }\r\n\r\n isActive(): boolean {\r\n return this.fullscreenMode === 'browser'\r\n ? document.fullscreenElement === this.el.nativeElement\r\n : this.active;\r\n }\r\n\r\n async toggle(): Promise<void> {\r\n this.isActive() ? await this.exit() : await this.enter();\r\n }\r\n}\r\n","import { Logger } from './../../../../core/utils/logger.service';\r\nimport { PredefinedMessages } from './../../../../predefined_messages';\r\nimport { DialogService } from '../../../../shared/confirmation-dialog/dialog.service';\r\nimport { FullscreenDirective } from '../../../../core/directives/fullscreen.directive';\r\nimport { DoohbotConfigService } from './../../../../core/config/doohbot-config.service';\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n computed,\r\n inject,\r\n effect,\r\n} from '@angular/core';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { map } from 'rxjs';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { ChatInputComponent } from '../chat-input/chat-input.component';\r\nimport { ChatHistoryComponent } from '../chat-history/chat-history.component';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\nimport { ButtonStyle, DoohbotThemeConfig } from '../../../../core/models/theme-config.model';\r\nimport { ChatHeaderComponent } from '../chat-header/chat-header.component';\r\nimport { LoginFormComponent } from '../../../login/login-form.component';\r\nimport { ChatFooterComponent } from '../chat-footer/chat-footer.component';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\nimport { ChatSessionDto } from '../../model/chat-session.model';\r\nimport { PersonalizationDialogComponent } from '../../../personalization/personalization-dialog.component';\r\nimport { ChatService } from '../../chat.service';\r\nimport { ChatHistoryService } from '../../services/chat-history.service';\r\nimport { ChatMessageContainer } from '../chat-message-container/chat-message-container.component';\r\nimport { DraggableDialogDirective } from '../../../../core/directives/draggable-dialog.directive';\r\nimport { ResizableDialogDirective } from '../../../../core/directives/resizable-dialog.directive';\r\nimport { doohbotConst } from '../../../../../lib/const/doohbot-constant';\r\nimport { NotificationBannerComponent } from '../../../../shared/notification-banner/notification-banner.component';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n SharedMaterialModule,\r\n Chips,\r\n ChatMessageContainer,\r\n ChatInputComponent,\r\n ChatHistoryComponent,\r\n ChatHeaderComponent,\r\n LoginFormComponent,\r\n ChatFooterComponent,\r\n FormsModule,\r\n DraggableDialogDirective,\r\n ResizableDialogDirective,\r\n NotificationBannerComponent,\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n})\r\nexport class ChatWindowComponent implements OnInit, OnDestroy {\r\n // inputs\r\n themeConfig = input<DoohbotThemeConfig | undefined>();\r\n\r\n showSuggestionChips = input(false);\r\n\r\n // UI State signals\r\n public isChatOpen = this.chatService.isChatOpen;\r\n public isHistorySidebarOpen = this.chatService.isHistorySidebarOpen;\r\n public isFullScreen = this.chatService.isFullScreen;\r\n\r\n // Chat State signals\r\n public chatSessions = this.chatHistory.sessions;\r\n public hasMoreHistory = this.chatHistory.hasMore;\r\n public isLoadingMore = this.chatHistory.isLoadingMore;\r\n public isLoadingSessions = this.chatHistory.isLoading;\r\n public processingSessionId = this.chatHistory.processingSessionId;\r\n public activeSessionId = computed(() => this.chatService.activeSession()?.response_id || null);\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n //outputs\r\n openSettings = output<void>();\r\n\r\n public isManualAuth = signal(false);\r\n public authMode = signal<'manual' | 'federated' | 'session'>('manual');\r\n\r\n public suggestionChips = signal<string[]>(PredefinedMessages);\r\n\r\n private breakpointObserver = inject(BreakpointObserver);\r\n public isMobile = toSignal(\r\n this.breakpointObserver.observe('(max-width: 768px)').pipe(map((result) => result.matches)),\r\n { initialValue: false },\r\n );\r\n\r\n public showLoginForm = signal(false);\r\n\r\n public readonly buttonStyle = computed<ButtonStyle>(() => {\r\n return this.configService.theme()?.buttonStyle ?? 'fab';\r\n });\r\n\r\n public canDrag = computed(() => {\r\n if (this.buttonStyle() === 'sidebar') return false;\r\n return this.configService?.theme()?.enableDrag ?? !this.isFullScreen();\r\n });\r\n\r\n public canResize = computed(() => {\r\n if (this.buttonStyle() === 'sidebar') return false;\r\n return this.configService?.theme()?.enableResize ?? !this.isFullScreen();\r\n });\r\n\r\n constructor(\r\n private fullscreenDirective: FullscreenDirective,\r\n private configService: DoohbotConfigService,\r\n public authService: AuthService,\r\n public chatService: ChatService,\r\n private dialogService: DialogService,\r\n private chatHistory: ChatHistoryService,\r\n ) {\r\n const authConfig = this.configService.auth();\r\n this.isManualAuth.set(authConfig?.mode === 'manual');\r\n this.authMode.set((authConfig?.mode as any) || 'manual');\r\n\r\n //! exit fullscreen when chat is closed\r\n effect(() => {\r\n const isOpen = this.isChatOpen();\r\n const isFullscreen = this.isFullScreen();\r\n\r\n if (!isOpen && isFullscreen) {\r\n this.fullscreenDirective.exit();\r\n this.chatService.setFullscreen(false);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.isChatOpen = this.chatService.isChatOpen;\r\n this.isHistorySidebarOpen = this.chatService.isHistorySidebarOpen;\r\n this.isFullScreen = this.chatService.isFullScreen;\r\n\r\n // Chat State signals\r\n this.chatSessions = this.chatHistory.sessions;\r\n this.hasMoreHistory = this.chatHistory.hasMore;\r\n this.isLoadingMore = this.chatHistory.isLoadingMore;\r\n this.isLoadingSessions = this.chatHistory.isLoading;\r\n this.processingSessionId = this.chatHistory.processingSessionId;\r\n }\r\n\r\n /* ---------------- History ---------------- */\r\n\r\n // when user click on history sidebar\r\n onOpenHistorySidebar() {\r\n if (!this.chatService.isHistorySidebarOpen()) {\r\n // Only load if not already cached\r\n this.loadUserSessions();\r\n this.chatService.openHistorySidebar();\r\n }\r\n }\r\n\r\n // when user close history sidebar\r\n onCloseHistorySidebar() {\r\n this.chatService.closeHistorySidebar();\r\n }\r\n\r\n // Manually refresh history\r\n async refreshHistory(): Promise<void> {\r\n const userId = this.authService.userId() || '';\r\n Logger.info(`Refreshing sessions for user: ${userId}`);\r\n await this.chatHistory.loadSessions(userId.toString(), true);\r\n }\r\n\r\n // Load more sessions for infinite scroll\r\n async loadMoreHistory(): Promise<void> {\r\n const userId = this.authService.userId() || '';\r\n Logger.info(`Loading more sessions for user: ${userId}`);\r\n try {\r\n await this.chatHistory.loadMoreSessions(userId.toString());\r\n } catch (err) {\r\n Logger.error('Failed to load more chat history', err);\r\n }\r\n }\r\n\r\n // when user select a session from history\r\n onSessionSelected(session: ChatSessionDto) {\r\n if (!session.response_id) {\r\n return;\r\n }\r\n this.chatService.continueSession(session.response_id);\r\n this.chatService.closeHistorySidebar();\r\n }\r\n\r\n // when user delete a session from history\r\n async onSessionDeleted(sessionId: string) {\r\n const userId = this.authService.userId() || '';\r\n await this.chatHistory.deleteSession(sessionId, userId.toString());\r\n\r\n // Invalidate cache after deletion\r\n this.chatHistory.invalidateCache();\r\n\r\n // If deleted session is currently active, start a new one\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.response_id === sessionId) {\r\n Logger.info('Active session was deleted, starting a new one.');\r\n this.chatService.startNewSession();\r\n }\r\n }\r\n\r\n // when user rename a session from history\r\n async onSessionRenamed(event: { sessionId: string; newTitle: string }) {\r\n const userId = this.authService.userId() || '';\r\n const result = await this.chatHistory.updateSessionTitle(\r\n event.sessionId,\r\n event.newTitle,\r\n userId.toString(),\r\n );\r\n if (result) {\r\n // If updated session is currently active, update its title in ChatService\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.response_id === event.sessionId) {\r\n activeSession.title = event.newTitle;\r\n }\r\n }\r\n }\r\n\r\n // when user delete all sessions from history\r\n async onDeleteAllSessions() {\r\n const userId = this.authService.userId() || '';\r\n await this.chatHistory.deleteAllHistory(userId);\r\n this.chatService.clearMessages();\r\n }\r\n\r\n private async loadUserSessions(): Promise<void> {\r\n const userId = this.authService.userId() || '';\r\n Logger.info(`Initiating loadUserSessions for user: ${userId}`);\r\n try {\r\n await this.chatHistory.loadSessions(userId.toString());\r\n } catch (err) {\r\n Logger.error('Failed to load user sessions', err);\r\n }\r\n }\r\n\r\n /* ---------------- Chat ---------------- */\r\n\r\n async onSend(text: string) {\r\n await this.chatService.sendMessage(text);\r\n this.chatHistory.invalidateCache();\r\n }\r\n\r\n async onSuggestionClick(text: string) {\r\n await this.chatService.sendMessage(text);\r\n this.chatHistory.invalidateCache();\r\n }\r\n\r\n onClearChat() {\r\n this.chatService.clearMessages();\r\n }\r\n\r\n /* ---------------- UI ---------------- */\r\n\r\n // when user toggle fullscreen\r\n onToggleFullScreen() {\r\n this.fullscreenDirective.toggle();\r\n const isFullscreen = this.fullscreenDirective.isActive();\r\n this.chatService.setFullscreen(isFullscreen);\r\n\r\n if (isFullscreen) {\r\n this.refreshHistory();\r\n }\r\n }\r\n\r\n // when user open settings\r\n onOpenSettings() {\r\n this.openSettings.emit();\r\n }\r\n\r\n // when user click on login button in auth loader\r\n onRedirectToLogin() {\r\n this.showLoginForm.set(true);\r\n }\r\n\r\n // when user open personalization\r\n onOpenPersonalization() {\r\n this.dialogService.open(PersonalizationDialogComponent, {\r\n width: '1100px',\r\n height: '700px',\r\n maxWidth: '95vw',\r\n panelClass: 'personalization-dialog-panel',\r\n });\r\n }\r\n\r\n // when user logout\r\n onLogout() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Logout',\r\n message: 'Are you sure you want to log out?',\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) this.authService.logout();\r\n });\r\n }\r\n\r\n // when user popout shown\r\n // onPopoutShown(win: Window) {\r\n // // Apply theme classes\r\n // const activeTheme = this.themeService.activeTheme();\r\n\r\n // const body = win.document.body;\r\n // body.classList.remove('light-theme', 'dark-theme');\r\n // body.classList.add(activeTheme);\r\n\r\n // // Apply CSS variables\r\n // this.themeService.applyCssVariables(body, this.themeConfig());\r\n // }\r\n\r\n ngOnDestroy() {}\r\n}\r\n","@if (isChatOpen()) {\r\n <div\r\n draggableDialog\r\n dragHandle=\"app-chat-header\"\r\n [enableDrag]=\"canDrag()\"\r\n resizableDialog\r\n [enableResize]=\"canResize()\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen()\"\r\n [class.layout-sidebar]=\"buttonStyle().includes('sidebar')\"\r\n >\r\n <app-chat-header\r\n [settingsMenu]=\"settingsMenu\"\r\n (toggleFullScreen)=\"onToggleFullScreen()\"\r\n [isNewChatDisabled]=\"chatService.messages().length === 0\"\r\n (toggleHistorySidebar)=\"onOpenHistorySidebar()\"\r\n (clearChat)=\"onClearChat()\"\r\n ></app-chat-header>\r\n\r\n <!-- AUTH LOADING -->\r\n @if (!authService.isAuthenticated()) {\r\n <div class=\"auth-loader\">\r\n @switch (authMode()) {\r\n @case ('manual') {\r\n <app-login-form></app-login-form>\r\n }\r\n @case ('federated') {\r\n <app-notification-banner></app-notification-banner>\r\n }\r\n @case ('session') {\r\n <div class=\"session-initializer\">\r\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\r\n <p>Initializing session...</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"chat-content-wrapper\">\r\n @if (authService.isAuthenticated()) {\r\n <app-chat-history\r\n [class.sidebar-closed]=\"\r\n (!isHistorySidebarOpen() && !isFullScreen()) ||\r\n (isFullScreen() && !authService.isAuthenticated()) ||\r\n (isFullScreen() && isMobile() && !isHistorySidebarOpen())\r\n \"\r\n [sessions]=\"chatSessions()\"\r\n [isOpen]=\"\r\n isHistorySidebarOpen() ||\r\n (isFullScreen() && authService.isAuthenticated() && !isMobile())\r\n \"\r\n [isLoading]=\"isLoadingSessions()\"\r\n [hasMoreSessions]=\"hasMoreHistory()\"\r\n [isLoadingMore]=\"isLoadingMore()\"\r\n [processingSessionId]=\"processingSessionId()\"\r\n [activeSessionId]=\"activeSessionId()\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (loadMore)=\"loadMoreHistory()\"\r\n (refresh)=\"refreshHistory()\"\r\n (sessionRenamed)=\"onSessionRenamed($event)\"\r\n (deleteAll)=\"onDeleteAllSessions()\"\r\n (closed)=\"onCloseHistorySidebar()\"\r\n ></app-chat-history>\r\n }\r\n\r\n <div\r\n class=\"messages-view\"\r\n [class.hidden]=\"isHistorySidebarOpen() && (!isFullScreen() || isMobile())\"\r\n >\r\n @if (authService.isAuthenticated()) {\r\n <app-chat-message-container\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n ></app-chat-message-container>\r\n }\r\n\r\n @if (\r\n authService.isAuthenticated() &&\r\n chatService.messages().length === 0 &&\r\n !chatService.isBotTyping()\r\n ) {\r\n <app-chips\r\n [messages]=\"suggestionChips()\"\r\n [disabled]=\"chatService.isBotTyping()\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n }\r\n\r\n @if (authService.isAuthenticated()) {\r\n <app-chat-input (send)=\"onSend($event)\"></app-chat-input>\r\n }\r\n\r\n <app-chat-footer [showDisclaimer]=\"chatService.messages().length > 0\"></app-chat-footer>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n}\r\n\r\n<mat-menu #settingsMenu=\"matMenu\" class=\"profile-menu\">\r\n <!-- User Profile Header -->\r\n @if (authService.isAuthenticated()) {\r\n <div class=\"menu-profile-header\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"avatar-container\">\r\n @if (authService.profileImageUrl()) {\r\n <img [src]=\"authService.profileImageUrl()\" alt=\"Avatar\" class=\"menu-avatar\" />\r\n } @else {\r\n <mat-icon class=\"menu-avatar-icon\">account_circle</mat-icon>\r\n }\r\n </div>\r\n <div class=\"user-info\">\r\n <div class=\"name-badge\">\r\n <span class=\"user-name\">{{ authService.username() }}</span>\r\n <!-- <span class=\"pro-badge\">PRO</span> -->\r\n </div>\r\n <div class=\"user-email\">{{ authService.email() }}</div>\r\n </div>\r\n </div>\r\n <mat-divider></mat-divider>\r\n }\r\n\r\n <!-- Account Settings -->\r\n @if (authService.isAuthenticated()) {\r\n <button mat-menu-item (click)=\"onOpenPersonalization()\">\r\n <mat-icon>person_outline</mat-icon>\r\n <span>Account Settings</span>\r\n </button>\r\n }\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <!-- Clear Chat -->\r\n @if (authService.isAuthenticated() && chatService.messages().length > 0) {\r\n <button mat-menu-item (click)=\"onClearChat()\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>End Chat</span>\r\n </button>\r\n }\r\n\r\n <!-- Logout -->\r\n @if (authService.isAuthenticated() && isManualAuth()) {\r\n <button mat-menu-item (click)=\"onLogout()\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n }\r\n</mat-menu>\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { DOOHBOT_CONFIG } from '../config/doohbot-config.token';\r\nimport { Logger } from '../utils/logger.service';\r\nimport { DoohbotConfig } from '../config/doohbot-config.model';\r\nimport { AuthService } from '../auth/auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LicenseService {\r\n constructor(\r\n private http: HttpClient,\r\n private authService: AuthService,\r\n @Inject(DOOHBOT_CONFIG) private config: DoohbotConfig,\r\n ) {}\r\n\r\n /**\r\n * Initializes the license resolver by loading the license file and processing its contents.\r\n *\r\n * Resolves license only if passed the `licenseFilePath` in DoohbotConfig.\r\n */\r\n async initLicenseResolver() {\r\n const licenseUrl = this.config.licenseFilePath;\r\n if (!licenseUrl || licenseUrl.trim() === '') {\r\n Logger.warn('[LicenseService] No licenseFilePath provided');\r\n return;\r\n }\r\n\r\n // Resolve and set license\r\n const licenseFile = await this.loadLicenseFile(licenseUrl);\r\n this.authService.setLicenseFile(licenseFile);\r\n }\r\n\r\n /**\r\n * Loads license file from a public asset URL.\r\n * Library-safe: works only with HTTP-accessible paths.\r\n */\r\n private async loadLicenseFile(licenseUrl: string): Promise<Map<string, string> | null> {\r\n try {\r\n const data = await firstValueFrom(this.http.get<Record<string, string>>(licenseUrl));\r\n if (!data || typeof data !== 'object') {\r\n throw new Error('Invalid license file');\r\n }\r\n\r\n return new Map(Object.entries(data));\r\n } catch (error) {\r\n Logger.error('[LicenseService] Failed to load license file:', licenseUrl, error);\r\n return null;\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n ElementRef,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { AuthService } from './core/auth/auth.service';\r\nimport { ThemeService } from './core/services/theme.service';\r\nimport { DoohbotConfigService } from './core/config/doohbot-config.service';\r\nimport { ChatButtonComponent } from './app/chat/components/chat-button/chat-button.component';\r\nimport { ChatWindowComponent } from './app/chat/components/chat-window/chat-window.component';\r\nimport { ChatService } from './app/chat/chat.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AuthResult } from './core/auth/models/auth-result.model';\r\nimport { LicenseService } from './core/services/license.service';\r\nimport { FullscreenDirective, FullscreenMode } from './core/directives/fullscreen.directive';\r\n\r\n/**\r\n * Doohbot Main Component\r\n * Root component of the Doohbot library\r\n */\r\n@Component({\r\n selector: 'app-doohbot',\r\n standalone: true,\r\n imports: [CommonModule, ChatButtonComponent, ChatWindowComponent, FullscreenDirective],\r\n templateUrl: './doohbot.component.html',\r\n styleUrls: ['./doohbot.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DoohbotComponent implements OnInit, OnChanges, OnDestroy {\r\n /**\r\n * Federated authentication token from the host application.\r\n *\r\n * Used for SSO / federated login. The token must be issued by a\r\n * trusted issuer configured in the Doohbot admin panel.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [federatedToken]=\"accessToken\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() federatedToken?: string;\r\n\r\n /**\r\n * Session or auth result based login.\r\n *\r\n * Should pass host application's session or auth result object containing necessary user and token information.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [session]=\"session\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() session?: AuthResult;\r\n\r\n /**\r\n * Whether the user session should be persisted across browser restarts.\r\n *\r\n * When `true`, Doohbot stores auth state in `localStorage`.\r\n * When `false`, `sessionStorage` is used instead.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [rememberMe]=\"true\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() rememberMe?: boolean;\r\n\r\n /**\r\n * License file json object.\r\n *\r\n * Required only when the `licenseFilePath` is not passed from `provideDoohbot()`.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [licenseFile]=\"licenseFile\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() licenseFile?: Map<string, string>;\r\n\r\n /**\r\n * License code used to activate licensed features.\r\n *\r\n * Required only when multiple licenses are configured.\r\n * Can change dynamically per tenant, user, or role.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [licenseCode]=\"licenseCode\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() licenseCode?: string;\r\n\r\n /**\r\n * Whether the Doohbot UI is in dark mode.\r\n *\r\n * When `true`, Doohbot uses a dark theme.\r\n * When `false`, Doohbot uses a light theme.\r\n * When not provided, Doohbot will attempt to auto-detect the theme based on the host application's theme or system preferences.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [isDarkMode]=\"true\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() isDarkMode?: boolean;\r\n\r\n /**\r\n * Fullscreen mode for the chat when fullscreen button is clicked.\r\n *\r\n * When `browser`, Doohbot uses browser fullscreen mode.\r\n * When `viewport`, Doohbot uses visible viewport.\r\n * When `contained`, Doohbot uses parent available space.\r\n * When not provided, Doohbot will use 'viewport'.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [fullscreenMode]=\"'viewport'\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() fullscreenMode: FullscreenMode = 'viewport';\r\n\r\n private destroyIsAuthenticated$ = new Subject<void>();\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private themeService: ThemeService,\r\n private licenseService: LicenseService,\r\n private authService: AuthService,\r\n private chatService: ChatService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n // Theme management effect\r\n effect(() => {\r\n // Apply theme from global configuration early to register root element\r\n this.applyTheme();\r\n });\r\n }\r\n\r\n async ngOnInit() {\r\n // Resolve in case of license file\r\n await this.licenseService.initLicenseResolver();\r\n\r\n // Auth state\r\n this.authService.isAuthenticated$\r\n .pipe(takeUntil(this.destroyIsAuthenticated$))\r\n .subscribe((value) => {\r\n if (value) {\r\n this.initializeUI();\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['rememberMe']) {\r\n this.authService.setRememberMe(this.rememberMe);\r\n }\r\n\r\n if (changes['licenseFile'] && this.licenseFile) {\r\n this.authService.setLicenseFile(this.licenseFile);\r\n }\r\n\r\n if (changes['licenseCode'] && this.licenseCode) {\r\n this.authService.setLicenseCode(this.licenseCode);\r\n }\r\n\r\n if (changes['isDarkMode']) {\r\n this.applyTheme();\r\n }\r\n\r\n this.tryStartAuthFlow();\r\n }\r\n\r\n // Theme applied from global configuration\r\n private applyTheme() {\r\n this.themeService.setThemeConfig(this.elementRef, this.isDarkMode);\r\n }\r\n\r\n private initializeUI() {\r\n // TODO: Fetch user related theme/personalization from api and set theme (eg: dark-them, navigation-pin, fullscreen)\r\n this.applyTheme();\r\n\r\n // Start new session\r\n this.chatService.startNewSession();\r\n\r\n // Subscribe to context changes if not already\r\n this.chatService.resetLastRead();\r\n }\r\n\r\n private tryStartAuthFlow() {\r\n const authConfig = this.configService.auth();\r\n if (!authConfig) return;\r\n\r\n const hasFederated = !!this.federatedToken;\r\n const hasSession = !!this.session;\r\n\r\n switch (authConfig.mode) {\r\n case 'federated':\r\n if (!hasFederated) return; // wait until input is set\r\n if (hasSession) {\r\n console.warn('session input is ignored because mode is federated.');\r\n }\r\n this.authService.setFederatedAuthToken(this.federatedToken);\r\n this.authService.initFederatedAuthFlow();\r\n break;\r\n\r\n case 'session':\r\n if (!hasSession) return; // wait until input is set\r\n if (hasFederated) {\r\n console.warn('federatedToken is ignored because mode is session.');\r\n }\r\n this.authService.initSessionAuthFlow(this.session);\r\n break;\r\n\r\n case 'manual':\r\n if (hasFederated || hasSession) {\r\n console.warn('Authentication inputs are ignored because mode is manual.');\r\n }\r\n // Optionally trigger manual login flow\r\n break;\r\n\r\n default:\r\n throw new Error(`Unsupported authentication mode: ${authConfig.mode}`);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroyIsAuthenticated$.next();\r\n this.destroyIsAuthenticated$.complete();\r\n }\r\n}\r\n","<app-chat-button> </app-chat-button>\r\n\r\n<app-chat-window [appFullscreen]=\"fullscreenMode\"> </app-chat-window>\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { AuthService } from './core/auth/auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DoohbotService {\r\n private authService = inject(AuthService);\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Logout the current user by clearing authentication tokens and state.\r\n * @returns A promise that resolves to true if logout was successful, false otherwise.\r\n */\r\n async logout(): Promise<boolean> {\r\n return this.authService.logout();\r\n }\r\n}\r\n","import { DoohbotConfig } from './doohbot-config.model';\r\nimport { DEFAULT_DOOHBOT_CONFIG } from './doohbot-config.default';\r\n\r\n/**\r\n * Merges user-provided config overrides with defaults.\r\n *\r\n * @param overrides - Partial config to override defaults\r\n * @returns Fully resolved DoohbotConfig object\r\n */\r\nexport function resolveDoohbotConfig(overrides?: Partial<DoohbotConfig>): DoohbotConfig {\r\n return {\r\n ...DEFAULT_DOOHBOT_CONFIG,\r\n ...overrides,\r\n };\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpHandler,\r\n HttpInterceptor,\r\n HttpRequest,\r\n} from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError, from } from 'rxjs';\r\nimport { catchError, retry, switchMap } from 'rxjs/operators';\r\nimport { AuthService } from '../auth/auth.service';\r\nimport { Logger } from '../utils/logger.service';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport { FederatedLoginRequest } from '../auth/models/federated-login-request.model';\r\n\r\n@Injectable()\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n constructor(\r\n private authService: AuthService,\r\n private configService: DoohbotConfigService,\r\n ) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n // In case of doohbot.com, the auth flow is handled in the doohbot-web itself, so we want to skip adding auth headers or attempting refreshes for those requests.\r\n if (this.configService.auth()?.mode === 'session') {\r\n return next.handle(req);\r\n }\r\n\r\n const authReq = this.addAuthHeader(req);\r\n return next.handle(authReq).pipe(\r\n catchError((error) => {\r\n if (\r\n error instanceof HttpErrorResponse &&\r\n error.status === 401 &&\r\n !this.authService.isAuthUrl(authReq.url)\r\n ) {\r\n //TODO: No refresh in case of federate mode\r\n // Consumer TTL for token can be longer than doohbot token TTL\r\n // So in case of federate mode, re-login instead of refresh\r\n if (this.configService.auth()?.mode === 'federated') {\r\n const loginRequest: FederatedLoginRequest = {\r\n access_token: this.authService.federatedAuthToken() ?? '',\r\n remember_me: this.authService.rememberMe(),\r\n };\r\n\r\n from(this.authService.federatedLogin(loginRequest)).pipe(\r\n retry(3), // retry re-login 3 times\r\n switchMap((result) => {\r\n if (!result) {\r\n return throwError(() => error);\r\n }\r\n return next.handle(this.addAuthHeader(req));\r\n }),\r\n catchError((authErr) => {\r\n Logger.error('[AuthInterceptor] Refresh error', authErr);\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n // Logger.error('[AuthInterceptor] 401 detected, attempting refresh');\r\n // // Refresh if expired/unauthenticated during http request\r\n // return this.authService.refreshLogin().pipe(\r\n // switchMap((result) => {\r\n // if (!result?.access_token) {\r\n // Logger.error('[AuthInterceptor] Refresh failed, clearing auth');\r\n // this.authService.clearAuth();\r\n // return throwError(() => error);\r\n // }\r\n\r\n // Logger.info('[AuthInterceptor] Token refreshed, retrying request');\r\n // return next.handle(this.addAuthHeader(req));\r\n // }),\r\n // catchError((refreshErr) => {\r\n // Logger.error('[AuthInterceptor] Refresh error', refreshErr);\r\n // this.authService.clearAuth();\r\n // return throwError(() => error);\r\n // }),\r\n // );\r\n }\r\n\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n private addAuthHeader(req: HttpRequest<any>): HttpRequest<any> {\r\n // Skip doohbot API requests that are auth-related or not API calls\r\n if (this.authService.isAuthUrl(req.url)) return req;\r\n\r\n // Skip if not a doohbot API request (e.g. external API calls)\r\n if (!this.authService.isConsumerApiRequest(req.url)) return req;\r\n\r\n const token = this.authService.accessToken();\r\n if (!token) return req;\r\n\r\n return req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpInterceptor,\r\n HttpRequest,\r\n HttpHeaders,\r\n HttpHandler,\r\n HttpEvent,\r\n HttpResponse,\r\n HttpErrorResponse,\r\n} from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\n\r\n@Injectable()\r\nexport class HttpLoggingInterceptor implements HttpInterceptor {\r\n private readonly LABEL_WIDTH = 22;\r\n\r\n private formatLine(label: string, value: any, color: string): void {\r\n const paddedLabel = label.padEnd(this.LABEL_WIDTH, ' ');\r\n const line = `${paddedLabel}${value !== undefined && value !== null ? value : ''}`;\r\n console.log(`%c${line}`, `color: ${color}; font-weight: bolder;`);\r\n }\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const start = performance.now();\r\n const id = new Date().toISOString();\r\n const tag = `[${id}] [${req.method}]: ${req.urlWithParams}`;\r\n\r\n console.log('');\r\n console.groupCollapsed(`%c${tag}`, 'color: #1ba02c; font-weight: bolder;');\r\n\r\n // General Section\r\n console.log('%cGeneral', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.formatLine('Request URL', req.urlWithParams, '#058c96');\r\n this.formatLine('Request Method', req.method, '#058c96');\r\n this.formatLine('Status Code', '—', '#058c96');\r\n this.formatLine('Remote Address', req.url.split('/')[2], '#058c96');\r\n this.formatLine('Referrer Policy', 'strict-origin-when-cross-origin', '#058c96');\r\n\r\n // Request Headers\r\n console.log('%cRequest Headers', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.logHeaders(req.headers);\r\n\r\n // Request Payload\r\n if (req.body) {\r\n console.log('%cRequest Payload', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.formatLine('Body:', this.stringifyForLog(req.body), '#058c96');\r\n }\r\n\r\n return next.handle(req).pipe(\r\n tap({\r\n next: (event) => {\r\n if (event instanceof HttpResponse) {\r\n const duration = Math.round(performance.now() - start);\r\n this.logResponse(event, duration);\r\n }\r\n },\r\n error: (err: HttpErrorResponse) => {\r\n const duration = Math.round(performance.now() - start);\r\n this.logError(err, duration);\r\n },\r\n }),\r\n );\r\n }\r\n\r\n private logResponse(res: HttpResponse<any>, duration: number) {\r\n console.log('%cResponse Headers', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.logHeaders(res.headers);\r\n\r\n console.log('%cResponse', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.formatLine('Status Code', `${res.status} ${res.statusText}`, '#058c96');\r\n this.formatLine('Time', `${duration} ms`, '#058c96');\r\n\r\n this.formatBody(res.body)\r\n .then((bodyStr) => {\r\n if (bodyStr) {\r\n console.log('%cResponse Body', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n console.log(bodyStr);\r\n }\r\n console.groupEnd();\r\n console.log('');\r\n })\r\n .catch(() => {\r\n console.groupEnd();\r\n console.log('');\r\n });\r\n }\r\n\r\n private logError(err: HttpErrorResponse, duration: number) {\r\n console.log('%cResponse Headers', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.logHeaders(err.headers);\r\n\r\n console.log('%cResponse', 'font-size: 17px; font-weight: bold; color: #dc2626;');\r\n this.formatLine('Status Code', `${err.status} ${err.statusText}`, '#dc2626');\r\n this.formatLine('Time', `${duration} ms`, '#dc2626');\r\n\r\n this.formatBody(err.error || err.message)\r\n .then((bodyStr) => {\r\n if (bodyStr) {\r\n console.log('%cError Body', 'font-size: 17px; font-weight: bold; color: #dc2626;');\r\n console.log(bodyStr);\r\n }\r\n console.groupEnd();\r\n console.log('');\r\n })\r\n .catch(() => {\r\n console.groupEnd();\r\n console.log('');\r\n });\r\n }\r\n\r\n private logHeaders(headers: HttpHeaders | null | undefined) {\r\n if (!headers || headers.keys().length === 0) {\r\n console.log(' (none)');\r\n return;\r\n }\r\n headers.keys().forEach((key) => {\r\n const value = headers.get(key) || '';\r\n const paddedKey = ` ${key}:`.padEnd(this.LABEL_WIDTH, ' ');\r\n console.log(`%c${paddedKey}${value}`, 'color: #058c96; font-weight: bolder;');\r\n });\r\n }\r\n\r\n private stringifyForLog(obj: any): string {\r\n if (obj === null || obj === undefined) return 'null';\r\n if (typeof obj === 'string') return obj;\r\n try {\r\n return JSON.stringify(obj, null, 2);\r\n } catch {\r\n return String(obj);\r\n }\r\n }\r\n\r\n private async formatBody(body: any): Promise<string | null> {\r\n if (!body) return null;\r\n\r\n if (body instanceof Blob && body.type.includes('application/json')) {\r\n const text = await body.text();\r\n try {\r\n const parsed = JSON.parse(text);\r\n return JSON.stringify(parsed, null, 2);\r\n } catch {\r\n return text;\r\n }\r\n }\r\n\r\n if (typeof body === 'object') {\r\n try {\r\n return JSON.stringify(body, null, 2);\r\n } catch {\r\n return String(body);\r\n }\r\n }\r\n\r\n return String(body);\r\n }\r\n}\r\n","import { ErrorHandler, Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class GlobalErrorHandler implements ErrorHandler {\r\n handleError(error: any): void {\r\n console.error(\r\n '%c [GLOBAL ERROR]:',\r\n 'color: #dc2626; font-weight: bold;',\r\n this.normalizeError(error),\r\n );\r\n }\r\n\r\n private normalizeError(err: any) {\r\n return {\r\n message: err?.message || err?.toString(),\r\n stack: err?.stack || null,\r\n cause: err?.cause || null,\r\n };\r\n }\r\n}\r\n","import { APP_INITIALIZER, ErrorHandler, makeEnvironmentProviders, Provider } from '@angular/core';\r\nimport { DOOHBOT_CONFIG, DoohbotConfig } from '../public-api';\r\nimport { resolveDoohbotConfig } from './core/config/doohbot-config.resolver';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { AuthInterceptor } from './core/interceptors/auth.interceptor';\r\nimport { Logger } from './core/utils/logger.service';\r\nimport { DoohbotConfigService } from './core/config/doohbot-config.service';\r\nimport { HttpLoggingInterceptor } from './core/interceptors/http-logging.interceptor';\r\nimport { GlobalErrorHandler } from './core/services/global-error-handler';\r\nimport { DEFAULT_DOOHBOT_CONFIG } from './core/config/doohbot-config.default';\r\n\r\n/**\r\n * Provides all necessary Doohbot dependencies for standalone Angular applications.\r\n *\r\n * This provider:\r\n * - Registers the Doohbot configuration via dependency injection\r\n * - Registers HTTP interceptors required for authentication and licensing\r\n * - Does NOT provide `HttpClientModule` — the host application must provide it\r\n *\r\n * Use this when you want Doohbot to manage authentication, licensing,\r\n * and API integration automatically.\r\n *\r\n * @param config Partial configuration. Missing values are resolved using library defaults.\r\n * @returns EnvironmentProviders for use with `bootstrapApplication`\r\n *\r\n * @example\r\n * ```ts\r\n * // main.ts\r\n * import { bootstrapApplication } from '@angular/platform-browser';\r\n * import { importProvidersFrom } from '@angular/core';\r\n * import { HttpClientModule } from '@angular/common/http';\r\n * import { AppComponent } from './app/app.component';\r\n * import { provideDoohbot } from 'doohbot';\r\n *\r\n * bootstrapApplication(AppComponent, {\r\n * providers: [\r\n * importProvidersFrom(HttpClientModule),\r\n * provideDoohbot({\r\n * environment: 'production',\r\n * licenseFilePath: 'assets/doohbot_license.json',\r\n * // Optional api configuration if want to use your own api\r\n * api: {\r\n * apiBaseUrl: 'https://api.doohbot.com/',\r\n * apiKey: 'your-api-key',\r\n * },\r\n * // Optional theme configuration if want to match doohbot to your application theme\r\n * theme: {\r\n * buttonStyle: 'fab',\r\n * fontFamily: 'Inter, Roboto, sans-serif',\r\n * enableDrag: true,\r\n * enableResize: true,\r\n * palette: 'doohbot'\r\n * }\r\n * }),\r\n * ],\r\n * }).catch(console.error);\r\n * ```\r\n */\r\nexport function provideDoohbot(config: Partial<DoohbotConfig> = {}) {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: DOOHBOT_CONFIG,\r\n useValue: resolveDoohbotConfig(config),\r\n },\r\n DoohbotConfigService,\r\n\r\n // Init logger\r\n Logger,\r\n {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n deps: [Logger],\r\n useFactory: (logger: Logger) => () => {\r\n Logger.init(logger);\r\n },\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor,\r\n multi: true,\r\n },\r\n ...((config.environment ?? DEFAULT_DOOHBOT_CONFIG.environment) === 'production'\r\n ? []\r\n : devProviders),\r\n ]);\r\n}\r\n\r\nconst devProviders: Provider[] = [\r\n { provide: HTTP_INTERCEPTORS, useClass: HttpLoggingInterceptor, multi: true },\r\n { provide: ErrorHandler, useClass: GlobalErrorHandler },\r\n];\r\n","/**\r\n * public-api.ts\r\n * Main public API surface of the Doohbot library.\r\n * Exports all necessary modules, components, services, and models.\r\n * Consumers should only import from this file.\r\n */\r\n\r\n// Components\r\nexport { DoohbotComponent } from './lib/doohbot.component';\r\nexport { DoohbotService } from './lib/doohbot.service';\r\nexport { DoohbotConfigService } from './lib/core/config/doohbot-config.service';\r\nexport { Logger } from './lib/core/utils/logger.service';\r\n\r\n// Providers\r\nexport { provideDoohbot } from './lib/doohbot.providers';\r\n\r\n// Configuration\r\nexport type { DoohbotConfig } from './lib/core/config/doohbot-config.model';\r\nexport type { DoohbotApiConfig } from './lib/core/models/api-config.model';\r\nexport type { DoohbotThemeConfig } from './lib/core/models/theme-config.model';\r\nexport { DOOHBOT_CONFIG } from './lib/core/config/doohbot-config.token';\r\nexport { resolveDoohbotConfig } from './lib/core/config/doohbot-config.resolver';\r\nexport { doohbotConst } from './lib/const/doohbot-constant';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DoohbotConfigService","i2.DoohbotConfigService","i1.HttpService","i2.HttpStreamService","i1","i2.StorageService","i3.DoohbotConfigService","i4.SnackbarService","i1.ChatService","i3.AuthService","i2","i3","map","i1.DialogService","i2.ChatService","i5","i2.PersonalizationService","i2.ThemeService","i3.ChatService","i4.AuthService","i6","i7","i1.AuthService","i4","i3.DialogService","i2.DialogService","i3.SnackbarService","i1.MarkdownService","i2.AuthService","i1.FullscreenDirective","i4.ChatService","i5.DialogService","i6.ChatHistoryService","i10","i1.ThemeService","i2.LicenseService","i5.DoohbotConfigService","catchError","retry","switchMap"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAM,gBAAgB,GAAG;IACvB,aAAa;IACb,eAAe;IACf,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,aAAa;IACb,oBAAoB;IACpB,gBAAgB;IAChB,iBAAiB;IACjB,wBAAwB;CACzB;MAMY,oBAAoB,CAAA;+GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAnB/B,aAAa;YACb,eAAe;YACf,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,kBAAkB;YAClB,cAAc;YACd,eAAe;YACf,aAAa;YACb,oBAAoB;YACpB,gBAAgB;YAChB,iBAAiB;AACjB,YAAA,wBAAwB,aAZxB,aAAa;YACb,eAAe;YACf,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,kBAAkB;YAClB,cAAc;YACd,eAAe;YACf,aAAa;YACb,oBAAoB;YACpB,gBAAgB;YAChB,iBAAiB;YACjB,wBAAwB,CAAA,EAAA,CAAA,CAAA;gHAOb,oBAAoB,EAAA,OAAA,EAAA,CAHtB,gBAAgB,EAhBzB,aAAa;YACb,eAAe;YACf,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,kBAAkB;YAClB,cAAc;YACd,eAAe;YACf,aAAa;YACb,oBAAoB;YACpB,gBAAgB;YAChB,iBAAiB;YACjB,wBAAwB,CAAA,EAAA,CAAA,CAAA;;4FAOb,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,gBAAgB;AACzB,oBAAA,OAAO,EAAE,gBAAgB;AAC1B,iBAAA;;;ACnCM,MAAM,YAAY,GAAG;;;;;;;;;;;;;;AAkB1B,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,WAAW,EAAE,oBAAoB;AACjC,IAAA,kBAAkB,EAChB,8JAA8J;AAChK,IAAA,QAAQ,EAAE,6BAA6B;;;AAMvC,IAAA,OAAO,EACL,4tEAA4tE;AAC9tE,IAAA,WAAW,EACT,o5KAAo5K;AACt5K,IAAA,aAAa,EACX,g+OAAg+O;AACl+O,IAAA,UAAU,EACR,43GAA43G;AAC93G,IAAA,SAAS,EACP,43IAA43I;;;ACnCh4I;;;AAGG;AACI,MAAM,sBAAsB,GAAkB;;AAEnD,IAAA,WAAW,EAAE,aAAa;;AAG1B,IAAA,eAAe,EAAE,SAAS;;AAG1B,IAAA,aAAa,EAAE,SAAS;;IAGxB,mBAAmB,EAAE,KAAK;;AAG1B,IAAA,GAAG,EAAE;AACH,QAAA,OAAO,EAAE,8BAA8B;AACvC,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,aAAa,EAAE,CAAC;AAChB,QAAA,UAAU,EAAE,IAAI;AACjB,KAAA;;AAGD,IAAA,KAAK,EAAE;AACL,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,UAAU,EAAE,2BAA2B;AACvC,QAAA,OAAO,EAAE,SAAS;AACnB,KAAA;CACF;;ACjCD;;;AAGG;MACU,cAAc,GAAG,IAAI,cAAc,CAAgB,gBAAgB;;ACEhF;;;;AAIG;MAIU,oBAAoB,CAAA;AAyD/B,IAAA,WAAA,CAGE,iBAAyC,EAAE,EAAA;AApD7C;;;;;;;;;;AAUG;QACM,IAAA,CAAA,WAAW,GAAG,MAAoC,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW;AAE1F;;;AAGG;AACM,QAAA,IAAA,CAAA,eAAe,GAAG,MAAc,IAAI,CAAC,YAAY,EAAE,CAAC,eAAe,IAAI,EAAE;AAElF;;;AAGG;AACM,QAAA,IAAA,CAAA,aAAa,GAAG,MAAc,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,IAAI,EAAE;AAE9E;;;AAGG;AACM,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAe,IAAI,CAAC,YAAY,EAAE,CAAC,mBAAmB,IAAI,KAAK;AAE9F;;;AAGG;QACM,IAAA,CAAA,GAAG,GAAG,MAAoC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG;AAE1E;;;AAGG;QACM,IAAA,CAAA,IAAI,GAAG,MAAqC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI;AAE7E;;;AAGG;QACM,IAAA,CAAA,KAAK,GAAG,MAAsC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK;;AAQ9E,QAAA,MAAM,YAAY,GAAkB;AAClC,YAAA,GAAG,sBAAsB;AACzB,YAAA,GAAG,cAAc;SAClB;AAED,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;;AAGjC,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,wDAAC;QACxC,IAAI,CAAC,aAAa,GAAG,IAAI,eAAe,CAAgB,YAAY,CAAC;QACrE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;IAClD;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,KAA6B,EAAA;AAClC,QAAA,IAAI,aAAa,IAAI,KAAK,EAAE;AAC1B,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;QAC7D;AAEA,QAAA,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,KAAK,EAAE;AACtD,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;AAE9B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;IACpC;AAEQ,IAAA,cAAc,CAAC,MAAqB,EAAA;;AAE1C,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;QAC5C;;QAGA,IAAI,MAAM,CAAC,eAAe,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,EAAE;AACxE,YAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;QACrD;;AAGA,QAAA,IAAI,MAAM,CAAC,GAAG,EAAE;AACd,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG;AAEtB,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AAChB,gBAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC;YACxE;AAEA,YAAA,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,GAAG,CAAC,aAAa,GAAG,CAAC,EAAE;AAC5D,gBAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;YACnD;AAEA,YAAA,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE;AACtD,gBAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;YAChD;QACF;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;IAC/B;AA3HW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,kBA2DrB,cAAc,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AA3Db,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BA2DI;;0BACA,MAAM;2BAAC,cAAc;;;MCxEb,MAAM,CAAA;aACF,IAAA,CAAA,QAAQ,GAAkB,IAAlB,CAAuB;AAU9C,IAAA,WAAA,CAAoB,aAAmC,EAAA;QAAnC,IAAA,CAAA,aAAa,GAAb,aAAa;QARzB,IAAA,CAAA,MAAM,GAAG,oBAAoB;AAE7B,QAAA,IAAA,CAAA,MAAM,GAAG;AACf,YAAA,IAAI,EAAE,gCAAgC;AACtC,YAAA,IAAI,EAAE,gCAAgC;AACtC,YAAA,KAAK,EAAE,gCAAgC;SACxC;AAGC,QAAA,MAAM,CAAC,QAAQ,GAAG,IAAI;IACxB;;IAGA,OAAO,IAAI,CAAC,QAAgB,EAAA;AAC1B,QAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC;IAChD;;IAGQ,MAAM,GAAA;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,YAAY;IAC1D;;AAGA,IAAA,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AACpB,QAAA,IAAI;YACF,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;QACxE;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC7C;IACF;AAEA,IAAA,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AACpB,QAAA,IAAI;YACF,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;QACxE;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC7C;IACF;AAEA,IAAA,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AACpB,QAAA,IAAI;YACF,OAAO,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;QAC1E;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC9C;IACF;;AAGQ,IAAA,WAAW,MAAM,GAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;;AAEpB,YAAA,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF;QACH;QACA,OAAO,MAAM,CAAC,QAAQ;IACxB;AAEA,IAAA,OAAO,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACtC;AAEA,IAAA,OAAO,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACtC;AAEA,IAAA,OAAO,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACvC;+GA3EW,MAAM,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAN,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAM,cADO,MAAM,EAAA,CAAA,CAAA;;4FACnB,MAAM,EAAA,UAAA,EAAA,CAAA;kBADlB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCMrB,WAAW,CAAA;IACtB,WAAA,CACU,IAAgB,EAChB,aAAmC,EAAA;QADnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,aAAa,GAAb,aAAa;IACpB;AAEH,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,EAAE;AAC1D,QAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,UAAU,CAAC;AAC1D,QAAA,OAAO,UAAU;IACnB;AAEA,IAAA,MAAM,GAAG,CACP,GAAW,EACX,KAAc,EACd,WAAW,GAAG,KAAK,EACnB,UAAU,GAAG,KAAK,EAClB,OAAO,GAAG,IAAI,EACd,OAAqB,EAAA;;QAGrB,MAAM,MAAM,IAAI,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAe;QAExF,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC;AACvD,QAAA,OAAO,MAAM,cAAc,CACzB,IAAI,CAAC;aACF,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,EAAE,EAAE;AAC3B,YAAA,MAAM,EAAE,MAAM;;YAEd,OAAO;SACR;aACA,IAAI,CACH,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;;AAEnB,YAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC;AACrD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CACJ;IACH;AAEQ,IAAA,eAAe,CAAC,MAAW,EAAE,IAAS,EAAE,WAAmB,EAAA;QACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAChC,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,EAAE;AAChE,gBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,WAAW,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG,CAAC;YAClE;iBAAO;AACL,gBAAA,MAAM,CAAC,CAAA,EAAG,WAAW,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;YAC5C;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,IAAI,CAAC,GAAW,EAAE,KAAc,EAAE,UAAU,GAAG,KAAK,EAAE,OAAqB,EAAA;QAC/E,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;;QAEvD,OAAO,MAAM,cAAc,CACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAmB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAC3E,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACtD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CACF;IACH;IAEA,MAAM,KAAK,CACT,GAAW,EACX,KAAc,EACd,UAAU,GAAG,KAAK,EAClB,OAAqB,EAAA;QAErB,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;QACxD,OAAO,MAAM,cAAc,CACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAmB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAC5E,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC;AACvD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CACF;IACH;IACA,MAAM,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,UAAU,GAAG,KAAK,EAAE,OAAqB,EAAA;QAC9E,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;QACtD,OAAO,MAAM,cAAc,CACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAC5D,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC;AACrD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CACF;IACH;IAEA,MAAM,MAAM,CACV,GAAW,EACX,KAAc,EACd,UAAU,GAAG,KAAK,EAClB,OAAqB,EAAA;QAErB,IAAI,MAAM,GAAG,EAAE;QACf,MAAM,GAAG,KAAmB;QAE5B,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;QACzD,OAAO,MAAM,cAAc,CACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CACrE,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,KAAK,CAAC;AACxD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CACF;IACH;+GA7HW,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCCY,iBAAiB,CAAA;IAC5B,WAAA,CACU,MAAc,EACd,IAAgB,EAAA;QADhB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,IAAI,GAAJ,IAAI;IACX;AAEH;;AAEG;AACH,IAAA,gBAAgB,CACd,GAAW,EACX,IAAS,EACT,OAAgC,EAAA;;AAGhC,QAAA,OAAO,IAAI,UAAU,CAAqB,CAAC,QAAQ,KAAI;;AAErD,YAAA,IAAI,cAAc,GAAG,IAAI,WAAW,CAAC;AACnC,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,MAAM,EAAE,mBAAmB;AAC3B,gBAAA,eAAe,EAAE,UAAU;AAC5B,aAAA,CAAC;YAEF,IAAI,OAAO,EAAE;gBACX,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACnC,oBAAA,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AACxD,gBAAA,CAAC,CAAC;YACJ;YAEA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE;gBACzC,IAAI;AACJ,gBAAA,OAAO,EAAE,cAAc;AACvB,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,YAAY,EAAE,MAAM;AACrB,aAAA,CAAC;YAEF,IAAI,UAAU,GAAG,CAAC;AAElB,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC;AACxB,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;oBACd,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,gBAAgB,EAAE;;AAEjD,wBAAA,MAAM,QAAQ,GAAI,KAAa,CAAC,WAAW;AAC3C,wBAAA,IAAI,CAAC,QAAQ;4BAAE;wBAEf,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;AAC1C,wBAAA,UAAU,GAAG,QAAQ,CAAC,MAAM;wBAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;AAEjC,wBAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,4BAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gCAAE;AAExB,4BAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gCAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAExC,gCAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;AACxB,oCAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;oCAC1C;gCACF;AAEA,gCAAA,IAAI;oCACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;;oCAElC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MACd,QAAQ,CAAC,IAAI,CAAC;wCACZ,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE;AAC/C,wCAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,OAAO;AAC5B,wCAAA,EAAE,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;AAC5B,wCAAA,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;AACnC,wCAAA,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;wCAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,qCAAA,CAAC,CACH;gCACH;gCAAE,OAAO,CAAC,EAAE;oCACV,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,OAAO,EAAE,CAAC,CAAC;gCACtD;4BACF;wBACF;oBACF;yBAAO,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE;AAChD,wBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAC5C;gBACF,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC;gBACD,QAAQ,EAAE,MAAK;AACb,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC5C,CAAC;AACF,aAAA,CAAC;AAEF,YAAA,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE;AAChC,QAAA,CAAC,CAAC;IACJ;+GA9FW,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCMY,cAAc,CAAA;IAEzB,WAAA,CACU,IAAiB,EACjB,iBAAoC,EAAA;QADpC,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;AAEzB,QAAA,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC;IAC5C;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,OAAqB,EAAE,UAAU,GAAG,KAAK,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC;IACzD;AAEA;;AAEG;AACH,IAAA,iBAAiB,CAAC,OAAoB,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA,EAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA,YAAA,CAAc,EAAE,OAAO,CAAC;IAC5F;AAEA,IAAA,cAAc,CACZ,OAA2B,EAC3B,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC;IAC9D;AAEA,IAAA,cAAc,CACZ,aAAqB,EACrB,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,eAAA,EAAkB,aAAa,CAAA,CAAE,EAAE,SAAS,EAAE,UAAU,CAAC;IAChF;;;;;;;;;;AAaA,IAAA,iBAAiB,CAAC,aAAqB,EAAE,UAAU,GAAG,KAAK,EAAA;AACzD,QAAA,MAAM,IAAI,GAAG,EAAE,gBAAgB,EAAE,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE;AACrE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,EAAE,UAAU,CAAC;IAC7D;AAEA,IAAA,eAAe,CACb,aAAqB,EACrB,KAAa,EACb,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,eAAA,EAAkB,aAAa,CAAA,MAAA,CAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,CAAC;IACxF;AAEA,IAAA,gBAAgB,CAAC,OAAgB,EAAE,UAAU,GAAG,KAAK,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC;IAChE;+GA/DW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCAY,QAAQ,CAAA;IAOnB,WAAA,CACqC,IAAS,EACpC,WAAgC,EAAA;QADL,IAAA,CAAA,IAAI,GAAJ,IAAI;QAC/B,IAAA,CAAA,WAAW,GAAX,WAAW;;;QALd,IAAA,CAAA,OAAO,GAAkB,IAAI;QAC7B,IAAA,CAAA,IAAI,GAAkB,OAAO;IAKjC;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO;IACvC;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;IAC5B;AAEA,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,cAAc;AACvB,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,SAAS;AAClB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,MAAM;AACf,YAAA;AACE,gBAAA,OAAO,MAAM;;IAEnB;AAlCW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,QAAQ,kBAQT,kBAAkB,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AARjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECbrB,wTAOA,EAAA,MAAA,EAAA,CAAA,q6DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIY,oBAAoB,mLAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAEjC,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cAGZ,IAAI,EAAA,OAAA,EACP,CAAC,oBAAoB,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,wTAAA,EAAA,MAAA,EAAA,CAAA,q6DAAA,CAAA,EAAA;;0BAU1C,MAAM;2BAAC,kBAAkB;;;MEPjB,eAAe,CAAA;AAC1B,IAAA,WAAA,CAAoB,QAAqB,EAAA;QAArB,IAAA,CAAA,QAAQ,GAAR,QAAQ;IAAgB;;AAGpC,IAAA,IAAI,CAAC,OAAe,EAAE,QAAgB,EAAE,IAAmB,EAAA;AACjE,QAAA,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE;AACxC,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AACvB,YAAA,kBAAkB,EAAE,KAAK;AACzB,YAAA,gBAAgB,EAAE,QAAQ;AAC1B,YAAA,UAAU,EAAE,CAAC,CAAA,SAAA,EAAY,IAAI,EAAE,CAAC;AACjC,SAAA,CAAC;IACJ;;AAGA,IAAA,OAAO,CAAC,OAAe,EAAE,QAAA,GAAmB,IAAI,EAAA;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;IACzC;AAEA,IAAA,IAAI,CAAC,OAAe,EAAE,QAAA,GAAmB,IAAI,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;IACtC;AAEA,IAAA,KAAK,CAAC,OAAe,EAAE,QAAA,GAAmB,IAAI,EAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;IACvC;AAEA,IAAA,IAAI,CAAC,OAAe,EAAE,QAAA,GAAmB,IAAI,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;IACtC;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;IACzB;+GAjCW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCFY,kBAAkB,CAAA;AAH/B,IAAA,WAAA,GAAA;AAIU,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC;;AAGnC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAmB,EAAE,oDAAC;AACvC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAU,KAAK,qDAAC;AAClC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAU,KAAK,yDAAC;AACtC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAU,IAAI,mDAAC;AAC/B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAS,CAAC,yDAAC;AACjC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAU,KAAK,wDAAC;AACrC,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAgB,IAAI,+DAAC;AA2PzD,IAAA;AAzPC;;AAEG;IACI,2BAA2B,CAChC,eAAoC,EACpC,MAAc,EAAA;;AAGd,QAAA,MAAM,SAAS,GAAG,eAAe,CAAC;AAChC,cAAE,IAAI,IAAI,CAAC,eAAe,CAAC,eAAe;cACxC,eAAe,CAAC;AAChB,kBAAE,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU;AACrC,kBAAE,IAAI,IAAI,EAAE;AAEhB,QAAA,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,eAAe,CAAC;;QAGzD,IAAI,QAAQ,GAAc,EAAE;AAC5B,QAAA,IAAI,eAAe,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE;AACvE,YAAA,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAgB,MAAM;AAC7D,gBAAA,EAAE,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;gBACxB,MAAM,EAAE,GAAG,CAAC,IAAI;gBAChB,IAAI,EAAE,GAAG,CAAC,OAAO;AACjB,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,aAAA,CAAC,CAAC;QACL;;QAGA,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,IAAI,eAAe,CAAC,eAAe,IAAI,EAAE;QAEtF,OAAO;AACL,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,eAAe,EAAE,SAAS;AAC1B,YAAA,KAAK,EAAE,eAAe,CAAC,KAAK,IAAI,uBAAuB;AACvD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,QAAQ,EAAE,QAAQ;SACnB;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,YAAY,CAAC,MAAc,EAAE,YAAY,GAAG,KAAK,EAAA;QACrD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAE5D,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACtE,YAAA,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC;YACjD;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAEjF,IAAI,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE;gBAC5C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAChD,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC,CAC5C;gBACD,MAAM,OAAO,GACX,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;AAE9E,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;AACjC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;AAC7C,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAE3B,MAAM,CAAC,IAAI,CAAC,CAAA,OAAA,EAAU,cAAc,CAAC,MAAM,CAAA,4BAAA,CAA8B,CAAC;YAC5E;iBAAO;AACL,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC;AAC7C,YAAA,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC;AAC/D,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA;;AAEG;IACH,MAAM,gBAAgB,CAAC,MAAc,EAAA;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;YAAE;AAE7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAE5B,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;YAE9E,IAAI,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE;gBAC5C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAChD,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC,CAC5C;gBACD,MAAM,OAAO,GACX,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;AAE9E,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC;AAC1D,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;YACxD;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC;AAClD,YAAA,MAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE,GAAG,CAAC;QACtE;gBAAU;AACR,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;AAEA;;AAEG;IACH,MAAM,mBAAmB,CAAC,SAAiB,EAAA;AACzC,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC;YAElE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE;;gBAEjC,MAAM,QAAQ,GAAkB,EAAE;AAClC,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AAC1D,gBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AAChE,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;AAE3D,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;oBAClC,IAAI,KAAK,CAAC,CAAC,CAAC;wBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACrC,IAAI,UAAU,CAAC,CAAC,CAAC;wBAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACjD;gBAEA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AAC5B,oBAAA,EAAE,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;oBACxB,MAAM,EAAE,GAAG,CAAC,IAAI;oBAChB,IAAI,EAAE,GAAG,CAAC,OAAO;AACjB,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,iBAAA,CAAC,CAAC;YACL;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,yBAAyB,CAAC;AAC9C,YAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC;QAClE;AACA,QAAA,OAAO,EAAE;IACX;AAEA;;AAEG;AACH,IAAA,MAAM,aAAa,CAAC,SAAiB,EAAE,MAAc,EAAA;AACnD,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;AACvC,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC;AACrE,YAAA,IAAI,MAAM,EAAE,OAAO,EAAE;gBACnB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;AAC/E,gBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mCAAmC,CAAC;YAC5D;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC;AAC5C,YAAA,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,GAAG,CAAC;QACnE;gBAAU;AACR,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;QACpC;IACF;AAEA;;AAEG;IACH,MAAM,gBAAgB,CAAC,MAAc,EAAA;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC/E,YAAA,IAAI,MAAM,EAAE,OAAO,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,gBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC;YAC/C;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,yBAAyB,CAAC;AAC9C,YAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC;QAClE;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,kBAAkB,CAAC,SAAiB,EAAE,QAAgB,EAAE,MAAc,EAAA;AAC1E,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;AACvC,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC;AAC7E,YAAA,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO;YAEjC,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,KAAK,SAAS,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAC/E;AACD,gBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,4BAA4B,CAAC;YACrD;AACA,YAAA,OAAO,OAAO;QAChB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC;AAC7C,YAAA,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC;AAC/D,YAAA,OAAO,KAAK;QACd;gBAAU;AACR,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;QACpC;IACF;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;AAEA;;AAEG;IACI,aAAa,CAAC,MAAc,EAAE,SAAiB,EAAA;QACpD,OAAO;AACL,YAAA,WAAW,EAAE,SAAS;YACtB,eAAe,EAAE,IAAI,IAAI,EAAE;AAC3B,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,QAAQ,EAAE,EAAE;YACZ,MAAM;SACP;IACH;AAEA;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC;+GArQW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACgFD;;AAEG;AACI,MAAM,uBAAuB,GAAG,IAAI,cAAc,CACvD,yBAAyB,EACzB;AACE,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,OAAO;AACd,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,gBAAgB,EAAE,QAAQ;AAC1B,QAAA,iBAAiB,EAAE,KAAK;AACxB,QAAA,oBAAoB,EAAE,IAAI;AAC1B,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,gBAAgB,EAAE,gBAAgB;AAClC,QAAA,uBAAuB,EAAE,KAAK;AAC9B,QAAA,SAAS,EAAE,KAAK;KACjB,CAAC;AACH,CAAA,CACF;;AC5GD;AACO,MAAM,WAAW,GAAG;AACzB,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,aAAa,EAAE,0FAA0F;CAC1G;;MCKY,cAAc,CAAA;AAIzB,IAAA,WAAA,CAAoC,MAAqB,EAAA;QAHxC,IAAA,CAAA,UAAU,GAAG,iBAAiB;;AAK7C,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,aAAa,IAAI,WAAW,CAAC,aAAa,IAAI,EAAE;IAC1E;AAEA;;;;;AAKG;AACH,IAAA,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,OAAO,GAAG,KAAK,EAAA;AAC3C,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,YAAY;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AACpC,YAAA,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK;AACpB,YAAA,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC;QACzD;IACF;AAEA;;;;;AAKG;AACH,IAAA,GAAG,CAAI,GAAW,EAAE,OAAO,GAAG,KAAK,EAAA;AACjC,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,YAAY;YACvD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AAC7C,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,IAAI;YAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AACpC,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,OAAO,IAAI;YAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAA4B;AAC/D,YAAA,OAAQ,MAAM,CAAC,GAAG,CAAO,IAAI,IAAI;QACnC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC;AAC5D,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;;;AAIG;AACH,IAAA,MAAM,CAAC,GAAW,EAAE,OAAO,GAAG,KAAK,EAAA;AACjC,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,YAAY;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AACpC,YAAA,OAAO,OAAO,CAAC,GAAG,CAAC;AACnB,YAAA,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;QAC5D;IACF;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,QAAA,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;IAC5C;AAEA;;;;AAIG;IACH,OAAO,CAAC,OAAO,GAAG,KAAK,EAAA;AACrB,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,YAAY;YACvD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AAC7C,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,KAAK;YACvB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI;QACpC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC;AAC7D,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;;;AAIG;AACK,IAAA,MAAM,CAAC,OAAgB,EAAA;AAC7B,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AAC7C,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,EAAE;YACpB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AACpC,YAAA,OAAO,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QAC/C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC;AAC9D,YAAA,OAAO,EAAE;QACX;IACF;AAEA;;;;AAIG;AACK,IAAA,OAAO,CAAC,SAAiB,EAAA;AAC/B,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;IACnE;AAEA;;;;AAIG;AACK,IAAA,OAAO,CAAC,UAAkB,EAAA;AAChC,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;AAC9D,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACnD,OAAO,SAAS,IAAI,IAAI;QAC1B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACxD,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI;IACb;AAnIW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,kBAIL,cAAc,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAJvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAKc,MAAM;2BAAC,cAAc;;;MCkBvB,WAAW,CAAA;IAyCd,SAAS,CAAC,KAAc,EAAE,KAAc,EAAA;AAC9C,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,SAAS;AAC3B,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,QAAQ;AAC1B,QAAA,OAAO,SAAS;IAClB;AAsFA,IAAA,WAAA,CACU,IAAiB,EACjB,cAA8B,EAC9B,aAAmC,EACnC,QAAyB,EAAA;QAHzB,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,QAAQ,GAAR,QAAQ;AAtIV,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,gBAAgB,EAAE;AAEzB,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAU,KAAK,4DAAC;AACjD,QAAA,IAAA,CAAA,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAE3E,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,eAAe,CAAiB,IAAI,CAAC;AAC7D,QAAA,IAAA,CAAA,yBAAyB,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC;AACpE,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,eAAe,CAA6B,IAAI,CAAC;AAC1E,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC;AAE7D,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAU,KAAK,6DAAC;AAC1C,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAgB,IAAI,8DAAC;;AAGhD,QAAA,IAAA,CAAA,OAAO,GAAG;AACzB,YAAA,kBAAkB,EAAE,MAAM,CAAgB,IAAI,CAAC;AAC/C,YAAA,WAAW,EAAE,MAAM,CAAgB,IAAI,CAAC;AACxC,YAAA,WAAW,EAAE,MAAM,CAAgB,IAAI,CAAC;SACzC;;QAGQ,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAG7D,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,OAAO;AAC7C,YAAA,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;AAC5F,YAAA,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;AAC3E,YAAA,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;AAC5E,SAAA,CAAC,+DAAC;;AAGM,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC3C,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE;AACzC,YAAA,QACE,MAAM,CAAC,cAAc,KAAK,SAAS;gBACnC,MAAM,CAAC,WAAW,KAAK,SAAS;AAChC,gBAAA,MAAM,CAAC,WAAW,KAAK,SAAS;AAEpC,QAAA,CAAC,+DAAC;QAQM,IAAA,CAAA,UAAU,GAAG,EAAE;;;QAId,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;QAGzD,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAG3D,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,KAAA,GAAiB,KAAK,KAAU;AACxD,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC;AAC/C,QAAA,CAAC;;AAGQ,QAAA,IAAA,CAAA,UAAU,GAAG,MAAuB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK;;AAGnF,QAAA,IAAA,CAAA,MAAM,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,SAAS,CAAC;;AAGxE,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAc,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,UAAU,CAAC,IAAI,MAAM;;AAG9E,QAAA,IAAA,CAAA,eAAe,GAAG,MACzB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,mBAAmB,CAAC,IAAI,EAAE;;AAGnD,QAAA,IAAA,CAAA,KAAK,GAAG,MACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,OAAO,CAAC,IAAI,gBAAgB;;AAGrD,QAAA,IAAA,CAAA,KAAK,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,OAAO,CAAC;;AAGrE,QAAA,IAAA,CAAA,WAAW,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,aAAa,CAAC;;AAGjF,QAAA,IAAA,CAAA,cAAc,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,iBAAiB,CAAC;;AAGxF,QAAA,IAAA,CAAA,SAAS,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,YAAY,CAAC;;AAG9E,QAAA,IAAA,CAAA,WAAW,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,cAAc,CAAC;;AAGlF,QAAA,IAAA,CAAA,YAAY,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,eAAe,CAAC;;AAGpF,QAAA,IAAA,CAAA,MAAM,GAAG,MAAc,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,EAAE;;AAG9D,QAAA,IAAA,CAAA,cAAc,GAAG,CAAC,IAAgC,KAAU;AACnE,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;AACpC,QAAA,CAAC;;QAGQ,IAAA,CAAA,WAAW,GAAG,MAAkC,IAAI,CAAC,kBAAkB,CAAC,KAAK;;AAG7E,QAAA,IAAA,CAAA,qBAAqB,GAAG,CAAC,KAAyB,KAAU;YACnE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;AACpD,QAAA,CAAC;;QAGQ,IAAA,CAAA,kBAAkB,GAAG,MAAqB,IAAI,CAAC,yBAAyB,CAAC,KAAK;;AAG9E,QAAA,IAAA,CAAA,cAAc,GAAG,CAAC,IAAmB,KAAU;AACtD,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;AACpC,QAAA,CAAC;;QAGQ,IAAA,CAAA,WAAW,GAAG,MAAqB,IAAI,CAAC,kBAAkB,CAAC,KAAK;;QAGhE,IAAA,CAAA,iBAAiB,GAAG,MAAoB;AAC/C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK;AAC1C,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK;YACzC,OAAO,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI;AACrD,QAAA,CAAC;AAQC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,EAAE;;;AAIzD,QAAA,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE;IACjC;AAEA;;AAEG;IACK,YAAY,GAAA;AAClB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;QAEtC,IAAI,CAAC,WAAW,EAAE;;AAEhB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC1B,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB;;AAGA,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;;;;;;;;;;;;;;;;;IAmBnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA;;AAEG;AACH,IAAA,SAAS,CAAC,GAAW,EAAA;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE;YAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;AACnD,YAAA,QACE,YAAY;gBACZ,CAAC,aAAa,EAAE,uBAAuB,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KACtE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACxB;QAEL;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AACzD,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;AACH,IAAA,oBAAoB,CAAC,GAAW,EAAA;AAC9B,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;AACvC,YAAA,OAAO,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;QACxC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC;AAChE,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;;;;;;;AAQG;IACH,qBAAqB,GAAA;AACnB,QAAA,aAAa,CAAC;AACZ,YAAA,IAAI,CAAC,yBAAyB;AAC9B,YAAA,IAAI,CAAC,iBAAiB;AACtB,YAAA,IAAI,CAAC,kBAAkB;AACvB,YAAA,IAAI,CAAC,kBAAkB;SACxB;AACE,aAAA,IAAI,CACH,MAAM,CACJ,CAAC,CAAC,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,KACrD,CAAC,CAAC,cAAc,IAAI,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAC5E,EACD,IAAI,CAAC,CAAC,CAAC,EACP,SAAS,CAAC,MAAK;;AAEb,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;YACtC,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;AACvD,YAAA,IAAI,cAAc,IAAI,CAAC,WAAW,EAAE;AAClC,gBAAA,MAAM,YAAY,GAA0B;AAC1C,oBAAA,YAAY,EAAE,IAAI,CAAC,yBAAyB,CAAC,KAAM;AACnD,oBAAA,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE;iBAC/B;gBAED,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAChD;AAEA,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;AAClB,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,CAAC,CAAC,OAAO,KAAI;YACrB,IAAI,CAAC,OAAO,EAAE;gBACZ;YACF;;AAGA,YAAA,OAAO,IAAI,CAAC,YAAY,EAAE;AAC5B,QAAA,CAAC,CAAC;IACN;AAEA;;AAEG;IAEH,MAAM,cAAc,CAAC,KAA4B,EAAA;AAC/C,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI;YACF,MAAM,MAAM,GACV,MAAM,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;YAE3C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE;AACjC,gBAAA,MAAM,UAAU,GAAG;AACjB,oBAAA,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;AACtC,oBAAA,aAAa,EAAE,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE;iBAClE;gBAED,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC;AAC9C,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,gBAAA,OAAO,IAAI;YACb;iBAAO;gBACL,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;AACrD,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;AACjC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC;AAEzC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;gBAChC,IAAI,CAAC,SAAS,EAAE;AAChB,gBAAA,OAAO,KAAK;YACd;QACF;QAAE,OAAO,KAAU,EAAE;YACnB,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AACpD,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;AACjC,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC;AAEzC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;YAChC,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,OAAO,KAAK;QACd;gBAAU;AACR,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QACnC;IACF;AAEA;;AAEG;AACH,IAAA,mBAAmB,CAAC,OAA+B,EAAA;QACjD,IAAI,CAAC,OAAO,EAAE;;AAEZ,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC;YAC3C;QACF;AAEA,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY;QAClC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC;YAC3C;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;AAC9B,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC;AACtC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;YAChC;QACF;;AAGA,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;;QAG/B,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;AAEG;IACH,MAAM,KAAK,CAAC,KAAmB,EAAA;AAC7B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE;gBAC3C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC;AAC9C,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,gBAAA,OAAO,IAAI;YACb;iBAAO;gBACL,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;AACrD,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;AACjC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC;AACzC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,gBAAA,OAAO,KAAK;YACd;QACF;QAAE,OAAO,KAAK,EAAE;YACd,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AACpD,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;AACjC,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC;AACzC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,YAAA,OAAO,KAAK;QACd;gBAAU;AACR,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;QACnC;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;QACxC,IAAI,CAAC,YAAY,EAAE;AACjB;;;;;;;AAOG;YACH,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;AACxD,YAAA,IAAI,MAAM,EAAE,OAAO,EAAE;gBACnB,IAAI,CAAC,SAAS,EAAE;AAChB,gBAAA,OAAO,IAAI;YACb;iBAAO;AACL,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC;AACpC,gBAAA,OAAO,KAAK;YACd;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC;AACpC,YAAA,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;AACpC,YAAA,OAAO,KAAK;QACd;IACF;;AAGQ,IAAA,MAAM,uBAAuB,CACnC,KAA4B,EAC5B,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACxC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC;IAC1E;AAEQ,IAAA,eAAe,CACrB,KAAoB,EACpB,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC;IACxD;AAEQ,IAAA,sBAAsB,CAC5B,KAAsB,EACtB,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC;IAC1D;AAEQ,IAAA,gBAAgB,CAAC,YAAoB,EAAE,UAAU,GAAG,KAAK,EAAA;;AAE/D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC;;QAGjE,IAAI,WAAW,EAAE;YACf,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,OAAA,EAAU,WAAW,CAAA,CAAE,CAAC;QACjE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC;IAC5F;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE;AAC/B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAC3C,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC;AACxE,YAAA,OAAO,OAAO;QAChB;QAEA,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC;IACjD;;IAGQ,UAAU,CAAC,OAAmB,EAAE,UAAuC,EAAA;QAC7E,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,EAAE;AACnD,YAAA,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;QAChC;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC;;QAG7D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC;AAC7D,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC;QAE5E,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;QACnD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC;QACzD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,eAAe,CAAC;QACjE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC;QACvD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC;QACrD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,iBAAiB,CAAC;;AAGrE,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AAEQ,IAAA,cAAc,CAAC,WAA2B,EAAA;QAChD,IAAI,KAAK,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE;QAC7C,IAAI,KAAK,EAAE;YACT,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC;QAC7C;aAAO;AACL,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;;AAGG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;AAClC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC;IACjD;AAEQ,IAAA,mBAAmB,CAAC,KAAU,EAAA;AACpC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,sBAAsB;;;AAIzC,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK;AAExC,QAAA,MAAM,OAAO,GACX,WAAW,CAAC,OAAO;AACnB,YAAA,WAAW,CAAC,SAAS;AACrB,YAAA,KAAK,CAAC,OAAO;AACb,YAAA,+CAA+C;AAEjD,QAAA,OAAO,OAAO;IAChB;+GAtiBW,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAF,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAG,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCvBY,eAAe,CAAA;AAS1B,IAAA,WAAA,CAAoB,SAAuB,EAAA;QAAvB,IAAA,CAAA,SAAS,GAAT,SAAS;QARrB,IAAA,CAAA,EAAE,GAAG,IAAI,UAAU,CAAC;YAC1B,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;AACf,SAAA,CAAC;IAE4C;AAE9C,IAAA,OAAO,CAAC,QAAgB,EAAA;QACtB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AACvC,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI;;YAEF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrC,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;QACrD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;YAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAC3C,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CACrD;QACH;IACF;+GA1BW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAH,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCcY,WAAW,CAAA;IA8GtB,gBAAgB,GAAA;AACd,QAAA,OAAO,yCAAyC;IAClD;AAEA,IAAA,WAAA,GAAA;;AAhHQ,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC;AAClC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAC5C,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5D,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AACzC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ;;AAIvD;;AAEG;AACI,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAEjC;;AAEG;AACI,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,KAAK,gEAAC;AAE3C;;AAEG;AACI,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAEnC;;AAEG;AACK,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAgB,IAAI,6DAAC;AAEvD;;AAEG;AACI,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACjC,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;gBACrB,OAAO,CAAC,CAAC;YACX;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,CAAC;AAEnC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC3C,YAAA,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB,YAAA,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,gBAAA,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,UAAU,CAAC;YACpE;;YAGA,MAAM,iBAAiB,GAAG;AACvB,iBAAA,KAAK,CAAC,aAAa,GAAG,CAAC;AACvB,iBAAA,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC;YAE1C,OAAO,iBAAiB,CAAC,MAAM;AACjC,QAAA,CAAC,uDAAC;;AAIF;;AAEG;;;;;;;;;;;;;;;;;;AAoBI,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAY,EAAE,oDAAC;AAEvC;;AAEG;AACI,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AACzC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;YACnC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;AACxE,YAAA,OAAO,UAAU,EAAE,eAAe,KAAK,IAAI;AAC7C,QAAA,CAAC,+DAAC;;AAGK,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAwB,IAAI,yDAAC;;AAGnD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAU,KAAK,wDAAC;AACrC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAU,KAAK,uDAAC;AACpC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAa,UAAU,sDAAC;;;AAI3C,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,uDAAC;QAE9E,IAAA,CAAA,cAAc,GAA6B,EAAE;QAC7C,IAAA,CAAA,eAAe,GAAG,EAAE;AAOlB,QAAA,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC;;AAGvC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAC7C;IACF;;AAIA;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE;AACvC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;;QAGvC,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC;YACpD;QACF;IACF;AAEA;;AAEG;IACH,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;IACnD;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;AAEA;;AAEG;IACH,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;IACtC;AAEA;;AAEG;IACH,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC;AAEA;;AAEG;IACH,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IACvC;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,YAAqB,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,SAAiB,EAAA;AAClC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;AAEA;;AAEG;IACH,oBAAoB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,iBAAiB,EAAE;IACjC;;AAIA;;AAEG;AACI,IAAA,eAAe,CAAC,SAAkB,EAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;QACxC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;QACtC;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAE5B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;AACjF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB;AAEA;;AAEG;AACI,IAAA,WAAW,CAAC,OAAuB,EAAA;AACxC,QAAA,MAAM,CAAC,IAAI,CACT,gCAAgC,EAChC,OAAO,CAAC,WAAW,EACnB,WAAW,EACX,OAAO,CAAC,QAAQ,CAAC,MAAM,CACxB;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;;QAE/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KACrB,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC;AACxB,cAAE;AACE,gBAAA,GAAG,CAAC;gBACJ,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C;AACH,cAAE,CAAC,CACN,CACF;AACD,QAAA,MAAM,CAAC,IAAI,CAAC,uDAAuD,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;IAC9F;AAEA;;AAEG;IACI,gBAAgB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE;IAC7B;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA;;AAEG;AACI,IAAA,UAAU,CAAC,OAAgB,EAAA;AAChC,QAAA,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE;;AAGxD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC;IACvD;AAEA;;AAEG;IACI,MAAM,eAAe,CAAC,SAAiB,EAAA;AAC5C,QAAA,MAAM,CAAC,IAAI,CAAC,qCAAqC,SAAS,CAAA,CAAE,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,CAAC;AAC3E,YAAA,MAAM,cAAc,GAAG,MAAM,IAAI,EAAE;YACnC,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC;YAEpF,IAAI,eAAe,EAAE;AACnB,gBAAA,eAAe,CAAC,QAAQ,GAAG,cAAc;AACzC,gBAAA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;YACnC;iBAAO;AACL,gBAAA,MAAM,SAAS,GACb,cAAc,CAAC,MAAM,GAAG;AACtB,sBAAE,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI;AACjE,sBAAE,IAAI,IAAI,EAAE;gBAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;gBACxC,IAAI,CAAC,MAAM,EAAE;AACX,oBAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;gBACtC;AAEA,gBAAA,MAAM,UAAU,GAAmB;AACjC,oBAAA,WAAW,EAAE,SAAS;AACtB,oBAAA,eAAe,EAAE,SAAS;AAC1B,oBAAA,KAAK,EAAE,uBAAuB;AAC9B,oBAAA,QAAQ,EAAE,cAAc;oBACxB,MAAM;iBACP;AACD,gBAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAC9B;YACA,IAAI,CAAC,QAAQ,EAAE;QACjB;gBAAU;AACR,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9B;IACF;;AAIA;;AAEG;AACI,IAAA,MAAM,WAAW,CAAC,IAAY,EAAE,YAAoB,IAAI,EAAA;AAC7D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,QAAA,IAAI,CAAC,WAAW;YAAE;AAElB,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,SAAS,EAAE;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC;YACxC;QACF;AAEA,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE;QAE3C,IAAI,CAAC,UAAU,CAAC;AACd,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;AACtB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAE3B,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC;AAElD,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;;AAEtB,gBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAC5B;iBAAO;;gBAEL,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAExC,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,cAAc,IAAI,QAAQ,EAAE;oBACvD,IAAI,CAAC,UAAU,CAAC;AACd,wBAAA,MAAM,EAAE,OAAO;AACf,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,SAAS,EAAE,IAAI;AACf,wBAAA,SAAS,EAAE,KAAK;AAChB,wBAAA,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC7B,qBAAA,CAAC;gBACJ;YACF;QACF;gBAAU;AACR,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,cAAc,EAAE;AAC3C,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B;QACF;IACF;AAEA;;AAEG;IACK,iBAAiB,GAAA;AACvB,QAAA,OAAO,MAAM,CAAC,UAAU,EAAE;IAC5B;AAEA;;;;;AAKG;AAEK,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AACvC,QAAA,MAAM,OAAO,GAAgB;AAC3B,YAAA,KAAK,EAAE,QAAQ;YACf,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,EAAE;AACxD,YAAA,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE;SAC/B;;AAGD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW,EAAE;YACrC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW;AACvD,YAAA,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC;QAChF;aAAO;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC;QAC9C;AAEA,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;IACK,MAAM,GAAG,CAAC,OAAoB,EAAA;AACpC,QAAA,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC;AAEnD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE;AAE3C,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAElE,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,cAAc,EAAE;AAC3C,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B;YAEA,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;AACtC,gBAAA,IACE,IAAI,CAAC,aAAa,EAAE,KAAK,cAAc;oBACvC,IAAI,CAAC,aAAa,EAAE;AACpB,oBAAA,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW,EAClC;;AAEA,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;AACpC,oBAAA,IAAI,OAAO;wBAAE,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE;;AAEnD,oBAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE;gBAC3C;gBACA,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzD;iBAAO;AACL,gBAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;YAChC;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC;AAEjC,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,cAAc,EAAE;AAC3C,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAC7B;AAEA,YAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;QAChC;IACF;IAEQ,MAAM,MAAM,CAAC,OAAoB,EAAA;AACvC,QAAA,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC;AAEjD,QAAA,MAAM,gBAAgB,GAAY;AAChC,YAAA,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC5B,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,IAAI,IAAI,EAAE;AACrB,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,eAAe,EAAE,KAAK;SACvB;AAED,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE;AAC3C,QAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAQ;QAC3C,IAAI,UAAU,GAAG,KAAK;QAEtB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AACnD,YAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,gBAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,cAAc;oBAAE;gBAE7C,IAAI,CAAC,UAAU,EAAE;oBACf,UAAU,GAAG,IAAI;AACjB,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAE3B,oBAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;;AAGjC,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;oBACpC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,EAAE;AACxD,wBAAA,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;AACvC,wBAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE;oBAC3C;gBACF;gBAEA,IAAI,CAAC,KAAK,CAAC,OAAO;oBAAE;gBAEpB,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO;AACrD,gBAAA,gBAAgB,CAAC,IAAI,GAAG,OAAO;gBAE/B,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC;gBAElD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KACT,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAC3E,CACF;YACH,CAAC;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,cAAc;oBAAE;gBAE7C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAChF;gBAED,eAAe,CAAC,IAAI,EAAE;gBACtB,eAAe,CAAC,QAAQ,EAAE;YAC5B,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,cAAc;oBAAE;AAE7C,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE;gBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAEnD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KACT,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC;AACxB,sBAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI;AACzD,sBAAE,CAAC,CACN,CACF;gBAED,eAAe,CAAC,IAAI,EAAE;gBACtB,eAAe,CAAC,QAAQ,EAAE;YAC5B,CAAC;AACF,SAAA,CAAC;AAEF,QAAA,MAAM,aAAa,CAAC,eAAe,CAAC;IACtC;+GAnhBW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCHY,mBAAmB,CAAA;AAuB9B,IAAA,WAAA,CACU,WAAwB,EACxB,aAAmC,EACnC,WAAwB,EAAA;QAFxB,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,WAAW,GAAX,WAAW;AAzBrB,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;AACxC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW;AAC1C,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB;;QAG3C,IAAA,CAAA,YAAY,GAAG,YAAY;AAEpB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAc,MAAK;YACvD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,WAAW,IAAI,KAAK;AACzD,QAAA,CAAC,uDAAC;AAEF,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;;AAExB,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS;AACzC,QAAA,CAAC,qDAAC;AAEF,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAkC;AAC3D,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AAAE,gBAAA,OAAO,QAAQ;AACtC,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS;AAAE,gBAAA,OAAO,QAAQ;AACrD,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAgC;AACxE,QAAA,CAAC,2DAAC;IAMC;AAEH,IAAA,QAAQ,KAAU;IAElB,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;IAC/B;+GAjCW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAI,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAP,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAQ,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChBhC,4nCAkCA,EAAA,MAAA,EAAA,CAAA,inEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtBY,YAAY,4HAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjC,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,4nCAAA,EAAA,MAAA,EAAA,CAAA,inEAAA,CAAA,EAAA;;;AEZxC,MAAM,kBAAkB,GAAG;IAChC,sBAAsB;IACtB,mBAAmB;IACnB,0BAA0B;CAC3B;;MCSY,kBAAkB,CAAA;AAO7B,IAAA,WAAA,CAAmB,WAAwB,EAAA;QAAxB,IAAA,CAAA,WAAW,GAAX,WAAW;;QAL9B,IAAA,CAAA,IAAI,GAAG,MAAM,EAAU;;QAGd,IAAA,CAAA,YAAY,GAAG,YAAY;IAEU;AAE9C,IAAA,MAAM,CAAC,IAAY,EAAA;AACjB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACtB;IACF;+GAbW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECb/B,ysBAsBA,EAAA,MAAA,EAAA,CAAA,uqCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDbY,YAAY,8BAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjC,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,ysBAAA,EAAA,MAAA,EAAA,CAAA,uqCAAA,CAAA,EAAA;;;MEYlC,2BAA2B,CAAA;AARxC,IAAA,WAAA,GAAA;AASW,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,EAAC,YAAyC,EAAC;AAC7D,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAyB,eAAe,CAAC;AAChE,IAAA;+GAHY,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBxC,iyBA0BA,EAAA,MAAA,EAAA,CAAA,6SAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDVY,YAAY,8BAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKjC,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBARvC,SAAS;+BACE,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,eAAA,EAG5B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,iyBAAA,EAAA,MAAA,EAAA,CAAA,6SAAA,CAAA,EAAA;;;MEIpC,oBAAoB,CAAA;IAG/B,WAAA,CACS,SAA6C,EACpB,IAAqB,EAAA;QAD9C,IAAA,CAAA,SAAS,GAAT,SAAS;QACgB,IAAA,CAAA,IAAI,GAAJ,IAAI;AAEpC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY;;AAE9B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,gBAAgB;AACjE,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,SAAS;IAC1E;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5B;IAEA,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AACnC,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACzC;IACF;AAvBW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,gDAKrB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AALd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,4ECvBjC,++BAiBM,EAAA,MAAA,EAAA,CAAA,kgCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,oBAAoB,oxBAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI9C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,++BAAA,EAAA,MAAA,EAAA,CAAA,kgCAAA,CAAA,EAAA;;0BASvD,MAAM;2BAAC,eAAe;;;AEb3B,MAAM,sBAAsB,GAAkB;AAC5C,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,YAAY,EAAE,KAAK;;;CAGpB;MAGY,aAAa,CAAA;AAD1B,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;AAoE5C,IAAA;AAlEC;;;AAGG;AACH,IAAA,IAAI,CACF,SAA2B,EAC3B,OAAA,GAA4B,EAAE,EAAA;QAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAU,SAAS,EAAE;AAC/C,YAAA,GAAG,sBAAsB;AACzB,YAAA,GAAG,OAAO;AACW,SAAA,CAAC;AACxB,QAAA,OAAO,GAAG,CAAC,WAAW,EAAE;IAC1B;AAEA;;;AAGG;AACH,IAAA,OAAO,CACL,IAIC,EAAA;AAED,QAAA,OAAO,IAAI,CAAC,IAAI,CACd,2BAA2B,EAC3B;AACE,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS;AAC1C,gBAAA,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ;AACvC,gBAAA,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,SAAS;AACxD,gBAAA,GAAG,IAAI;AACR,aAAA;AACF,SAAA,CACF;IACH;AAEA;;AAEG;AACH,IAAA,KAAK,CAAC,IAKL,EAAA;QACC,OAAO,IAAI,CAAC,OAAO,CAAC;AAClB,YAAA,GAAG,IAAI;AACP,YAAA,WAAW,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;YAChC,UAAU,EAAE,EAAE;AACf,SAAA,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,SAAS,CAAC,IAAqB,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAuD,oBAAoB,EAAE;AAC3F,YAAA,KAAK,EAAE,OAAO;YACd,IAAI;AACL,SAAA,CAAC,CAAC,IAAI,CAACC,KAAG,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC;IACxC;+GApEW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA,CAAA;;4FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCRrB,oBAAoB,CAAA;AA6B/B,IAAA,WAAA,CACU,aAA4B,EAC5B,WAAwB,EACzB,WAAwB,EAAA;QAFvB,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,WAAW,GAAX,WAAW;QACZ,IAAA,CAAA,WAAW,GAAX,WAAW;;AA9BpB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAmB,EAAE,oDAAC;AACtC,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;;AAErB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,qDAAC;AACxB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,KAAK,2DAAC;AAC9B,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,KAAK,yDAAC;AAC5B,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAgB,IAAI,+DAAC;AAChD,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAgB,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;;;QAI7C,IAAA,CAAA,eAAe,GAAG,MAAM,EAAkB;QAC1C,IAAA,CAAA,cAAc,GAAG,MAAM,EAAU;QACjC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QACvB,IAAA,CAAA,QAAQ,GAAG,MAAM,EAAQ;QACzB,IAAA,CAAA,OAAO,GAAG,MAAM,EAAQ;QACxB,IAAA,CAAA,cAAc,GAAG,MAAM,EAA2C;QAClE,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;;AAG1B,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;;AAE1B,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE;AACpC,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;AACzC,QAAA,CAAC,uDAAC;AAEF,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;IAKzB;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY;IACnD;;AAGQ,IAAA,aAAa,CAAC,QAA0B,EAAA;AAC9C,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;AACxE,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACjC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAEtC,QAAA,MAAM,MAAM,GAAuB;AACjC,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;AAChC,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;AACpC,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;AACpC,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;SACjC;;;AAID,QAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC;AACtE,QAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA0B;AAC3D,QAAA,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAY,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;;AAG7D,QAAA,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CACxF;AAED,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YACjC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YACrD,MAAM,eAAe,GAAG,IAAI,IAAI,CAC9B,WAAW,CAAC,WAAW,EAAE,EACzB,WAAW,CAAC,QAAQ,EAAE,EACtB,WAAW,CAAC,OAAO,EAAE,CACtB;YAED,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE;gBACjD,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;iBAAO,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,SAAS,CAAC,OAAO,EAAE,EAAE;gBAC5D,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;iBAAO,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE;gBACzD,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;iBAAO;gBACL,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD;AAEA,IAAA,cAAc,CAAC,OAAuB,EAAA;AACpC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;IAEA,WAAW,CAAC,KAAY,EAAE,OAAuB,EAAA;QAC/C,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC;AACF,aAAA,SAAS,CAAC;AACT,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,OAAO,EAAE,0CAA0C;YACnD,YAAY,EAAE,OAAO,CAAC,KAAK;AAC3B,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,WAAW,EAAE,QAAQ;SACtB;AACA,aAAA,SAAS,CAAC,CAAC,QAAQ,KAAI;YACtB,IACE,QAAQ,KAAK,IAAI;AACjB,gBAAA,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;gBACtB,QAAQ,KAAK,OAAO,CAAC,KAAK;gBAC1B,OAAO,CAAC,WAAW,EACnB;gBACA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACzF;AACF,QAAA,CAAC,CAAC;IACN;IAEA,aAAa,CAAC,KAAY,EAAE,SAAiB,EAAA;AAC3C,QAAA,IAAI,CAAC,SAAS;YAAE;QAChB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,KAAK,EAAE,gBAAgB;AACvB,YAAA,OAAO,EAAE,kFAAkF;AAC3F,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,kBAAkB,EAAE,MAAM;SAC3B;AACA,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;YACvB,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;YACrC;AACF,QAAA,CAAC,CAAC;IACN;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;AAChD,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;AAChD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,SAAS;AACf,SAAA,CAAC;IACJ;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAqB;AAC3C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;AACnC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;AACzC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;;AAGzC,QAAA,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY;QAC5D,IACE,YAAY,GAAG,GAAG;YAClB,IAAI,CAAC,eAAe,EAAE;YACtB,CAAC,IAAI,CAAC,aAAa,EAAE;AACrB,YAAA,CAAC,IAAI,CAAC,SAAS,EAAE,EACjB;AACA,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QACtB;IACF;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,OAAO,EAAE,iFAAiF;AAC1F,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;SAC3B;AACA,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;YACvB,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;YACvB;AACF,QAAA,CAAC,CAAC;IACN;+GArMW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAL,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChBjC,i8GA4FA,EAAA,MAAA,EAAA,CAAA,ihKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhFY,YAAY,8BAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjC,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,i8GAAA,EAAA,MAAA,EAAA,CAAA,ihKAAA,CAAA,EAAA;;;AE0B/C,MAAM,gBAAgB,GAAG,wBAAwB;AAEjD,MAAM,gBAAgB,GAA4B;IAChD,kBAAkB,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;AACzD,IAAA,UAAU,EAAE;AACV,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;AACxB,KAAA;CACF;MAKY,sBAAsB,CAAA;AAQjC,IAAA,WAAA,CAAoB,IAAiB,EAAA;QAAjB,IAAA,CAAA,IAAI,GAAJ,IAAI;AAPhB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;AAGjC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAA0B,gBAAgB,qDAAC;AAC9D,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;;QAI3C,MAAM,CACJ,MAAK;;YAEH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACzC,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAED,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE;AACxC,YAAA,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC;AACpC,QAAA,CAAC,CAAC;IACJ;IAEQ,aAAa,GAAA;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AACxC,QAAA,OAAO,MAAM,GAAG,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,GAAG,gBAAgB;IACpE;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,YAAyC,EAAA;QAC1D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;AAC5B,YAAA,GAAG,CAAC;AACJ,YAAA,kBAAkB,EAAE;AAClB,gBAAA,YAAY,EAAE,YAAY,CAAC,YAAY,IAAI,EAAE;AAC7C,gBAAA,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,EAAE;gBAC3C,eAAe,EAAE,YAAY,CAAC,eAAe,IAAI,CAAC,CAAC,kBAAkB,CAAC,eAAe;AACtF,aAAA;AACD,YAAA,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AAC7C,SAAA,CAAC,CAAC;IACL;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,UAAuC,EAAA;QACtD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;AAC5B,YAAA,GAAG,CAAC;YACJ,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE;AAC9C,YAAA,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AAC7C,SAAA,CAAC,CAAC;IACL;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACjB,YAAA,GAAG,gBAAgB;AACnB,YAAA,IAAI,EAAE,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AAC5D,SAAA,CAAC;IACJ;IAEA,MAAM,sBAAsB,CAAC,IAAwB,EAAA;AACnD,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,kBAAkB;YAEnD,IAAI,GAAG,GAA2C,IAAI;AAEtD,YAAA,IAAI,OAAO,EAAE,eAAe,EAAE;;AAE5B,gBAAA,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CACvB,CAAA,cAAA,CAAgB,EAChB,IAAI,EACJ,IAAI,CACL;YACH;iBAAO;;AAEL,gBAAA,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC;YAC1D;YAEA,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE;gBAC5B,MAAM,IAAI,CAAC,kBAAkB,CAAC;oBAC5B,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,YAAY,IAAI,EAAE;oBAClE,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,EAAE,WAAW,IAAI,EAAE;oBAC/D,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,OAAO,EAAE,eAAe;AACtE,iBAAA,CAAC;YACJ;QACF;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC;QACvD;IACF;IAEA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI;AACrC,aAAA,IAAI,CAAC,CAAC,GAAG,KAAI;YACZ,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE;gBAC5B,IAAI,CAAC,kBAAkB,CAAC;AACtB,oBAAA,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE;AACzC,oBAAA,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;AACvC,oBAAA,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,eAAe;AAC1C,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC;AACA,aAAA,KAAK,CAAC,CAAC,CAAC,KAAI;AACX,YAAA,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,CAAC,CAAC;AAC7D,QAAA,CAAC,CAAC;IACN;IAEA,8BAA8B,CAAC,UAAU,GAAG,KAAK,EAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AACxC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC;IAC/E;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;;YAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAQ;YAC1C,IAAI,KAAK,EAAE;gBACT,OAAO;AACL,oBAAA,GAAG,gBAAgB;AACnB,oBAAA,GAAG,KAAK;AACR,oBAAA,UAAU,EAAE;wBACV,GAAG,gBAAgB,CAAC,UAAU;AAC9B,wBAAA,IAAI,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;AAC5B,qBAAA;iBACF;YACH;QACF;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,CAAC,CAAC;QAC7D;;QAGA,OAAO;AACL,YAAA,GAAG,gBAAgB;AACnB,YAAA,UAAU,EAAE;gBACV,GAAG,gBAAgB,CAAC,UAAU;AAC/B,aAAA;SACF;IACH;AAEQ,IAAA,YAAY,CAAC,QAAiC,EAAA;AACpD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;IACjC;+GAnJW,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAb,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCnCY,YAAY,CAAA;AAYvB,IAAA,WAAA,CACE,eAAiC,EACzB,OAAyB,EACzB,eAAuC,EACvC,aAAmC,EAAA;QAFnC,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,aAAa,GAAb,aAAa;AAbf,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAY,MAAM,kDAAC;AACnC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAE/B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAA+B,aAAa,wDAAC;AACnE,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;QAE3C,IAAA,CAAA,QAAQ,GAA4B,IAAI;QACxC,IAAA,CAAA,WAAW,GAAuB,IAAI;QAQ5C,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;AAE1D;;AAEG;QACH,MAAM,CACJ,MAAK;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AAChD,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK;AAEtC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAE5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,YAAY;YACnE,IAAI,kBAAkB,EAAE;AACtB,gBAAA,IAAI,CAAC,yBAAyB,CAAC,kBAAkB,CAAC;YACpD;AACF,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;IACH;AAEA;;AAEG;IACI,cAAc,CAAC,UAAsB,EAAE,UAAoB,EAAA;AAChE,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa;AACrC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;QAEzC,MAAM,WAAW,GACf,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,YAAY,GAAG,aAAa,IAAI,IAAI,CAAC,YAAY,EAAE;QAE9F,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;AAEzC;;AAEG;AACH,QAAA,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,SAAS;AAC5C,QAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;AAElC;;AAEG;AACH,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC;IACtC;AAEO,IAAA,yBAAyB,CAAC,UAAkB,EAAA;AACjD,QAAA,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,SAAS;YAAE;QAE7C,IAAI,KAAK,GAAG,UAAU;AAEtB,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,YAAY;AACnD,YAAA,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QACvE;AAEA,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW;AACtC,QAAA,IAAI,CAAC,aAAa;YAAE;QAEpB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAE9C,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;AACtD,QAAA,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzE,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC;QAC1D,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,SAAS,CAAC;QAEhE,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;AACzD,QAAA,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9E;AAEQ,IAAA,QAAQ,CAAC,GAAW,EAAA;QAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AACrC,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,GAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE;IAC3B;AAEQ,IAAA,gBAAgB,CAAC,GAAW,EAAA;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AACrC,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAEhD,QAAA,MAAM,SAAS,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG;QAE3D,OAAO,SAAS,GAAG,GAAG,GAAG,SAAS,GAAG,SAAS;IAChD;AAEA,IAAA,QAAQ,CAAC,IAAe,EAAA;QACtB,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxD;AAEQ,IAAA,iBAAiB,CAAC,IAAe,EAAA;QACvC,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;YACnB,IAAI,CAAC,eAAe,EAAE;QACxB;aAAO;AACL,YAAA,MAAM,YAAY,GAAG,IAAI,KAAK,MAAM,GAAG,YAAY,GAAG,aAAa;AACnE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;AACnC,YAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;QACvC;IACF;IAEQ,eAAe,GAAA;;QAErB,IAAI,CAAC,yBAAyB,EAAE;;AAGhC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAK;YACxC,IAAI,CAAC,yBAAyB,EAAE;AAClC,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;AAC9C,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;AACzC,SAAA,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;AACnC,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;AACzC,SAAA,CAAC;IACJ;IAEQ,yBAAyB,GAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;QAClC,MAAM,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,aAAa;;AAGtD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,QAAQ,EAAE;AACpC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/B,YAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;QACnC;IACF;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC1B,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;;QAGrC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC;QAErE,MAAM,YAAY,GAAG,CAAC,EAAe,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE3F,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI;;AAGzD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,MAAM;AAC1F,YAAA,OAAO,IAAI;;AAGb,QAAA,IACE,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM;AAC7C,YAAA,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM;AAE7C,YAAA,OAAO,IAAI;AAEb,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,kBAAkB,CAAC,KAAmC,EAAA;QAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;;AAG3D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC;YAC1D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC;YACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;QACjD;;QAGA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,aAAa,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,YAAY,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC;IACjD;AAEQ,IAAA,oBAAoB,CAAC,OAAe,EAAA;QAC1C,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE;QAEvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;AAE3D,QAAA,MAAM,cAAc,GAAG;YACrB,kBAAkB;YAClB,eAAe;YACf,gBAAgB;YAChB,iBAAiB;YACjB,mBAAmB;YACnB,iBAAiB;YACjB,gBAAgB;SACjB;AAED,QAAA,MAAM,KAAK,GAAG,CAAC,EAAe,KAAI;AAChC,YAAA,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACnE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAC;AACnD,QAAA,CAAC;AAED,QAAA,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;QACvB,KAAK,CAAC,gBAAgB,CAAC;IACzB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACtB;IACF;IAEO,iBAAiB,CAAC,OAAoB,EAAE,MAA2B,EAAA;AACxE,QAAA,IAAI,CAAC,MAAM;YAAE;QAEb,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,YAAY;AAEnD,QAAA,MAAM,UAAU,GAAG,CAAC,KAAyB,EAAE,QAAgB,KAAI;AACjE,YAAA,IAAI,CAAC,KAAK;gBAAE;YAEZ,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACnD,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YAE3E,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,EAAE,KAAK,CAAC;AACjD,YAAA,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAA,CAAE,EAAE,KAAK,CAAC;AAC9E,QAAA,CAAC;AAED,QAAA,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC;;AAGjD,QAAA,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;AACjD,QAAA,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC;;AAGrD,QAAA,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC;AAC/C,QAAA,UAAU,CAAC,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;AAC1D,QAAA,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC;AACnD,QAAA,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;;AAGhD,QAAA,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC;;AAGjD,QAAA,UAAU,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;AACrD,QAAA,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC;;AAGnD,QAAA,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC;AACpD,QAAA,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,CAAC;;AAGlD,QAAA,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC;AACjD,QAAA,UAAU,CAAC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;AACxD,QAAA,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC;;AAGlD,QAAA,UAAU,CAAC,MAAM,CAAC,oBAAoB,EAAE,iBAAiB,CAAC;IAC5D;+GAzRW,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAY,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAV,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCEY,mBAAmB,CAAA;AAyB9B,IAAA,WAAA,CACU,aAAmC,EACpC,YAA0B,EAC1B,WAAwB,EACxB,WAAwB,EAAA;QAHvB,IAAA,CAAA,aAAa,GAAb,aAAa;QACd,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,WAAW,GAAX,WAAW;;QA3BpB,IAAA,CAAA,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAO;AAC3B,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAC,KAAK,6DAAC;;QAGhC,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAAQ;QACjC,IAAA,CAAA,oBAAoB,GAAG,MAAM,EAAQ;QACrC,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;;QAGjB,IAAA,CAAA,YAAY,GAAG,YAAY;AAEpB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAc,MAAK;YACvD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,WAAW,IAAI,KAAK;AACzD,QAAA,CAAC,uDAAC;AAEK,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAE3B,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAChD,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CACxB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,EAC3F,EAAE,YAAY,EAAE,KAAK,EAAE,CACxB;IAOE;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY;IACnD;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;;IAE/B;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE;IAClC;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAC9B;IAEA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE;IACxC;+GApDW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAN,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAiB,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBhC,muDA+CA,EAAA,MAAA,EAAA,CAAA,oyCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/BY,YAAY,8BAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjC,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,muDAAA,EAAA,MAAA,EAAA,CAAA,oyCAAA,CAAA,EAAA;;;MEFlC,kBAAkB,CAAA;AAQ7B,IAAA,WAAA,CAAoB,WAAwB,EAAA;QAAxB,IAAA,CAAA,WAAW,GAAX,WAAW;QAPxB,IAAA,CAAA,aAAa,GAAG,EAAE;QAClB,IAAA,CAAA,aAAa,GAAG,EAAE;QAClB,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,UAAU,GAAG,KAAK;QAChB,IAAA,CAAA,YAAY,GAAG,YAAY;AAC3B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;IAEW;IAE/C,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;IACxC;AAEA,IAAA,MAAM,aAAa,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AAEhD,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAE1B,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,gBAAA,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;gBAC1C,QAAQ,EAAE,IAAI,CAAC,aAAa;gBAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;AAC5B,aAAA,CAAC;QACJ;gBAAU;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B;IACF;+GA5BW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,0ECd/B,4xFAqFA,EAAA,MAAA,EAAA,CAAA,+qIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3EY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,q8CAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAX,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI9C,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,4xFAAA,EAAA,MAAA,EAAA,CAAA,+qIAAA,CAAA,EAAA;;;MEC/C,mBAAmB,CAAA;AARhC,IAAA,WAAA,GAAA;AASE,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,KAAK,0DAAC;AAC9B,IAAA;+GAFY,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXhC,uKAKA,EAAA,MAAA,EAAA,CAAA,qQAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDCY,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uKAAA,EAAA,MAAA,EAAA,CAAA,qQAAA,CAAA,EAAA;;;MECpC,KAAK,CAAA;AAPlB,IAAA,WAAA,GAAA;AAQW,QAAA,IAAA,CAAA,QAAQ,GAAa,EAAE,CAAC;QACxB,IAAA,CAAA,QAAQ,GAAG,KAAK;AACf,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAU,CAAC;AAMlD,IAAA;AAJC,IAAA,WAAW,CAAC,GAAW,EAAA;QACrB,IAAI,IAAI,CAAC,QAAQ;YAAE;AACnB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1B;+GARW,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAL,KAAK,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECVlB,kPASA,EAAA,MAAA,EAAA,CAAA,gbAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHY,YAAY,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIX,KAAK,EAAA,UAAA,EAAA,CAAA;kBAPjB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,kPAAA,EAAA,MAAA,EAAA,CAAA,gbAAA,CAAA,EAAA;;sBAKtB;;sBACA;;sBACA;;;MEDU,2BAA2B,CAAA;AAPxC,IAAA,WAAA,GAAA;QASW,IAAA,CAAA,YAAY,GAAW,SAAS;QAChC,IAAA,CAAA,QAAQ,GAAW,MAAM;QACzB,IAAA,CAAA,YAAY,GAAkB,IAAI;QAClC,IAAA,CAAA,QAAQ,GAAW,cAAc;;;;AAMhC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAA6B;AAC7D,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAU;AAC7C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AACjC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AAErC,QAAA,IAAA,CAAA,SAAS,GAAG;AACjB,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAChC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAChC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/B,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/B,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAChC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE;AACnC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAChC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;AACjC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/B,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/B,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;SAC/B;AA+BF,IAAA;;AA3BC,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,QAAQ,KAAK;AACX,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,YAAY;AACrB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,WAAW;AACpB,YAAA;AACE,gBAAA,OAAO,iBAAiB;;IAE9B;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,QAAQ,KAAK;AACX,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,YAAY;AACrB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,WAAW;AACpB,YAAA;AACE,gBAAA,OAAO,QAAQ;;IAErB;AAEA,IAAA,gBAAgB,CAAC,IAAY,EAAA;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,QAAQ;IACvE;+GAxDW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZxC,i4JAwIA,EAAA,MAAA,EAAA,CAAA,o0GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhIY,YAAY,8BAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAY,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjC,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,cACvB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,i4JAAA,EAAA,MAAA,EAAA,CAAA,o0GAAA,CAAA,EAAA;;sBAK5C;;sBACA;;sBACA;;sBACA;;sBACA;;sBAMA;;sBACA;;sBACA;;sBACA;;;MEfU,qBAAqB,CAAA;+GAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXlC,wtCAsCA,EAAA,MAAA,EAAA,CAAA,inCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhCc,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKb,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;+BACI,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wtCAAA,EAAA,MAAA,EAAA,CAAA,inCAAA,CAAA,EAAA;;;MEctC,uBAAuB,CAAA;AAIlC,IAAA,WAAA,CACS,WAAwB,EACxB,MAA4B,EAC3B,aAA4B,EAC5B,EAAqB,EAAA;QAHtB,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,MAAM,GAAN,MAAM;QACL,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,EAAE,GAAF,EAAE;QAPH,IAAA,CAAA,cAAc,GAAW,EAAE;QAC7B,IAAA,CAAA,QAAQ,GAAG,KAAK;AAeb,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAQ;AAC7C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAU;AAC5C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAQ;AAkB7C,QAAA,IAAA,CAAA,QAAQ,GAAoB;AACjC,YAAA;AACE,gBAAA,EAAE,EAAE,WAAW;AACf,gBAAA,MAAM,EAAE,kBAAkB;AAC1B,gBAAA,QAAQ,EAAE,iCAAiC;AAC3C,gBAAA,OAAO,EAAE,sBAAsB;AAC/B,gBAAA,OAAO,EAAE,sBAAsB;AAC/B,gBAAA,SAAS,EAAE,IAAI;AAChB,aAAA;SACF;IArCE;IAEH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,EAAE;QAC/D;IACF;IAMA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,mCAAmC;AAC5C,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;SAC3B;AACA,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;YACvB,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;IAaA,SAAS,GAAA;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE;QAC/C,IAAI,KAAK,EAAE;AACT,YAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;AACpC,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,YAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;YAEvB,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,gBAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;YACzB,CAAC,EAAE,GAAG,CAAC;QACT;IACF;AAEA,IAAA,oBAAoB,CAAC,OAAsB,EAAA;AACzC,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,KAAK,EAAE,oBAAoB;YAC3B,OAAO,EAAE,yCAAyC,OAAO,CAAC,MAAM,CAAA,IAAA,EAAO,OAAO,CAAC,QAAQ,CAAA,CAAA,CAAG;AAC1F,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;SAC3B;AACA,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;AACvB,YAAA,IAAI,SAAS;gBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AACtD,QAAA,CAAC,CAAC;IACN;IAEA,uBAAuB,GAAA;AACrB,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,OAAO,EAAE,iFAAiF;AAC1F,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;SAC3B;AACA,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;AACvB,YAAA,IAAI,SAAS;AAAE,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE;AAC/C,QAAA,CAAC,CAAC;IACN;IAEA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,OAAO,EACL,0HAA0H;AAC5H,YAAA,WAAW,EAAE,gBAAgB;AAC7B,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;SAC3B;AACA,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;AACvB,YAAA,IAAI,SAAS;AAAE,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;AAC5C,QAAA,CAAC,CAAC;IACN;+GAvGW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,WAAA,EAAA,EAAA,EAAA,KAAA,EAAArB,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAuB,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBpC,+7KA+HA,EAAA,MAAA,EAAA,CAAA,g1GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5GY,YAAY,8BAAE,oBAAoB,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjC,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cACnB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,+7KAAA,EAAA,MAAA,EAAA,CAAA,g1GAAA,CAAA,EAAA;;sBAK5C;;sBAgBA;;sBACA;;sBACA;;;ME7BU,2BAA2B,CAAA;AAPxC,IAAA,WAAA,GAAA;QASW,IAAA,CAAA,UAAU,GAAG,KAAK;AACjB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAC5C,IAAA;+GAJY,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,8KCbxC,0hDAgCM,EAAA,MAAA,EAAA,CAAA,+4BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvBM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,onBAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAb,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAY,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI9C,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;+BACE,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,0hDAAA,EAAA,MAAA,EAAA,CAAA,+4BAAA,CAAA,EAAA;;sBAKzD;;sBACA;;sBACA;;;MEcU,8BAA8B,CAAA;AAmBzC,IAAA,WAAA,CACU,SAAuD,EACvD,aAA4B,EAC5B,QAAyB,EAAA;QAFzB,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,QAAQ,GAAR,QAAQ;AArBX,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAC/C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;;AAGzC,QAAA,IAAA,CAAA,QAAQ,GAA4B,IAAI,CAAC,KAAK,CACnD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAChD;QAEM,IAAA,CAAA,aAAa,GAAG,aAAa;AAE7B,QAAA,IAAA,CAAA,QAAQ,GAAG;AAChB,YAAA,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;AACnE,YAAA,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE;AACnF,YAAA,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE;AAC9F,YAAA,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;SAChF;QAOC,MAAM,CAAC,MAAK;YACV,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AACzC,YAAA,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC;AACpC,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE;IAC/C;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,EAAE;YACxC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;;AAE/D,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,2BAA2B,CAAC;QACpD;AAAO,aAAA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;YAC3C,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AAC7E,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;QACzC;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;IAC7B;IAEA,WAAW,GAAA;;IAEX;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,OAAO,EACL,+FAA+F;AACjG,YAAA,WAAW,EAAE,OAAO;AACpB,YAAA,UAAU,EAAE,QAAQ;SACrB;AACA,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;YACvB,IAAI,SAAS,EAAE;;AAEb,gBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,EAAE;;AAExC,oBAAA,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE;;AAEtC,oBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC7E;YACF;AACF,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,WAAW,CAAC,KAAgC,EAAA;QAC1C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK;IACxC;AAEA,IAAA,cAAc,CAAC,QAAgB,EAAA;QAC7B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,GAAG,QAAQ;IAC9C;AAEA,IAAA,aAAa,CAAC,SAAiB,EAAA;QAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE;AACtE,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;QAChC;IACF;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa;AAAE,YAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE;AAC7E,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE;AACzE,QAAA,OAAO,KAAK;IACd;IAEA,qBAAqB,GAAA;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,UAAU;AAC3D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU;AACxC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IAC7D;IAEA,qBAAqB,GAAA;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,kBAAkB;AACnE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB;AAChD,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IAC7D;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;IACpC;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;IAC3C;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE;IACvC;;AAIA,IAAA,MAAM,gBAAgB,GAAA;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;QAC9C,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACjD;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5B;IAEA,aAAa,GAAA;AACX,QAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACpC;+GApIW,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAnB,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAqB,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9B3C,83EAwEA,EAAA,MAAA,EAAA,CAAA,omGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrDI,YAAY,8BACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAX,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,2BAA2B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,2BAA2B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,qBAAqB,8DACrB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,iBAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKd,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAf1C,SAAS;+BACE,4BAA4B,EAAA,UAAA,EAC1B,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,oBAAoB;wBACpB,2BAA2B;wBAC3B,2BAA2B;wBAC3B,qBAAqB;wBACrB,uBAAuB;AACxB,qBAAA,EAAA,QAAA,EAAA,83EAAA,EAAA,MAAA,EAAA,CAAA,omGAAA,CAAA,EAAA;;;AE1BI,MAAM,QAAQ,GAAG;AACtB,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,WAAW,EAAE,WAAW;AACxB,IAAA,YAAY,EAAE,WAAW;AACzB,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,QAAQ,EAAE,kBAAkB;CAC7B;;MCNY,UAAU,CAAA;AAOnB,IAAA,WAAA,CAAoB,SAAiC,EAAE,EAAA;QAAnC,IAAA,CAAA,MAAM,GAAN,MAAM;AANlB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,EAAE,kDAAC;QACnB,IAAA,CAAA,KAAK,GAAG,EAAE;AACV,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;QACtB,IAAA,CAAA,KAAK,GAAkB,IAAI;QAC3B,IAAA,CAAA,QAAQ,GAAG,CAAC;AA4CpB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,MAAM;IA1CqC;AAE3D,IAAA,MAAM,CAAC,IAAY,EAAA;AACf,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,CAAC,KAAK,IAAI,IAAI;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,KAAK,EAAE;IACpC;IAEQ,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE;AAE7C,QAAA,MAAM,IAAI,GAAG,CAAC,IAAY,KAAI;YAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AAExC,YAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;YAEhD,IAAI,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACrC,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;gBAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;AACzC,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAClC,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;YACxB;AAEA,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACpB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AACjB,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI;gBACjB;YACJ;AAEA,YAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;AAC5C,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;IAC5C;IAEA,aAAa,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACxB;IAIA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;QACjB,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACrB;AACH;;MC5CY,oBAAoB,CAAA;IA0B/B,WAAA,CACU,eAAgC,EACjC,WAAwB,EAAA;QADvB,IAAA,CAAA,eAAe,GAAf,eAAe;QAChB,IAAA,CAAA,WAAW,GAAX,WAAW;AA3BpB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAW;AACnC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,uDAAO;QACpC,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAO;AAEvB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,2DAAC;QAE7C,IAAA,CAAA,WAAW,GAAG,MAAM,EAAW;AAEvB,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAA,CAAA,UAAU,GAAG,CAAC;AAEtB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ;AAEnC,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;AAE1B,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;AAAE,gBAAA,OAAO,EAAE;YAEpC,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,EAAE;AAClC,gBAAA,OAAO,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAC/D;AAEA,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;AACtE,QAAA,CAAC,uDAAC;QAMA,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;YAE1B,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,IAAI,GAAG,CAAC,SAAS;gBAAE;AAE7C,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;YAE3B,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;gBACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACzC,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM;AAC7B,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/B;AAEA,YAAA,IAAI,GAAG,CAAC,SAAS,EAAE;AACjB,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM;;YAE/B;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC;IACzF;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACvC;+GAxDW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAO,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBjC,2uFAsEA,EAAA,MAAA,EAAA,CAAA,srHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzDY,YAAY,8BAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAjB,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAY,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjC,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,2uFAAA,EAAA,MAAA,EAAA,CAAA,srHAAA,CAAA,EAAA;;;MEelC,oBAAoB,CAAA;AAiB/B,IAAA,WAAA,CACU,GAAsB,EACvB,WAAwB,EACxB,WAAwB,EAAA;QAFvB,IAAA,CAAA,GAAG,GAAH,GAAG;QACJ,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,WAAW,GAAX,WAAW;;QAlBpB,IAAA,CAAA,eAAe,GAAG,MAAM,EAAU;;QAMlC,IAAA,CAAA,QAAQ,GAAG,QAAQ;QACV,IAAA,CAAA,YAAY,GAAG,YAAY;QAEpC,IAAA,CAAA,YAAY,GAAY,IAAI;AACX,QAAA,IAAA,CAAA,gBAAgB,GAAG,CAAC,CAAC;;AAG/B,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAW,kBAAkB,8DAAC;IAM7D;IAEH,QAAQ,GAAA;;IAER;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE;AAEjC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAK;;;;AAIhD,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YAC7B;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE;AACtE,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,aAAa,EAAE,IAAI;AACpB,SAAA,CAAC;;;IAIJ;IAEA,gBAAgB,CAAC,KAAa,EAAE,IAAS,EAAA;QACvC,OAAO,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE;IACpC;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa;;;AAIxD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW;AAC5C,cAAE,IAAI,CAAC,gBAAgB,GAAG;AAC1B,cAAE,IAAI,CAAC,gBAAgB;AAEzB,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY,IAAI,SAAS;AAE7F,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ;IAC9B;IAEA,cAAc,CAAC,WAA2B,QAAQ,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAC/B;QACF;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa;QAC1D,SAAS,CAAC,QAAQ,CAAC;YACjB,GAAG,EAAE,SAAS,CAAC,YAAY;AAC3B,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA,CAAC;;AAEF,QAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;IACF;AAEA,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;AAEA,IAAA,WAAW,CAAC,OAAgB,EAAA;QAC1B,IAAI,CAAC,OAAO,CAAC,IAAI;YAAE;AAEnB,QAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAK;AACpD,YAAA,OAAO,CAAC,MAAM,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAExB,UAAU,CAAC,MAAK;AACd,gBAAA,OAAO,CAAC,MAAM,GAAG,KAAK;AACtB,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC,EAAE,GAAG,CAAC;AACT,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;QACpC;IACF;+GAzGW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAR,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,8PC5BjC,6yEAoEA,EAAA,MAAA,EAAA,CAAA,snIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5CY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,oBAAoB,oLAAE,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIvD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,4BAA4B,EAAA,UAAA,EAC1B,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,6yEAAA,EAAA,MAAA,EAAA,CAAA,snIAAA,CAAA,EAAA;;sBAQlE,SAAS;uBAAC,cAAc;;;MEjBd,wBAAwB,CAAA;IAYnC,WAAA,CACU,EAAc,EACd,QAAmB,EAAA;QADnB,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAbV,IAAA,CAAA,UAAU,GAAG,KAAK;QAClB,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,OAAO,GAAG,CAAC;QACX,IAAA,CAAA,OAAO,GAAG,CAAC;QAGV,IAAA,CAAA,UAAU,GAAG,KAAK;IAOxB;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE;YACzB,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAChF;iBAAO;gBACL,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;YAC1C;AACA,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;YAC3D;QACF;aAAO;AACL,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC;YAC9D;;;QAGF;IACF;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QACtB,IAAI,KAAK,CAAC,gBAAgB;AAAE,YAAA,OAAO;QAEnC,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AAEtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;;QAG1C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;YACrC;QACF;;AAGA,QAAA,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE;YACzF;QACF;;AAGA,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;AAC9B,QAAA,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE;;AAGlF,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,oCAAoC,CAAC;YAAE;;AAG1D,QAAA,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE;AAExE,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;AAE1C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC/D;QAEA,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,wBAAwB,EAAE;IAClC;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;;QAGtB,IAAI,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QAC5C,IAAI,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;;QAG5C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,qBAAqB,EAAE;;;QAI1D,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM;;;;;QAO7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,UAAU;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,UAAU;;AAGtD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACvD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;;AAGvD,QAAA,UAAU,IAAI,QAAQ,GAAG,SAAS;AAClC,QAAA,UAAU,IAAI,QAAQ,GAAG,SAAS;AAElC,QAAA,IAAI,CAAC,OAAO,GAAG,UAAU;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,UAAU;QAEzB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,IAAI,CAAC,EAAE,CAAC,aAAa,EACrB,WAAW,EACX,CAAA,UAAA,EAAa,IAAI,CAAC,OAAO,CAAA,IAAA,EAAO,IAAI,CAAC,OAAO,CAAA,GAAA,CAAK,CAClD;IACH;IAGA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QAEvB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE;AACtC,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;QAC3D;IACF;+GAxIW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,CAAA,YAAA,EAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAQE,KAAK;uBAAC,YAAY;;sBAClB;;sBAsCA,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;sBAyCpC,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;sBA0C7C,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,kBAAkB,EAAE,EAAE;;;AChJtC;MAiBa,wBAAwB,CAAA;IAgBnC,WAAA,CACU,EAA2B,EAC3B,QAAmB,EAAA;QADnB,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAjBV,IAAA,CAAA,aAAa,GAAkB,EAAE;QACjC,IAAA,CAAA,YAAY,GAAkB,IAAI;QAClC,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,UAAU,GAAG,CAAC;QACd,IAAA,CAAA,WAAW,GAAG,CAAC;QACf,IAAA,CAAA,SAAS,GAAG,CAAC;QACb,IAAA,CAAA,QAAQ,GAAG,CAAC;QAGX,IAAA,CAAA,YAAY,GAAG,KAAK;;AAGrB,QAAA,IAAA,CAAA,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAK9D;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE;YAC3B,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;gBACnC,IAAI,CAAC,QAAQ,EAAE;gBACf,IAAI,CAAC,mBAAmB,EAAE;YAC5B;QACF;aAAO;YACL,IAAI,CAAC,mBAAmB,EAAE;QAC5B;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEQ,QAAQ,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;QACrC,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ;QAE1D,IAAI,eAAe,KAAK,OAAO,IAAI,eAAe,KAAK,UAAU,EAAE;YACjE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;QACzD;QAEA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC;IAC5D;IAEQ,mBAAmB,GAAA;QACzB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC;AAC3D,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC;;AAGpD,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC1C,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC;gBACrF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC;gBAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC;gBAC7C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;gBAC3E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;YAC3E;AACA,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC;gBACrF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC;gBAC3C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC;gBAC5C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;gBAC3E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;YAC1E;AACA,YAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;gBAChE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;gBAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC;AACrD,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAA,EAAG,GAAG,CAAA,OAAA,CAAS,CAAC;gBACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;gBACzE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;gBAC5E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;gBAC1E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;YAC7E;AAEA,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;AACxD,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AACjC,QAAA,CAAC,CAAC;IACJ;IAEQ,mBAAmB,GAAA;QACzB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AACpC,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;AAC1D,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;IACzB;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QACxB,IAAI,KAAK,CAAC,gBAAgB;AAAE,YAAA,OAAO;AAEnC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;AAC3C,QAAA,IAAI,CAAC,GAAG;YAAE;QAEV,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,wBAAwB,EAAE;AAEhC,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAE9D,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC/D,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;;QAG7D,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;IAC1C;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QAExB,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QACtC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;AAEtC,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU;AAC9B,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,WAAW;AAChC,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS;AAC5B,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ;QAE1B,MAAM,QAAQ,GAAG,GAAG;QACpB,MAAM,SAAS,GAAG,GAAG;;QAGrB,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACnC,QAAQ,GAAG,IAAI,CAAC,GAAG,CACjB,QAAQ,EACR,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CACnE;QACH;QACA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;;AAEnC,YAAA,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;;YAE5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU;YAEzD,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC;YACpD,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,GAAG,QAAQ;;AAGrD,YAAA,IAAI,OAAO,GAAG,CAAC,EAAE;gBACf,OAAO,GAAG,CAAC;gBACX,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;YAC9C;QACF;;QAGA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAClB,SAAS,EACT,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CACzE;QACH;QACA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;;AAEnC,YAAA,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;;AAE/D,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;YAE/C,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,iBAAiB,CAAC;YACvD,MAAM,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,GAAG,SAAS;;YAGrD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC,EAAE;gBACzC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAClC,MAAM,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,GAAG,SAAS;YACvD;QACF;;AAGA,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAA,EAAA,CAAI,CAAC;AACvE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA,EAAA,CAAI,CAAC;AACzE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA,EAAA,CAAI,CAAC;AACrE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA,EAAA,CAAI,CAAC;IACrE;IAGA,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YACxB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7C;IACF;AAEQ,IAAA,qBAAqB,CAAC,QAAgB,EAAA;AAC5C,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,GAAG;IAClF;+GApNW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAYE;;sBAiGA,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;sBA0BpC,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;sBAoE7C,YAAY;uBAAC,kBAAkB;;;MC/MrB,2BAA2B,CAAA;AAPxC,IAAA,WAAA,GAAA;AAQU,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;AAEhC,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,sDAAC;AAChE,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,wDAAC;AACnE,QAAA,IAAA,CAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,iEAAC;AAE9E,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;YAClC,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,gBAAA,OAAO,WAAW;YACzC,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,gBAAA,OAAO,eAAe;YAC/C,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAAE,gBAAA,OAAO,UAAU;AACnD,YAAA,OAAO,iBAAiB;AAC1B,QAAA,CAAC,sDAAC;AAEO,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;YACnC,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,gBAAA,OAAO,eAAe;YAC7C,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,gBAAA,OAAO,uBAAuB;YACvD,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAAE,gBAAA,OAAO,kBAAkB;AAC3D,YAAA,OAAO,YAAY;AACrB,QAAA,CAAC,uDAAC;AAEO,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;YACrC,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,gBAAA,OAAO,4BAA4B;YAC1D,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,gBAAA,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;YACzD,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAAE,gBAAA,OAAO,6BAA6B;AACtE,YAAA,OAAO,iCAAiC;AAC1C,QAAA,CAAC,yDAAC;AAEO,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;YACnC,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,gBAAA,OAAO,UAAU;YACxC,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,gBAAA,OAAO,OAAO;YACvC,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAAE,gBAAA,OAAO,SAAS;AAClD,YAAA,OAAO,EAAE;AACX,QAAA,CAAC,uDAAC;AAEO,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CACtC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC,cAAc,gEAC5D;AACQ,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC,WAAW,6DAAC;AACtF,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC,WAAW,6DAAC;AAChG,IAAA;+GAxCY,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZxC,s5DAmDA,EAAA,MAAA,EAAA,CAAA,skLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3CY,YAAY,kIAAE,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjC,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,cACvB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,s5DAAA,EAAA,MAAA,EAAA,CAAA,skLAAA,CAAA,EAAA;;;AEK/C;;;;;;;;;;;;AAYG;MAMU,mBAAmB,CAAA;AALhC,IAAA,WAAA,GAAA;AAMU,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC;AACpC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QAEL,IAAA,CAAA,cAAc,GAAmB,UAAU;QAE3D,IAAA,CAAA,MAAM,GAAG,KAAK;QAEd,IAAA,CAAA,cAAc,GAAiC,EAAE;AA6H1D,IAAA;IA1HC,yBAAyB,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;AACrC,YAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,iBAAiB,KAAK,IAAI,CAAC,EAAE,CAAC,aAAa;QACpE;IACF;AAEA,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;;AAGrC,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC;AAExE,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;YACrC,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACtD;QACF;AAEA,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAEjC,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,WAAW,EAAE;;AAEvC,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACxB,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,QAAQ,EAAE,UAAU;AACpB,gBAAA,GAAG,EAAE,GAAG;AACR,gBAAA,IAAI,EAAE,GAAG;AACT,gBAAA,KAAK,EAAE,GAAG;AACV,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,IAAI;AACb,aAAA,CAAC;YAEF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;AAChD,YAAA,IAAI,MAAM,IAAI,MAAM,YAAY,WAAW,EAAE;;gBAE3C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;gBACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;AACpD,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YAC7B;QACF;AAAO,aAAA,IAAI,IAAI,CAAC,cAAc,KAAK,UAAU,EAAE;AAC7C,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACxB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,GAAG,EAAE,GAAG;AACR,gBAAA,IAAI,EAAE,GAAG;AACT,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,MAAM,EAAE,OAAO;AACf,gBAAA,MAAM,EAAE,MAAM;AACf,aAAA,CAAC;QACJ;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;IACpB;AAEA,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;QACrC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC;AACtD,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;YACrC,IAAI,QAAQ,CAAC,iBAAiB;gBAAE,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpF;QACF;QAEA,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;AACnC,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;IACrB;AAEQ,IAAA,cAAc,CAAC,MAAmB,EAAA;AACxC,QAAA,IAAI,CAAC,aAAa,EAAE,CAAC;;AAGrB,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,MAAK;;;;AAI9C,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;AACrC,QAAA,CAAC,CAAC;IACJ;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE;IACnC;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,aAAa,EAAE;IACtB;IAEQ,WAAW,CAAC,OAAoB,EAAE,MAA8B,EAAA;;QAEtE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC;AAE3D,QAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7F;AAEQ,IAAA,mBAAmB,CAAC,OAAoB,EAAA;QAC9C,IAAI,CAAC,cAAc,GAAG;AACpB,YAAA,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ;AAChC,YAAA,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG;AACtB,YAAA,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI;AACxB,YAAA,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;AAC1B,YAAA,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;AAC5B,YAAA,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;SAC7B;IACH;AAEQ,IAAA,qBAAqB,CAAC,OAAoB,EAAA;AAChD,QAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC3D,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC;AACnD,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,cAAc,KAAK;cAC3B,QAAQ,CAAC,iBAAiB,KAAK,IAAI,CAAC,EAAE,CAAC;AACzC,cAAE,IAAI,CAAC,MAAM;IACjB;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;IAC1D;+GArIW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAL/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,eAAe;AAC1B,iBAAA;;sBAME,KAAK;uBAAC,eAAe;;sBAMrB,YAAY;uBAAC,2BAA2B;;;MCoB9B,mBAAmB,CAAA;IAoD9B,WAAA,CACU,mBAAwC,EACxC,aAAmC,EACpC,WAAwB,EACxB,WAAwB,EACvB,aAA4B,EAC5B,WAA+B,EAAA;QAL/B,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;QACnB,IAAA,CAAA,aAAa,GAAb,aAAa;QACd,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,WAAW,GAAX,WAAW;QACV,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,WAAW,GAAX,WAAW;;QAxDrB,IAAA,CAAA,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkC;AAErD,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,KAAK,+DAAC;;AAG3B,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;AACxC,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB;AAC5D,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY;;AAG5C,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ;AACxC,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO;AACzC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;AAC9C,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS;AAC9C,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB;AAC1D,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,WAAW,IAAI,IAAI,2DAAC;;QAGrF,IAAA,CAAA,YAAY,GAAG,YAAY;;QAGpC,IAAA,CAAA,YAAY,GAAG,MAAM,EAAQ;AAEtB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAC5B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAqC,QAAQ,oDAAC;AAE/D,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAW,kBAAkB,2DAAC;AAErD,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAChD,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CACxB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,EAC3F,EAAE,YAAY,EAAE,KAAK,EAAE,CACxB;AAEM,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK,yDAAC;AAEpB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAc,MAAK;YACvD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,WAAW,IAAI,KAAK;AACzD,QAAA,CAAC,uDAAC;AAEK,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC7B,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS;AAAE,gBAAA,OAAO,KAAK;AAClD,YAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACxE,QAAA,CAAC,mDAAC;AAEK,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC/B,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS;AAAE,gBAAA,OAAO,KAAK;AAClD,YAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAC1E,QAAA,CAAC,qDAAC;QAUA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;QAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,KAAK,QAAQ,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAE,UAAU,EAAE,IAAY,IAAI,QAAQ,CAAC;;QAGxD,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AAExC,YAAA,IAAI,CAAC,MAAM,IAAI,YAAY,EAAE;AAC3B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AAC/B,gBAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC;YACvC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;QAC7C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB;QACjE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY;;QAGjD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ;QAC7C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;QACnD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS;QACnD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB;IACjE;;;IAKA,oBAAoB,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,EAAE;;YAE5C,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE;QACvC;IACF;;IAGA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE;IACxC;;AAGA,IAAA,MAAM,cAAc,GAAA;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;AAC9C,QAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAA,CAAE,CAAC;AACtD,QAAA,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC;IAC9D;;AAGA,IAAA,MAAM,eAAe,GAAA;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;AAC9C,QAAA,MAAM,CAAC,IAAI,CAAC,mCAAmC,MAAM,CAAA,CAAE,CAAC;AACxD,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC5D;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC;QACvD;IACF;;AAGA,IAAA,iBAAiB,CAAC,OAAuB,EAAA;AACvC,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;YACxB;QACF;QACA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC;AACrD,QAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE;IACxC;;IAGA,MAAM,gBAAgB,CAAC,SAAiB,EAAA;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;AAC9C,QAAA,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;;AAGlE,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;;QAGlC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;AACzD,QAAA,IAAI,aAAa,EAAE,WAAW,KAAK,SAAS,EAAE;AAC5C,YAAA,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC;AAC9D,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;QACpC;IACF;;IAGA,MAAM,gBAAgB,CAAC,KAA8C,EAAA;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CACtD,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,QAAQ,EACd,MAAM,CAAC,QAAQ,EAAE,CAClB;QACD,IAAI,MAAM,EAAE;;YAEV,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;YACzD,IAAI,aAAa,EAAE,WAAW,KAAK,KAAK,CAAC,SAAS,EAAE;AAClD,gBAAA,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ;YACtC;QACF;IACF;;AAGA,IAAA,MAAM,mBAAmB,GAAA;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;QAC9C,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAC/C,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;IAClC;AAEQ,IAAA,MAAM,gBAAgB,GAAA;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;AAC9C,QAAA,MAAM,CAAC,IAAI,CAAC,yCAAyC,MAAM,CAAA,CAAE,CAAC;AAC9D,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxD;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC;QACnD;IACF;;IAIA,MAAM,MAAM,CAAC,IAAY,EAAA;QACvB,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;IACpC;IAEA,MAAM,iBAAiB,CAAC,IAAY,EAAA;QAClC,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;IACpC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;IAClC;;;IAKA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;AACxD,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,YAAY,CAAC;QAE5C,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;;IAGA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;;IAGA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B;;IAGA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,8BAA8B,EAAE;AACtD,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,UAAU,EAAE,8BAA8B;AAC3C,SAAA,CAAC;IACJ;;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC;AACP,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,mCAAmC;AAC5C,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;SAC3B;AACA,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;AACvB,YAAA,IAAI,SAAS;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AAC1C,QAAA,CAAC,CAAC;IACN;;;;;;;;;;;AAeA,IAAA,WAAW,KAAI;+GAnQJ,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAmB,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA5B,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAQ,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAqB,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9DhC,q1KAmJA,EAAA,MAAA,EAAA,CAAA,i4NAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtGI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAX,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAY,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,KAAK,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,oBAAoB,EAAA,QAAA,EAAA,4BAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,sBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKlB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBArB/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,oBAAoB;wBACpB,KAAK;wBACL,oBAAoB;wBACpB,kBAAkB;wBAClB,oBAAoB;wBACpB,mBAAmB;wBACnB,kBAAkB;wBAClB,mBAAmB;wBACnB,WAAW;wBACX,wBAAwB;wBACxB,wBAAwB;wBACxB,2BAA2B;AAC5B,qBAAA,EAAA,QAAA,EAAA,q1KAAA,EAAA,MAAA,EAAA,CAAA,i4NAAA,CAAA,EAAA;;;ME/CU,cAAc,CAAA;AACzB,IAAA,WAAA,CACU,IAAgB,EAChB,WAAwB,EACA,MAAqB,EAAA;QAF7C,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,WAAW,GAAX,WAAW;QACa,IAAA,CAAA,MAAM,GAAN,MAAM;IACrC;AAEH;;;;AAIG;AACH,IAAA,MAAM,mBAAmB,GAAA;AACvB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;QAC9C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC3C,YAAA,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC;YAC3D;QACF;;QAGA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AAC1D,QAAA,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC;IAC9C;AAEA;;;AAGG;IACK,MAAM,eAAe,CAAC,UAAkB,EAAA;AAC9C,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAyB,UAAU,CAAC,CAAC;YACpF,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACrC,gBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;YACzC;YAEA,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC;QAAE,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,UAAU,EAAE,KAAK,CAAC;AAChF,YAAA,OAAO,IAAI;QACb;IACF;AAxCW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,oEAIf,cAAc,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAJb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAKI,MAAM;2BAAC,cAAc;;;ACS1B;;;AAGG;MAUU,gBAAgB,CAAA;IA+F3B,WAAA,CACU,UAAsB,EACtB,YAA0B,EAC1B,cAA8B,EAC9B,WAAwB,EACxB,WAAwB,EACxB,aAAmC,EAAA;QALnC,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,aAAa,GAAb,aAAa;AAvBvB;;;;;;;;;;;;AAYG;QACM,IAAA,CAAA,cAAc,GAAmB,UAAU;AAE5C,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,OAAO,EAAQ;;QAWnD,MAAM,CAAC,MAAK;;YAEV,IAAI,CAAC,UAAU,EAAE;AACnB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,MAAM,QAAQ,GAAA;;AAEZ,QAAA,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE;;QAG/C,IAAI,CAAC,WAAW,CAAC;AACd,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC;AAC5C,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,YAAY,EAAE;YACrB;AACF,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE;YACzB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;QACjD;QAEA,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YAC9C,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;QACnD;QAEA,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YAC9C,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;QACnD;AAEA,QAAA,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE;YACzB,IAAI,CAAC,UAAU,EAAE;QACnB;QAEA,IAAI,CAAC,gBAAgB,EAAE;IACzB;;IAGQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;IACpE;IAEQ,YAAY,GAAA;;QAElB,IAAI,CAAC,UAAU,EAAE;;AAGjB,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;;AAGlC,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;IAClC;IAEQ,gBAAgB,GAAA;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AAC5C,QAAA,IAAI,CAAC,UAAU;YAAE;AAEjB,QAAA,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc;AAC1C,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO;AAEjC,QAAA,QAAQ,UAAU,CAAC,IAAI;AACrB,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,CAAC,YAAY;AAAE,oBAAA,OAAO;gBAC1B,IAAI,UAAU,EAAE;AACd,oBAAA,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC;gBACrE;gBACA,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC;AAC3D,gBAAA,IAAI,CAAC,WAAW,CAAC,qBAAqB,EAAE;gBACxC;AAEF,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,CAAC,UAAU;AAAE,oBAAA,OAAO;gBACxB,IAAI,YAAY,EAAE;AAChB,oBAAA,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC;gBACpE;gBACA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAClD;AAEF,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,YAAY,IAAI,UAAU,EAAE;AAC9B,oBAAA,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC;gBAC3E;;gBAEA;AAEF,YAAA;gBACE,MAAM,IAAI,KAAK,CAAC,CAAA,iCAAA,EAAoC,UAAU,CAAC,IAAI,CAAA,CAAE,CAAC;;IAE5E;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE;AACnC,QAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE;IACzC;+GAxMW,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA1B,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAqB,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAM,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrC7B,yHAGA,EAAA,MAAA,EAAA,CAAA,s31HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED4BY,YAAY,+BAAE,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAM1E,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAT5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,iBAGvE,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,s31HAAA,CAAA,EAAA;;sBAc9C;;sBAYA;;sBAaA;;sBAYA;;sBAaA;;sBAcA;;sBAeA;;;ME1HU,cAAc,CAAA;AAGzB,IAAA,WAAA,GAAA;AAFQ,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAE1B;AAEf;;;AAGG;AACH,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;IAClC;+GAXW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACFD;;;;;AAKG;AACG,SAAU,oBAAoB,CAAC,SAAkC,EAAA;IACnE,OAAO;AACH,QAAA,GAAG,sBAAsB;AACzB,QAAA,GAAG,SAAS;KACf;AACL;;MCEa,eAAe,CAAA;IAC1B,WAAA,CACU,WAAwB,EACxB,aAAmC,EAAA;QADnC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,aAAa,GAAb,aAAa;IACpB;IAEH,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;;QAEhD,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,IAAI,KAAK,SAAS,EAAE;AACjD,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QACzB;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACvC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAC9BC,YAAU,CAAC,CAAC,KAAK,KAAI;YACnB,IACE,KAAK,YAAY,iBAAiB;gBAClC,KAAK,CAAC,MAAM,KAAK,GAAG;gBACpB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EACxC;;;;gBAIA,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,IAAI,KAAK,WAAW,EAAE;AACnD,oBAAA,MAAM,YAAY,GAA0B;wBAC1C,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,EAAE;AACzD,wBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;qBAC3C;AAED,oBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CACtDC,OAAK,CAAC,CAAC,CAAC;AACR,oBAAAC,WAAS,CAAC,CAAC,MAAM,KAAI;wBACnB,IAAI,CAAC,MAAM,EAAE;AACX,4BAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;wBAChC;wBACA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC7C,oBAAA,CAAC,CAAC,EACFF,YAAU,CAAC,CAAC,OAAO,KAAI;AACrB,wBAAA,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,OAAO,CAAC;AACxD,wBAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;oBAChC,CAAC,CAAC,CACH;gBACH;;;;;;;;;;;;;;;;;;;YAqBF;AAEA,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH;IACH;AAEQ,IAAA,aAAa,CAAC,GAAqB,EAAA;;QAEzC,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,GAAG;;QAGnD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,GAAG;QAE/D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;AAC5C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,GAAG;QAEtB,OAAO,GAAG,CAAC,KAAK,CAAC;AACf,YAAA,UAAU,EAAE;gBACV,aAAa,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE;AACjC,aAAA;AACF,SAAA,CAAC;IACJ;+GArFW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAf,WAAA,EAAA,EAAA,EAAA,KAAA,EAAArB,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAf,eAAe,EAAA,CAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;MCDY,sBAAsB,CAAA;AADnC,IAAA,WAAA,GAAA;QAEmB,IAAA,CAAA,WAAW,GAAG,EAAE;AA6IlC,IAAA;AA3IS,IAAA,UAAU,CAAC,KAAa,EAAE,KAAU,EAAE,KAAa,EAAA;AACzD,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;QACvD,MAAM,IAAI,GAAG,CAAA,EAAG,WAAW,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,GAAG,EAAE,CAAA,CAAE;QAClF,OAAO,CAAC,GAAG,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,sBAAA,CAAwB,CAAC;IACnE;IAEA,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;AAChD,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,QAAA,MAAM,GAAG,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,GAAG,CAAC,MAAM,CAAA,GAAA,EAAM,GAAG,CAAC,aAAa,EAAE;AAE3D,QAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,cAAc,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,EAAE,sCAAsC,CAAC;;AAG1E,QAAA,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,uDAAuD,CAAC;QACjF,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC;QAC5D,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,EAAE,SAAS,CAAC;AAC9C,QAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;QACnE,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,iCAAiC,EAAE,SAAS,CAAC;;AAGhF,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,uDAAuD,CAAC;AACzF,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;;AAG5B,QAAA,IAAI,GAAG,CAAC,IAAI,EAAE;AACZ,YAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,uDAAuD,CAAC;AACzF,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QACrE;QAEA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAC1B,GAAG,CAAC;AACF,YAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,gBAAA,IAAI,KAAK,YAAY,YAAY,EAAE;AACjC,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AACtD,oBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;gBACnC;YACF,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAsB,KAAI;AAChC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AACtD,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;YAC9B,CAAC;AACF,SAAA,CAAC,CACH;IACH;IAEQ,WAAW,CAAC,GAAsB,EAAE,QAAgB,EAAA;AAC1D,QAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,uDAAuD,CAAC;AAC1F,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;AAE5B,QAAA,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,uDAAuD,CAAC;AAClF,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAA,EAAG,QAAQ,CAAA,GAAA,CAAK,EAAE,SAAS,CAAC;AAEpD,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI;AACrB,aAAA,IAAI,CAAC,CAAC,OAAO,KAAI;YAChB,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,uDAAuD,CAAC;AACvF,gBAAA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YACtB;YACA,OAAO,CAAC,QAAQ,EAAE;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,QAAA,CAAC;aACA,KAAK,CAAC,MAAK;YACV,OAAO,CAAC,QAAQ,EAAE;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,QAAA,CAAC,CAAC;IACN;IAEQ,QAAQ,CAAC,GAAsB,EAAE,QAAgB,EAAA;AACvD,QAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,uDAAuD,CAAC;AAC1F,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;AAE5B,QAAA,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,qDAAqD,CAAC;AAChF,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAA,EAAG,QAAQ,CAAA,GAAA,CAAK,EAAE,SAAS,CAAC;QAEpD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO;AACrC,aAAA,IAAI,CAAC,CAAC,OAAO,KAAI;YAChB,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,qDAAqD,CAAC;AAClF,gBAAA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YACtB;YACA,OAAO,CAAC,QAAQ,EAAE;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,QAAA,CAAC;aACA,KAAK,CAAC,MAAK;YACV,OAAO,CAAC,QAAQ,EAAE;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,UAAU,CAAC,OAAuC,EAAA;AACxD,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3C,YAAA,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YACvB;QACF;QACA,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;AACpC,YAAA,MAAM,SAAS,GAAG,CAAA,EAAA,EAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,CAAA,EAAA,EAAK,SAAS,CAAA,EAAG,KAAK,CAAA,CAAE,EAAE,sCAAsC,CAAC;AAC/E,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,eAAe,CAAC,GAAQ,EAAA;AAC9B,QAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;AAAE,YAAA,OAAO,MAAM;QACpD,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,YAAA,OAAO,GAAG;AACvC,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB;IACF;IAEQ,MAAM,UAAU,CAAC,IAAS,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;AAEtB,QAAA,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE;AAClE,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,YAAA,IAAI;gBACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,IAAI;YACb;QACF;AAEA,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,IAAI;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC;YACrB;QACF;AAEA,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB;+GA7IW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAtB,sBAAsB,EAAA,CAAA,CAAA;;4FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC;;;MCVY,kBAAkB,CAAA;AAC7B,IAAA,WAAW,CAAC,KAAU,EAAA;AACpB,QAAA,OAAO,CAAC,KAAK,CACX,oBAAoB,EACpB,oCAAoC,EACpC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAC3B;IACH;AAEQ,IAAA,cAAc,CAAC,GAAQ,EAAA;QAC7B,OAAO;YACL,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,QAAQ,EAAE;AACxC,YAAA,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,IAAI;AACzB,YAAA,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,IAAI;SAC1B;IACH;+GAfW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAlB,kBAAkB,EAAA,CAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;ACSD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CG;AACG,SAAU,cAAc,CAAC,MAAA,GAAiC,EAAE,EAAA;AAChE,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,QAAQ,EAAE,oBAAoB,CAAC,MAAM,CAAC;AACvC,SAAA;QACD,oBAAoB;;QAGpB,MAAM;AACN,QAAA;AACE,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,CAAC,MAAM,CAAC;AACd,YAAA,UAAU,EAAE,CAAC,MAAc,KAAK,MAAK;AACnC,gBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB,CAAC;AACF,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,QAAQ,EAAE,eAAe;AACzB,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA;QACD,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,sBAAsB,CAAC,WAAW,MAAM;AACjE,cAAE;cACA,YAAY,CAAC;AAClB,KAAA,CAAC;AACJ;AAEA,MAAM,YAAY,GAAe;IAC/B,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7E,IAAA,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE;CACxD;;AC1FD;;;;;AAKG;AAEH;;ACPA;;AAEG;;;;"}
1
+ {"version":3,"file":"adzen-doohbot.mjs","sources":["../../../src/lib/shared/material/material.module.ts","../../../src/lib/const/doohbot-constant.ts","../../../src/lib/core/config/doohbot-config.token.ts","../../../src/lib/core/config/doohbot-api-base-url.ts","../../../src/lib/core/config/doohbot-config.default.ts","../../../src/lib/core/config/doohbot-config.resolver.ts","../../../src/lib/core/config/doohbot-config.service.ts","../../../src/lib/core/utils/logger.service.ts","../../../src/lib/core/http/http.service.ts","../../../src/lib/core/http/http-stream.service.ts","../../../src/lib/app/chat/services/chat-api.service.ts","../../../src/lib/shared/snackbar/snackbar.component.ts","../../../src/lib/shared/snackbar/snackbar.component.html","../../../src/lib/shared/snackbar/snackbar.service.ts","../../../src/lib/app/chat/services/chat-history.service.ts","../../../src/lib/core/models/doohbot-config.model.ts","../../../src/lib/core/environments/environment.ts","../../../src/lib/core/auth/storage.service.ts","../../../src/lib/core/auth/auth.service.ts","../../../src/lib/core/services/markdown.service.ts","../../../src/lib/app/chat/chat.service.ts","../../../src/lib/app/chat/components/chat-button/chat-button.component.ts","../../../src/lib/app/chat/components/chat-button/chat-button.component.html","../../../src/lib/predefined_messages.ts","../../../src/lib/app/chat/components/chat-input/chat-input.component.ts","../../../src/lib/app/chat/components/chat-input/chat-input.component.html","../../../src/lib/shared/confirmation-dialog/confirmation-dialog.component.ts","../../../src/lib/shared/confirmation-dialog/confirmation-dialog.component.html","../../../src/lib/shared/input-dialog/input-dialog.component.ts","../../../src/lib/shared/input-dialog/input-dialog.component.html","../../../src/lib/shared/confirmation-dialog/dialog.service.ts","../../../src/lib/app/chat/components/chat-history/chat-history.component.ts","../../../src/lib/app/chat/components/chat-history/chat-history.component.html","../../../src/lib/app/personalization/personalization.service.ts","../../../src/lib/core/services/theme.service.ts","../../../src/lib/app/chat/components/chat-header/chat-header.component.ts","../../../src/lib/app/chat/components/chat-header/chat-header.component.html","../../../src/lib/app/login/login-form.component.ts","../../../src/lib/app/login/login-form.component.html","../../../src/lib/app/chat/components/chat-footer/chat-footer.component.ts","../../../src/lib/app/chat/components/chat-footer/chat-footer.component.html","../../../src/lib/shared/chips/chips.component.ts","../../../src/lib/shared/chips/chips.component.html","../../../src/lib/app/personalization/sections/preferences/preferences-section.component.ts","../../../src/lib/app/personalization/sections/preferences/preferences-section.component.html","../../../src/lib/app/personalization/sections/terms/terms-section.component.ts","../../../src/lib/app/personalization/sections/terms/terms-section.component.html","../../../src/lib/app/personalization/sections/account/account-section.component.ts","../../../src/lib/app/personalization/sections/account/account-section.component.html","../../../src/lib/app/personalization/sections/instruction/instruction-section.component.ts","../../../src/lib/app/personalization/sections/instruction/instruction-section.component.html","../../../src/lib/app/personalization/personalization-dialog.component.ts","../../../src/lib/app/personalization/personalization-dialog.component.html","../../../src/lib/const/utf8.ts","../../../src/lib/shared/utils/typewriter.ts","../../../src/lib/app/chat/components/chat-message/chat-message.component.ts","../../../src/lib/app/chat/components/chat-message/chat-message.component.html","../../../src/lib/app/chat/components/chat-message-container/chat-message-container.component.ts","../../../src/lib/app/chat/components/chat-message-container/chat-message-container.component.html","../../../src/lib/core/directives/draggable-dialog.directive.ts","../../../src/lib/core/directives/resizable-dialog.directive.ts","../../../src/lib/shared/notification-banner/notification-banner.component.ts","../../../src/lib/shared/notification-banner/notification-banner.component.html","../../../src/lib/core/directives/fullscreen.directive.ts","../../../src/lib/app/chat/components/chat-window/chat-window.component.ts","../../../src/lib/app/chat/components/chat-window/chat-window.component.html","../../../src/lib/core/services/license.service.ts","../../../src/lib/doohbot.component.ts","../../../src/lib/doohbot.component.html","../../../src/lib/doohbot.service.ts","../../../src/lib/core/interceptors/auth.interceptor.ts","../../../src/lib/core/interceptors/http-logging.interceptor.ts","../../../src/lib/core/services/global-error-handler.ts","../../../src/lib/doohbot.providers.ts","../../../src/public-api.ts","../../../src/adzen-doohbot.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\n\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\n\r\nconst MATERIAL_MODULES = [\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n MatMenuModule,\r\n MatTooltipModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatSlideToggleModule,\r\n MatDividerModule,\r\n MatSnackBarModule,\r\n MatProgressSpinnerModule,\r\n];\r\n\r\n@NgModule({\r\n imports: MATERIAL_MODULES,\r\n exports: MATERIAL_MODULES,\r\n})\r\nexport class SharedMaterialModule {}\r\n","export const doohbotConst = {\r\n //LIVE ASSETS\r\n // APP_LOGO: 'https://iili.io/f3qSQJn.md.png',\r\n // USER_AVATAR: 'https://iili.io/KpEYoCP.png',\r\n // BOT_AVATAR: 'https://iili.io/KpER0Ge.png',\r\n\r\n // ==================\r\n\r\n //png ASSETS\r\n // APP_LOGO: 'assets/logo.svg',\r\n // APP_TEXT_LOGO: 'assets/title.svg',\r\n // APP_HEADER_LOGO: 'assets/header_logo.svg',\r\n // USER_AVATAR: 'assets/profile.png',\r\n // BOT_AVATAR: 'assets/bot.png',\r\n\r\n // ==================\r\n\r\n // Application Constants Text\r\n appTitle: 'Doohbot',\r\n appSubtitle: 'Welcome to Doohbot',\r\n welcomeDescription:\r\n 'We provide a powerful live chat platform to help businesses connect with their customers, offer support, and increase sales through real-time conversations.',\r\n hintText: 'How can I assist you today?',\r\n\r\n // ==================\r\n\r\n // base64_ASSETS\r\n\r\n appLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDE1MCAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc2XzE0MzgpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc2XzE0MzgpIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSI2LjAwMzA2IiB5MT0iNiIgeDI9IjE0Mi45NzIiIHkyPSIxNDMuMjI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSIxNDMuMjI3IiB5MT0iNzYuODA0NiIgeDI9IjI2LjAwMSIgeTI9IjEyMi45NjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzNzZfMTQzOCIgeDE9IjU4LjI1NDEiIHkxPSI1OC4xNjciIHgyPSI1My45MTE3IiB5Mj0iMTMyLjk1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzIzNzZfMTQzOCI+CjxwYXRoIGQ9Ik02IDZIMTEzLjIyN0MxMjkuNzk1IDYgMTQzLjIyNyAxOS40MzE1IDE0My4yMjcgMzZWMTEyLjk3NUMxNDMuMjI3IDEyOS41NDQgMTI5Ljc5NSAxNDIuOTc1IDExMy4yMjcgMTQyLjk3NUg2VjZaIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=',\r\n appTextLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDc3IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgNDc3IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNDUzLjkzMiA4Ny4wMjZDNDUyLjI0OSA4Ny4wMjYgNDUxLjI4NyA4Ni40MjUgNDUwLjA4NSA4NS4yMjI5TDQ0My43MTQgNzkuODEzNkM0NDIuNTEyIDc4LjYxMTUgNDQxLjkxMSA3Ny4yODkyIDQ0MS45MTEgNzUuNDg2MVY0MC44NjYySDQzMy42MTdWMzIuNDUxNkw0NDkuMTI0IDE1LjAyMTVINDUzLjIxMVYzMS4yNDk2SDQ3MC42NDFWNDAuODY2Mkg0NTMuMjExVjc2LjY4ODJINDcxLjAwMlY4Ny4wMjZINDUzLjkzMloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTM3NS44MTkgODcuMDE4N0MzNzQuNjE3IDg3LjAxODcgMzczLjA1NCA4Ni42NTggMzcxLjQ5MiA4NS4wOTUzTDM2Ni4yMDIgNzkuODA2MkMzNjUuMTIgNzguNjA0MSAzNjQuNjQgNzcuMDQxNCAzNjQuNjQgNzUuNTk4OVY0Mi42NjE5QzM2NC42NCA0MC45NzkgMzY1LjI0MSAzOS41MzY1IDM2Ni4yMDIgMzguNDU0N0wzNzEuNDkyIDMzLjE2NTVDMzcyLjkzNCAzMS43MjMgMzc0LjQ5NyAzMS4yNDIyIDM3NS44MTkgMzEuMjQyMkg0MTAuNjhDNDEyLjM2MyAzMS4yNDIyIDQxMy42ODUgMzEuODQzMiA0MTQuODg3IDMzLjA0NTNMNDIwLjI5NiAzOC4zMzQ0QzQyMS42MTkgMzkuNjU2NyA0MjIuMSA0MC45NzkgNDIyLjEgNDIuNjYxOVY3NS41OTg5QzQyMi4xIDc3LjI4MTggNDIxLjYxOSA3OC42MDQxIDQyMC4yOTYgNzkuOTI2NEw0MTQuODg3IDg1LjIxNTVDNDEzLjY4NSA4Ni40MTc2IDQxMi4zNjMgODcuMDE4NyA0MTAuNjggODcuMDE4N0gzNzUuODE5Wk0zNzUuOTM5IDc2LjgwMUg0MTAuOFY0MS40NTk5SDM3NS45MzlWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzQ5LjY0NCAzOC40NTYxQzM1MC44NDYgMzkuNzc4NCAzNTEuNDQ3IDQxLjEwMDcgMzUxLjQ0NyA0Mi43ODM2Vjc1LjYwMDRDMzUxLjQ0NyA3Ny4yODMzIDM1MC44NDYgNzguNjA1NiAzNDkuNjQ0IDc5LjkyNzlMMzQ0LjIzNCA4NS4yMTdDMzQzLjAzMiA4Ni41MzkzIDM0MS40NyA4Ny4wMjAxIDMzOS45MDcgODcuMDIwMUgzMTQuOTAzQzMxMi42MTkgODcuMDIwMSAzMTEuMjk3IDg2LjQxOTEgMzA5LjQ5NCA4NC40OTU4TDMwNi4xMjggODAuODg5NVY4Ny4wMjAxSDI5NC45NDlWNkgzMDYuMTI4VjM3LjM3NDNMMzA5LjQ5NCAzMy44ODgyQzMxMS40MTcgMzEuODQ0NyAzMTIuNjE5IDMxLjM2MzkgMzE0LjkwMyAzMS4zNjM5SDMzOS45MDdDMzQxLjU5IDMxLjM2MzkgMzQzLjAzMiAzMS44NDQ3IDM0NC4yMzQgMzMuMDQ2OEwzNDkuNjQ0IDM4LjQ1NjFaTTM0MC4xNDcgNzYuODAyNVY0MS40NjEzSDMwNi4xMjhWNzYuODAyNUgzNDAuMTQ3WiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMjc2LjUxMiAzOC40NTYxQzI3Ny43MTQgMzkuNzc4NCAyNzguMzE1IDQxLjEwMDcgMjc4LjMxNSA0Mi43ODM2Vjg3LjAyMDFIMjY3LjAxNlY0MS40NjEzSDIzMi44NzZWODcuMDIwMUgyMjEuNjk3VjZIMjMyLjg3NlYzNy40OTQ1TDIzNi4zNjIgMzMuODg4MkMyMzguNDA2IDMxLjg0NDcgMjM5LjQ4OCAzMS4zNjM5IDI0MS43NzIgMzEuMzYzOUgyNjYuNzc1QzI2OC40NTggMzEuMzYzOSAyNjkuOTAxIDMxLjg0NDcgMjcxLjEwMyAzMy4wNDY4TDI3Ni41MTIgMzguNDU2MVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTE2MC4wNTUgODcuMDE4N0MxNTguODUzIDg3LjAxODcgMTU3LjI5IDg2LjY1OCAxNTUuNzI3IDg1LjA5NTNMMTUwLjQzOCA3OS44MDYyQzE0OS4zNTYgNzguNjA0MSAxNDguODc1IDc3LjA0MTQgMTQ4Ljg3NSA3NS41OTg5VjQyLjY2MTlDMTQ4Ljg3NSA0MC45NzkgMTQ5LjQ3NyAzOS41MzY1IDE1MC40MzggMzguNDU0N0wxNTUuNzI3IDMzLjE2NTVDMTU3LjE3IDMxLjcyMyAxNTguNzMzIDMxLjI0MjIgMTYwLjA1NSAzMS4yNDIySDE5NC45MTZDMTk2LjU5OCAzMS4yNDIyIDE5Ny45MjEgMzEuODQzMiAxOTkuMTIzIDMzLjA0NTNMMjA0LjUzMiAzOC4zMzQ0QzIwNS44NTUgMzkuNjU2NyAyMDYuMzM1IDQwLjk3OSAyMDYuMzM1IDQyLjY2MTlWNzUuNTk4OUMyMDYuMzM1IDc3LjI4MTggMjA1Ljg1NSA3OC42MDQxIDIwNC41MzIgNzkuOTI2NEwxOTkuMTIzIDg1LjIxNTVDMTk3LjkyMSA4Ni40MTc2IDE5Ni41OTggODcuMDE4NyAxOTQuOTE2IDg3LjAxODdIMTYwLjA1NVpNMTYwLjE3NSA3Ni44MDFIMTk1LjAzNlY0MS40NTk5SDE2MC4xNzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNODguOTE0OCA4Ny4wMTg3Qzg3LjcxMjcgODcuMDE4NyA4Ni4xNSA4Ni42NTggODQuNTg3MyA4NS4wOTUzTDc5LjI5ODEgNzkuODA2MkM3OC4yMTYyIDc4LjYwNDEgNzcuNzM1NCA3Ny4wNDE0IDc3LjczNTQgNzUuNTk4OVY0Mi42NjE5Qzc3LjczNTQgNDAuOTc5IDc4LjMzNjQgMzkuNTM2NSA3OS4yOTgxIDM4LjQ1NDdMODQuNTg3MyAzMy4xNjU1Qzg2LjAyOTggMzEuNzIzIDg3LjU5MjUgMzEuMjQyMiA4OC45MTQ4IDMxLjI0MjJIMTIzLjc3NUMxMjUuNDU4IDMxLjI0MjIgMTI2Ljc4MSAzMS44NDMyIDEyNy45ODMgMzMuMDQ1M0wxMzMuMzkyIDM4LjMzNDRDMTM0LjcxNCAzOS42NTY3IDEzNS4xOTUgNDAuOTc5IDEzNS4xOTUgNDIuNjYxOVY3NS41OTg5QzEzNS4xOTUgNzcuMjgxOCAxMzQuNzE0IDc4LjYwNDEgMTMzLjM5MiA3OS45MjY0TDEyNy45ODMgODUuMjE1NUMxMjYuNzgxIDg2LjQxNzYgMTI1LjQ1OCA4Ny4wMTg3IDEyMy43NzUgODcuMDE4N0g4OC45MTQ4Wk04OS4wMzUgNzYuODAxSDEyMy44OTZWNDEuNDU5OUg4OS4wMzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNNTEuMTk4NiA2SDYyLjM3OFY4Ny4wMjAxSDUxLjE5ODZWODAuODg5NUw0Ny44MzI3IDg0LjQ5NThDNDYuMDI5NiA4Ni40MTkxIDQ0LjcwNzMgODcuMDIwMSA0Mi40MjMzIDg3LjAyMDFIMTcuNDE5OUMxNS44NTcxIDg3LjAyMDEgMTQuMjk0NCA4Ni41MzkzIDEzLjA5MjMgODUuMjE3TDcuODAzMTQgNzkuOTI3OUM2LjQ4MDg0IDc4LjYwNTYgNiA3Ny4yODMzIDYgNzUuNjAwNFY0Mi43ODM2QzYgNDEuMTAwNyA2LjQ4MDg0IDM5Ljc3ODQgNy44MDMxNCAzOC40NTYxTDEzLjA5MjMgMzMuMDQ2OEMxNC4yOTQ0IDMxLjg0NDcgMTUuNzM2OSAzMS4zNjM5IDE3LjQxOTkgMzEuMzYzOUg0Mi40MjMzQzQ0LjcwNzMgMzEuMzYzOSA0NS45MDk0IDMxLjg0NDcgNDcuODMyNyAzMy44ODgyTDUxLjE5ODYgMzcuMzc0M1Y2Wk0xNy4xNzk0IDc2LjgwMjVINTEuMTk4NlY0MS40NjEzSDE3LjE3OTRWNzYuODAyNVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTIxLjgzMyA1OC4xNTYySDI3LjQyMTNWNjMuNzQ0NUgyMS44MzNWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTMxLjE0NiA1OC4xNTYySDM2LjczNDNWNjMuNzQ0NUgzMS4xNDZWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTQwLjQ1ODUgNTguMTU2Mkg0Ni4wNDY4VjYzLjc0NDVINDAuNDU4NVY1OC4xNTYyWiIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzg3LjA4MiIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iNDAwLjcxMyIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzkzLjE5MiIgY3k9IjkuOTE4MjgiIHJ4PSIzLjcwNTQxIiByeT0iMy43MDUzOSIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzgwLjIyNCAyOS4zNjkxQzM4MC4yMjQgMjguMTAyNCAzODEuNTUxIDI3LjAzMjQgMzgzLjkxMyAyNi4xMzY2QzM4Ni4yNzUgMjUuMjQwOSAzODkuNDc5IDI0LjczNzcgMzkyLjgxOSAyNC43Mzc3QzM5Ni4xNiAyNC43Mzc3IDM5OS4zNjMgMjUuMjQwOSA0MDEuNzI1IDI2LjEzNjZDNDA0LjA4OCAyNy4wMzI0IDQwNS4yMzQgMjguMTAyNCA0MDUuMjM0IDI5LjM2OTFIMzkyLjcyOUgzODAuMjI0WiIgZmlsbD0iIzI4MDBGRiIvPgo8cmVjdCB4PSIzOTEuMzQiIHk9IjEwLjg0MzgiIHdpZHRoPSIzLjcwNTQxIiBoZWlnaHQ9IjE1Ljc0NzkiIGZpbGw9IiMyODAwRkYiLz4KPC9zdmc+Cg==',\r\n appHeaderLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjYzIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDY2MyAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc0XzE1NDYpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYpIi8+CjwvZz4KPHBhdGggZD0iTTYzMi40MzggNTguMDA3OEg2NDkuODY3VjY3LjYyNEg2MzIuNDM4VjEwMy40NDZINjUwLjIyOVYxMTMuNzg0SDYzMy4xNThDNjMxLjQ3NiAxMTMuNzg0IDYzMC41MTQgMTEzLjE4MiA2MjkuMzEyIDExMS45OEw2MjIuOTQgMTA2LjU3MUM2MjEuNzM5IDEwNS4zNjkgNjIxLjEzOCAxMDQuMDQ3IDYyMS4xMzggMTAyLjI0NFY2Ny42MjRINjEyLjg0NFY1OS4yMDlMNjI4LjM1MSA0MS43NzkzSDYzMi40MzhWNTguMDA3OFpNMjQxLjYwNCAxMTMuNzc4SDIzMC40MjVWMTA3LjY0N0wyMjcuMDYgMTExLjI1NEMyMjUuMjU2IDExMy4xNzcgMjIzLjkzMyAxMTMuNzc4IDIyMS42NDkgMTEzLjc3OEgxOTYuNjQ2QzE5NS4wODQgMTEzLjc3OCAxOTMuNTIxIDExMy4yOTcgMTkyLjMxOSAxMTEuOTc1TDE4Ny4wMjkgMTA2LjY4NkMxODUuNzA3IDEwNS4zNjMgMTg1LjIyNyAxMDQuMDQxIDE4NS4yMjcgMTAyLjM1OFY2OS41NDFDMTg1LjIyNyA2Ny44NTg0IDE4NS43MDcgNjYuNTM2IDE4Ny4wMjkgNjUuMjEzOUwxOTIuMzE5IDU5LjgwNDdDMTkzLjUyMSA1OC42MDI3IDE5NC45NjQgNTguMTIyMSAxOTYuNjQ2IDU4LjEyMjFIMjIxLjY0OUMyMjMuOTMzIDU4LjEyMjEgMjI1LjEzNiA1OC42MDMgMjI3LjA2IDYwLjY0NjVMMjMwLjQyNSA2NC4xMzE4VjMyLjc1NzhIMjQxLjYwNFYxMTMuNzc4Wk00MTIuMTAzIDY0LjI1Mkw0MTUuNTg5IDYwLjY0NjVDNDE3LjYzMiA1OC42MDMgNDE4LjcxNCA1OC4xMjIxIDQyMC45OTggNTguMTIyMUg0NDYuMDAyQzQ0Ny42ODUgNTguMTIyMSA0NDkuMTI3IDU4LjYwMjcgNDUwLjMyOSA1OS44MDQ3TDQ1NS43MzggNjUuMjEzOUM0NTYuOTQgNjYuNTM2IDQ1Ny41NDIgNjcuODU4MyA0NTcuNTQyIDY5LjU0MVYxMTMuNzc4SDQ0Ni4yNDJWNjguMjE4OEg0MTIuMTAzVjExMy43NzhINDAwLjkyNFYzMi43NTc4SDQxMi4xMDNWNjQuMjUyWk00ODUuMzU0IDY0LjEzMThMNDg4LjcyMSA2MC42NDY1QzQ5MC42NDQgNTguNjAzIDQ5MS44NDYgNTguMTIyMSA0OTQuMTMgNTguMTIyMUg1MTkuMTM0QzUyMC44MTcgNTguMTIyMSA1MjIuMjU5IDU4LjYwMjcgNTIzLjQ2MSA1OS44MDQ3TDUyOC44NyA2NS4yMTM5QzUzMC4wNzIgNjYuNTM2IDUzMC42NzQgNjcuODU4MyA1MzAuNjc0IDY5LjU0MVYxMDIuMzU4QzUzMC42NzQgMTA0LjA0MSA1MzAuMDcyIDEwNS4zNjMgNTI4Ljg3IDEwNi42ODZMNTIzLjQ2MSAxMTEuOTc1QzUyMi4yNTkgMTEzLjI5NyA1MjAuNjk2IDExMy43NzggNTE5LjEzNCAxMTMuNzc4SDQ5NC4xM0M0OTEuODQ2IDExMy43NzggNDkwLjUyNCAxMTMuMTc3IDQ4OC43MjEgMTExLjI1NEw0ODUuMzU0IDEwNy42NDdWMTEzLjc3OEg0NzQuMTc2VjMyLjc1NzhINDg1LjM1NFY2NC4xMzE4Wk0zMDMuMDAyIDU4QzMwNC42ODUgNTggMzA2LjAwNyA1OC42MDA5IDMwNy4yMDkgNTkuODAyN0wzMTIuNjE5IDY1LjA5MThDMzEzLjk0MSA2Ni40MTQxIDMxNC40MjIgNjcuNzM3IDMxNC40MjIgNjkuNDE5OVYxMDIuMzU2QzMxNC40MjIgMTA0LjAzOSAzMTMuOTQxIDEwNS4zNjIgMzEyLjYxOSAxMDYuNjg1TDMwNy4yMDkgMTExLjk3NEMzMDYuMDA3IDExMy4xNzYgMzA0LjY4NSAxMTMuNzc2IDMwMy4wMDIgMTEzLjc3NkgyNjguMTQyQzI2Ni45NCAxMTMuNzc2IDI2NS4zNzYgMTEzLjQxNiAyNjMuODEzIDExMS44NTRMMjU4LjUyNCAxMDYuNTY0QzI1Ny40NDMgMTA1LjM2MiAyNTYuOTYyIDEwMy43OTkgMjU2Ljk2MiAxMDIuMzU2VjY5LjQxOTlDMjU2Ljk2MiA2Ny43MzcyIDI1Ny41NjMgNjYuMjk0NyAyNTguNTI0IDY1LjIxMjlMMjYzLjgxMyA1OS45MjI5QzI2NS4yNTYgNTguNDgwNCAyNjYuODE5IDU4IDI2OC4xNDIgNThIMzAzLjAwMlpNMzc0LjE0MyA1OEMzNzUuODI1IDU4LjAwMDEgMzc3LjE0OCA1OC42MDA4IDM3OC4zNSA1OS44MDI3TDM4My43NTkgNjUuMDkxOEMzODUuMDgxIDY2LjQxNDEgMzg1LjU2MiA2Ny43MzcgMzg1LjU2MiA2OS40MTk5VjEwMi4zNTZDMzg1LjU2MiAxMDQuMDM5IDM4NS4wODEgMTA1LjM2MiAzODMuNzU5IDEwNi42ODVMMzc4LjM1IDExMS45NzRDMzc3LjE0OCAxMTMuMTc2IDM3NS44MjUgMTEzLjc3NiAzNzQuMTQzIDExMy43NzZIMzM5LjI4MUMzMzguMDc5IDExMy43NzYgMzM2LjUxNyAxMTMuNDE2IDMzNC45NTQgMTExLjg1NEwzMjkuNjY1IDEwNi41NjRDMzI4LjU4MyAxMDUuMzYyIDMyOC4xMDMgMTAzLjc5OSAzMjguMTAzIDEwMi4zNTZWNjkuNDE5OUMzMjguMTAzIDY3LjczNzEgMzI4LjcwMyA2Ni4yOTQ4IDMyOS42NjUgNjUuMjEyOUwzMzQuOTU0IDU5LjkyMjlDMzM2LjM5NiA1OC40ODA3IDMzNy45NTkgNTguMDAwMSAzMzkuMjgxIDU4SDM3NC4xNDNaTTU4OS45MDYgNThDNTkxLjU4OSA1OCA1OTIuOTExIDU4LjYwMDkgNTk0LjExMyA1OS44MDI3TDU5OS41MjMgNjUuMDkxOEM2MDAuODQ2IDY2LjQxNDEgNjAxLjMyNiA2Ny43MzcgNjAxLjMyNiA2OS40MTk5VjEwMi4zNTZDNjAxLjMyNiAxMDQuMDM5IDYwMC44NDYgMTA1LjM2MiA1OTkuNTIzIDEwNi42ODVMNTk0LjExMyAxMTEuOTc0QzU5Mi45MTEgMTEzLjE3NiA1OTEuNTg5IDExMy43NzYgNTg5LjkwNiAxMTMuNzc2SDU1NS4wNDZDNTUzLjg0NCAxMTMuNzc2IDU1Mi4yOCAxMTMuNDE2IDU1MC43MTggMTExLjg1NEw1NDUuNDI5IDEwNi41NjRDNTQ0LjM0NyAxMDUuMzYyIDU0My44NjYgMTAzLjc5OSA1NDMuODY2IDEwMi4zNTZWNjkuNDE5OUM1NDMuODY2IDY3LjczNzIgNTQ0LjQ2NyA2Ni4yOTQ3IDU0NS40MjkgNjUuMjEyOUw1NTAuNzE4IDU5LjkyMjlDNTUyLjE2IDU4LjQ4MDQgNTUzLjcyNCA1OCA1NTUuMDQ2IDU4SDU4OS45MDZaTTE5Ni40MDYgMTAzLjU2MUgyMzAuNDI1VjY4LjIxODhIMTk2LjQwNlYxMDMuNTYxWk00ODUuMzU0IDEwMy41NjFINTE5LjM3NFY2OC4yMTg4SDQ4NS4zNTRWMTAzLjU2MVpNMjY4LjI2MiAxMDMuNTU5SDMwMy4xMjJWNjguMjE3OEgyNjguMjYyVjEwMy41NTlaTTMzOS40MDEgMTAzLjU1OUgzNzQuMjYzVjY4LjIxNzhIMzM5LjQwMVYxMDMuNTU5Wk01NTUuMTY2IDEwMy41NTlINTkwLjAyNlY2OC4yMTc4SDU1NS4xNjZWMTAzLjU1OVpNMjA2LjY0NyA5MC41MDJIMjAxLjA2Vjg0LjkxNDFIMjA2LjY0N1Y5MC41MDJaTTIxNS45NjEgOTAuNTAySDIxMC4zNzNWODQuOTE0MUgyMTUuOTYxVjkwLjUwMlpNMjI1LjI3MyA5MC41MDJIMjE5LjY4NlY4NC45MTQxSDIyNS4yNzNWOTAuNTAyWk01NjYuMzA5IDgyLjExODJDNTY4LjQ2IDgyLjExODIgNTcwLjIwNCA4My44NjI2IDU3MC4yMDQgODYuMDEzN0M1NzAuMjA0IDg4LjE2NDYgNTY4LjQ2IDg5LjkwODIgNTY2LjMwOSA4OS45MDgyQzU2NC4xNTggODkuOTA4MSA1NjIuNDE0IDg4LjE2NDUgNTYyLjQxNCA4Ni4wMTM3QzU2Mi40MTQgODMuODYyNyA1NjQuMTU4IDgyLjExODMgNTY2LjMwOSA4Mi4xMTgyWk01NzkuOTM5IDgyLjExODJDNTgyLjA5MSA4Mi4xMTgyIDU4My44MzQgODMuODYyNiA1ODMuODM0IDg2LjAxMzdDNTgzLjgzNCA4OC4xNjQ2IDU4Mi4wOSA4OS45MDgyIDU3OS45MzkgODkuOTA4MkM1NzcuNzg4IDg5LjkwODIgNTc2LjA0NSA4OC4xNjQ2IDU3Ni4wNDUgODYuMDEzN0M1NzYuMDQ1IDgzLjg2MjYgNTc3Ljc4OCA4Mi4xMTgyIDU3OS45MzkgODIuMTE4MlpNNTcyLjQxOSAzMi45NzA3QzU3NC40NjUgMzIuOTcwNyA1NzYuMTI0IDM0LjYyOTUgNTc2LjEyNCAzNi42NzU4QzU3Ni4xMjQgMzguMDQ3IDU3NS4zNzkgMzkuMjQzIDU3NC4yNzEgMzkuODgzOFY1MS41NzIzQzU3Ni43ODUgNTEuNzQzNCA1NzkuMTIxIDUyLjIwMDMgNTgwLjk1MiA1Mi44OTQ1QzU4My4zMTQgNTMuNzkwMiA1ODQuNDYxIDU0Ljg2MDQgNTg0LjQ2MSA1Ni4xMjdINTU5LjQ1QzU1OS40NTEgNTQuODYwNCA1NjAuNzc4IDUzLjc5MDIgNTYzLjE0IDUyLjg5NDVDNTY1LjE1IDUyLjEzMjEgNTY3Ljc3MSA1MS42NTU2IDU3MC41NjYgNTEuNTMwM1YzOS44ODQ4QzU2OS40NTkgMzkuMjQ0IDU2OC43MTQgMzguMDQ3MiA1NjguNzE0IDM2LjY3NThDNTY4LjcxNCAzNC42Mjk1IDU3MC4zNzMgMzIuOTcwNyA1NzIuNDE5IDMyLjk3MDdaIiBmaWxsPSIjMjgwMEZGIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iNi4wMDMwNiIgeTE9IjYiIHgyPSIxNDIuOTcyIiB5Mj0iMTQzLjIyNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iMTQzLjIyNyIgeTE9Ijc2LjgwNDYiIHgyPSIyNi4wMDEiIHkyPSIxMjIuOTY0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYiIHgxPSI1OC4yNTQxIiB5MT0iNTguMTY3IiB4Mj0iNTMuOTExNyIgeTI9IjEzMi45NTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMzc0XzE1NDYiPgo8cGF0aCBkPSJNNiA2SDExMy4yMjdDMTI5Ljc5NSA2IDE0My4yMjcgMTkuNDMxNSAxNDMuMjI3IDM2VjExMi45NzVDMTQzLjIyNyAxMjkuNTQ0IDEyOS43OTUgMTQyLjk3NSAxMTMuMjI3IDE0Mi45NzVINlY2WiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',\r\n userAvatar:\r\n 'data:image/png;base64,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',\r\n botAvatar:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMMAAADDCAYAAAA/f6WqAAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAyeSURBVHgB7d09bBzHFQfw95Y6HuOKKlPlBFiF4QChAAFxp1MhSqlEwaKQjnSRQFQKUWUqU2UqkUACUkihUxdINHTqSCaAzlUCxICoIrCLGFp36UwXge9zX2b29hSJuo+Z/brb3f8PMEzw9iTa3Hf7Zt6bGSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYjAly5drN21VhZ41IKuTJK5njl0dPdh8TTIRgyIlrv75dkR4/Ul9W33+Vj7nj3Tio77kEIzkEuaAC4QUNDQT/1SUpOc8IxkIw5MCV1dvr6l+V8VfJ0vKtjTWCkRAMOcDC182ukxsEIyEYcoCZFg2v/AXBSAgGgACCASCAYAAIIBgAAii6ZUh1ZXNxgZrvDZalNKrY9h6XO3L59DebtHDSqG+fUMEhGGacDoD5+fZdEtlUvyzDWaNQXGGutdvzO0UNDATDDAtaLHRluULpcVud8oUiBgTGDDPM69IWpRsIWqVcahWydQNPhhkVPBVe05R41L3w16d/PqYCwZNhRnkdXqKpmpvy358+BMOMYu5VaIpYUk/Ppg7BMKOYnKmmKEzykgrmDEEi/BVnQivk+B2lleDbrrrLjoWoPmn1WbO7cDxfap0kPJ06inu4//A5FQwG0DHTdYHyfOsR6UAYzy+AjVt9tvzpxgo7lPrMDjOtHxRwqegcQWz0DNAc9/6uvvzE4PJFmuPN8z//pfvvf/3z1bALvv36q2/Of3zxO3V7LlEKTwj1xDpRY4XfHz7dfUgFhCdDTPwnQqml8+wK2TlR05iXx01j6iCjHlW9EYNaZl4z/HtPRGRn2AsOk9vsLNSL3JaBMUNM+i0ToWZgFh0q6d6iC6MuOPiLn0rVRr1+dXXjEhkGw9H+3hbBUJhNioH+5GaRLQpNlvSAm2CqEAwx6PWMOkbHEubPCaYKaVIMHOI4dp2o6nHHLObseveN4L+xokYo+ufT+zDdz9s+THgyROQPbin6k0Ern2mt0wzRwanGIy9UIAzWS1R0Sqf+WZcSv75263e52noGwRCRdGiT4sJktOVLaCKuzeXzZ5rbNCbQRbxansY6CIaoHI7zBq6Gurk8eWV0HTsuGfInBXhy+pensQ6CIYLgxq1QjLwQKReXaFsXzCZep/J8MiRdb1IFfcAf61AOIBgiUDfuOsVMfRrfJUu6DqEqx2NvdDX1azXgFXKMb/Bh67KzCMEQBXMSOf5imFTpcH93W93wl0Xo3Uq2SEN//wDFtonQjhFSMN34yPByfzqSTFMgpvrhk93Q+6LqtKVU+m9lrjN3Yvo0eOdch74KmaeAjTdfqfEL92g7i9OuCIaQ9JQjGef3XGPxHqvB5guz6+mk1SmfS6PmEPRU6c7YKsWI2Vk/ePKnTHW+Ik0Kwba2oANBr08wGeQGFtOqOUyaPg0ri9OuCIYQLNsvXJWvN/SnPHti/kmZdM2B+qmRyfRpWFmbdkUwhMBiMePjyZsVY6zGAmQu8SlLmbwAKapMTbsiGCxdWb2zpG5q450j9GBy8LV+Qqhb0DV9r0ph4qtuDyGc/IKhLE27Ihgsqfzf/AZV05qnZ1XUp7FxqpRkCuP/+UKJD9D1Pq6UEQgGS+oGvWR8rcO1099rdxe2yVwlyUGoZdoWxnGWVs4hGCzoBfpk037Rli9Pfyu4ORpkKMm8vp+2mf8stlSx7x5lCILBBovFjcm1kYUn6Zlvw+LwWpKDUFXPuCFE8e/RJHQvCLbMQDAYMu3ifEN6I1OQVveDml3N4Ufj1MyWflIdPd29wCSfqRu43m/nENfi56P+pIB6j36vJzvckXO6PYQyBhVoQ5btF+7h091z4y5Yvnm7ZhFcDfXnXaYUqZ9viw3rBPrmz8OqNzwZDNkt7eTGpCucMbtdDJGbNulZhmAwYNt+4VFnZ9I1Op+2SUWSrjmcxuQZ/2x5WQuNDQHG8Ds5Hb7r9ahqkU+6xuca6A29TFMRdZ3eH0kVymqOmqVK+gbUGx+LyYWqlkI5gWA4RQeA5ziX9Blqord0FLuBlZq73zK9Vj2W9dPBpn+nqgplVSkxXV29UxNPnh99sZtIrUA/ua7e2qhP2jPW416mpk/HwQCaBm3MP6oxgaN/8VWKwHYwadcKPpSrxyg6NYv7pB3/cMVS64W6SYa3n6jp0yzOGo1S2GDwf9FzrSo7pJvuqhQHlTIc7u9ZzfpcvfnbTeK5BxQLPhaW7bjTqGtqJk1ETSDwYOGPk0jwTVvhgmFwboIaC6zFffZBmK3cg8U131P8Gnp8cVTAreXDKkQwDM5SZpF1Su70zBNVCzhLIcSQKo3kbzNPXNcLjLJWEU5bbgfQ744DWlUymhqJgkMPZPXOFcJcpQT0n36yrv78dRV0/sHnTlsFRs62hoxD7p4Mg+lQlQpVUzwCKvJB4urn3kp5ZVgjrWnarMhNMCzfuvO5ng5N/Qw0pnqrXf4sjlblICBMDx6JEdfyuJGwrcwHQ//wcOdZf0PclAgdM8nzZndhO+5+fZ3eLZSaK/3Zm2TGESO44tG9pOoWWZDpYOgHgr/9SoUS5g9EPXmsF8SkNRAdHF8l5KdPFUpBsOFYgwoo08GgKqTPKMHFL/0D/0Q9Bej+tG+QK6u/WWKZ2wxW2lUoOant2TRrMhsMli3VdnS/DUu91fnJ41m8KfwjcZl0GpXMB4EnO4df7KXaGDgLMhsMcc/N66eAI7LT4149K5XVN2lU/OOLQj4dshwMkSsHeSpI+eMnfXBK/7yICkVUxLFDJoMhGDi/prBmPA2Kyu+81dvlM18PPdWcsyY8E8Vr4Va/ZO6qGaH6Q5dySn+iqyna41Kp2VCfdw/CBISQFG5lXfGCgemBlPiB7tVXaVI9b41s/29EbK2pFDD0Da2q0y4VTGbHDMurG9/HVG129XqALI8bkmhE9Kh7IW8t2pNkdwD96e1tNVi0PvJpgsw0ssW5IGmIibt75FFmgyHyIHoyv5Gt3S4/n6VB9uCEHZXTryTVhxVmXUYeZLsCfXNjU48BKHH9k3emlUa9vS47hUbEQj4VtMw36lluxhWVm9R649MSToNGcbmj6gsF7V7NRQv3FNYCUGLrjf00yP9vqVKaVO2l1V24UcSepIHcrGfQYwivS1spNLKdFkvrczAG0r1WVUqTPhp3BhoRZ0Eu10An3sj2vhM1FXk5Sup0dXVDTwZUKA05r8CHlesNARJsZBsm9ObAiXbgBrLYiJi2wmwVk0Ya1eqUz4b5pF2+ufHS5pw4U9gZw05hguFtsTSyDSEi94/297Zs3pNIvQRpUCiF3Gt1cHxT3OuNgyneLZv39J9WFANxWehxEuuyi6KQT4Zh+p/Qcl3N6+sVXhUKyXYdQJSB8zTWZecZgmGIQRoVanxhsWQyqCm8IFvBdKh6CmTqNM1Zh2CYIJimvWuRRhkvmbSsnrsq0rYxDkgOgsFAsDX7a9PBtkmqZL3hsHgrh/sPzU8JBWs4xsqA/0ksFmc3G7SGlNTAncy5CITkIRgMOSQTz2l7y8QDCeM+MBGiQzAYsj2QsHymtT7qtSQOTIToEAw2xOLpwHR91EuqtrBO5ly0T6QDwWBBH0hocXlVT50Oe8Fm/YXNgYkQDYLBwqBybXq9NyQVCgKkQqba8iVBKhAMtqRnPKujngDvbVjg90QZ/13SwEEi6UEwWGp1P6hZXL54OlUKqtpG2OEaQWoQDJaC6m/D9Hq9k8Xga71ugcxTpJNmu4zaQooQDCGIRxZTnbIyqDlY1hbqaLtIF4IhhHavbFNzWNQ1B9vagl6QQ5CqOQJr7jf/aH740cWfqgHAJ0ZvYFrwhH5gYtMWDPdwf+8eQarwZAhJryGwuLzqkMVWNp5grDAFCIaQ+jUHcS3eUjG9kHtUqHMRZgWCIQIRij+vR21hahAMEbS7C7F/gqO2MD0Ihghsaw5G0H4xNQiGqCzaMybjGlKk6UEwRKTbM2zWOYwlvUj7tUI0CIaI+ktCY5kKxdLOKUMwxED9T6xRZFjaOW0IhhgE6xxcioA73n2CqUIwxESf0UChYeA8CxAMMfEPK/EkzMJ9F0+F2YBGvRh9+/VXBx9+dPGscQMf8TF35Fd4KswGBEPMdECc//jid+pG1+ctDN07KTg45A+tbnnjb/U//odgJmB7yQQFGxhXmZ2f+d/wvB/YoeNmZwELdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCH/gcLSoOevknsYwAAAABJRU5ErkJggg==',\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { DoohbotConfig } from './doohbot-config.model';\r\n\r\n/**\r\n * Injection token for Doohbot configuration.\r\n * Used to inject user-provided or default config into services.\r\n */\r\nexport const DOOHBOT_CONFIG = new InjectionToken<DoohbotConfig>('DOOHBOT_CONFIG');\r\n","import { DoohbotConfig } from './doohbot-config.model';\r\n\r\nconst DOOHBOT_API_BASE_URLS: Record<DoohbotConfig['environment'], string> = {\r\n development: 'http://localhost:4000/api/',\r\n test: 'https://api.test.doohbot.com/api/',\r\n stage: 'https://api.stage.doohbot.com/api/',\r\n production: 'https://api.doohbot.com/',\r\n};\r\n\r\nexport function getDefaultDoohbotApiBaseUrl(environment: DoohbotConfig['environment']): string {\r\n return DOOHBOT_API_BASE_URLS[environment];\r\n}\r\n\r\nexport function isDefaultDoohbotApiBaseUrl(\r\n environment: DoohbotConfig['environment'],\r\n baseUrl?: string,\r\n): boolean {\r\n return (baseUrl ?? '') === getDefaultDoohbotApiBaseUrl(environment);\r\n}\r\n","import { DoohbotConfig } from './doohbot-config.model';\r\nimport { getDefaultDoohbotApiBaseUrl } from './doohbot-api-base-url';\r\n\r\n/**\r\n * Default Doohbot configuration values.\r\n * Applied when no user overrides are provided.\r\n */\r\nexport const DEFAULT_DOOHBOT_CONFIG: DoohbotConfig = {\r\n // Runtime environment\r\n environment: 'development',\r\n\r\n // License file\r\n licenseFilePath: undefined,\r\n\r\n // Client-side encryption key (optional, fallback will be used)\r\n storageSecret: undefined,\r\n\r\n // Chat API mode (streaming by default)\r\n useNonStreamingChat: false, // true for non-streaming, false for streaming\r\n\r\n // API integration defaults\r\n api: {\r\n baseUrl: getDefaultDoohbotApiBaseUrl('development'),\r\n apiKey: undefined,\r\n enableRetry: true,\r\n retryAttempts: 2,\r\n retryDelay: 1000,\r\n },\r\n\r\n // Theme / visual customization\r\n theme: {\r\n enableDrag: false,\r\n enableResize: false,\r\n buttonStyle: 'fab',\r\n fontFamily: 'Inter, Roboto, sans-serif',\r\n palette: 'doohbot',\r\n },\r\n};\r\n","import { DoohbotConfig } from './doohbot-config.model';\r\nimport { DEFAULT_DOOHBOT_CONFIG } from './doohbot-config.default';\r\nimport {\r\n getDefaultDoohbotApiBaseUrl,\r\n isDefaultDoohbotApiBaseUrl,\r\n} from './doohbot-api-base-url';\r\n\r\n/**\r\n * Merges user-provided config overrides with defaults.\r\n *\r\n * @param overrides - Partial config to override defaults\r\n * @param baseConfig - Base config to merge into. Defaults to library defaults.\r\n * @returns Fully resolved DoohbotConfig object\r\n */\r\nexport function resolveDoohbotConfig(\r\n overrides: Partial<DoohbotConfig> = {},\r\n baseConfig: DoohbotConfig = DEFAULT_DOOHBOT_CONFIG,\r\n): DoohbotConfig {\r\n const environment = overrides.environment ?? baseConfig.environment;\r\n const environmentDefaultBaseUrl = getDefaultDoohbotApiBaseUrl(environment);\r\n const shouldUseEnvironmentDefaultBaseUrl =\r\n !overrides.api?.baseUrl &&\r\n (!baseConfig.api?.baseUrl ||\r\n isDefaultDoohbotApiBaseUrl(baseConfig.environment, baseConfig.api.baseUrl));\r\n\r\n return {\r\n ...baseConfig,\r\n ...overrides,\r\n environment,\r\n api: {\r\n ...baseConfig.api,\r\n ...overrides.api,\r\n baseUrl: shouldUseEnvironmentDefaultBaseUrl\r\n ? environmentDefaultBaseUrl\r\n : (overrides.api?.baseUrl ?? baseConfig.api?.baseUrl ?? environmentDefaultBaseUrl),\r\n },\r\n auth:\r\n baseConfig.auth?.mode || overrides.auth?.mode\r\n ? {\r\n mode: overrides.auth?.mode ?? baseConfig.auth?.mode!,\r\n ...baseConfig.auth,\r\n ...overrides.auth,\r\n }\r\n : undefined,\r\n theme:\r\n baseConfig.theme || overrides.theme\r\n ? {\r\n ...baseConfig.theme,\r\n ...overrides.theme,\r\n }\r\n : undefined,\r\n };\r\n}\r\n","import { Inject, Injectable, Optional, signal, WritableSignal, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { DoohbotConfig } from './doohbot-config.model';\r\nimport { DOOHBOT_CONFIG } from './doohbot-config.token';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\nimport { DoohbotApiConfig } from '../models/api-config.model';\r\nimport { DoohbotAuthConfig } from '../models/auth-config.model';\r\nimport { resolveDoohbotConfig } from './doohbot-config.resolver';\r\n\r\n/**\r\n * Centralized service for managing Doohbot configuration.\r\n * Provides reactive access and runtime updates.\r\n * Singleton via providedIn: 'root'.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DoohbotConfigService implements OnDestroy {\r\n // Use DoohbotConfig for type-safe signal\r\n private configSignal: WritableSignal<DoohbotConfig>;\r\n\r\n // Legacy Observable support\r\n private readonly configSubject: BehaviorSubject<DoohbotConfig>;\r\n public readonly config$: Observable<DoohbotConfig>;\r\n\r\n /**\r\n * Current runtime environment for Doohbot.\r\n *\r\n * Drives environment-specific behavior such as:\r\n * - API behavior\r\n * - logging verbosity\r\n * - feature toggles\r\n * - safety defaults\r\n *\r\n * This value is mandatory and always resolved during bootstrap.\r\n */\r\n readonly environment = (): DoohbotConfig['environment'] => this.configSignal().environment;\r\n\r\n /**\r\n * Path to the public license file.\r\n * Returns an empty string if not configured.\r\n */\r\n readonly licenseFilePath = (): string => this.configSignal().licenseFilePath ?? '';\r\n\r\n /**\r\n * Secret used for encrypting persisted client-side data.\r\n * If not provided, default will be used.\r\n */\r\n readonly storageSecret = (): string => this.configSignal().storageSecret ?? '';\r\n\r\n /**\r\n * Chats use the `streaming` by default.\r\n * Pass `true` to use normal http calls for chat.\r\n */\r\n readonly useNonStreamingChat = (): boolean => this.configSignal().useNonStreamingChat ?? false;\r\n\r\n /**\r\n * Full API configuration object.\r\n * Undefined if API integration is not configured.\r\n */\r\n readonly api = (): DoohbotApiConfig | undefined => this.configSignal().api;\r\n\r\n /**\r\n * Authentication configuration object.\r\n * Undefined if authentication is not configured.\r\n */\r\n readonly auth = (): DoohbotAuthConfig | undefined => this.configSignal().auth;\r\n\r\n /**\r\n * Theme customization configuration.\r\n * Undefined if no theme overrides are provided.\r\n */\r\n readonly theme = (): DoohbotThemeConfig | undefined => this.configSignal().theme;\r\n\r\n constructor(\r\n @Optional()\r\n @Inject(DOOHBOT_CONFIG)\r\n injectedConfig: Partial<DoohbotConfig> = {},\r\n ) {\r\n const mergedConfig = resolveDoohbotConfig(injectedConfig);\r\n\r\n this.validateConfig(mergedConfig);\r\n\r\n // Initialize state\r\n this.configSignal = signal(mergedConfig);\r\n this.configSubject = new BehaviorSubject<DoohbotConfig>(mergedConfig);\r\n this.config$ = this.configSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Update configuration at runtime.\r\n * @param value Partial config updates\r\n */\r\n update(value: Partial<DoohbotConfig>): void {\r\n if ('environment' in value) {\r\n throw new Error('environment cannot be changed at runtime');\r\n }\r\n\r\n const newConfig = resolveDoohbotConfig(value, this.configSignal());\r\n this.validateConfig(newConfig);\r\n\r\n this.configSignal.set(newConfig);\r\n this.configSubject.next(newConfig);\r\n }\r\n\r\n private validateConfig(config: DoohbotConfig): void {\r\n // environment\r\n if (!config.environment) {\r\n throw new Error('environment is required');\r\n }\r\n\r\n // license\r\n if (config.licenseFilePath && typeof config.licenseFilePath !== 'string') {\r\n throw new Error('licenseFilePath must be a string');\r\n }\r\n\r\n // API config\r\n if (config.api) {\r\n const api = config.api;\r\n\r\n if (!api.baseUrl) {\r\n throw new Error('api.baseUrl is required when api config is provided');\r\n }\r\n\r\n if (api.retryAttempts !== undefined && api.retryAttempts < 0) {\r\n throw new Error('api.retryAttempts must be >= 0');\r\n }\r\n\r\n if (api.retryDelay !== undefined && api.retryDelay < 0) {\r\n throw new Error('api.retryDelay must be >= 0');\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.configSubject.complete();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class Logger {\r\n private static instance: Logger | null = null;\r\n\r\n private prefix = '[Doohbot] ======> ';\r\n\r\n private styles = {\r\n info: 'color:#0995e6; font-weight:500',\r\n warn: 'color:#ff9800; font-weight:600',\r\n error: 'color:#f44336; font-weight:700',\r\n };\r\n\r\n constructor(private configService: DoohbotConfigService) {\r\n Logger.instance = this;\r\n }\r\n\r\n /** bind once */\r\n static init(instance: Logger): void {\r\n Logger.instance = instance;\r\n this.info('[Logger]: has been initialized!!!');\r\n }\r\n\r\n // internal guard\r\n private canLog(): boolean {\r\n return this.configService.environment() !== 'production';\r\n }\r\n\r\n // instance methods\r\n info(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return;\r\n try {\r\n console.info(`%c${this.prefix} ${message}`, this.styles.info, ...args);\r\n } catch {\r\n console.info(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n warn(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return;\r\n try {\r\n console.warn(`%c${this.prefix} ${message}`, this.styles.warn, ...args);\r\n } catch {\r\n console.warn(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n error(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return;\r\n try {\r\n console.error(`%c${this.prefix} ${message}`, this.styles.error, ...args);\r\n } catch {\r\n console.error(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n // static facade\r\n private static get logger(): Logger {\r\n if (!Logger.instance) {\r\n // Consider a graceful fallback or a queue-based logger.\r\n throw new Error(\r\n 'LoggerService not initialized. Instantiate LoggerService during app bootstrap.',\r\n );\r\n }\r\n return Logger.instance;\r\n }\r\n\r\n static info(message: string, ...args: unknown[]): void {\r\n Logger.logger.info(message, ...args);\r\n }\r\n\r\n static warn(message: string, ...args: unknown[]): void {\r\n Logger.logger.warn(message, ...args);\r\n }\r\n\r\n static error(message: string, ...args: unknown[]): void {\r\n Logger.logger.error(message, ...args);\r\n }\r\n}\r\n","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { delay, retry, map, catchError, of, firstValueFrom } from 'rxjs';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpService {\r\n constructor(\r\n private http: HttpClient,\r\n private configService: DoohbotConfigService,\r\n ) {}\r\n\r\n get apiUrl(): string {\r\n const apiBaseUrl = this.configService.api()?.baseUrl ?? '';\r\n Logger.info('HttpService: Initialized apiUrl', apiBaseUrl);\r\n return apiBaseUrl;\r\n }\r\n\r\n async get(\r\n url: string,\r\n param?: object,\r\n nestedParam = false,\r\n showLoader = false,\r\n refresh = true,\r\n headers?: HttpHeaders,\r\n ): Promise<any> {\r\n // Build Params\r\n const params = (nestedParam ? this.buildHttpParams({}, param, '') : param) as HttpParams;\r\n\r\n Logger.info('HttpService: get()', url, params, headers);\r\n return await firstValueFrom(\r\n this.http\r\n .get(`${this.apiUrl}${url}`, {\r\n params: params,\r\n // withCredentials: true,\r\n headers,\r\n })\r\n .pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n // This prevents callers from using try/catch effectively. Consider re-throwing or using an error wrapper.\r\n Logger.info('HttpService: get() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n private buildHttpParams(params: any, data: any, currentPath: string) {\r\n Object.keys(data).forEach((key) => {\r\n if (data[key] instanceof Object && !(data[key] instanceof Array)) {\r\n this.buildHttpParams(params, data[key], `${currentPath}${key}.`);\r\n } else {\r\n params[`${currentPath}${key}`] = data[key];\r\n }\r\n });\r\n }\r\n\r\n async post(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n Logger.info('HttpService: post()', url, param, headers);\r\n // This casting might lead to runtime errors if the backend expects application/json.\r\n return await firstValueFrom(\r\n this.http.post(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info('HttpService: post() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n async patch(\r\n url: string,\r\n param?: object,\r\n showLoader = false,\r\n headers?: HttpHeaders,\r\n ): Promise<any> {\r\n Logger.info('HttpService: patch()', url, param, headers);\r\n return await firstValueFrom(\r\n this.http.patch(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info('HttpService: patch() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n async put(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n Logger.info('HttpService: put()', url, param, headers);\r\n return await firstValueFrom(\r\n this.http.put(`${this.apiUrl}${url}`, param, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info('HttpService: put() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n async delete(\r\n url: string,\r\n param?: object,\r\n showLoader = false,\r\n headers?: HttpHeaders,\r\n ): Promise<any> {\r\n let params = {};\r\n params = param as HttpParams;\r\n\r\n Logger.info('HttpService: delete()', url, param, headers);\r\n return await firstValueFrom(\r\n this.http.delete(`${this.apiUrl}${url}`, { body: param, headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info('HttpService: delete() catchError()', error);\r\n return of(error);\r\n }),\r\n ),\r\n );\r\n }\r\n}\r\n","import { Logger } from './../utils/logger.service';\r\nimport { Injectable, NgZone } from '@angular/core';\r\nimport { HttpClient, HttpEventType, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { ChatStreamResponse } from '../../app/chat/model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpStreamService {\r\n constructor(\r\n private ngZone: NgZone,\r\n private http: HttpClient,\r\n ) {}\r\n\r\n /**\r\n * Creates a POST-based HTTP streaming connection using fetch()\r\n */\r\n createHttpStream(\r\n url: string,\r\n body: any,\r\n headers?: Record<string, string>,\r\n ): Observable<ChatStreamResponse> {\r\n // but ensures the manual line-splitting logic handles all UTF-8 characters and multi-line data correctly.\r\n return new Observable<ChatStreamResponse>((observer) => {\r\n // Note: Authorization header is added automatically by AuthInterceptor\r\n let requestHeaders = new HttpHeaders({\r\n 'content-type': 'application/json',\r\n accept: 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n });\r\n\r\n if (headers) {\r\n Object.keys(headers).forEach((key) => {\r\n requestHeaders = requestHeaders.set(key, headers[key]);\r\n });\r\n }\r\n\r\n const req = this.http.request('POST', url, {\r\n body,\r\n headers: requestHeaders,\r\n reportProgress: true,\r\n observe: 'events',\r\n responseType: 'text',\r\n });\r\n\r\n let lastLoaded = 0;\r\n\r\n const sub = req.subscribe({\r\n next: (event) => {\r\n if (event.type === HttpEventType.DownloadProgress) {\r\n // Process the new chunk of data\r\n const fullText = (event as any).partialText;\r\n if (!fullText) return;\r\n\r\n const newText = fullText.slice(lastLoaded);\r\n lastLoaded = fullText.length;\r\n\r\n const lines = newText.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.trim() === '') continue;\r\n\r\n if (line.startsWith('data: ')) {\r\n const dataStr = line.substring(6).trim();\r\n\r\n if (dataStr === '[DONE]') {\r\n this.ngZone.run(() => observer.complete());\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(dataStr);\r\n // Consider using discrete signals or a more optimized zone strategy.\r\n this.ngZone.run(() =>\r\n observer.next({\r\n content: parsed.content ?? parsed.message ?? '',\r\n type: parsed.type ?? 'chunk',\r\n id: parsed.response_id ?? '',\r\n created_at: parsed.created_at ?? '',\r\n sources: parsed.sources ?? [],\r\n error: parsed.error,\r\n }),\r\n );\r\n } catch (e) {\r\n Logger.warn('Failed to parse SSE data:', dataStr, e);\r\n }\r\n }\r\n }\r\n } else if (event.type === HttpEventType.Response) {\r\n this.ngZone.run(() => observer.complete());\r\n }\r\n },\r\n error: (err) => {\r\n this.ngZone.run(() => observer.error(err));\r\n },\r\n complete: () => {\r\n this.ngZone.run(() => observer.complete());\r\n },\r\n });\r\n\r\n return () => sub.unsubscribe();\r\n });\r\n }\r\n}\r\n","import { Logger } from './../../../core/utils/logger.service';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ChatHistoryData, ChatHistoryRequest, ChatMessage } from '../model/chat-history.model';\r\nimport { HttpStreamService } from '../../../core/http/http-stream.service';\r\nimport { HttpService } from '../../../core/http/http.service';\r\nimport { ApiResponse } from '../../../core/models/api-response.model';\r\nimport { ChatRequest } from '../model/chat-request.model';\r\nimport { ChatResponse } from '../model/chat-response.model';\r\nimport { ChatStreamResponse } from '../model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatApiService {\r\n\r\n constructor(\r\n private http: HttpService,\r\n private httpStreamService: HttpStreamService,\r\n ) {\r\n Logger.info('ChatApiService: Initialized');\r\n }\r\n\r\n /**\r\n * Send chat message and get full response\r\n */\r\n sendMessage(request?: ChatRequest, showLoader = false): Promise<ApiResponse<ChatResponse>> {\r\n return this.http.post('chats/ask', request, showLoader);\r\n }\r\n\r\n /**\r\n * Send chat message and get streaming response\r\n */\r\n sendMessageStream(request: ChatRequest): Observable<ChatStreamResponse> {\r\n return this.httpStreamService.createHttpStream(`${this.http.apiUrl}chats/stream`, request);\r\n }\r\n\r\n getChatHistory(\r\n request: ChatHistoryRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<ChatHistoryData>> {\r\n return this.http.post('chats/sessions', request, showLoader);\r\n }\r\n\r\n getChatSession(\r\n chatSessionId: string,\r\n showLoader = false,\r\n ): Promise<ApiResponse<ChatMessage[]>> {\r\n return this.http.get(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.http.delete(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n // }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.clearChatHistory(\r\n // { chat_session_ids: [chatSessionId], delete_all: false },\r\n // showLoader,\r\n // );\r\n // }\r\n\r\n deleteChatSession(chatSessionId: string, showLoader = false): Promise<ApiResponse<void>> {\r\n const body = { chat_session_ids: [chatSessionId], delete_all: false };\r\n return this.http.delete('chats/sessions', body, showLoader);\r\n }\r\n\r\n updateChatTitle(\r\n chatSessionId: string,\r\n title: string,\r\n showLoader = false,\r\n ): Promise<ApiResponse<void>> {\r\n return this.http.patch(`chats/sessions/${chatSessionId}/title`, { title }, showLoader);\r\n }\r\n\r\n clearChatHistory(request?: object, showLoader = false): Promise<ApiResponse<void>> {\r\n return this.http.delete('chats/sessions', request, showLoader);\r\n }\r\n}\r\n","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { SharedMaterialModule } from '../material/material.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\n\r\n@Component({\r\n selector: 'app-snackbar',\r\n templateUrl: './snackbar.component.html',\r\n styleUrls: ['./snackbar.component.scss'],\r\n standalone: true,\r\n imports: [SharedMaterialModule, CommonModule],\r\n})\r\nexport class SnackBar implements OnInit {\r\n // private snackBarRef = inject(MatSnackBarRef);\r\n // private data = inject(MAT_SNACK_BAR_DATA);\r\n\r\n public message: string | null = null;\r\n public type: SnackBarError = 'error';\r\n\r\n constructor(\r\n @Inject(MAT_SNACK_BAR_DATA) public data: any,\r\n private snackBarRef: MatSnackBarRef<any>,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.message = this.data.message;\r\n this.type = this.data.type || 'error';\r\n }\r\n\r\n close() {\r\n this.snackBarRef.dismiss();\r\n }\r\n\r\n get icon(): string {\r\n switch (this.type) {\r\n case 'success':\r\n return 'check_circle';\r\n case 'error':\r\n return 'error';\r\n case 'warn':\r\n return 'warning';\r\n case 'info':\r\n return 'info';\r\n default:\r\n return 'info';\r\n }\r\n }\r\n}\r\n","<div class=\"snackbar-message\" [ngClass]=\"'type-' + type\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">{{ icon }}</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\nimport { SnackBar } from './snackbar.component';\r\n\r\nexport interface SnackbarConfig {\r\n message: string;\r\n duration?: number;\r\n type: SnackBarError;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SnackbarService {\r\n constructor(private snackBar: MatSnackBar) {}\r\n\r\n // Generic show method\r\n private show(message: string, duration: number, type: SnackBarError) {\r\n this.snackBar.openFromComponent(SnackBar, {\r\n duration: duration,\r\n data: { message, type },\r\n horizontalPosition: 'end',\r\n verticalPosition: 'bottom',\r\n panelClass: [`snackbar-${type}`],\r\n });\r\n }\r\n\r\n // Convenience methods\r\n success(message: string, duration: number = 3000) {\r\n this.show(message, duration, 'success');\r\n }\r\n\r\n warn(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'warn');\r\n }\r\n\r\n error(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'error');\r\n }\r\n\r\n info(message: string, duration: number = 4000) {\r\n this.show(message, duration, 'info');\r\n }\r\n\r\n clear() {\r\n this.snackBar.dismiss();\r\n }\r\n}\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { ChatApiService } from './chat-api.service';\r\nimport { ChatSessionDto } from '../model/chat-session.model';\r\nimport { Message } from '../../../core/models/message';\r\nimport { ChatSessionResponse, ChatMessage } from '../model/chat-history.model';\r\nimport { Logger } from '../../../core/utils/logger.service';\r\nimport { SnackbarService } from '../../../shared/snackbar/snackbar.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatHistoryService {\r\n private chatApiService = inject(ChatApiService);\r\n private snackbar = inject(SnackbarService);\r\n\r\n // History State Signals\r\n public sessions = signal<ChatSessionDto[]>([]);\r\n public isLoading = signal<boolean>(false);\r\n public isLoadingMore = signal<boolean>(false);\r\n public hasMore = signal<boolean>(true);\r\n public historyOffset = signal<number>(0);\r\n public isCacheValid = signal<boolean>(false);\r\n public processingSessionId = signal<string | null>(null);\r\n\r\n /**\r\n * Map API session response to ChatSession model\r\n */\r\n public mapSessionResponseToSession(\r\n sessionResponse: ChatSessionResponse,\r\n userId: string,\r\n ): ChatSessionDto {\r\n // Use last_message_at or created_at or current time\r\n const timestamp = sessionResponse.last_message_at\r\n ? new Date(sessionResponse.last_message_at)\r\n : sessionResponse.created_at\r\n ? new Date(sessionResponse.created_at)\r\n : new Date();\r\n\r\n Logger.info('Mapping session response:', sessionResponse);\r\n\r\n // Map messages from the session if they exist\r\n let messages: Message[] = [];\r\n if (sessionResponse.messages && Array.isArray(sessionResponse.messages)) {\r\n messages = sessionResponse.messages.map((msg: ChatMessage) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n\r\n // Use response_id as primary ID, fallback to chat_session_id\r\n const sessionId = sessionResponse.response_id || sessionResponse.chat_session_id || '';\r\n\r\n return {\r\n response_id: sessionId,\r\n last_message_at: timestamp,\r\n title: sessionResponse.title || 'Previous Conversation',\r\n userId: userId,\r\n messages: messages,\r\n };\r\n }\r\n\r\n /**\r\n * Load all chat sessions for a specific user\r\n */\r\n async loadSessions(userId: string, forceRefresh = false): Promise<void> {\r\n Logger.info('loadSessions called', { userId, forceRefresh });\r\n\r\n if (this.isCacheValid() && !forceRefresh && this.sessions().length > 0) {\r\n Logger.info('Cache is valid. Skipping API call.');\r\n return;\r\n }\r\n\r\n this.isLoading.set(true);\r\n this.historyOffset.set(0);\r\n\r\n try {\r\n const result = await this.chatApiService.getChatHistory({ limit: 50, offset: 0 });\r\n\r\n if (result?.success && result.data?.sessions) {\r\n const remoteSessions = result.data.sessions.map((s) =>\r\n this.mapSessionResponseToSession(s, userId),\r\n );\r\n const hasMore =\r\n (result.data.offset ?? 0) + remoteSessions.length < (result.data.total ?? 0);\r\n\r\n this.sessions.set(remoteSessions);\r\n this.hasMore.set(hasMore);\r\n this.historyOffset.set(remoteSessions.length);\r\n this.isCacheValid.set(true);\r\n\r\n Logger.info(`Loaded ${remoteSessions.length} sessions. Cache valid: true`);\r\n } else {\r\n this.sessions.set([]);\r\n this.hasMore.set(false);\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to load history');\r\n Logger.error('ChatHistoryService: Failed to load history', err);\r\n this.sessions.set([]);\r\n this.hasMore.set(false);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Load more sessions for infinite scroll\r\n */\r\n async loadMoreSessions(userId: string): Promise<void> {\r\n if (!this.hasMore() || this.isLoadingMore()) return;\r\n\r\n const offset = this.historyOffset();\r\n this.isLoadingMore.set(true);\r\n\r\n try {\r\n const result = await this.chatApiService.getChatHistory({ limit: 50, offset });\r\n\r\n if (result?.success && result.data?.sessions) {\r\n const remoteSessions = result.data.sessions.map((s) =>\r\n this.mapSessionResponseToSession(s, userId),\r\n );\r\n const hasMore =\r\n (result.data.offset ?? 0) + remoteSessions.length < (result.data.total ?? 0);\r\n\r\n this.sessions.set([...this.sessions(), ...remoteSessions]);\r\n this.hasMore.set(hasMore);\r\n this.historyOffset.set(offset + remoteSessions.length);\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to load more history');\r\n Logger.error('ChatHistoryService: Failed to load more history', err);\r\n } finally {\r\n this.isLoadingMore.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Load messages for a specific session\r\n */\r\n async loadSessionMessages(sessionId: string): Promise<Message[]> {\r\n try {\r\n const result = await this.chatApiService.getChatSession(sessionId);\r\n\r\n if (result.success && result.data) {\r\n // Interleave user and assistant messages\r\n const messages: ChatMessage[] = [];\r\n const users = result.data.filter((m) => m.role === 'user');\r\n const assistants = result.data.filter((m) => m.role === 'model');\r\n const maxLength = Math.max(users.length, assistants.length);\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n if (users[i]) messages.push(users[i]);\r\n if (assistants[i]) messages.push(assistants[i]);\r\n }\r\n\r\n return messages.map((msg) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to load messages');\r\n Logger.error('ChatHistoryService: Failed to load messages', err);\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Delete a specific session\r\n */\r\n async deleteSession(sessionId: string, userId: string): Promise<void> {\r\n this.processingSessionId.set(sessionId);\r\n try {\r\n const result = await this.chatApiService.deleteChatSession(sessionId);\r\n if (result?.success) {\r\n this.sessions.update((prev) => prev.filter((s) => s.response_id !== sessionId));\r\n this.snackbar.success('Conversation deleted successfully');\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to delete chat');\r\n Logger.error('ChatHistoryService: Failed to delete session', err);\r\n } finally {\r\n this.processingSessionId.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Delete all history\r\n */\r\n async deleteAllHistory(userId: string): Promise<void> {\r\n this.isLoading.set(true);\r\n try {\r\n const result = await this.chatApiService.clearChatHistory({ delete_all: true });\r\n if (result?.success) {\r\n this.sessions.set([]);\r\n this.isCacheValid.set(false);\r\n this.snackbar.success('Chat history cleared');\r\n }\r\n } catch (err) {\r\n this.snackbar.error('Failed to clear history');\r\n Logger.error('ChatHistoryService: Failed to clear history', err);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Update session title\r\n */\r\n async updateSessionTitle(sessionId: string, newTitle: string, userId: string): Promise<boolean> {\r\n this.processingSessionId.set(sessionId);\r\n try {\r\n const result = await this.chatApiService.updateChatTitle(sessionId, newTitle);\r\n const success = !!result?.success;\r\n\r\n if (success) {\r\n this.sessions.update((prev) =>\r\n prev.map((s) => (s.response_id === sessionId ? { ...s, title: newTitle } : s)),\r\n );\r\n this.snackbar.success('Title updated successfully');\r\n }\r\n return success;\r\n } catch (err) {\r\n this.snackbar.error('Failed to update title');\r\n Logger.error('ChatHistoryService: Failed to update title', err);\r\n return false;\r\n } finally {\r\n this.processingSessionId.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Invalidate cache\r\n */\r\n invalidateCache(): void {\r\n this.isCacheValid.set(false);\r\n this.historyOffset.set(0);\r\n this.hasMore.set(true);\r\n }\r\n\r\n /**\r\n * Create a new chat session DTO locally\r\n */\r\n public createSession(userId: string, sessionId: string): ChatSessionDto {\r\n return {\r\n response_id: sessionId,\r\n last_message_at: new Date(),\r\n title: 'New Conversation',\r\n messages: [],\r\n userId,\r\n };\r\n }\r\n\r\n /**\r\n * Clear all history state\r\n */\r\n clearState(): void {\r\n this.sessions.set([]);\r\n this.isLoading.set(false);\r\n this.isLoadingMore.set(false);\r\n this.hasMore.set(true);\r\n this.historyOffset.set(0);\r\n this.isCacheValid.set(false);\r\n this.processingSessionId.set(null);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { AuthMode } from '../types/auth-mode.type';\r\nimport { TenantResolutionStrategy } from '../types/tenant-resolution-strategy.type';\r\nimport { PromptMode } from '../types/prompt-mode.type';\r\n\r\n/**\r\n * Advanced configuration for Doohbot package\r\n * Supports both simple and complex use cases\r\n */\r\nexport interface DoohbotAdvancedConfig {\r\n /**\r\n * Authentication mode\r\n * - 'manual': You provide platformTenant, subTenant, agent manually\r\n * - 'auto': Package reads from your auth service via resolver\r\n * @default 'manual'\r\n */\r\n authMode?: AuthMode;\r\n\r\n /**\r\n * Tenant resolution strategy\r\n * - 'static': Use fixed values provided via inputs\r\n * - 'dynamic': Automatically update when auth state changes\r\n * - 'callback': Use custom resolver function\r\n * @default 'static'\r\n */\r\n tenantResolution?: TenantResolutionStrategy;\r\n\r\n /**\r\n * Auto-configure from localStorage key\r\n * If provided, package will read auth data from localStorage\r\n * Example: 'auth_user' or 'saas_session'\r\n */\r\n autoConfigFromStorage?: string;\r\n\r\n /**\r\n * Enable multi-tenant mode\r\n * Allows switching between different tenant contexts\r\n * @default false\r\n */\r\n enableMultiTenant?: boolean;\r\n\r\n /**\r\n * Persist chat history per tenant\r\n * @default true\r\n */\r\n persistChatPerTenant?: boolean;\r\n\r\n /**\r\n * Custom authentication header name\r\n * @default 'Authorization'\r\n */\r\n authHeaderName?: string;\r\n\r\n /**\r\n * Custom authentication header format\r\n * Use {token} as placeholder\r\n * @default 'Bearer {token}'\r\n */\r\n authHeaderFormat?: string;\r\n\r\n /**\r\n * Enable role-based features\r\n * Shows/hides features based on user permissions\r\n * @default false\r\n */\r\n enableRoleBasedFeatures?: boolean;\r\n\r\n /**\r\n * User permissions (for role-based features)\r\n */\r\n userPermissions?: string[];\r\n\r\n /**\r\n * Callback when authentication fails\r\n */\r\n onAuthFailure?: (error: any) => void;\r\n\r\n /**\r\n * Enable debug mode (logs configuration and requests)\r\n * @default false\r\n */\r\n debugMode?: boolean;\r\n\r\n /**\r\n * Prompt mode for chat responses\r\n * @default 'markdown'\r\n */\r\n promptMode?: PromptMode;\r\n}\r\n\r\n/**\r\n * Injection token for advanced configuration\r\n */\r\nexport const DOOHBOT_ADVANCED_CONFIG = new InjectionToken<DoohbotAdvancedConfig>(\r\n 'DOOHBOT_ADVANCED_CONFIG',\r\n {\r\n providedIn: 'root',\r\n factory: () => ({\r\n authMode: 'manual',\r\n tenantResolution: 'static',\r\n enableMultiTenant: false,\r\n persistChatPerTenant: true,\r\n authHeaderName: 'Authorization',\r\n authHeaderFormat: 'Bearer {token}',\r\n enableRoleBasedFeatures: false,\r\n debugMode: false,\r\n }),\r\n },\r\n);\r\n","// environment.ts\r\nexport const environment = {\r\n production: false,\r\n storageSecret: 'RcmDfQZ0AN2Zryn3pJ+HXNX4Nr7zQ6rV0UDsrCV9Jt5XzG4TW+1R3pIYOM03h77WMaZp8XnCBEQnelwGvuk3iQ==',\r\n};\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport { DoohbotConfig } from '../config/doohbot-config.model';\r\nimport { DOOHBOT_CONFIG } from '../config/doohbot-config.token';\r\nimport { environment } from '../environments/environment';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class StorageService {\r\n private readonly storageKey = 'doohbot_storage';\r\n private readonly secretKey: string;\r\n\r\n constructor(@Inject(DOOHBOT_CONFIG) config: DoohbotConfig) {\r\n // Use config override if provided, otherwise fall back to environment\r\n this.secretKey = config.storageSecret ?? environment.storageSecret ?? '';\r\n }\r\n\r\n /**\r\n * Store a value under the given key.\r\n * @param key The key to store the value under.\r\n * @param value The value to store (any serializable object).\r\n * @param session If true, use sessionStorage; otherwise localStorage.\r\n */\r\n set<T>(key: string, value: T, session = false): void {\r\n try {\r\n const storage = session ? sessionStorage : localStorage;\r\n const payload = this.getAll(storage);\r\n payload[key] = value;\r\n storage.setItem(this.storageKey, this.encrypt(JSON.stringify(payload)));\r\n } catch (error) {\r\n console.error('Failed to set value in storage:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Retrieve a stored value by key.\r\n * @param key The key to retrieve.\r\n * @param session If true, use sessionStorage; otherwise localStorage.\r\n * @returns The stored value or null if not found.\r\n */\r\n get<T>(key: string, session = false): T | null {\r\n try {\r\n const storage = session ? sessionStorage : localStorage;\r\n const data = storage.getItem(this.storageKey);\r\n if (!data) return null;\r\n\r\n const decrypted = this.decrypt(data);\r\n if (!decrypted) return null;\r\n\r\n const parsed = JSON.parse(decrypted) as Record<string, unknown>;\r\n return (parsed[key] as T) ?? null;\r\n } catch (error) {\r\n console.error('Failed to retrieve key from storage:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Remove a specific key from storage.\r\n * @param key The key to remove.\r\n * @param session If true, remove from sessionStorage; otherwise localStorage.\r\n */\r\n remove(key: string, session = false): void {\r\n try {\r\n const storage = session ? sessionStorage : localStorage;\r\n const payload = this.getAll(storage);\r\n delete payload[key];\r\n storage.setItem(this.storageKey, this.encrypt(JSON.stringify(payload)));\r\n } catch (error) {\r\n console.error('Failed to remove key from storage:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Clear all Doohbot-related storage from both localStorage and sessionStorage.\r\n */\r\n clearStorage(): void {\r\n localStorage.removeItem(this.storageKey);\r\n sessionStorage.removeItem(this.storageKey);\r\n }\r\n\r\n /**\r\n * Validate storage integrity without mutating it.\r\n * @param session If true, validate sessionStorage; otherwise localStorage.\r\n * @returns True if storage can be decrypted successfully.\r\n */\r\n isValid(session = false): boolean {\r\n try {\r\n const storage = session ? sessionStorage : localStorage;\r\n const data = storage.getItem(this.storageKey);\r\n if (!data) return false;\r\n return this.decrypt(data) !== null;\r\n } catch (error) {\r\n console.error('Failed to validate storage integrity:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Get all stored values.\r\n * @param storage The storage medium to use.\r\n * @returns Object of all stored key/value pairs.\r\n */\r\n private getAll(storage: Storage): Record<string, unknown> {\r\n try {\r\n const data = storage.getItem(this.storageKey);\r\n if (!data) return {};\r\n const decrypted = this.decrypt(data);\r\n return decrypted ? JSON.parse(decrypted) : {};\r\n } catch (error) {\r\n console.error('Failed to retrieve all storage values:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * Encrypt a string before storing.\r\n * @param plainText The string to encrypt.\r\n * @returns Encrypted string.\r\n */\r\n private encrypt(plainText: string): string {\r\n return CryptoJS.AES.encrypt(plainText, this.secretKey).toString();\r\n }\r\n\r\n /**\r\n * Decrypt a string from storage.\r\n * @param cipherText The encrypted string.\r\n * @returns Decrypted string, or null if decryption fails.\r\n */\r\n private decrypt(cipherText: string): string | null {\r\n try {\r\n const bytes = CryptoJS.AES.decrypt(cipherText, this.secretKey);\r\n const decrypted = bytes.toString(CryptoJS.enc.Utf8);\r\n return decrypted || null;\r\n } catch (error) {\r\n console.error('Failed to decrypt storage value:', error);\r\n return null;\r\n }\r\n return null;\r\n }\r\n}\r\n","import { computed, Injectable, signal } from '@angular/core';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport {\r\n BehaviorSubject,\r\n combineLatest,\r\n filter,\r\n from,\r\n Observable,\r\n of,\r\n switchMap,\r\n take,\r\n distinctUntilChanged,\r\n} from 'rxjs';\r\nimport { AuthResult } from './models/auth-result.model';\r\nimport { FederatedLoginRequest } from './models/federated-login-request.model';\r\nimport { LoginRequest } from './models/login-request.model';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { StorageService } from './storage.service';\r\nimport { RefreshRequest } from './models/refresh-request.model';\r\nimport { HttpService } from '../http/http.service';\r\nimport { ApiResponse } from '../models/api-response.model';\r\nimport { HttpHeaders } from '@angular/common/http';\r\nimport { Logger } from '../utils/logger.service';\r\nimport { SnackbarService } from '../../shared/snackbar/snackbar.service';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\n\r\ntype PrereqStatus = 'success' | 'failed' | 'pending';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n private jwtHelper = new JwtHelperService();\r\n\r\n private readonly _isAuthenticated = signal<boolean>(false);\r\n readonly isAuthenticated$ = toObservable(this._isAuthenticated).pipe(distinctUntilChanged());\r\n\r\n private readonly rememberMeSubject = new BehaviorSubject<boolean | null>(null);\r\n private readonly federatedAuthTokenSubject = new BehaviorSubject<string | null>(null);\r\n private readonly licenseFileSubject = new BehaviorSubject<Map<string, string> | null>(null);\r\n private readonly licenseCodeSubject = new BehaviorSubject<string | null>(null);\r\n\r\n private readonly _isAuthenticating = signal<boolean>(false);\r\n private readonly _loginErrorMessage = signal<string | null>(null);\r\n\r\n // verified auth data\r\n private readonly _errors = {\r\n federatedAuthToken: signal<string | null>(null),\r\n licenseFile: signal<string | null>(null),\r\n licenseCode: signal<string | null>(null),\r\n };\r\n\r\n /** Gets the last login error message */\r\n readonly loginErrorMessage = computed(() => this._loginErrorMessage());\r\n\r\n /** Computed prerequisites status */\r\n readonly prerequisitesStatus = computed(() => ({\r\n federatedToken: this.getStatus(this.federatedAuthToken(), this._errors.federatedAuthToken()),\r\n licenseFile: this.getStatus(this.licenseFile(), this._errors.licenseFile()),\r\n licenseCode: this.getStatus(this.licenseCode(), this._errors.licenseCode()),\r\n }));\r\n\r\n /** True if all prerequisites are satisfied */\r\n readonly allPrerequisitesMet = computed(() => {\r\n const status = this.prerequisitesStatus();\r\n return (\r\n status.federatedToken === 'success' &&\r\n status.licenseFile === 'success' &&\r\n status.licenseCode === 'success'\r\n );\r\n });\r\n\r\n private getStatus(value: unknown, error: unknown): PrereqStatus {\r\n if (value) return 'success';\r\n if (error) return 'failed';\r\n return 'pending';\r\n }\r\n\r\n private apiBaseUrl = '';\r\n\r\n // Public accessors for auth state and user info\r\n /** Gets if user is authenticated */\r\n readonly isAuthenticated = computed(() => this._isAuthenticated());\r\n\r\n /** Gets if user is currently authenticating */\r\n readonly isAuthenticating = computed(() => this._isAuthenticating());\r\n\r\n /** Sets remember_me */\r\n readonly setRememberMe = (value: boolean = false): void => {\r\n this.rememberMeSubject.next(value);\r\n this.storageService.set('remember_me', value);\r\n };\r\n\r\n /** Gets remember_me */\r\n readonly rememberMe = (): boolean | false => this.storageService.get('remember_me') ?? false;\r\n\r\n /** `user_id` of logged in user */\r\n readonly userId = (): string | null => this.storageService.get<string>('user_id');\r\n\r\n /** `username` of logged in user */\r\n readonly username = (): string => this.storageService.get<string>('username') ?? 'User';\r\n\r\n /** Logged-in user avatar URL */\r\n readonly profileImageUrl = (): string | null =>\r\n this.storageService.get<string>('profile_image_url') ?? '';\r\n\r\n /** `email` of logged in user */\r\n readonly email = (): string | null =>\r\n this.storageService.get<string>('email') ?? 'user@gmail.com';\r\n\r\n /** `roles` of logged in user */\r\n readonly roles = (): string | null => this.storageService.get<string>('roles');\r\n\r\n /** `permissions` of logged in user */\r\n readonly permissions = (): string | null => this.storageService.get<string>('permissions');\r\n\r\n /** `organization_id` of logged in user */\r\n readonly organizationId = (): string | null => this.storageService.get<string>('organization_id');\r\n\r\n /** `company_id` of logged in user */\r\n readonly companyId = (): string | null => this.storageService.get<string>('company_id');\r\n\r\n /** `access_token` of logged in user */\r\n readonly accessToken = (): string | null => this.storageService.get<string>('access_token');\r\n\r\n /** `refresh_token` of logged in user */\r\n readonly refreshToken = (): string | null => this.storageService.get<string>('refresh_token');\r\n\r\n /** Resolved API base URL */\r\n readonly apiUrl = (): string => this.configService.api()?.baseUrl ?? '';\r\n\r\n /** Sets current license file */\r\n readonly setLicenseFile = (data: Map<string, string> | null): void => {\r\n this.licenseFileSubject.next(data);\r\n };\r\n\r\n /** Gets current license file */\r\n readonly licenseFile = (): Map<string, string> | null => this.licenseFileSubject.value;\r\n\r\n /** Sets current federated auth token */\r\n readonly setFederatedAuthToken = (token: string | undefined): void => {\r\n this.federatedAuthTokenSubject.next(token ?? null);\r\n };\r\n\r\n /** Gets current federated auth token */\r\n readonly federatedAuthToken = (): string | null => this.federatedAuthTokenSubject.value;\r\n\r\n /** Sets current license_code */\r\n readonly setLicenseCode = (code: string | null): void => {\r\n this.licenseCodeSubject.next(code);\r\n };\r\n\r\n /** Gets current license_code */\r\n readonly licenseCode = (): string | null => this.licenseCodeSubject.value;\r\n\r\n /** Gets current license key for active license code */\r\n readonly currentLicenseKey = (): string | null => {\r\n const code = this.licenseCodeSubject.value;\r\n const map = this.licenseFileSubject.value;\r\n return code && map ? (map.get(code) ?? null) : null;\r\n };\r\n\r\n constructor(\r\n private http: HttpService,\r\n private storageService: StorageService,\r\n private configService: DoohbotConfigService,\r\n private snackbar: SnackbarService,\r\n ) {\r\n this.apiBaseUrl = this.configService.api()?.baseUrl ?? '';\r\n\r\n // Attempt to restore authentication state on service initialization.\r\n // This will check for valid tokens and refresh if necessary.\r\n this.authenticate().subscribe();\r\n }\r\n\r\n /**\r\n * Authenticate user based on stored tokens or refresh tokens.\r\n */\r\n private authenticate(): Observable<void> {\r\n const accessToken = this.accessToken();\r\n\r\n if (!accessToken) {\r\n //! For production ( Backend Validation )\r\n this._isAuthenticated.set(false);\r\n return of(void 0);\r\n }\r\n\r\n // Access token valid\r\n if (!this.isTokenExpired()) {\r\n this._isAuthenticated.set(true);\r\n return of(void 0);\r\n }\r\n\r\n // Token expired\r\n this._isAuthenticated.set(false);\r\n return of(void 0);\r\n\r\n // // Access Token expired -> try refresh\r\n // const refreshToken = this.refreshToken();\r\n // if (!refreshToken) {\r\n // this.clearAuth();\r\n // return of(void 0);\r\n // }\r\n\r\n // // Access expired but refresh token exists → attempt refresh\r\n // // Attempt refresh\r\n // return this.refreshLogin().pipe(\r\n // tap((result) => {\r\n // if (!result) {\r\n // this.clearAuth();\r\n // }\r\n // }),\r\n // map(() => void 0),\r\n // );\r\n }\r\n\r\n // /**\r\n // * Refresh login token.\r\n // */\r\n // refreshLogin(): Observable<AuthResult | null> {\r\n // try {\r\n // const refreshToken = this.refreshToken();\r\n // if (!refreshToken) {\r\n // this.clearAuth();\r\n // return of(null);\r\n // }\r\n\r\n // return from(\r\n // this.refreshLoginHttpHelper({\r\n // refresh_token: refreshToken,\r\n // } as RefreshRequest),\r\n // ).pipe(\r\n // map((result) => {\r\n // return result.data ?? null;\r\n // }),\r\n // tap((data) => {\r\n // if (!data?.access_token || !data?.refresh_token) {\r\n // Logger.error('Failed to re-login');\r\n // this._isAuthenticated.set(false);\r\n // return;\r\n // }\r\n\r\n // this.setSession(data);\r\n // this._isAuthenticated.set(true);\r\n // }),\r\n // catchError(() => {\r\n // this.clearAuth();\r\n // return of(null);\r\n // }),\r\n // finalize(() => {\r\n // // this.isRefreshing = false;\r\n // }),\r\n // shareReplay(1),\r\n // );\r\n // } catch (error) {\r\n // throw new Error('Unable to authenticate user');\r\n // }\r\n // }\r\n\r\n /**\r\n * True if doohbot API requests that are auth-related\r\n */\r\n isAuthUrl(url: string): boolean {\r\n try {\r\n const requestUrl = new URL(url, window.location.origin);\r\n const path = requestUrl.pathname.toLowerCase();\r\n const isDoohbotApi = this.isConsumerApiRequest(url);\r\n return (\r\n isDoohbotApi &&\r\n ['/auth/login', '/auth/federated/login', '/auth/refresh'].some((authPath) =>\r\n path.endsWith(authPath),\r\n )\r\n );\r\n } catch (error) {\r\n Logger.error('Error checking if URL is auth URL:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * True if if not a consumer API request (e.g. external API calls)\r\n */\r\n isConsumerApiRequest(url: string): boolean {\r\n try {\r\n const requestUrl = new URL(url, window.location.origin);\r\n const apiUrl = new URL(this.apiBaseUrl);\r\n return requestUrl.host === apiUrl.host;\r\n } catch (error) {\r\n Logger.error('Error checking if URL is doohbot API URL:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the federated authentication flow.\r\n *\r\n * Validates all required prerequisites (configuration, license, tokens)\r\n * and triggers authentication only when the system is in a valid state.\r\n *\r\n * This method is idempotent and safe to call multiple times; authentication\r\n * will execute only once when all conditions are satisfied.\r\n */\r\n initFederatedAuthFlow() {\r\n combineLatest([\r\n this.federatedAuthTokenSubject,\r\n this.rememberMeSubject,\r\n this.licenseFileSubject,\r\n this.licenseCodeSubject,\r\n ])\r\n .pipe(\r\n filter(\r\n ([federatedToken, rememberMe, licenseFile, licenseCode]) =>\r\n !!federatedToken && rememberMe !== null && !!licenseFile && !!licenseCode,\r\n ),\r\n take(1),\r\n switchMap(() => {\r\n // Login if no accessToken or is expired\r\n const accessToken = this.accessToken();\r\n const isExpiredToken = this.isTokenExpired(accessToken);\r\n if (isExpiredToken || !accessToken) {\r\n const loginRequest: FederatedLoginRequest = {\r\n access_token: this.federatedAuthTokenSubject.value!,\r\n remember_me: this.rememberMe(),\r\n };\r\n\r\n return from(this.federatedLogin(loginRequest));\r\n }\r\n\r\n return of(false);\r\n }),\r\n )\r\n .subscribe((success) => {\r\n if (!success) {\r\n return;\r\n }\r\n\r\n // Restores authenticated state\r\n return this.authenticate();\r\n });\r\n }\r\n\r\n /**\r\n * Authenticate user with federated credentials\r\n */\r\n\r\n async federatedLogin(param: FederatedLoginRequest): Promise<boolean> {\r\n this._isAuthenticating.set(true);\r\n try {\r\n const result: ApiResponse<{ access_token: string; refresh_token: string }> =\r\n await this.federateLoginHttpHelper(param);\r\n\r\n if (result.success && result.data) {\r\n const authResult = {\r\n access_token: result.data.access_token,\r\n refresh_token: param.remember_me ? result.data.refresh_token : '',\r\n };\r\n\r\n this.setSession(authResult, param.remember_me);\r\n this._loginErrorMessage.set(null);\r\n return true;\r\n } else {\r\n const errorMessage = this.extractErrorMessage(result);\r\n this.snackbar.error(errorMessage);\r\n this._loginErrorMessage.set(errorMessage);\r\n\r\n this._isAuthenticated.set(false);\r\n this.clearAuth();\r\n return false;\r\n }\r\n } catch (error: any) {\r\n const errorMessage = this.extractErrorMessage(error);\r\n this.snackbar.error(errorMessage);\r\n this._loginErrorMessage.set(errorMessage);\r\n\r\n this._isAuthenticated.set(false);\r\n this.clearAuth();\r\n return false;\r\n } finally {\r\n this._isAuthenticating.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Initializes session authentication flow for session auth mode.\r\n */\r\n initSessionAuthFlow(session: AuthResult | undefined): void {\r\n if (!session) {\r\n // this.authError.set('AuthResult is required for session mode.');\r\n this.snackbar.error('Something went wrong');\r\n return;\r\n }\r\n\r\n const token = session.access_token;\r\n if (!token) {\r\n this.snackbar.error('Invalid session data');\r\n return;\r\n }\r\n\r\n if (this.isTokenExpired(token)) {\r\n this.snackbar.error('Session Expired');\r\n this._isAuthenticated.set(false);\r\n return;\r\n }\r\n\r\n // Token is valid; set session\r\n this.setSession(session);\r\n this._isAuthenticated.set(true);\r\n\r\n // Trigger post-login initialization\r\n this.authenticate();\r\n }\r\n\r\n /**\r\n * Authenticate user with credentials\r\n */\r\n async login(param: LoginRequest): Promise<boolean> {\r\n this._isAuthenticating.set(true);\r\n try {\r\n const result = await this.loginHttpHelper(param);\r\n if (result && result.success && result.data) {\r\n this.setSession(result.data, param.rememberMe);\r\n this._loginErrorMessage.set(null);\r\n return true;\r\n } else {\r\n const errorMessage = this.extractErrorMessage(result);\r\n this.snackbar.error(errorMessage);\r\n this._loginErrorMessage.set(errorMessage);\r\n this._isAuthenticated.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n const errorMessage = this.extractErrorMessage(error);\r\n this.snackbar.error(errorMessage);\r\n this._loginErrorMessage.set(errorMessage);\r\n this._isAuthenticated.set(false);\r\n return false;\r\n } finally {\r\n this._isAuthenticating.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Logout user by clearing session and tokens, and calling logout API to invalidate refresh token.\r\n */\r\n async logout(): Promise<boolean> {\r\n const refreshToken = this.refreshToken();\r\n if (!refreshToken) {\r\n /**\r\n * If no \"refresh_token\" exists, simply clear auth without calling logout API.\r\n * This handles cases where user logged in without \"remember_me\" and the access token expired.\r\n *\r\n * Refresh token would not be in storage in this case, because we store it in sessionStorage for non-rememberMe logins,\r\n * which gets cleared when the browser/tab is closed.\r\n * So if \"refresh_token\" is missing, it likely means the user is already effectively logged out or in a state where logout API call is unnecessary.\r\n */\r\n this.clearAuth();\r\n return true;\r\n }\r\n\r\n try {\r\n const result = await this.logoutHttpHelper(refreshToken);\r\n if (result?.success) {\r\n this.clearAuth();\r\n return true;\r\n } else {\r\n this.snackbar.error('Logout failed');\r\n return false;\r\n }\r\n } catch (error) {\r\n this.snackbar.error('Logout failed');\r\n Logger.error('Logout failed', error);\r\n return false;\r\n }\r\n }\r\n\r\n // Http Helpers\r\n private async federateLoginHttpHelper(\r\n param: FederatedLoginRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n const header = this.buildLicenseHeader();\r\n return this.http.post('auth/federated/login', param, showLoader, header);\r\n }\r\n\r\n private loginHttpHelper(\r\n param?: LoginRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/login', param, showLoader);\r\n }\r\n\r\n private refreshLoginHttpHelper(\r\n param?: RefreshRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/refresh', param, showLoader);\r\n }\r\n\r\n private logoutHttpHelper(refreshToken: string, showLoader = false): Promise<ApiResponse<void>> {\r\n // Explicitly set the library's access token to override any project token\r\n const accessToken = this.accessToken();\r\n let headers = new HttpHeaders().set('X-Skip-Auth-Header', 'true');\r\n\r\n // Add the library's access token\r\n if (accessToken) {\r\n headers = headers.set('Authorization', `Bearer ${accessToken}`);\r\n }\r\n\r\n return this.http.post('auth/logout', { refresh_token: refreshToken }, showLoader, headers);\r\n }\r\n\r\n private buildLicenseHeader(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n const licenseKey = this.currentLicenseKey();\r\n if (!licenseKey) {\r\n Logger.warn('License key missing — request sent without license header');\r\n return headers;\r\n }\r\n\r\n return headers.set('x-license-key', licenseKey);\r\n }\r\n\r\n // Utility\r\n private setSession(session: AuthResult, rememberMe?: boolean | null | undefined) {\r\n if (rememberMe === null || rememberMe === undefined) {\r\n rememberMe = this.rememberMe();\r\n }\r\n\r\n const user = this.jwtHelper.decodeToken(session.access_token);\r\n\r\n // Should store tokens based on rememberMe preference (localStorage for rememberMe, sessionStorage for non-rememberMe)\r\n this.storageService.set('access_token', session.access_token);\r\n this.storageService.set('refresh_token', session.refresh_token, !rememberMe);\r\n\r\n this.storageService.set('user_id', user?.user_id);\r\n this.storageService.set('username', user?.username);\r\n this.storageService.set('email', user?.email);\r\n this.storageService.set('roles', user?.roles);\r\n this.storageService.set('permissions', user?.permissions);\r\n this.storageService.set('organization_id', user?.organization_id);\r\n this.storageService.set('company_id', user?.company_id);\r\n this.storageService.set('office_id', user?.office_id);\r\n this.storageService.set('profile_image_url', user?.profile_image_url);\r\n\r\n // Notify subscribers\r\n this._isAuthenticated.set(true);\r\n }\r\n\r\n private isTokenExpired(accessToken?: string | null): boolean {\r\n let token = accessToken || this.accessToken();\r\n if (token) {\r\n return this.jwtHelper.isTokenExpired(token);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * Clear all authentication related data from local storage, session storage, cache, and tokens.\r\n * This method is called when the user logs out.\r\n */\r\n clearAuth() {\r\n this.storageService.clearStorage();\r\n this._isAuthenticated.set(false);\r\n Logger.info('[Auth] Auth cleared successfully');\r\n }\r\n\r\n private extractErrorMessage(error: any): string {\r\n if (!error) return 'Something went wrong';\r\n\r\n // If it's an HttpErrorResponse (standard Angular), the backend body is in .error\r\n // If HttpService returns 'of(error)', result might be the HttpErrorResponse object\r\n const backendData = error.error || error;\r\n\r\n const message =\r\n backendData.message ||\r\n backendData.errorCode ||\r\n error.message ||\r\n 'Something went wrong. Please try again later.';\r\n\r\n return message;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport MarkdownIt from 'markdown-it';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MarkdownService {\r\n private md = new MarkdownIt({\r\n html: false, // Disable HTML tags for security\r\n linkify: true, // Auto-convert URLs to links\r\n typographer: true, // Smart quotes, dashes, etc.\r\n breaks: true, // ✅ Convert \\n to <br> (CRITICAL for line breaks)\r\n xhtmlOut: true, // Use XHTML-compatible output\r\n });\r\n\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n convert(markdown: string): SafeHtml {\r\n if (!markdown || markdown.trim() === '') {\r\n return '';\r\n }\r\n\r\n try {\r\n // marked.parse() is synchronous by default\r\n const html = this.md.render(markdown);\r\n return this.sanitizer.bypassSecurityTrustHtml(html);\r\n } catch (error) {\r\n console.error('Markdown parsing error:', error);\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n markdown.replace(/</g, '&lt;').replace(/>/g, '&gt;'),\r\n );\r\n }\r\n }\r\n}\r\n","import { Injectable, signal, inject, computed } from '@angular/core';\r\nimport { Subject, lastValueFrom } from 'rxjs';\r\nimport { ChatSessionDto } from './model/chat-session.model';\r\nimport { ChatHistoryService } from './services/chat-history.service';\r\nimport { ChatApiService } from './services/chat-api.service';\r\nimport { DOOHBOT_ADVANCED_CONFIG } from '../../core/models/doohbot-config.model';\r\nimport { Message } from '../../core/models/message';\r\nimport { PromptMode } from '../../core/types/prompt-mode.type';\r\nimport { ChatRequest } from './model/chat-request.model';\r\nimport { ChatStreamMessage } from './model/chat-stream-message.model';\r\nimport { AuthService } from './../../core/auth/auth.service';\r\n\r\nimport { DoohbotConfigService } from '../../core/config/doohbot-config.service';\r\nimport { Logger } from '../../core/utils/logger.service';\r\nimport { MarkdownService } from '../../core/services/markdown.service';\r\nimport { SnackbarService } from '../../shared/snackbar/snackbar.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatService {\r\n // Dependencies\r\n private apiService = inject(ChatApiService);\r\n private snackbar = inject(SnackbarService);\r\n private authService = inject(AuthService);\r\n private configService = inject(DoohbotConfigService);\r\n private config = inject(DOOHBOT_ADVANCED_CONFIG, { optional: true });\r\n private chatHistoryService = inject(ChatHistoryService);\r\n private markdownService = inject(MarkdownService);\r\n private chatSessions = this.chatHistoryService.sessions;\r\n\r\n //! ===================== UI STATE SIGNALS ============================\r\n\r\n /**\r\n * Whether the chat window is currently open\r\n */\r\n public isChatOpen = signal(false);\r\n\r\n /**\r\n * Whether the history sidebar is currently open\r\n */\r\n public isHistorySidebarOpen = signal(false);\r\n\r\n /**\r\n * Whether the chat is in fullscreen mode\r\n */\r\n public isFullScreen = signal(false);\r\n\r\n /**\r\n * ID of the last message that was read by the user\r\n */\r\n private lastReadMessageId = signal<string | null>(null);\r\n\r\n /**\r\n * Computed number of unread bot messages\r\n */\r\n public unreadCount = computed(() => {\r\n if (this.isChatOpen()) {\r\n return 0; // No unread when chat is open\r\n }\r\n\r\n const messages = this.messages();\r\n if (messages.length === 0) return 0;\r\n\r\n const lastReadId = this.lastReadMessageId();\r\n let lastReadIndex = -1;\r\n\r\n if (lastReadId !== null) {\r\n lastReadIndex = messages.findIndex((msg) => msg.id === lastReadId);\r\n }\r\n\r\n // Count unread bot messages after last read position\r\n const unreadBotMessages = messages\r\n .slice(lastReadIndex + 1)\r\n .filter((msg) => msg.sender === 'model');\r\n\r\n return unreadBotMessages.length;\r\n });\r\n\r\n //! ===================== EFFECTS ========================\r\n\r\n /**\r\n * Effect to automatically mark messages as read when chat is opened\r\n */\r\n // private markAsReadEffect = effect(\r\n // () => {\r\n // const isOpen = this.isChatOpen();\r\n // const msgs = this.messages();\r\n\r\n // if (isOpen && msgs.length > 0) {\r\n // const lastMessage = msgs[msgs.length - 1];\r\n // if (lastMessage?.id) {\r\n // const currentLastRead = this.lastReadMessageId();\r\n // if (lastMessage.id !== currentLastRead) {\r\n // this.lastReadMessageId.set(lastMessage.id);\r\n // }\r\n // }\r\n // }\r\n // },\r\n // { allowSignalWrites: true },\r\n // );\r\n\r\n // Public messages signal for current context\r\n public messages = signal<Message[]>([]);\r\n\r\n /**\r\n * Determine if suggestion chips should be shown\r\n */\r\n public showSuggestionChips = computed(() => {\r\n const msgs = this.messages();\r\n if (msgs.length === 0) return false;\r\n const lastBotMsg = [...msgs].reverse().find((m) => m.sender === 'model');\r\n return lastBotMsg?.showSuggestions === true;\r\n });\r\n\r\n // Active session signal\r\n public activeSession = signal<ChatSessionDto | null>(null);\r\n\r\n // UI state signals (Keep these here as they are relevant to the Chat UI state)\r\n public isLoadingApi = signal<boolean>(false);\r\n public isBotTyping = signal<boolean>(false);\r\n public promptMode = signal<PromptMode>('markdown');\r\n\r\n //! Controls whether to use Streaming API (default) or Standard API\r\n // public isStreaming = computed(() => !this.configService.api);\r\n public isStreaming = computed(() => !this.configService.useNonStreamingChat());\r\n\r\n messagesStream: Array<ChatStreamMessage> = [];\r\n currentResponse = '';\r\n\r\n getFallbackError(): string {\r\n return 'Something went wrong. Please try again.';\r\n }\r\n\r\n constructor() {\r\n Logger.info('ChatService: Initialized');\r\n\r\n // Initialize prompt mode from config if available\r\n if (this.config?.promptMode) {\r\n this.promptMode.set(this.config.promptMode);\r\n }\r\n }\r\n\r\n //! =================== UI STATE METHODS ===========================\r\n\r\n /**\r\n * Toggle the chat window open/close state\r\n */\r\n toggleChat(): void {\r\n const currentlyOpen = this.isChatOpen();\r\n this.isChatOpen.update((open) => !open);\r\n\r\n // Mark messages as read when opening chat\r\n if (!currentlyOpen) {\r\n const msgs = this.messages();\r\n if (msgs.length > 0) {\r\n const lastMessage = msgs[msgs.length - 1];\r\n this.lastReadMessageId.set(lastMessage.id ?? null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the history sidebar open/close state\r\n */\r\n toggleHistorySidebar(): void {\r\n this.isHistorySidebarOpen.update((open) => !open);\r\n }\r\n\r\n /**\r\n * Close the chat window\r\n */\r\n closeChat(): void {\r\n this.isChatOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the chat window\r\n */\r\n openChat(): void {\r\n this.isChatOpen.set(true);\r\n }\r\n\r\n /**\r\n * Close the history sidebar\r\n */\r\n closeHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the history sidebar\r\n */\r\n openHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(true);\r\n }\r\n\r\n /**\r\n * Toggle fullscreen mode\r\n */\r\n toggleFullscreen(): void {\r\n this.isFullScreen.update((fs) => !fs);\r\n }\r\n\r\n /**\r\n * Set fullscreen state\r\n */\r\n setFullscreen(isFullscreen: boolean): void {\r\n this.isFullScreen.set(isFullscreen);\r\n }\r\n\r\n /**\r\n * Manually mark messages as read up to a specific message ID\r\n */\r\n markMessagesAsRead(messageId: string): void {\r\n this.lastReadMessageId.set(messageId);\r\n }\r\n\r\n /**\r\n * Reset last read message ID\r\n */\r\n resetLastRead(): void {\r\n this.lastReadMessageId.set(null);\r\n }\r\n\r\n /**\r\n * Get the last read message ID\r\n */\r\n getLastReadMessageId(): string | null {\r\n return this.lastReadMessageId();\r\n }\r\n\r\n //! ==================== STATE MANAGEMENT ====================\r\n\r\n /**\r\n * Start a new chat session\r\n */\r\n public startNewSession(sessionId?: string): void {\r\n const userId = this.authService.userId();\r\n if (!userId) {\r\n throw new Error('Unauthorized user');\r\n }\r\n\r\n this.isBotTyping.set(false);\r\n this.isLoadingApi.set(false);\r\n\r\n const newSession = this.chatHistoryService.createSession(userId, sessionId || '');\r\n this.activeSession.set(newSession);\r\n this.messages.set([]);\r\n }\r\n\r\n /**\r\n * Load an existing session\r\n */\r\n public loadSession(session: ChatSessionDto): void {\r\n Logger.info(\r\n '[ChatService] Loading session:',\r\n session.response_id,\r\n 'Messages:',\r\n session.messages.length,\r\n );\r\n this.activeSession.set(session);\r\n // Load session messages and convert markdown for completed model messages\r\n this.messages.set(\r\n session.messages.map((m) =>\r\n m.sender === 'model' && m.completed\r\n ? {\r\n ...m,\r\n textHtml: this.markdownService.convert(m.text),\r\n }\r\n : m,\r\n ),\r\n );\r\n Logger.info('[ChatService] Messages signal updated. Current count:', this.messages().length);\r\n }\r\n\r\n /**\r\n * Get active session\r\n */\r\n public getActiveSession(): ChatSessionDto | null {\r\n return this.activeSession();\r\n }\r\n\r\n /**\r\n * Clear messages for current session and start new one\r\n */\r\n clearMessages(): void {\r\n this.messages.set([]);\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Add message to current session\r\n */\r\n public addMessage(message: Message): void {\r\n const newMessage = { ...message, timestamp: new Date() };\r\n\r\n // Update current messages signal\r\n this.messages.update((msgs) => [...msgs, newMessage]);\r\n }\r\n\r\n /**\r\n * Continue a chat session\r\n */\r\n public async continueSession(sessionId: string): Promise<void> {\r\n Logger.info(`[ChatService] continuing session: ${sessionId}`);\r\n this.isLoadingApi.set(true);\r\n try {\r\n const result = await this.chatHistoryService.loadSessionMessages(sessionId);\r\n const loadedMessages = result || [];\r\n const sessionFromList = this.chatSessions().find((s) => s.response_id === sessionId);\r\n\r\n if (sessionFromList) {\r\n sessionFromList.messages = loadedMessages;\r\n this.loadSession(sessionFromList);\r\n } else {\r\n const timestamp =\r\n loadedMessages.length > 0\r\n ? loadedMessages[loadedMessages.length - 1].timestamp || new Date()\r\n : new Date();\r\n\r\n const userId = this.authService.userId();\r\n if (!userId) {\r\n throw new Error('Unauthorized user');\r\n }\r\n\r\n const newSession: ChatSessionDto = {\r\n response_id: sessionId,\r\n last_message_at: timestamp,\r\n title: 'Previous Conversation',\r\n messages: loadedMessages,\r\n userId,\r\n };\r\n this.loadSession(newSession);\r\n }\r\n this.openChat();\r\n } finally {\r\n this.isLoadingApi.set(false);\r\n }\r\n }\r\n\r\n //! ==================== MESSAGE PROCESSING ====================\r\n\r\n /**\r\n * Process a user message: add it, get bot reply, and add bot reply\r\n */\r\n public async sendMessage(text: string, maxLength: number = 4000): Promise<void> {\r\n const trimmedText = text.trim();\r\n if (!trimmedText) return;\r\n\r\n if (trimmedText.length > maxLength) {\r\n this.snackbar.error('Message too long.');\r\n return;\r\n }\r\n\r\n const requestSession = this.activeSession();\r\n\r\n this.addMessage({\r\n sender: 'user',\r\n text: trimmedText,\r\n completed: true,\r\n isHistory: false,\r\n id: this.generateMessageId(),\r\n timestamp: new Date(),\r\n });\r\n\r\n this.isBotTyping.set(true);\r\n this.isLoadingApi.set(true);\r\n\r\n try {\r\n const request = this.buildChatRequest(trimmedText);\r\n\r\n if (this.isStreaming()) {\r\n // STREAMING HANDLES MODEL MESSAGE ITSELF\r\n await this.stream(request);\r\n } else {\r\n // NON-STREAMING RETURNS FULL TEXT\r\n const response = await this.ask(request);\r\n\r\n if (this.activeSession() === requestSession && response) {\r\n this.addMessage({\r\n sender: 'model',\r\n text: response,\r\n completed: true,\r\n isHistory: false,\r\n id: this.generateMessageId(),\r\n });\r\n }\r\n }\r\n } finally {\r\n if (this.activeSession() === requestSession) {\r\n this.isBotTyping.set(false);\r\n this.isLoadingApi.set(false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generates a unique message ID to prevent collisions\r\n */\r\n private generateMessageId(): string {\r\n return crypto.randomUUID();\r\n }\r\n\r\n /**\r\n * Builds a chat request payload with the given user text and optional active session\r\n * @param {string} userInput - The text provided by the user\r\n * @returns {ChatRequest} - A chat request payload with the user text and optional active session\r\n * @memberof ChatService\r\n */\r\n\r\n private buildChatRequest(userText: string): ChatRequest {\r\n const request: ChatRequest = {\r\n query: userText,\r\n organization_id: this.authService.organizationId() || '',\r\n prompt_mode: this.promptMode(),\r\n };\r\n\r\n // Continue conversation if active session exists and has a backend ID\r\n if (this.activeSession()?.response_id) {\r\n request.response_id = this.activeSession()?.response_id;\r\n Logger.info('>>>> conversation continued:', this.activeSession()?.response_id);\r\n } else {\r\n Logger.info('>>>> new conversation started');\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Send chat message using standard endpoint and return the response content.\r\n */\r\n private async ask(request: ChatRequest): Promise<string> {\r\n Logger.info('>>>>Using Standard Chat Endpoint<<<<');\r\n\r\n const currentSession = this.activeSession();\r\n\r\n try {\r\n const response = await this.apiService.sendMessage(request, true); // returns Promise<ApiResponse<ChatResponse>>\r\n\r\n if (this.activeSession() === currentSession) {\r\n this.isLoadingApi.set(false);\r\n }\r\n\r\n if (response?.success && response.data) {\r\n if (\r\n this.activeSession() === currentSession &&\r\n this.activeSession() &&\r\n !this.activeSession()?.response_id\r\n ) {\r\n // First message response - capture the real session ID\r\n const session = this.activeSession();\r\n if (session) session.response_id = response.data.id;\r\n // Invalidate cache to ensure history list updates\r\n this.chatHistoryService.invalidateCache();\r\n }\r\n return response.data.content || this.getFallbackError();\r\n } else {\r\n return this.getFallbackError();\r\n }\r\n } catch (error) {\r\n Logger.error('Ask error:', error);\r\n\r\n if (this.activeSession() === currentSession) {\r\n this.isLoadingApi.set(false);\r\n this.isBotTyping.set(false);\r\n }\r\n\r\n return this.getFallbackError();\r\n }\r\n }\r\n\r\n private async stream(request: ChatRequest): Promise<void> {\r\n Logger.info('>>>>Using Stream Chat Endpoint<<<<');\r\n\r\n const assistantMessage: Message = {\r\n id: this.generateMessageId(),\r\n sender: 'model',\r\n text: '',\r\n chunks: [],\r\n timestamp: new Date(),\r\n completed: false,\r\n isHistory: false,\r\n showSuggestions: false,\r\n };\r\n\r\n const requestSession = this.activeSession();\r\n const streamComplete$ = new Subject<void>();\r\n let hasStarted = false;\r\n\r\n this.apiService.sendMessageStream(request).subscribe({\r\n next: (chunk) => {\r\n if (this.activeSession() !== requestSession) return;\r\n\r\n if (!hasStarted) {\r\n hasStarted = true;\r\n this.isBotTyping.set(false);\r\n\r\n this.addMessage(assistantMessage);\r\n\r\n // capture backend session id once\r\n const session = this.activeSession();\r\n if (session && !session.response_id && chunk.response_id) {\r\n session.response_id = chunk.response_id;\r\n this.chatHistoryService.invalidateCache();\r\n }\r\n }\r\n\r\n if (!chunk.content) return;\r\n\r\n const newText = assistantMessage.text + chunk.content;\r\n assistantMessage.text = newText;\r\n\r\n const html = this.markdownService.convert(newText);\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id ? { ...m, text: newText, textHtml: html } : m,\r\n ),\r\n );\r\n },\r\n complete: () => {\r\n if (this.activeSession() !== requestSession) return;\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) => (m.id === assistantMessage.id ? { ...m, completed: true } : m)),\r\n );\r\n\r\n streamComplete$.next();\r\n streamComplete$.complete();\r\n },\r\n error: () => {\r\n if (this.activeSession() !== requestSession) return;\r\n\r\n const fallback = this.getFallbackError();\r\n const html = this.markdownService.convert(fallback);\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id\r\n ? { ...m, text: fallback, textHtml: html, completed: true }\r\n : m,\r\n ),\r\n );\r\n\r\n streamComplete$.next();\r\n streamComplete$.complete();\r\n },\r\n });\r\n\r\n await lastValueFrom(streamComplete$);\r\n }\r\n}\r\n","import { ButtonStyle } from './../../../../core/models/theme-config.model';\r\nimport { DoohbotConfigService } from './../../../../core/config/doohbot-config.service';\r\nimport { Component, computed, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { ChatService } from '../../chat.service';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\n\r\n@Component({\r\n selector: 'app-chat-button',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-button.component.html',\r\n styleUrls: ['./chat-button.component.scss'],\r\n})\r\nexport class ChatButtonComponent implements OnInit {\r\n isChatOpen = this.chatService.isChatOpen;\r\n unreadCount = this.chatService.unreadCount;\r\n isAuthenticating = this.authService.isAuthenticating;\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n public readonly buttonStyle = computed<ButtonStyle>(() => {\r\n return this.configService.theme()?.buttonStyle ?? 'fab';\r\n });\r\n\r\n isSidebar = computed(() => {\r\n // return this.buttonStyle().startsWith('sidebar');\r\n return this.buttonStyle() === 'sidebar';\r\n });\r\n\r\n sidebarPosition = computed((): 'top' | 'center' | 'bottom' => {\r\n if (!this.isSidebar()) return 'center';\r\n if (this.buttonStyle() === 'sidebar') return 'center';\r\n return this.buttonStyle().split('-')[1] as 'top' | 'center' | 'bottom';\r\n });\r\n\r\n constructor(\r\n private chatService: ChatService,\r\n private configService: DoohbotConfigService,\r\n private authService: AuthService,\r\n ) {}\r\n\r\n ngOnInit(): void {}\r\n\r\n onToggle() {\r\n this.chatService.toggleChat();\r\n }\r\n}\r\n","<!-- fab -->\r\n@if (buttonStyle() === 'fab' && !isChatOpen()) {\r\n <button class=\"chat-fab\" (click)=\"onToggle()\" [disabled]=\"isAuthenticating()\">\r\n <div class=\"fab-content\" [class.loading]=\"isAuthenticating()\">\r\n <img style=\"width: 30px; height: 30px\" [src]=\"doohbotConst.appLogo\" />\r\n @if (unreadCount() > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount() > 9 ? '9+' : unreadCount() }}\r\n </span>\r\n }\r\n </div>\r\n @if (isAuthenticating()) {\r\n <div class=\"fab-loader\">\r\n <mat-spinner diameter=\"34\"></mat-spinner>\r\n </div>\r\n }\r\n </button>\r\n}\r\n\r\n<!-- sidebar button -->\r\n@if (isSidebar() && !isChatOpen()) {\r\n <button class=\"chat-sidebar\" (click)=\"onToggle()\" [ngClass]=\"sidebarPosition()\">\r\n <img\r\n style=\"transform: rotate(-90deg); width: 100px; height: 45px\"\r\n [src]=\"doohbotConst.appTextLogo\"\r\n />\r\n\r\n @if (unreadCount() > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount() > 9 ? '9+' : unreadCount() }}\r\n </span>\r\n }\r\n </button>\r\n}\r\n","export const PredefinedMessages = [\r\n 'Creating a proposal.',\r\n 'What is a screen?',\r\n 'What does SOV stand for?',\r\n];\r\n","import { Component, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { ChatService } from '../../chat.service';\r\n\r\n@Component({\r\n selector: 'app-chat-input',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-input.component.html',\r\n styleUrls: ['./chat-input.component.scss'],\r\n})\r\nexport class ChatInputComponent {\r\n //output\r\n send = output<string>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n constructor(public chatService: ChatService) {}\r\n\r\n onSend(text: string) {\r\n if (text.trim()) {\r\n this.send.emit(text);\r\n }\r\n }\r\n}\r\n","<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input\r\n #messageInput\r\n type=\"text\"\r\n [disabled]=\"chatService.isBotTyping()\"\r\n (keydown.enter)=\"\r\n !chatService.isBotTyping() && onSend(messageInput.value);\r\n !chatService.isBotTyping() && (messageInput.value = '')\r\n \"\r\n [placeholder]=\"doohbotConst.hintText\"\r\n />\r\n\r\n <button\r\n [disabled]=\"chatService.isBotTyping()\"\r\n (click)=\"onSend(messageInput.value); messageInput.value = ''\"\r\n >\r\n <mat-icon [class.disabled-icon]=\"chatService.isBotTyping()\">north</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { SharedMaterialModule } from '../material/material.module';\r\n\r\nexport interface ConfirmationDialogData {\r\n title: string;\r\n message: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n}\r\n\r\n@Component({\r\n selector: 'app-confirmation-dialog',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './confirmation-dialog.component.html',\r\n styleUrl: './confirmation-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfirmationDialogComponent {\r\n readonly dialogRef = inject(MatDialogRef<ConfirmationDialogComponent>);\r\n readonly data = inject<ConfirmationDialogData>(MAT_DIALOG_DATA);\r\n}\r\n","<div class=\"dialog-container\">\r\n <div class=\"dialog-header\">\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n </div>\r\n\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n @if (data.cancelText) {\r\n <button mat-button class=\"cancel-btn\" (click)=\"dialogRef.close(false)\" type=\"button\">\r\n {{ data.cancelText }}\r\n </button>\r\n }\r\n <button\r\n mat-raised-button\r\n class=\"confirm-btn\"\r\n [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n (click)=\"dialogRef.close(true)\"\r\n type=\"button\"\r\n >\r\n {{ data.confirmText || 'Confirm' }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>\r\n","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { SharedMaterialModule } from '../material/material.module';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface InputDialogData {\r\n title: string;\r\n message: string;\r\n initialValue: string;\r\n placeholder?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n}\r\n\r\n@Component({\r\n selector: 'app-input-dialog',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule, FormsModule],\r\n templateUrl: './input-dialog.component.html',\r\n styleUrls: ['./input-dialog.component.scss'],\r\n})\r\nexport class InputDialogComponent {\r\n public value: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<InputDialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: InputDialogData,\r\n ) {\r\n this.value = data.initialValue;\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Save';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.placeholder = this.data.placeholder || 'Enter value...';\r\n this.data.confirmButtonColor = this.data.confirmButtonColor || 'primary';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(null);\r\n }\r\n\r\n onConfirm(): void {\r\n if (this.value && this.value.trim()) {\r\n this.dialogRef.close(this.value.trim());\r\n }\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n <div class=\"input-group\">\r\n <input type=\"text\" class=\"dialog-input\" [(ngModel)]=\"value\" [placeholder]=\"data.placeholder\"\r\n (keyup.enter)=\"onConfirm()\" focus=\"true\" />\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\">{{ data.cancelText }}</button>\r\n <button mat-flat-button class=\"confirm-btn\" [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n [class.primary-btn]=\"data.confirmButtonColor === 'primary'\"\r\n [class.accent-btn]=\"data.confirmButtonColor === 'accent'\" [disabled]=\"!value.trim()\" (click)=\"onConfirm()\">\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>","import { ComponentType } from '@angular/cdk/portal';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { MatDialog, MatDialogConfig } from '@angular/material/dialog';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport {\r\n ConfirmationDialogComponent,\r\n ConfirmationDialogData,\r\n} from './confirmation-dialog.component';\r\nimport { InputDialogComponent, InputDialogData } from '../input-dialog/input-dialog.component';\r\n\r\nexport interface DialogOptions<D = unknown> extends MatDialogConfig<D> {\r\n width?: string;\r\n}\r\n\r\nconst DEFAULT_DIALOG_OPTIONS: DialogOptions = {\r\n width: '560px',\r\n panelClass: 'app-dialog',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n // enterAnimationDuration: '0ms',\r\n // exitAnimationDuration: '0ms',\r\n};\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DialogService {\r\n private readonly dialog = inject(MatDialog);\r\n\r\n /**\r\n * Open any component as a Material dialog.\r\n * Returns an Observable that emits the dialog result when closed.\r\n */\r\n open<T, D = unknown, R = unknown>(\r\n component: ComponentType<T>,\r\n options: DialogOptions<D> = {},\r\n ): Observable<R | undefined> {\r\n const ref = this.dialog.open<T, D, R>(component, {\r\n ...DEFAULT_DIALOG_OPTIONS,\r\n ...options,\r\n } as MatDialogConfig<D>);\r\n return ref.afterClosed();\r\n }\r\n\r\n /**\r\n * Show a confirmation dialog.\r\n * true = confirmed, false/undefined = cancelled.\r\n */\r\n confirm(\r\n data: Omit<ConfirmationDialogData, 'cancelText' | 'confirmText'> & {\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n },\r\n ): Observable<boolean | undefined> {\r\n return this.open<ConfirmationDialogComponent, ConfirmationDialogData, boolean>(\r\n ConfirmationDialogComponent,\r\n {\r\n width: '400px',\r\n data: {\r\n confirmText: data.confirmText ?? 'Confirm',\r\n cancelText: data.cancelText ?? 'Cancel',\r\n confirmButtonColor: data.confirmButtonColor ?? 'primary',\r\n ...data,\r\n },\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Show an informational alert dialog.\r\n */\r\n alert(data: {\r\n title: string;\r\n message: string;\r\n okText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n }): Observable<boolean | undefined> {\r\n return this.confirm({\r\n ...data,\r\n confirmText: data.okText ?? 'OK',\r\n cancelText: '', // Empty string hides the cancel button in the template\r\n });\r\n }\r\n\r\n /**\r\n * Open an input dialog.\r\n * Returns the string value if confirmed, null if cancelled.\r\n */\r\n openInput(data: InputDialogData): Observable<string | null> {\r\n return this.open<InputDialogComponent, InputDialogData, string | null>(InputDialogComponent, {\r\n width: '400px',\r\n data,\r\n }).pipe(map((value) => value ?? null));\r\n }\r\n}\r\n","import { AuthService } from '../../../../core/auth/auth.service';\r\nimport { Component, computed, OnInit, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { DialogService } from '../../../../shared/confirmation-dialog/dialog.service';\r\nimport { ChatSessionDto, ChatSessionGroup } from '../../model/chat-session.model';\r\nimport { input, output } from '@angular/core';\r\nimport { ChatService } from '../../chat.service';\r\n\r\n@Component({\r\n selector: 'app-chat-history',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-history.component.html',\r\n styleUrls: ['./chat-history.component.scss'],\r\n})\r\nexport class ChatHistoryComponent implements OnInit {\r\n //inputs\r\n sessions = input<ChatSessionDto[]>([]);\r\n isOpen = input(false);\r\n // userName = input('User');\r\n isLoading = input(false);\r\n hasMoreSessions = input(false);\r\n isLoadingMore = input(false);\r\n processingSessionId = input<string | null>(null);\r\n activeSessionId = input<string | null>(null); // The ID of the currently active session\r\n // isFullScreen = input(false);\r\n\r\n //outputs\r\n sessionSelected = output<ChatSessionDto>();\r\n sessionDeleted = output<string>();\r\n closed = output<void>();\r\n loadMore = output<void>();\r\n refresh = output<void>();\r\n sessionRenamed = output<{ sessionId: string; newTitle: string }>();\r\n deleteAll = output<void>();\r\n\r\n // Use computed to automatically regroup when sessions change\r\n chatHistory = computed(() => {\r\n // Access signals\r\n const sessionsList = this.sessions();\r\n return this.groupSessions(sessionsList);\r\n });\r\n\r\n isFullScreen = signal(false);\r\n constructor(\r\n private dialogService: DialogService,\r\n private chatService: ChatService,\r\n public authService: AuthService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.isFullScreen = this.chatService.isFullScreen;\r\n }\r\n\r\n // Logic extracted to stand-alone method for computed usage\r\n private groupSessions(sessions: ChatSessionDto[]): ChatSessionGroup[] {\r\n const now = new Date();\r\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const yesterday = new Date(today);\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n const weekAgo = new Date(today);\r\n weekAgo.setDate(weekAgo.getDate() - 7);\r\n\r\n const groups: ChatSessionGroup[] = [\r\n { label: 'Today', sessions: [] },\r\n { label: 'Yesterday', sessions: [] },\r\n { label: 'This Week', sessions: [] },\r\n { label: 'Older', sessions: [] },\r\n ];\r\n\r\n // Deduplicate sessions by ID to prevent NG0955 error\r\n // Filter out sessions without IDs (new sessions not yet persisted)\r\n const sessionsWithIds = sessions.filter((s) => s.response_id !== null);\r\n const uniqueSessionsMap = new Map<string, ChatSessionDto>();\r\n sessionsWithIds.forEach((s) => uniqueSessionsMap.set(s.response_id!, s));\r\n const uniqueSessions = Array.from(uniqueSessionsMap.values());\r\n\r\n // Sort sessions by timestamp (newest first)\r\n const sortedSessions = uniqueSessions.sort(\r\n (a, b) => new Date(b.last_message_at).getTime() - new Date(a.last_message_at).getTime(),\r\n );\r\n\r\n sortedSessions.forEach((session) => {\r\n const sessionDate = new Date(session.last_message_at);\r\n const sessionDayStart = new Date(\r\n sessionDate.getFullYear(),\r\n sessionDate.getMonth(),\r\n sessionDate.getDate(),\r\n );\r\n\r\n if (sessionDayStart.getTime() === today.getTime()) {\r\n groups[0].sessions.push(session);\r\n } else if (sessionDayStart.getTime() === yesterday.getTime()) {\r\n groups[1].sessions.push(session);\r\n } else if (sessionDayStart.getTime() >= weekAgo.getTime()) {\r\n groups[2].sessions.push(session);\r\n } else {\r\n groups[3].sessions.push(session);\r\n }\r\n });\r\n\r\n // Filter out empty groups\r\n return groups.filter((g) => g.sessions.length > 0);\r\n }\r\n\r\n onSessionClick(session: ChatSessionDto): void {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onEditClick(event: Event, session: ChatSessionDto): void {\r\n event.stopPropagation();\r\n this.dialogService\r\n .openInput({\r\n title: 'Rename Conversation',\r\n message: 'Enter a new title for this conversation:',\r\n initialValue: session.title,\r\n placeholder: 'New title...',\r\n confirmText: 'Rename',\r\n })\r\n .subscribe((newTitle) => {\r\n if (\r\n newTitle !== null &&\r\n newTitle.trim() !== '' &&\r\n newTitle !== session.title &&\r\n session.response_id\r\n ) {\r\n this.sessionRenamed.emit({ sessionId: session.response_id, newTitle: newTitle.trim() });\r\n }\r\n });\r\n }\r\n\r\n onDeleteClick(event: Event, sessionId: string): void {\r\n if (!sessionId) return;\r\n event.stopPropagation();\r\n this.dialogService\r\n .confirm({\r\n title: 'Confirm Delete',\r\n message: 'Are you sure you want to delete this conversation? This action cannot be undone.',\r\n confirmText: 'Delete',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.sessionDeleted.emit(sessionId);\r\n }\r\n });\r\n }\r\n\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n\r\n formatTime(date: Date): string {\r\n return new Date(date).toLocaleTimeString('en-US', {\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n }\r\n\r\n formatDate(date: Date): string {\r\n return new Date(date).toLocaleDateString('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n }\r\n\r\n /**\r\n * Handle scroll event for infinite scroll\r\n */\r\n onScroll(event: Event): void {\r\n const element = event.target as HTMLElement;\r\n const scrollTop = element.scrollTop;\r\n const scrollHeight = element.scrollHeight;\r\n const clientHeight = element.clientHeight;\r\n\r\n // Check if scrolled near bottom (within 100px)\r\n const scrollBottom = scrollHeight - scrollTop - clientHeight;\r\n if (\r\n scrollBottom < 100 &&\r\n this.hasMoreSessions() &&\r\n !this.isLoadingMore() &&\r\n !this.isLoading()\r\n ) {\r\n this.loadMore.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Handle manual refresh\r\n */\r\n onRefresh(): void {\r\n this.refresh.emit();\r\n }\r\n\r\n /**\r\n * Handle clear all history\r\n */\r\n onClearAllClick(): void {\r\n this.dialogService\r\n .confirm({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.deleteAll.emit();\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"history-sidebar\" [class.open]=\"isOpen()\">\r\n <div class=\"sidebar-header\">\r\n <div class=\"marquee-container\">\r\n <h3 class=\"marquee-text\">{{ authService.username() }}</h3>\r\n </div>\r\n <button class=\"refresh-btn\" type=\"button\" (click)=\"onRefresh()\" matTooltip=\"Refresh history\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n\r\n @if (!isFullScreen()) {\r\n <button class=\"close-btn\" (click)=\"onClose()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"sidebar-content\" (scroll)=\"onScroll($event)\">\r\n @if (isLoading()) {\r\n <div class=\"loader-container\">\r\n <div class=\"loader\"></div>\r\n <p>Loading history...</p>\r\n </div>\r\n }\r\n\r\n @if (!isLoading() && sessions().length === 0) {\r\n <div class=\"empty-state\">\r\n <mat-icon>history</mat-icon>\r\n <p>No chat history yet</p>\r\n <span>Start a conversation to see it here</span>\r\n </div>\r\n }\r\n\r\n @if (!isLoading()) {\r\n @for (group of chatHistory(); track group.label) {\r\n <div class=\"session-group\">\r\n <div class=\"group-label\">{{ group.label }}</div>\r\n <div class=\"session-list\">\r\n @for (session of group.sessions; track session.response_id) {\r\n <div\r\n class=\"session-item\"\r\n [class.active]=\"activeSessionId() === session.response_id\"\r\n (click)=\"onSessionClick(session)\"\r\n >\r\n <div class=\"session-content\">\r\n <div class=\"session-title\">{{ session.title }}</div>\r\n <div class=\"session-time\">\r\n {{ formatTime(session.last_message_at) }} ·\r\n {{ formatDate(session.last_message_at) }}\r\n </div>\r\n </div>\r\n <div class=\"session-actions\">\r\n <button\r\n class=\"edit-btn\"\r\n [disabled]=\"processingSessionId() === session.response_id\"\r\n (click)=\"onEditClick($event, session)\"\r\n matTooltip=\"Edit\"\r\n >\r\n @if (processingSessionId() !== session.response_id) {\r\n <mat-icon>edit</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n <button\r\n class=\"delete-btn\"\r\n [disabled]=\"processingSessionId() === session.response_id\"\r\n (click)=\"onDeleteClick($event, session.response_id)\"\r\n matTooltip=\"Delete\"\r\n >\r\n @if (processingSessionId() !== session.response_id) {\r\n <mat-icon>delete</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Loading more indicator -->\r\n @if (isLoadingMore()) {\r\n <div class=\"loading-more\">\r\n <div class=\"loader-small\"></div>\r\n <p>Loading more...</p>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { Injectable, signal, inject, effect } from '@angular/core';\r\nimport { StorageService } from '../../core/auth/storage.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { HttpService } from '../../core/http/http.service';\r\nimport { ApiResponse } from '../../core/models/api-response.model';\r\n\r\nexport interface Characteristics {\r\n warm: string;\r\n enthusiastic: string;\r\n headersAndLists: string;\r\n emoji: string;\r\n}\r\n\r\nexport interface AboutYou {\r\n nickname: string;\r\n occupation: string;\r\n}\r\n\r\nexport interface CustomInstructions {\r\n instructions?: string;\r\n preferences?: string;\r\n user_context_id?: string;\r\n}\r\n\r\nexport interface AppearanceSettings {\r\n theme: 'light' | 'dark' | 'auto';\r\n language: string;\r\n}\r\n\r\nexport interface PersonalizationSettings {\r\n customInstructions: CustomInstructions;\r\n appearance: AppearanceSettings;\r\n meta: {\r\n version: number;\r\n lastUpdated: number;\r\n };\r\n}\r\n\r\nconst BASE_STORAGE_KEY = 'app.personalization.v1';\r\n\r\nconst DEFAULT_SETTINGS: PersonalizationSettings = {\r\n customInstructions: { instructions: '', preferences: '' },\r\n appearance: {\r\n theme: 'auto',\r\n language: 'en',\r\n },\r\n meta: {\r\n version: 1,\r\n lastUpdated: Date.now(),\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PersonalizationService {\r\n private storage = inject(StorageService);\r\n private authService = inject(AuthService);\r\n\r\n // State Signals\r\n private _settings = signal<PersonalizationSettings>(DEFAULT_SETTINGS);\r\n public settings = this._settings.asReadonly();\r\n\r\n constructor(private http: HttpService) {\r\n // Reload settings when auth status changes (user logins or logouts)\r\n effect(\r\n () => {\r\n // const status = this.authStatus();\r\n this._settings.set(this.loadSettings());\r\n },\r\n { allowSignalWrites: true }, // TODO:allowSignalWrites\r\n );\r\n // Automatically persist changes when settings signal updates\r\n effect(() => {\r\n const currentSettings = this._settings();\r\n this.saveSettings(currentSettings);\r\n });\r\n }\r\n\r\n private getStorageKey(): string {\r\n const userId = this.authService.userId();\r\n return userId ? `${BASE_STORAGE_KEY}_${userId}` : BASE_STORAGE_KEY;\r\n }\r\n\r\n /**\r\n * Update custom instructions\r\n */\r\n updateInstructions(instructions: Partial<CustomInstructions>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n customInstructions: {\r\n instructions: instructions.instructions ?? '',\r\n preferences: instructions.preferences ?? '',\r\n user_context_id: instructions.user_context_id ?? s.customInstructions.user_context_id,\r\n },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n /**\r\n * Update appearance settings\r\n */\r\n updateAppearance(appearance: Partial<AppearanceSettings>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n appearance: { ...s.appearance, ...appearance },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n /**\r\n * Reset all personalization to defaults\r\n */\r\n resetToDefaults() {\r\n this._settings.set({\r\n ...DEFAULT_SETTINGS,\r\n meta: { ...DEFAULT_SETTINGS.meta, lastUpdated: Date.now() },\r\n });\r\n }\r\n\r\n async saveCustomInstructions(data: CustomInstructions) {\r\n try {\r\n const current = this._settings().customInstructions;\r\n\r\n let res: ApiResponse<CustomInstructions> | null = null;\r\n\r\n if (current?.user_context_id) {\r\n // Update existing record\r\n res = await this.http.put(\r\n `users-context/`,\r\n data,\r\n true, // showLoader\r\n );\r\n } else {\r\n // Create new record\r\n res = await this.http.post('users-context/', data, true);\r\n }\r\n\r\n if (res?.success && res.data) {\r\n await this.updateInstructions({\r\n instructions: res.data.instructions ?? current?.instructions ?? '',\r\n preferences: res.data.preferences ?? current?.preferences ?? '',\r\n user_context_id: res.data.user_context_id ?? current?.user_context_id,\r\n });\r\n }\r\n } catch (e) {\r\n console.error('Failed saving custom instructions', e);\r\n }\r\n }\r\n\r\n loadCustomInstructions() {\r\n this.getCustomInstructionHttpHelper(true)\r\n .then((res) => {\r\n if (res?.success && res.data) {\r\n this.updateInstructions({\r\n instructions: res.data.instructions ?? '',\r\n preferences: res.data.preferences ?? '',\r\n user_context_id: res.data.user_context_id,\r\n });\r\n }\r\n })\r\n .catch((e) => {\r\n console.error('Failed loading user custom instructions', e);\r\n });\r\n }\r\n\r\n getCustomInstructionHttpHelper(showLoader = false): Promise<ApiResponse<CustomInstructions>> {\r\n const userId = this.authService.userId();\r\n return this.http.get(`users-context/${userId}`, undefined, false, showLoader);\r\n }\r\n\r\n private loadSettings(): PersonalizationSettings {\r\n try {\r\n const key = this.getStorageKey();\r\n // StorageService.get handles decryption/parsing\r\n const saved = this.storage.get(key) as any;\r\n if (saved) {\r\n return {\r\n ...DEFAULT_SETTINGS,\r\n ...saved,\r\n appearance: {\r\n ...DEFAULT_SETTINGS.appearance,\r\n ...(saved.appearance || {}),\r\n },\r\n };\r\n }\r\n } catch (e) {\r\n console.error('Failed to load personalization settings', e);\r\n }\r\n\r\n // Return defaults\r\n return {\r\n ...DEFAULT_SETTINGS,\r\n appearance: {\r\n ...DEFAULT_SETTINGS.appearance,\r\n },\r\n };\r\n }\r\n\r\n private saveSettings(settings: PersonalizationSettings) {\r\n const key = this.getStorageKey();\r\n this.storage.set(key, settings);\r\n }\r\n}\r\n","import {\r\n effect,\r\n ElementRef,\r\n Injectable,\r\n OnDestroy,\r\n Renderer2,\r\n RendererFactory2,\r\n signal,\r\n} from '@angular/core';\r\nimport { OverlayContainer } from '@angular/cdk/overlay';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\nimport { PersonalizationService } from '../../app/personalization/personalization.service';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService implements OnDestroy {\r\n private renderer: Renderer2;\r\n\r\n private _theme = signal<ThemeMode>('auto');\r\n public theme = this._theme.asReadonly();\r\n\r\n private _activeTheme = signal<'light-theme' | 'dark-theme'>('light-theme');\r\n public activeTheme = this._activeTheme.asReadonly();\r\n\r\n private observer: MutationObserver | null = null;\r\n private rootElement: HTMLElement | null = null;\r\n\r\n constructor(\r\n rendererFactory: RendererFactory2,\r\n private overlay: OverlayContainer,\r\n private personalization: PersonalizationService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n\r\n /**\r\n * Sync theme + primary color with personalization\r\n */\r\n effect(\r\n () => {\r\n const settings = this.personalization.settings();\r\n const mode = settings.appearance.theme;\r\n\r\n this._theme.set(mode);\r\n this.updateActiveTheme(mode);\r\n\r\n const configPrimaryColor = this.configService.theme()?.primaryColor;\r\n if (configPrimaryColor) {\r\n this.applyPrimaryColorToGlobal(configPrimaryColor);\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n }\r\n\r\n /**\r\n * Called by DoohbotComponent during init\r\n */\r\n public setThemeConfig(elementRef: ElementRef, isDarkMode?: boolean) {\r\n const host = elementRef.nativeElement;\r\n this.rootElement = host;\r\n\r\n const config = this.configService.theme();\r\n\r\n const activeTheme =\r\n isDarkMode !== undefined ? (isDarkMode ? 'dark-theme' : 'light-theme') : this._activeTheme();\r\n\r\n this.renderer.removeClass(host, 'light-theme');\r\n this.renderer.removeClass(host, 'dark-theme');\r\n this.renderer.addClass(host, activeTheme);\r\n\r\n /**\r\n * Always apply palette\r\n */\r\n const palette = config?.palette || 'doohbot';\r\n this.applyPaletteToGlobal(palette);\r\n\r\n /**\r\n * Apply CSS overrides if provided\r\n */\r\n this.applyCssVariables(host, config);\r\n }\r\n\r\n public applyPrimaryColorToGlobal(colorInput: string) {\r\n if (!colorInput || colorInput === 'default') return;\r\n\r\n let color = colorInput;\r\n\r\n if (color.includes(',')) {\r\n const parts = color.split(',').map((p) => p.trim());\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n color = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n }\r\n\r\n const targetElement = this.rootElement;\r\n if (!targetElement) return;\r\n\r\n const overlayContainer = this.overlay.getContainerElement();\r\n const onPrimary = this.getContrastColor(color);\r\n\r\n targetElement.style.setProperty('--db-primary', color);\r\n targetElement.style.setProperty('--db-primary-rgb', this.hexToRgb(color));\r\n targetElement.style.setProperty('--db-bg-user-msg', color);\r\n targetElement.style.setProperty('--db-text-user-msg', onPrimary);\r\n\r\n overlayContainer.style.setProperty('--db-primary', color);\r\n overlayContainer.style.setProperty('--db-primary-rgb', this.hexToRgb(color));\r\n }\r\n\r\n private hexToRgb(hex: string): string {\r\n const cleanHex = hex.replace('#', '');\r\n const r = parseInt(cleanHex.substring(0, 2), 16);\r\n const g = parseInt(cleanHex.substring(2, 4), 16);\r\n const b = parseInt(cleanHex.substring(4, 6), 16);\r\n return `${r}, ${g}, ${b}`;\r\n }\r\n\r\n private getContrastColor(hex: string): string {\r\n const cleanHex = hex.replace('#', '');\r\n const r = parseInt(cleanHex.substring(0, 2), 16);\r\n const g = parseInt(cleanHex.substring(2, 4), 16);\r\n const b = parseInt(cleanHex.substring(4, 6), 16);\r\n\r\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n\r\n return luminance > 0.6 ? '#000000' : '#ffffff';\r\n }\r\n\r\n setTheme(mode: ThemeMode): void {\r\n this.personalization.updateAppearance({ theme: mode });\r\n }\r\n\r\n private updateActiveTheme(mode: ThemeMode) {\r\n this.cleanupObservers();\r\n\r\n if (mode === 'auto') {\r\n this.handleAutoTheme();\r\n } else {\r\n const themeToApply = mode === 'dark' ? 'dark-theme' : 'light-theme';\r\n this._activeTheme.set(themeToApply);\r\n this.applyThemeToGlobal(themeToApply);\r\n }\r\n }\r\n\r\n private handleAutoTheme() {\r\n // Initial detection\r\n this.detectAndApplyParentTheme();\r\n\r\n // Watch for changes in parent\r\n this.observer = new MutationObserver(() => {\r\n this.detectAndApplyParentTheme();\r\n });\r\n\r\n this.observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n\r\n this.observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n }\r\n\r\n private detectAndApplyParentTheme() {\r\n const isDark = this.isParentDark();\r\n const newTheme = isDark ? 'dark-theme' : 'light-theme';\r\n\r\n // Only update if changed to avoid unnecessary DOM updates\r\n if (this._activeTheme() !== newTheme) {\r\n this._activeTheme.set(newTheme);\r\n this.applyThemeToGlobal(newTheme);\r\n }\r\n }\r\n\r\n private isParentDark(): boolean {\r\n const body = document.body;\r\n const html = document.documentElement;\r\n // Check for common class names\r\n\r\n const darkClasses = ['dark', 'dark-theme', 'dark-mode', 'night-mode'];\r\n\r\n const hasDarkClass = (el: HTMLElement) => darkClasses.some((c) => el.classList.contains(c));\r\n\r\n if (hasDarkClass(body) || hasDarkClass(html)) return true;\r\n // Check for data-theme attribute\r\n\r\n if (body.getAttribute('data-theme') === 'dark' || html.getAttribute('data-theme') === 'dark')\r\n return true;\r\n // Check for Bootstrap 5.3+ data-bs-theme\r\n\r\n if (\r\n body.getAttribute('data-bs-theme') === 'dark' ||\r\n html.getAttribute('data-bs-theme') === 'dark'\r\n )\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n private applyThemeToGlobal(theme: 'light-theme' | 'dark-theme') {\r\n const overlayContainer = this.overlay.getContainerElement();\r\n // Apply to the package root element to ensure local isolation\r\n\r\n if (this.rootElement) {\r\n this.renderer.removeClass(this.rootElement, 'light-theme');\r\n this.renderer.removeClass(this.rootElement, 'dark-theme');\r\n this.renderer.addClass(this.rootElement, theme);\r\n }\r\n // Also apply to overlay container (for menus/dialogs)\r\n\r\n this.renderer.removeClass(overlayContainer, 'light-theme');\r\n this.renderer.removeClass(overlayContainer, 'dark-theme');\r\n this.renderer.addClass(overlayContainer, theme);\r\n }\r\n\r\n private applyPaletteToGlobal(palette: string) {\r\n if (!this.rootElement) return;\r\n\r\n const overlayContainer = this.overlay.getContainerElement();\r\n\r\n const paletteClasses = [\r\n 'db-theme-doohbot',\r\n 'db-theme-aqua',\r\n 'db-theme-candy',\r\n 'db-theme-forest',\r\n 'db-theme-midnight',\r\n 'db-theme-sunset',\r\n 'db-theme-slate',\r\n ];\r\n\r\n const apply = (el: HTMLElement) => {\r\n paletteClasses.forEach((cls) => this.renderer.removeClass(el, cls));\r\n this.renderer.addClass(el, `db-theme-${palette}`);\r\n };\r\n\r\n apply(this.rootElement);\r\n apply(overlayContainer);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupObservers();\r\n }\r\n\r\n private cleanupObservers() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n }\r\n\r\n public applyCssVariables(element: HTMLElement, config?: DoohbotThemeConfig) {\r\n if (!config) return;\r\n\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n\r\n const applyColor = (input: string | undefined, variable: string) => {\r\n if (!input) return;\r\n\r\n const parts = input.split(',').map((p) => p.trim());\r\n const color = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n\r\n element.style.setProperty(`--${variable}`, color);\r\n this.overlay.getContainerElement().style.setProperty(`--${variable}`, color);\r\n };\r\n\r\n applyColor(config.secondaryColor, 'db-secondary');\r\n\r\n // Backgrounds\r\n applyColor(config.backgroundColor, 'db-bg-color');\r\n applyColor(config.chatInputColor, 'db-bg-chat-input');\r\n\r\n // Text Colors\r\n applyColor(config.textColor, 'db-text-primary');\r\n applyColor(config.secondaryTextColor, 'db-text-secondary');\r\n applyColor(config.textAltColor, 'db-text-tertiary');\r\n applyColor(config.hintTextColor, 'db-text-hint');\r\n\r\n // Button Colors\r\n applyColor(config.buttonColor, 'db-color-button');\r\n\r\n // Message Colors\r\n applyColor(config.userMessageColor, 'db-bg-user-msg');\r\n applyColor(config.botMessageColor, 'db-bg-bot-msg');\r\n\r\n // Message Text Colors\r\n applyColor(config.userTextColor, 'db-text-user-msg');\r\n applyColor(config.botTextColor, 'db-text-bot-msg');\r\n\r\n // Borders\r\n applyColor(config.borderColor, 'db-border-color');\r\n applyColor(config.borderShadowColor, 'db-border-shadow');\r\n applyColor(config.borderTopColor, 'db-border-top');\r\n\r\n // Indicators\r\n applyColor(config.typingIndicatorColor, 'db-color-typing');\r\n }\r\n}\r\n","import { ButtonStyle } from './../../../../core/models/theme-config.model';\r\nimport { DoohbotConfigService } from './../../../../core/config/doohbot-config.service';\r\nimport { Component, computed, input, OnInit, output, signal, inject } from '@angular/core';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { map } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { ThemeService } from '../../../../core/services/theme.service';\r\nimport { ChatService } from '../../chat.service';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\n\r\n@Component({\r\n selector: 'app-chat-header',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-header.component.html',\r\n styleUrls: ['./chat-header.component.scss'],\r\n})\r\nexport class ChatHeaderComponent implements OnInit {\r\n //inputs\r\n settingsMenu = input<any>();\r\n isNewChatDisabled = input(false);\r\n\r\n //outputs\r\n toggleFullScreen = output<void>();\r\n toggleHistorySidebar = output<void>();\r\n clearChat = output<void>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n public readonly buttonStyle = computed<ButtonStyle>(() => {\r\n return this.configService.theme()?.buttonStyle ?? 'fab';\r\n });\r\n\r\n public isFullScreen = signal(false);\r\n\r\n private breakpointObserver = inject(BreakpointObserver);\r\n public isMobile = toSignal(\r\n this.breakpointObserver.observe('(max-width: 768px)').pipe(map((result) => result.matches)),\r\n { initialValue: false },\r\n );\r\n\r\n constructor(\r\n private configService: DoohbotConfigService,\r\n public themeService: ThemeService,\r\n public chatService: ChatService,\r\n public authService: AuthService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.isFullScreen = this.chatService.isFullScreen;\r\n }\r\n\r\n onToggleChat() {\r\n this.chatService.toggleChat();\r\n // this.toggleChat.emit();\r\n }\r\n\r\n openHistorySidebar() {\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onStartNewConversation() {\r\n this.chatService.startNewSession();\r\n this.chatService.closeHistorySidebar();\r\n }\r\n}\r\n","<div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img class=\"chat-logo\" [src]=\"doohbotConst.appLogo\" alt=\"Logo\" />\r\n <h2>{{ doohbotConst.appTitle }}</h2>\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- New chat Button -->\r\n @if (authService.isAuthenticated()) {\r\n <button class=\"header-button\" (click)=\"onStartNewConversation()\" matTooltip=\"New Chat\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- History Button -->\r\n @if (authService.isAuthenticated() && (!isFullScreen() || isMobile())) {\r\n <button class=\"header-button\" (click)=\"openHistorySidebar()\" matTooltip=\"History\">\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- Full-Screen Button -->\r\n <button class=\"header-button\" (click)=\"onToggleFullScreen()\" matTooltip=\"Fullscreen\">\r\n <mat-icon>{{ isFullScreen() ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n </button>\r\n\r\n <!-- Profile Avatar / Menu Button -->\r\n @if (authService.isAuthenticated()) {\r\n <button\r\n class=\"header-button avatar-button\"\r\n [matMenuTriggerFor]=\"settingsMenu()\"\r\n matTooltip=\"Profile\"\r\n >\r\n @if (authService.profileImageUrl()) {\r\n <img [src]=\"authService.profileImageUrl()\" class=\"profile-avatar\" alt=\"Profile\" />\r\n } @else {\r\n <mat-icon>account_circle</mat-icon>\r\n }\r\n </button>\r\n }\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\" matTooltip=\"Minimize\">\r\n <mat-icon style=\"line-height: 0.3rem\">minimize</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n","import { Component, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SharedMaterialModule } from '../../shared/material/material.module';\r\nimport { doohbotConst } from '../../const/doohbot-constant';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\n\r\n@Component({\r\n selector: 'app-login-form',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, SharedMaterialModule],\r\n templateUrl: './login-form.component.html',\r\n styleUrls: ['./login-form.component.scss'],\r\n})\r\nexport class LoginFormComponent {\r\n public loginUsername = '';\r\n public loginPassword = '';\r\n public showPassword = false;\r\n public rememberMe = false;\r\n readonly doohbotConst = doohbotConst;\r\n readonly isLoggingIn = signal(false);\r\n\r\n constructor(private authService: AuthService) {}\r\n\r\n togglePasswordVisibility() {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n async onLoginSubmit() {\r\n if (!this.loginUsername || !this.loginPassword) return;\r\n\r\n this.isLoggingIn.set(true);\r\n\r\n try {\r\n await this.authService.login({\r\n username: this.loginUsername.toLowerCase(),\r\n password: this.loginPassword,\r\n rememberMe: this.rememberMe,\r\n });\r\n } finally {\r\n this.isLoggingIn.set(false);\r\n }\r\n }\r\n}\r\n","<div class=\"login-wrapper\">\r\n <form\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n #loginForm=\"ngForm\"\r\n >\r\n <img [src]=\"doohbotConst.appLogo\" alt=\"Welcome\" class=\"logo-image\" style=\"border-radius: 0px\" />\r\n <h3 class=\"login-title\">Login</h3>\r\n\r\n <div class=\"login-fields\">\r\n <!-- Username Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Username</label>\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n #username=\"ngModel\"\r\n placeholder=\"Enter your username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n @if (username.invalid && (username.dirty || username.touched)) {\r\n <span class=\"error-text\"> Username is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Password Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Password</label>\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n #password=\"ngModel\"\r\n placeholder=\"Enter your password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n @if (password.invalid && (password.dirty || password.touched)) {\r\n <span class=\"error-text\"> Password is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Remember Me -->\r\n <div class=\"remember-me-container\">\r\n <label class=\"remember-me-label\">\r\n <input\r\n type=\"checkbox\"\r\n name=\"rememberMe\"\r\n [(ngModel)]=\"rememberMe\"\r\n class=\"remember-me-checkbox\"\r\n />\r\n <span class=\"remember-me-text\">Remember me</span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button\r\n type=\"submit\"\r\n class=\"auth-btn primary\"\r\n [disabled]=\"loginForm.invalid || isLoggingIn()\"\r\n >\r\n {{ isLoggingIn() ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n </form>\r\n</div>\r\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chat-footer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chat-footer.component.html',\r\n styleUrls: ['./chat-footer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChatFooterComponent {\r\n showDisclaimer = input(false);\r\n}\r\n","@if (showDisclaimer()) {\r\n <div class=\"chat-footer-container\">\r\n <p class=\"disclaimer\">AI-generated content may not be accurate.</p>\r\n </div>\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chips',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chips.component.html',\r\n styleUrls: ['./chips.component.scss'],\r\n})\r\nexport class Chips {\r\n @Input() messages: string[] = []; // messages array\r\n @Input() disabled = false;\r\n @Output() chipClick = new EventEmitter<string>(); // emit clicked chip\r\n\r\n onChipClick(msg: string) {\r\n if (this.disabled) return;\r\n this.chipClick.emit(msg);\r\n }\r\n}\r\n","@if (messages.length > 0) {\r\n <div class=\"predefined-chips\">\r\n @for (msg of messages; track msg) {\r\n <button class=\"chip\" (click)=\"onChipClick(msg)\">\r\n {{ msg }}\r\n </button>\r\n }\r\n </div>\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\n\r\n@Component({\r\n selector: 'app-preferences-section',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './preferences-section.component.html',\r\n styleUrls: ['./preferences-section.component.scss'],\r\n})\r\nexport class PreferencesSectionComponent {\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() defaultColor: string = 'doohbot';\r\n @Input() username: string = 'User';\r\n @Input() userImageUrl: string | null = null;\r\n @Input() userRole: string = 'Doohbot User';\r\n\r\n // get initials(): string {\r\n // return this.username ? this.username.charAt(0).toUpperCase() : 'U';\r\n // }\r\n\r\n @Output() onThemeSelect = new EventEmitter<'light' | 'dark' | 'auto'>();\r\n @Output() onLanguageSelect = new EventEmitter<string>();\r\n @Output() onSave = new EventEmitter<void>();\r\n @Output() onReset = new EventEmitter<void>();\r\n\r\n public languages = [\r\n { code: 'en', label: 'English' },\r\n { code: 'es', label: 'Spanish' },\r\n { code: 'fr', label: 'French' },\r\n { code: 'de', label: 'German' },\r\n { code: 'it', label: 'Italian' },\r\n { code: 'pt', label: 'Portuguese' },\r\n { code: 'zh', label: 'Chinese' },\r\n { code: 'ja', label: 'Japanese' },\r\n { code: 'ko', label: 'Korean' },\r\n { code: 'ar', label: 'Arabic' },\r\n { code: 'hi', label: 'Hindi' },\r\n ];\r\n\r\n // Color and Style helpers removed\r\n\r\n getThemeIcon(theme: string): string {\r\n switch (theme) {\r\n case 'light':\r\n return 'light_mode';\r\n case 'dark':\r\n return 'dark_mode';\r\n default:\r\n return 'brightness_auto';\r\n }\r\n }\r\n\r\n getThemeLabel(theme: string): string {\r\n switch (theme) {\r\n case 'light':\r\n return 'Light Mode';\r\n case 'dark':\r\n return 'Dark Mode';\r\n default:\r\n return 'System';\r\n }\r\n }\r\n\r\n getLanguageLabel(code: string): string {\r\n return this.languages.find((l) => l.code === code)?.label || 'Select';\r\n }\r\n\r\n // Style and Picker helpers removed\r\n}\r\n","<div class=\"preferences-container\">\r\n <header class=\"pane-header\">\r\n <h1>General & Profile</h1>\r\n <p>Manage your profile and customize how your assistant looks.</p>\r\n </header>\r\n\r\n <div class=\"profile-card\">\r\n <div class=\"avatar-section\">\r\n <div class=\"letter-avatar\" [class.has-image]=\"!!userImageUrl\">\r\n @if (userImageUrl) {\r\n <img [src]=\"userImageUrl\" [alt]=\"username\" class=\"profile-img\" />\r\n } @else {\r\n <!-- {{ initials }} -->\r\n <mat-icon class=\"user-avatar-icon\">account_circle</mat-icon>\r\n }\r\n </div>\r\n <div class=\"user-main-info\">\r\n <h2>{{ username }}</h2>\r\n <p class=\"role-badge\">{{ userRole }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"info-grid\">\r\n <div class=\"info-item\">\r\n <label>Full Name</label>\r\n <div class=\"info-value\">{{ username }}</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Email Address</label>\r\n <div class=\"info-value\">user&#64;adzen.tech</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Organization</label>\r\n <div class=\"info-value\">Adzen Tech Private Limited</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Member Since</label>\r\n <div class=\"info-value\">January 2026</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"settings-list\">\r\n <!-- Appearance Row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Appearance</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select\r\n [value]=\"settings.appearance.theme\"\r\n (selectionChange)=\"onThemeSelect.emit($event.value)\"\r\n >\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <mat-icon>{{ getThemeIcon(settings.appearance.theme) }}</mat-icon>\r\n <span>{{ getThemeLabel(settings.appearance.theme) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"light\">\r\n <div class=\"option-content\">\r\n <mat-icon>light_mode</mat-icon>\r\n <span>Light Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"dark\">\r\n <div class=\"option-content\">\r\n <mat-icon>dark_mode</mat-icon>\r\n <span>Dark Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"auto\">\r\n <div class=\"option-content\">\r\n <mat-icon>brightness_auto</mat-icon>\r\n <span>System</span>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Language Row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Language</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select\r\n [value]=\"settings.appearance.language\"\r\n (selectionChange)=\"onLanguageSelect.emit($event.value)\"\r\n >\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <span>{{ getLanguageLabel(settings.appearance.language) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n @for (lang of languages; track lang.code) {\r\n <mat-option [value]=\"lang.code\">\r\n {{ lang.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Voice Placeholder -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Voice</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Cove</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Data Controls Placeholder -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Data controls</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Manage</button>\r\n </div>\r\n </div>-->\r\n </div>\r\n\r\n <div class=\"section-actions\">\r\n <button mat-button class=\"pill-btn\" (click)=\"onReset.emit()\">Reset to defaults</button>\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" (click)=\"onSave.emit()\">Save</button>\r\n </div>\r\n</div>\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-terms-section',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './terms-section.component.html',\r\n styleUrls: ['./terms-section.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TermsSectionComponent { }\r\n","<div class=\"terms-container\">\r\n <header class=\"pane-header\">\r\n <h1>Terms and Conditions</h1>\r\n <!-- <p class=\"last-updated\">Last updated: January 9, 2026</p> -->\r\n </header>\r\n\r\n <div class=\"terms-card\">\r\n <div class=\"terms-content\">\r\n <section>\r\n <h4>1. Acceptance of Terms</h4>\r\n <p>\r\n By using Doohbot, you agree to comply with and be bound by these terms and conditions.\r\n Please read them carefully.\r\n </p>\r\n </section>\r\n\r\n <section>\r\n <h4>2. Privacy & Data</h4>\r\n <p>\r\n We value your privacy. Your chat history and personalization settings are stored locally\r\n or securely on our servers to improve your experience.\r\n </p>\r\n </section>\r\n\r\n <section>\r\n <h4>3. Usage Guidelines</h4>\r\n <p>\r\n Doohbot is intended for professional use within the Doohclick ecosystem. Misuse or\r\n automated scraping is strictly prohibited.\r\n </p>\r\n </section>\r\n\r\n <div class=\"full-terms-link\">\r\n <a href=\"#\">View Full Terms and Conditions →</a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { DoohbotConfigService } from './../../../../core/config/doohbot-config.service';\r\nimport { Component, Input, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { DialogService } from '../../../../shared/confirmation-dialog/dialog.service';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\n\r\nexport interface ActiveSession {\r\n id: string;\r\n device: string;\r\n location: string;\r\n created: string;\r\n updated: string;\r\n isCurrent?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'app-account-section',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './account-section.component.html',\r\n styleUrls: ['./account-section.component.scss'],\r\n})\r\nexport class AccountSectionComponent {\r\n @Input() organizationId: string = '';\r\n public isCopied = false;\r\n\r\n constructor(\r\n public authService: AuthService,\r\n public config: DoohbotConfigService,\r\n private dialogService: DialogService,\r\n private cd: ChangeDetectorRef,\r\n ) {}\r\n\r\n ngOnInit() {\r\n if (!this.organizationId) {\r\n this.organizationId = this.authService.organizationId() || '';\r\n }\r\n }\r\n\r\n @Output() onDeleteAllHistory = new EventEmitter<void>();\r\n @Output() onLogoutSession = new EventEmitter<string>();\r\n @Output() onDeleteAccount = new EventEmitter<void>();\r\n\r\n onLogout() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Logout',\r\n message: 'Are you sure you want to log out?',\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.authService.logout();\r\n }\r\n });\r\n }\r\n\r\n public sessions: ActiveSession[] = [\r\n {\r\n id: 'session-1',\r\n device: 'Chrome (Windows)',\r\n location: 'Kathmandu, Bagmati Province, NP',\r\n created: 'Jan 9, 2026, 9:21 AM',\r\n updated: 'Jan 9, 2026, 9:21 AM',\r\n isCurrent: true,\r\n },\r\n ];\r\n\r\n copyOrgId() {\r\n const orgId = this.authService.organizationId();\r\n if (orgId) {\r\n navigator.clipboard.writeText(orgId);\r\n this.isCopied = true;\r\n this.cd.detectChanges();\r\n\r\n setTimeout(() => {\r\n this.isCopied = false;\r\n this.cd.detectChanges();\r\n }, 800);\r\n }\r\n }\r\n\r\n confirmLogoutSession(session: ActiveSession) {\r\n this.dialogService\r\n .confirm({\r\n title: 'Log out of session',\r\n message: `Are you sure you want to log out from ${session.device} at ${session.location}?`,\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) this.onLogoutSession.emit(session.id);\r\n });\r\n }\r\n\r\n confirmDeleteAllHistory() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) this.onDeleteAllHistory.emit();\r\n });\r\n }\r\n\r\n confirmDeleteAccount() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Delete Your Account',\r\n message:\r\n 'This will permanently delete your account and all associated data. This action is irreversible. Are you absolutely sure?',\r\n confirmText: 'Delete Account',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) this.onDeleteAccount.emit();\r\n });\r\n }\r\n}\r\n","<div class=\"account-container\">\r\n <header class=\"pane-header\">\r\n <h1>Account Settings</h1>\r\n <p>Manage your account details and personal information.</p>\r\n </header>\r\n\r\n <div class=\"settings-list\">\r\n <!-- Logout row -->\r\n @if (authService.isAuthenticated() && config.auth()?.mode == 'manual') {\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Log out</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn primary\" (click)=\"onLogout()\">Logout</button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Delete all chats row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Delete all chats</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmDeleteAllHistory()\">Delete all</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Export data row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Export data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Export</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Org ID row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Organization ID</span>\r\n <span class=\"row-sublabel\">Used for workspace identification</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <code class=\"org-id\">{{ organizationId }}</code>\r\n <button mat-icon-button (click)=\"copyOrgId()\" [matTooltip]=\"isCopied ? 'Copied!' : 'Copy ID'\">\r\n <mat-icon>{{ isCopied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Logout all row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Global Logout</span>\r\n <span class=\"row-sublabel\">Sign out from all active devices</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmLogoutAll()\">Logout all</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Delete account row -->\r\n <!-- <div class=\"settings-row no-border\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label danger-text\">Delete account</span>\r\n <span class=\"row-sublabel\">Permanently delete your profile and data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger-filled\" (click)=\"confirmDeleteAccount()\">Delete Account</button>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Active Sessions Section -->\r\n <!-- <div class=\"sessions-section\">\r\n <h3>Active sessions</h3>\r\n <div class=\"sessions-table-container\">\r\n <table class=\"sessions-table\">\r\n <thead>\r\n <tr>\r\n <th>Device</th>\r\n <th>Location</th>\r\n <th>Created</th>\r\n <th>Updated</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (session of sessions; track session.id) {\r\n <tr [class.current]=\"session.isCurrent\">\r\n <td>\r\n <div class=\"device-cell\">\r\n <mat-icon>{{ session.device.includes('Windows') ? 'laptop' : 'smartphone' }}</mat-icon>\r\n <div class=\"device-info\">\r\n <span class=\"device-name\">{{ session.device }}</span>\r\n @if (session.isCurrent) {\r\n <span class=\"current-badge\">Current</span>\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n <td>{{ session.location }}</td>\r\n <td>{{ session.created }}</td>\r\n <td>{{ session.updated }}</td>\r\n <td class=\"action-cell\">\r\n @if (!session.isCurrent) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"sessionMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #sessionMenu=\"matMenu\" xPosition=\"before\">\r\n <button mat-menu-item (click)=\"confirmLogoutSession(session)\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Log out of session</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n </div> -->\r\n</div>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\n\r\n@Component({\r\n selector: 'app-instruction-section',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, SharedMaterialModule],\r\n templateUrl: './instruction-section.component.html',\r\n styleUrls: ['./instruction-section.component.scss'],\r\n})\r\nexport class InstructionSectionComponent {\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() hasChanges = false;\r\n @Output() onSave = new EventEmitter<void>();\r\n}\r\n","<div class=\"instruction-container\">\r\n <header class=\"pane-header\">\r\n <h1>Personalization</h1>\r\n <p>Tell us more about yourself and how you want the assistant to respond.</p>\r\n </header>\r\n\r\n <div class=\"instruction-card\">\r\n <div class=\"instruction-fields\">\r\n <div class=\"field-item\">\r\n <label>What should the assistant know about you?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.preferences\"\r\n placeholder=\"e.g. I prefer code examples in TypeScript...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"field-item\">\r\n <label>How should the assistant respond?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.instructions\"\r\n placeholder=\"e.g. Be concise and use bullet points...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"section-actions\">\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" [disabled]=\"!hasChanges\" (click)=\"onSave.emit()\">\r\n Save\r\n </button>\r\n </div>\r\n</div>","import { Component, inject, OnDestroy, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { SharedMaterialModule } from '../../shared/material/material.module';\r\nimport { PreferencesSectionComponent } from './sections/preferences/preferences-section.component';\r\nimport { TermsSectionComponent } from './sections/terms/terms-section.component';\r\nimport { AccountSectionComponent } from './sections/account/account-section.component';\r\nimport { ChatHistoryService } from '../chat/services/chat-history.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { PersonalizationService, PersonalizationSettings } from './personalization.service';\r\nimport { DialogService } from '../../shared/confirmation-dialog/dialog.service';\r\nimport { SnackbarService } from '../../shared/snackbar/snackbar.service';\r\nimport { InstructionSectionComponent } from './sections/instruction/instruction-section.component';\r\n\r\n@Component({\r\n selector: 'app-personalization-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n SharedMaterialModule,\r\n PreferencesSectionComponent,\r\n InstructionSectionComponent,\r\n TermsSectionComponent,\r\n AccountSectionComponent,\r\n ],\r\n templateUrl: './personalization-dialog.component.html',\r\n styleUrls: ['./personalization-dialog.component.scss'],\r\n})\r\nexport class PersonalizationDialogComponent implements OnDestroy {\r\n public personalization = inject(PersonalizationService);\r\n private authService = inject(AuthService);\r\n private chatHistory = inject(ChatHistoryService);\r\n\r\n // Local copy of settings for editing\r\n public settings: PersonalizationSettings = JSON.parse(\r\n JSON.stringify(this.personalization.settings()),\r\n );\r\n\r\n public activeSection = 'preferences';\r\n\r\n public sections = [\r\n { id: 'preferences', label: 'General', icon: 'tune', type: 'item' },\r\n { id: 'general', label: 'Personalization', icon: 'settings_suggest', type: 'item' },\r\n { id: 'account_settings', label: 'Account & Security', icon: 'manage_accounts', type: 'item' },\r\n { id: 'terms', label: 'Terms & Conditions', icon: 'description', type: 'item' },\r\n ];\r\n\r\n constructor(\r\n private dialogRef: MatDialogRef<PersonalizationDialogComponent>,\r\n private dialogService: DialogService,\r\n private snackbar: SnackbarService,\r\n ) {\r\n effect(() => {\r\n const s = this.personalization.settings();\r\n this.settings = structuredClone(s);\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.personalization.loadCustomInstructions();\r\n }\r\n\r\n onSave() {\r\n if (this.activeSection === 'preferences') {\r\n this.personalization.updateAppearance(this.settings.appearance);\r\n // Re-apply to ensure consistency (effect handles it, but just in case)\r\n this.snackbar.success('Appearance settings saved');\r\n } else if (this.activeSection === 'general') {\r\n this.personalization.saveCustomInstructions(this.settings.customInstructions);\r\n this.snackbar.success('Settings saved');\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n ngOnDestroy() {\r\n // No color revert needed since primaryColor is config-driven\r\n }\r\n\r\n onReset() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Reset to Defaults',\r\n message:\r\n 'Are you sure you want to reset preferences to default settings? This action cannot be undone.',\r\n confirmText: 'Reset',\r\n cancelText: 'Cancel',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) {\r\n // Only reset the current section\r\n if (this.activeSection === 'preferences') {\r\n // Reset only appearance settings to defaults\r\n this.personalization.resetToDefaults();\r\n // Re-clone settings to update UI\r\n this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));\r\n }\r\n }\r\n });\r\n }\r\n\r\n selectTheme(theme: 'light' | 'dark' | 'auto') {\r\n this.settings.appearance.theme = theme;\r\n }\r\n\r\n selectLanguage(language: string) {\r\n this.settings.appearance.language = language;\r\n }\r\n\r\n selectSection(sectionId: string) {\r\n if (this.sections.find((s) => s.id === sectionId && s.type === 'item')) {\r\n this.activeSection = sectionId;\r\n }\r\n }\r\n\r\n get hasChanges(): boolean {\r\n if (this.activeSection === 'preferences') return this.hasPreferencesChanges();\r\n if (this.activeSection === 'general') return this.hasInstructionChanges();\r\n return false;\r\n }\r\n\r\n hasPreferencesChanges(): boolean {\r\n const original = this.personalization.settings().appearance;\r\n const current = this.settings.appearance;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n hasInstructionChanges(): boolean {\r\n const original = this.personalization.settings().customInstructions;\r\n const current = this.settings.customInstructions;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n get username(): string {\r\n return this.authService.username();\r\n }\r\n\r\n get userImageUrl(): string | null {\r\n return this.authService.profileImageUrl();\r\n }\r\n\r\n get userRole(): string {\r\n return this.authService.roles() || '';\r\n }\r\n\r\n // Color helpers removed\r\n\r\n async deleteAllHistory() {\r\n const userId = this.authService.userId() || '';\r\n await this.chatHistory.deleteAllHistory(userId);\r\n }\r\n\r\n logout() {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n deleteAccount() {\r\n console.log('Deleting account...');\r\n }\r\n}\r\n","<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"dialog-content-body\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div\r\n class=\"nav-item\"\r\n [class.active]=\"activeSection === section.id\"\r\n (click)=\"selectSection(section.id)\"\r\n >\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section\r\n [settings]=\"settings\"\r\n [username]=\"username\"\r\n [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\"\r\n (onThemeSelect)=\"selectTheme($event)\"\r\n (onLanguageSelect)=\"selectLanguage($event)\"\r\n (onSave)=\"onSave()\"\r\n (onReset)=\"onReset()\"\r\n >\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Security Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section\r\n (onDeleteAllHistory)=\"deleteAllHistory()\"\r\n (onLogout)=\"logout()\"\r\n (onDeleteAccount)=\"deleteAccount()\"\r\n ></app-account-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-instruction-section\r\n [settings]=\"settings\"\r\n [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"\r\n ></app-instruction-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </div>\r\n</div>\r\n","export const AppEmoji = {\r\n waveHand: '\\u{1F44B}',\r\n robotFace: '\\u{1F916}',\r\n partyPopper: '\\u{1F389}',\r\n thinkingFace: '\\u{1F914}',\r\n thumbsUp: '\\u{1F44D}',\r\n thumbsDown: '\\u{1F44E}',\r\n redHeart: '\\u{2764}\\u{FE0F}',\r\n};\r\n","import { signal } from '@angular/core';\r\n\r\nexport class Typewriter {\r\n private buffer = signal('');\r\n private queue = '';\r\n private typing = signal(false);\r\n private rafId: number | null = null;\r\n private lastTime = 0;\r\n\r\n constructor(private config: { msPerChar?: number } = {}) { }\r\n\r\n append(text: string) {\r\n if (!text) return;\r\n this.queue += text;\r\n if (!this.typing()) this.start();\r\n }\r\n\r\n private start() {\r\n this.typing.set(true);\r\n const msPerChar = this.config.msPerChar ?? 20;\r\n\r\n const tick = (time: number) => {\r\n if (!this.lastTime) this.lastTime = time;\r\n\r\n const delta = time - this.lastTime;\r\n const charsToAdd = Math.floor(delta / msPerChar);\r\n\r\n if (charsToAdd > 0 && this.queue.length) {\r\n const slice = this.queue.slice(0, charsToAdd);\r\n this.queue = this.queue.slice(charsToAdd);\r\n this.buffer.update(v => v + slice);\r\n this.lastTime = time;\r\n }\r\n\r\n if (!this.queue.length) {\r\n this.typing.set(false);\r\n this.lastTime = 0;\r\n this.rafId = null;\r\n return;\r\n }\r\n\r\n this.rafId = requestAnimationFrame(tick);\r\n };\r\n\r\n this.rafId = requestAnimationFrame(tick);\r\n }\r\n\r\n displayedText() {\r\n return this.buffer();\r\n }\r\n\r\n isTyping = this.typing;\r\n\r\n reset() {\r\n this.queue = '';\r\n this.buffer.set('');\r\n this.typing.set(false);\r\n this.lastTime = 0;\r\n if (this.rafId) cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n}\r\n","import { AuthService } from './../../../../core/auth/auth.service';\r\nimport { Component, input, output, computed, effect, signal, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { MarkdownService } from '../../../../core/services/markdown.service';\r\nimport { Typewriter } from '../../../../shared/utils/typewriter';\r\n\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\n\r\n@Component({\r\n selector: 'app-chat-message',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './chat-message.component.html',\r\n styleUrls: ['./chat-message.component.scss'],\r\n})\r\nexport class ChatMessageComponent implements OnInit {\r\n message = input.required<Message>();\r\n doohbotConst = input.required<any>();\r\n appEmoji = input<any>();\r\n\r\n profileImageUrl = signal<string | null>(null);\r\n\r\n copyMessage = output<Message>();\r\n\r\n private typewriter = new Typewriter({ msPerChar: 4 }); //! speed of typing\r\n private lastLength = 0;\r\n\r\n isTyping = this.typewriter.isTyping;\r\n\r\n displayHtml = computed(() => {\r\n const msg = this.message();\r\n\r\n if (msg.sender === 'user') return '';\r\n\r\n if (msg.completed || msg.isHistory) {\r\n return msg.textHtml || this.markdownService.convert(msg.text);\r\n }\r\n\r\n return this.markdownService.convert(this.typewriter.displayedText());\r\n });\r\n\r\n constructor(\r\n private markdownService: MarkdownService,\r\n public authService: AuthService,\r\n ) {\r\n effect(() => {\r\n const msg = this.message();\r\n\r\n if (msg.sender !== 'model' || msg.isHistory) return;\r\n\r\n const text = msg.text ?? '';\r\n\r\n if (text.length > this.lastLength) {\r\n const delta = text.slice(this.lastLength);\r\n this.lastLength = text.length;\r\n this.typewriter.append(delta);\r\n }\r\n\r\n if (msg.completed) {\r\n this.lastLength = text.length;\r\n // this.typewriter.finish();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.profileImageUrl.set(this.authService.profileImageUrl() ?? doohbotConst.userAvatar);\r\n }\r\n\r\n onCopy() {\r\n this.copyMessage.emit(this.message());\r\n }\r\n}\r\n","<div\r\n class=\"message\"\r\n [class.user]=\"message().sender === 'user'\"\r\n [class.assistant]=\"message().sender === 'model'\"\r\n [class.streaming]=\"!message().completed && message().sender === 'model'\"\r\n>\r\n <!-- Message Bubble -->\r\n <div class=\"message-content\">\r\n <!-- User chat bubble -->\r\n @if (message().sender === 'user') {\r\n <div class=\"user-message-wrapper\">\r\n <div class=\"user\">\r\n <span>{{ message().text }}</span>\r\n </div>\r\n <button class=\"action-btn copy-btn user-copy\" (click)=\"onCopy()\" matTooltip=\"Copy message\">\r\n <mat-icon>{{ message().copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Assistant chat bubble -->\r\n @if (message().sender === 'model') {\r\n <div class=\"assistant\">\r\n <!-- Content (Typewriter or Static) -->\r\n <!-- We use [innerHTML] for both typing and static states now, powered by displayHtml computed signal -->\r\n @if (message().text || message().textHtml) {\r\n <span class=\"markdown-content\" [innerHTML]=\"displayHtml()\"></span>\r\n }\r\n\r\n <!-- Loading state (no content yet) -->\r\n <!-- @if (!message().completed && (!message().text || message().text === '')) {\r\n <div class=\"typing-indicator\">\r\n <span class=\"thinking-text\">Thinking...</span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n } -->\r\n\r\n <!-- Message Footer (only when completed) -->\r\n @if (message().completed) {\r\n <div class=\"message-footer\">\r\n <p class=\"footer-text\">\r\n This chat uses AI-generated content. Verify critical information.\r\n </p>\r\n <div class=\"message-actions\">\r\n <button class=\"action-btn copy-btn\" (click)=\"onCopy()\" matTooltip=\"Copy message\">\r\n <mat-icon>{{ message().copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n <button class=\"action-btn more-btn\" matTooltip=\"More actions\">\r\n <mat-icon>more_horiz</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Avatar (User on Right) -->\r\n <!-- @if (message().sender === 'user') {\r\n <div class=\"avatar-container\">\r\n @if (authService.profileImageUrl()) {\r\n <img class=\"user-avatar\" [src]=\"authService.profileImageUrl()\" alt=\"User Avatar\" />\r\n } @else {\r\n <mat-icon class=\"user-avatar-icon\">account_circle</mat-icon>\r\n }\r\n </div>\r\n } -->\r\n</div>\r\n","import { PredefinedMessages } from './../../../../predefined_messages';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { AppEmoji } from '../../../../const/utf8';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { ChatMessageComponent } from '../chat-message/chat-message.component';\r\nimport { ChatService } from '../../chat.service';\r\n\r\n@Component({\r\n selector: 'app-chat-message-container',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule, ChatMessageComponent],\r\n templateUrl: './chat-message-container.component.html',\r\n styleUrls: ['./chat-message-container.component.scss'],\r\n})\r\nexport class ChatMessageContainer implements OnInit, AfterViewInit, OnDestroy {\r\n //outputs\r\n suggestionClick = output<string>();\r\n\r\n @ViewChild('chatMessages') private chatMessagesContainer!: ElementRef;\r\n private mutationObserver!: MutationObserver;\r\n\r\n //const\r\n appEmoji = AppEmoji;\r\n readonly doohbotConst = doohbotConst;\r\n\r\n isNearBottom: boolean = true;\r\n private readonly SCROLL_TOLERANCE = 5; // Increased tolerance for better stickiness\r\n\r\n // messages = signal<Message[]>([]);\r\n public predefinedMessages = signal<string[]>(PredefinedMessages);\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n public authService: AuthService,\r\n public chatService: ChatService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n // this.messages.set(this.chatService.messages());\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.chatMessagesContainer) return;\r\n\r\n this.mutationObserver = new MutationObserver(() => {\r\n // PROACTIVE SCROLLING:\r\n // While bot is typing or responding, we want to stay at the bottom.\r\n // We only skip if the user has scrolled up significantly (beyond tolerance).\r\n if (this.isNearBottom) {\r\n this.scrollToBottom('auto');\r\n }\r\n });\r\n\r\n this.mutationObserver.observe(this.chatMessagesContainer.nativeElement, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true,\r\n });\r\n\r\n // Initial scroll\r\n // setTimeout(() => this.scrollToBottom('auto'), 200);\r\n }\r\n\r\n trackByMessageId(index: number, item: any): string {\r\n return item.id || index.toString();\r\n }\r\n\r\n onScroll(): void {\r\n if (!this.chatMessagesContainer) return;\r\n const element = this.chatMessagesContainer.nativeElement;\r\n\r\n // Check if we are at the bottom within tolerance.\r\n // If bot is typing, we increase tolerance to make it harder to 'lose' the stickiness.\r\n const tolerance = this.chatService.isBotTyping()\r\n ? this.SCROLL_TOLERANCE * 2\r\n : this.SCROLL_TOLERANCE;\r\n\r\n const atBottom = element.scrollHeight - element.scrollTop - element.clientHeight <= tolerance;\r\n\r\n this.isNearBottom = atBottom;\r\n }\r\n\r\n scrollToBottom(behavior: ScrollBehavior = 'smooth'): void {\r\n if (!this.chatMessagesContainer) {\r\n return;\r\n }\r\n const container = this.chatMessagesContainer.nativeElement;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: behavior,\r\n });\r\n // If artificially scrolling, assume we are at bottom\r\n if (behavior === 'auto') {\r\n this.isNearBottom = true;\r\n }\r\n }\r\n\r\n onPredefinedClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n copyMessage(message: Message): void {\r\n if (!message.text) return;\r\n\r\n navigator.clipboard.writeText(message.text).then(() => {\r\n message.copied = true;\r\n this.cdr.markForCheck(); // force UI update\r\n\r\n setTimeout(() => {\r\n message.copied = false;\r\n this.cdr.markForCheck(); // update again\r\n }, 800);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n}\r\n","<div #chatMessages class=\"chat-messages\" (scroll)=\"onScroll()\">\r\n <!-- Welcome Screen -->\r\n @if (chatService.messages().length === 0 && !chatService.isBotTyping()) {\r\n <div class=\"welcome-screen\">\r\n <img\r\n [src]=\"doohbotConst.appLogo\"\r\n alt=\"Welcome\"\r\n class=\"welcome-image\"\r\n style=\"border-radius: 0px\"\r\n />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n @if (authService.username()) {\r\n <div class=\"marquee-container\">\r\n <h2 class=\"welcome-greeting\">\r\n Hi, {{ authService.username() }}!\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n </div>\r\n }\r\n\r\n <h3>{{ doohbotConst.appSubtitle }}</h3>\r\n <p>{{ doohbotConst.welcomeDescription }}</p>\r\n </div>\r\n } @else if (chatService.isLoadingApi() && chatService.messages().length === 0) {\r\n <div class=\"loader-container\">\r\n <div class=\"loader\"></div>\r\n <p>Loading messages...</p>\r\n </div>\r\n }\r\n\r\n <!-- Chat Messages -->\r\n <app-chat-message\r\n *ngFor=\"let message of chatService.messages(); trackBy: trackByMessageId\"\r\n [message]=\"message\"\r\n [doohbotConst]=\"doohbotConst\"\r\n [appEmoji]=\"appEmoji\"\r\n (copyMessage)=\"copyMessage($event)\"\r\n >\r\n </app-chat-message>\r\n\r\n <!-- Standalone Typing Indicator (Fallback if no message added yet) -->\r\n @if (\r\n chatService.isBotTyping() &&\r\n chatService.messages().length > 0 &&\r\n chatService.messages()[chatService.messages().length - 1]?.sender !== 'model'\r\n ) {\r\n <div class=\"message assistant\">\r\n <div class=\"message-content\">\r\n <div class=\"assistant\">\r\n <div class=\"typing-indicator\">\r\n <span class=\"thinking-text\">Thinking</span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Scroll to Bottom Button -->\r\n @if (!isNearBottom && (chatService.messages().length > 0 || chatService.isBotTyping())) {\r\n <button class=\"scroll-bottom-btn\" (click)=\"scrollToBottom('smooth')\">\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n }\r\n</div>\r\n","import {\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n OnInit,\r\n Renderer2,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[draggableDialog]',\r\n standalone: true,\r\n})\r\nexport class DraggableDialogDirective implements OnInit, OnChanges {\r\n private isDragging = false;\r\n private startX = 0;\r\n private startY = 0;\r\n private offsetX = 0;\r\n private offsetY = 0;\r\n\r\n @Input('dragHandle') dragHandleSelector: string | undefined;\r\n @Input() enableDrag = false;\r\n\r\n private dragHandle: HTMLElement | undefined;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.updateDragState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableDrag']) {\r\n this.updateDragState();\r\n }\r\n }\r\n\r\n private updateDragState() {\r\n if (this.enableDrag) {\r\n if (this.dragHandleSelector) {\r\n this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);\r\n } else {\r\n this.dragHandle = this.el.nativeElement; // fallback\r\n }\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'grab');\r\n }\r\n } else {\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'default');\r\n }\r\n // We don't need to unset dragHandle, just ensure the cursor is reset and the mousedown check respects the flag?\r\n // Actually, the mousedown listener is always active. We should check enableDrag inside mousedown.\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableDrag) return;\r\n if (event.defaultPrevented) return; // Respect other handlers (like resize)\r\n\r\n if (!this.dragHandle) return;\r\n\r\n const target = event.target as HTMLElement;\r\n\r\n // Ensure we only drag when clicking inside the drag handle\r\n if (!this.dragHandle.contains(target)) {\r\n return;\r\n }\r\n\r\n // Prevent dragging from resize handles\r\n if (target.hasAttribute('data-dir') || target.classList.contains('doohbot-resize-handle')) {\r\n return;\r\n }\r\n\r\n // Prevent dragging when interacting with controls (buttons, inputs, links, etc.)\r\n const tagName = target.tagName;\r\n if (['BUTTON', 'INPUT', 'TEXTAREA', 'A', 'SELECT', 'MAT-ICON'].includes(tagName)) return;\r\n\r\n // Also ignore if clicking inside a child of a control element\r\n if (target.closest('button, a, input, textarea, select')) return;\r\n\r\n // Optional: explicit opt-out class\r\n if (target.classList.contains('no-drag') || target.closest('.no-drag')) return;\r\n\r\n this.isDragging = true;\r\n this.startX = event.clientX - this.offsetX;\r\n this.startY = event.clientY - this.offsetY;\r\n\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'grabbing');\r\n }\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging) return;\r\n\r\n // Calculate raw offset\r\n let newOffsetX = event.clientX - this.startX;\r\n let newOffsetY = event.clientY - this.startY;\r\n\r\n // Get element dimensions to calculate max allowed offsets\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n // Total space allowed to move is the window size minus the element size\r\n // Note: rect.width and rect.height remain constant during drag (unless resized)\r\n const maxX = window.innerWidth - rect.width;\r\n const maxY = window.innerHeight - rect.height;\r\n\r\n // Since our translation is relative to the *initial* position of the element,\r\n // we need to calculate boundaries relative to where the translation originated.\r\n // However, it's easier to clamp the actual screen coordinates of the top-left corner.\r\n\r\n // Current absolute top-left without clamp\r\n const absoluteX = rect.left - this.offsetX + newOffsetX;\r\n const absoluteY = rect.top - this.offsetY + newOffsetY;\r\n\r\n // Clamp the absolute target positions\r\n const clampedX = Math.max(0, Math.min(absoluteX, maxX));\r\n const clampedY = Math.max(0, Math.min(absoluteY, maxY));\r\n\r\n // Adjust the offsets based on how much we had to clamp\r\n newOffsetX += clampedX - absoluteX;\r\n newOffsetY += clampedY - absoluteY;\r\n\r\n this.offsetX = newOffsetX;\r\n this.offsetY = newOffsetY;\r\n\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'transform',\r\n `translate(${this.offsetX}px, ${this.offsetY}px)`,\r\n );\r\n }\r\n\r\n @HostListener('document:mouseup', [])\r\n onMouseUp() {\r\n this.isDragging = false;\r\n\r\n if (this.dragHandle && this.enableDrag) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'grab');\r\n }\r\n }\r\n}\r\n","// resizable-dialog.directive.ts\r\nimport {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[resizableDialog]',\r\n standalone: true,\r\n})\r\nexport class ResizableDialogDirective implements OnInit, OnDestroy, OnChanges {\r\n private resizeHandles: HTMLElement[] = [];\r\n private activeHandle: string | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n private startLeft = 0;\r\n private startTop = 0;\r\n private startRect!: DOMRect;\r\n\r\n @Input() enableResize = false;\r\n\r\n // Define resize directions\r\n private directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.updateResizeState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableResize']) {\r\n this.updateResizeState();\r\n }\r\n }\r\n\r\n private updateResizeState() {\r\n if (this.enableResize) {\r\n if (this.resizeHandles.length === 0) {\r\n this.setStyle();\r\n this.createResizeHandles();\r\n }\r\n } else {\r\n this.removeResizeHandles();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeResizeHandles();\r\n }\r\n\r\n private setStyle() {\r\n const element = this.el.nativeElement;\r\n const currentPosition = getComputedStyle(element).position;\r\n\r\n if (currentPosition !== 'fixed' && currentPosition !== 'absolute') {\r\n this.renderer.setStyle(element, 'position', 'absolute');\r\n }\r\n\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'boxSizing', 'border-box');\r\n }\r\n\r\n private createResizeHandles() {\r\n this.directions.forEach((dir) => {\r\n const handle = this.renderer.createElement('div');\r\n this.renderer.setAttribute(handle, 'data-dir', dir);\r\n this.renderer.addClass(handle, 'doohbot-resize-handle');\r\n this.renderer.setStyle(handle, 'position', 'absolute');\r\n this.renderer.setStyle(handle, 'background', 'transparent');\r\n this.renderer.setStyle(handle, 'zIndex', '2000'); // High z-index to sit above content\r\n this.renderer.setStyle(handle, 'userSelect', 'none');\r\n\r\n // Set size and position based on direction\r\n if (dir.includes('e') || dir.includes('w')) {\r\n this.renderer.setStyle(handle, 'width', '15px'); // Slightly larger hit area\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');\r\n this.renderer.setStyle(handle, 'top', '0');\r\n this.renderer.setStyle(handle, 'bottom', '0');\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-5px' : null); // Extend slightly out\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-5px' : null);\r\n }\r\n if (dir.includes('n') || dir.includes('s')) {\r\n this.renderer.setStyle(handle, 'height', '15px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');\r\n this.renderer.setStyle(handle, 'left', '0');\r\n this.renderer.setStyle(handle, 'right', '0');\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-5px' : null);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-5px' : null);\r\n }\r\n if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {\r\n this.renderer.setStyle(handle, 'width', '20px');\r\n this.renderer.setStyle(handle, 'height', '20px');\r\n this.renderer.setStyle(handle, 'borderRadius', '50%');\r\n this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-10px' : null);\r\n }\r\n\r\n this.renderer.appendChild(this.el.nativeElement, handle);\r\n this.resizeHandles.push(handle);\r\n });\r\n }\r\n\r\n private removeResizeHandles() {\r\n this.resizeHandles.forEach((handle) => {\r\n this.renderer.removeChild(this.el.nativeElement, handle);\r\n });\r\n this.resizeHandles = [];\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableResize) return;\r\n if (event.defaultPrevented) return; // Respect other handlers\r\n\r\n const target = event.target as HTMLElement;\r\n const dir = target.getAttribute('data-dir');\r\n if (!dir) return;\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n\r\n this.activeHandle = dir;\r\n this.startRect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = parseFloat(this.getComputedStyleValue('width'));\r\n this.startHeight = parseFloat(this.getComputedStyleValue('height'));\r\n this.startLeft = parseFloat(this.getComputedStyleValue('left'));\r\n this.startTop = parseFloat(this.getComputedStyleValue('top'));\r\n\r\n // Prevent text selection during resize\r\n document.body.classList.add('no-select');\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.activeHandle) return;\r\n\r\n const dx = event.clientX - this.startX;\r\n const dy = event.clientY - this.startY;\r\n\r\n let newWidth = this.startWidth;\r\n let newHeight = this.startHeight;\r\n let newLeft = this.startLeft;\r\n let newTop = this.startTop;\r\n\r\n const minWidth = 420;\r\n const minHeight = 600;\r\n\r\n // Horizontal resize\r\n if (this.activeHandle.includes('e')) {\r\n newWidth = Math.max(\r\n minWidth,\r\n Math.min(this.startWidth + dx, window.innerWidth - this.startLeft),\r\n );\r\n }\r\n if (this.activeHandle.includes('w')) {\r\n // Proposed new width\r\n let proposedWidth = Math.max(minWidth, this.startWidth - dx);\r\n // Determine max possible width bounded by the right edge (which stays static on west resize)\r\n const maxPossibleWidth = this.startLeft + this.startWidth;\r\n\r\n newWidth = Math.min(proposedWidth, maxPossibleWidth);\r\n newLeft = this.startLeft + this.startWidth - newWidth;\r\n\r\n // Prevent dragging off the left edge of the screen\r\n if (newLeft < 0) {\r\n newLeft = 0;\r\n newWidth = this.startLeft + this.startWidth; // Cap width exactly at left=0\r\n }\r\n }\r\n\r\n // Vertical resize\r\n if (this.activeHandle.includes('s')) {\r\n newHeight = Math.max(\r\n minHeight,\r\n Math.min(this.startHeight + dy, window.innerHeight - this.startRect.top),\r\n );\r\n }\r\n if (this.activeHandle.includes('n')) {\r\n // Proposed new height\r\n let proposedHeight = Math.max(minHeight, this.startHeight - dy);\r\n // Determine max possible height bounded by the bottom edge (which stays static on north resize)\r\n const maxPossibleHeight = this.startRect.bottom;\r\n\r\n newHeight = Math.min(proposedHeight, maxPossibleHeight);\r\n newTop = this.startTop + this.startHeight - newHeight;\r\n\r\n // Prevent dragging off the top edge of the screen\r\n if (this.startRect.bottom - newHeight < 0) {\r\n newHeight = this.startRect.bottom; // Cap height exactly at top=0\r\n newTop = this.startTop + this.startHeight - newHeight;\r\n }\r\n }\r\n\r\n // Apply changes\r\n this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (this.activeHandle) {\r\n this.activeHandle = null;\r\n document.body.classList.remove('no-select');\r\n }\r\n }\r\n\r\n private getComputedStyleValue(property: string): string {\r\n return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';\r\n }\r\n}\r\n","import { Component, computed, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../material/material.module';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\n\r\n@Component({\r\n selector: 'app-notification-banner',\r\n standalone: true,\r\n imports: [CommonModule, SharedMaterialModule],\r\n templateUrl: './notification-banner.component.html',\r\n styleUrls: ['./notification-banner.component.scss'],\r\n})\r\nexport class NotificationBannerComponent {\r\n private authService = inject(AuthService);\r\n //\r\n readonly isUpdating = computed(() => this.authService.isAuthenticating());\r\n readonly errorMessage = computed(() => this.authService.loginErrorMessage());\r\n readonly allPrerequisitesCheck = computed(() => this.authService.allPrerequisitesMet());\r\n\r\n readonly statusIcon = computed(() => {\r\n if (this.isUpdating()) return 'autorenew';\r\n if (this.errorMessage()) return 'error_outline';\r\n if (this.allPrerequisitesCheck()) return 'verified';\r\n return 'hourglass_empty';\r\n });\r\n\r\n readonly statusTitle = computed(() => {\r\n if (this.isUpdating()) return 'Processing...';\r\n if (this.errorMessage()) return 'Authentication Failed';\r\n if (this.allPrerequisitesCheck()) return 'Ready to Connect';\r\n return 'Processing';\r\n });\r\n\r\n readonly statusMessage = computed(() => {\r\n if (this.isUpdating()) return 'Please wait until complete';\r\n if (this.errorMessage()) return this.errorMessage() || '';\r\n if (this.allPrerequisitesCheck()) return 'All requirements satisfied.';\r\n return 'Please wait until it completes.';\r\n });\r\n\r\n readonly statusClass = computed(() => {\r\n if (this.isUpdating()) return 'updating';\r\n if (this.errorMessage()) return 'error';\r\n if (this.allPrerequisitesCheck()) return 'success';\r\n return '';\r\n });\r\n\r\n readonly federatedTokenStatus = computed(\r\n () => this.authService.prerequisitesStatus().federatedToken,\r\n );\r\n readonly licenseFileStatus = computed(() => this.authService.prerequisitesStatus().licenseFile);\r\n readonly licenseCodeStatus = computed(() => this.authService.prerequisitesStatus().licenseCode);\r\n}\r\n","<div class=\"banner-wrapper\">\r\n <div class=\"glass-banner\">\r\n <div class=\"banner-glow\"></div>\r\n <div class=\"banner-inner\">\r\n <div class=\"header-section\">\r\n <div class=\"icon-orb\">\r\n <mat-icon>security</mat-icon>\r\n </div>\r\n <div class=\"text-content\">\r\n <h3>Login Process</h3>\r\n <!-- <p>Verification of authentication</p> -->\r\n </div>\r\n </div>\r\n\r\n <div class=\"status-section\">\r\n <div class=\"status-card\" [class]=\"statusClass()\">\r\n <div class=\"icon-orb\">\r\n <mat-icon>{{ statusIcon() }}</mat-icon>\r\n </div>\r\n <div class=\"status-text\">\r\n <h4>{{ statusTitle() }}</h4>\r\n <p>{{ statusMessage() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"status-grid\" *ngIf=\"!allPrerequisitesCheck()\">\r\n <div class=\"status-card\" [class]=\"licenseFileStatus()\">\r\n <div class=\"card-glow\"></div>\r\n <mat-icon>security</mat-icon>\r\n <span class=\"status-label\">License</span>\r\n <span class=\"status-tag\">{{ licenseFileStatus() }}</span>\r\n </div>\r\n\r\n <div class=\"status-card\" [class]=\"licenseCodeStatus()\">\r\n <div class=\"card-glow\"></div>\r\n <mat-icon>data_object</mat-icon>\r\n <span class=\"status-label\">License Code</span>\r\n <span class=\"status-tag\">{{ licenseCodeStatus() }}</span>\r\n </div>\r\n\r\n <div class=\"status-card\" [class]=\"federatedTokenStatus()\">\r\n <div class=\"card-glow\"></div>\r\n <mat-icon>vpn_key</mat-icon>\r\n <span class=\"status-label\">Authentication Token</span>\r\n <span class=\"status-tag\">{{ federatedTokenStatus() }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n Input,\r\n HostListener,\r\n inject,\r\n OnDestroy,\r\n NgZone,\r\n} from '@angular/core';\r\n\r\nexport type FullscreenMode = 'browser' | 'viewport' | 'contained';\r\n\r\n/**\r\n * Adds fullscreen behavior to the host element via various strategies.\r\n *\r\n * @example\r\n * // 1. Attribute usage:\r\n * <div [appFullscreen]=\"'viewport'\" #fs=\"appFullscreen\"></div>\r\n *\r\n * // 2. hostDirectives usage:\r\n * hostDirectives: [{\r\n * directive: FullscreenDirective,\r\n * inputs: ['appFullscreen: fullscreenMode']\r\n * }]\r\n */\r\n@Directive({\r\n selector: '[appFullscreen]',\r\n standalone: true,\r\n exportAs: 'appFullscreen',\r\n})\r\nexport class FullscreenDirective implements OnDestroy {\r\n private el = inject(ElementRef<HTMLElement>);\r\n private renderer = inject(Renderer2);\r\n private zone = inject(NgZone);\r\n\r\n @Input('appFullscreen') fullscreenMode: FullscreenMode = 'viewport';\r\n\r\n private active = false;\r\n private resizeObserver?: ResizeObserver;\r\n private originalStyles: Partial<CSSStyleDeclaration> = {};\r\n\r\n @HostListener('document:fullscreenchange')\r\n onBrowserFullscreenChange(): void {\r\n if (this.fullscreenMode === 'browser') {\r\n this.active = document.fullscreenElement === this.el.nativeElement;\r\n }\r\n }\r\n\r\n async enter(): Promise<void> {\r\n const element = this.el.nativeElement;\r\n\r\n // Add mode attribute for SCSS\r\n this.renderer.setAttribute(element, 'data-fs-mode', this.fullscreenMode);\r\n\r\n if (this.fullscreenMode === 'browser') {\r\n await element.requestFullscreen().catch(console.error);\r\n return;\r\n }\r\n\r\n this.storeOriginalStyles(element);\r\n\r\n if (this.fullscreenMode === 'contained') {\r\n // Position absolutely inside current parent\r\n this.applyStyles(element, {\r\n display: 'block',\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n right: '0',\r\n bottom: '0',\r\n width: '100%',\r\n height: '100%',\r\n zIndex: '10', // Optional, keep below consumer sidebar\r\n });\r\n\r\n const parent = this.renderer.parentNode(element);\r\n if (parent && parent instanceof HTMLElement) {\r\n // Force the consumer's container to be the anchor\r\n this.renderer.setStyle(parent, 'position', 'relative');\r\n this.renderer.setStyle(parent, 'overflow', 'hidden');\r\n this.startObserving(parent);\r\n }\r\n } else if (this.fullscreenMode === 'viewport') {\r\n this.applyStyles(element, {\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n width: '100vw',\r\n height: '100vh',\r\n zIndex: '9999',\r\n });\r\n }\r\n\r\n this.active = true;\r\n }\r\n\r\n async exit(): Promise<void> {\r\n const element = this.el.nativeElement;\r\n this.renderer.removeAttribute(element, 'data-fs-mode');\r\n if (this.fullscreenMode === 'browser') {\r\n if (document.fullscreenElement) await document.exitFullscreen().catch(console.error);\r\n return;\r\n }\r\n\r\n this.stopObserving();\r\n this.restoreOriginalStyles(element);\r\n this.active = false;\r\n }\r\n\r\n private startObserving(target: HTMLElement): void {\r\n this.stopObserving(); // Clean up existing\r\n\r\n // Run outside Angular zone to avoid triggering change detection on every pixel change\r\n this.zone.runOutsideAngular(() => {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // If the sidebar pushes the container, the 100% width\r\n // will naturally adjust because of 'position: absolute'\r\n // Use this callback if you need to run custom logic on resize.\r\n });\r\n this.resizeObserver.observe(target);\r\n });\r\n }\r\n\r\n private stopObserving(): void {\r\n this.resizeObserver?.disconnect();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stopObserving();\r\n }\r\n\r\n private applyStyles(element: HTMLElement, styles: Record<string, string>): void {\r\n // Always include box-sizing when forcing dimensions\r\n this.renderer.setStyle(element, 'box-sizing', 'border-box');\r\n\r\n Object.entries(styles).forEach(([prop, val]) => this.renderer.setStyle(element, prop, val));\r\n }\r\n\r\n private storeOriginalStyles(element: HTMLElement): void {\r\n this.originalStyles = {\r\n position: element.style.position,\r\n top: element.style.top,\r\n left: element.style.left,\r\n width: element.style.width,\r\n height: element.style.height,\r\n zIndex: element.style.zIndex,\r\n };\r\n }\r\n\r\n private restoreOriginalStyles(element: HTMLElement): void {\r\n Object.entries(this.originalStyles).forEach(([key, value]) => {\r\n this.renderer.setStyle(element, key, value || '');\r\n });\r\n }\r\n\r\n isActive(): boolean {\r\n return this.fullscreenMode === 'browser'\r\n ? document.fullscreenElement === this.el.nativeElement\r\n : this.active;\r\n }\r\n\r\n async toggle(): Promise<void> {\r\n this.isActive() ? await this.exit() : await this.enter();\r\n }\r\n}\r\n","import { Logger } from './../../../../core/utils/logger.service';\r\nimport { PredefinedMessages } from './../../../../predefined_messages';\r\nimport { DialogService } from '../../../../shared/confirmation-dialog/dialog.service';\r\nimport { FullscreenDirective } from '../../../../core/directives/fullscreen.directive';\r\nimport { DoohbotConfigService } from './../../../../core/config/doohbot-config.service';\r\nimport {\r\n Component,\r\n input,\r\n output,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n computed,\r\n inject,\r\n effect,\r\n} from '@angular/core';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { map } from 'rxjs';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { SharedMaterialModule } from '../../../../shared/material/material.module';\r\nimport { ChatInputComponent } from '../chat-input/chat-input.component';\r\nimport { ChatHistoryComponent } from '../chat-history/chat-history.component';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\nimport { ButtonStyle, DoohbotThemeConfig } from '../../../../core/models/theme-config.model';\r\nimport { ChatHeaderComponent } from '../chat-header/chat-header.component';\r\nimport { LoginFormComponent } from '../../../login/login-form.component';\r\nimport { ChatFooterComponent } from '../chat-footer/chat-footer.component';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\nimport { ChatSessionDto } from '../../model/chat-session.model';\r\nimport { PersonalizationDialogComponent } from '../../../personalization/personalization-dialog.component';\r\nimport { ChatService } from '../../chat.service';\r\nimport { ChatHistoryService } from '../../services/chat-history.service';\r\nimport { ChatMessageContainer } from '../chat-message-container/chat-message-container.component';\r\nimport { DraggableDialogDirective } from '../../../../core/directives/draggable-dialog.directive';\r\nimport { ResizableDialogDirective } from '../../../../core/directives/resizable-dialog.directive';\r\nimport { doohbotConst } from '../../../../../lib/const/doohbot-constant';\r\nimport { NotificationBannerComponent } from '../../../../shared/notification-banner/notification-banner.component';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n SharedMaterialModule,\r\n Chips,\r\n ChatMessageContainer,\r\n ChatInputComponent,\r\n ChatHistoryComponent,\r\n ChatHeaderComponent,\r\n LoginFormComponent,\r\n ChatFooterComponent,\r\n FormsModule,\r\n DraggableDialogDirective,\r\n ResizableDialogDirective,\r\n NotificationBannerComponent,\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n})\r\nexport class ChatWindowComponent implements OnInit, OnDestroy {\r\n // inputs\r\n themeConfig = input<DoohbotThemeConfig | undefined>();\r\n\r\n showSuggestionChips = input(false);\r\n\r\n // UI State signals\r\n public isChatOpen = this.chatService.isChatOpen;\r\n public isHistorySidebarOpen = this.chatService.isHistorySidebarOpen;\r\n public isFullScreen = this.chatService.isFullScreen;\r\n\r\n // Chat State signals\r\n public chatSessions = this.chatHistory.sessions;\r\n public hasMoreHistory = this.chatHistory.hasMore;\r\n public isLoadingMore = this.chatHistory.isLoadingMore;\r\n public isLoadingSessions = this.chatHistory.isLoading;\r\n public processingSessionId = this.chatHistory.processingSessionId;\r\n public activeSessionId = computed(() => this.chatService.activeSession()?.response_id || null);\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n //outputs\r\n openSettings = output<void>();\r\n\r\n public isManualAuth = signal(false);\r\n public authMode = signal<'manual' | 'federated' | 'session'>('manual');\r\n\r\n public suggestionChips = signal<string[]>(PredefinedMessages);\r\n\r\n private breakpointObserver = inject(BreakpointObserver);\r\n public isMobile = toSignal(\r\n this.breakpointObserver.observe('(max-width: 768px)').pipe(map((result) => result.matches)),\r\n { initialValue: false },\r\n );\r\n\r\n public showLoginForm = signal(false);\r\n\r\n public readonly buttonStyle = computed<ButtonStyle>(() => {\r\n return this.configService.theme()?.buttonStyle ?? 'fab';\r\n });\r\n\r\n public canDrag = computed(() => {\r\n if (this.buttonStyle() === 'sidebar') return false;\r\n return this.configService?.theme()?.enableDrag ?? !this.isFullScreen();\r\n });\r\n\r\n public canResize = computed(() => {\r\n if (this.buttonStyle() === 'sidebar') return false;\r\n return this.configService?.theme()?.enableResize ?? !this.isFullScreen();\r\n });\r\n\r\n constructor(\r\n private fullscreenDirective: FullscreenDirective,\r\n private configService: DoohbotConfigService,\r\n public authService: AuthService,\r\n public chatService: ChatService,\r\n private dialogService: DialogService,\r\n private chatHistory: ChatHistoryService,\r\n ) {\r\n const authConfig = this.configService.auth();\r\n this.isManualAuth.set(authConfig?.mode === 'manual');\r\n this.authMode.set((authConfig?.mode as any) || 'manual');\r\n\r\n //! exit fullscreen when chat is closed\r\n effect(() => {\r\n const isOpen = this.isChatOpen();\r\n const isFullscreen = this.isFullScreen();\r\n\r\n if (!isOpen && isFullscreen) {\r\n this.fullscreenDirective.exit();\r\n this.chatService.setFullscreen(false);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.isChatOpen = this.chatService.isChatOpen;\r\n this.isHistorySidebarOpen = this.chatService.isHistorySidebarOpen;\r\n this.isFullScreen = this.chatService.isFullScreen;\r\n\r\n // Chat State signals\r\n this.chatSessions = this.chatHistory.sessions;\r\n this.hasMoreHistory = this.chatHistory.hasMore;\r\n this.isLoadingMore = this.chatHistory.isLoadingMore;\r\n this.isLoadingSessions = this.chatHistory.isLoading;\r\n this.processingSessionId = this.chatHistory.processingSessionId;\r\n }\r\n\r\n /* ---------------- History ---------------- */\r\n\r\n // when user click on history sidebar\r\n onOpenHistorySidebar() {\r\n if (!this.chatService.isHistorySidebarOpen()) {\r\n // Only load if not already cached\r\n this.loadUserSessions();\r\n this.chatService.openHistorySidebar();\r\n }\r\n }\r\n\r\n // when user close history sidebar\r\n onCloseHistorySidebar() {\r\n this.chatService.closeHistorySidebar();\r\n }\r\n\r\n // Manually refresh history\r\n async refreshHistory(): Promise<void> {\r\n const userId = this.authService.userId() || '';\r\n Logger.info(`Refreshing sessions for user: ${userId}`);\r\n await this.chatHistory.loadSessions(userId.toString(), true);\r\n }\r\n\r\n // Load more sessions for infinite scroll\r\n async loadMoreHistory(): Promise<void> {\r\n const userId = this.authService.userId() || '';\r\n Logger.info(`Loading more sessions for user: ${userId}`);\r\n try {\r\n await this.chatHistory.loadMoreSessions(userId.toString());\r\n } catch (err) {\r\n Logger.error('Failed to load more chat history', err);\r\n }\r\n }\r\n\r\n // when user select a session from history\r\n onSessionSelected(session: ChatSessionDto) {\r\n if (!session.response_id) {\r\n return;\r\n }\r\n this.chatService.continueSession(session.response_id);\r\n this.chatService.closeHistorySidebar();\r\n }\r\n\r\n // when user delete a session from history\r\n async onSessionDeleted(sessionId: string) {\r\n const userId = this.authService.userId() || '';\r\n await this.chatHistory.deleteSession(sessionId, userId.toString());\r\n\r\n // Invalidate cache after deletion\r\n this.chatHistory.invalidateCache();\r\n\r\n // If deleted session is currently active, start a new one\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.response_id === sessionId) {\r\n Logger.info('Active session was deleted, starting a new one.');\r\n this.chatService.startNewSession();\r\n }\r\n }\r\n\r\n // when user rename a session from history\r\n async onSessionRenamed(event: { sessionId: string; newTitle: string }) {\r\n const userId = this.authService.userId() || '';\r\n const result = await this.chatHistory.updateSessionTitle(\r\n event.sessionId,\r\n event.newTitle,\r\n userId.toString(),\r\n );\r\n if (result) {\r\n // If updated session is currently active, update its title in ChatService\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.response_id === event.sessionId) {\r\n activeSession.title = event.newTitle;\r\n }\r\n }\r\n }\r\n\r\n // when user delete all sessions from history\r\n async onDeleteAllSessions() {\r\n const userId = this.authService.userId() || '';\r\n await this.chatHistory.deleteAllHistory(userId);\r\n this.chatService.clearMessages();\r\n }\r\n\r\n private async loadUserSessions(): Promise<void> {\r\n const userId = this.authService.userId() || '';\r\n Logger.info(`Initiating loadUserSessions for user: ${userId}`);\r\n try {\r\n await this.chatHistory.loadSessions(userId.toString());\r\n } catch (err) {\r\n Logger.error('Failed to load user sessions', err);\r\n }\r\n }\r\n\r\n /* ---------------- Chat ---------------- */\r\n\r\n async onSend(text: string) {\r\n await this.chatService.sendMessage(text);\r\n this.chatHistory.invalidateCache();\r\n }\r\n\r\n async onSuggestionClick(text: string) {\r\n await this.chatService.sendMessage(text);\r\n this.chatHistory.invalidateCache();\r\n }\r\n\r\n onClearChat() {\r\n this.chatService.clearMessages();\r\n }\r\n\r\n /* ---------------- UI ---------------- */\r\n\r\n // when user toggle fullscreen\r\n onToggleFullScreen() {\r\n this.fullscreenDirective.toggle();\r\n const isFullscreen = this.fullscreenDirective.isActive();\r\n this.chatService.setFullscreen(isFullscreen);\r\n\r\n if (isFullscreen) {\r\n this.refreshHistory();\r\n }\r\n }\r\n\r\n // when user open settings\r\n onOpenSettings() {\r\n this.openSettings.emit();\r\n }\r\n\r\n // when user click on login button in auth loader\r\n onRedirectToLogin() {\r\n this.showLoginForm.set(true);\r\n }\r\n\r\n // when user open personalization\r\n onOpenPersonalization() {\r\n this.dialogService.open(PersonalizationDialogComponent, {\r\n width: '1100px',\r\n height: '700px',\r\n maxWidth: '95vw',\r\n panelClass: 'personalization-dialog-panel',\r\n });\r\n }\r\n\r\n // when user logout\r\n onLogout() {\r\n this.dialogService\r\n .confirm({\r\n title: 'Logout',\r\n message: 'Are you sure you want to log out?',\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n })\r\n .subscribe((confirmed) => {\r\n if (confirmed) this.authService.logout();\r\n });\r\n }\r\n\r\n // when user popout shown\r\n // onPopoutShown(win: Window) {\r\n // // Apply theme classes\r\n // const activeTheme = this.themeService.activeTheme();\r\n\r\n // const body = win.document.body;\r\n // body.classList.remove('light-theme', 'dark-theme');\r\n // body.classList.add(activeTheme);\r\n\r\n // // Apply CSS variables\r\n // this.themeService.applyCssVariables(body, this.themeConfig());\r\n // }\r\n\r\n ngOnDestroy() {}\r\n}\r\n","@if (isChatOpen()) {\r\n <div\r\n draggableDialog\r\n dragHandle=\"app-chat-header\"\r\n [enableDrag]=\"canDrag()\"\r\n resizableDialog\r\n [enableResize]=\"canResize()\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen()\"\r\n [class.layout-sidebar]=\"buttonStyle().includes('sidebar')\"\r\n >\r\n <app-chat-header\r\n [settingsMenu]=\"settingsMenu\"\r\n (toggleFullScreen)=\"onToggleFullScreen()\"\r\n [isNewChatDisabled]=\"chatService.messages().length === 0\"\r\n (toggleHistorySidebar)=\"onOpenHistorySidebar()\"\r\n (clearChat)=\"onClearChat()\"\r\n ></app-chat-header>\r\n\r\n <!-- AUTH LOADING -->\r\n @if (!authService.isAuthenticated()) {\r\n <div class=\"auth-loader\">\r\n @switch (authMode()) {\r\n @case ('manual') {\r\n <app-login-form></app-login-form>\r\n }\r\n @case ('federated') {\r\n <app-notification-banner></app-notification-banner>\r\n }\r\n @case ('session') {\r\n <div class=\"session-initializer\">\r\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\r\n <p>Initializing session...</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"chat-content-wrapper\">\r\n @if (authService.isAuthenticated()) {\r\n <app-chat-history\r\n [class.sidebar-closed]=\"\r\n (!isHistorySidebarOpen() && !isFullScreen()) ||\r\n (isFullScreen() && !authService.isAuthenticated()) ||\r\n (isFullScreen() && isMobile() && !isHistorySidebarOpen())\r\n \"\r\n [sessions]=\"chatSessions()\"\r\n [isOpen]=\"\r\n isHistorySidebarOpen() ||\r\n (isFullScreen() && authService.isAuthenticated() && !isMobile())\r\n \"\r\n [isLoading]=\"isLoadingSessions()\"\r\n [hasMoreSessions]=\"hasMoreHistory()\"\r\n [isLoadingMore]=\"isLoadingMore()\"\r\n [processingSessionId]=\"processingSessionId()\"\r\n [activeSessionId]=\"activeSessionId()\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (loadMore)=\"loadMoreHistory()\"\r\n (refresh)=\"refreshHistory()\"\r\n (sessionRenamed)=\"onSessionRenamed($event)\"\r\n (deleteAll)=\"onDeleteAllSessions()\"\r\n (closed)=\"onCloseHistorySidebar()\"\r\n ></app-chat-history>\r\n }\r\n\r\n <div\r\n class=\"messages-view\"\r\n [class.hidden]=\"isHistorySidebarOpen() && (!isFullScreen() || isMobile())\"\r\n >\r\n @if (authService.isAuthenticated()) {\r\n <app-chat-message-container\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n ></app-chat-message-container>\r\n }\r\n\r\n @if (\r\n authService.isAuthenticated() &&\r\n chatService.messages().length === 0 &&\r\n !chatService.isBotTyping()\r\n ) {\r\n <app-chips\r\n [messages]=\"suggestionChips()\"\r\n [disabled]=\"chatService.isBotTyping()\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n }\r\n\r\n @if (authService.isAuthenticated()) {\r\n <app-chat-input (send)=\"onSend($event)\"></app-chat-input>\r\n }\r\n\r\n <app-chat-footer [showDisclaimer]=\"chatService.messages().length > 0\"></app-chat-footer>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n}\r\n\r\n<mat-menu #settingsMenu=\"matMenu\" class=\"profile-menu\">\r\n <!-- User Profile Header -->\r\n @if (authService.isAuthenticated()) {\r\n <div class=\"menu-profile-header\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"avatar-container\">\r\n @if (authService.profileImageUrl()) {\r\n <img [src]=\"authService.profileImageUrl()\" alt=\"Avatar\" class=\"menu-avatar\" />\r\n } @else {\r\n <mat-icon class=\"menu-avatar-icon\">account_circle</mat-icon>\r\n }\r\n </div>\r\n <div class=\"user-info\">\r\n <div class=\"name-badge\">\r\n <span class=\"user-name\">{{ authService.username() }}</span>\r\n <!-- <span class=\"pro-badge\">PRO</span> -->\r\n </div>\r\n <div class=\"user-email\">{{ authService.email() }}</div>\r\n </div>\r\n </div>\r\n <mat-divider></mat-divider>\r\n }\r\n\r\n <!-- Account Settings -->\r\n @if (authService.isAuthenticated()) {\r\n <button mat-menu-item (click)=\"onOpenPersonalization()\">\r\n <mat-icon>person_outline</mat-icon>\r\n <span>Account Settings</span>\r\n </button>\r\n }\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <!-- Clear Chat -->\r\n @if (authService.isAuthenticated() && chatService.messages().length > 0) {\r\n <button mat-menu-item (click)=\"onClearChat()\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>End Chat</span>\r\n </button>\r\n }\r\n\r\n <!-- Logout -->\r\n @if (authService.isAuthenticated() && isManualAuth()) {\r\n <button mat-menu-item (click)=\"onLogout()\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n }\r\n</mat-menu>\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { DOOHBOT_CONFIG } from '../config/doohbot-config.token';\r\nimport { Logger } from '../utils/logger.service';\r\nimport { DoohbotConfig } from '../config/doohbot-config.model';\r\nimport { AuthService } from '../auth/auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LicenseService {\r\n constructor(\r\n private http: HttpClient,\r\n private authService: AuthService,\r\n @Inject(DOOHBOT_CONFIG) private config: DoohbotConfig,\r\n ) {}\r\n\r\n /**\r\n * Initializes the license resolver by loading the license file and processing its contents.\r\n *\r\n * Resolves license only if passed the `licenseFilePath` in DoohbotConfig.\r\n */\r\n async initLicenseResolver() {\r\n const licenseUrl = this.config.licenseFilePath;\r\n if (!licenseUrl || licenseUrl.trim() === '') {\r\n Logger.warn('[LicenseService] No licenseFilePath provided');\r\n return;\r\n }\r\n\r\n // Resolve and set license\r\n const licenseFile = await this.loadLicenseFile(licenseUrl);\r\n this.authService.setLicenseFile(licenseFile);\r\n }\r\n\r\n /**\r\n * Loads license file from a public asset URL.\r\n * Library-safe: works only with HTTP-accessible paths.\r\n */\r\n private async loadLicenseFile(licenseUrl: string): Promise<Map<string, string> | null> {\r\n try {\r\n const data = await firstValueFrom(this.http.get<Record<string, string>>(licenseUrl));\r\n if (!data || typeof data !== 'object') {\r\n throw new Error('Invalid license file');\r\n }\r\n\r\n return new Map(Object.entries(data));\r\n } catch (error) {\r\n Logger.error('[LicenseService] Failed to load license file:', licenseUrl, error);\r\n return null;\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n ElementRef,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { AuthService } from './core/auth/auth.service';\r\nimport { ThemeService } from './core/services/theme.service';\r\nimport { DoohbotConfigService } from './core/config/doohbot-config.service';\r\nimport { ChatButtonComponent } from './app/chat/components/chat-button/chat-button.component';\r\nimport { ChatWindowComponent } from './app/chat/components/chat-window/chat-window.component';\r\nimport { ChatService } from './app/chat/chat.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AuthResult } from './core/auth/models/auth-result.model';\r\nimport { LicenseService } from './core/services/license.service';\r\nimport { FullscreenDirective, FullscreenMode } from './core/directives/fullscreen.directive';\r\n\r\n/**\r\n * Doohbot Main Component\r\n * Root component of the Doohbot library\r\n */\r\n@Component({\r\n selector: 'app-doohbot',\r\n standalone: true,\r\n imports: [CommonModule, ChatButtonComponent, ChatWindowComponent, FullscreenDirective],\r\n templateUrl: './doohbot.component.html',\r\n styleUrls: ['./doohbot.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DoohbotComponent implements OnInit, OnChanges, OnDestroy {\r\n /**\r\n * Federated authentication token from the host application.\r\n *\r\n * Used for SSO / federated login. The token must be issued by a\r\n * trusted issuer configured in the Doohbot admin panel.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [federatedToken]=\"accessToken\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() federatedToken?: string;\r\n\r\n /**\r\n * Session or auth result based login.\r\n *\r\n * Should pass host application's session or auth result object containing necessary user and token information.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [session]=\"session\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() session?: AuthResult;\r\n\r\n /**\r\n * Whether the user session should be persisted across browser restarts.\r\n *\r\n * When `true`, Doohbot stores auth state in `localStorage`.\r\n * When `false`, `sessionStorage` is used instead.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [rememberMe]=\"true\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() rememberMe?: boolean;\r\n\r\n /**\r\n * License file json object.\r\n *\r\n * Required only when the `licenseFilePath` is not passed from `provideDoohbot()`.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [licenseFile]=\"licenseFile\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() licenseFile?: Map<string, string>;\r\n\r\n /**\r\n * License code used to activate licensed features.\r\n *\r\n * Required only when multiple licenses are configured.\r\n * Can change dynamically per tenant, user, or role.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [licenseCode]=\"licenseCode\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() licenseCode?: string;\r\n\r\n /**\r\n * Whether the Doohbot UI is in dark mode.\r\n *\r\n * When `true`, Doohbot uses a dark theme.\r\n * When `false`, Doohbot uses a light theme.\r\n * When not provided, Doohbot will attempt to auto-detect the theme based on the host application's theme or system preferences.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [isDarkMode]=\"true\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() isDarkMode?: boolean;\r\n\r\n /**\r\n * Fullscreen mode for the chat when fullscreen button is clicked.\r\n *\r\n * When `browser`, Doohbot uses browser fullscreen mode.\r\n * When `viewport`, Doohbot uses visible viewport.\r\n * When `contained`, Doohbot uses parent available space.\r\n * When not provided, Doohbot will use 'viewport'.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [fullscreenMode]=\"'viewport'\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() fullscreenMode: FullscreenMode = 'viewport';\r\n\r\n private destroyIsAuthenticated$ = new Subject<void>();\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private themeService: ThemeService,\r\n private licenseService: LicenseService,\r\n private authService: AuthService,\r\n private chatService: ChatService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n // Theme management effect\r\n effect(() => {\r\n // Apply theme from global configuration early to register root element\r\n this.applyTheme();\r\n });\r\n }\r\n\r\n async ngOnInit() {\r\n // Resolve in case of license file\r\n await this.licenseService.initLicenseResolver();\r\n\r\n // Auth state\r\n this.authService.isAuthenticated$\r\n .pipe(takeUntil(this.destroyIsAuthenticated$))\r\n .subscribe((value) => {\r\n if (value) {\r\n this.initializeUI();\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['rememberMe']) {\r\n this.authService.setRememberMe(this.rememberMe);\r\n }\r\n\r\n if (changes['licenseFile'] && this.licenseFile) {\r\n this.authService.setLicenseFile(this.licenseFile);\r\n }\r\n\r\n if (changes['licenseCode'] && this.licenseCode) {\r\n this.authService.setLicenseCode(this.licenseCode);\r\n }\r\n\r\n if (changes['isDarkMode']) {\r\n this.applyTheme();\r\n }\r\n\r\n //! ONLY trigger auth when relevant\r\n if (changes['licenseFile'] || changes['licenseCode'] || changes['rememberMe']) {\r\n this.tryStartAuthFlow();\r\n }\r\n }\r\n\r\n // Theme applied from global configuration\r\n private applyTheme() {\r\n this.themeService.setThemeConfig(this.elementRef, this.isDarkMode);\r\n }\r\n\r\n private initializeUI() {\r\n // TODO: Fetch user related theme/personalization from api and set theme (eg: dark-them, navigation-pin, fullscreen)\r\n this.applyTheme();\r\n\r\n // Start new session\r\n this.chatService.startNewSession();\r\n\r\n // Subscribe to context changes if not already\r\n this.chatService.resetLastRead();\r\n }\r\n\r\n private tryStartAuthFlow() {\r\n const authConfig = this.configService.auth();\r\n if (!authConfig) return;\r\n\r\n const hasFederated = !!this.federatedToken;\r\n const hasSession = !!this.session;\r\n\r\n switch (authConfig.mode) {\r\n case 'federated':\r\n if (!hasFederated) return; // wait until input is set\r\n if (hasSession) {\r\n console.warn('session input is ignored because mode is federated.');\r\n }\r\n this.authService.setFederatedAuthToken(this.federatedToken);\r\n this.authService.initFederatedAuthFlow();\r\n break;\r\n\r\n case 'session':\r\n if (!hasSession) return; // wait until input is set\r\n if (hasFederated) {\r\n console.warn('federatedToken is ignored because mode is session.');\r\n }\r\n this.authService.initSessionAuthFlow(this.session);\r\n break;\r\n\r\n case 'manual':\r\n if (hasFederated || hasSession) {\r\n console.warn('Authentication inputs are ignored because mode is manual.');\r\n }\r\n // Optionally trigger manual login flow\r\n break;\r\n\r\n default:\r\n throw new Error(`Unsupported authentication mode: ${authConfig.mode}`);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroyIsAuthenticated$.next();\r\n this.destroyIsAuthenticated$.complete();\r\n }\r\n}\r\n","<app-chat-button> </app-chat-button>\r\n\r\n<app-chat-window [appFullscreen]=\"fullscreenMode\"> </app-chat-window>\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { AuthService } from './core/auth/auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DoohbotService {\r\n private authService = inject(AuthService);\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Logout the current user by clearing authentication tokens and state.\r\n * @returns A promise that resolves to true if logout was successful, false otherwise.\r\n */\r\n async logout(): Promise<boolean> {\r\n return this.authService.logout();\r\n }\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpHandler,\r\n HttpInterceptor,\r\n HttpRequest,\r\n} from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError, from } from 'rxjs';\r\nimport { catchError, retry, switchMap } from 'rxjs/operators';\r\nimport { AuthService } from '../auth/auth.service';\r\nimport { Logger } from '../utils/logger.service';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport { FederatedLoginRequest } from '../auth/models/federated-login-request.model';\r\n\r\n@Injectable()\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n constructor(\r\n private authService: AuthService,\r\n private configService: DoohbotConfigService,\r\n ) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n // In case of doohbot.com, the auth flow is handled in the doohbot-web itself, so we want to skip adding auth headers or attempting refreshes for those requests.\r\n if (this.configService.auth()?.mode === 'session') {\r\n return next.handle(req);\r\n }\r\n\r\n const authReq = this.addAuthHeader(req);\r\n return next.handle(authReq).pipe(\r\n catchError((error) => {\r\n if (\r\n error instanceof HttpErrorResponse &&\r\n error.status === 401 &&\r\n !this.authService.isAuthUrl(authReq.url)\r\n ) {\r\n //TODO: No refresh in case of federate mode\r\n // Consumer TTL for token can be longer than doohbot token TTL\r\n // So in case of federate mode, re-login instead of refresh\r\n if (this.configService.auth()?.mode === 'federated') {\r\n const loginRequest: FederatedLoginRequest = {\r\n access_token: this.authService.federatedAuthToken() ?? '',\r\n remember_me: this.authService.rememberMe(),\r\n };\r\n\r\n from(this.authService.federatedLogin(loginRequest)).pipe(\r\n retry(3), // retry re-login 3 times\r\n switchMap((result) => {\r\n if (!result) {\r\n return throwError(() => error);\r\n }\r\n return next.handle(this.addAuthHeader(req));\r\n }),\r\n catchError((authErr) => {\r\n Logger.error('[AuthInterceptor] Refresh error', authErr);\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n // Logger.error('[AuthInterceptor] 401 detected, attempting refresh');\r\n // // Refresh if expired/unauthenticated during http request\r\n // return this.authService.refreshLogin().pipe(\r\n // switchMap((result) => {\r\n // if (!result?.access_token) {\r\n // Logger.error('[AuthInterceptor] Refresh failed, clearing auth');\r\n // this.authService.clearAuth();\r\n // return throwError(() => error);\r\n // }\r\n\r\n // Logger.info('[AuthInterceptor] Token refreshed, retrying request');\r\n // return next.handle(this.addAuthHeader(req));\r\n // }),\r\n // catchError((refreshErr) => {\r\n // Logger.error('[AuthInterceptor] Refresh error', refreshErr);\r\n // this.authService.clearAuth();\r\n // return throwError(() => error);\r\n // }),\r\n // );\r\n }\r\n\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n private addAuthHeader(req: HttpRequest<any>): HttpRequest<any> {\r\n // Skip doohbot API requests that are auth-related or not API calls\r\n if (this.authService.isAuthUrl(req.url)) return req;\r\n\r\n // Skip if not a doohbot API request (e.g. external API calls)\r\n if (!this.authService.isConsumerApiRequest(req.url)) return req;\r\n\r\n const token = this.authService.accessToken();\r\n if (!token) return req;\r\n\r\n return req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpInterceptor,\r\n HttpRequest,\r\n HttpHeaders,\r\n HttpHandler,\r\n HttpEvent,\r\n HttpResponse,\r\n HttpErrorResponse,\r\n} from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\n\r\n@Injectable()\r\nexport class HttpLoggingInterceptor implements HttpInterceptor {\r\n private readonly LABEL_WIDTH = 22;\r\n\r\n private formatLine(label: string, value: any, color: string): void {\r\n const paddedLabel = label.padEnd(this.LABEL_WIDTH, ' ');\r\n const line = `${paddedLabel}${value !== undefined && value !== null ? value : ''}`;\r\n console.log(`%c${line}`, `color: ${color}; font-weight: bolder;`);\r\n }\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const start = performance.now();\r\n const id = new Date().toISOString();\r\n const tag = `[${id}] [${req.method}]: ${req.urlWithParams}`;\r\n\r\n console.log('');\r\n console.groupCollapsed(`%c${tag}`, 'color: #1ba02c; font-weight: bolder;');\r\n\r\n // General Section\r\n console.log('%cGeneral', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.formatLine('Request URL', req.urlWithParams, '#058c96');\r\n this.formatLine('Request Method', req.method, '#058c96');\r\n this.formatLine('Status Code', '—', '#058c96');\r\n this.formatLine('Remote Address', req.url.split('/')[2], '#058c96');\r\n this.formatLine('Referrer Policy', 'strict-origin-when-cross-origin', '#058c96');\r\n\r\n // Request Headers\r\n console.log('%cRequest Headers', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.logHeaders(req.headers);\r\n\r\n // Request Payload\r\n if (req.body) {\r\n console.log('%cRequest Payload', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.formatLine('Body:', this.stringifyForLog(req.body), '#058c96');\r\n }\r\n\r\n return next.handle(req).pipe(\r\n tap({\r\n next: (event) => {\r\n if (event instanceof HttpResponse) {\r\n const duration = Math.round(performance.now() - start);\r\n this.logResponse(event, duration);\r\n }\r\n },\r\n error: (err: HttpErrorResponse) => {\r\n const duration = Math.round(performance.now() - start);\r\n this.logError(err, duration);\r\n },\r\n }),\r\n );\r\n }\r\n\r\n private logResponse(res: HttpResponse<any>, duration: number) {\r\n console.log('%cResponse Headers', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.logHeaders(res.headers);\r\n\r\n console.log('%cResponse', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.formatLine('Status Code', `${res.status} ${res.statusText}`, '#058c96');\r\n this.formatLine('Time', `${duration} ms`, '#058c96');\r\n\r\n this.formatBody(res.body)\r\n .then((bodyStr) => {\r\n if (bodyStr) {\r\n console.log('%cResponse Body', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n console.log(bodyStr);\r\n }\r\n console.groupEnd();\r\n console.log('');\r\n })\r\n .catch(() => {\r\n console.groupEnd();\r\n console.log('');\r\n });\r\n }\r\n\r\n private logError(err: HttpErrorResponse, duration: number) {\r\n console.log('%cResponse Headers', 'font-size: 17px; font-weight: bolder; color: #197177;');\r\n this.logHeaders(err.headers);\r\n\r\n console.log('%cResponse', 'font-size: 17px; font-weight: bold; color: #dc2626;');\r\n this.formatLine('Status Code', `${err.status} ${err.statusText}`, '#dc2626');\r\n this.formatLine('Time', `${duration} ms`, '#dc2626');\r\n\r\n this.formatBody(err.error || err.message)\r\n .then((bodyStr) => {\r\n if (bodyStr) {\r\n console.log('%cError Body', 'font-size: 17px; font-weight: bold; color: #dc2626;');\r\n console.log(bodyStr);\r\n }\r\n console.groupEnd();\r\n console.log('');\r\n })\r\n .catch(() => {\r\n console.groupEnd();\r\n console.log('');\r\n });\r\n }\r\n\r\n private logHeaders(headers: HttpHeaders | null | undefined) {\r\n if (!headers || headers.keys().length === 0) {\r\n console.log(' (none)');\r\n return;\r\n }\r\n headers.keys().forEach((key) => {\r\n const value = headers.get(key) || '';\r\n const paddedKey = ` ${key}:`.padEnd(this.LABEL_WIDTH, ' ');\r\n console.log(`%c${paddedKey}${value}`, 'color: #058c96; font-weight: bolder;');\r\n });\r\n }\r\n\r\n private stringifyForLog(obj: any): string {\r\n if (obj === null || obj === undefined) return 'null';\r\n if (typeof obj === 'string') return obj;\r\n try {\r\n return JSON.stringify(obj, null, 2);\r\n } catch {\r\n return String(obj);\r\n }\r\n }\r\n\r\n private async formatBody(body: any): Promise<string | null> {\r\n if (!body) return null;\r\n\r\n if (body instanceof Blob && body.type.includes('application/json')) {\r\n const text = await body.text();\r\n try {\r\n const parsed = JSON.parse(text);\r\n return JSON.stringify(parsed, null, 2);\r\n } catch {\r\n return text;\r\n }\r\n }\r\n\r\n if (typeof body === 'object') {\r\n try {\r\n return JSON.stringify(body, null, 2);\r\n } catch {\r\n return String(body);\r\n }\r\n }\r\n\r\n return String(body);\r\n }\r\n}\r\n","import { ErrorHandler, Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class GlobalErrorHandler implements ErrorHandler {\r\n handleError(error: any): void {\r\n console.error(\r\n '%c [GLOBAL ERROR]:',\r\n 'color: #dc2626; font-weight: bold;',\r\n this.normalizeError(error),\r\n );\r\n }\r\n\r\n private normalizeError(err: any) {\r\n return {\r\n message: err?.message || err?.toString(),\r\n stack: err?.stack || null,\r\n cause: err?.cause || null,\r\n };\r\n }\r\n}\r\n","import { APP_INITIALIZER, ErrorHandler, makeEnvironmentProviders, Provider } from '@angular/core';\r\nimport { resolveDoohbotConfig } from './core/config/doohbot-config.resolver';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { AuthInterceptor } from './core/interceptors/auth.interceptor';\r\nimport { Logger } from './core/utils/logger.service';\r\nimport { DoohbotConfigService } from './core/config/doohbot-config.service';\r\nimport { HttpLoggingInterceptor } from './core/interceptors/http-logging.interceptor';\r\nimport { GlobalErrorHandler } from './core/services/global-error-handler';\r\nimport { DOOHBOT_CONFIG } from './core/config/doohbot-config.token';\r\nimport { DoohbotConfig } from './core/config/doohbot-config.model';\r\n\r\n/**\r\n * Provides all necessary Doohbot dependencies for standalone Angular applications.\r\n *\r\n * This provider:\r\n * - Registers the Doohbot configuration via dependency injection\r\n * - Registers HTTP interceptors required for authentication and licensing\r\n * - Does NOT provide `HttpClientModule` — the host application must provide it\r\n *\r\n * Use this when you want Doohbot to manage authentication, licensing,\r\n * and API integration automatically.\r\n *\r\n * @param config Partial configuration. Missing values are resolved using library defaults.\r\n * @returns EnvironmentProviders for use with `bootstrapApplication`\r\n *\r\n * @example\r\n * ```ts\r\n * // main.ts\r\n * import { bootstrapApplication } from '@angular/platform-browser';\r\n * import { importProvidersFrom } from '@angular/core';\r\n * import { HttpClientModule } from '@angular/common/http';\r\n * import { AppComponent } from './app/app.component';\r\n * import { provideDoohbot } from 'doohbot';\r\n *\r\n * bootstrapApplication(AppComponent, {\r\n * providers: [\r\n * importProvidersFrom(HttpClientModule),\r\n * provideDoohbot({\r\n * environment: 'production',\r\n * licenseFilePath: 'assets/doohbot_license.json',\r\n * // Optional api configuration if want to use your own api.\r\n * // If omitted, baseUrl is resolved from environment automatically.\r\n * api: {\r\n * apiKey: 'your-api-key',\r\n * },\r\n * // Optional theme configuration if want to match doohbot to your application theme\r\n * theme: {\r\n * buttonStyle: 'fab',\r\n * fontFamily: 'Inter, Roboto, sans-serif',\r\n * enableDrag: true,\r\n * enableResize: true,\r\n * palette: 'doohbot'\r\n * }\r\n * }),\r\n * ],\r\n * }).catch(console.error);\r\n * ```\r\n */\r\nexport function provideDoohbot(config: Partial<DoohbotConfig> = {}) {\r\n const resolvedConfig = resolveDoohbotConfig(config);\r\n\r\n return makeEnvironmentProviders([\r\n {\r\n provide: DOOHBOT_CONFIG,\r\n useValue: resolvedConfig,\r\n },\r\n DoohbotConfigService,\r\n\r\n // Init logger\r\n Logger,\r\n {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n deps: [Logger],\r\n useFactory: (logger: Logger) => () => {\r\n Logger.init(logger);\r\n },\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor,\r\n multi: true,\r\n },\r\n ...(resolvedConfig.environment === 'production' ? [] : devProviders),\r\n ]);\r\n}\r\n\r\nconst devProviders: Provider[] = [\r\n { provide: HTTP_INTERCEPTORS, useClass: HttpLoggingInterceptor, multi: true },\r\n { provide: ErrorHandler, useClass: GlobalErrorHandler },\r\n];\r\n","/**\r\n * public-api.ts\r\n * Main public API surface of the Doohbot library.\r\n * Exports all necessary modules, components, services, and models.\r\n * Consumers should only import from this file.\r\n */\r\n\r\n// Components\r\nexport { DoohbotComponent } from './lib/doohbot.component';\r\nexport { DoohbotService } from './lib/doohbot.service';\r\nexport { DoohbotConfigService } from './lib/core/config/doohbot-config.service';\r\nexport { Logger } from './lib/core/utils/logger.service';\r\n\r\n// Providers\r\nexport { provideDoohbot } from './lib/doohbot.providers';\r\n\r\n// Configuration\r\nexport type { DoohbotConfig } from './lib/core/config/doohbot-config.model';\r\nexport type { DoohbotApiConfig } from './lib/core/models/api-config.model';\r\nexport type { DoohbotThemeConfig } from './lib/core/models/theme-config.model';\r\nexport { DOOHBOT_CONFIG } from './lib/core/config/doohbot-config.token';\r\nexport { resolveDoohbotConfig } from './lib/core/config/doohbot-config.resolver';\r\nexport { doohbotConst } from './lib/const/doohbot-constant';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DoohbotConfigService","i2.DoohbotConfigService","i1.HttpService","i2.HttpStreamService","i1","i2.StorageService","i3.DoohbotConfigService","i4.SnackbarService","i1.ChatService","i3.AuthService","i2","i3","map","i1.DialogService","i2.ChatService","i5","i2.PersonalizationService","i2.ThemeService","i3.ChatService","i4.AuthService","i6","i7","i1.AuthService","i4","i3.DialogService","i2.DialogService","i3.SnackbarService","i1.MarkdownService","i2.AuthService","i1.FullscreenDirective","i4.ChatService","i5.DialogService","i6.ChatHistoryService","i10","i1.ThemeService","i2.LicenseService","i5.DoohbotConfigService","catchError","retry","switchMap"],"mappings":"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"}