stream-chat-angular 2.9.0 → 2.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/assets/i18n/en.d.ts +2 -0
  2. package/assets/version.d.ts +1 -1
  3. package/bundles/stream-chat-angular.umd.js +718 -343
  4. package/bundles/stream-chat-angular.umd.js.map +1 -1
  5. package/esm2015/assets/i18n/en.js +3 -1
  6. package/esm2015/assets/version.js +2 -2
  7. package/esm2015/lib/channel/channel.component.js +3 -2
  8. package/esm2015/lib/channel.service.js +175 -40
  9. package/esm2015/lib/chat-client.service.js +6 -1
  10. package/esm2015/lib/icon/icon.component.js +2 -2
  11. package/esm2015/lib/message/message.component.js +67 -42
  12. package/esm2015/lib/message-actions-box/message-actions-box.component.js +20 -9
  13. package/esm2015/lib/message-input/message-input.component.js +61 -13
  14. package/esm2015/lib/message-list/message-list.component.js +124 -55
  15. package/esm2015/lib/message-preview.js +4 -2
  16. package/esm2015/lib/stream-chat.module.js +8 -3
  17. package/esm2015/lib/thread/thread.component.js +37 -0
  18. package/esm2015/public-api.js +2 -1
  19. package/fesm2015/stream-chat-angular.js +583 -252
  20. package/fesm2015/stream-chat-angular.js.map +1 -1
  21. package/lib/channel/channel.component.d.ts +2 -1
  22. package/lib/channel.service.d.ts +22 -7
  23. package/lib/chat-client.service.d.ts +1 -0
  24. package/lib/icon/icon.component.d.ts +1 -1
  25. package/lib/message/message.component.d.ts +26 -8
  26. package/lib/message-actions-box/message-actions-box.component.d.ts +4 -1
  27. package/lib/message-input/message-input.component.d.ts +7 -1
  28. package/lib/message-list/message-list.component.d.ts +21 -7
  29. package/lib/message-preview.d.ts +1 -1
  30. package/lib/stream-chat.module.d.ts +5 -4
  31. package/lib/thread/thread.component.d.ts +18 -0
  32. package/package.json +2 -11
  33. package/public-api.d.ts +1 -0
  34. package/src/assets/i18n/en.ts +4 -0
  35. package/src/assets/version.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"stream-chat-angular.js","sources":["../../../projects/stream-chat-angular/src/assets/version.ts","../../../projects/stream-chat-angular/src/lib/notification.service.ts","../../../projects/stream-chat-angular/src/lib/chat-client.service.ts","../../../projects/stream-chat-angular/src/lib/message-preview.ts","../../../projects/stream-chat-angular/src/lib/read-by.ts","../../../projects/stream-chat-angular/src/lib/channel.service.ts","../../../projects/stream-chat-angular/src/lib/theme.service.ts","../../../projects/stream-chat-angular/src/lib/is-image-file.ts","../../../projects/stream-chat-angular/src/lib/is-image-attachment.ts","../../../projects/stream-chat-angular/src/lib/attachment.service.ts","../../../projects/stream-chat-angular/src/assets/i18n/en.ts","../../../projects/stream-chat-angular/src/lib/stream-i18n.service.ts","../../../projects/stream-chat-angular/src/lib/avatar/avatar.component.ts","../../../projects/stream-chat-angular/src/lib/avatar/avatar.component.html","../../../projects/stream-chat-angular/src/lib/icon/icon.component.ts","../../../projects/stream-chat-angular/src/lib/icon/icon.component.html","../../../projects/stream-chat-angular/src/lib/loading-indicator/loading-indicator.component.ts","../../../projects/stream-chat-angular/src/lib/loading-indicator/loading-indicator.component.html","../../../projects/stream-chat-angular/src/lib/injection-tokens.ts","../../../projects/stream-chat-angular/src/lib/message-input/textarea.directive.ts","../../../projects/stream-chat-angular/src/lib/message-input/message-input-config.service.ts","../../../projects/stream-chat-angular/src/lib/attachment-preview-list/attachment-preview-list.component.ts","../../../projects/stream-chat-angular/src/lib/attachment-preview-list/attachment-preview-list.component.html","../../../projects/stream-chat-angular/src/lib/message-input/message-input.component.ts","../../../projects/stream-chat-angular/src/lib/message-input/message-input.component.html","../../../projects/stream-chat-angular/src/lib/modal/modal.component.ts","../../../projects/stream-chat-angular/src/lib/modal/modal.component.html","../../../projects/stream-chat-angular/src/lib/notification/notification.component.ts","../../../projects/stream-chat-angular/src/lib/notification/notification.component.html","../../../projects/stream-chat-angular/src/lib/notification-list/notification-list.component.ts","../../../projects/stream-chat-angular/src/lib/notification-list/notification-list.component.html","../../../projects/stream-chat-angular/src/lib/message-actions-box/message-actions-box.component.ts","../../../projects/stream-chat-angular/src/lib/message-actions-box/message-actions-box.component.html","../../../projects/stream-chat-angular/src/lib/channel/channel.component.ts","../../../projects/stream-chat-angular/src/lib/channel/channel.component.html","../../../projects/stream-chat-angular/src/lib/device-width.ts","../../../projects/stream-chat-angular/src/lib/channel-list/channel-list-toggle.service.ts","../../../projects/stream-chat-angular/src/lib/channel-header/channel-header.component.ts","../../../projects/stream-chat-angular/src/lib/channel-header/channel-header.component.html","../../../projects/stream-chat-angular/src/lib/channel-preview/channel-preview.component.ts","../../../projects/stream-chat-angular/src/lib/channel-preview/channel-preview.component.html","../../../projects/stream-chat-angular/src/lib/channel-list/channel-list.component.ts","../../../projects/stream-chat-angular/src/lib/channel-list/channel-list.component.html","../../../projects/stream-chat-angular/src/lib/message/parse-date.ts","../../../projects/stream-chat-angular/src/lib/message/read-by-text.ts","../../../projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.ts","../../../projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.html","../../../projects/stream-chat-angular/src/lib/message-list/image-load.service.ts","../../../projects/stream-chat-angular/src/lib/attachment-list/attachment-list.component.ts","../../../projects/stream-chat-angular/src/lib/attachment-list/attachment-list.component.html","../../../projects/stream-chat-angular/src/lib/message/message.component.ts","../../../projects/stream-chat-angular/src/lib/message/message.component.html","../../../projects/stream-chat-angular/src/lib/message-input/textarea/textarea.component.ts","../../../projects/stream-chat-angular/src/lib/message-input/textarea/textarea.component.html","../../../projects/stream-chat-angular/src/lib/transliteration.service.ts","../../../projects/stream-chat-angular/src/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.ts","../../../projects/stream-chat-angular/src/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.html","../../../projects/stream-chat-angular/src/lib/message-list/group-styles.ts","../../../projects/stream-chat-angular/src/lib/message-list/message-list.component.ts","../../../projects/stream-chat-angular/src/lib/message-list/message-list.component.html","../../../projects/stream-chat-angular/src/lib/stream-avatar.module.ts","../../../projects/stream-chat-angular/src/lib/stream-chat.module.ts","../../../projects/stream-chat-angular/src/lib/stream-autocomplete-textarea.module.ts","../../../projects/stream-chat-angular/src/lib/stream-textarea.module.ts","../../../projects/stream-chat-angular/src/public-api.ts","../../../projects/stream-chat-angular/src/stream-chat-angular.ts"],"sourcesContent":["export const version = '2.9.0';\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport type NotificationType = 'success' | 'error';\n\nexport type NotificationPayload = {\n type: NotificationType;\n text: string;\n translateParams?: Object;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationService {\n notifications$: Observable<NotificationPayload[]>;\n private notificationsSubject = new BehaviorSubject<NotificationPayload[]>([]);\n\n constructor() {\n this.notifications$ = this.notificationsSubject.asObservable();\n }\n\n addTemporaryNotification(\n text: string,\n type: NotificationType = 'error',\n timeout: number = 5000,\n translateParams?: Object\n ) {\n this.addNotification(text, type, translateParams);\n const id = setTimeout(() => this.removeNotification(text), timeout);\n\n return () => {\n clearTimeout(id);\n this.removeNotification(text);\n };\n }\n\n addPermanentNotification(\n text: string,\n type: NotificationType = 'error',\n translateParams?: Object\n ) {\n this.addNotification(text, type, translateParams);\n\n return () => this.removeNotification(text);\n }\n\n private addNotification(\n text: string,\n type: NotificationType,\n translateParams?: Object\n ) {\n this.notificationsSubject.next([\n ...this.notificationsSubject.getValue(),\n { text, type, translateParams },\n ]);\n }\n\n private removeNotification(text: string) {\n const notifications = this.notificationsSubject.getValue();\n const index = notifications.findIndex((n) => n.text === text);\n if (index === -1) {\n return;\n }\n notifications.splice(index, 1);\n this.notificationsSubject.next([...notifications]);\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { BehaviorSubject, Observable, ReplaySubject } from 'rxjs';\nimport { OwnUserResponse, UserResponse } from 'stream-chat';\nimport { AppSettings, Event, StreamChat, TokenOrProvider } from 'stream-chat';\nimport { version } from '../assets/version';\nimport { NotificationService } from './notification.service';\n\nexport type Notification = {\n eventType: string;\n event: Event;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ChatClientService {\n chatClient!: StreamChat;\n notification$: Observable<Notification>;\n appSettings$: Observable<AppSettings | undefined>;\n connectionState$: Observable<'offline' | 'online'>;\n private notificationSubject = new ReplaySubject<Notification>(1);\n private connectionStateSubject = new ReplaySubject<'offline' | 'online'>(1);\n private appSettingsSubject = new BehaviorSubject<AppSettings | undefined>(\n undefined\n );\n\n constructor(\n private ngZone: NgZone,\n private notificationService: NotificationService\n ) {\n this.notification$ = this.notificationSubject.asObservable();\n this.connectionState$ = this.connectionStateSubject.asObservable();\n this.appSettings$ = this.appSettingsSubject.asObservable();\n }\n\n async init(\n apiKey: string,\n userOrId: string | OwnUserResponse | UserResponse,\n userTokenOrProvider: TokenOrProvider\n ) {\n this.chatClient = StreamChat.getInstance(apiKey);\n await this.ngZone.runOutsideAngular(async () => {\n const user = typeof userOrId === 'string' ? { id: userOrId } : userOrId;\n await this.chatClient.connectUser(user, userTokenOrProvider);\n this.chatClient.setUserAgent(\n `stream-chat-angular-${version}-${this.chatClient.getUserAgent()}`\n );\n this.chatClient.getAppSettings;\n });\n this.appSettingsSubject.next(undefined);\n this.chatClient.on((e) => {\n this.notificationSubject.next({\n eventType: e.type,\n event: e,\n });\n });\n let removeNotification: undefined | Function;\n this.chatClient.on('connection.changed', (e) => {\n this.ngZone.run(() => {\n const isOnline = e.online;\n if (isOnline) {\n if (removeNotification) {\n removeNotification();\n }\n } else {\n removeNotification =\n this.notificationService.addPermanentNotification(\n 'streamChat.Connection failure, reconnecting now...'\n );\n }\n this.connectionStateSubject.next(isOnline ? 'online' : 'offline');\n });\n });\n }\n\n async getAppSettings() {\n if (this.appSettingsSubject.getValue()) {\n return;\n }\n const settings = await this.chatClient.getAppSettings();\n this.appSettingsSubject.next(settings.app || {});\n }\n\n async flagMessage(messageId: string) {\n await this.chatClient.flagMessage(messageId);\n }\n\n async autocompleteUsers(searchTerm: string) {\n if (!searchTerm) {\n return [];\n }\n const result = await this.chatClient.queryUsers({\n $or: [\n { id: { $autocomplete: searchTerm } },\n { name: { $autocomplete: searchTerm } },\n ],\n id: { $ne: this.chatClient.userID! },\n });\n return result.users;\n }\n}\n","import { Attachment, MessageResponse, UserResponse } from 'stream-chat';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const createMessagePreview = (\n user: UserResponse,\n text: string,\n attachments: Attachment[],\n mentionedUsers: UserResponse[]\n) => {\n const clientSideId = `${user.id}-${uuidv4()}`;\n\n return {\n __html: text,\n created_at: new Date(),\n html: text,\n id: clientSideId,\n reactions: [],\n status: 'sending',\n text,\n type: 'regular',\n user,\n attachments,\n mentioned_users: mentionedUsers,\n } as unknown as MessageResponse;\n};\n","import { Channel, FormatMessageResponse, UserResponse } from 'stream-chat';\n\nexport const getReadBy = (message: FormatMessageResponse, channel: Channel) => {\n const readBy: UserResponse[] = [];\n Object.keys(channel.state.read).forEach((key) => {\n if (\n channel.state.read[key].last_read.getTime() >=\n message.updated_at.getTime() &&\n message.user?.id !== key\n ) {\n readBy.push(channel.state.read[key].user);\n }\n });\n\n return readBy;\n};\n","import { Injectable, NgZone } from '@angular/core';\nimport { BehaviorSubject, Observable, ReplaySubject } from 'rxjs';\nimport { first, map } from 'rxjs/operators';\nimport {\n Attachment,\n Channel,\n ChannelFilters,\n ChannelOptions,\n ChannelSort,\n Event,\n FormatMessageResponse,\n MessageResponse,\n UpdatedMessage,\n UserResponse,\n} from 'stream-chat';\nimport { ChatClientService, Notification } from './chat-client.service';\nimport { createMessagePreview } from './message-preview';\nimport { MessageReactionType } from './message-reactions/message-reactions.component';\nimport { getReadBy } from './read-by';\nimport { AttachmentUpload, StreamMessage } from './types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ChannelService {\n hasMoreChannels$: Observable<boolean>;\n channels$: Observable<Channel[] | undefined>;\n activeChannel$: Observable<Channel | undefined>;\n activeChannelMessages$: Observable<StreamMessage[]>;\n customNewMessageNotificationHandler?: (\n notification: Notification,\n channelListSetter: (channels: Channel[]) => void\n ) => void;\n customAddedToChannelNotificationHandler?: (\n notification: Notification,\n channelListSetter: (channels: Channel[]) => void\n ) => void;\n customRemovedFromChannelNotificationHandler?: (\n notification: Notification,\n channelListSetter: (channels: Channel[]) => void\n ) => void;\n customChannelDeletedHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void\n ) => void;\n customChannelUpdatedHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void\n ) => void;\n customChannelTruncatedHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void\n ) => void;\n customChannelHiddenHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void\n ) => void;\n customChannelVisibleHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void\n ) => void;\n customNewMessageHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void\n ) => void;\n private channelsSubject = new BehaviorSubject<Channel[] | undefined>(\n undefined\n );\n private activeChannelSubject = new BehaviorSubject<Channel | undefined>(\n undefined\n );\n private activeChannelMessagesSubject = new BehaviorSubject<\n (StreamMessage | MessageResponse | FormatMessageResponse)[]\n >([]);\n private hasMoreChannelsSubject = new ReplaySubject<boolean>(1);\n private activeChannelSubscriptions: { unsubscribe: () => void }[] = [];\n private filters: ChannelFilters | undefined;\n private sort: ChannelSort | undefined;\n private options: ChannelOptions | undefined;\n\n private channelListSetter = (channels: Channel[]) => {\n this.channelsSubject.next(channels);\n };\n\n private messageListSetter = (messages: StreamMessage[]) => {\n this.activeChannelMessagesSubject.next(messages);\n };\n\n constructor(\n private chatClientService: ChatClientService,\n private ngZone: NgZone\n ) {\n this.channels$ = this.channelsSubject.asObservable();\n this.activeChannel$ = this.activeChannelSubject.asObservable();\n this.activeChannelMessages$ = this.activeChannelMessagesSubject.pipe(\n map((messages) => {\n const channel = this.activeChannelSubject.getValue()!;\n return messages.map((message) => {\n if (\n this.isStreamMessage(message) &&\n this.isFormatMessageResponse(message)\n ) {\n return message;\n } else if (this.isFormatMessageResponse(message)) {\n return { ...message, readBy: getReadBy(message, channel) };\n } else {\n const formatMessage = this.formatMessage(message);\n return {\n ...formatMessage,\n readBy: getReadBy(formatMessage, channel),\n };\n }\n });\n })\n );\n this.hasMoreChannels$ = this.hasMoreChannelsSubject.asObservable();\n }\n\n setAsActiveChannel(channel: Channel) {\n const prevActiveChannel = this.activeChannelSubject.getValue();\n this.stopWatchForActiveChannelEvents(prevActiveChannel);\n this.watchForActiveChannelEvents(channel);\n this.activeChannelSubject.next(channel);\n channel.state.messages.forEach((m) => {\n m.readBy = getReadBy(m, channel);\n });\n if (this.canSendReadEvents) {\n void channel.markRead();\n }\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n }\n\n async loadMoreMessages() {\n const activeChnannel = this.activeChannelSubject.getValue();\n const lastMessageId = this.activeChannelMessagesSubject.getValue()[0]?.id;\n await activeChnannel?.query({\n messages: { limit: 25, id_lt: lastMessageId },\n members: { limit: 0 },\n watchers: { limit: 0 },\n });\n if (\n activeChnannel?.data?.id ===\n this.activeChannelSubject.getValue()?.data?.id\n ) {\n this.activeChannelMessagesSubject.next([\n ...activeChnannel!.state.messages,\n ]);\n }\n }\n\n async init(\n filters: ChannelFilters,\n sort?: ChannelSort,\n options?: ChannelOptions\n ) {\n this.filters = filters;\n this.options = options || {\n offset: 0,\n limit: 25,\n state: true,\n presence: true,\n watch: true,\n message_limit: 25,\n };\n this.sort = sort || { last_message_at: -1, updated_at: -1 };\n await this.queryChannels();\n this.chatClientService.notification$.subscribe(\n (notification) => void this.handleNotification(notification)\n );\n }\n\n async loadMoreChannels() {\n this.options!.offset = this.channels.length!;\n await this.queryChannels();\n }\n\n async addReaction(messageId: string, reactionType: MessageReactionType) {\n await this.activeChannelSubject.getValue()?.sendReaction(messageId, {\n type: reactionType,\n });\n }\n\n async removeReaction(messageId: string, reactionType: MessageReactionType) {\n await this.activeChannelSubject\n .getValue()\n ?.deleteReaction(messageId, reactionType);\n }\n\n async sendMessage(\n text: string,\n attachments: Attachment[] = [],\n mentionedUsers: UserResponse[] = []\n ) {\n const preview = createMessagePreview(\n this.chatClientService.chatClient.user!,\n text,\n attachments,\n mentionedUsers\n );\n const channel = this.activeChannelSubject.getValue()!;\n preview.readBy = [];\n channel.state.addMessageSorted(preview, true);\n await this.sendMessageRequest(preview);\n }\n\n async resendMessage(message: StreamMessage) {\n const channel = this.activeChannelSubject.getValue()!;\n channel.state.addMessageSorted(\n {\n ...(message as any as MessageResponse),\n errorStatusCode: undefined,\n status: 'sending',\n },\n true\n );\n await this.sendMessageRequest(message);\n }\n\n async updateMessage(message: StreamMessage) {\n await this.chatClientService.chatClient.updateMessage(\n message as UpdatedMessage\n );\n }\n\n async deleteMessage(message: StreamMessage) {\n await this.chatClientService.chatClient.deleteMessage(message.id);\n }\n\n async uploadAttachments(\n uploads: AttachmentUpload[]\n ): Promise<AttachmentUpload[]> {\n const result: AttachmentUpload[] = [];\n const channel = this.activeChannelSubject.getValue()!;\n const uploadResults = await Promise.allSettled(\n uploads.map((upload) =>\n upload.type === 'image'\n ? channel.sendImage(upload.file)\n : channel.sendFile(upload.file)\n )\n );\n uploadResults.forEach((uploadResult, i) => {\n const file = uploads[i].file;\n const type = uploads[i].type;\n if (uploadResult.status === 'fulfilled') {\n result.push({\n file,\n type,\n state: 'success',\n url: uploadResult.value.file,\n });\n } else {\n result.push({ file, type, state: 'error' });\n }\n });\n\n return result;\n }\n\n async deleteAttachment(attachmentUpload: AttachmentUpload) {\n const channel = this.activeChannelSubject.getValue()!;\n await (attachmentUpload.type === 'image'\n ? channel.deleteImage(attachmentUpload.url!)\n : channel.deleteFile(attachmentUpload.url!));\n }\n\n async autocompleteMembers(searchTerm: string) {\n const activeChannel = this.activeChannelSubject.getValue();\n if (!activeChannel) {\n return [];\n }\n if (Object.keys(activeChannel.state.members).length <= 100) {\n return Object.values(activeChannel.state.members).filter(\n (m) => m.user?.id !== this.chatClientService.chatClient.userID!\n );\n } else {\n if (!searchTerm) {\n return [];\n }\n const result = await activeChannel.queryMembers({\n name: { $autocomplete: searchTerm },\n id: { $ne: this.chatClientService.chatClient.userID! },\n });\n return Object.values(result.members);\n }\n }\n\n async sendAction(messageId: string, formData: Record<string, string>) {\n const channel = this.activeChannelSubject.getValue()!;\n const response = await channel.sendAction(messageId, formData);\n if (response?.message) {\n channel.state.addMessageSorted({\n ...response.message,\n status: 'received',\n });\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n } else {\n channel.state.removeMessage({ id: messageId });\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n }\n }\n\n private async sendMessageRequest(preview: MessageResponse | StreamMessage) {\n const channel = this.activeChannelSubject.getValue()!;\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n try {\n const response = await channel.sendMessage({\n text: preview.text,\n attachments: preview.attachments,\n mentioned_users: preview.mentioned_users?.map((u) => u.id),\n id: preview.id,\n });\n if (response?.message) {\n channel.state.addMessageSorted(\n {\n ...response.message,\n status: 'received',\n },\n true\n );\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n }\n } catch (error) {\n const stringError = JSON.stringify(error);\n const parsedError: { status?: number } = stringError\n ? (JSON.parse(stringError) as { status?: number })\n : {};\n\n channel.state.addMessageSorted(\n {\n ...(preview as MessageResponse),\n errorStatusCode: parsedError.status || undefined,\n status: 'failed',\n },\n true\n );\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n }\n }\n\n private async handleNotification(notification: Notification) {\n switch (notification.eventType) {\n case 'notification.message_new': {\n await this.ngZone.run(async () => {\n if (this.customNewMessageNotificationHandler) {\n this.customNewMessageNotificationHandler(\n notification,\n this.channelListSetter\n );\n } else {\n await this.handleNewMessageNotification(notification);\n }\n });\n break;\n }\n case 'notification.added_to_channel': {\n await this.ngZone.run(async () => {\n if (this.customAddedToChannelNotificationHandler) {\n this.customAddedToChannelNotificationHandler(\n notification,\n this.channelListSetter\n );\n } else {\n await this.handleAddedToChannelNotification(notification);\n }\n });\n break;\n }\n case 'notification.removed_from_channel': {\n this.ngZone.run(() => {\n if (this.customRemovedFromChannelNotificationHandler) {\n this.customRemovedFromChannelNotificationHandler(\n notification,\n this.channelListSetter\n );\n } else {\n this.handleRemovedFromChannelNotification(notification);\n }\n });\n }\n }\n }\n\n private handleRemovedFromChannelNotification(notification: Notification) {\n const channelIdToBeRemoved = notification.event.channel!.cid;\n this.removeFromChannelList(channelIdToBeRemoved);\n }\n\n private async handleNewMessageNotification(notification: Notification) {\n await this.addChannelFromNotification(notification);\n }\n\n private async handleAddedToChannelNotification(notification: Notification) {\n await this.addChannelFromNotification(notification);\n }\n\n private async addChannelFromNotification(notification: Notification) {\n const channel = this.chatClientService.chatClient.channel(\n notification.event.channel?.type!,\n notification.event.channel?.id\n );\n await channel.watch();\n this.watchForChannelEvents(channel);\n this.channelsSubject.next([\n channel,\n ...(this.channelsSubject.getValue() || []),\n ]);\n }\n\n private removeFromChannelList(cid: string) {\n const channels = this.channels.filter((c) => c.cid !== cid);\n if (channels.length < this.channels.length) {\n this.channelsSubject.next(channels);\n if (this.activeChannelSubject.getValue()!.cid === cid) {\n this.setAsActiveChannel(channels[0]);\n }\n }\n }\n\n private watchForActiveChannelEvents(channel: Channel) {\n this.activeChannelSubscriptions.push(\n channel.on('message.new', () => {\n this.ngZone.run(() => {\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n this.activeChannel$.pipe(first()).subscribe((c) => {\n if (this.canSendReadEvents) {\n void c?.markRead();\n }\n });\n });\n })\n );\n this.activeChannelSubscriptions.push(\n channel.on('message.updated', (event) => this.messageUpdated(event))\n );\n this.activeChannelSubscriptions.push(\n channel.on('message.deleted', (event) => this.messageUpdated(event))\n );\n this.activeChannelSubscriptions.push(\n channel.on('reaction.new', (e) => this.messageReactionEventReceived(e))\n );\n this.activeChannelSubscriptions.push(\n channel.on('reaction.deleted', (e) =>\n this.messageReactionEventReceived(e)\n )\n );\n this.activeChannelSubscriptions.push(\n channel.on('reaction.updated', (e) =>\n this.messageReactionEventReceived(e)\n )\n );\n this.activeChannelSubscriptions.push(\n channel.on('message.read', (e) => {\n this.ngZone.run(() => {\n let latestMessage!: StreamMessage;\n this.activeChannelMessages$.pipe(first()).subscribe((messages) => {\n latestMessage = messages[messages.length - 1];\n });\n if (!latestMessage || !e.user) {\n return;\n }\n latestMessage.readBy = getReadBy(latestMessage, channel);\n\n this.activeChannelMessagesSubject.next(\n this.activeChannelMessagesSubject.getValue()\n );\n });\n })\n );\n }\n\n private messageUpdated(event: Event) {\n this.ngZone.run(() => {\n const messages = this.activeChannelMessagesSubject.getValue();\n const messageIndex = messages.findIndex(\n (m) => m.id === event.message?.id\n );\n if (messageIndex !== -1 && event.message) {\n messages[messageIndex] = event.message;\n this.activeChannelMessagesSubject.next([...messages]);\n }\n });\n }\n\n private messageReactionEventReceived(e: Event) {\n this.ngZone.run(() => {\n let messages!: StreamMessage[];\n this.activeChannelMessages$\n .pipe(first())\n .subscribe((m) => (messages = m));\n const message = messages.find((m) => m.id === e?.message?.id);\n if (!message) {\n return;\n }\n message.reaction_counts = { ...e.message?.reaction_counts };\n message.reaction_scores = { ...e.message?.reaction_scores };\n message.latest_reactions = [...(e.message?.latest_reactions || [])];\n message.own_reactions = [...(e.message?.own_reactions || [])];\n this.activeChannelMessagesSubject.next([...messages]);\n });\n }\n\n private formatMessage(message: MessageResponse) {\n return {\n ...message,\n // parse the date..\n pinned_at: message.pinned_at ? new Date(message.pinned_at) : null,\n created_at: message.created_at\n ? new Date(message.created_at)\n : new Date(),\n updated_at: message.updated_at\n ? new Date(message.updated_at)\n : new Date(),\n status: message.status || 'received',\n };\n }\n\n private isStreamMessage(\n message: StreamMessage | FormatMessageResponse | MessageResponse\n ): message is StreamMessage {\n return !!message.readBy;\n }\n\n private isFormatMessageResponse(\n message: StreamMessage | FormatMessageResponse | MessageResponse\n ): message is FormatMessageResponse {\n return message.created_at instanceof Date;\n }\n\n private stopWatchForActiveChannelEvents(channel: Channel | undefined) {\n if (!channel) {\n return;\n }\n this.activeChannelSubscriptions.forEach((s) => s.unsubscribe());\n this.activeChannelSubscriptions = [];\n }\n\n private async queryChannels() {\n try {\n const channels = await this.chatClientService.chatClient.queryChannels(\n this.filters!,\n this.sort,\n this.options\n );\n channels.forEach((c) => this.watchForChannelEvents(c));\n const prevChannels = this.channelsSubject.getValue() || [];\n this.channelsSubject.next([...prevChannels, ...channels]);\n if (channels.length > 0 && !this.activeChannelSubject.getValue()) {\n this.setAsActiveChannel(channels[0]);\n }\n this.hasMoreChannelsSubject.next(channels.length >= this.options!.limit!);\n } catch (error) {\n this.channelsSubject.error(error);\n }\n }\n\n private watchForChannelEvents(channel: Channel) {\n channel.on((event: Event) => {\n switch (event.type) {\n case 'message.new': {\n this.ngZone.run(() => {\n if (this.customNewMessageHandler) {\n this.customNewMessageHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter\n );\n } else {\n this.handleNewMessage(event, channel);\n }\n });\n break;\n }\n case 'channel.hidden': {\n this.ngZone.run(() => {\n if (this.customChannelHiddenHandler) {\n this.customChannelHiddenHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter\n );\n } else {\n this.handleChannelHidden(event);\n }\n });\n break;\n }\n case 'channel.deleted': {\n this.ngZone.run(() => {\n if (this.customChannelDeletedHandler) {\n this.customChannelDeletedHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter\n );\n } else {\n this.handleChannelDeleted(event);\n }\n });\n break;\n }\n case 'channel.visible': {\n this.ngZone.run(() => {\n if (this.customChannelVisibleHandler) {\n this.customChannelVisibleHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter\n );\n } else {\n this.handleChannelVisible(event, channel);\n }\n });\n break;\n }\n case 'channel.updated': {\n this.ngZone.run(() => {\n if (this.customChannelUpdatedHandler) {\n this.customChannelUpdatedHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter\n );\n } else {\n this.handleChannelUpdate(event);\n }\n });\n break;\n }\n case 'channel.truncated': {\n this.ngZone.run(() => {\n if (this.customChannelTruncatedHandler) {\n this.customChannelTruncatedHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter\n );\n } else {\n this.handleChannelTruncate(event);\n }\n });\n break;\n }\n }\n });\n }\n\n private handleNewMessage(_: Event, channel: Channel) {\n const channelIndex = this.channels.findIndex((c) => c.cid === channel.cid);\n this.channels.splice(channelIndex, 1);\n this.channelsSubject.next([channel, ...this.channels]);\n }\n\n private handleChannelHidden(event: Event) {\n this.removeFromChannelList(event.channel!.cid);\n }\n\n private handleChannelDeleted(event: Event) {\n this.removeFromChannelList(event.channel!.cid);\n }\n\n private handleChannelVisible(event: Event, channel: Channel) {\n if (!this.channels.find((c) => c.cid === event.cid)) {\n this.ngZone.run(() =>\n this.channelsSubject.next([...this.channels, channel])\n );\n }\n }\n\n private handleChannelUpdate(event: Event) {\n const channelIndex = this.channels.findIndex(\n (c) => c.cid === event.channel!.cid\n );\n if (channelIndex !== -1) {\n this.channels[channelIndex].data = event.channel;\n this.channelsSubject.next([...this.channels]);\n if (event.channel?.cid === this.activeChannelSubject.getValue()?.cid) {\n const channel = this.activeChannelSubject.getValue()!;\n channel.data = event.channel;\n this.activeChannelSubject.next(channel);\n }\n }\n }\n\n private handleChannelTruncate(event: Event) {\n const channelIndex = this.channels.findIndex(\n (c) => c.cid === event.channel!.cid\n );\n if (channelIndex !== -1) {\n this.channels[channelIndex].state.messages = [];\n this.channelsSubject.next([...this.channels]);\n if (event.channel?.cid === this.activeChannelSubject.getValue()?.cid) {\n const channel = this.activeChannelSubject.getValue()!;\n channel.state.messages = [];\n this.activeChannelSubject.next(channel);\n this.activeChannelMessagesSubject.next([]);\n }\n }\n }\n\n private get channels() {\n return this.channelsSubject.getValue() || [];\n }\n\n private get canSendReadEvents() {\n const channel = this.activeChannelSubject.getValue();\n if (!channel) {\n return false;\n }\n const capabilites = channel.data?.own_capabilities as string[];\n return capabilites.indexOf('read-events') !== -1;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nexport type Theme = 'light' | 'dark';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ThemeService {\n theme$ = new BehaviorSubject<Theme>('light');\n private _customLightThemeVariables: { [key: string]: string } | undefined;\n private _customDarkThemeVariables: { [key: string]: string } | undefined;\n private defaultDarkModeVariables = {\n '--bg-gradient-end': '#101214',\n '--bg-gradient-start': '#070a0d',\n '--black': '#ffffff',\n '--blue-alice': '#00193d',\n '--border': '#141924',\n '--button-background': '#ffffff',\n '--button-text': '#005fff',\n '--grey': '#7a7a7a',\n '--grey-gainsboro': '#2d2f2f',\n '--grey-whisper': '#1c1e22',\n '--modal-shadow': '#000000',\n '--overlay': '#00000066', // 66 = 40% opacity\n '--overlay-dark': '#ffffffcc', // CC = 80% opacity\n '--shadow-icon': '#00000080', // 80 = 50% opacity\n '--targetedMessageBackground': '#302d22',\n '--transparent': 'transparent',\n '--white': '#101418',\n '--white-smoke': '#13151b',\n '--white-snow': '#070a0d',\n };\n\n constructor() {\n this.theme$.subscribe((theme) => {\n const darkVariables = this.customDarkThemeVariables\n ? { ...this.defaultDarkModeVariables, ...this.customDarkThemeVariables }\n : this.defaultDarkModeVariables;\n const lightVariables = this.customLightThemeVariables\n ? this.customLightThemeVariables\n : {};\n if (theme === 'dark') {\n this.deleteVariables(lightVariables);\n this.setVariables(darkVariables);\n } else {\n this.deleteVariables(darkVariables);\n this.setVariables(lightVariables);\n }\n });\n }\n\n get customLightThemeVariables() {\n return this._customLightThemeVariables;\n }\n\n set customLightThemeVariables(\n variables: { [key: string]: string } | undefined\n ) {\n const prevVariables = this.customLightThemeVariables;\n this.deleteVariables(prevVariables);\n this._customLightThemeVariables = variables;\n }\n\n get customDarkThemeVariables() {\n return this._customDarkThemeVariables;\n }\n\n set customDarkThemeVariables(\n variables: { [key: string]: string } | undefined\n ) {\n const prevVariables = this.customDarkThemeVariables;\n this.deleteVariables(prevVariables);\n this._customDarkThemeVariables = variables;\n }\n\n private deleteVariables(variables: { [key: string]: string } | undefined) {\n if (!variables) {\n return;\n }\n Object.keys(variables).forEach((key) =>\n document.documentElement.style.setProperty(key, null)\n );\n }\n\n private setVariables(variables: { [key: string]: string } | undefined) {\n if (!variables) {\n return;\n }\n Object.keys(variables).forEach((key) =>\n document.documentElement.style.setProperty(key, variables[key])\n );\n }\n}\n","export const isImageFile = (file: File) => {\n // photoshop files begin with 'image/'\n return file.type.startsWith('image/') && !file.type.endsWith('.photoshop');\n};\n","import { Attachment } from 'stream-chat';\n\nexport const isImageAttachment = (attachment: Attachment) => {\n return (\n attachment.type === 'image' &&\n !attachment.title_link &&\n !attachment.og_scrape_url\n );\n};\n","import { Injectable } from '@angular/core';\nimport { isImageFile } from './is-image-file';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { Attachment } from 'stream-chat';\nimport { ChannelService } from './channel.service';\nimport { isImageAttachment } from './is-image-attachment';\nimport { NotificationService } from './notification.service';\nimport { AttachmentUpload } from './types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AttachmentService {\n attachmentUploadInProgressCounter$: Observable<number>;\n attachmentUploads$: Observable<AttachmentUpload[]>;\n private attachmentUploadInProgressCounterSubject =\n new BehaviorSubject<number>(0);\n private attachmentUploadsSubject = new BehaviorSubject<AttachmentUpload[]>(\n []\n );\n\n constructor(\n private channelService: ChannelService,\n private notificationService: NotificationService\n ) {\n this.attachmentUploadInProgressCounter$ =\n this.attachmentUploadInProgressCounterSubject.asObservable();\n this.attachmentUploads$ = this.attachmentUploadsSubject.asObservable();\n }\n\n resetAttachmentUploads() {\n this.attachmentUploadsSubject.next([]);\n }\n\n async filesSelected(fileList: FileList | null) {\n if (!fileList) {\n return;\n }\n const imageFiles: File[] = [];\n const dataFiles: File[] = [];\n\n Array.from(fileList).forEach((file) => {\n if (isImageFile(file)) {\n imageFiles.push(file);\n } else {\n dataFiles.push(file);\n }\n });\n imageFiles.forEach((f) => this.createPreview(f));\n const newUploads = [\n ...imageFiles.map((file) => ({\n file,\n state: 'uploading' as 'uploading',\n type: 'image' as 'image',\n })),\n ...dataFiles.map((file) => ({\n file,\n state: 'uploading' as 'uploading',\n type: 'file' as 'file',\n })),\n ];\n this.attachmentUploadsSubject.next([\n ...this.attachmentUploadsSubject.getValue(),\n ...newUploads,\n ]);\n await this.uploadAttachments(newUploads);\n }\n\n async retryAttachmentUpload(file: File) {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n const upload = attachmentUploads.find((u) => u.file === file);\n if (!upload) {\n return;\n }\n upload.state = 'uploading';\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n await this.uploadAttachments([upload]);\n }\n\n async deleteAttachment(upload: AttachmentUpload) {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n if (upload.state === 'success') {\n try {\n await this.channelService.deleteAttachment(upload);\n attachmentUploads.splice(attachmentUploads.indexOf(upload), 1);\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error deleting attachment'\n );\n }\n } else {\n attachmentUploads.splice(attachmentUploads.indexOf(upload), 1);\n }\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n }\n\n mapToAttachments() {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n return attachmentUploads\n .filter((r) => r.state === 'success')\n .map((r) => {\n const attachment: Attachment = {\n type: r.type,\n };\n if (r.type === 'image') {\n attachment.fallback = r.file?.name;\n attachment.image_url = r.url;\n } else {\n attachment.asset_url = r.url;\n attachment.title = r.file?.name;\n attachment.file_size = r.file?.size;\n }\n\n return attachment;\n });\n }\n\n createFromAttachments(attachments: Attachment[]) {\n const attachmentUploads: AttachmentUpload[] = [];\n attachments.forEach((attachment) => {\n if (isImageAttachment(attachment)) {\n attachmentUploads.push({\n url: (attachment.img_url ||\n attachment.thumb_url ||\n attachment.image_url) as string,\n state: 'success',\n type: 'image',\n file: {\n name: attachment.fallback,\n } as File,\n });\n } else if (attachment.type === 'file') {\n attachmentUploads.push({\n url: attachment.asset_url,\n state: 'success',\n file: {\n name: attachment.title,\n size: attachment.file_size,\n } as File,\n type: 'file',\n });\n }\n });\n\n if (attachmentUploads.length > 0) {\n this.attachmentUploadsSubject.next([\n ...this.attachmentUploadsSubject.getValue(),\n ...attachmentUploads,\n ]);\n }\n }\n\n private createPreview(file: File) {\n const reader = new FileReader();\n reader.onload = (event) => {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n const upload = attachmentUploads.find((upload) => upload.file === file);\n if (!upload) {\n return;\n }\n upload.previewUri = event.target?.result || undefined;\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n };\n reader.readAsDataURL(file as Blob);\n }\n\n private async uploadAttachments(uploads: AttachmentUpload[]) {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n this.attachmentUploadInProgressCounterSubject.next(\n this.attachmentUploadInProgressCounterSubject.getValue() + 1\n );\n const result = await this.channelService.uploadAttachments(uploads);\n result.forEach((r) => {\n const upload = attachmentUploads.find((upload) => upload.file === r.file);\n if (!upload) {\n if (r.url) {\n void this.channelService.deleteAttachment(r);\n }\n return;\n }\n upload.state = r.state;\n upload.url = r.url;\n if (upload.state === 'error') {\n this.notificationService.addTemporaryNotification(\n upload.type === 'image'\n ? 'streamChat.Error uploading image'\n : 'streamChat.Error uploading file'\n );\n }\n });\n this.attachmentUploadInProgressCounterSubject.next(\n this.attachmentUploadInProgressCounterSubject.getValue() - 1\n );\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n }\n}\n","export const en = {\n streamChat: {\n '1 reply': '1 reply',\n 'Attach files': 'Attach files',\n Cancel: 'Cancel',\n 'Channel Missing': 'Channel Missing',\n Close: 'Close',\n 'Close emoji picker': 'Close emoji picker',\n 'Commands matching': 'Commands matching',\n 'Connection failure, reconnecting now...':\n 'Connection failure, reconnecting now...',\n Delete: 'Delete',\n Delivered: 'Delivered',\n 'Edit Message': 'Edit Message',\n 'Edit message request failed': 'Edit message request failed',\n 'Emoji matching': 'Emoji matching',\n 'Empty message...': 'Empty message...',\n 'Error adding flag': 'Error adding flag',\n 'Error connecting to chat, refresh the page to try again.':\n 'Error connecting to chat, refresh the page to try again.',\n 'Error deleting message': 'Error deleting message',\n 'Error muting a user ...': 'Error muting a user ...',\n 'Error pinning message': 'Error pinning message',\n 'Error removing message pin': 'Error removing message pin',\n 'Error unmuting a user ...': 'Error unmuting a user ...',\n 'Error uploading file': 'Error uploading file',\n 'Error uploading image': 'Error uploading image',\n 'Error deleting attachment': 'Error deleting attachment',\n 'Error · Unsent': 'Error · Unsent',\n 'Error: {{ errorMessage }}': 'Error: {{ errorMessage }}',\n Flag: 'Flag',\n 'Message Failed': 'Message Failed',\n 'Message Failed · Unauthorized': 'Message Failed · Unauthorized',\n 'Message deleted': 'Message deleted',\n 'Message has been successfully flagged':\n 'Message has been successfully flagged',\n 'Message pinned': 'Message pinned',\n Mute: 'Mute',\n New: 'New',\n 'New Messages!': 'New Messages!',\n 'No results found': 'No results found',\n 'Nothing yet...': 'Nothing yet...',\n 'Only visible to you': 'Only visible to you',\n 'Open emoji picker': 'Open emoji picker',\n 'People matching': 'People matching',\n 'Pick your emoji': 'Pick your emoji',\n Pin: 'Pin',\n 'Pinned by': 'Pinned by',\n Reply: 'Reply',\n 'Reply to Message': 'Reply to Message',\n Search: 'Search',\n 'Searching...': 'Searching...',\n Send: 'Send',\n 'Send message request failed': 'Send message request failed',\n 'Sending...': 'Sending...',\n 'Slow Mode ON': 'Slow Mode ON',\n 'Start of a new thread': 'Start of a new thread',\n 'This message was deleted...': 'This message was deleted...',\n Thread: 'Thread',\n 'Type your message': 'Type your message',\n Unmute: 'Unmute',\n Unpin: 'Unpin',\n 'Wait until all attachments have uploaded':\n 'Wait until all attachments have uploaded',\n 'You have no channels currently': 'You have no channels currently',\n \"You've reached the maximum number of files\":\n \"You've reached the maximum number of files\",\n live: 'live',\n 'this content could not be displayed':\n 'this content could not be displayed',\n '{{ commaSeparatedUsers }} and {{ moreCount }} more':\n '{{ commaSeparatedUsers }} and {{ moreCount }} more',\n '{{ commaSeparatedUsers }}, and {{ lastUser }}':\n '{{ commaSeparatedUsers }}, and {{ lastUser }}',\n '{{ firstUser }} and {{ secondUser }}':\n '{{ firstUser }} and {{ secondUser }}',\n '{{ imageCount }} more': '{{ imageCount }} more',\n '{{ memberCount }} members': '{{ memberCount }} members',\n '{{ replyCount }} replies': '{{ replyCount }} replies',\n '{{ user }} has been muted': '{{ user }} has been muted',\n '{{ user }} has been unmuted': '{{ user }} has been unmuted',\n '{{ watcherCount }} online': '{{ watcherCount }} online',\n '🏙 Attachment...': '🏙 Attachment...',\n 'Connection error': 'Connection error',\n 'Load more': 'Load more',\n failed: 'failed',\n retry: 'retry',\n test: 'success',\n 'Sending links is not allowed in this conversation':\n 'Sending links is not allowed in this conversation',\n \"You can't send messages in this channel\":\n \"You can't send messages in this channel\",\n 'Unsupported file type: {{type}}': 'Unsupported file type: {{type}}',\n },\n};\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { en } from '../assets/i18n/en';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class StreamI18nService {\n constructor(private translteService: TranslateService) {}\n\n setTranslation(lang = 'en', overrides?: { [key: string]: string }) {\n if (!this.translteService.defaultLang) {\n this.translteService.defaultLang = lang;\n }\n this.translteService.setTranslation(\n lang,\n { streamChat: { ...en.streamChat, ...overrides } },\n true\n );\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'stream-avatar',\n templateUrl: './avatar.component.html',\n styleUrls: ['./avatar.component.scss'],\n})\nexport class AvatarComponent {\n @Input() name: string | undefined;\n @Input() imageUrl: string | undefined;\n @Input() size = 32;\n isLoaded = false;\n isError = false;\n\n constructor() {}\n\n get initials() {\n return (this.name?.toString() || '').charAt(0);\n }\n}\n","<div\n class=\"str-chat__avatar str-chat__avatar--circle\"\n title=\"{{ name }}\"\n [style]=\"{\n flexBasis: size + 'px',\n fontSize: size / 2 + 'px',\n height: size + 'px',\n lineHeight: size + 'px',\n width: size + 'px'\n }\"\n>\n <img\n *ngIf=\"imageUrl && !isError; else fallback\"\n class=\"str-chat__avatar-image str-chat__avatar-image{{\n isLoaded ? ' str-chat__avatar-image--loaded' : ''\n }}\"\n src=\"{{ imageUrl }}\"\n alt=\"{{ initials }}\"\n data-testid=\"avatar-img\"\n (load)=\"isLoaded = true\"\n (error)=\"isError = true\"\n [style]=\"{\n flexBasis: size + 'px',\n height: size + 'px',\n objectFit: 'cover',\n width: size + 'px'\n }\"\n />\n <ng-template #fallback>\n <div data-testid=\"fallback-img\" class=\"str-chat__avatar-fallback\">\n {{ initials }}\n </div>\n </ng-template>\n</div>\n","import { Component, Input } from '@angular/core';\n\nexport type Icon =\n | 'action-icon'\n | 'delivered-icon'\n | 'reaction-icon'\n | 'connection-error'\n | 'send'\n | 'file-upload'\n | 'retry'\n | 'close'\n | 'file';\n\n@Component({\n selector: 'stream-icon',\n templateUrl: './icon.component.html',\n styles: [],\n})\nexport class IconComponent {\n @Input() icon: Icon | undefined;\n @Input() size: number | undefined;\n constructor() {}\n}\n","<svg\n data-testid=\"action-icon\"\n *ngIf=\"icon === 'action-icon'\"\n height=\"4\"\n viewBox=\"0 0 11 4\"\n width=\"11\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M1.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'delivered-icon'\"\n height=\"16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"delivered-icon\"\n>\n <path\n d=\"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0zm3.72 6.633a.955.955 0 1 0-1.352-1.352L6.986 8.663 5.633 7.31A.956.956 0 1 0 4.28 8.663l2.029 2.028a.956.956 0 0 0 1.353 0l4.058-4.058z\"\n fill=\"#006CFF\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'reaction-icon'\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n width=\"12\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"reaction-icon\"\n>\n <g clipRule=\"evenodd\" fillRule=\"evenodd\">\n <path\n d=\"M6 1.2C3.3 1.2 1.2 3.3 1.2 6c0 2.7 2.1 4.8 4.8 4.8 2.7 0 4.8-2.1 4.8-4.8 0-2.7-2.1-4.8-4.8-4.8zM0 6c0-3.3 2.7-6 6-6s6 2.7 6 6-2.7 6-6 6-6-2.7-6-6z\"\n ></path>\n <path\n d=\"M5.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM8.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM3.3 6.7c.3-.2.6-.1.8.1.3.4.8.9 1.5 1 .6.2 1.4.1 2.4-1 .2-.2.6-.3.8 0 .2.2.3.6 0 .8-1.1 1.3-2.4 1.7-3.5 1.5-1-.2-1.8-.9-2.2-1.5-.2-.3-.1-.7.2-.9z\"\n ></path>\n </g>\n</svg>\n<svg\n data-testid=\"connection-error\"\n *ngIf=\"icon === 'connection-error'\"\n width=\"78px\"\n height=\"78px\"\n viewBox=\"0 0 78 78\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n>\n <!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->\n <title>Combined Shape</title>\n <desc>Created with Sketch.</desc>\n <g\n id=\"Interactions\"\n stroke=\"none\"\n stroke-width=\"1\"\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n id=\"Connection-Error-_-Connectivity\"\n transform=\"translate(-270.000000, -30.000000)\"\n fill=\"#CF1F25\"\n >\n <g\n id=\"109-network-connection\"\n transform=\"translate(270.000000, 30.000000)\"\n >\n <path\n d=\"M66.4609744,11.414231 C81.6225232,26.5757798 81.6225232,51.157545 66.4609744,66.3188467 C51.2994256,81.4803954 26.7176604,81.4803954 11.5563587,66.3188467 C-3.60519004,51.1572979 -3.60519004,26.5755327 11.5563587,11.414231 C26.7179075,-3.74731776 51.2996727,-3.74731776 66.4609744,11.414231 Z M54.7853215,45.8823776 L54.7853215,40.5882574 C54.7853215,39.613638 53.9952341,38.8235506 53.0206147,38.8235506 L44.9576695,38.8235506 L41.428256,42.3529641 L51.255555,42.3529641 L51.255555,45.8823776 L54.7853215,45.8823776 Z M40.6659027,43.1153174 L37.8988425,45.8823776 L40.6659027,45.8823776 L40.6659027,43.1153174 Z M51.1764962,56.4702653 L58.2353232,56.4702653 C59.2099355,56.4702653 60.00003,55.6801708 60.00003,54.7055585 L60.00003,51.176145 C60.00003,50.2015327 59.2099355,49.4114382 58.2353232,49.4114382 L51.1764962,49.4114382 C50.2018839,49.4114382 49.4117894,50.2015327 49.4117894,51.176145 L49.4117894,54.7055585 C49.4117894,55.6801708 50.2018839,56.4702653 51.1764962,56.4702653 Z M35.2941353,56.4702653 L42.3529624,56.4702653 C43.3275746,56.4702653 44.1176691,55.6801708 44.1176691,54.7055585 L44.1176691,51.176145 C44.1176691,50.2015327 43.3275746,49.4114382 42.3529624,49.4114382 L35.2941353,49.4114382 C34.319523,49.4114382 33.5294285,50.2015327 33.5294285,51.176145 L33.5294285,54.7055585 C33.5294285,55.6801708 34.319523,56.4702653 35.2941353,56.4702653 Z M56.6964989,19.0874231 C56.007381,18.3985134 54.8903216,18.3985134 54.2012036,19.087423 L45.882376,27.4062507 L45.882376,19.4117761 C45.882376,18.4371568 45.0922885,17.6470693 44.1176692,17.6470693 L33.5294286,17.6470693 C32.5548092,17.6470694 31.7647218,18.4371568 31.7647218,19.4117761 L31.7647218,30.0000167 C31.7647219,30.9746363 32.5548092,31.7647237 33.5294285,31.7647237 L41.5239031,31.7647237 L34.4650761,38.8235508 L24.7058947,38.8235508 C23.7312753,38.8235508 22.9411879,39.6136382 22.9411879,40.5882575 L22.9411879,45.8823778 L26.4706014,45.8823778 L26.4706014,42.3529643 L30.9356624,42.3529643 L23.8768354,49.4117914 L19.4117743,49.4117914 C18.4371549,49.4117914 17.6470675,50.2018788 17.6470675,51.1764981 L17.6470675,54.7059117 C17.6504049,54.9674302 17.7129076,55.2248042 17.8298886,55.4587302 L16.4456526,56.8429662 C15.7446193,57.5200453 15.7252005,58.6372282 16.4022825,59.3382615 C17.0793616,60.0392948 18.1965445,60.0587136 18.8975778,59.3816316 C18.9122847,59.3674273 18.9267436,59.3529684 18.940948,59.3382615 L56.6964963,21.5830662 C57.3856425,20.8939094 57.3856425,19.7765747 56.6964963,19.0874179 Z\"\n id=\"Combined-Shape\"\n ></path>\n </g>\n </g>\n </g>\n</svg>\n<svg\n *ngIf=\"icon === 'send'\"\n data-testid=\"send\"\n height=\"17\"\n viewBox=\"0 0 18 17\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <title translate>streamChat.Send</title>\n <path\n d=\"M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z\"\n fill=\"#006cff\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'file-upload'\"\n data-testid=\"file-upload\"\n height=\"14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <title translate>streamChat.Attach files</title>\n <path\n d=\"M1.667.333h10.666c.737 0 1.334.597 1.334 1.334v10.666c0 .737-.597 1.334-1.334 1.334H1.667a1.333 1.333 0 0 1-1.334-1.334V1.667C.333.93.93.333 1.667.333zm2 1.334a1.667 1.667 0 1 0 0 3.333 1.667 1.667 0 0 0 0-3.333zm-2 9.333v1.333h10.666v-4l-2-2-4 4-2-2L1.667 11z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n data-testid=\"retry\"\n *ngIf=\"icon === 'retry'\"\n width=\"22\"\n height=\"20\"\n viewBox=\"0 0 22 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M20 5.535V2a1 1 0 0 1 2 0v6a1 1 0 0 1-1 1h-6a1 1 0 0 1 0-2h3.638l-2.975-2.653a8 8 0 1 0 1.884 8.32 1 1 0 1 1 1.886.666A10 10 0 1 1 5.175 1.245c3.901-2.15 8.754-1.462 11.88 1.667L20 5.535z\"\n fill=\"#FFF\"\n fill-rule=\"nonzero\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'close'\"\n data-testid=\"close\"\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 28 28\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n>\n <defs>\n <path\n d=\"M465 5c5.53 0 10 4.47 10 10s-4.47 10-10 10-10-4.47-10-10 4.47-10 10-10zm3.59 5L465 13.59 461.41 10 460 11.41l3.59 3.59-3.59 3.59 1.41 1.41 3.59-3.59 3.59 3.59 1.41-1.41-3.59-3.59 3.59-3.59-1.41-1.41z\"\n id=\"b\"\n />\n <filter\n x=\"-30%\"\n y=\"-30%\"\n width=\"160%\"\n height=\"160%\"\n filterUnits=\"objectBoundingBox\"\n id=\"a\"\n >\n <feOffset in=\"SourceAlpha\" result=\"shadowOffsetOuter1\" />\n <feGaussianBlur\n stdDeviation=\"2\"\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n />\n <feColorMatrix\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0\"\n in=\"shadowBlurOuter1\"\n />\n </filter>\n </defs>\n <g transform=\"translate(-451 -1)\" fill-rule=\"nonzero\" fill=\"none\">\n <use fill=\"#000\" filter=\"url(#a)\" xlink:href=\"#b\" />\n <use fill=\"#FFF\" fill-rule=\"evenodd\" xlink:href=\"#b\" />\n </g>\n</svg>\n<svg\n *ngIf=\"icon === 'file'\"\n data-testid=\"file\"\n className=\"rfu-file-icon--small fa-file-fallback\"\n [attr.height]=\"size || 20\"\n [attr.width]=\"size || 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 384 512\"\n>\n <path\n d=\"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"\n fill=\"#414D54\"\n />\n</svg>\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'stream-loading-indicator',\n templateUrl: './loading-indicator.component.html',\n styles: [],\n})\nexport class LoadingIndicatorComponent {\n @Input() size = 15;\n @Input() color = '#006CFF';\n\n constructor() {}\n}\n","<div class=\"str-chat__loading-indicator\">\n <svg\n [attr.height]=\"size\"\n viewBox=\"0 0 30 30\"\n [attr.width]=\"size\"\n data-testid=\"loading-indicator\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <linearGradient id=\"a\" x1=\"50%\" x2=\"50%\" y1=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#FFF\" stop-opacity=\"0\" />\n <stop\n data-testid=\"stop-color\"\n offset=\"100%\"\n [attr.stop-color]=\"color\"\n stop-opacity=\"1\"\n [ngStyle]=\"{ stopColor: color }\"\n />\n </linearGradient>\n </defs>\n <path\n d=\"M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z\"\n fill=\"url(#a)\"\n fillRule=\"evenodd\"\n />\n </svg>\n</div>\n","import { InjectionToken, Type } from '@angular/core';\nimport { TextareaInterface } from './message-input/textarea.interface';\n\nexport const textareaInjectionToken = new InjectionToken<\n Type<TextareaInterface>\n>('textareaInjectionToken');\n","import {\n ComponentRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { Directive } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { UserResponse } from 'stream-chat';\nimport {\n CommandAutocompleteListItemContext,\n MentionAutcompleteListItemContext,\n} from '../types';\nimport { TextareaInterface } from './textarea.interface';\n\n@Directive({\n selector: '[streamTextarea]',\n})\nexport class TextareaDirective implements OnChanges {\n @Input() componentRef: ComponentRef<TextareaInterface> | undefined;\n @Input() areMentionsEnabled: boolean | undefined;\n @Input() mentionAutocompleteItemTemplate:\n | TemplateRef<MentionAutcompleteListItemContext>\n | undefined;\n @Input() mentionScope?: 'channel' | 'application';\n @Input() commandAutocompleteItemTemplate:\n | TemplateRef<CommandAutocompleteListItemContext>\n | undefined;\n @Input() value = '';\n @Output() readonly valueChange = new EventEmitter<string>();\n @Output() readonly send = new EventEmitter<void>();\n @Output() readonly userMentions = new EventEmitter<UserResponse[]>();\n private subscriptions: Subscription[] = [];\n private unpropagatedChanges: SimpleChanges[] = [];\n constructor(public viewContainerRef: ViewContainerRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n this.unpropagatedChanges.push(changes);\n if (!this.componentRef) {\n return;\n }\n if (changes.componentRef) {\n this.subscriptions.forEach((s) => s.unsubscribe());\n if (this.componentRef) {\n this.subscriptions.push(\n this.componentRef.instance.valueChange.subscribe((value) =>\n this.valueChange.next(value)\n )\n );\n this.subscriptions.push(\n this.componentRef.instance.send.subscribe((value) =>\n this.send.next(value)\n )\n );\n if (this.componentRef.instance.userMentions) {\n this.subscriptions.push(\n this.componentRef.instance.userMentions.subscribe((value) =>\n this.userMentions.next(value)\n )\n );\n }\n this.componentRef.instance.areMentionsEnabled = this.areMentionsEnabled;\n this.componentRef.instance.mentionAutocompleteItemTemplate =\n this.mentionAutocompleteItemTemplate;\n this.componentRef.instance.commandAutocompleteItemTemplate =\n this.commandAutocompleteItemTemplate;\n this.componentRef.instance.mentionScope = this.mentionScope;\n this.componentRef.instance.value = this.value;\n }\n }\n if (changes.areMentionsEnabled) {\n this.componentRef.instance.areMentionsEnabled = this.areMentionsEnabled;\n }\n if (changes.mentionAutocompleteItemTemplate) {\n this.componentRef.instance.mentionAutocompleteItemTemplate =\n this.mentionAutocompleteItemTemplate;\n }\n if (changes.commandAutocompleteItemTemplate) {\n this.componentRef.instance.commandAutocompleteItemTemplate =\n this.commandAutocompleteItemTemplate;\n }\n if (changes.mentionScope) {\n this.componentRef.instance.mentionScope = this.mentionScope;\n }\n if (changes.value) {\n this.componentRef.instance.value = this.value;\n }\n // ngOnChanges not called for dynamic components since we don't use template binding\n let changesToPropagate = {};\n this.unpropagatedChanges.forEach(\n (c) => (changesToPropagate = { ...changesToPropagate, ...c })\n );\n // eslint-disable-next-line @angular-eslint/no-lifecycle-call\n this.componentRef.instance.ngOnChanges(changesToPropagate);\n this.unpropagatedChanges = [];\n }\n}\n","import { Injectable, TemplateRef } from '@angular/core';\nimport {\n CommandAutocompleteListItemContext,\n MentionAutcompleteListItemContext,\n} from '../types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MessageInputConfigService {\n isFileUploadEnabled: boolean | undefined = true;\n areMentionsEnabled: boolean | undefined = true;\n mentionAutocompleteItemTemplate:\n | TemplateRef<MentionAutcompleteListItemContext>\n | undefined;\n commandAutocompleteItemTemplate:\n | TemplateRef<CommandAutocompleteListItemContext>\n | undefined;\n /**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/services/message-input-config/#overview\n */\n acceptedFileTypes: string[] | undefined;\n isMultipleFileUploadEnabled: boolean | undefined = true;\n mentionScope: 'channel' | 'application' | undefined = 'channel';\n\n constructor() {}\n}\n","import { Component } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AttachmentService } from '../attachment.service';\nimport { AttachmentUpload } from '../types';\n\n@Component({\n selector: 'stream-attachment-preview-list',\n templateUrl: './attachment-preview-list.component.html',\n styles: [],\n})\nexport class AttachmentPreviewListComponent {\n attachmentUploads$: Observable<AttachmentUpload[]>;\n\n constructor(private attachmentService: AttachmentService) {\n this.attachmentUploads$ = this.attachmentService.attachmentUploads$;\n }\n\n async retryAttachmentUpload(file: File) {\n await this.attachmentService.retryAttachmentUpload(file);\n }\n\n async deleteAttachment(upload: AttachmentUpload) {\n await this.attachmentService.deleteAttachment(upload);\n }\n\n trackByFile(_: number, item: AttachmentUpload) {\n return item.file;\n }\n}\n","<div class=\"rfu-image-previewer\" *ngIf=\"(attachmentUploads$ | async)?.length\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"rfu-image-previewer__image\"\n [class.rfu-image-previewer__image--loaded]=\"\n attachmentUpload.state === 'success'\n \"\n data-testclass=\"attachment-image-preview\"\n >\n <div\n *ngIf=\"attachmentUpload.state === 'error'\"\n class=\"rfu-image-previewer__retry\"\n (click)=\"retryAttachmentUpload(attachmentUpload.file)\"\n (keyup.enter)=\"retryAttachmentUpload(attachmentUpload.file)\"\n data-testclass=\"upload-error\"\n >\n <stream-icon icon=\"retry\"></stream-icon>\n </div>\n <div class=\"rfu-thumbnail__wrapper\" style=\"width: 100; height: 100\">\n <div class=\"rfu-thumbnail__overlay\">\n <div\n class=\"rfu-icon-button\"\n data-testclass=\"delete-attachment\"\n role=\"button\"\n (click)=\"deleteAttachment(attachmentUpload)\"\n (keyup.enter)=\"deleteAttachment(attachmentUpload)\"\n >\n <stream-icon icon=\"close\"></stream-icon>\n </div>\n </div>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"attachmentUpload.file.name\"\n class=\"rfu-thumbnail__image\"\n data-testclass=\"attachment-image\"\n />\n </div>\n <stream-loading-indicator\n data-testclass=\"loading-indicator\"\n color=\"rgba(255,255,255,0.7)\"\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n ></stream-loading-indicator>\n </div>\n <div\n class=\"rfu-file-previewer\"\n *ngIf=\"attachmentUpload.type === 'file'\"\n data-testclass=\"attachment-file-preview\"\n >\n <ol>\n <li\n class=\"rfu-file-previewer__file\"\n [class.rfu-file-previewer__file--uploading]=\"\n attachmentUpload.state === 'uploading'\n \"\n [class.rfu-file-previewer__file--failed]=\"\n attachmentUpload.state === 'error'\n \"\n >\n <stream-icon icon=\"file\"></stream-icon>\n\n <a\n data-testclass=\"file-download-link\"\n href=\"{{ attachmentUpload.url }}\"\n (click)=\"attachmentUpload.url ? null : $event.preventDefault()\"\n (keyup.enter)=\"\n attachmentUpload.url ? null : $event.preventDefault()\n \"\n download\n >\n {{ attachmentUpload.file.name }}\n <ng-container *ngIf=\"attachmentUpload.state === 'error'\">\n <div\n data-testclass=\"file-upload-retry\"\n class=\"rfu-file-previewer__failed\"\n (click)=\"retryAttachmentUpload(attachmentUpload.file)\"\n (keyup.enter)=\"retryAttachmentUpload(attachmentUpload.file)\"\n translate\n >\n streamChat.failed\n </div>\n <div\n class=\"rfu-file-previewer__retry\"\n (click)=\"retryAttachmentUpload(attachmentUpload.file)\"\n (keyup.enter)=\"retryAttachmentUpload(attachmentUpload.file)\"\n translate\n >\n streamChat.retry\n </div>\n </ng-container>\n </a>\n\n <span\n data-testclass=\"file-delete\"\n class=\"rfu-file-previewer__close-button\"\n (click)=\"deleteAttachment(attachmentUpload)\"\n (keyup.enter)=\"deleteAttachment(attachmentUpload)\"\n >\n ✘\n </span>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"rfu-file-previewer__loading-indicator\"\n >\n <stream-loading-indicator></stream-loading-indicator>\n </div>\n </li>\n </ol>\n </div>\n </ng-container>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ComponentRef,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n TemplateRef,\n Type,\n ViewChild,\n} from '@angular/core';\nimport { ChatClientService } from '../chat-client.service';\nimport { Observable, Subscription } from 'rxjs';\nimport { first } from 'rxjs/operators';\nimport { AppSettings, UserResponse } from 'stream-chat';\nimport { AttachmentService } from '../attachment.service';\nimport { ChannelService } from '../channel.service';\nimport { textareaInjectionToken } from '../injection-tokens';\nimport { NotificationService } from '../notification.service';\nimport {\n AttachmentUpload,\n CommandAutocompleteListItemContext,\n MentionAutcompleteListItemContext,\n StreamMessage,\n} from '../types';\nimport { MessageInputConfigService } from './message-input-config.service';\nimport { TextareaDirective } from './textarea.directive';\nimport { TextareaInterface } from './textarea.interface';\nimport { isImageFile } from '../is-image-file';\n\n@Component({\n selector: 'stream-message-input',\n templateUrl: './message-input.component.html',\n styles: [],\n providers: [AttachmentService],\n})\nexport class MessageInputComponent\n implements OnChanges, OnDestroy, AfterViewInit\n{\n @Input() isFileUploadEnabled: boolean | undefined;\n @Input() areMentionsEnabled: boolean | undefined;\n @Input() mentionScope: 'channel' | 'application' | undefined;\n @Input() mentionAutocompleteItemTemplate:\n | TemplateRef<MentionAutcompleteListItemContext>\n | undefined;\n @Input() commandAutocompleteItemTemplate:\n | TemplateRef<CommandAutocompleteListItemContext>\n | undefined;\n /**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/components/message-input/#caution-acceptedfiletypes\n */\n @Input() acceptedFileTypes: string[] | undefined;\n @Input() isMultipleFileUploadEnabled: boolean | undefined;\n @Input() message: StreamMessage | undefined;\n @Output() readonly messageUpdate = new EventEmitter<void>();\n isFileUploadAuthorized: boolean | undefined;\n canSendLinks: boolean | undefined;\n canSendMessages: boolean | undefined;\n attachmentUploads$: Observable<AttachmentUpload[]>;\n textareaValue = '';\n textareaRef: ComponentRef<TextareaInterface> | undefined;\n mentionedUsers: UserResponse[] = [];\n @ViewChild('fileInput') private fileInput!: ElementRef<HTMLInputElement>;\n @ViewChild(TextareaDirective, { static: false })\n private textareaAnchor!: TextareaDirective;\n private subscriptions: Subscription[] = [];\n private hideNotification: Function | undefined;\n private isViewInited = false;\n private appSettings: AppSettings | undefined;\n\n constructor(\n private channelService: ChannelService,\n private notificationService: NotificationService,\n private attachmentService: AttachmentService,\n private configService: MessageInputConfigService,\n @Inject(textareaInjectionToken)\n private textareaType: Type<TextareaInterface>,\n private componentFactoryResolver: ComponentFactoryResolver,\n private cdRef: ChangeDetectorRef,\n private chatClient: ChatClientService\n ) {\n this.subscriptions.push(\n this.attachmentService.attachmentUploadInProgressCounter$.subscribe(\n (counter) => {\n if (counter === 0 && this.hideNotification) {\n this.hideNotification();\n this.hideNotification = undefined;\n }\n }\n )\n );\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe((channel) => {\n this.textareaValue = '';\n this.attachmentService.resetAttachmentUploads();\n const capabilities = channel?.data?.own_capabilities as string[];\n if (capabilities) {\n this.isFileUploadAuthorized =\n capabilities.indexOf('upload-file') !== -1;\n this.canSendLinks = capabilities.indexOf('send-links') !== -1;\n this.canSendMessages = capabilities.indexOf('send-message') !== -1;\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n this.initTextarea();\n }\n }\n })\n );\n this.subscriptions.push(\n this.chatClient.appSettings$.subscribe(\n (appSettings) => (this.appSettings = appSettings)\n )\n );\n this.attachmentUploads$ = this.attachmentService.attachmentUploads$;\n this.isFileUploadEnabled = this.configService.isFileUploadEnabled;\n this.acceptedFileTypes = this.configService.acceptedFileTypes;\n this.isMultipleFileUploadEnabled =\n this.configService.isMultipleFileUploadEnabled;\n this.areMentionsEnabled = this.configService.areMentionsEnabled;\n this.mentionAutocompleteItemTemplate =\n this.configService.mentionAutocompleteItemTemplate;\n this.mentionScope = this.configService.mentionScope;\n this.commandAutocompleteItemTemplate =\n this.configService.commandAutocompleteItemTemplate;\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n this.initTextarea();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.message) {\n this.attachmentService.resetAttachmentUploads();\n if (this.isUpdate) {\n this.attachmentService.createFromAttachments(\n this.message!.attachments || []\n );\n this.textareaValue = this.message!.text || '';\n }\n }\n if (changes.isFileUploadEnabled) {\n this.configService.isFileUploadEnabled = this.isFileUploadEnabled;\n }\n if (changes.acceptedFileTypes) {\n this.configService.acceptedFileTypes = this.acceptedFileTypes;\n }\n if (changes.isMultipleFileUploadEnabled) {\n this.configService.isMultipleFileUploadEnabled =\n this.isMultipleFileUploadEnabled;\n }\n if (changes.areMentionsEnabled) {\n this.configService.areMentionsEnabled = this.areMentionsEnabled;\n }\n if (changes.mentionAutocompleteItemTemplate) {\n this.configService.mentionAutocompleteItemTemplate =\n this.mentionAutocompleteItemTemplate;\n }\n if (changes.commandAutocompleteItemTemplate) {\n this.configService.commandAutocompleteItemTemplate =\n this.commandAutocompleteItemTemplate;\n }\n if (changes.mentionScope) {\n this.configService.mentionScope = this.mentionScope;\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n async messageSent() {\n let attachmentUploadInProgressCounter!: number;\n this.attachmentService.attachmentUploadInProgressCounter$\n .pipe(first())\n .subscribe((counter) => (attachmentUploadInProgressCounter = counter));\n if (attachmentUploadInProgressCounter > 0) {\n if (!this.hideNotification) {\n this.hideNotification =\n this.notificationService.addPermanentNotification(\n 'streamChat.Wait until all attachments have uploaded'\n );\n }\n return;\n }\n const attachments = this.attachmentService.mapToAttachments();\n const text = this.textareaValue;\n if (!text && (!attachments || attachments.length === 0)) {\n return;\n }\n if (this.containsLinks && !this.canSendLinks) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Sending links is not allowed in this conversation'\n );\n return;\n }\n if (!this.isUpdate) {\n this.textareaValue = '';\n }\n try {\n await (this.isUpdate\n ? this.channelService.updateMessage({\n ...this.message!,\n text: text,\n attachments: attachments,\n })\n : this.channelService.sendMessage(\n text,\n attachments,\n this.mentionedUsers\n ));\n this.messageUpdate.emit();\n if (!this.isUpdate) {\n this.attachmentService.resetAttachmentUploads();\n }\n } catch (error) {\n if (this.isUpdate) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Edit message request failed'\n );\n }\n }\n }\n\n get containsLinks() {\n return /(?:(?:https?|ftp):\\/\\/)?[\\w/\\-?=%.]+\\.[\\w/\\-&?=%.]+/.test(\n this.textareaValue\n );\n }\n\n get accept() {\n return this.acceptedFileTypes ? this.acceptedFileTypes?.join(',') : '';\n }\n\n async filesSelected(fileList: FileList | null) {\n if (!(await this.areAttachemntsValid(fileList))) {\n return;\n }\n await this.attachmentService.filesSelected(fileList);\n this.clearFileInput();\n }\n\n private clearFileInput() {\n this.fileInput.nativeElement.value = '';\n }\n\n private get isUpdate() {\n return !!this.message;\n }\n\n private initTextarea() {\n if (!this.canSendMessages || this.textareaRef || !this.textareaAnchor) {\n return;\n }\n const componentFactory =\n this.componentFactoryResolver.resolveComponentFactory(this.textareaType);\n this.textareaRef =\n this.textareaAnchor.viewContainerRef.createComponent<any>(\n componentFactory\n );\n this.cdRef.detectChanges();\n }\n\n private async areAttachemntsValid(fileList: FileList | null) {\n if (!fileList || this.acceptedFileTypes) {\n return true;\n }\n if (!this.appSettings) {\n await this.chatClient.getAppSettings();\n }\n let isValid = true;\n Array.from(fileList).forEach((f) => {\n let hasBlockedExtension: boolean;\n let hasBlockedMimeType: boolean;\n let hasNotAllowedExtension: boolean;\n let hasNotAllowedMimeType: boolean;\n if (isImageFile(f)) {\n hasBlockedExtension =\n !!this.appSettings?.image_upload_config?.blocked_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasBlockedMimeType =\n !!this.appSettings?.image_upload_config?.blocked_mime_types?.find(\n (type) => f.type === type\n );\n hasNotAllowedExtension =\n !!this.appSettings?.image_upload_config?.allowed_file_extensions\n ?.length &&\n !this.appSettings?.image_upload_config?.allowed_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasNotAllowedMimeType =\n !!this.appSettings?.image_upload_config?.allowed_mime_types?.length &&\n !this.appSettings?.image_upload_config?.allowed_mime_types?.find(\n (type) => f.type === type\n );\n } else {\n hasBlockedExtension =\n !!this.appSettings?.file_upload_config?.blocked_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasBlockedMimeType =\n !!this.appSettings?.file_upload_config?.blocked_mime_types?.find(\n (type) => f.type === type\n );\n hasNotAllowedExtension =\n !!this.appSettings?.file_upload_config?.allowed_file_extensions\n ?.length &&\n !this.appSettings?.file_upload_config?.allowed_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasNotAllowedMimeType =\n !!this.appSettings?.file_upload_config?.allowed_mime_types?.length &&\n !this.appSettings?.file_upload_config?.allowed_mime_types?.find(\n (type) => f.type === type\n );\n }\n if (\n hasBlockedExtension ||\n hasBlockedMimeType ||\n hasNotAllowedExtension ||\n hasNotAllowedMimeType\n ) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Unsupported file type: {{type}}',\n undefined,\n undefined,\n { type: f.type }\n );\n isValid = false;\n }\n });\n return isValid;\n }\n}\n","<div\n class=\"str-chat__input-flat\"\n [class.str-chat__input-flat-has-attachments]=\"\n (attachmentUploads$ | async)!.length > 0\n \"\n>\n <div class=\"str-chat__input-flat-wrapper\">\n <div class=\"str-chat__input-flat--textarea-wrapper\">\n <stream-attachment-preview-list\n class=\"rfu-image-previewer-angular-host\"\n ></stream-attachment-preview-list>\n <div class=\"rta str-chat__textarea\">\n <ng-template\n *ngIf=\"canSendMessages; else notAllowed\"\n streamTextarea\n [(value)]=\"textareaValue\"\n (send)=\"messageSent()\"\n [componentRef]=\"textareaRef\"\n (userMentions)=\"mentionedUsers = $event\"\n [areMentionsEnabled]=\"areMentionsEnabled\"\n [mentionAutocompleteItemTemplate]=\"mentionAutocompleteItemTemplate\"\n [commandAutocompleteItemTemplate]=\"commandAutocompleteItemTemplate\"\n [mentionScope]=\"mentionScope\"\n ></ng-template>\n <ng-template #notAllowed>\n <textarea\n disabled\n rows=\"1\"\n [value]=\"\n 'streamChat.You can\\'t send messages in this channel' | translate\n \"\n class=\"rta__textarea str-chat__textarea__textarea\"\n ></textarea>\n </ng-template>\n </div>\n <div\n *ngIf=\"isFileUploadEnabled && isFileUploadAuthorized && canSendMessages\"\n class=\"str-chat__fileupload-wrapper\"\n data-testid=\"file-upload-button\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Attach files\" | translate }}\n </div>\n <div class=\"rfu-file-upload-button\">\n <label>\n <input\n #fileInput\n type=\"file\"\n class=\"rfu-file-input\"\n data-testid=\"file-input\"\n [accept]=\"accept\"\n [multiple]=\"isMultipleFileUploadEnabled\"\n (change)=\"filesSelected(fileInput.files)\"\n />\n <span class=\"str-chat__input-flat-fileupload\">\n <stream-icon icon=\"file-upload\"></stream-icon>\n </span>\n </label>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"canSendMessages\"\n data-testid=\"send-button\"\n class=\"str-chat__send-button\"\n (click)=\"messageSent()\"\n (keyup.enter)=\"messageSent()\"\n >\n <stream-icon icon=\"send\"></stream-icon>\n </button>\n </div>\n</div>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\n\n@Component({\n selector: 'stream-modal',\n templateUrl: './modal.component.html',\n styles: [],\n})\nexport class ModalComponent implements OnChanges {\n @Input() isOpen = false;\n @Output() readonly isOpenChange = new EventEmitter<boolean>();\n @ViewChild('content') private content: ElementRef<HTMLElement> | undefined;\n\n constructor() {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isOpen) {\n if (this.isOpen) {\n window.addEventListener('keyup', this.watchForEscPress);\n setTimeout(\n () => window.addEventListener('click', this.watchForOutsideClicks),\n 0\n );\n } else {\n this.stopWatchForOutsideClicks();\n this.stopWatchForEscPress();\n }\n }\n }\n\n close() {\n this.isOpen = false;\n this.isOpenChange.emit(false);\n this.stopWatchForOutsideClicks();\n this.stopWatchForEscPress();\n }\n\n private watchForEscPress = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.close();\n }\n };\n\n private stopWatchForEscPress = () => {\n window.removeEventListener('keyup', this.watchForEscPress);\n };\n\n private watchForOutsideClicks = (event: Event) => {\n if (!this.content?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n };\n\n private stopWatchForOutsideClicks() {\n window.removeEventListener('click', this.watchForOutsideClicks);\n }\n}\n","<div\n data-testid=\"modal\"\n class=\"str-chat__modal str-chat__modal--{{ isOpen ? 'open' : 'close' }}\"\n>\n <div\n data-testid=\"close\"\n class=\"str-chat__modal__close-button\"\n (click)=\"close()\"\n (keyup.enter)=\"close()\"\n translate\n >\n streamChat.Close\n <stream-icon icon=\"close\"></stream-icon>\n </div>\n <div class=\"str-chat__modal__inner\" #content>\n <ng-content></ng-content>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { NotificationType } from '../notification.service';\n\n@Component({\n selector: 'stream-notification',\n templateUrl: './notification.component.html',\n styles: [],\n})\nexport class NotificationComponent {\n @Input() type: NotificationType | undefined;\n\n constructor() {}\n}\n","<div\n class=\"str-chat__custom-notification notification-{{ type }}\"\n data-testid=\"custom-notification\"\n>\n <ng-content></ng-content>\n</div>\n","import { Component } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n NotificationPayload,\n NotificationService,\n} from '../notification.service';\n\n@Component({\n selector: 'stream-notification-list',\n templateUrl: './notification-list.component.html',\n styles: [],\n})\nexport class NotificationListComponent {\n notifications$: Observable<NotificationPayload[]>;\n\n constructor(private notificationService: NotificationService) {\n this.notifications$ = this.notificationService.notifications$;\n }\n\n trackByItem(_: number, item: NotificationPayload) {\n return item;\n }\n}\n","<div class=\"str-chat__list-notifications\">\n <stream-notification\n *ngFor=\"let notification of notifications$ | async; trackBy: trackByItem\"\n [type]=\"notification.type\"\n ><div data-testclass=\"notification-content\">\n {{ notification.text | translate: notification.translateParams }}\n </div></stream-notification\n >\n</div>\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { ChannelService } from '../channel.service';\nimport { ChatClientService } from '../chat-client.service';\nimport { MessageInputComponent } from '../message-input/message-input.component';\nimport { NotificationService } from '../notification.service';\nimport { StreamMessage } from '../types';\n\nexport type MessageActions =\n | 'edit'\n | 'delete'\n | 'edit-any'\n | 'delete-any'\n | 'pin'\n | 'quote'\n | 'flag'\n | 'mute';\n\n@Component({\n selector: 'stream-message-actions-box',\n templateUrl: './message-actions-box.component.html',\n styles: [],\n})\nexport class MessageActionsBoxComponent implements OnChanges {\n @Input() messageInputTemplate: TemplateRef<any> | undefined;\n @Input() isOpen = false;\n @Input() isMine = false;\n @Input() message: StreamMessage | undefined;\n @Input() enabledActions: MessageActions[] = [];\n @Output() readonly displayedActionsCount = new EventEmitter<number>();\n @Output() readonly isEditing = new EventEmitter<boolean>();\n isEditModalOpen = false;\n @ViewChild(MessageInputComponent) private messageInput:\n | MessageInputComponent\n | undefined;\n\n constructor(\n private chatClientService: ChatClientService,\n private notificationService: NotificationService,\n private channelService: ChannelService\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isMine || changes.enabledActions) {\n let displayedActionsCount = 0;\n if (this.isQuoteVisible) {\n displayedActionsCount++;\n }\n if (this.isEditVisible) {\n displayedActionsCount++;\n }\n if (this.isDeleteVisible) {\n displayedActionsCount++;\n }\n if (this.isMuteVisible) {\n displayedActionsCount++;\n }\n if (this.isFlagVisible) {\n displayedActionsCount++;\n }\n if (this.isPinVisible) {\n displayedActionsCount++;\n }\n this.displayedActionsCount.next(displayedActionsCount);\n }\n }\n\n get isQuoteVisible() {\n return this.enabledActions.indexOf('quote') !== -1;\n }\n\n get isEditVisible() {\n return (\n (this.enabledActions.indexOf('edit') !== -1 && this.isMine) ||\n this.enabledActions.indexOf('edit-any') !== -1\n );\n }\n\n get isDeleteVisible() {\n return (\n (this.enabledActions.indexOf('delete') !== -1 && this.isMine) ||\n this.enabledActions.indexOf('delete-any') !== -1\n );\n }\n\n get isMuteVisible() {\n return this.enabledActions.indexOf('mute') !== -1;\n }\n\n get isFlagVisible() {\n return this.enabledActions.indexOf('flag') !== -1 && !this.isMine;\n }\n\n get isPinVisible() {\n return this.enabledActions.indexOf('pin') !== -1;\n }\n\n pinClicked() {\n alert('Feature not yet implemented');\n }\n\n async flagClicked() {\n try {\n await this.chatClientService.flagMessage(this.message!.id);\n this.notificationService.addTemporaryNotification(\n 'streamChat.Message has been successfully flagged',\n 'success'\n );\n } catch (err) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error adding flag'\n );\n }\n }\n\n muteClicked() {\n alert('Feature not yet implemented');\n }\n\n quoteClicked() {\n alert('Feature not yet implemented');\n }\n\n editClicked() {\n this.isEditing.emit(true);\n this.isEditModalOpen = true;\n }\n\n sendClicked() {\n this.messageInput?.messageSent();\n }\n\n modalClosed = () => {\n this.isEditModalOpen = false;\n this.isEditing.emit(false);\n };\n\n async deleteClicked() {\n try {\n await this.channelService.deleteMessage(this.message!);\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error deleting message'\n );\n }\n }\n}\n","<div\n data-testid=\"action-box\"\n class=\"str-chat__message-actions-box\"\n [class.str-chat__message-actions-box--open]=\"isOpen\"\n [class.str-chat__message-actions-box--mine]=\"isMine\"\n>\n <ul class=\"str-chat__message-actions-list\">\n <button\n data-testid=\"quote-action\"\n *ngIf=\"isQuoteVisible\"\n (click)=\"quoteClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Reply\" | translate }}\n </li>\n </button>\n <button\n data-testid=\"pin-action\"\n *ngIf=\"isPinVisible\"\n (click)=\"pinClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{\n (message?.pinned ? \"streamChat.Unpin\" : \"streamChat.Pin\") | translate\n }}\n </li>\n </button>\n <button\n data-testid=\"flag-action\"\n *ngIf=\"isFlagVisible\"\n (click)=\"flagClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Flag\" | translate }}\n </li>\n </button>\n <button\n data-testid=\"mute-action\"\n *ngIf=\"isMuteVisible\"\n (click)=\"muteClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Mute\" | translate }}\n </li>\n </button>\n <button\n data-testid=\"edit-action\"\n *ngIf=\"isEditVisible\"\n (click)=\"editClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Edit Message\" | translate }}\n </li>\n </button>\n <button\n data-testid=\"delete-action\"\n *ngIf=\"isDeleteVisible\"\n (click)=\"deleteClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Delete\" | translate }}\n </li>\n </button>\n </ul>\n</div>\n\n<stream-modal\n [isOpen]=\"isEditModalOpen\"\n (isOpenChange)=\"\n isEditModalOpen = $event; isEditModalOpen ? '' : modalClosed()\n \"\n>\n <div class=\"str-chat__edit-message-form\" *ngIf=\"isEditModalOpen\">\n <ng-container *ngIf=\"messageInputTemplate; else defaultInput\">\n <ng-container\n *ngTemplateOutlet=\"\n messageInputTemplate;\n context: {\n message: message,\n messageUpdateHandler: modalClosed\n }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <stream-message-input\n [message]=\"message\"\n (messageUpdate)=\"modalClosed()\"\n ></stream-message-input>\n </ng-template>\n <stream-notification-list></stream-notification-list>\n <div\n class=\"\n str-chat__message-team-form-footer\n str-chat__message-team-form-footer-angular\n \"\n >\n <div class=\"str-chat__edit-message-form-options\">\n <button translate data-testid=\"cancel-button\" (click)=\"modalClosed()\">\n streamChat.Cancel\n </button>\n <button\n type=\"submit\"\n translate\n data-testid=\"send-button\"\n (click)=\"sendClicked()\"\n (keyup.enter)=\"sendClicked()\"\n >\n streamChat.Send\n </button>\n </div>\n </div>\n </div>\n</stream-modal>\n","import { Component } from '@angular/core';\nimport { Observable, of, Subscription } from 'rxjs';\nimport { catchError, map, startWith } from 'rxjs/operators';\nimport { ChannelService } from '../channel.service';\n\n@Component({\n selector: 'stream-channel',\n templateUrl: './channel.component.html',\n styles: [],\n})\nexport class ChannelComponent {\n isError$: Observable<boolean>;\n isInitializing$: Observable<boolean>;\n subscriptions: Subscription[] = [];\n\n constructor(private channelService: ChannelService) {\n this.isError$ = this.channelService.channels$.pipe(\n map(() => false),\n catchError(() => of(true)),\n startWith(false)\n );\n this.isInitializing$ = this.channelService.channels$.pipe(\n map((channels) => !channels),\n catchError(() => of(false))\n );\n }\n}\n","<div\n *ngIf=\"(isError$ | async) === false && (isInitializing$ | async) === false\"\n class=\"str-chat str-chat-channel messaging\"\n>\n <div class=\"str-chat__container\">\n <div class=\"str-chat__main-panel\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n","export type DeviceWidth = {\n device: 'mobile' | 'tablet' | 'full';\n width: number;\n};\n\nexport const getDeviceWidth = (): DeviceWidth => {\n const width = window.innerWidth;\n if (width < 768) return { device: 'mobile', width };\n if (width < 1024) return { device: 'tablet', width };\n return { device: 'full', width };\n};\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { distinctUntilChanged, filter, first } from 'rxjs/operators';\nimport { getDeviceWidth } from '../device-width';\n\n@Injectable({ providedIn: 'root' })\nexport class ChannelListToggleService {\n isOpen$: Observable<boolean>;\n private isOpenSubject = new BehaviorSubject<boolean>(false);\n private menuElement: HTMLElement | undefined;\n\n constructor() {\n this.isOpen$ = this.isOpenSubject\n .asObservable()\n .pipe(distinctUntilChanged());\n this.isOpen$.pipe(filter((s) => s)).subscribe(() => {\n if (getDeviceWidth().device === 'mobile') {\n this.watchForOutsideClicks();\n }\n });\n }\n\n open() {\n this.isOpenSubject.next(true);\n }\n\n close() {\n this.isOpenSubject.next(false);\n }\n\n toggle() {\n this.isOpenSubject.getValue() ? this.close() : this.open();\n }\n\n setMenuElement(element: HTMLElement | undefined) {\n this.menuElement = element;\n }\n\n channelSelected() {\n if (getDeviceWidth().device === 'mobile') {\n this.close();\n }\n }\n\n private watchForOutsideClicks() {\n if (!this.menuElement) {\n return;\n }\n const eventHandler = (event: Event) => {\n if (!this.menuElement!.contains(event.target as Node)) {\n this.close();\n window.removeEventListener('click', eventHandler);\n }\n };\n window.addEventListener('click', eventHandler);\n this.isOpen$\n .pipe(\n filter((s) => !s),\n first()\n )\n .subscribe(() => window.removeEventListener('click', eventHandler));\n }\n}\n","import { Component } from '@angular/core';\nimport { Channel } from 'stream-chat';\nimport { ChannelListToggleService } from '../channel-list/channel-list-toggle.service';\nimport { ChannelService } from '../channel.service';\n\n@Component({\n selector: 'stream-channel-header',\n templateUrl: './channel-header.component.html',\n styles: [],\n})\nexport class ChannelHeaderComponent {\n activeChannel: Channel | undefined;\n canReceiveConnectEvents: boolean | undefined;\n\n constructor(\n private channelService: ChannelService,\n private channelListToggleService: ChannelListToggleService\n ) {\n this.channelService.activeChannel$.subscribe((c) => {\n this.activeChannel = c;\n const capabilities = this.activeChannel?.data\n ?.own_capabilities as string[];\n if (!capabilities) {\n return;\n }\n this.canReceiveConnectEvents =\n capabilities.indexOf('connect-events') !== -1;\n });\n }\n\n toggleMenu(event: Event) {\n event.stopPropagation();\n this.channelListToggleService.toggle();\n }\n\n get memberCountParam() {\n return { memberCount: this.activeChannel?.data?.member_count || 0 };\n }\n\n get watcherCountParam() {\n return { watcherCount: this.activeChannel?.state?.watcher_count || 0 };\n }\n}\n","<div class=\"str-chat__header-livestream\">\n <div\n class=\"str-chat__header-hamburger\"\n (click)=\"toggleMenu($event)\"\n (keyup.enter)=\"toggleMenu($event)\"\n >\n <span class=\"str-chat__header-hamburger--line\"></span>\n <span class=\"str-chat__header-hamburger--line\"></span>\n <span class=\"str-chat__header-hamburger--line\"></span>\n </div>\n <stream-avatar\n imageUrl=\"{{ activeChannel?.data?.image }}\"\n name=\"{{ activeChannel?.data?.name }}\"\n ></stream-avatar>\n <div class=\"str-chat__header-livestream-left\">\n <p data-testid=\"name\" class=\"str-chat__header-livestream-left--title\">\n {{ activeChannel?.data?.name }}\n </p>\n <p data-testid=\"info\" class=\"str-chat__header-livestream-left--members\">\n {{'streamChat.{{ memberCount }} members' | translate:memberCountParam}}\n {{canReceiveConnectEvents ? ('streamChat.{{ watcherCount }} online' |\n translate:watcherCountParam) : ''}}\n </p>\n </div>\n</div>\n","import { Component, Input, NgZone, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport {\n Channel,\n Event,\n FormatMessageResponse,\n MessageResponse,\n} from 'stream-chat';\nimport { ChannelService } from '../channel.service';\n\n@Component({\n selector: 'stream-channel-preview',\n templateUrl: './channel-preview.component.html',\n styles: [],\n})\nexport class ChannelPreviewComponent implements OnInit, OnDestroy {\n @Input() channel: Channel | undefined;\n isActive = false;\n isUnread = false;\n latestMessage: string = 'Nothing yet...';\n private subscriptions: (Subscription | { unsubscribe: () => void })[] = [];\n private canSendReadEvents = true;\n\n constructor(private channelService: ChannelService, private ngZone: NgZone) {}\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe(\n (activeChannel) =>\n (this.isActive = activeChannel?.id === this.channel?.id)\n )\n );\n const messages = this.channel?.state?.messages;\n if (messages && messages.length > 0) {\n this.setLatestMessage(messages[messages.length - 1]);\n }\n this.isUnread = !!this.channel!.countUnread() && this.canSendReadEvents;\n const capabilities =\n (this.channel?.data?.own_capabilities as string[]) || [];\n this.canSendReadEvents = capabilities.indexOf('read-events') !== -1;\n this.subscriptions.push(\n this.channel!.on('message.new', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('message.updated', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('message.deleted', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('channel.truncated', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('message.read', () =>\n this.ngZone.run(() => {\n this.isUnread =\n !!this.channel!.countUnread() && this.canSendReadEvents;\n })\n )\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n get avatarImage() {\n return this.channel?.data?.image;\n }\n\n get avatarName() {\n return this.channel?.data?.name;\n }\n\n get title() {\n return this.channel?.data?.name;\n }\n\n setAsActiveChannel(): void {\n void this.channelService.setAsActiveChannel(this.channel!);\n }\n\n private handleMessageEvent(event: Event) {\n this.ngZone.run(() => {\n if (this.channel?.state.messages.length === 0) {\n this.latestMessage = 'Nothing yet...';\n return;\n }\n if (\n !event.message ||\n this.channel?.state.messages[this.channel?.state.messages.length - 1]\n .id !== event.message.id\n ) {\n return;\n }\n this.setLatestMessage(event.message);\n this.isUnread = !!this.channel.countUnread() && this.canSendReadEvents;\n });\n }\n\n private setLatestMessage(message?: FormatMessageResponse | MessageResponse) {\n if (message?.deleted_at) {\n this.latestMessage = 'streamChat.Message deleted';\n } else if (message?.text) {\n this.latestMessage = message.text;\n } else if (message?.attachments && message.attachments.length) {\n this.latestMessage = 'streamChat.🏙 Attachment...';\n }\n }\n}\n","<button\n class=\"str-chat__channel-preview-messenger\"\n [class.str-chat__channel-preview-messenger--active]=\"isActive\"\n [class.str-chat__channel-preview-messenger--unread]=\"isUnread\"\n (click)=\"setAsActiveChannel()\"\n data-testid=\"channel-preview-container\"\n>\n <div class=\"str-chat__channel-preview-messenger--left\">\n <stream-avatar\n imageUrl=\"{{ avatarImage }}\"\n name=\"{{ avatarName }}\"\n [size]=\"40\"\n ></stream-avatar>\n </div>\n <div class=\"str-chat__channel-preview-messenger--right\">\n <div class=\"str-chat__channel-preview-messenger--name\">\n <span data-testid=\"channel-preview-title\">{{ title }}</span>\n </div>\n <div\n data-testid=\"latest-message\"\n class=\"str-chat__channel-preview-messenger--last-message\"\n >\n {{ latestMessage | translate }}\n </div>\n </div>\n</button>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, startWith } from 'rxjs/operators';\nimport { Channel } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { ChannelListToggleService } from './channel-list-toggle.service';\n\n@Component({\n selector: 'stream-channel-list',\n templateUrl: './channel-list.component.html',\n styles: [],\n})\nexport class ChannelListComponent implements AfterViewInit {\n @Input() customChannelPreviewTemplate: TemplateRef<any> | undefined;\n channels$: Observable<Channel[] | undefined>;\n isError$: Observable<boolean>;\n isInitializing$: Observable<boolean>;\n isLoadingMoreChannels = false;\n isOpen$: Observable<boolean>;\n hasMoreChannels$: Observable<boolean>;\n @ViewChild('container') private container!: ElementRef<HTMLElement>;\n\n constructor(\n private channelService: ChannelService,\n private channelListToggleService: ChannelListToggleService\n ) {\n this.isOpen$ = this.channelListToggleService.isOpen$;\n this.channels$ = this.channelService.channels$;\n this.hasMoreChannels$ = this.channelService.hasMoreChannels$;\n this.isError$ = this.channels$.pipe(\n map(() => false),\n catchError(() => of(true)),\n startWith(false)\n );\n this.isInitializing$ = this.channels$.pipe(\n map((channels) => !channels),\n catchError(() => of(false))\n );\n }\n ngAfterViewInit(): void {\n this.channelListToggleService.setMenuElement(this.container.nativeElement);\n }\n\n async loadMoreChannels() {\n this.isLoadingMoreChannels = true;\n await this.channelService.loadMoreChannels();\n this.isLoadingMoreChannels = false;\n }\n\n trackByChannelId(index: number, item: Channel) {\n return item.cid;\n }\n\n channelSelected() {\n this.channelListToggleService.channelSelected();\n }\n}\n","<div\n #container\n data-testid=\"channel-list-container\"\n class=\"str-chat str-chat-channel-list messaging\"\n [class.str-chat-channel-list--open]=\"(isOpen$ | async) === true\"\n>\n <div\n *ngIf=\"\n (isError$ | async) === false && (isInitializing$ | async) === false;\n else statusIndicator\n \"\n class=\"str-chat__channel-list-messenger\"\n >\n <div class=\"str-chat__channel-list-messenger__main\">\n <p\n data-testid=\"empty-channel-list-indicator\"\n *ngIf=\"!(channels$ | async)?.length\"\n >\n {{ \"streamChat.You have no channels currently\" | translate }}\n </p>\n <ng-container\n *ngFor=\"let channel of channels$ | async; trackBy: trackByChannelId\"\n >\n <ng-container\n *ngIf=\"customChannelPreviewTemplate; else defaultTemplate\"\n >\n <div (click)=\"channelSelected()\" (keyup.enter)=\"channelSelected()\">\n <ng-container\n *ngTemplateOutlet=\"\n customChannelPreviewTemplate;\n context: { channel: channel }\n \"\n ></ng-container>\n </div>\n </ng-container>\n <ng-template #defaultTemplate>\n <stream-channel-preview\n data-testclass=\"channel-preview\"\n [channel]=\"channel\"\n (click)=\"channelSelected()\"\n (keyup.enter)=\"channelSelected()\"\n ></stream-channel-preview>\n </ng-template>\n </ng-container>\n <div\n *ngIf=\"hasMoreChannels$ | async\"\n class=\"str-chat__load-more-button\"\n (click)=\"loadMoreChannels()\"\n (keyup.enter)=\"loadMoreChannels()\"\n data-testid=\"load-more\"\n >\n <button\n class=\"str-chat__load-more-button__button\"\n data-testid=\"load-more-button\"\n [disabled]=\"isLoadingMoreChannels\"\n >\n <span *ngIf=\"!isLoadingMoreChannels; else loadingIndicator\">{{\n \"Load more\" | translate\n }}</span>\n <ng-template #loadingIndicator\n ><stream-loading-indicator></stream-loading-indicator\n ></ng-template>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #statusIndicator>\n <ng-container *ngIf=\"isError$ | async\">\n <ng-container *ngTemplateOutlet=\"chatDown\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"isInitializing$ | async\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\"></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #chatDown>\n <div data-testid=\"chatdown-container\" class=\"str-chat__down\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\"></ng-container>\n <div class=\"str-chat__down-main\">\n <stream-icon icon=\"connection-error\"></stream-icon>\n <h1>{{ \"streamChat.Connection error\" | translate }}</h1>\n <h3>\n {{\n \"streamChat.Error connecting to chat, refresh the page to try again.\"\n | translate\n }}\n </h3>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loadingChannels>\n <div data-testid=\"loading-indicator\" class=\"str-chat__loading-channels\">\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #loadingChannel>\n <div class=\"str-chat__loading-channels-item\">\n <div class=\"str-chat__loading-channels-avatar\"></div>\n <div class=\"str-chat__loading-channels-meta\">\n <div class=\"str-chat__loading-channels-username\"></div>\n <div class=\"str-chat__loading-channels-status\"></div>\n </div>\n </div>\n</ng-template>\n","import Dayjs from 'dayjs';\nimport calendar from 'dayjs/plugin/calendar';\n\nDayjs.extend(calendar);\n\nexport const parseDate = (date: Date) => {\n const parsedTime = Dayjs(date);\n\n return parsedTime.calendar();\n};\n","import { UserResponse } from 'stream-chat';\n\nexport const getReadByText = (users: UserResponse[]) => {\n let outStr = '';\n\n const slicedArr = users.map((item) => item.name || item.id).slice(0, 5);\n const restLength = users.length - slicedArr.length;\n\n if (slicedArr.length === 1) {\n outStr = `${slicedArr[0]} `;\n } else if (slicedArr.length === 2) {\n // joins all with \"and\" but =no commas\n // example: \"bob and sam\"\n outStr = `${slicedArr[0]} and ${slicedArr[1]}`;\n } else if (slicedArr.length > 2) {\n // joins all with commas, but last one gets \", and\" (oxford comma!)\n // example: \"bob, joe, sam and 4 more\"\n if (restLength === 0) {\n // mutate slicedArr to remove last user to display it separately\n const lastUser = slicedArr.splice(slicedArr.length - 2, 1)[0];\n const commaSeparatedUsers = slicedArr.join(', ');\n outStr = `${commaSeparatedUsers}, and ${lastUser}`;\n } else {\n const commaSeparatedUsers = slicedArr.join(', ');\n outStr = `${commaSeparatedUsers} and ${restLength} more`;\n }\n }\n\n return outStr;\n};\n","import {\n AfterViewChecked,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { ReactionResponse } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { DefaultReactionType, DefaultUserType } from '../types';\n\nexport type MessageReactionType =\n | 'angry'\n | 'haha'\n | 'like'\n | 'love'\n | 'sad'\n | 'wow';\n\nconst emojiReactionsMapping: { [key in MessageReactionType]: string } = {\n like: '👍',\n angry: '😠',\n love: '❤️',\n haha: '😂',\n wow: '😮',\n sad: '😞',\n};\n@Component({\n selector: 'stream-message-reactions',\n templateUrl: './message-reactions.component.html',\n styles: ['.emoji {position: relative; display: inline-block; }'],\n})\nexport class MessageReactionsComponent implements AfterViewChecked, OnChanges {\n @Input() messageId: string | undefined;\n @Input() messageReactionCounts: { [key in MessageReactionType]?: number } =\n {};\n @Input() isSelectorOpen: boolean = false;\n @Output() readonly isSelectorOpenChange = new EventEmitter<boolean>();\n @Input() latestReactions: ReactionResponse<\n DefaultReactionType,\n DefaultUserType\n >[] = [];\n @Input() ownReactions: ReactionResponse<\n DefaultReactionType,\n DefaultUserType\n >[] = [];\n tooltipPositions: { arrow: number; tooltip: number } | undefined;\n tooltipText: string | undefined;\n @ViewChild('selectorContainer') private selectorContainer:\n | ElementRef<HTMLElement>\n | undefined;\n @ViewChild('selectorTooltip') private selectorTooltip:\n | ElementRef<HTMLElement>\n | undefined;\n currentTooltipTarget: HTMLElement | undefined;\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private channelService: ChannelService\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isSelectorOpen) {\n this.isSelectorOpen\n ? setTimeout(() => this.watchForOutsideClicks()) // setTimeout: wait for current click to bubble up, and only watch for clicks after that\n : this.stopWatchForOutsideClicks();\n }\n }\n\n ngAfterViewChecked(): void {\n if (this.tooltipText && !this.tooltipPositions) {\n this.setTooltipPosition();\n this.cdRef.detectChanges();\n }\n }\n\n get existingReactions(): MessageReactionType[] {\n return Object.keys(this.messageReactionCounts).filter(\n (k) => this.messageReactionCounts[k as MessageReactionType]! > 0\n ) as MessageReactionType[];\n }\n\n get reactionsCount() {\n return Object.values(this.messageReactionCounts).reduce(\n (total, count) => total + count,\n 0\n );\n }\n\n get reactionOptions(): MessageReactionType[] {\n return ['like', 'love', 'haha', 'wow', 'sad', 'angry'];\n }\n\n getLatestUserByReaction(reactionType: MessageReactionType) {\n return this.latestReactions.find((r) => r.type === reactionType && r.user)\n ?.user;\n }\n\n getEmojiByReaction(reactionType: MessageReactionType) {\n return emojiReactionsMapping[reactionType];\n }\n\n getUsersByReaction(reactionType: MessageReactionType) {\n return this.latestReactions\n .filter((r) => r.type === reactionType)\n .map((r) => r.user?.name || r.user?.id)\n .filter((i) => !!i)\n .join(', ');\n }\n\n showTooltip(event: Event, reactionType: MessageReactionType) {\n this.currentTooltipTarget = event.target as HTMLElement;\n this.tooltipText = this.getUsersByReaction(reactionType);\n }\n\n hideTooltip() {\n this.tooltipText = undefined;\n this.currentTooltipTarget = undefined;\n this.tooltipPositions = undefined;\n }\n\n trackByMessageReaction(index: number, item: MessageReactionType) {\n return item;\n }\n\n react(type: MessageReactionType) {\n this.ownReactions.find((r) => r.type === type)\n ? void this.channelService.removeReaction(this.messageId!, type)\n : void this.channelService.addReaction(this.messageId!, type);\n }\n\n private eventHandler = (event: Event) => {\n if (!this.selectorContainer?.nativeElement.contains(event.target as Node)) {\n this.isSelectorOpenChange.emit(false);\n }\n };\n\n private watchForOutsideClicks() {\n window.addEventListener('click', this.eventHandler);\n }\n\n private stopWatchForOutsideClicks() {\n window.removeEventListener('click', this.eventHandler);\n }\n\n private setTooltipPosition() {\n const tooltip = this.selectorTooltip?.nativeElement.getBoundingClientRect();\n const target = this.currentTooltipTarget?.getBoundingClientRect();\n\n const container =\n this.selectorContainer?.nativeElement.getBoundingClientRect();\n\n if (!tooltip || !target || !container) return;\n\n const tooltipPosition =\n tooltip.width === container.width || tooltip.x < container.x\n ? 0\n : target.left + target.width / 2 - container.left - tooltip.width / 2;\n\n const arrowPosition =\n target.x - tooltip.x + target.width / 2 - tooltipPosition;\n\n this.tooltipPositions = {\n tooltip: tooltipPosition,\n arrow: arrowPosition,\n };\n }\n}\n","<div\n *ngIf=\"existingReactions.length > 0 && !isSelectorOpen\"\n class=\"str-chat__reaction-list\"\n [class.str-chat__reaction-list--reverse]=\"true\"\n data-testid=\"reaction-list\"\n>\n <ul>\n <li\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n data-testclass=\"emoji\"\n >\n <span class=\"emoji\">\n {{ getEmojiByReaction(reactionType) }}\n </span>\n &nbsp;\n </li>\n <li>\n <span\n data-testid=\"reactions-count\"\n class=\"str-chat__reaction-list--counter\"\n >{{ reactionsCount }}</span\n >\n </li>\n </ul>\n</div>\n\n<div\n #selectorContainer\n class=\"str-chat__reaction-selector\"\n *ngIf=\"isSelectorOpen\"\n data-testid=\"reaction-selector\"\n>\n <div\n *ngIf=\"tooltipText\"\n data-testid=\"tooltip\"\n #selectorTooltip\n class=\"str-chat__reaction-selector-tooltip\"\n [ngStyle]=\"{\n left: tooltipPositions?.tooltip + 'px',\n visibility: tooltipPositions ? 'visible' : 'hidden'\n }\"\n >\n <div\n class=\"arrow\"\n [ngStyle]=\"{ left: tooltipPositions?.arrow + 'px' }\"\n ></div>\n <span class=\"latest-user-username\">\n {{ tooltipText }}\n </span>\n </div>\n <ul class=\"str-chat__message-reactions-list\">\n <li\n class=\"str-chat__message-reactions-list-item\"\n *ngFor=\"\n let reactionType of reactionOptions;\n trackBy: trackByMessageReaction\n \"\n data-testclass=\"emoji-option\"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <div\n *ngIf=\"getLatestUserByReaction(reactionType) as user\"\n class=\"latest-user\"\n (click)=\"hideTooltip()\"\n (keyup.enter)=\"hideTooltip()\"\n (mouseenter)=\"showTooltip($event, reactionType)\"\n (mouseleave)=\"hideTooltip()\"\n attr.data-testid=\"{{ reactionType }}-last-user\"\n >\n <stream-avatar\n attr.data-testid=\"{{ reactionType }}-avatar\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name || user.id\"\n [size]=\"20\"\n ></stream-avatar>\n </div>\n <span class=\"emoji\" style=\"width: 20px; height: 20px; top: 10px\">\n {{ getEmojiByReaction(reactionType) }}\n </span>\n <span\n *ngIf=\"\n messageReactionCounts[reactionType] &&\n messageReactionCounts[reactionType]! > 0\n \"\n class=\"str-chat__message-reactions-list-item__count\"\n attr.data-testid=\"{{ reactionType }}-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\n </li>\n </ul>\n</div>\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ImageLoadService {\n imageLoad$ = new Subject<void>();\n\n constructor() {}\n}\n","import { Component, Input, OnChanges } from '@angular/core';\nimport { Action, Attachment } from 'stream-chat';\nimport { ImageLoadService } from '../message-list/image-load.service';\nimport { DefaultAttachmentType } from '../types';\nimport prettybytes from 'pretty-bytes';\nimport { isImageAttachment } from '../is-image-attachment';\nimport { ChannelService } from '../channel.service';\n\n@Component({\n selector: 'stream-attachment-list',\n templateUrl: './attachment-list.component.html',\n styles: [],\n})\nexport class AttachmentListComponent implements OnChanges {\n @Input() messageId: string | undefined;\n @Input() attachments: Attachment<DefaultAttachmentType>[] = [];\n orderedAttachments: Attachment<DefaultAttachmentType>[] = [];\n\n constructor(\n private imageLoadService: ImageLoadService,\n private channelService: ChannelService\n ) {}\n\n ngOnChanges(): void {\n this.orderedAttachments = [\n ...this.attachments.filter((a) => this.isImage(a)),\n ...this.attachments.filter((a) => this.isFile(a)),\n ...this.attachments.filter((a) => this.isCard(a)),\n ];\n }\n\n trackById(index: number) {\n return index;\n }\n\n isImage(attachment: Attachment) {\n return isImageAttachment(attachment);\n }\n\n isFile(attachment: Attachment) {\n return attachment.type === 'file';\n }\n\n isCard(attachment: Attachment) {\n return (\n !attachment.type ||\n (attachment.type === 'image' && !this.isImage(attachment)) ||\n attachment.type === 'giphy'\n );\n }\n\n imageLoaded() {\n this.imageLoadService.imageLoad$.next();\n }\n\n hasFileSize(attachment: Attachment<DefaultAttachmentType>) {\n return (\n attachment.file_size && Number.isFinite(Number(attachment.file_size))\n );\n }\n\n getFileSize(attachment: Attachment<DefaultAttachmentType>) {\n return prettybytes(attachment.file_size!);\n }\n\n trimUrl(url?: string | null) {\n if (url !== undefined && url !== null) {\n const [trimmedUrl] = url\n .replace(/^(?:https?:\\/\\/)?(?:www\\.)?/i, '')\n .split('/');\n\n return trimmedUrl;\n }\n return null;\n }\n\n sendAction(action: Action) {\n void this.channelService.sendAction(this.messageId!, {\n [action.name!]: action.value!,\n });\n }\n\n trackByActionValue(_: number, item: Action) {\n return item.value;\n }\n}\n","<ng-container *ngFor=\"let attachment of orderedAttachments; trackBy: trackById\">\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }}\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n >\n <img\n *ngIf=\"isImage(attachment)\"\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"attachment.img_url || attachment.thumb_url || attachment.image_url\"\n [alt]=\"attachment?.fallback\"\n (load)=\"imageLoaded()\"\n />\n <div\n *ngIf=\"isFile(attachment)\"\n class=\"\n str-chat__message-attachment-file--item\n str-chat-angular__message-attachment-file-single\n \"\n >\n <stream-icon icon=\"file\" [size]=\"30\"></stream-icon>\n <div class=\"str-chat__message-attachment-file--item-text\">\n <a\n data-testclass=\"file-link\"\n download\n href=\"{{ attachment.asset_url }}\"\n target=\"_blank\"\n >\n {{ attachment.title }}\n </a>\n <span data-testclass=\"size\" *ngIf=\"hasFileSize(attachment)\">{{\n getFileSize(attachment)\n }}</span>\n </div>\n </div>\n <div\n *ngIf=\"isCard(attachment)\"\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachment.type\n }}\"\n >\n <div\n *ngIf=\"attachment.image_url || attachment.thumb_url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <img\n data-testclass=\"card-img\"\n alt=\"{{ attachment.image_url || attachment.thumb_url }}\"\n src=\"{{ attachment.image_url || attachment.thumb_url }}\"\n />\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachment.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachment.title }}\n </div>\n <div\n *ngIf=\"attachment.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachment.text }}\n </div>\n <a\n class=\"str-chat__message-attachment-card--url\"\n *ngIf=\"attachment.title_link || attachment.og_scrape_url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n href=\"{{ attachment.title_link || attachment.og_scrape_url }}\"\n target=\"_blank\"\n >\n {{ trimUrl(attachment.title_link || attachment.og_scrape_url) }}\n </a>\n </div>\n </div>\n </div>\n <div\n class=\"str-chat__message-attachment-actions\"\n *ngIf=\"attachment.actions && attachment.actions.length > 0\"\n >\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"let action of attachment.actions; trackBy: trackByActionValue\"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n data-testclass=\"attachment-action\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n","import {\n Component,\n ElementRef,\n Input,\n TemplateRef,\n OnChanges,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { UserResponse } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { ChatClientService } from '../chat-client.service';\nimport { getDeviceWidth } from '../device-width';\nimport { MessageActions } from '../message-actions-box/message-actions-box.component';\nimport { DefaultUserType, StreamMessage } from '../types';\nimport { parseDate } from './parse-date';\nimport { getReadByText } from './read-by-text';\n\n@Component({\n selector: 'stream-message',\n templateUrl: './message.component.html',\n styles: [],\n})\nexport class MessageComponent implements OnChanges {\n @Input() messageInputTemplate: TemplateRef<any> | undefined;\n @Input() mentionTemplate: TemplateRef<any> | undefined;\n @Input() message: StreamMessage | undefined;\n @Input() enabledMessageActions: MessageActions[] = [];\n @Input() areReactionsEnabled: boolean | undefined;\n @Input() canReactToMessage: boolean | undefined;\n @Input() isLastSentMessage: boolean | undefined;\n @Input() canReceiveReadEvents: boolean | undefined;\n isEditing: boolean | undefined;\n isActionBoxOpen = false;\n isReactionSelectorOpen = false;\n isPressedOnMobile = false;\n visibleMessageActionsCount = 0;\n messageTextParts: {\n content: string;\n type: 'text' | 'mention';\n user?: UserResponse;\n }[] = [];\n private user: UserResponse<DefaultUserType> | undefined;\n @ViewChild('container') private container:\n | ElementRef<HTMLElement>\n | undefined;\n\n constructor(\n private chatClientService: ChatClientService,\n private channelService: ChannelService\n ) {\n this.user = this.chatClientService.chatClient.user;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.message) {\n let content = this.message?.html || this.message?.text;\n if (!content) {\n this.messageTextParts = [];\n } else {\n // Backend will wrap HTML content with <p></p>\\n\n if (content.startsWith('<p>')) {\n content = content.replace('<p>', '');\n }\n if (content.endsWith('</p>\\n')) {\n content = content.replace('</p>\\n', '');\n }\n if (\n !this.message!.mentioned_users ||\n this.message!.mentioned_users.length === 0\n ) {\n this.messageTextParts = [{ content, type: 'text' }];\n } else {\n this.messageTextParts = [];\n let text = content;\n this.message!.mentioned_users.forEach((user) => {\n const mention = `@${user.name || user.id}`;\n const precedingText = text.substring(0, text.indexOf(mention));\n this.messageTextParts.push({\n content: precedingText,\n type: 'text',\n });\n this.messageTextParts.push({\n content: mention,\n type: 'mention',\n user,\n });\n text = text.replace(precedingText + mention, '');\n });\n if (text) {\n this.messageTextParts.push({ content: text, type: 'text' });\n }\n }\n }\n }\n }\n\n get isSentByCurrentUser() {\n return this.message?.user?.id === this.user?.id;\n }\n\n get readByText() {\n return getReadByText(this.message!.readBy);\n }\n\n get lastReadUser() {\n return this.message?.readBy.filter((u) => u.id !== this.user?.id)[0];\n }\n\n get isOnlyReadByMe() {\n return this.message && this.message.readBy.length === 0;\n }\n\n get isReadByMultipleUsers() {\n return this.message && this.message.readBy.length > 1;\n }\n\n get isMessageDeliveredAndRead() {\n return (\n this.message &&\n this.message.readBy &&\n this.message.status === 'received' &&\n this.message.readBy.length > 0\n );\n }\n\n get parsedDate() {\n if (!this.message || !this.message?.created_at) {\n return;\n }\n return parseDate(this.message.created_at);\n }\n\n get areOptionsVisible() {\n if (!this.message) {\n return false;\n }\n return !(\n !this.message.type ||\n this.message.type === 'error' ||\n this.message.type === 'system' ||\n this.message.type === 'ephemeral' ||\n this.message.status === 'failed' ||\n this.message.status === 'sending'\n );\n }\n\n get hasAttachment() {\n return !!this.message?.attachments && !!this.message.attachments.length;\n }\n\n get hasReactions() {\n return (\n !!this.message?.reaction_counts &&\n Object.keys(this.message.reaction_counts).length > 0\n );\n }\n\n resendMessage() {\n void this.channelService.resendMessage(this.message!);\n }\n\n textClicked() {\n if (getDeviceWidth().device !== 'mobile') {\n this.isPressedOnMobile = false;\n return;\n }\n if (this.isPressedOnMobile) {\n return;\n }\n this.isPressedOnMobile = true;\n const eventHandler = (event: Event) => {\n if (!this.container?.nativeElement.contains(event.target as Node)) {\n this.isPressedOnMobile = false;\n window.removeEventListener('click', eventHandler);\n }\n };\n window.addEventListener('click', eventHandler);\n }\n}\n","<div\n #container\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.mobile-press]=\"isPressedOnMobile\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"\n areReactionsEnabled && hasReactions\n \"\n data-testid=\"message-container\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n isMessageDeliveredAndRead && canReceiveReadEvents;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n </ng-container>\n <stream-avatar\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n ></stream-avatar>\n <div class=\"str-chat__message-inner\">\n <div\n class=\"str-chat__message-simple__actions\"\n data-testid=\"message-options\"\n *ngIf=\"areOptionsVisible\"\n >\n <div\n data-testid=\"message-actions-container\"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--options\n \"\n [class.str-chat-angular__message-simple__actions__action--options--editing]=\"\n isEditing\n \"\n >\n <stream-message-actions-box\n [isOpen]=\"isActionBoxOpen\"\n [isMine]=\"isSentByCurrentUser\"\n [enabledActions]=\"enabledMessageActions\"\n [message]=\"message\"\n (displayedActionsCount)=\"visibleMessageActionsCount = $event\"\n (isEditing)=\"isEditing = $event; isActionBoxOpen = !isEditing\"\n [messageInputTemplate]=\"messageInputTemplate\"\n ></stream-message-actions-box>\n <stream-icon\n *ngIf=\"visibleMessageActionsCount > 0\"\n data-testid=\"action-icon\"\n icon=\"action-icon\"\n (keyup.enter)=\"isActionBoxOpen = !isActionBoxOpen\"\n (click)=\"isActionBoxOpen = !isActionBoxOpen\"\n ></stream-icon>\n </div>\n <div\n *ngIf=\"areReactionsEnabled && canReactToMessage\"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--reactions\n \"\n data-testid=\"reaction-icon\"\n (click)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n (keyup.enter)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n >\n <stream-icon icon=\"reaction-icon\"></stream-icon>\n </div>\n </div>\n <stream-message-reactions\n *ngIf=\"areReactionsEnabled\"\n [messageReactionCounts]=\"message?.reaction_counts || {}\"\n [latestReactions]=\"message?.latest_reactions || []\"\n [(isSelectorOpen)]=\"isReactionSelectorOpen\"\n [messageId]=\"message?.id\"\n [ownReactions]=\"message?.own_reactions || []\"\n ></stream-message-reactions>\n <stream-attachment-list\n *ngIf=\"hasAttachment\"\n [attachments]=\"message!.attachments!\"\n [messageId]=\"message!.id\"\n ></stream-attachment-list>\n <div class=\"str-chat__message-text\" *ngIf=\"message?.text\">\n <div\n data-testid=\"inner-message\"\n class=\"\n str-chat__message-text-inner str-chat__message-simple-text-inner\n \"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n (click)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n (keyup.enter)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n >\n <div\n data-testid=\"client-error-message\"\n *ngIf=\"message?.type === 'error'\"\n class=\"str-chat__simple-message--error-message\"\n >\n {{ \"streamChat.Error · Unsent\" | translate }}\n </div>\n <div\n data-testid=\"error-message\"\n *ngIf=\"message?.status === 'failed'\"\n class=\"str-chat__simple-message--error-message\"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed · Unauthorized\"\n : \"streamChat.Message Failed · Click to try again\"\n ) | translate\n }}\n </div>\n <div\n (click)=\"textClicked()\"\n (keyup.enter)=\"textClicked()\"\n data-testid=\"text\"\n >\n <p>\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-container *ngIf=\"mentionTemplate; else defaultMention\">\n <ng-container\n *ngTemplateOutlet=\"\n mentionTemplate;\n context: { user: part.user! }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultMention>\n <b>{{ part.content }}</b>\n </ng-template>\n </ng-template>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"str-chat__message-data str-chat__message-simple-data\">\n <span\n data-testid=\"sender\"\n *ngIf=\"!isSentByCurrentUser\"\n class=\"str-chat__message-simple-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span data-testid=\"date\" class=\"str-chat__message-simple-timestamp\">\n {{ parsedDate }}\n </span>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #sendingStatus>\n <span\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"sending-indicator\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n <stream-loading-indicator\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator>\n </span>\n</ng-template>\n<ng-template #readStatus>\n <span\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"read-indicator\"\n >\n <div class=\"str-chat__tooltip\" data-testid=\"read-by-tooltip\">\n {{ readByText }}\n </div>\n <stream-avatar\n class=\"str-chat-angular__avatar-host\"\n data-test-id=\"last-read-user-avatar\"\n [size]=\"15\"\n [imageUrl]=\"lastReadUser?.image\"\n [name]=\"lastReadUser?.name || lastReadUser?.id\"\n ></stream-avatar>\n <span\n data-test-id=\"read-by-length\"\n *ngIf=\"isReadByMultipleUsers\"\n class=\"str-chat__message-simple-status-number\"\n >\n {{ (message?.readBy)!.length }}\n </span>\n </span>\n</ng-template>\n<ng-template #deliveredStatus>\n <span\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"delivered-indicator\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n <stream-icon\n data-testid=\"delivered-icon\"\n icon=\"delivered-icon\"\n ></stream-icon>\n </span>\n</ng-template>\n\n<ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n</ng-template>\n\n<ng-template #systemMessage>\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ message?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n</ng-template>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n OnChanges,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { TextareaInterface } from '../textarea.interface';\n\n@Component({\n selector: 'stream-textarea',\n templateUrl: './textarea.component.html',\n styles: [],\n})\nexport class TextareaComponent implements TextareaInterface, OnChanges {\n @HostBinding() class = 'str-chat__textarea';\n @Input() value = '';\n @Output() readonly valueChange = new EventEmitter<string>();\n @Output() readonly send = new EventEmitter<void>();\n @ViewChild('input') private messageInput!: ElementRef<HTMLInputElement>;\n\n constructor() {}\n\n // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method\n ngOnChanges(): void {}\n\n inputChanged() {\n this.valueChange.emit(this.messageInput.nativeElement.value);\n }\n\n sent(event: Event) {\n event.preventDefault();\n this.send.next();\n }\n}\n","<textarea\n [value]=\"value || ''\"\n autofocus\n data-testid=\"textarea\"\n #input\n placeholder=\"{{ 'streamChat.Type your message' | translate }}\"\n class=\"rta__textarea str-chat__textarea__textarea\"\n rows=\"1\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"sent($event)\"\n></textarea>\n","import { Injectable } from '@angular/core';\nimport transliterate from '@stream-io/transliterate';\n\n@Injectable({ providedIn: 'root' })\nexport class TransliterationService {\n constructor() {}\n\n transliterate(s: string) {\n return transliterate(s);\n }\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { MentionConfig, Mentions } from 'angular-mentions';\nimport {\n MentionAutcompleteListItemContext,\n MentionAutcompleteListItem,\n CommandAutocompleteListItemContext,\n} from '../../types';\n\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { UserResponse } from 'stream-chat';\nimport { ChannelService } from '../../channel.service';\nimport { TextareaInterface } from '../textarea.interface';\nimport { ChatClientService } from '../../chat-client.service';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { TransliterationService } from '../../transliteration.service';\n\n@Component({\n selector: 'stream-autocomplete-textarea',\n templateUrl: './autocomplete-textarea.component.html',\n styles: [],\n})\nexport class AutocompleteTextareaComponent\n implements TextareaInterface, OnChanges\n{\n @HostBinding() class = 'str-chat__textarea';\n @Input() value = '';\n @Input() areMentionsEnabled: boolean | undefined = true;\n @Input() mentionAutocompleteItemTemplate:\n | TemplateRef<MentionAutcompleteListItemContext>\n | undefined;\n @Input() commandAutocompleteItemTemplate:\n | TemplateRef<CommandAutocompleteListItemContext>\n | undefined;\n @Input() mentionScope: 'channel' | 'application' = 'channel';\n @Output() readonly valueChange = new EventEmitter<string>();\n @Output() readonly send = new EventEmitter<void>();\n @Output() readonly userMentions = new EventEmitter<UserResponse[]>();\n private readonly autocompleteKey = 'autocompleteLabel';\n private readonly mentionTriggerChar = '@';\n private readonly commandTriggerChar = '/';\n autocompleteConfig: MentionConfig = {\n mentions: [],\n };\n @ViewChild('input') private messageInput!: ElementRef<HTMLInputElement>;\n private subscriptions: Subscription[] = [];\n private mentionedUsers: UserResponse[] = [];\n private userMentionConfig: Mentions = {\n triggerChar: this.mentionTriggerChar,\n dropUp: true,\n labelKey: this.autocompleteKey,\n returnTrigger: true,\n mentionFilter: (\n searchString: string,\n items: { autocompleteLabel: string }[]\n ) => this.filter(searchString, items),\n mentionSelect: (item, triggerChar) =>\n this.itemSelectedFromAutocompleteList(item, triggerChar),\n };\n private slashCommandConfig: Mentions = {\n triggerChar: this.commandTriggerChar,\n dropUp: true,\n labelKey: 'name',\n returnTrigger: true,\n mentionFilter: (\n searchString: string,\n items: { autocompleteLabel: string }[]\n ) => this.filter(searchString, items),\n mentionSelect: (item, triggerChar) =>\n this.itemSelectedFromAutocompleteList(item, triggerChar),\n };\n private searchTerm$ = new BehaviorSubject<string>('');\n\n constructor(\n private channelService: ChannelService,\n private chatClientService: ChatClientService,\n private transliterationService: TransliterationService\n ) {\n this.searchTerm$\n .pipe(debounceTime(300), distinctUntilChanged())\n .subscribe((searchTerm) => {\n if (searchTerm.startsWith(this.mentionTriggerChar)) {\n void this.updateMentionOptions(searchTerm);\n }\n });\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe((channel) => {\n const commands = channel?.getConfig()?.commands || [];\n this.slashCommandConfig.items = commands.map((c) => ({\n ...c,\n [this.autocompleteKey]: c.name,\n type: 'command',\n }));\n this.mentionedUsers = [];\n this.userMentions.next([...this.mentionedUsers]);\n void this.updateMentionOptions(this.searchTerm$.getValue());\n })\n );\n this.autocompleteConfig.mentions = [\n this.userMentionConfig,\n this.slashCommandConfig,\n ];\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.areMentionsEnabled) {\n if (this.areMentionsEnabled) {\n this.autocompleteConfig.mentions = [\n this.userMentionConfig,\n this.slashCommandConfig,\n ];\n this.autocompleteConfig = { ...this.autocompleteConfig };\n } else {\n this.autocompleteConfig.mentions = [this.slashCommandConfig];\n this.autocompleteConfig = { ...this.autocompleteConfig };\n }\n }\n if (changes.mentionScope) {\n void this.updateMentionOptions(this.searchTerm$.getValue());\n }\n }\n\n filter(searchString: string, items: { autocompleteLabel: string }[]) {\n return items.filter((item) =>\n this.transliterate(item.autocompleteLabel.toLowerCase()).includes(\n this.transliterate(searchString.toLowerCase())\n )\n );\n }\n\n itemSelectedFromAutocompleteList(\n item: MentionAutcompleteListItem,\n triggerChar = ''\n ) {\n if (triggerChar === this.mentionTriggerChar) {\n this.mentionedUsers.push((item.user ? item.user : item) as UserResponse);\n this.userMentions.next([...this.mentionedUsers]);\n }\n return (\n triggerChar +\n item.autocompleteLabel +\n (triggerChar === this.commandTriggerChar ? ' ' : '')\n );\n }\n\n autcompleteSearchTermChanged(searchTerm: string) {\n if (searchTerm === this.mentionTriggerChar) {\n void this.updateMentionOptions();\n } else {\n this.searchTerm$.next(searchTerm);\n }\n }\n\n inputChanged() {\n this.valueChange.emit(this.messageInput.nativeElement.value);\n }\n\n inputLeft() {\n this.updateMentionedUsersFromText();\n }\n\n sent(event: Event) {\n event.preventDefault();\n this.updateMentionedUsersFromText();\n this.send.next();\n }\n\n private transliterate(s: string) {\n if (this.transliterationService) {\n return this.transliterationService.transliterate(s);\n } else {\n return s;\n }\n }\n\n private async updateMentionOptions(searchTerm?: string) {\n if (!this.areMentionsEnabled) {\n return;\n }\n searchTerm = searchTerm?.replace(this.mentionTriggerChar, '');\n const request =\n this.mentionScope === 'application'\n ? (s: string) => this.chatClientService.autocompleteUsers(s)\n : (s: string) => this.channelService.autocompleteMembers(s);\n const result = await request(searchTerm || '');\n const items = this.filter(\n searchTerm || '',\n result.map((i) => {\n const user = (i.user ? i.user : i) as UserResponse;\n return {\n ...i,\n autocompleteLabel: user.name || user.id,\n type: 'mention',\n };\n })\n );\n this.userMentionConfig.items = items;\n this.autocompleteConfig.mentions = [\n this.userMentionConfig,\n this.slashCommandConfig,\n ];\n this.autocompleteConfig = { ...this.autocompleteConfig };\n }\n\n private updateMentionedUsersFromText() {\n const updatedMentionedUsers: UserResponse[] = [];\n this.mentionedUsers.forEach((u) => {\n const key = u.name || u.id;\n if (this.value.includes(`${this.mentionTriggerChar}${key}`)) {\n updatedMentionedUsers.push(u);\n }\n });\n if (updatedMentionedUsers.length !== this.mentionedUsers.length) {\n this.userMentions.next([...updatedMentionedUsers]);\n this.mentionedUsers = updatedMentionedUsers;\n }\n }\n}\n","<textarea\n [value]=\"value || ''\"\n autofocus\n data-testid=\"textarea\"\n #input\n placeholder=\"{{ 'streamChat.Type your message' | translate }}\"\n class=\"rta__textarea str-chat__textarea__textarea\"\n rows=\"1\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"sent($event)\"\n [mentionConfig]=\"autocompleteConfig\"\n (searchTerm)=\"autcompleteSearchTermChanged($event)\"\n [mentionListTemplate]=\"autocompleteItem\"\n (blur)=\"inputLeft()\"\n></textarea>\n<ng-template #autocompleteItem let-item=\"item\">\n <div class=\"rta rta__item str-chat__emojisearch__item\" [ngSwitch]=\"item.type\">\n <div class=\"rta__entity\" *ngSwitchCase=\"'mention'\">\n <ng-container\n *ngTemplateOutlet=\"\n mentionAutocompleteItemTemplate || defaultMentionTemplate;\n context: { item: item }\n \"\n ></ng-container>\n </div>\n <div class=\"rta__entity\" *ngSwitchCase=\"'command'\">\n <ng-container\n *ngTemplateOutlet=\"\n commandAutocompleteItemTemplate || defaultCommandTemplate;\n context: { item: item }\n \"\n ></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultCommandTemplate let-item=\"item\">\n <div class=\"str-chat__slash-command\">\n <span class=\"str-chat__slash-command-header\">\n <strong data-testclass=\"command-name\">{{ item.name }}</strong>\n {{ item.args }}\n </span>\n <br />\n <span class=\"str-chat__slash-command-description\">{{\n item.description\n }}</span>\n </div>\n</ng-template>\n\n<ng-template #defaultMentionTemplate let-item=\"item\">\n <div class=\"str-chat__user-item\">\n <stream-avatar\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n style=\"height: 20px\"\n [size]=\"20\"\n [imageUrl]=\"item.image || item.user?.image\"\n [name]=\"item.autocompleteLabel\"\n ></stream-avatar>\n <span data-testclass=\"username\" class=\"str-chat__user-item--name\">{{\n item.autocompleteLabel\n }}</span>\n </div>\n</ng-template>\n","import { StreamMessage } from '../types';\n\nexport type GroupStyle = '' | 'middle' | 'top' | 'bottom' | 'single';\n\nexport const getGroupStyles = (\n message: StreamMessage,\n previousMessage?: StreamMessage,\n nextMessage?: StreamMessage,\n noGroupByUser = false\n): GroupStyle => {\n if (\n noGroupByUser ||\n (message.attachments && message.attachments.length !== 0)\n )\n return 'single';\n\n const isTopMessage =\n !previousMessage ||\n !isOnSameDay(previousMessage.created_at, message.created_at) ||\n previousMessage.type === 'system' ||\n (previousMessage.attachments &&\n previousMessage.attachments?.length !== 0) ||\n message.user?.id !== previousMessage.user?.id ||\n previousMessage.type === 'error' ||\n previousMessage.deleted_at;\n\n const isBottomMessage =\n !nextMessage ||\n !isOnSameDay(message.created_at, nextMessage.created_at) ||\n nextMessage.type === 'system' ||\n (nextMessage.attachments && nextMessage.attachments?.length !== 0) ||\n message.user?.id !== nextMessage.user?.id ||\n nextMessage.type === 'error' ||\n nextMessage.deleted_at;\n\n if (!isTopMessage && !isBottomMessage) {\n if (message.deleted_at || message.type === 'error') return 'single';\n return 'middle';\n }\n\n if (isBottomMessage) {\n if (isTopMessage || message.deleted_at || message.type === 'error')\n return 'single';\n return 'bottom';\n }\n\n if (isTopMessage) return 'top';\n\n return '';\n};\n\nconst isOnSameDay = (date1: Date, date2: Date) => {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n HostBinding,\n Input,\n OnChanges,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { ChannelService } from '../channel.service';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { StreamMessage } from '../types';\nimport { ChatClientService } from '../chat-client.service';\nimport { getGroupStyles, GroupStyle } from './group-styles';\nimport { ImageLoadService } from './image-load.service';\nimport { MessageActions } from '../message-actions-box/message-actions-box.component';\n@Component({\n selector: 'stream-message-list',\n templateUrl: './message-list.component.html',\n styles: [],\n})\nexport class MessageListComponent implements AfterViewChecked, OnChanges {\n @Input() messageTemplate: TemplateRef<any> | undefined;\n @Input() messageInputTemplate: TemplateRef<any> | undefined;\n @Input() mentionTemplate: TemplateRef<any> | undefined;\n @Input() areReactionsEnabled = true;\n /* eslint-disable-next-line @angular-eslint/no-input-rename */\n @Input('enabledMessageActions') enabledMessageActionsInput: MessageActions[] =\n ['flag', 'edit', 'edit-any', 'delete', 'delete-any'];\n messages$!: Observable<StreamMessage[]>;\n canReactToMessage: boolean | undefined;\n canReceiveReadEvents: boolean | undefined;\n enabledMessageActions: MessageActions[] = [];\n @HostBinding('class') private class =\n 'str-chat-angular__main-panel-inner str-chat-angular__message-list-host';\n unreadMessageCount = 0;\n isUserScrolledUp: boolean | undefined;\n groupStyles: GroupStyle[] = [];\n lastSentMessageId: string | undefined;\n @ViewChild('scrollContainer')\n private scrollContainer!: ElementRef<HTMLElement>;\n private latestMessageDate: Date | undefined;\n private hasNewMessages: boolean | undefined;\n private containerHeight: number | undefined;\n private oldestMessageDate: Date | undefined;\n private olderMassagesLoaded: boolean | undefined;\n private isNewMessageSentByUser: boolean | undefined;\n private authorizedMessageActions: MessageActions[] = ['flag'];\n private readonly isUserScrolledUpThreshold = 300;\n\n constructor(\n private channelService: ChannelService,\n private chatClientService: ChatClientService,\n private imageLoadService: ImageLoadService\n ) {\n this.channelService.activeChannel$.subscribe((channel) => {\n this.latestMessageDate = undefined;\n this.hasNewMessages = true;\n this.isUserScrolledUp = false;\n this.containerHeight = undefined;\n this.olderMassagesLoaded = false;\n this.oldestMessageDate = undefined;\n this.unreadMessageCount = 0;\n this.isNewMessageSentByUser = undefined;\n const capabilites = channel?.data?.own_capabilities as string[];\n if (capabilites) {\n this.canReactToMessage = capabilites.indexOf('send-reaction') !== -1;\n this.canReceiveReadEvents = capabilites.indexOf('read-events') !== -1;\n this.authorizedMessageActions = [];\n if (capabilites.indexOf('flag-message') !== -1) {\n this.authorizedMessageActions.push('flag');\n }\n if (capabilites.indexOf('update-own-message') !== -1) {\n this.authorizedMessageActions.push('edit');\n }\n if (capabilites.indexOf('update-any-message') !== -1) {\n this.authorizedMessageActions.push('edit');\n this.authorizedMessageActions.push('edit-any');\n }\n if (capabilites.indexOf('delete-own-message') !== -1) {\n this.authorizedMessageActions.push('delete');\n }\n if (capabilites.indexOf('delete-any-message') !== -1) {\n this.authorizedMessageActions.push('delete');\n this.authorizedMessageActions.push('delete-any');\n }\n this.setEnabledActions();\n }\n });\n this.messages$ = this.channelService.activeChannelMessages$.pipe(\n tap((messages) => {\n if (messages.length === 0) {\n return;\n }\n const currentLatestMessageDate =\n messages[messages.length - 1].created_at;\n if (\n !this.latestMessageDate ||\n this.latestMessageDate?.getTime() < currentLatestMessageDate.getTime()\n ) {\n this.latestMessageDate = currentLatestMessageDate;\n this.hasNewMessages = true;\n this.isNewMessageSentByUser =\n messages[messages.length - 1].user?.id ===\n this.chatClientService.chatClient?.user?.id;\n if (this.isUserScrolledUp) {\n this.unreadMessageCount++;\n }\n }\n const currentOldestMessageDate = messages[0].created_at;\n if (!this.oldestMessageDate) {\n this.oldestMessageDate = currentOldestMessageDate;\n } else if (\n this.oldestMessageDate?.getTime() > currentOldestMessageDate.getTime()\n ) {\n this.oldestMessageDate = currentOldestMessageDate;\n this.olderMassagesLoaded = true;\n }\n }),\n tap((messages) => {\n this.groupStyles = messages.map((m, i) =>\n getGroupStyles(m, messages[i - 1], messages[i + 1])\n );\n }),\n tap(\n (messages) =>\n (this.lastSentMessageId = [...messages]\n .reverse()\n .find(\n (m) =>\n m.user?.id === this.chatClientService.chatClient?.user?.id &&\n m.status !== 'sending'\n )?.id)\n )\n );\n this.imageLoadService.imageLoad$.subscribe(() => {\n if (!this.isUserScrolledUp) {\n this.scrollToBottom();\n // Hacky and unreliable workaround to scroll down after loaded images move the scrollbar\n setTimeout(() => {\n this.scrollToBottom();\n }, 300);\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.enabledMessageActionsInput) {\n this.setEnabledActions();\n }\n }\n\n ngAfterViewChecked() {\n if (this.hasNewMessages) {\n if (!this.isUserScrolledUp || this.isNewMessageSentByUser) {\n this.scrollToBottom();\n // Hacky and unreliable workaround to scroll down after loaded images move the scrollbar\n setTimeout(() => {\n this.scrollToBottom();\n }, 300);\n }\n this.hasNewMessages = false;\n this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;\n } else if (this.olderMassagesLoaded) {\n this.preserveScrollbarPosition();\n this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;\n this.olderMassagesLoaded = false;\n } else if (\n this.containerHeight !== undefined &&\n this.containerHeight < this.scrollContainer.nativeElement.scrollHeight &&\n !this.isUserScrolledUp\n ) {\n this.scrollToBottom();\n this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;\n }\n }\n\n trackByMessageId(index: number, item: StreamMessage) {\n return item.id;\n }\n\n scrollToBottom(): void {\n this.scrollContainer.nativeElement.scrollTop =\n this.scrollContainer.nativeElement.scrollHeight;\n }\n\n scrolled() {\n this.isUserScrolledUp =\n this.scrollContainer.nativeElement.scrollHeight -\n (this.scrollContainer.nativeElement.scrollTop +\n this.scrollContainer.nativeElement.clientHeight) >\n this.isUserScrolledUpThreshold;\n if (!this.isUserScrolledUp) {\n this.unreadMessageCount = 0;\n }\n if (this.scrollContainer.nativeElement.scrollTop === 0) {\n this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;\n void this.channelService.loadMoreMessages();\n }\n }\n\n private preserveScrollbarPosition() {\n this.scrollContainer.nativeElement.scrollTop =\n this.scrollContainer.nativeElement.scrollHeight - this.containerHeight!;\n }\n\n private setEnabledActions() {\n this.enabledMessageActions = [];\n if (!this.enabledMessageActionsInput) {\n return;\n }\n this.enabledMessageActionsInput.forEach((action) => {\n const isAuthorized = this.authorizedMessageActions.indexOf(action) !== -1;\n if (isAuthorized) {\n this.enabledMessageActions.push(action);\n }\n });\n }\n}\n","<div\n #scrollContainer\n data-testid=\"scroll-container\"\n class=\"str-chat__list\"\n (scroll)=\"scrolled()\"\n>\n <div class=\"str-chat__reverse-infinite-scroll\">\n <ul class=\"str-chat__ul\">\n <li\n data-testclass=\"message\"\n *ngFor=\"\n let message of messages$ | async;\n let i = index;\n trackBy: trackByMessageId\n \"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n >\n <ng-container *ngIf=\"messageTemplate; else defaultMessageTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate;\n context: {\n message: message,\n areReactionsEnabled: areReactionsEnabled,\n canReactToMessage: canReactToMessage,\n lastSentMessageId: !!(\n lastSentMessageId && message?.id === lastSentMessageId\n ),\n canReceiveReadEvents: canReceiveReadEvents,\n messageInputTemplate: messageInputTemplate,\n mentionTemplate: mentionTemplate\n }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultMessageTemplate>\n <stream-message\n [message]=\"message\"\n [areReactionsEnabled]=\"areReactionsEnabled\"\n [canReactToMessage]=\"canReactToMessage\"\n [isLastSentMessage]=\"\n !!(lastSentMessageId && message?.id === lastSentMessageId)\n \"\n [enabledMessageActions]=\"enabledMessageActions\"\n [canReceiveReadEvents]=\"canReceiveReadEvents\"\n [messageInputTemplate]=\"messageInputTemplate\"\n [mentionTemplate]=\"mentionTemplate\"\n ></stream-message>\n </ng-template>\n </li>\n </ul>\n </div>\n</div>\n<div class=\"str-chat__list-notifications\">\n <button\n data-testid=\"scroll-to-bottom\"\n *ngIf=\"isUserScrolledUp\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-right\n str-chat__message-notification-scroll-down\n \"\n (keyup.enter)=\"scrollToBottom()\"\n (click)=\"scrollToBottom()\"\n >\n <div\n *ngIf=\"unreadMessageCount > 0\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-scroll-down-unread-count\n \"\n >\n {{ unreadMessageCount }}\n </div>\n </button>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AvatarComponent } from './avatar/avatar.component';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n declarations: [AvatarComponent],\n imports: [CommonModule, TranslateModule],\n exports: [AvatarComponent],\n})\nexport class StreamAvatarModule {}\n","import { NgModule } from '@angular/core';\nimport { ChannelComponent } from './channel/channel.component';\nimport { ChannelHeaderComponent } from './channel-header/channel-header.component';\nimport { ChannelListComponent } from './channel-list/channel-list.component';\nimport { ChannelPreviewComponent } from './channel-preview/channel-preview.component';\nimport { MessageComponent } from './message/message.component';\nimport { MessageInputComponent } from './message-input/message-input.component';\nimport { MessageListComponent } from './message-list/message-list.component';\nimport { CommonModule } from '@angular/common';\nimport { LoadingIndicatorComponent } from './loading-indicator/loading-indicator.component';\nimport { IconComponent } from './icon/icon.component';\nimport { MessageActionsBoxComponent } from './message-actions-box/message-actions-box.component';\nimport { AttachmentListComponent } from './attachment-list/attachment-list.component';\nimport { MessageReactionsComponent } from './message-reactions/message-reactions.component';\nimport { NotificationComponent } from './notification/notification.component';\nimport { NotificationListComponent } from './notification-list/notification-list.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AttachmentPreviewListComponent } from './attachment-preview-list/attachment-preview-list.component';\nimport { ModalComponent } from './modal/modal.component';\nimport { TextareaDirective } from './message-input/textarea.directive';\nimport { StreamAvatarModule } from './stream-avatar.module';\n\n@NgModule({\n declarations: [\n ChannelComponent,\n ChannelHeaderComponent,\n ChannelListComponent,\n ChannelPreviewComponent,\n MessageComponent,\n MessageInputComponent,\n MessageListComponent,\n LoadingIndicatorComponent,\n IconComponent,\n MessageActionsBoxComponent,\n AttachmentListComponent,\n MessageReactionsComponent,\n NotificationComponent,\n NotificationListComponent,\n AttachmentPreviewListComponent,\n ModalComponent,\n TextareaDirective,\n ],\n imports: [CommonModule, TranslateModule, StreamAvatarModule],\n exports: [\n ChannelComponent,\n ChannelHeaderComponent,\n ChannelListComponent,\n ChannelPreviewComponent,\n MessageComponent,\n MessageInputComponent,\n MessageListComponent,\n LoadingIndicatorComponent,\n IconComponent,\n MessageActionsBoxComponent,\n AttachmentListComponent,\n MessageReactionsComponent,\n NotificationComponent,\n NotificationListComponent,\n AttachmentPreviewListComponent,\n ModalComponent,\n StreamAvatarModule,\n ],\n})\nexport class StreamChatModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AutocompleteTextareaComponent } from './message-input/autocomplete-textarea/autocomplete-textarea.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MentionModule } from 'angular-mentions';\nimport { StreamAvatarModule } from './stream-avatar.module';\nimport { textareaInjectionToken } from './injection-tokens';\n\n@NgModule({\n declarations: [AutocompleteTextareaComponent],\n imports: [CommonModule, TranslateModule, MentionModule, StreamAvatarModule],\n exports: [AutocompleteTextareaComponent],\n providers: [\n {\n provide: textareaInjectionToken,\n useValue: AutocompleteTextareaComponent,\n },\n ],\n})\nexport class StreamAutocompleteTextareaModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { TextareaComponent } from './message-input/textarea/textarea.component';\nimport { textareaInjectionToken } from './injection-tokens';\n\n@NgModule({\n declarations: [TextareaComponent],\n imports: [CommonModule, TranslateModule],\n exports: [TextareaComponent],\n providers: [\n {\n provide: textareaInjectionToken,\n useValue: TextareaComponent,\n },\n ],\n})\nexport class StreamTextareaModule {}\n","/*\n * Public API Surface of stream-chat-angular\n */\n\nexport * from './lib/chat-client.service';\nexport * from './lib/channel.service';\nexport * from './lib/theme.service';\nexport * from './lib/attachment.service';\nexport * from './lib/stream-i18n.service';\nexport * from './lib/avatar/avatar.component';\nexport * from './lib/icon/icon.component';\nexport * from './lib/loading-indicator/loading-indicator.component';\nexport * from './lib/message-actions-box/message-actions-box.component';\nexport * from './lib/channel/channel.component';\nexport * from './lib/channel-header/channel-header.component';\nexport * from './lib/channel-preview/channel-preview.component';\nexport * from './lib/channel-list/channel-list.component';\nexport * from './lib/channel-list/channel-list-toggle.service';\nexport * from './lib/message/message.component';\nexport * from './lib/message/parse-date';\nexport * from './lib/message/read-by-text';\nexport * from './lib/message-input/message-input.component';\nexport * from './lib/message-input/textarea/textarea.component';\nexport * from './lib/message-input/autocomplete-textarea/autocomplete-textarea.component';\nexport * from './lib/message-input/message-input-config.service';\nexport * from './lib/message-input/textarea.directive';\nexport * from './lib/message-input/textarea.interface';\nexport * from './lib/message-list/message-list.component';\nexport * from './lib/message-list/image-load.service';\nexport * from './lib/message-list/group-styles';\nexport * from './lib/attachment-list/attachment-list.component';\nexport * from './lib/attachment-preview-list/attachment-preview-list.component';\nexport * from './lib/message-reactions/message-reactions.component';\nexport * from './lib/notification/notification.component';\nexport * from './lib/notification-list/notification-list.component';\nexport * from './lib/modal/modal.component';\nexport * from './lib/read-by';\nexport * from './lib/is-image-attachment';\nexport * from './lib/is-image-file';\nexport * from './lib/device-width';\nexport * from './lib/message-preview';\nexport * from './lib/notification.service';\nexport * from './lib/transliteration.service';\nexport * from './lib/stream-chat.module';\nexport * from './lib/stream-avatar.module';\nexport * from './lib/stream-autocomplete-textarea.module';\nexport * from './lib/stream-textarea.module';\nexport * from './lib/injection-tokens';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuidv4"],"mappings":";;;;;;;;;;;;;;;;;;AAAO,MAAM,OAAO,GAAG,OAAO;;MCcjB,mBAAmB;IAI9B;QAFQ,yBAAoB,GAAG,IAAI,eAAe,CAAwB,EAAE,CAAC,CAAC;QAG5E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;KAChE;IAED,wBAAwB,CACtB,IAAY,EACZ,OAAyB,OAAO,EAChC,UAAkB,IAAI,EACtB,eAAwB;QAExB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAEpE,OAAO;YACL,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;SAC/B,CAAC;KACH;IAED,wBAAwB,CACtB,IAAY,EACZ,OAAyB,OAAO,EAChC,eAAwB;QAExB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QAElD,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;KAC5C;IAEO,eAAe,CACrB,IAAY,EACZ,IAAsB,EACtB,eAAwB;QAExB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAC7B,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE;YACvC,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE;SAChC,CAAC,CAAC;KACJ;IAEO,kBAAkB,CAAC,IAAY;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,OAAO;SACR;QACD,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;KACpD;;gHApDU,mBAAmB;oHAAnB,mBAAmB,cAFlB,MAAM;2FAEP,mBAAmB;kBAH/B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;MCEY,iBAAiB;IAW5B,YACU,MAAc,EACd,mBAAwC;QADxC,WAAM,GAAN,MAAM,CAAQ;QACd,wBAAmB,GAAnB,mBAAmB,CAAqB;QAR1C,wBAAmB,GAAG,IAAI,aAAa,CAAe,CAAC,CAAC,CAAC;QACzD,2BAAsB,GAAG,IAAI,aAAa,CAAuB,CAAC,CAAC,CAAC;QACpE,uBAAkB,GAAG,IAAI,eAAe,CAC9C,SAAS,CACV,CAAC;QAMA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC;QAC7D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;QACnE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,CAAC;KAC5D;IAEK,IAAI,CACR,MAAc,EACd,QAAiD,EACjD,mBAAoC;;YAEpC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBAClC,MAAM,IAAI,GAAG,OAAO,QAAQ,KAAK,QAAQ,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;gBACxE,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;gBAC7D,IAAI,CAAC,UAAU,CAAC,YAAY,CAC1B,uBAAuB,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CACnE,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;aAChC,CAAA,CAAC,CAAC;YACH,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;oBAC5B,SAAS,EAAE,CAAC,CAAC,IAAI;oBACjB,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;aACJ,CAAC,CAAC;YACH,IAAI,kBAAwC,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;oBACd,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;oBAC1B,IAAI,QAAQ,EAAE;wBACZ,IAAI,kBAAkB,EAAE;4BACtB,kBAAkB,EAAE,CAAC;yBACtB;qBACF;yBAAM;wBACL,kBAAkB;4BAChB,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,oDAAoD,CACrD,CAAC;qBACL;oBACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;iBACnE,CAAC,CAAC;aACJ,CAAC,CAAC;SACJ;KAAA;IAEK,cAAc;;YAClB,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE;gBACtC,OAAO;aACR;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;YACxD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;SAClD;KAAA;IAEK,WAAW,CAAC,SAAiB;;YACjC,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;SAC9C;KAAA;IAEK,iBAAiB,CAAC,UAAkB;;YACxC,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,EAAE,CAAC;aACX;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAC9C,GAAG,EAAE;oBACH,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE;oBACrC,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE;iBACxC;gBACD,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,MAAO,EAAE;aACrC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,KAAK,CAAC;SACrB;KAAA;;8GApFU,iBAAiB;kHAAjB,iBAAiB,cAFhB,MAAM;2FAEP,iBAAiB;kBAH7B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;MCXY,oBAAoB,GAAG,CAClC,IAAkB,EAClB,IAAY,EACZ,WAAyB,EACzB,cAA8B;IAE9B,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,EAAE,IAAIA,EAAM,EAAE,EAAE,CAAC;IAE9C,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI,IAAI,EAAE;QACtB,IAAI,EAAE,IAAI;QACV,EAAE,EAAE,YAAY;QAChB,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,SAAS;QACjB,IAAI;QACJ,IAAI,EAAE,SAAS;QACf,IAAI;QACJ,WAAW;QACX,eAAe,EAAE,cAAc;KACF,CAAC;AAClC;;MCtBa,SAAS,GAAG,CAAC,OAA8B,EAAE,OAAgB;IACxE,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG;;QAC1C,IACE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;YACzC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE;YAC9B,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,EAAE,MAAK,GAAG,EACxB;YACA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;SAC3C;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB;;MCSa,cAAc;IA4EzB,YACU,iBAAoC,EACpC,MAAc;QADd,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,WAAM,GAAN,MAAM,CAAQ;QAzBhB,oBAAe,GAAG,IAAI,eAAe,CAC3C,SAAS,CACV,CAAC;QACM,yBAAoB,GAAG,IAAI,eAAe,CAChD,SAAS,CACV,CAAC;QACM,iCAA4B,GAAG,IAAI,eAAe,CAExD,EAAE,CAAC,CAAC;QACE,2BAAsB,GAAG,IAAI,aAAa,CAAU,CAAC,CAAC,CAAC;QACvD,+BAA0B,GAAkC,EAAE,CAAC;QAK/D,sBAAiB,GAAG,CAAC,QAAmB;YAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACrC,CAAC;QAEM,sBAAiB,GAAG,CAAC,QAAyB;YACpD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAClD,CAAC;QAMA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;QACrD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;QAC/D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAClE,GAAG,CAAC,CAAC,QAAQ;YACX,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC;YACtD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO;gBAC1B,IACE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;oBAC7B,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EACrC;oBACA,OAAO,OAAO,CAAC;iBAChB;qBAAM,IAAI,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE;oBAChD,uCAAY,OAAO,KAAE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,IAAG;iBAC5D;qBAAM;oBACL,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;oBAClD,uCACK,aAAa,KAChB,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,IACzC;iBACH;aACF,CAAC,CAAC;SACJ,CAAC,CACH,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;KACpE;IAED,kBAAkB,CAAC,OAAgB;QACjC,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;QAC/D,IAAI,CAAC,+BAA+B,CAAC,iBAAiB,CAAC,CAAC;QACxD,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;SACzB;QACD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;KACrE;IAEK,gBAAgB;;;YACpB,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YAC5D,MAAM,aAAa,GAAG,MAAA,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,0CAAE,EAAE,CAAC;YAC1E,OAAM,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,CAAC;gBAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;gBAC7C,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBACrB,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;aACvB,CAAC,CAAA,CAAC;YACH,IACE,CAAA,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,0CAAE,EAAE;iBACxB,MAAA,MAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,0CAAE,IAAI,0CAAE,EAAE,CAAA,EAC9C;gBACA,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC;oBACrC,GAAG,cAAe,CAAC,KAAK,CAAC,QAAQ;iBAClC,CAAC,CAAC;aACJ;;KACF;IAEK,IAAI,CACR,OAAuB,EACvB,IAAkB,EAClB,OAAwB;;YAExB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI;gBACxB,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,IAAI;gBACX,aAAa,EAAE,EAAE;aAClB,CAAC;YACF,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,SAAS,CAC5C,CAAC,YAAY,KAAK,KAAK,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAC7D,CAAC;SACH;KAAA;IAEK,gBAAgB;;YACpB,IAAI,CAAC,OAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAO,CAAC;YAC7C,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;SAC5B;KAAA;IAEK,WAAW,CAAC,SAAiB,EAAE,YAAiC;;;YACpE,OAAM,MAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,0CAAE,YAAY,CAAC,SAAS,EAAE;gBAClE,IAAI,EAAE,YAAY;aACnB,CAAC,CAAA,CAAC;;KACJ;IAEK,cAAc,CAAC,SAAiB,EAAE,YAAiC;;;YACvE,OAAM,MAAA,IAAI,CAAC,oBAAoB;iBAC5B,QAAQ,EAAE,0CACT,cAAc,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA,CAAC;;KAC7C;IAEK,WAAW,CACf,IAAY,EACZ,cAA4B,EAAE,EAC9B,iBAAiC,EAAE;;YAEnC,MAAM,OAAO,GAAG,oBAAoB,CAClC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAK,EACvC,IAAI,EACJ,WAAW,EACX,cAAc,CACf,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC;YACtD,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;SACxC;KAAA;IAEK,aAAa,CAAC,OAAsB;;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,gBAAgB,iCAEtB,OAAkC,KACtC,eAAe,EAAE,SAAS,EAC1B,MAAM,EAAE,SAAS,KAEnB,IAAI,CACL,CAAC;YACF,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;SACxC;KAAA;IAEK,aAAa,CAAC,OAAsB;;YACxC,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,aAAa,CACnD,OAAyB,CAC1B,CAAC;SACH;KAAA;IAEK,aAAa,CAAC,OAAsB;;YACxC,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACnE;KAAA;IAEK,iBAAiB,CACrB,OAA2B;;YAE3B,MAAM,MAAM,GAAuB,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC;YACtD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,UAAU,CAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KACjB,MAAM,CAAC,IAAI,KAAK,OAAO;kBACnB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;kBAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAClC,CACF,CAAC;YACF,aAAa,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC7B,IAAI,YAAY,CAAC,MAAM,KAAK,WAAW,EAAE;oBACvC,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI;wBACJ,IAAI;wBACJ,KAAK,EAAE,SAAS;wBAChB,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI;qBAC7B,CAAC,CAAC;iBACJ;qBAAM;oBACL,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;iBAC7C;aACF,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;SACf;KAAA;IAEK,gBAAgB,CAAC,gBAAkC;;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC;YACtD,OAAO,gBAAgB,CAAC,IAAI,KAAK,OAAO;kBACpC,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAI,CAAC;kBAC1C,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,GAAI,CAAC,CAAC,CAAC;SAChD;KAAA;IAEK,mBAAmB,CAAC,UAAkB;;YAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YAC3D,IAAI,CAAC,aAAa,EAAE;gBAClB,OAAO,EAAE,CAAC;aACX;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,GAAG,EAAE;gBAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CACtD,CAAC,CAAC,eAAK,OAAA,CAAA,MAAA,CAAC,CAAC,IAAI,0CAAE,EAAE,MAAK,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,MAAO,CAAA,EAAA,CAChE,CAAC;aACH;iBAAM;gBACL,IAAI,CAAC,UAAU,EAAE;oBACf,OAAO,EAAE,CAAC;iBACX;gBACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC;oBAC9C,IAAI,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE;oBACnC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,MAAO,EAAE;iBACvD,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aACtC;SACF;KAAA;IAEK,UAAU,CAAC,SAAiB,EAAE,QAAgC;;YAClE,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC/D,IAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,EAAE;gBACrB,OAAO,CAAC,KAAK,CAAC,gBAAgB,iCACzB,QAAQ,CAAC,OAAO,KACnB,MAAM,EAAE,UAAU,IAClB,CAAC;gBACH,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;aACrE;iBAAM;gBACL,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;aACrE;SACF;KAAA;IAEa,kBAAkB,CAAC,OAAwC;;;YACvE,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC;YACtD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpE,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;oBACzC,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,eAAe,EAAE,MAAA,OAAO,CAAC,eAAe,0CAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC1D,EAAE,EAAE,OAAO,CAAC,EAAE;iBACf,CAAC,CAAC;gBACH,IAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,EAAE;oBACrB,OAAO,CAAC,KAAK,CAAC,gBAAgB,iCAEvB,QAAQ,CAAC,OAAO,KACnB,MAAM,EAAE,UAAU,KAEpB,IAAI,CACL,CAAC;oBACF,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;iBACrE;aACF;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC1C,MAAM,WAAW,GAAwB,WAAW;sBAC/C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAyB;sBAChD,EAAE,CAAC;gBAEP,OAAO,CAAC,KAAK,CAAC,gBAAgB,iCAEtB,OAA2B,KAC/B,eAAe,EAAE,WAAW,CAAC,MAAM,IAAI,SAAS,EAChD,MAAM,EAAE,QAAQ,KAElB,IAAI,CACL,CAAC;gBACF,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;aACrE;;KACF;IAEa,kBAAkB,CAAC,YAA0B;;YACzD,QAAQ,YAAY,CAAC,SAAS;gBAC5B,KAAK,0BAA0B,EAAE;oBAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACpB,IAAI,IAAI,CAAC,mCAAmC,EAAE;4BAC5C,IAAI,CAAC,mCAAmC,CACtC,YAAY,EACZ,IAAI,CAAC,iBAAiB,CACvB,CAAC;yBACH;6BAAM;4BACL,MAAM,IAAI,CAAC,4BAA4B,CAAC,YAAY,CAAC,CAAC;yBACvD;qBACF,CAAA,CAAC,CAAC;oBACH,MAAM;iBACP;gBACD,KAAK,+BAA+B,EAAE;oBACpC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACpB,IAAI,IAAI,CAAC,uCAAuC,EAAE;4BAChD,IAAI,CAAC,uCAAuC,CAC1C,YAAY,EACZ,IAAI,CAAC,iBAAiB,CACvB,CAAC;yBACH;6BAAM;4BACL,MAAM,IAAI,CAAC,gCAAgC,CAAC,YAAY,CAAC,CAAC;yBAC3D;qBACF,CAAA,CAAC,CAAC;oBACH,MAAM;iBACP;gBACD,KAAK,mCAAmC,EAAE;oBACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACd,IAAI,IAAI,CAAC,2CAA2C,EAAE;4BACpD,IAAI,CAAC,2CAA2C,CAC9C,YAAY,EACZ,IAAI,CAAC,iBAAiB,CACvB,CAAC;yBACH;6BAAM;4BACL,IAAI,CAAC,oCAAoC,CAAC,YAAY,CAAC,CAAC;yBACzD;qBACF,CAAC,CAAC;iBACJ;aACF;SACF;KAAA;IAEO,oCAAoC,CAAC,YAA0B;QACrE,MAAM,oBAAoB,GAAG,YAAY,CAAC,KAAK,CAAC,OAAQ,CAAC,GAAG,CAAC;QAC7D,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;KAClD;IAEa,4BAA4B,CAAC,YAA0B;;YACnE,MAAM,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,CAAC;SACrD;KAAA;IAEa,gCAAgC,CAAC,YAA0B;;YACvE,MAAM,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,CAAC;SACrD;KAAA;IAEa,0BAA0B,CAAC,YAA0B;;;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,OAAO,CACvD,MAAA,YAAY,CAAC,KAAK,CAAC,OAAO,0CAAE,IAAK,EACjC,MAAA,YAAY,CAAC,KAAK,CAAC,OAAO,0CAAE,EAAE,CAC/B,CAAC;YACF,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBACxB,OAAO;gBACP,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;aAC3C,CAAC,CAAC;;KACJ;IAEO,qBAAqB,CAAC,GAAW;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC5D,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC1C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC,GAAG,KAAK,GAAG,EAAE;gBACrD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;aACtC;SACF;KACF;IAEO,2BAA2B,CAAC,OAAgB;QAClD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAClC,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBACd,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACpE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;oBAC5C,IAAI,IAAI,CAAC,iBAAiB,EAAE;wBAC1B,MAAK,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,QAAQ,EAAE,CAAA,CAAC;qBACpB;iBACF,CAAC,CAAC;aACJ,CAAC,CAAC;SACJ,CAAC,CACH,CAAC;QACF,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAClC,OAAO,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CACrE,CAAC;QACF,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAClC,OAAO,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CACrE,CAAC;QACF,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAClC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,CACxE,CAAC;QACF,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAClC,OAAO,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,KAC/B,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC,CACrC,CACF,CAAC;QACF,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAClC,OAAO,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,KAC/B,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC,CACrC,CACF,CAAC;QACF,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAClC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBACd,IAAI,aAA6B,CAAC;gBAClC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ;oBAC3D,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;iBAC/C,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC7B,OAAO;iBACR;gBACD,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBAEzD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CACpC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,CAC7C,CAAC;aACH,CAAC,CAAC;SACJ,CAAC,CACH,CAAC;KACH;IAEO,cAAc,CAAC,KAAY;QACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,CAAC;YAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CACrC,CAAC,CAAC,eAAK,OAAA,CAAC,CAAC,EAAE,MAAK,MAAA,KAAK,CAAC,OAAO,0CAAE,EAAE,CAAA,CAAA,EAAA,CAClC,CAAC;YACF,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;gBACxC,QAAQ,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;gBACvC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;aACvD;SACF,CAAC,CAAC;KACJ;IAEO,4BAA4B,CAAC,CAAQ;QAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;;YACd,IAAI,QAA0B,CAAC;YAC/B,IAAI,CAAC,sBAAsB;iBACxB,IAAI,CAAC,KAAK,EAAE,CAAC;iBACb,SAAS,CAAC,CAAC,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,eAAK,OAAA,CAAC,CAAC,EAAE,MAAK,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,0CAAE,EAAE,CAAA,CAAA,EAAA,CAAC,CAAC;YAC9D,IAAI,CAAC,OAAO,EAAE;gBACZ,OAAO;aACR;YACD,OAAO,CAAC,eAAe,qBAAQ,MAAA,CAAC,CAAC,OAAO,0CAAE,eAAe,CAAE,CAAC;YAC5D,OAAO,CAAC,eAAe,qBAAQ,MAAA,CAAC,CAAC,OAAO,0CAAE,eAAe,CAAE,CAAC;YAC5D,OAAO,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAA,MAAA,CAAC,CAAC,OAAO,0CAAE,gBAAgB,KAAI,EAAE,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,aAAa,GAAG,CAAC,IAAI,CAAA,MAAA,CAAC,CAAC,OAAO,0CAAE,aAAa,KAAI,EAAE,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;SACvD,CAAC,CAAC;KACJ;IAEO,aAAa,CAAC,OAAwB;QAC5C,uCACK,OAAO;;YAEV,SAAS,EAAE,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,EACjE,UAAU,EAAE,OAAO,CAAC,UAAU;kBAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;kBAC5B,IAAI,IAAI,EAAE,EACd,UAAU,EAAE,OAAO,CAAC,UAAU;kBAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;kBAC5B,IAAI,IAAI,EAAE,EACd,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,UAAU,IACpC;KACH;IAEO,eAAe,CACrB,OAAgE;QAEhE,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;KACzB;IAEO,uBAAuB,CAC7B,OAAgE;QAEhE,OAAO,OAAO,CAAC,UAAU,YAAY,IAAI,CAAC;KAC3C;IAEO,+BAA+B,CAAC,OAA4B;QAClE,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;SACR;QACD,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;KACtC;IAEa,aAAa;;YACzB,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,aAAa,CACpE,IAAI,CAAC,OAAQ,EACb,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,OAAO,CACb,CAAC;gBACF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAC3D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;gBAC1D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE;oBAChE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;iBACtC;gBACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,OAAQ,CAAC,KAAM,CAAC,CAAC;aAC3E;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACnC;SACF;KAAA;IAEO,qBAAqB,CAAC,OAAgB;QAC5C,OAAO,CAAC,EAAE,CAAC,CAAC,KAAY;YACtB,QAAQ,KAAK,CAAC,IAAI;gBAChB,KAAK,aAAa,EAAE;oBAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACd,IAAI,IAAI,CAAC,uBAAuB,EAAE;4BAChC,IAAI,CAAC,uBAAuB,CAC1B,KAAK,EACL,OAAO,EACP,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,iBAAiB,CACvB,CAAC;yBACH;6BAAM;4BACL,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;yBACvC;qBACF,CAAC,CAAC;oBACH,MAAM;iBACP;gBACD,KAAK,gBAAgB,EAAE;oBACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACd,IAAI,IAAI,CAAC,0BAA0B,EAAE;4BACnC,IAAI,CAAC,0BAA0B,CAC7B,KAAK,EACL,OAAO,EACP,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,iBAAiB,CACvB,CAAC;yBACH;6BAAM;4BACL,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;yBACjC;qBACF,CAAC,CAAC;oBACH,MAAM;iBACP;gBACD,KAAK,iBAAiB,EAAE;oBACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACd,IAAI,IAAI,CAAC,2BAA2B,EAAE;4BACpC,IAAI,CAAC,2BAA2B,CAC9B,KAAK,EACL,OAAO,EACP,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,iBAAiB,CACvB,CAAC;yBACH;6BAAM;4BACL,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;yBAClC;qBACF,CAAC,CAAC;oBACH,MAAM;iBACP;gBACD,KAAK,iBAAiB,EAAE;oBACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACd,IAAI,IAAI,CAAC,2BAA2B,EAAE;4BACpC,IAAI,CAAC,2BAA2B,CAC9B,KAAK,EACL,OAAO,EACP,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,iBAAiB,CACvB,CAAC;yBACH;6BAAM;4BACL,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;yBAC3C;qBACF,CAAC,CAAC;oBACH,MAAM;iBACP;gBACD,KAAK,iBAAiB,EAAE;oBACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACd,IAAI,IAAI,CAAC,2BAA2B,EAAE;4BACpC,IAAI,CAAC,2BAA2B,CAC9B,KAAK,EACL,OAAO,EACP,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,iBAAiB,CACvB,CAAC;yBACH;6BAAM;4BACL,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;yBACjC;qBACF,CAAC,CAAC;oBACH,MAAM;iBACP;gBACD,KAAK,mBAAmB,EAAE;oBACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wBACd,IAAI,IAAI,CAAC,6BAA6B,EAAE;4BACtC,IAAI,CAAC,6BAA6B,CAChC,KAAK,EACL,OAAO,EACP,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,iBAAiB,CACvB,CAAC;yBACH;6BAAM;4BACL,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;yBACnC;qBACF,CAAC,CAAC;oBACH,MAAM;iBACP;aACF;SACF,CAAC,CAAC;KACJ;IAEO,gBAAgB,CAAC,CAAQ,EAAE,OAAgB;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;KACxD;IAEO,mBAAmB,CAAC,KAAY;QACtC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC;KAChD;IAEO,oBAAoB,CAAC,KAAY;QACvC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC;KAChD;IAEO,oBAAoB,CAAC,KAAY,EAAE,OAAgB;QACzD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE;YACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MACd,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CACvD,CAAC;SACH;KACF;IAEO,mBAAmB,CAAC,KAAY;;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAC1C,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,OAAQ,CAAC,GAAG,CACpC,CAAC;QACF,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;YACvB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAA,MAAA,KAAK,CAAC,OAAO,0CAAE,GAAG,OAAK,MAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,0CAAE,GAAG,CAAA,EAAE;gBACpE,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC;gBACtD,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC7B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACzC;SACF;KACF;IAEO,qBAAqB,CAAC,KAAY;;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAC1C,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,OAAQ,CAAC,GAAG,CACpC,CAAC;QACF,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;YACvB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;YAChD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAA,MAAA,KAAK,CAAC,OAAO,0CAAE,GAAG,OAAK,MAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,0CAAE,GAAG,CAAA,EAAE;gBACpE,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAG,CAAC;gBACtD,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC5C;SACF;KACF;IAED,IAAY,QAAQ;QAClB,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;KAC9C;IAED,IAAY,iBAAiB;;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,KAAK,CAAC;SACd;QACD,MAAM,WAAW,GAAG,MAAA,OAAO,CAAC,IAAI,0CAAE,gBAA4B,CAAC;QAC/D,OAAO,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;KAClD;;2GAhsBU,cAAc;+GAAd,cAAc,cAFb,MAAM;2FAEP,cAAc;kBAH1B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;MCfY,YAAY;IA0BvB;QAzBA,WAAM,GAAG,IAAI,eAAe,CAAQ,OAAO,CAAC,CAAC;QAGrC,6BAAwB,GAAG;YACjC,mBAAmB,EAAE,SAAS;YAC9B,qBAAqB,EAAE,SAAS;YAChC,SAAS,EAAE,SAAS;YACpB,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE,SAAS;YACrB,qBAAqB,EAAE,SAAS;YAChC,eAAe,EAAE,SAAS;YAC1B,QAAQ,EAAE,SAAS;YACnB,kBAAkB,EAAE,SAAS;YAC7B,gBAAgB,EAAE,SAAS;YAC3B,gBAAgB,EAAE,SAAS;YAC3B,WAAW,EAAE,WAAW;YACxB,gBAAgB,EAAE,WAAW;YAC7B,eAAe,EAAE,WAAW;YAC5B,6BAA6B,EAAE,SAAS;YACxC,eAAe,EAAE,aAAa;YAC9B,SAAS,EAAE,SAAS;YACpB,eAAe,EAAE,SAAS;YAC1B,cAAc,EAAE,SAAS;SAC1B,CAAC;QAGA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK;YAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB;kDAC1C,IAAI,CAAC,wBAAwB,GAAK,IAAI,CAAC,wBAAwB,IACpE,IAAI,CAAC,wBAAwB,CAAC;YAClC,MAAM,cAAc,GAAG,IAAI,CAAC,yBAAyB;kBACjD,IAAI,CAAC,yBAAyB;kBAC9B,EAAE,CAAC;YACP,IAAI,KAAK,KAAK,MAAM,EAAE;gBACpB,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;gBACrC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;aAClC;iBAAM;gBACL,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;gBACpC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;aACnC;SACF,CAAC,CAAC;KACJ;IAED,IAAI,yBAAyB;QAC3B,OAAO,IAAI,CAAC,0BAA0B,CAAC;KACxC;IAED,IAAI,yBAAyB,CAC3B,SAAgD;QAEhD,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,CAAC;QACrD,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QACpC,IAAI,CAAC,0BAA0B,GAAG,SAAS,CAAC;KAC7C;IAED,IAAI,wBAAwB;QAC1B,OAAO,IAAI,CAAC,yBAAyB,CAAC;KACvC;IAED,IAAI,wBAAwB,CAC1B,SAAgD;QAEhD,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC;QACpD,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QACpC,IAAI,CAAC,yBAAyB,GAAG,SAAS,CAAC;KAC5C;IAEO,eAAe,CAAC,SAAgD;QACtE,IAAI,CAAC,SAAS,EAAE;YACd,OAAO;SACR;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KACjC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CACtD,CAAC;KACH;IAEO,YAAY,CAAC,SAAgD;QACnE,IAAI,CAAC,SAAS,EAAE;YACd,OAAO;SACR;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KACjC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAChE,CAAC;KACH;;yGApFU,YAAY;6GAAZ,YAAY,cAFX,MAAM;2FAEP,YAAY;kBAHxB,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;MCPY,WAAW,GAAG,CAAC,IAAU;;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC7E;;MCDa,iBAAiB,GAAG,CAAC,UAAsB;IACtD,QACE,UAAU,CAAC,IAAI,KAAK,OAAO;QAC3B,CAAC,UAAU,CAAC,UAAU;QACtB,CAAC,UAAU,CAAC,aAAa,EACzB;AACJ;;MCIa,iBAAiB;IAS5B,YACU,cAA8B,EAC9B,mBAAwC;QADxC,mBAAc,GAAd,cAAc,CAAgB;QAC9B,wBAAmB,GAAnB,mBAAmB,CAAqB;QAR1C,6CAAwC,GAC9C,IAAI,eAAe,CAAS,CAAC,CAAC,CAAC;QACzB,6BAAwB,GAAG,IAAI,eAAe,CACpD,EAAE,CACH,CAAC;QAMA,IAAI,CAAC,kCAAkC;YACrC,IAAI,CAAC,wCAAwC,CAAC,YAAY,EAAE,CAAC;QAC/D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,EAAE,CAAC;KACxE;IAED,sBAAsB;QACpB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACxC;IAEK,aAAa,CAAC,QAAyB;;YAC3C,IAAI,CAAC,QAAQ,EAAE;gBACb,OAAO;aACR;YACD,MAAM,UAAU,GAAW,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAW,EAAE,CAAC;YAE7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI;gBAChC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE;oBACrB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACvB;qBAAM;oBACL,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACtB;aACF,CAAC,CAAC;YACH,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,UAAU,GAAG;gBACjB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;oBAC3B,IAAI;oBACJ,KAAK,EAAE,WAA0B;oBACjC,IAAI,EAAE,OAAkB;iBACzB,CAAC,CAAC;gBACH,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;oBAC1B,IAAI;oBACJ,KAAK,EAAE,WAA0B;oBACjC,IAAI,EAAE,MAAgB;iBACvB,CAAC,CAAC;aACJ,CAAC;YACF,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;gBACjC,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE;gBAC3C,GAAG,UAAU;aACd,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;SAC1C;KAAA;IAEK,qBAAqB,CAAC,IAAU;;YACpC,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC;YACnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC9D,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO;aACR;YACD,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;YAC3B,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;YAC3D,MAAM,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;SACxC;KAAA;IAEK,gBAAgB,CAAC,MAAwB;;YAC7C,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC;YACnE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;gBAC9B,IAAI;oBACF,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;oBACnD,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;iBAChE;gBAAC,OAAO,KAAK,EAAE;oBACd,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,sCAAsC,CACvC,CAAC;iBACH;aACF;iBAAM;gBACL,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;aAChE;YACD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;SAC5D;KAAA;IAED,gBAAgB;QACd,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC;QACnE,OAAO,iBAAiB;aACrB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC;;YACL,MAAM,UAAU,GAAe;gBAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC;YACF,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE;gBACtB,UAAU,CAAC,QAAQ,GAAG,MAAA,CAAC,CAAC,IAAI,0CAAE,IAAI,CAAC;gBACnC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC;aAC9B;iBAAM;gBACL,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC;gBAC7B,UAAU,CAAC,KAAK,GAAG,MAAA,CAAC,CAAC,IAAI,0CAAE,IAAI,CAAC;gBAChC,UAAU,CAAC,SAAS,GAAG,MAAA,CAAC,CAAC,IAAI,0CAAE,IAAI,CAAC;aACrC;YAED,OAAO,UAAU,CAAC;SACnB,CAAC,CAAC;KACN;IAED,qBAAqB,CAAC,WAAyB;QAC7C,MAAM,iBAAiB,GAAuB,EAAE,CAAC;QACjD,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU;YAC7B,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE;gBACjC,iBAAiB,CAAC,IAAI,CAAC;oBACrB,GAAG,GAAG,UAAU,CAAC,OAAO;wBACtB,UAAU,CAAC,SAAS;wBACpB,UAAU,CAAC,SAAS,CAAW;oBACjC,KAAK,EAAE,SAAS;oBAChB,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE;wBACJ,IAAI,EAAE,UAAU,CAAC,QAAQ;qBAClB;iBACV,CAAC,CAAC;aACJ;iBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE;gBACrC,iBAAiB,CAAC,IAAI,CAAC;oBACrB,GAAG,EAAE,UAAU,CAAC,SAAS;oBACzB,KAAK,EAAE,SAAS;oBAChB,IAAI,EAAE;wBACJ,IAAI,EAAE,UAAU,CAAC,KAAK;wBACtB,IAAI,EAAE,UAAU,CAAC,SAAS;qBACnB;oBACT,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;aACJ;SACF,CAAC,CAAC;QAEH,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;YAChC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;gBACjC,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE;gBAC3C,GAAG,iBAAiB;aACrB,CAAC,CAAC;SACJ;KACF;IAEO,aAAa,CAAC,IAAU;QAC9B,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK;;YACpB,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC;YACnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO;aACR;YACD,MAAM,CAAC,UAAU,GAAG,CAAA,MAAA,KAAK,CAAC,MAAM,0CAAE,MAAM,KAAI,SAAS,CAAC;YACtD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;SAC5D,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,IAAY,CAAC,CAAC;KACpC;IAEa,iBAAiB,CAAC,OAA2B;;YACzD,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC;YACnE,IAAI,CAAC,wCAAwC,CAAC,IAAI,CAChD,IAAI,CAAC,wCAAwC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAC7D,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACpE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBACf,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC1E,IAAI,CAAC,MAAM,EAAE;oBACX,IAAI,CAAC,CAAC,GAAG,EAAE;wBACT,KAAK,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;qBAC9C;oBACD,OAAO;iBACR;gBACD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBACvB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;gBACnB,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE;oBAC5B,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,MAAM,CAAC,IAAI,KAAK,OAAO;0BACnB,kCAAkC;0BAClC,iCAAiC,CACtC,CAAC;iBACH;aACF,CAAC,CAAC;YACH,IAAI,CAAC,wCAAwC,CAAC,IAAI,CAChD,IAAI,CAAC,wCAAwC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAC7D,CAAC;YACF,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;SAC5D;KAAA;;8GAtLU,iBAAiB;kHAAjB,iBAAiB,cAFhB,MAAM;2FAEP,iBAAiB;kBAH7B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;ACXM,MAAM,EAAE,GAAG;IAChB,UAAU,EAAE;QACV,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,cAAc;QAC9B,MAAM,EAAE,QAAQ;QAChB,iBAAiB,EAAE,iBAAiB;QACpC,KAAK,EAAE,OAAO;QACd,oBAAoB,EAAE,oBAAoB;QAC1C,mBAAmB,EAAE,mBAAmB;QACxC,yCAAyC,EACvC,yCAAyC;QAC3C,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,WAAW;QACtB,cAAc,EAAE,cAAc;QAC9B,6BAA6B,EAAE,6BAA6B;QAC5D,gBAAgB,EAAE,gBAAgB;QAClC,kBAAkB,EAAE,kBAAkB;QACtC,mBAAmB,EAAE,mBAAmB;QACxC,0DAA0D,EACxD,0DAA0D;QAC5D,wBAAwB,EAAE,wBAAwB;QAClD,yBAAyB,EAAE,yBAAyB;QACpD,uBAAuB,EAAE,uBAAuB;QAChD,4BAA4B,EAAE,4BAA4B;QAC1D,2BAA2B,EAAE,2BAA2B;QACxD,sBAAsB,EAAE,sBAAsB;QAC9C,uBAAuB,EAAE,uBAAuB;QAChD,2BAA2B,EAAE,2BAA2B;QACxD,gBAAgB,EAAE,gBAAgB;QAClC,2BAA2B,EAAE,2BAA2B;QACxD,IAAI,EAAE,MAAM;QACZ,gBAAgB,EAAE,gBAAgB;QAClC,+BAA+B,EAAE,+BAA+B;QAChE,iBAAiB,EAAE,iBAAiB;QACpC,uCAAuC,EACrC,uCAAuC;QACzC,gBAAgB,EAAE,gBAAgB;QAClC,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,eAAe,EAAE,eAAe;QAChC,kBAAkB,EAAE,kBAAkB;QACtC,gBAAgB,EAAE,gBAAgB;QAClC,qBAAqB,EAAE,qBAAqB;QAC5C,mBAAmB,EAAE,mBAAmB;QACxC,iBAAiB,EAAE,iBAAiB;QACpC,iBAAiB,EAAE,iBAAiB;QACpC,GAAG,EAAE,KAAK;QACV,WAAW,EAAE,WAAW;QACxB,KAAK,EAAE,OAAO;QACd,kBAAkB,EAAE,kBAAkB;QACtC,MAAM,EAAE,QAAQ;QAChB,cAAc,EAAE,cAAc;QAC9B,IAAI,EAAE,MAAM;QACZ,6BAA6B,EAAE,6BAA6B;QAC5D,YAAY,EAAE,YAAY;QAC1B,cAAc,EAAE,cAAc;QAC9B,uBAAuB,EAAE,uBAAuB;QAChD,6BAA6B,EAAE,6BAA6B;QAC5D,MAAM,EAAE,QAAQ;QAChB,mBAAmB,EAAE,mBAAmB;QACxC,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO;QACd,0CAA0C,EACxC,0CAA0C;QAC5C,gCAAgC,EAAE,gCAAgC;QAClE,4CAA4C,EAC1C,4CAA4C;QAC9C,IAAI,EAAE,MAAM;QACZ,qCAAqC,EACnC,qCAAqC;QACvC,oDAAoD,EAClD,oDAAoD;QACtD,+CAA+C,EAC7C,+CAA+C;QACjD,sCAAsC,EACpC,sCAAsC;QACxC,uBAAuB,EAAE,uBAAuB;QAChD,2BAA2B,EAAE,2BAA2B;QACxD,0BAA0B,EAAE,0BAA0B;QACtD,2BAA2B,EAAE,2BAA2B;QACxD,6BAA6B,EAAE,6BAA6B;QAC5D,2BAA2B,EAAE,2BAA2B;QACxD,kBAAkB,EAAE,kBAAkB;QACtC,kBAAkB,EAAE,kBAAkB;QACtC,WAAW,EAAE,WAAW;QACxB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,SAAS;QACf,mDAAmD,EACjD,mDAAmD;QACrD,yCAAyC,EACvC,yCAAyC;QAC3C,iCAAiC,EAAE,iCAAiC;KACrE;CACF;;MCvFY,iBAAiB;IAC5B,YAAoB,eAAiC;QAAjC,oBAAe,GAAf,eAAe,CAAkB;KAAI;IAEzD,cAAc,CAAC,IAAI,GAAG,IAAI,EAAE,SAAqC;QAC/D,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE;YACrC,IAAI,CAAC,eAAe,CAAC,WAAW,GAAG,IAAI,CAAC;SACzC;QACD,IAAI,CAAC,eAAe,CAAC,cAAc,CACjC,IAAI,EACJ,EAAE,UAAU,kCAAO,EAAE,CAAC,UAAU,GAAK,SAAS,CAAE,EAAE,EAClD,IAAI,CACL,CAAC;KACH;;8GAZU,iBAAiB;kHAAjB,iBAAiB,cAFhB,MAAM;2FAEP,iBAAiB;kBAH7B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;MCCY,eAAe;IAO1B;QAJS,SAAI,GAAG,EAAE,CAAC;QACnB,aAAQ,GAAG,KAAK,CAAC;QACjB,YAAO,GAAG,KAAK,CAAC;KAEA;IAEhB,IAAI,QAAQ;;QACV,OAAO,CAAC,CAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KAChD;;4GAXU,eAAe;gGAAf,eAAe,mHCP5B,m4BAkCA;2FD3Ba,eAAe;kBAL3B,SAAS;mBAAC;oBACT,QAAQ,EAAE,eAAe;oBACzB,WAAW,EAAE,yBAAyB;oBACtC,SAAS,EAAE,CAAC,yBAAyB,CAAC;iBACvC;0EAEU,IAAI;sBAAZ,KAAK;gBACG,QAAQ;sBAAhB,KAAK;gBACG,IAAI;sBAAZ,KAAK;;;MEQK,aAAa;IAGxB,iBAAgB;;0GAHL,aAAa;8FAAb,aAAa,2FClB1B,6uPA+KA;2FD7Ja,aAAa;kBALzB,SAAS;mBAAC;oBACT,QAAQ,EAAE,aAAa;oBACvB,WAAW,EAAE,uBAAuB;oBACpC,MAAM,EAAE,EAAE;iBACX;0EAEU,IAAI;sBAAZ,KAAK;gBACG,IAAI;sBAAZ,KAAK;;;MEbK,yBAAyB;IAIpC;QAHS,SAAI,GAAG,EAAE,CAAC;QACV,UAAK,GAAG,SAAS,CAAC;KAEX;;sHAJL,yBAAyB;0GAAzB,yBAAyB,0GCPtC,i4BA2BA;2FDpBa,yBAAyB;kBALrC,SAAS;mBAAC;oBACT,QAAQ,EAAE,0BAA0B;oBACpC,WAAW,EAAE,oCAAoC;oBACjD,MAAM,EAAE,EAAE;iBACX;0EAEU,IAAI;sBAAZ,KAAK;gBACG,KAAK;sBAAb,KAAK;;;MENK,sBAAsB,GAAG,IAAI,cAAc,CAEtD,wBAAwB;;MCiBb,iBAAiB;IAgB5B,YAAmB,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAN5C,UAAK,GAAG,EAAE,CAAC;QACD,gBAAW,GAAG,IAAI,YAAY,EAAU,CAAC;QACzC,SAAI,GAAG,IAAI,YAAY,EAAQ,CAAC;QAChC,iBAAY,GAAG,IAAI,YAAY,EAAkB,CAAC;QAC7D,kBAAa,GAAmB,EAAE,CAAC;QACnC,wBAAmB,GAAoB,EAAE,CAAC;KACO;IAEzD,WAAW,CAAC,OAAsB;QAChC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,OAAO;SACR;QACD,IAAI,OAAO,CAAC,YAAY,EAAE;YACxB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACnD,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,KAAK,KACrD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAC7B,CACF,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,KAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CACtB,CACF,CAAC;gBACF,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE;oBAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,KACtD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAC9B,CACF,CAAC;iBACH;gBACD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBACxE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,+BAA+B;oBACxD,IAAI,CAAC,+BAA+B,CAAC;gBACvC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,+BAA+B;oBACxD,IAAI,CAAC,+BAA+B,CAAC;gBACvC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;gBAC5D,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;aAC/C;SACF;QACD,IAAI,OAAO,CAAC,kBAAkB,EAAE;YAC9B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;SACzE;QACD,IAAI,OAAO,CAAC,+BAA+B,EAAE;YAC3C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,+BAA+B;gBACxD,IAAI,CAAC,+BAA+B,CAAC;SACxC;QACD,IAAI,OAAO,CAAC,+BAA+B,EAAE;YAC3C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,+BAA+B;gBACxD,IAAI,CAAC,+BAA+B,CAAC;SACxC;QACD,IAAI,OAAO,CAAC,YAAY,EAAE;YACxB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;SAC7D;QACD,IAAI,OAAO,CAAC,KAAK,EAAE;YACjB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;SAC/C;;QAED,IAAI,kBAAkB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC,MAAM,kBAAkB,mCAAQ,kBAAkB,GAAK,CAAC,CAAE,CAAC,CAC9D,CAAC;;QAEF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAC3D,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;KAC/B;;8GA7EU,iBAAiB;kGAAjB,iBAAiB;2FAAjB,iBAAiB;kBAH7B,SAAS;mBAAC;oBACT,QAAQ,EAAE,kBAAkB;iBAC7B;uGAEU,YAAY;sBAApB,KAAK;gBACG,kBAAkB;sBAA1B,KAAK;gBACG,+BAA+B;sBAAvC,KAAK;gBAGG,YAAY;sBAApB,KAAK;gBACG,+BAA+B;sBAAvC,KAAK;gBAGG,KAAK;sBAAb,KAAK;gBACa,WAAW;sBAA7B,MAAM;gBACY,IAAI;sBAAtB,MAAM;gBACY,YAAY;sBAA9B,MAAM;;;MC1BI,yBAAyB;IAgBpC;QAfA,wBAAmB,GAAwB,IAAI,CAAC;QAChD,uBAAkB,GAAwB,IAAI,CAAC;QAW/C,gCAA2B,GAAwB,IAAI,CAAC;QACxD,iBAAY,GAA0C,SAAS,CAAC;KAEhD;;sHAhBL,yBAAyB;0HAAzB,yBAAyB,cAFxB,MAAM;2FAEP,yBAAyB;kBAHrC,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;MCEY,8BAA8B;IAGzC,YAAoB,iBAAoC;QAApC,sBAAiB,GAAjB,iBAAiB,CAAmB;QACtD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC;KACrE;IAEK,qBAAqB,CAAC,IAAU;;YACpC,MAAM,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;SAC1D;KAAA;IAEK,gBAAgB,CAAC,MAAwB;;YAC7C,MAAM,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;SACvD;KAAA;IAED,WAAW,CAAC,CAAS,EAAE,IAAsB;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC;KAClB;;2HAjBU,8BAA8B;+GAA9B,8BAA8B,sECV3C,muIAyHA;2FD/Ga,8BAA8B;kBAL1C,SAAS;mBAAC;oBACT,QAAQ,EAAE,gCAAgC;oBAC1C,WAAW,EAAE,0CAA0C;oBACvD,MAAM,EAAE,EAAE;iBACX;;;MEkCY,qBAAqB;IAkChC,YACU,cAA8B,EAC9B,mBAAwC,EACxC,iBAAoC,EACpC,aAAwC,EAExC,YAAqC,EACrC,wBAAkD,EAClD,KAAwB,EACxB,UAA6B;QAR7B,mBAAc,GAAd,cAAc,CAAgB;QAC9B,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,kBAAa,GAAb,aAAa,CAA2B;QAExC,iBAAY,GAAZ,YAAY,CAAyB;QACrC,6BAAwB,GAAxB,wBAAwB,CAA0B;QAClD,UAAK,GAAL,KAAK,CAAmB;QACxB,eAAU,GAAV,UAAU,CAAmB;QAzBpB,kBAAa,GAAG,IAAI,YAAY,EAAQ,CAAC;QAK5D,kBAAa,GAAG,EAAE,CAAC;QAEnB,mBAAc,GAAmB,EAAE,CAAC;QAI5B,kBAAa,GAAmB,EAAE,CAAC;QAEnC,iBAAY,GAAG,KAAK,CAAC;QAc3B,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,iBAAiB,CAAC,kCAAkC,CAAC,SAAS,CACjE,CAAC,OAAO;YACN,IAAI,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBAC1C,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;aACnC;SACF,CACF,CACF,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,OAAO;;YACnD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,0CAAE,gBAA4B,CAAC;YACjE,IAAI,YAAY,EAAE;gBAChB,IAAI,CAAC,sBAAsB;oBACzB,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9D,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnE,IAAI,IAAI,CAAC,YAAY,EAAE;oBACrB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;oBAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;iBACrB;aACF;SACF,CAAC,CACH,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CACpC,CAAC,WAAW,MAAM,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,CAClD,CACF,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC;QACpE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC;QAClE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;QAC9D,IAAI,CAAC,2BAA2B;YAC9B,IAAI,CAAC,aAAa,CAAC,2BAA2B,CAAC;QACjD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;QAChE,IAAI,CAAC,+BAA+B;YAClC,IAAI,CAAC,aAAa,CAAC,+BAA+B,CAAC;QACrD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;QACpD,IAAI,CAAC,+BAA+B;YAClC,IAAI,CAAC,aAAa,CAAC,+BAA+B,CAAC;KACtD;IAED,eAAe;QACb,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;IAED,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,OAAO,EAAE;YACnB,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAC1C,IAAI,CAAC,OAAQ,CAAC,WAAW,IAAI,EAAE,CAChC,CAAC;gBACF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;aAC/C;SACF;QACD,IAAI,OAAO,CAAC,mBAAmB,EAAE;YAC/B,IAAI,CAAC,aAAa,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;SACnE;QACD,IAAI,OAAO,CAAC,iBAAiB,EAAE;YAC7B,IAAI,CAAC,aAAa,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;SAC/D;QACD,IAAI,OAAO,CAAC,2BAA2B,EAAE;YACvC,IAAI,CAAC,aAAa,CAAC,2BAA2B;gBAC5C,IAAI,CAAC,2BAA2B,CAAC;SACpC;QACD,IAAI,OAAO,CAAC,kBAAkB,EAAE;YAC9B,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;SACjE;QACD,IAAI,OAAO,CAAC,+BAA+B,EAAE;YAC3C,IAAI,CAAC,aAAa,CAAC,+BAA+B;gBAChD,IAAI,CAAC,+BAA+B,CAAC;SACxC;QACD,IAAI,OAAO,CAAC,+BAA+B,EAAE;YAC3C,IAAI,CAAC,aAAa,CAAC,+BAA+B;gBAChD,IAAI,CAAC,+BAA+B,CAAC;SACxC;QACD,IAAI,OAAO,CAAC,YAAY,EAAE;YACxB,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;SACrD;KACF;IAED,WAAW;QACT,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;KACpD;IAEK,WAAW;;YACf,IAAI,iCAA0C,CAAC;YAC/C,IAAI,CAAC,iBAAiB,CAAC,kCAAkC;iBACtD,IAAI,CAAC,KAAK,EAAE,CAAC;iBACb,SAAS,CAAC,CAAC,OAAO,MAAM,iCAAiC,GAAG,OAAO,CAAC,CAAC,CAAC;YACzE,IAAI,iCAAiC,GAAG,CAAC,EAAE;gBACzC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;oBAC1B,IAAI,CAAC,gBAAgB;wBACnB,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,qDAAqD,CACtD,CAAC;iBACL;gBACD,OAAO;aACR;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;YAChC,IAAI,CAAC,IAAI,KAAK,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;gBACvD,OAAO;aACR;YACD,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBAC5C,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,8DAA8D,CAC/D,CAAC;gBACF,OAAO;aACR;YACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;aACzB;YACD,IAAI;gBACF,OAAO,IAAI,CAAC,QAAQ;sBAChB,IAAI,CAAC,cAAc,CAAC,aAAa,iCAC5B,IAAI,CAAC,OAAQ,KAChB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,IACxB;sBACF,IAAI,CAAC,cAAc,CAAC,WAAW,CAC7B,IAAI,EACJ,WAAW,EACX,IAAI,CAAC,cAAc,CACpB,CAAC,CAAC;gBACP,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAClB,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC;iBACjD;aACF;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjB,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,wCAAwC,CACzC,CAAC;iBACH;aACF;SACF;KAAA;IAED,IAAI,aAAa;QACf,OAAO,qDAAqD,CAAC,IAAI,CAC/D,IAAI,CAAC,aAAa,CACnB,CAAC;KACH;IAED,IAAI,MAAM;;QACR,OAAO,IAAI,CAAC,iBAAiB,GAAG,MAAA,IAAI,CAAC,iBAAiB,0CAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;KACxE;IAEK,aAAa,CAAC,QAAyB;;YAC3C,IAAI,EAAE,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,EAAE;gBAC/C,OAAO;aACR;YACD,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,cAAc,EAAE,CAAC;SACvB;KAAA;IAEO,cAAc;QACpB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE,CAAC;KACzC;IAED,IAAY,QAAQ;QAClB,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;KACvB;IAEO,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACrE,OAAO;SACR;QACD,MAAM,gBAAgB,GACpB,IAAI,CAAC,wBAAwB,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3E,IAAI,CAAC,WAAW;YACd,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,eAAe,CAClD,gBAAgB,CACjB,CAAC;QACJ,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;KAC5B;IAEa,mBAAmB,CAAC,QAAyB;;YACzD,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBACvC,OAAO,IAAI,CAAC;aACb;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrB,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;aACxC;YACD,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;gBAC7B,IAAI,mBAA4B,CAAC;gBACjC,IAAI,kBAA2B,CAAC;gBAChC,IAAI,sBAA+B,CAAC;gBACpC,IAAI,qBAA8B,CAAC;gBACnC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE;oBAClB,mBAAmB;wBACjB,CAAC,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,mBAAmB,0CAAE,uBAAuB,0CAAE,IAAI,CACpE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC9B,CAAA,CAAC;oBACJ,kBAAkB;wBAChB,CAAC,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,mBAAmB,0CAAE,kBAAkB,0CAAE,IAAI,CAC/D,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAC1B,CAAA,CAAC;oBACJ,sBAAsB;wBACpB,CAAC,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,mBAAmB,0CAAE,uBAAuB,0CAC5D,MAAM,CAAA;4BACV,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,mBAAmB,0CAAE,uBAAuB,0CAAE,IAAI,CACnE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC9B,CAAA,CAAC;oBACJ,qBAAqB;wBACnB,CAAC,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,mBAAmB,0CAAE,kBAAkB,0CAAE,MAAM,CAAA;4BACnE,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,mBAAmB,0CAAE,kBAAkB,0CAAE,IAAI,CAC9D,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAC1B,CAAA,CAAC;iBACL;qBAAM;oBACL,mBAAmB;wBACjB,CAAC,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,0CAAE,uBAAuB,0CAAE,IAAI,CACnE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC9B,CAAA,CAAC;oBACJ,kBAAkB;wBAChB,CAAC,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,0CAAE,kBAAkB,0CAAE,IAAI,CAC9D,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAC1B,CAAA,CAAC;oBACJ,sBAAsB;wBACpB,CAAC,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,0CAAE,uBAAuB,0CAC3D,MAAM,CAAA;4BACV,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,0CAAE,uBAAuB,0CAAE,IAAI,CAClE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC9B,CAAA,CAAC;oBACJ,qBAAqB;wBACnB,CAAC,EAAC,MAAA,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,0CAAE,kBAAkB,0CAAE,MAAM,CAAA;4BAClE,EAAC,OAAA,OAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,kBAAkB,4CAAE,kBAAkB,4CAAE,IAAI,CAC7D,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAC1B,CAAA,CAAC;iBACL;gBACD,IACE,mBAAmB;oBACnB,kBAAkB;oBAClB,sBAAsB;oBACtB,qBAAqB,EACrB;oBACA,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,4CAA4C,EAC5C,SAAS,EACT,SAAS,EACT,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CACjB,CAAC;oBACF,OAAO,GAAG,KAAK,CAAC;iBACjB;aACF,CAAC,CAAC;YACH,OAAO,OAAO,CAAC;SAChB;KAAA;;kHAzSU,qBAAqB,iJAuCtB,sBAAsB;sGAvCrB,qBAAqB,4dAFrB,CAAC,iBAAiB,CAAC,mKA6BnB,iBAAiB,qECtE9B,4+EAwEA;2FD7Ba,qBAAqB;kBANjC,SAAS;mBAAC;oBACT,QAAQ,EAAE,sBAAsB;oBAChC,WAAW,EAAE,gCAAgC;oBAC7C,MAAM,EAAE,EAAE;oBACV,SAAS,EAAE,CAAC,iBAAiB,CAAC;iBAC/B;;0BAwCI,MAAM;2BAAC,sBAAsB;gJApCvB,mBAAmB;sBAA3B,KAAK;gBACG,kBAAkB;sBAA1B,KAAK;gBACG,YAAY;sBAApB,KAAK;gBACG,+BAA+B;sBAAvC,KAAK;gBAGG,+BAA+B;sBAAvC,KAAK;gBAMG,iBAAiB;sBAAzB,KAAK;gBACG,2BAA2B;sBAAnC,KAAK;gBACG,OAAO;sBAAf,KAAK;gBACa,aAAa;sBAA/B,MAAM;gBAQyB,SAAS;sBAAxC,SAAS;uBAAC,WAAW;gBAEd,cAAc;sBADrB,SAAS;uBAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;MEtDpC,cAAc;IAKzB;QAJS,WAAM,GAAG,KAAK,CAAC;QACL,iBAAY,GAAG,IAAI,YAAY,EAAW,CAAC;QA2BtD,qBAAgB,GAAG,CAAC,KAAoB;YAC9C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;gBAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;SACF,CAAC;QAEM,yBAAoB,GAAG;YAC7B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SAC5D,CAAC;QAEM,0BAAqB,GAAG,CAAC,KAAY;;YAC3C,IAAI,EAAC,MAAA,IAAI,CAAC,OAAO,0CAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,CAAA,EAAE;gBAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;SACF,CAAC;KAtCc;IAEhB,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,MAAM,EAAE;YAClB,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACxD,UAAU,CACR,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,EAClE,CAAC,CACF,CAAC;aACH;iBAAM;gBACL,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACjC,IAAI,CAAC,oBAAoB,EAAE,CAAC;aAC7B;SACF;KACF;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,oBAAoB,EAAE,CAAC;KAC7B;IAkBO,yBAAyB;QAC/B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;KACjE;;2GA/CU,cAAc;+FAAd,cAAc,sPChB3B,kcAkBA;2FDFa,cAAc;kBAL1B,SAAS;mBAAC;oBACT,QAAQ,EAAE,cAAc;oBACxB,WAAW,EAAE,wBAAwB;oBACrC,MAAM,EAAE,EAAE;iBACX;0EAEU,MAAM;sBAAd,KAAK;gBACa,YAAY;sBAA9B,MAAM;gBACuB,OAAO;sBAApC,SAAS;uBAAC,SAAS;;;MEXT,qBAAqB;IAGhC,iBAAgB;;kHAHL,qBAAqB;sGAArB,qBAAqB,qFCRlC,0JAMA;2FDEa,qBAAqB;kBALjC,SAAS;mBAAC;oBACT,QAAQ,EAAE,qBAAqB;oBAC/B,WAAW,EAAE,+BAA+B;oBAC5C,MAAM,EAAE,EAAE;iBACX;0EAEU,IAAI;sBAAZ,KAAK;;;MEGK,yBAAyB;IAGpC,YAAoB,mBAAwC;QAAxC,wBAAmB,GAAnB,mBAAmB,CAAqB;QAC1D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC;KAC/D;IAED,WAAW,CAAC,CAAS,EAAE,IAAyB;QAC9C,OAAO,IAAI,CAAC;KACb;;sHATU,yBAAyB;0GAAzB,yBAAyB,gECZtC,sWASA;2FDGa,yBAAyB;kBALrC,SAAS;mBAAC;oBACT,QAAQ,EAAE,0BAA0B;oBACpC,WAAW,EAAE,oCAAoC;oBACjD,MAAM,EAAE,EAAE;iBACX;;;MEoBY,0BAA0B;IAarC,YACU,iBAAoC,EACpC,mBAAwC,EACxC,cAA8B;QAF9B,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,mBAAc,GAAd,cAAc,CAAgB;QAd/B,WAAM,GAAG,KAAK,CAAC;QACf,WAAM,GAAG,KAAK,CAAC;QAEf,mBAAc,GAAqB,EAAE,CAAC;QAC5B,0BAAqB,GAAG,IAAI,YAAY,EAAU,CAAC;QACnD,cAAS,GAAG,IAAI,YAAY,EAAW,CAAC;QAC3D,oBAAe,GAAG,KAAK,CAAC;QAqGxB,gBAAW,GAAG;YACZ,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC5B,CAAC;KA/FE;IAEJ,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE;YAC5C,IAAI,qBAAqB,GAAG,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,cAAc,EAAE;gBACvB,qBAAqB,EAAE,CAAC;aACzB;YACD,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,qBAAqB,EAAE,CAAC;aACzB;YACD,IAAI,IAAI,CAAC,eAAe,EAAE;gBACxB,qBAAqB,EAAE,CAAC;aACzB;YACD,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,qBAAqB,EAAE,CAAC;aACzB;YACD,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,qBAAqB,EAAE,CAAC;aACzB;YACD,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,qBAAqB,EAAE,CAAC;aACzB;YACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;SACxD;KACF;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;KACpD;IAED,IAAI,aAAa;QACf,QACE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM;YAC1D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAC9C;KACH;IAED,IAAI,eAAe;QACjB,QACE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM;YAC5D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAChD;KACH;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KACnD;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;KACnE;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;KAClD;IAED,UAAU;QACR,KAAK,CAAC,6BAA6B,CAAC,CAAC;KACtC;IAEK,WAAW;;YACf,IAAI;gBACF,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAQ,CAAC,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,kDAAkD,EAClD,SAAS,CACV,CAAC;aACH;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,8BAA8B,CAC/B,CAAC;aACH;SACF;KAAA;IAED,WAAW;QACT,KAAK,CAAC,6BAA6B,CAAC,CAAC;KACtC;IAED,YAAY;QACV,KAAK,CAAC,6BAA6B,CAAC,CAAC;KACtC;IAED,WAAW;QACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;KAC7B;IAED,WAAW;;QACT,MAAA,IAAI,CAAC,YAAY,0CAAE,WAAW,EAAE,CAAC;KAClC;IAOK,aAAa;;YACjB,IAAI;gBACF,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC;aACxD;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,mCAAmC,CACpC,CAAC;aACH;SACF;KAAA;;uHA1HU,0BAA0B;2GAA1B,0BAA0B,yVAS1B,qBAAqB,qECxClC,wsGAkHA;2FDnFa,0BAA0B;kBALtC,SAAS;mBAAC;oBACT,QAAQ,EAAE,4BAA4B;oBACtC,WAAW,EAAE,sCAAsC;oBACnD,MAAM,EAAE,EAAE;iBACX;8JAEU,oBAAoB;sBAA5B,KAAK;gBACG,MAAM;sBAAd,KAAK;gBACG,MAAM;sBAAd,KAAK;gBACG,OAAO;sBAAf,KAAK;gBACG,cAAc;sBAAtB,KAAK;gBACa,qBAAqB;sBAAvC,MAAM;gBACY,SAAS;sBAA3B,MAAM;gBAEmC,YAAY;sBAArD,SAAS;uBAAC,qBAAqB;;;ME9BrB,gBAAgB;IAK3B,YAAoB,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;QAFlD,kBAAa,GAAmB,EAAE,CAAC;QAGjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAChD,GAAG,CAAC,MAAM,KAAK,CAAC,EAChB,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,EAC1B,SAAS,CAAC,KAAK,CAAC,CACjB,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CACvD,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,EAC5B,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAC5B,CAAC;KACH;;6GAfU,gBAAgB;iGAAhB,gBAAgB,sDCV7B,6RAUA;2FDAa,gBAAgB;kBAL5B,SAAS;mBAAC;oBACT,QAAQ,EAAE,gBAAgB;oBAC1B,WAAW,EAAE,0BAA0B;oBACvC,MAAM,EAAE,EAAE;iBACX;;;MEJY,cAAc,GAAG;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;IAChC,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACpD,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACrD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACnC;;MCJa,wBAAwB;IAKnC;QAHQ,kBAAa,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;QAI1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa;aAC9B,YAAY,EAAE;aACd,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5C,IAAI,cAAc,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE;gBACxC,IAAI,CAAC,qBAAqB,EAAE,CAAC;aAC9B;SACF,CAAC,CAAC;KACJ;IAED,IAAI;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/B;IAED,KAAK;QACH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAChC;IAED,MAAM;QACJ,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;KAC5D;IAED,cAAc,CAAC,OAAgC;QAC7C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;KAC5B;IAED,eAAe;QACb,IAAI,cAAc,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;KACF;IAEO,qBAAqB;QAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,OAAO;SACR;QACD,MAAM,YAAY,GAAG,CAAC,KAAY;YAChC,IAAI,CAAC,IAAI,CAAC,WAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAAE;gBACrD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;aACnD;SACF,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO;aACT,IAAI,CACH,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACjB,KAAK,EAAE,CACR;aACA,SAAS,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;KACvE;;qHAvDU,wBAAwB;yHAAxB,wBAAwB,cADX,MAAM;2FACnB,wBAAwB;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCKrB,sBAAsB;IAIjC,YACU,cAA8B,EAC9B,wBAAkD;QADlD,mBAAc,GAAd,cAAc,CAAgB;QAC9B,6BAAwB,GAAxB,wBAAwB,CAA0B;QAE1D,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;;YAC7C,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,MAAM,YAAY,GAAG,MAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,IAAI,0CACzC,gBAA4B,CAAC;YACjC,IAAI,CAAC,YAAY,EAAE;gBACjB,OAAO;aACR;YACD,IAAI,CAAC,uBAAuB;gBAC1B,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;SACjD,CAAC,CAAC;KACJ;IAED,UAAU,CAAC,KAAY;QACrB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC;KACxC;IAED,IAAI,gBAAgB;;QAClB,OAAO,EAAE,WAAW,EAAE,CAAA,MAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,IAAI,0CAAE,YAAY,KAAI,CAAC,EAAE,CAAC;KACrE;IAED,IAAI,iBAAiB;;QACnB,OAAO,EAAE,YAAY,EAAE,CAAA,MAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,KAAK,0CAAE,aAAa,KAAI,CAAC,EAAE,CAAC;KACxE;;mHA/BU,sBAAsB;uGAAtB,sBAAsB,6DCVnC,0+BAyBA;2FDfa,sBAAsB;kBALlC,SAAS;mBAAC;oBACT,QAAQ,EAAE,uBAAuB;oBACjC,WAAW,EAAE,iCAAiC;oBAC9C,MAAM,EAAE,EAAE;iBACX;;;MEMY,uBAAuB;IAQlC,YAAoB,cAA8B,EAAU,MAAc;QAAtD,mBAAc,GAAd,cAAc,CAAgB;QAAU,WAAM,GAAN,MAAM,CAAQ;QAN1E,aAAQ,GAAG,KAAK,CAAC;QACjB,aAAQ,GAAG,KAAK,CAAC;QACjB,kBAAa,GAAW,gBAAgB,CAAC;QACjC,kBAAa,GAAmD,EAAE,CAAC;QACnE,sBAAiB,GAAG,IAAI,CAAC;KAE6C;IAE9E,QAAQ;;QACN,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAC1C,CAAC,aAAa,eACZ,QAAC,IAAI,CAAC,QAAQ,GAAG,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,EAAE,OAAK,MAAA,IAAI,CAAC,OAAO,0CAAE,EAAE,CAAA,EAAC,EAAA,CAC3D,CACF,CAAC;QACF,MAAM,QAAQ,GAAG,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,KAAK,0CAAE,QAAQ,CAAC;QAC/C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;SACtD;QACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,OAAQ,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC;QACxE,MAAM,YAAY,GAChB,CAAC,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,0CAAE,gBAA6B,KAAI,EAAE,CAAC;QAC3D,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,OAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACpE,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,OAAQ,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACxE,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,OAAQ,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACxE,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,OAAQ,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAC1E,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,OAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,MAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YACd,IAAI,CAAC,QAAQ;gBACX,CAAC,CAAC,IAAI,CAAC,OAAQ,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC;SAC3D,CAAC,CACH,CACF,CAAC;KACH;IAED,WAAW;QACT,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;KACpD;IAED,IAAI,WAAW;;QACb,OAAO,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,0CAAE,KAAK,CAAC;KAClC;IAED,IAAI,UAAU;;QACZ,OAAO,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,0CAAE,IAAI,CAAC;KACjC;IAED,IAAI,KAAK;;QACP,OAAO,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,0CAAE,IAAI,CAAC;KACjC;IAED,kBAAkB;QAChB,KAAK,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC;KAC5D;IAEO,kBAAkB,CAAC,KAAY;QACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;;YACd,IAAI,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,MAAK,CAAC,EAAE;gBAC7C,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC;gBACtC,OAAO;aACR;YACD,IACE,CAAC,KAAK,CAAC,OAAO;gBACd,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,KAAK,CAAC,QAAQ,CAAC,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAG,CAAC,EACjE,EAAE,MAAK,KAAK,CAAC,OAAO,CAAC,EAAE,EAC1B;gBACA,OAAO;aACR;YACD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC;SACxE,CAAC,CAAC;KACJ;IAEO,gBAAgB,CAAC,OAAiD;QACxE,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,EAAE;YACvB,IAAI,CAAC,aAAa,GAAG,4BAA4B,CAAC;SACnD;aAAM,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAE;YACxB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;SACnC;aAAM,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,KAAI,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE;YAC7D,IAAI,CAAC,aAAa,GAAG,6BAA6B,CAAC;SACpD;KACF;;oHA7FU,uBAAuB;wGAAvB,uBAAuB,8FCfpC,u3BA0BA;2FDXa,uBAAuB;kBALnC,SAAS;mBAAC;oBACT,QAAQ,EAAE,wBAAwB;oBAClC,WAAW,EAAE,kCAAkC;oBAC/C,MAAM,EAAE,EAAE;iBACX;uHAEU,OAAO;sBAAf,KAAK;;;MEGK,oBAAoB;IAU/B,YACU,cAA8B,EAC9B,wBAAkD;QADlD,mBAAc,GAAd,cAAc,CAAgB;QAC9B,6BAAwB,GAAxB,wBAAwB,CAA0B;QAP5D,0BAAqB,GAAG,KAAK,CAAC;QAS5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;QAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;QAC7D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACjC,GAAG,CAAC,MAAM,KAAK,CAAC,EAChB,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,EAC1B,SAAS,CAAC,KAAK,CAAC,CACjB,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACxC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,EAC5B,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAC5B,CAAC;KACH;IACD,eAAe;QACb,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;KAC5E;IAEK,gBAAgB;;YACpB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;YAClC,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;YAC7C,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;SACpC;KAAA;IAED,gBAAgB,CAAC,KAAa,EAAE,IAAa;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC;KACjB;IAED,eAAe;QACb,IAAI,CAAC,wBAAwB,CAAC,eAAe,EAAE,CAAC;KACjD;;iHA3CU,oBAAoB;qGAApB,oBAAoB,6OCnBjC,qwHA8GA;2FD3Fa,oBAAoB;kBALhC,SAAS;mBAAC;oBACT,QAAQ,EAAE,qBAAqB;oBAC/B,WAAW,EAAE,+BAA+B;oBAC5C,MAAM,EAAE,EAAE;iBACX;sIAEU,4BAA4B;sBAApC,KAAK;gBAO0B,SAAS;sBAAxC,SAAS;uBAAC,WAAW;;;AExBxB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;MAEV,SAAS,GAAG,CAAC,IAAU;IAClC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;AAC/B;;MCPa,aAAa,GAAG,CAAC,KAAqB;IACjD,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAEnD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QAC1B,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;KAC7B;SAAM,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;;;QAGjC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD;SAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;;;QAG/B,IAAI,UAAU,KAAK,CAAC,EAAE;;YAEpB,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,mBAAmB,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,GAAG,GAAG,mBAAmB,SAAS,QAAQ,EAAE,CAAC;SACpD;aAAM;YACL,MAAM,mBAAmB,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,GAAG,GAAG,mBAAmB,QAAQ,UAAU,OAAO,CAAC;SAC1D;KACF;IAED,OAAO,MAAM,CAAC;AAChB;;ACLA,MAAM,qBAAqB,GAA6C;IACtE,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;CACV,CAAC;MAMW,yBAAyB;IAwBpC,YACU,KAAwB,EACxB,cAA8B;QAD9B,UAAK,GAAL,KAAK,CAAmB;QACxB,mBAAc,GAAd,cAAc,CAAgB;QAxB/B,0BAAqB,GAC5B,EAAE,CAAC;QACI,mBAAc,GAAY,KAAK,CAAC;QACtB,yBAAoB,GAAG,IAAI,YAAY,EAAW,CAAC;QAC7D,oBAAe,GAGlB,EAAE,CAAC;QACA,iBAAY,GAGf,EAAE,CAAC;QAsFD,iBAAY,GAAG,CAAC,KAAY;;YAClC,IAAI,EAAC,MAAA,IAAI,CAAC,iBAAiB,0CAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,CAAA,EAAE;gBACzE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACvC;SACF,CAAC;KA5EE;IAEJ,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,cAAc,EAAE;YAC1B,IAAI,CAAC,cAAc;kBACf,UAAU,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;kBAC9C,IAAI,CAAC,yBAAyB,EAAE,CAAC;SACtC;KACF;IAED,kBAAkB;QAChB,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC9C,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;SAC5B;KACF;IAED,IAAI,iBAAiB;QACnB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,MAAM,CACnD,CAAC,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC,CAAwB,CAAE,GAAG,CAAC,CACxC,CAAC;KAC5B;IAED,IAAI,cAAc;QAChB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,MAAM,CACrD,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG,KAAK,EAC/B,CAAC,CACF,CAAC;KACH;IAED,IAAI,eAAe;QACjB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;KACxD;IAED,uBAAuB,CAAC,YAAiC;;QACvD,OAAO,MAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,CAAC,0CACtE,IAAI,CAAC;KACV;IAED,kBAAkB,CAAC,YAAiC;QAClD,OAAO,qBAAqB,CAAC,YAAY,CAAC,CAAC;KAC5C;IAED,kBAAkB,CAAC,YAAiC;QAClD,OAAO,IAAI,CAAC,eAAe;aACxB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,mBAAK,OAAA,CAAA,MAAA,CAAC,CAAC,IAAI,0CAAE,IAAI,MAAI,MAAA,CAAC,CAAC,IAAI,0CAAE,EAAE,CAAA,CAAA,EAAA,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAC;KACf;IAED,WAAW,CAAC,KAAY,EAAE,YAAiC;QACzD,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,MAAqB,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;KAC1D;IAED,WAAW;QACT,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;QACtC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;KACnC;IAED,sBAAsB,CAAC,KAAa,EAAE,IAAyB;QAC7D,OAAO,IAAI,CAAC;KACb;IAED,KAAK,CAAC,IAAyB;QAC7B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;cAC1C,KAAK,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,SAAU,EAAE,IAAI,CAAC;cAC9D,KAAK,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,SAAU,EAAE,IAAI,CAAC,CAAC;KACjE;IAQO,qBAAqB;QAC3B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;KACrD;IAEO,yBAAyB;QAC/B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;KACxD;IAEO,kBAAkB;;QACxB,MAAM,OAAO,GAAG,MAAA,IAAI,CAAC,eAAe,0CAAE,aAAa,CAAC,qBAAqB,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,oBAAoB,0CAAE,qBAAqB,EAAE,CAAC;QAElE,MAAM,SAAS,GACb,MAAA,IAAI,CAAC,iBAAiB,0CAAE,aAAa,CAAC,qBAAqB,EAAE,CAAC;QAEhE,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS;YAAE,OAAO;QAE9C,MAAM,eAAe,GACnB,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;cACxD,CAAC;cACD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;QAE1E,MAAM,aAAa,GACjB,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,eAAe,CAAC;QAE5D,IAAI,CAAC,gBAAgB,GAAG;YACtB,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,aAAa;SACrB,CAAC;KACH;;sHAtIU,yBAAyB;0GAAzB,yBAAyB,qiBCrCtC,wrFAgGA;2FD3Da,yBAAyB;kBALrC,SAAS;mBAAC;oBACT,QAAQ,EAAE,0BAA0B;oBACpC,WAAW,EAAE,oCAAoC;oBACjD,MAAM,EAAE,CAAC,sDAAsD,CAAC;iBACjE;kIAEU,SAAS;sBAAjB,KAAK;gBACG,qBAAqB;sBAA7B,KAAK;gBAEG,cAAc;sBAAtB,KAAK;gBACa,oBAAoB;sBAAtC,MAAM;gBACE,eAAe;sBAAvB,KAAK;gBAIG,YAAY;sBAApB,KAAK;gBAMkC,iBAAiB;sBAAxD,SAAS;uBAAC,mBAAmB;gBAGQ,eAAe;sBAApD,SAAS;uBAAC,iBAAiB;;;MElDjB,gBAAgB;IAG3B;QAFA,eAAU,GAAG,IAAI,OAAO,EAAQ,CAAC;KAEjB;;6GAHL,gBAAgB;iHAAhB,gBAAgB,cAFf,MAAM;2FAEP,gBAAgB;kBAH5B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;MCQY,uBAAuB;IAKlC,YACU,gBAAkC,EAClC,cAA8B;QAD9B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,mBAAc,GAAd,cAAc,CAAgB;QAL/B,gBAAW,GAAwC,EAAE,CAAC;QAC/D,uBAAkB,GAAwC,EAAE,CAAC;KAKzD;IAEJ,WAAW;QACT,IAAI,CAAC,kBAAkB,GAAG;YACxB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClD,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjD,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAClD,CAAC;KACH;IAED,SAAS,CAAC,KAAa;QACrB,OAAO,KAAK,CAAC;KACd;IAED,OAAO,CAAC,UAAsB;QAC5B,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;KACtC;IAED,MAAM,CAAC,UAAsB;QAC3B,OAAO,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC;KACnC;IAED,MAAM,CAAC,UAAsB;QAC3B,QACE,CAAC,UAAU,CAAC,IAAI;aACf,UAAU,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC1D,UAAU,CAAC,IAAI,KAAK,OAAO,EAC3B;KACH;IAED,WAAW;QACT,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACzC;IAED,WAAW,CAAC,UAA6C;QACvD,QACE,UAAU,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EACrE;KACH;IAED,WAAW,CAAC,UAA6C;QACvD,OAAO,WAAW,CAAC,UAAU,CAAC,SAAU,CAAC,CAAC;KAC3C;IAED,OAAO,CAAC,GAAmB;QACzB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE;YACrC,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG;iBACrB,OAAO,CAAC,8BAA8B,EAAE,EAAE,CAAC;iBAC3C,KAAK,CAAC,GAAG,CAAC,CAAC;YAEd,OAAO,UAAU,CAAC;SACnB;QACD,OAAO,IAAI,CAAC;KACb;IAED,UAAU,CAAC,MAAc;QACvB,KAAK,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,SAAU,EAAE;YACnD,CAAC,MAAM,CAAC,IAAK,GAAG,MAAM,CAAC,KAAM;SAC9B,CAAC,CAAC;KACJ;IAED,kBAAkB,CAAC,CAAS,EAAE,IAAY;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;;oHAvEU,uBAAuB;wGAAvB,uBAAuB,mJCbpC,8oHA2GA;2FD9Fa,uBAAuB;kBALnC,SAAS;mBAAC;oBACT,QAAQ,EAAE,wBAAwB;oBAClC,WAAW,EAAE,kCAAkC;oBAC/C,MAAM,EAAE,EAAE;iBACX;8HAEU,SAAS;sBAAjB,KAAK;gBACG,WAAW;sBAAnB,KAAK;;;MEQK,gBAAgB;IAwB3B,YACU,iBAAoC,EACpC,cAA8B;QAD9B,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,mBAAc,GAAd,cAAc,CAAgB;QAtB/B,0BAAqB,GAAqB,EAAE,CAAC;QAMtD,oBAAe,GAAG,KAAK,CAAC;QACxB,2BAAsB,GAAG,KAAK,CAAC;QAC/B,sBAAiB,GAAG,KAAK,CAAC;QAC1B,+BAA0B,GAAG,CAAC,CAAC;QAC/B,qBAAgB,GAIV,EAAE,CAAC;QAUP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC;KACpD;IAED,WAAW,CAAC,OAAsB;;QAChC,IAAI,OAAO,CAAC,OAAO,EAAE;YACnB,IAAI,OAAO,GAAG,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,MAAI,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,CAAA,CAAC;YACvD,IAAI,CAAC,OAAO,EAAE;gBACZ,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;aAC5B;iBAAM;;gBAEL,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;oBAC7B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;iBACtC;gBACD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBAC9B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;iBACzC;gBACD,IACE,CAAC,IAAI,CAAC,OAAQ,CAAC,eAAe;oBAC9B,IAAI,CAAC,OAAQ,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAC1C;oBACA,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;iBACrD;qBAAM;oBACL,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;oBAC3B,IAAI,IAAI,GAAG,OAAO,CAAC;oBACnB,IAAI,CAAC,OAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI;wBACzC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;wBAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;wBAC/D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;4BACzB,OAAO,EAAE,aAAa;4BACtB,IAAI,EAAE,MAAM;yBACb,CAAC,CAAC;wBACH,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;4BACzB,OAAO,EAAE,OAAO;4BAChB,IAAI,EAAE,SAAS;4BACf,IAAI;yBACL,CAAC,CAAC;wBACH,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC;qBAClD,CAAC,CAAC;oBACH,IAAI,IAAI,EAAE;wBACR,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;qBAC7D;iBACF;aACF;SACF;KACF;IAED,IAAI,mBAAmB;;QACrB,OAAO,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,0CAAE,EAAE,OAAK,MAAA,IAAI,CAAC,IAAI,0CAAE,EAAE,CAAA,CAAC;KACjD;IAED,IAAI,UAAU;QACZ,OAAO,aAAa,CAAC,IAAI,CAAC,OAAQ,CAAC,MAAM,CAAC,CAAC;KAC5C;IAED,IAAI,YAAY;;QACd,OAAO,MAAA,IAAI,CAAC,OAAO,0CAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,OAAA,CAAC,CAAC,EAAE,MAAK,MAAA,IAAI,CAAC,IAAI,0CAAE,EAAE,CAAA,CAAA,EAAA,EAAE,CAAC,CAAC,CAAC;KACtE;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;KACzD;IAED,IAAI,qBAAqB;QACvB,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;KACvD;IAED,IAAI,yBAAyB;QAC3B,QACE,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,MAAM;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU;YAClC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAC9B;KACH;IAED,IAAI,UAAU;;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAC,MAAA,IAAI,CAAC,OAAO,0CAAE,UAAU,CAAA,EAAE;YAC9C,OAAO;SACR;QACD,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;KAC3C;IAED,IAAI,iBAAiB;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;QACD,OAAO,EACL,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;YAClB,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO;YAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;YAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YACjC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ;YAChC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAClC,CAAC;KACH;IAED,IAAI,aAAa;;QACf,OAAO,CAAC,EAAC,MAAA,IAAI,CAAC,OAAO,0CAAE,WAAW,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;KACzE;IAED,IAAI,YAAY;;QACd,QACE,CAAC,EAAC,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,CAAA;YAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,EACpD;KACH;IAED,aAAa;QACX,KAAK,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC;KACvD;IAED,WAAW;QACT,IAAI,cAAc,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE;YACxC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,OAAO;SACR;QACD,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,OAAO;SACR;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,MAAM,YAAY,GAAG,CAAC,KAAY;;YAChC,IAAI,EAAC,MAAA,IAAI,CAAC,SAAS,0CAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,CAAA,EAAE;gBACjE,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;gBAC/B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;aACnD;SACF,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;KAChD;;6GA3JU,gBAAgB;iGAAhB,gBAAgB,+fCvB7B,gqTA4QA;2FDrPa,gBAAgB;kBAL5B,SAAS;mBAAC;oBACT,QAAQ,EAAE,gBAAgB;oBAC1B,WAAW,EAAE,0BAA0B;oBACvC,MAAM,EAAE,EAAE;iBACX;+HAEU,oBAAoB;sBAA5B,KAAK;gBACG,eAAe;sBAAvB,KAAK;gBACG,OAAO;sBAAf,KAAK;gBACG,qBAAqB;sBAA7B,KAAK;gBACG,mBAAmB;sBAA3B,KAAK;gBACG,iBAAiB;sBAAzB,KAAK;gBACG,iBAAiB;sBAAzB,KAAK;gBACG,oBAAoB;sBAA5B,KAAK;gBAY0B,SAAS;sBAAxC,SAAS;uBAAC,WAAW;;;ME1BX,iBAAiB;IAO5B;QANe,UAAK,GAAG,oBAAoB,CAAC;QACnC,UAAK,GAAG,EAAE,CAAC;QACD,gBAAW,GAAG,IAAI,YAAY,EAAU,CAAC;QACzC,SAAI,GAAG,IAAI,YAAY,EAAQ,CAAC;KAGnC;;IAGhB,WAAW,MAAW;IAEtB,YAAY;QACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KAC9D;IAED,IAAI,CAAC,KAAY;QACf,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;KAClB;;8GAnBU,iBAAiB;kGAAjB,iBAAiB,uTCjB9B,qTAWA;2FDMa,iBAAiB;kBAL7B,SAAS;mBAAC;oBACT,QAAQ,EAAE,iBAAiB;oBAC3B,WAAW,EAAE,2BAA2B;oBACxC,MAAM,EAAE,EAAE;iBACX;0EAEgB,KAAK;sBAAnB,WAAW;gBACH,KAAK;sBAAb,KAAK;gBACa,WAAW;sBAA7B,MAAM;gBACY,IAAI;sBAAtB,MAAM;gBACqB,YAAY;sBAAvC,SAAS;uBAAC,OAAO;;;MElBP,sBAAsB;IACjC,iBAAgB;IAEhB,aAAa,CAAC,CAAS;QACrB,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;KACzB;;mHALU,sBAAsB;uHAAtB,sBAAsB,cADT,MAAM;2FACnB,sBAAsB;kBADlC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MC6BrB,6BAA6B;IAmDxC,YACU,cAA8B,EAC9B,iBAAoC,EACpC,sBAA8C;QAF9C,mBAAc,GAAd,cAAc,CAAgB;QAC9B,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,2BAAsB,GAAtB,sBAAsB,CAAwB;QAnDzC,UAAK,GAAG,oBAAoB,CAAC;QACnC,UAAK,GAAG,EAAE,CAAC;QACX,uBAAkB,GAAwB,IAAI,CAAC;QAO/C,iBAAY,GAA8B,SAAS,CAAC;QAC1C,gBAAW,GAAG,IAAI,YAAY,EAAU,CAAC;QACzC,SAAI,GAAG,IAAI,YAAY,EAAQ,CAAC;QAChC,iBAAY,GAAG,IAAI,YAAY,EAAkB,CAAC;QACpD,oBAAe,GAAG,mBAAmB,CAAC;QACtC,uBAAkB,GAAG,GAAG,CAAC;QACzB,uBAAkB,GAAG,GAAG,CAAC;QAC1C,uBAAkB,GAAkB;YAClC,QAAQ,EAAE,EAAE;SACb,CAAC;QAEM,kBAAa,GAAmB,EAAE,CAAC;QACnC,mBAAc,GAAmB,EAAE,CAAC;QACpC,sBAAiB,GAAa;YACpC,WAAW,EAAE,IAAI,CAAC,kBAAkB;YACpC,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI,CAAC,eAAe;YAC9B,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,CACb,YAAoB,EACpB,KAAsC,KACnC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC;YACrC,aAAa,EAAE,CAAC,IAAI,EAAE,WAAW,KAC/B,IAAI,CAAC,gCAAgC,CAAC,IAAI,EAAE,WAAW,CAAC;SAC3D,CAAC;QACM,uBAAkB,GAAa;YACrC,WAAW,EAAE,IAAI,CAAC,kBAAkB;YACpC,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,MAAM;YAChB,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,CACb,YAAoB,EACpB,KAAsC,KACnC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC;YACrC,aAAa,EAAE,CAAC,IAAI,EAAE,WAAW,KAC/B,IAAI,CAAC,gCAAgC,CAAC,IAAI,EAAE,WAAW,CAAC;SAC3D,CAAC;QACM,gBAAW,GAAG,IAAI,eAAe,CAAS,EAAE,CAAC,CAAC;QAOpD,IAAI,CAAC,WAAW;aACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,CAAC;aAC/C,SAAS,CAAC,CAAC,UAAU;YACpB,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;gBAClD,KAAK,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;aAC5C;SACF,CAAC,CAAC;QACL,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,OAAO;;YACnD,MAAM,QAAQ,GAAG,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,0CAAE,QAAQ,KAAI,EAAE,CAAC;YACtD,IAAI,CAAC,kBAAkB,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,sCAC1C,CAAC,KACJ,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,IAAI,EAC9B,IAAI,EAAE,SAAS,IACf,CAAC,CAAC;YACJ,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACjD,KAAK,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC7D,CAAC,CACH,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG;YACjC,IAAI,CAAC,iBAAiB;YACtB,IAAI,CAAC,kBAAkB;SACxB,CAAC;KACH;IAED,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,kBAAkB,EAAE;YAC9B,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG;oBACjC,IAAI,CAAC,iBAAiB;oBACtB,IAAI,CAAC,kBAAkB;iBACxB,CAAC;gBACF,IAAI,CAAC,kBAAkB,qBAAQ,IAAI,CAAC,kBAAkB,CAAE,CAAC;aAC1D;iBAAM;gBACL,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC7D,IAAI,CAAC,kBAAkB,qBAAQ,IAAI,CAAC,kBAAkB,CAAE,CAAC;aAC1D;SACF;QACD,IAAI,OAAO,CAAC,YAAY,EAAE;YACxB,KAAK,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC7D;KACF;IAED,MAAM,CAAC,YAAoB,EAAE,KAAsC;QACjE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAC/D,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAC/C,CACF,CAAC;KACH;IAED,gCAAgC,CAC9B,IAAgC,EAChC,WAAW,GAAG,EAAE;QAEhB,IAAI,WAAW,KAAK,IAAI,CAAC,kBAAkB,EAAE;YAC3C,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,EAAkB,CAAC;YACzE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;SAClD;QACD,QACE,WAAW;YACX,IAAI,CAAC,iBAAiB;aACrB,WAAW,KAAK,IAAI,CAAC,kBAAkB,GAAG,GAAG,GAAG,EAAE,CAAC,EACpD;KACH;IAED,4BAA4B,CAAC,UAAkB;QAC7C,IAAI,UAAU,KAAK,IAAI,CAAC,kBAAkB,EAAE;YAC1C,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;SAClC;aAAM;YACL,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SACnC;KACF;IAED,YAAY;QACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KAC9D;IAED,SAAS;QACP,IAAI,CAAC,4BAA4B,EAAE,CAAC;KACrC;IAED,IAAI,CAAC,KAAY;QACf,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;KAClB;IAEO,aAAa,CAAC,CAAS;QAC7B,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACrD;aAAM;YACL,OAAO,CAAC,CAAC;SACV;KACF;IAEa,oBAAoB,CAAC,UAAmB;;YACpD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC5B,OAAO;aACR;YACD,UAAU,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAC9D,MAAM,OAAO,GACX,IAAI,CAAC,YAAY,KAAK,aAAa;kBAC/B,CAAC,CAAS,KAAK,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC;kBAC1D,CAAC,CAAS,KAAK,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CACvB,UAAU,IAAI,EAAE,EAChB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACX,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAiB,CAAC;gBACnD,uCACK,CAAC,KACJ,iBAAiB,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EACvC,IAAI,EAAE,SAAS,IACf;aACH,CAAC,CACH,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,GAAG,KAAK,CAAC;YACrC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG;gBACjC,IAAI,CAAC,iBAAiB;gBACtB,IAAI,CAAC,kBAAkB;aACxB,CAAC;YACF,IAAI,CAAC,kBAAkB,qBAAQ,IAAI,CAAC,kBAAkB,CAAE,CAAC;SAC1D;KAAA;IAEO,4BAA4B;QAClC,MAAM,qBAAqB,GAAmB,EAAE,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,kBAAkB,GAAG,GAAG,EAAE,CAAC,EAAE;gBAC3D,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC/B;SACF,CAAC,CAAC;QACH,IAAI,qBAAqB,CAAC,MAAM,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YAC/D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,cAAc,GAAG,qBAAqB,CAAC;SAC7C;KACF;;0HAlMU,6BAA6B;8GAA7B,6BAA6B,kjBChC1C,ojEAgEA;2FDhCa,6BAA6B;kBALzC,SAAS;mBAAC;oBACT,QAAQ,EAAE,8BAA8B;oBACxC,WAAW,EAAE,wCAAwC;oBACrD,MAAM,EAAE,EAAE;iBACX;iKAIgB,KAAK;sBAAnB,WAAW;gBACH,KAAK;sBAAb,KAAK;gBACG,kBAAkB;sBAA1B,KAAK;gBACG,+BAA+B;sBAAvC,KAAK;gBAGG,+BAA+B;sBAAvC,KAAK;gBAGG,YAAY;sBAApB,KAAK;gBACa,WAAW;sBAA7B,MAAM;gBACY,IAAI;sBAAtB,MAAM;gBACY,YAAY;sBAA9B,MAAM;gBAOqB,YAAY;sBAAvC,SAAS;uBAAC,OAAO;;;MElDP,cAAc,GAAG,CAC5B,OAAsB,EACtB,eAA+B,EAC/B,WAA2B,EAC3B,aAAa,GAAG,KAAK;;IAErB,IACE,aAAa;SACZ,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC;QAEzD,OAAO,QAAQ,CAAC;IAElB,MAAM,YAAY,GAChB,CAAC,eAAe;QAChB,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;QAC5D,eAAe,CAAC,IAAI,KAAK,QAAQ;SAChC,eAAe,CAAC,WAAW;YAC1B,CAAA,MAAA,eAAe,CAAC,WAAW,0CAAE,MAAM,MAAK,CAAC,CAAC;QAC5C,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,EAAE,OAAK,MAAA,eAAe,CAAC,IAAI,0CAAE,EAAE,CAAA;QAC7C,eAAe,CAAC,IAAI,KAAK,OAAO;QAChC,eAAe,CAAC,UAAU,CAAC;IAE7B,MAAM,eAAe,GACnB,CAAC,WAAW;QACZ,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC;QACxD,WAAW,CAAC,IAAI,KAAK,QAAQ;SAC5B,WAAW,CAAC,WAAW,IAAI,CAAA,MAAA,WAAW,CAAC,WAAW,0CAAE,MAAM,MAAK,CAAC,CAAC;QAClE,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,EAAE,OAAK,MAAA,WAAW,CAAC,IAAI,0CAAE,EAAE,CAAA;QACzC,WAAW,CAAC,IAAI,KAAK,OAAO;QAC5B,WAAW,CAAC,UAAU,CAAC;IAEzB,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe,EAAE;QACrC,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,QAAQ,CAAC;QACpE,OAAO,QAAQ,CAAC;KACjB;IAED,IAAI,eAAe,EAAE;QACnB,IAAI,YAAY,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;YAChE,OAAO,QAAQ,CAAC;QAClB,OAAO,QAAQ,CAAC;KACjB;IAED,IAAI,YAAY;QAAE,OAAO,KAAK,CAAC;IAE/B,OAAO,EAAE,CAAC;AACZ,EAAE;AAEF,MAAM,WAAW,GAAG,CAAC,KAAW,EAAE,KAAW;IAC3C,QACE,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;QAC3C,KAAK,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE;QACrC,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,EACnC;AACJ,CAAC;;MCjCY,oBAAoB;IA6B/B,YACU,cAA8B,EAC9B,iBAAoC,EACpC,gBAAkC;QAFlC,mBAAc,GAAd,cAAc,CAAgB;QAC9B,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,qBAAgB,GAAhB,gBAAgB,CAAkB;QA5BnC,wBAAmB,GAAG,IAAI,CAAC;;QAEJ,+BAA0B,GACxD,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAIvD,0BAAqB,GAAqB,EAAE,CAAC;QACf,UAAK,GACjC,wEAAwE,CAAC;QAC3E,uBAAkB,GAAG,CAAC,CAAC;QAEvB,gBAAW,GAAiB,EAAE,CAAC;QAUvB,6BAAwB,GAAqB,CAAC,MAAM,CAAC,CAAC;QAC7C,8BAAyB,GAAG,GAAG,CAAC;QAO/C,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,OAAO;;YACnD,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;YACjC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACnC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;YACxC,MAAM,WAAW,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,0CAAE,gBAA4B,CAAC;YAChE,IAAI,WAAW,EAAE;gBACf,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC;gBACnC,IAAI,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE;oBAC9C,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBAC5C;gBACD,IAAI,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE;oBACpD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBAC5C;gBACD,IAAI,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE;oBACpD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC3C,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;iBAChD;gBACD,IAAI,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE;oBACpD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAC9C;gBACD,IAAI,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE;oBACpD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC7C,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBAClD;gBACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;aAC1B;SACF,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAC9D,GAAG,CAAC,CAAC,QAAQ;;YACX,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBACzB,OAAO;aACR;YACD,MAAM,wBAAwB,GAC5B,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;YAC3C,IACE,CAAC,IAAI,CAAC,iBAAiB;gBACvB,CAAA,MAAA,IAAI,CAAC,iBAAiB,0CAAE,OAAO,EAAE,IAAG,wBAAwB,CAAC,OAAO,EAAE,EACtE;gBACA,IAAI,CAAC,iBAAiB,GAAG,wBAAwB,CAAC;gBAClD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,sBAAsB;oBACzB,CAAA,MAAA,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,0CAAE,EAAE;yBACtC,MAAA,MAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,0CAAE,IAAI,0CAAE,EAAE,CAAA,CAAC;gBAC9C,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;iBAC3B;aACF;YACD,MAAM,wBAAwB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC3B,IAAI,CAAC,iBAAiB,GAAG,wBAAwB,CAAC;aACnD;iBAAM,IACL,CAAA,MAAA,IAAI,CAAC,iBAAiB,0CAAE,OAAO,EAAE,IAAG,wBAAwB,CAAC,OAAO,EAAE,EACtE;gBACA,IAAI,CAAC,iBAAiB,GAAG,wBAAwB,CAAC;gBAClD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;aACjC;SACF,CAAC,EACF,GAAG,CAAC,CAAC,QAAQ;YACX,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KACnC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACpD,CAAC;SACH,CAAC,EACF,GAAG,CACD,CAAC,QAAQ;;YACP,QAAC,IAAI,CAAC,iBAAiB,GAAG,MAAA,CAAC,GAAG,QAAQ,CAAC;iBACpC,OAAO,EAAE;iBACT,IAAI,CACH,CAAC,CAAC;;gBACA,OAAA,CAAA,MAAA,CAAC,CAAC,IAAI,0CAAE,EAAE,OAAK,MAAA,MAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,0CAAE,IAAI,0CAAE,EAAE,CAAA;oBAC1D,CAAC,CAAC,MAAM,KAAK,SAAS,CAAA;aAAA,CACzB,0CAAE,EAAE,EAAC;SAAA,CACX,CACF,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC1B,IAAI,CAAC,cAAc,EAAE,CAAC;;gBAEtB,UAAU,CAAC;oBACT,IAAI,CAAC,cAAc,EAAE,CAAC;iBACvB,EAAE,GAAG,CAAC,CAAC;aACT;SACF,CAAC,CAAC;KACJ;IAED,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,0BAA0B,EAAE;YACtC,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC1B;KACF;IAED,kBAAkB;QAChB,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,sBAAsB,EAAE;gBACzD,IAAI,CAAC,cAAc,EAAE,CAAC;;gBAEtB,UAAU,CAAC;oBACT,IAAI,CAAC,cAAc,EAAE,CAAC;iBACvB,EAAE,GAAG,CAAC,CAAC;aACT;YACD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,CAAC;SACxE;aAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE;YACnC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,CAAC;YACvE,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;SAClC;aAAM,IACL,IAAI,CAAC,eAAe,KAAK,SAAS;YAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY;YACtE,CAAC,IAAI,CAAC,gBAAgB,EACtB;YACA,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,CAAC;SACxE;KACF;IAED,gBAAgB,CAAC,KAAa,EAAE,IAAmB;QACjD,OAAO,IAAI,CAAC,EAAE,CAAC;KAChB;IAED,cAAc;QACZ,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS;YAC1C,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,CAAC;KACnD;IAED,QAAQ;QACN,IAAI,CAAC,gBAAgB;YACnB,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY;iBAC5C,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS;oBAC3C,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,CAAC;gBACpD,IAAI,CAAC,yBAAyB,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;SAC7B;QACD,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,KAAK,CAAC,EAAE;YACtD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,CAAC;YACvE,KAAK,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;SAC7C;KACF;IAEO,yBAAyB;QAC/B,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS;YAC1C,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC,eAAgB,CAAC;KAC3E;IAEO,iBAAiB;QACvB,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACpC,OAAO;SACR;QACD,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,MAAM;YAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,IAAI,YAAY,EAAE;gBAChB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACzC;SACF,CAAC,CAAC;KACJ;;iHApMU,oBAAoB;qGAApB,oBAAoB,wfCxBjC,q8EA4EA;2FDpDa,oBAAoB;kBALhC,SAAS;mBAAC;oBACT,QAAQ,EAAE,qBAAqB;oBAC/B,WAAW,EAAE,+BAA+B;oBAC5C,MAAM,EAAE,EAAE;iBACX;2JAEU,eAAe;sBAAvB,KAAK;gBACG,oBAAoB;sBAA5B,KAAK;gBACG,eAAe;sBAAvB,KAAK;gBACG,mBAAmB;sBAA3B,KAAK;gBAE0B,0BAA0B;sBAAzD,KAAK;uBAAC,uBAAuB;gBAMA,KAAK;sBAAlC,WAAW;uBAAC,OAAO;gBAOZ,eAAe;sBADtB,SAAS;uBAAC,iBAAiB;;;MEhCjB,kBAAkB;;+GAAlB,kBAAkB;gHAAlB,kBAAkB,iBAJd,eAAe,aACpB,YAAY,EAAE,eAAe,aAC7B,eAAe;gHAEd,kBAAkB,YAHpB,CAAC,YAAY,EAAE,eAAe,CAAC;2FAG7B,kBAAkB;kBAL9B,QAAQ;mBAAC;oBACR,YAAY,EAAE,CAAC,eAAe,CAAC;oBAC/B,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;oBACxC,OAAO,EAAE,CAAC,eAAe,CAAC;iBAC3B;;;MCsDY,gBAAgB;;6GAAhB,gBAAgB;8GAAhB,gBAAgB,iBAvCzB,gBAAgB;QAChB,sBAAsB;QACtB,oBAAoB;QACpB,uBAAuB;QACvB,gBAAgB;QAChB,qBAAqB;QACrB,oBAAoB;QACpB,yBAAyB;QACzB,aAAa;QACb,0BAA0B;QAC1B,uBAAuB;QACvB,yBAAyB;QACzB,qBAAqB;QACrB,yBAAyB;QACzB,8BAA8B;QAC9B,cAAc;QACd,iBAAiB,aAET,YAAY,EAAE,eAAe,EAAE,kBAAkB,aAEzD,gBAAgB;QAChB,sBAAsB;QACtB,oBAAoB;QACpB,uBAAuB;QACvB,gBAAgB;QAChB,qBAAqB;QACrB,oBAAoB;QACpB,yBAAyB;QACzB,aAAa;QACb,0BAA0B;QAC1B,uBAAuB;QACvB,yBAAyB;QACzB,qBAAqB;QACrB,yBAAyB;QACzB,8BAA8B;QAC9B,cAAc;QACd,kBAAkB;8GAGT,gBAAgB,YArBlB,CAAC,YAAY,EAAE,eAAe,EAAE,kBAAkB,CAAC,EAkB1D,kBAAkB;2FAGT,gBAAgB;kBAzC5B,QAAQ;mBAAC;oBACR,YAAY,EAAE;wBACZ,gBAAgB;wBAChB,sBAAsB;wBACtB,oBAAoB;wBACpB,uBAAuB;wBACvB,gBAAgB;wBAChB,qBAAqB;wBACrB,oBAAoB;wBACpB,yBAAyB;wBACzB,aAAa;wBACb,0BAA0B;wBAC1B,uBAAuB;wBACvB,yBAAyB;wBACzB,qBAAqB;wBACrB,yBAAyB;wBACzB,8BAA8B;wBAC9B,cAAc;wBACd,iBAAiB;qBAClB;oBACD,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,kBAAkB,CAAC;oBAC5D,OAAO,EAAE;wBACP,gBAAgB;wBAChB,sBAAsB;wBACtB,oBAAoB;wBACpB,uBAAuB;wBACvB,gBAAgB;wBAChB,qBAAqB;wBACrB,oBAAoB;wBACpB,yBAAyB;wBACzB,aAAa;wBACb,0BAA0B;wBAC1B,uBAAuB;wBACvB,yBAAyB;wBACzB,qBAAqB;wBACrB,yBAAyB;wBACzB,8BAA8B;wBAC9B,cAAc;wBACd,kBAAkB;qBACnB;iBACF;;;MC3CY,gCAAgC;;6HAAhC,gCAAgC;8HAAhC,gCAAgC,iBAV5B,6BAA6B,aAClC,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,aAChE,6BAA6B;8HAQ5B,gCAAgC,aAPhC;QACT;YACE,OAAO,EAAE,sBAAsB;YAC/B,QAAQ,EAAE,6BAA6B;SACxC;KACF,YAPQ,CAAC,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,CAAC;2FAShE,gCAAgC;kBAX5C,QAAQ;mBAAC;oBACR,YAAY,EAAE,CAAC,6BAA6B,CAAC;oBAC7C,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,CAAC;oBAC3E,OAAO,EAAE,CAAC,6BAA6B,CAAC;oBACxC,SAAS,EAAE;wBACT;4BACE,OAAO,EAAE,sBAAsB;4BAC/B,QAAQ,EAAE,6BAA6B;yBACxC;qBACF;iBACF;;;MCDY,oBAAoB;;iHAApB,oBAAoB;kHAApB,oBAAoB,iBAVhB,iBAAiB,aACtB,YAAY,EAAE,eAAe,aAC7B,iBAAiB;kHAQhB,oBAAoB,aAPpB;QACT;YACE,OAAO,EAAE,sBAAsB;YAC/B,QAAQ,EAAE,iBAAiB;SAC5B;KACF,YAPQ,CAAC,YAAY,EAAE,eAAe,CAAC;2FAS7B,oBAAoB;kBAXhC,QAAQ;mBAAC;oBACR,YAAY,EAAE,CAAC,iBAAiB,CAAC;oBACjC,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;oBACxC,OAAO,EAAE,CAAC,iBAAiB,CAAC;oBAC5B,SAAS,EAAE;wBACT;4BACE,OAAO,EAAE,sBAAsB;4BAC/B,QAAQ,EAAE,iBAAiB;yBAC5B;qBACF;iBACF;;;AChBD;;;;ACAA;;;;;;"}
1
+ {"version":3,"file":"stream-chat-angular.js","sources":["../../../projects/stream-chat-angular/src/assets/version.ts","../../../projects/stream-chat-angular/src/lib/notification.service.ts","../../../projects/stream-chat-angular/src/lib/chat-client.service.ts","../../../projects/stream-chat-angular/src/lib/message-preview.ts","../../../projects/stream-chat-angular/src/lib/read-by.ts","../../../projects/stream-chat-angular/src/lib/channel.service.ts","../../../projects/stream-chat-angular/src/lib/theme.service.ts","../../../projects/stream-chat-angular/src/lib/is-image-file.ts","../../../projects/stream-chat-angular/src/lib/is-image-attachment.ts","../../../projects/stream-chat-angular/src/lib/attachment.service.ts","../../../projects/stream-chat-angular/src/assets/i18n/en.ts","../../../projects/stream-chat-angular/src/lib/stream-i18n.service.ts","../../../projects/stream-chat-angular/src/lib/avatar/avatar.component.ts","../../../projects/stream-chat-angular/src/lib/avatar/avatar.component.html","../../../projects/stream-chat-angular/src/lib/icon/icon.component.ts","../../../projects/stream-chat-angular/src/lib/icon/icon.component.html","../../../projects/stream-chat-angular/src/lib/loading-indicator/loading-indicator.component.ts","../../../projects/stream-chat-angular/src/lib/loading-indicator/loading-indicator.component.html","../../../projects/stream-chat-angular/src/lib/injection-tokens.ts","../../../projects/stream-chat-angular/src/lib/message-input/textarea.directive.ts","../../../projects/stream-chat-angular/src/lib/message-input/message-input-config.service.ts","../../../projects/stream-chat-angular/src/lib/message-list/image-load.service.ts","../../../projects/stream-chat-angular/src/lib/attachment-list/attachment-list.component.ts","../../../projects/stream-chat-angular/src/lib/attachment-list/attachment-list.component.html","../../../projects/stream-chat-angular/src/lib/attachment-preview-list/attachment-preview-list.component.ts","../../../projects/stream-chat-angular/src/lib/attachment-preview-list/attachment-preview-list.component.html","../../../projects/stream-chat-angular/src/lib/message-input/message-input.component.ts","../../../projects/stream-chat-angular/src/lib/message-input/message-input.component.html","../../../projects/stream-chat-angular/src/lib/modal/modal.component.ts","../../../projects/stream-chat-angular/src/lib/modal/modal.component.html","../../../projects/stream-chat-angular/src/lib/notification/notification.component.ts","../../../projects/stream-chat-angular/src/lib/notification/notification.component.html","../../../projects/stream-chat-angular/src/lib/notification-list/notification-list.component.ts","../../../projects/stream-chat-angular/src/lib/notification-list/notification-list.component.html","../../../projects/stream-chat-angular/src/lib/message-actions-box/message-actions-box.component.ts","../../../projects/stream-chat-angular/src/lib/message-actions-box/message-actions-box.component.html","../../../projects/stream-chat-angular/src/lib/channel/channel.component.ts","../../../projects/stream-chat-angular/src/lib/channel/channel.component.html","../../../projects/stream-chat-angular/src/lib/device-width.ts","../../../projects/stream-chat-angular/src/lib/channel-list/channel-list-toggle.service.ts","../../../projects/stream-chat-angular/src/lib/channel-header/channel-header.component.ts","../../../projects/stream-chat-angular/src/lib/channel-header/channel-header.component.html","../../../projects/stream-chat-angular/src/lib/channel-preview/channel-preview.component.ts","../../../projects/stream-chat-angular/src/lib/channel-preview/channel-preview.component.html","../../../projects/stream-chat-angular/src/lib/channel-list/channel-list.component.ts","../../../projects/stream-chat-angular/src/lib/channel-list/channel-list.component.html","../../../projects/stream-chat-angular/src/lib/message/parse-date.ts","../../../projects/stream-chat-angular/src/lib/message/read-by-text.ts","../../../projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.ts","../../../projects/stream-chat-angular/src/lib/message-reactions/message-reactions.component.html","../../../projects/stream-chat-angular/src/lib/message/message.component.ts","../../../projects/stream-chat-angular/src/lib/message/message.component.html","../../../projects/stream-chat-angular/src/lib/message-input/textarea/textarea.component.ts","../../../projects/stream-chat-angular/src/lib/message-input/textarea/textarea.component.html","../../../projects/stream-chat-angular/src/lib/transliteration.service.ts","../../../projects/stream-chat-angular/src/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.ts","../../../projects/stream-chat-angular/src/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.html","../../../projects/stream-chat-angular/src/lib/message-list/group-styles.ts","../../../projects/stream-chat-angular/src/lib/message-list/message-list.component.ts","../../../projects/stream-chat-angular/src/lib/message-list/message-list.component.html","../../../projects/stream-chat-angular/src/lib/thread/thread.component.ts","../../../projects/stream-chat-angular/src/lib/thread/thread.component.html","../../../projects/stream-chat-angular/src/lib/stream-avatar.module.ts","../../../projects/stream-chat-angular/src/lib/stream-chat.module.ts","../../../projects/stream-chat-angular/src/lib/stream-autocomplete-textarea.module.ts","../../../projects/stream-chat-angular/src/lib/stream-textarea.module.ts","../../../projects/stream-chat-angular/src/public-api.ts","../../../projects/stream-chat-angular/src/stream-chat-angular.ts"],"sourcesContent":["export const version = '2.12.1';\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport type NotificationType = 'success' | 'error';\n\nexport type NotificationPayload = {\n type: NotificationType;\n text: string;\n translateParams?: Object;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationService {\n notifications$: Observable<NotificationPayload[]>;\n private notificationsSubject = new BehaviorSubject<NotificationPayload[]>([]);\n\n constructor() {\n this.notifications$ = this.notificationsSubject.asObservable();\n }\n\n addTemporaryNotification(\n text: string,\n type: NotificationType = 'error',\n timeout: number = 5000,\n translateParams?: Object\n ) {\n this.addNotification(text, type, translateParams);\n const id = setTimeout(() => this.removeNotification(text), timeout);\n\n return () => {\n clearTimeout(id);\n this.removeNotification(text);\n };\n }\n\n addPermanentNotification(\n text: string,\n type: NotificationType = 'error',\n translateParams?: Object\n ) {\n this.addNotification(text, type, translateParams);\n\n return () => this.removeNotification(text);\n }\n\n private addNotification(\n text: string,\n type: NotificationType,\n translateParams?: Object\n ) {\n this.notificationsSubject.next([\n ...this.notificationsSubject.getValue(),\n { text, type, translateParams },\n ]);\n }\n\n private removeNotification(text: string) {\n const notifications = this.notificationsSubject.getValue();\n const index = notifications.findIndex((n) => n.text === text);\n if (index === -1) {\n return;\n }\n notifications.splice(index, 1);\n this.notificationsSubject.next([...notifications]);\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { BehaviorSubject, Observable, ReplaySubject } from 'rxjs';\nimport { OwnUserResponse, UserResponse } from 'stream-chat';\nimport { AppSettings, Event, StreamChat, TokenOrProvider } from 'stream-chat';\nimport { version } from '../assets/version';\nimport { NotificationService } from './notification.service';\n\nexport type Notification = {\n eventType: string;\n event: Event;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ChatClientService {\n chatClient!: StreamChat;\n notification$: Observable<Notification>;\n appSettings$: Observable<AppSettings | undefined>;\n connectionState$: Observable<'offline' | 'online'>;\n private notificationSubject = new ReplaySubject<Notification>(1);\n private connectionStateSubject = new ReplaySubject<'offline' | 'online'>(1);\n private appSettingsSubject = new BehaviorSubject<AppSettings | undefined>(\n undefined\n );\n\n constructor(\n private ngZone: NgZone,\n private notificationService: NotificationService\n ) {\n this.notification$ = this.notificationSubject.asObservable();\n this.connectionState$ = this.connectionStateSubject.asObservable();\n this.appSettings$ = this.appSettingsSubject.asObservable();\n }\n\n async init(\n apiKey: string,\n userOrId: string | OwnUserResponse | UserResponse,\n userTokenOrProvider: TokenOrProvider\n ) {\n this.chatClient = StreamChat.getInstance(apiKey);\n await this.ngZone.runOutsideAngular(async () => {\n const user = typeof userOrId === 'string' ? { id: userOrId } : userOrId;\n await this.chatClient.connectUser(user, userTokenOrProvider);\n this.chatClient.setUserAgent(\n `stream-chat-angular-${version}-${this.chatClient.getUserAgent()}`\n );\n this.chatClient.getAppSettings;\n });\n this.appSettingsSubject.next(undefined);\n this.chatClient.on((e) => {\n this.notificationSubject.next({\n eventType: e.type,\n event: e,\n });\n });\n let removeNotification: undefined | Function;\n this.chatClient.on('connection.changed', (e) => {\n this.ngZone.run(() => {\n const isOnline = e.online;\n if (isOnline) {\n if (removeNotification) {\n removeNotification();\n }\n } else {\n removeNotification =\n this.notificationService.addPermanentNotification(\n 'streamChat.Connection failure, reconnecting now...'\n );\n }\n this.connectionStateSubject.next(isOnline ? 'online' : 'offline');\n });\n });\n }\n\n async disconnectUser() {\n await this.chatClient.disconnectUser();\n }\n\n async getAppSettings() {\n if (this.appSettingsSubject.getValue()) {\n return;\n }\n const settings = await this.chatClient.getAppSettings();\n this.appSettingsSubject.next(settings.app || {});\n }\n\n async flagMessage(messageId: string) {\n await this.chatClient.flagMessage(messageId);\n }\n\n async autocompleteUsers(searchTerm: string) {\n if (!searchTerm) {\n return [];\n }\n const result = await this.chatClient.queryUsers({\n $or: [\n { id: { $autocomplete: searchTerm } },\n { name: { $autocomplete: searchTerm } },\n ],\n id: { $ne: this.chatClient.userID! },\n });\n return result.users;\n }\n}\n","import { Attachment, MessageResponse, UserResponse } from 'stream-chat';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const createMessagePreview = (\n user: UserResponse,\n text: string,\n attachments: Attachment[] = [],\n mentionedUsers: UserResponse[] = [],\n parentId: undefined | string = undefined,\n quotedMessageId: undefined | string = undefined\n) => {\n const clientSideId = `${user.id}-${uuidv4()}`;\n\n return {\n __html: text,\n created_at: new Date(),\n html: text,\n id: clientSideId,\n reactions: [],\n status: 'sending',\n text,\n type: 'regular',\n user,\n attachments,\n mentioned_users: mentionedUsers,\n parent_id: parentId,\n quoted_message_id: quotedMessageId,\n } as unknown as MessageResponse;\n};\n","import { Channel, FormatMessageResponse, UserResponse } from 'stream-chat';\n\nexport const getReadBy = (message: FormatMessageResponse, channel: Channel) => {\n const readBy: UserResponse[] = [];\n Object.keys(channel.state.read).forEach((key) => {\n if (\n channel.state.read[key].last_read.getTime() >=\n message.updated_at.getTime() &&\n message.user?.id !== key\n ) {\n readBy.push(channel.state.read[key].user);\n }\n });\n\n return readBy;\n};\n","import { Injectable, NgZone } from '@angular/core';\nimport {\n BehaviorSubject,\n combineLatest,\n Observable,\n ReplaySubject,\n} from 'rxjs';\nimport { filter, first, map, shareReplay } from 'rxjs/operators';\nimport {\n Attachment,\n Channel,\n ChannelFilters,\n ChannelOptions,\n ChannelSort,\n Event,\n FormatMessageResponse,\n MessageResponse,\n UpdatedMessage,\n UserResponse,\n} from 'stream-chat';\nimport { ChatClientService, Notification } from './chat-client.service';\nimport { createMessagePreview } from './message-preview';\nimport { MessageReactionType } from './message-reactions/message-reactions.component';\nimport { getReadBy } from './read-by';\nimport { AttachmentUpload, StreamMessage } from './types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ChannelService {\n hasMoreChannels$: Observable<boolean>;\n channels$: Observable<Channel[] | undefined>;\n activeChannel$: Observable<Channel | undefined>;\n activeChannelMessages$: Observable<StreamMessage[]>;\n activeParentMessageId$: Observable<string | undefined>;\n activeThreadMessages$: Observable<StreamMessage[]>;\n activeParentMessage$: Observable<StreamMessage | undefined>;\n messageToQuote$: Observable<StreamMessage | undefined>;\n customNewMessageNotificationHandler?: (\n notification: Notification,\n channelListSetter: (channels: Channel[]) => void\n ) => void;\n customAddedToChannelNotificationHandler?: (\n notification: Notification,\n channelListSetter: (channels: Channel[]) => void\n ) => void;\n customRemovedFromChannelNotificationHandler?: (\n notification: Notification,\n channelListSetter: (channels: Channel[]) => void\n ) => void;\n customChannelDeletedHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n customChannelUpdatedHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n customChannelTruncatedHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n customChannelHiddenHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n customChannelVisibleHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n customNewMessageHandler?: (\n event: Event,\n channel: Channel,\n channelListSetter: (channels: Channel[]) => void,\n messageListSetter: (messages: StreamMessage[]) => void,\n threadListSetter: (messages: StreamMessage[]) => void,\n parentMessageSetter: (message: StreamMessage | undefined) => void\n ) => void;\n private channelsSubject = new BehaviorSubject<Channel[] | undefined>(\n undefined\n );\n private activeChannelSubject = new BehaviorSubject<Channel | undefined>(\n undefined\n );\n private activeChannelMessagesSubject = new BehaviorSubject<\n (StreamMessage | MessageResponse | FormatMessageResponse)[]\n >([]);\n private hasMoreChannelsSubject = new ReplaySubject<boolean>(1);\n private activeChannelSubscriptions: { unsubscribe: () => void }[] = [];\n private activeParentMessageIdSubject = new BehaviorSubject<\n string | undefined\n >(undefined);\n private activeThreadMessagesSubject = new BehaviorSubject<\n (StreamMessage | MessageResponse | FormatMessageResponse)[]\n >([]);\n private filters: ChannelFilters | undefined;\n private sort: ChannelSort | undefined;\n private options: ChannelOptions | undefined;\n private readonly messagePageSize = 25;\n private messageToQuoteSubject = new BehaviorSubject<\n StreamMessage | undefined\n >(undefined);\n\n private channelListSetter = (channels: Channel[]) => {\n this.channelsSubject.next(channels);\n };\n\n private messageListSetter = (messages: StreamMessage[]) => {\n this.activeChannelMessagesSubject.next(messages);\n };\n\n private threadListSetter = (messages: StreamMessage[]) => {\n this.activeThreadMessagesSubject.next(messages);\n };\n\n private parentMessageSetter = (message: StreamMessage | undefined) => {\n this.activeParentMessageIdSubject.next(message?.id);\n };\n\n constructor(\n private chatClientService: ChatClientService,\n private ngZone: NgZone\n ) {\n this.channels$ = this.channelsSubject.asObservable();\n this.activeChannel$ = this.activeChannelSubject.asObservable();\n this.activeChannelMessages$ = this.activeChannelMessagesSubject.pipe(\n map((messages) => {\n const channel = this.activeChannelSubject.getValue()!;\n return messages.map((message) =>\n this.transformToStreamMessage(message, channel)\n );\n })\n );\n this.hasMoreChannels$ = this.hasMoreChannelsSubject.asObservable();\n this.activeParentMessageId$ =\n this.activeParentMessageIdSubject.asObservable();\n this.activeThreadMessages$ = this.activeThreadMessagesSubject.pipe(\n map((messages) => {\n const channel = this.activeChannelSubject.getValue()!;\n return messages.map((message) =>\n this.transformToStreamMessage(message, channel)\n );\n })\n );\n this.activeParentMessage$ = combineLatest([\n this.activeChannelMessages$,\n this.activeParentMessageId$,\n ]).pipe(\n map(\n ([messages, parentMessageId]: [\n StreamMessage[],\n string | undefined\n ]) => {\n if (!parentMessageId) {\n return undefined;\n } else {\n return messages.find((m) => m.id === parentMessageId);\n }\n }\n ),\n shareReplay()\n );\n this.messageToQuote$ = this.messageToQuoteSubject.asObservable();\n\n this.chatClientService.connectionState$\n .pipe(filter((s) => s === 'online'))\n .subscribe(() => {\n void this.setAsActiveParentMessage(undefined);\n });\n }\n\n setAsActiveChannel(channel: Channel) {\n const prevActiveChannel = this.activeChannelSubject.getValue();\n this.stopWatchForActiveChannelEvents(prevActiveChannel);\n this.watchForActiveChannelEvents(channel);\n this.activeChannelSubject.next(channel);\n channel.state.messages.forEach((m) => {\n m.readBy = getReadBy(m, channel);\n });\n if (this.canSendReadEvents) {\n void channel.markRead();\n }\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n this.activeParentMessageIdSubject.next(undefined);\n this.activeThreadMessagesSubject.next([]);\n this.messageToQuoteSubject.next(undefined);\n }\n\n async setAsActiveParentMessage(message: StreamMessage | undefined) {\n const messageToQuote = this.messageToQuoteSubject.getValue();\n if (messageToQuote && !!messageToQuote.parent_id) {\n this.messageToQuoteSubject.next(undefined);\n }\n if (!message) {\n this.activeParentMessageIdSubject.next(undefined);\n this.activeThreadMessagesSubject.next([]);\n } else {\n this.activeParentMessageIdSubject.next(message.id);\n const activeChannel = this.activeChannelSubject.getValue();\n const result = await activeChannel?.getReplies(message.id, {\n limit: this.options?.message_limit,\n });\n this.activeThreadMessagesSubject.next(result?.messages || []);\n }\n }\n\n // load more thread replies\n async loadMoreMessages() {\n const activeChnannel = this.activeChannelSubject.getValue();\n const lastMessageId = this.activeChannelMessagesSubject.getValue()[0]?.id;\n await activeChnannel?.query({\n messages: { limit: this.options?.message_limit, id_lt: lastMessageId },\n members: { limit: 0 },\n watchers: { limit: 0 },\n });\n if (\n activeChnannel?.data?.id ===\n this.activeChannelSubject.getValue()?.data?.id\n ) {\n this.activeChannelMessagesSubject.next([\n ...activeChnannel!.state.messages,\n ]);\n }\n }\n\n async loadMoreThreadReplies() {\n const activeChnannel = this.activeChannelSubject.getValue();\n const parentMessageId = this.activeParentMessageIdSubject.getValue();\n if (!parentMessageId) {\n return;\n }\n const lastMessageId = this.activeThreadMessagesSubject.getValue()[0]?.id;\n await activeChnannel?.getReplies(parentMessageId, {\n limit: this.options?.message_limit,\n id_lt: lastMessageId,\n });\n this.activeThreadMessagesSubject.next(\n activeChnannel?.state.threads[parentMessageId] || []\n );\n }\n\n async init(\n filters: ChannelFilters,\n sort?: ChannelSort,\n options?: ChannelOptions\n ) {\n this.filters = filters;\n this.options = options || {\n offset: 0,\n limit: 25,\n state: true,\n presence: true,\n watch: true,\n message_limit: this.messagePageSize,\n };\n this.sort = sort || { last_message_at: -1, updated_at: -1 };\n await this.queryChannels();\n this.chatClientService.notification$.subscribe(\n (notification) => void this.handleNotification(notification)\n );\n }\n\n reset() {\n this.activeChannelMessagesSubject.next([]);\n this.activeChannelSubject.next(undefined);\n this.activeParentMessageIdSubject.next(undefined);\n this.activeThreadMessagesSubject.next([]);\n this.channelsSubject.next(undefined);\n this.selectMessageToQuote(undefined);\n }\n\n async loadMoreChannels() {\n this.options!.offset = this.channels.length!;\n await this.queryChannels();\n }\n\n async addReaction(messageId: string, reactionType: MessageReactionType) {\n await this.activeChannelSubject.getValue()?.sendReaction(messageId, {\n type: reactionType,\n });\n }\n\n async removeReaction(messageId: string, reactionType: MessageReactionType) {\n await this.activeChannelSubject\n .getValue()\n ?.deleteReaction(messageId, reactionType);\n }\n\n async sendMessage(\n text: string,\n attachments: Attachment[] = [],\n mentionedUsers: UserResponse[] = [],\n parentId: string | undefined = undefined,\n quotedMessageId: string | undefined = undefined\n ) {\n const preview = createMessagePreview(\n this.chatClientService.chatClient.user!,\n text,\n attachments,\n mentionedUsers,\n parentId,\n quotedMessageId\n );\n const channel = this.activeChannelSubject.getValue()!;\n preview.readBy = [];\n channel.state.addMessageSorted(preview, true);\n await this.sendMessageRequest(preview);\n }\n\n async resendMessage(message: StreamMessage) {\n const channel = this.activeChannelSubject.getValue()!;\n channel.state.addMessageSorted(\n {\n ...(message as any as MessageResponse),\n errorStatusCode: undefined,\n status: 'sending',\n },\n true\n );\n await this.sendMessageRequest(message);\n }\n\n async updateMessage(message: StreamMessage) {\n await this.chatClientService.chatClient.updateMessage(\n message as UpdatedMessage\n );\n }\n\n async deleteMessage(message: StreamMessage) {\n await this.chatClientService.chatClient.deleteMessage(message.id);\n }\n\n async uploadAttachments(\n uploads: AttachmentUpload[]\n ): Promise<AttachmentUpload[]> {\n const result: AttachmentUpload[] = [];\n const channel = this.activeChannelSubject.getValue()!;\n const uploadResults = await Promise.allSettled(\n uploads.map((upload) =>\n upload.type === 'image'\n ? channel.sendImage(upload.file)\n : channel.sendFile(upload.file)\n )\n );\n uploadResults.forEach((uploadResult, i) => {\n const file = uploads[i].file;\n const type = uploads[i].type;\n if (uploadResult.status === 'fulfilled') {\n result.push({\n file,\n type,\n state: 'success',\n url: uploadResult.value.file,\n });\n } else {\n result.push({ file, type, state: 'error' });\n }\n });\n\n return result;\n }\n\n async deleteAttachment(attachmentUpload: AttachmentUpload) {\n const channel = this.activeChannelSubject.getValue()!;\n await (attachmentUpload.type === 'image'\n ? channel.deleteImage(attachmentUpload.url!)\n : channel.deleteFile(attachmentUpload.url!));\n }\n\n async autocompleteMembers(searchTerm: string) {\n const activeChannel = this.activeChannelSubject.getValue();\n if (!activeChannel) {\n return [];\n }\n if (Object.keys(activeChannel.state.members).length <= 100) {\n return Object.values(activeChannel.state.members).filter(\n (m) => m.user?.id !== this.chatClientService.chatClient.userID!\n );\n } else {\n if (!searchTerm) {\n return [];\n }\n const result = await activeChannel.queryMembers({\n name: { $autocomplete: searchTerm },\n id: { $ne: this.chatClientService.chatClient.userID! },\n });\n return Object.values(result.members);\n }\n }\n\n async sendAction(messageId: string, formData: Record<string, string>) {\n const channel = this.activeChannelSubject.getValue()!;\n const response = await channel.sendAction(messageId, formData);\n if (response?.message) {\n channel.state.addMessageSorted({\n ...response.message,\n status: 'received',\n });\n const isThreadReply = !!response.message.parent_id;\n isThreadReply\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[response.message.parent_id!],\n ])\n : this.activeChannelMessagesSubject.next([...channel.state.messages]);\n } else {\n channel.state.removeMessage({ id: messageId });\n if (\n this.activeChannelMessagesSubject\n .getValue()\n .find((m) => m.id === messageId)\n ) {\n this.activeChannelMessagesSubject.next([...channel.state.messages]);\n } else if (\n this.activeThreadMessagesSubject\n .getValue()\n .find((m) => m.id === messageId)\n ) {\n this.activeThreadMessagesSubject.next(\n channel.state.threads[this.activeParentMessageIdSubject.getValue()!]\n );\n }\n }\n }\n\n selectMessageToQuote(message: StreamMessage | undefined) {\n this.messageToQuoteSubject.next(message);\n }\n\n private async sendMessageRequest(preview: MessageResponse | StreamMessage) {\n const channel = this.activeChannelSubject.getValue()!;\n const isThreadReply = !!preview.parent_id;\n isThreadReply\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[preview.parent_id!],\n ])\n : this.activeChannelMessagesSubject.next([...channel.state.messages]);\n try {\n const response = await channel.sendMessage({\n text: preview.text,\n attachments: preview.attachments,\n mentioned_users: preview.mentioned_users?.map((u) => u.id),\n id: preview.id,\n parent_id: preview.parent_id,\n quoted_message_id: preview.quoted_message_id,\n });\n if (response?.message) {\n channel.state.addMessageSorted(\n {\n ...response.message,\n status: 'received',\n },\n true\n );\n isThreadReply\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[preview.parent_id!],\n ])\n : this.activeChannelMessagesSubject.next([...channel.state.messages]);\n }\n } catch (error) {\n const stringError = JSON.stringify(error);\n const parsedError: { status?: number } = stringError\n ? (JSON.parse(stringError) as { status?: number })\n : {};\n\n channel.state.addMessageSorted(\n {\n ...(preview as MessageResponse),\n errorStatusCode: parsedError.status || undefined,\n status: 'failed',\n },\n true\n );\n isThreadReply\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[preview.parent_id!],\n ])\n : this.activeChannelMessagesSubject.next([...channel.state.messages]);\n }\n }\n\n private async handleNotification(notification: Notification) {\n switch (notification.eventType) {\n case 'notification.message_new': {\n await this.ngZone.run(async () => {\n if (this.customNewMessageNotificationHandler) {\n this.customNewMessageNotificationHandler(\n notification,\n this.channelListSetter\n );\n } else {\n await this.handleNewMessageNotification(notification);\n }\n });\n break;\n }\n case 'notification.added_to_channel': {\n await this.ngZone.run(async () => {\n if (this.customAddedToChannelNotificationHandler) {\n this.customAddedToChannelNotificationHandler(\n notification,\n this.channelListSetter\n );\n } else {\n await this.handleAddedToChannelNotification(notification);\n }\n });\n break;\n }\n case 'notification.removed_from_channel': {\n this.ngZone.run(() => {\n if (this.customRemovedFromChannelNotificationHandler) {\n this.customRemovedFromChannelNotificationHandler(\n notification,\n this.channelListSetter\n );\n } else {\n this.handleRemovedFromChannelNotification(notification);\n }\n });\n }\n }\n }\n\n private handleRemovedFromChannelNotification(notification: Notification) {\n const channelIdToBeRemoved = notification.event.channel!.cid;\n this.removeFromChannelList(channelIdToBeRemoved);\n }\n\n private async handleNewMessageNotification(notification: Notification) {\n await this.addChannelFromNotification(notification);\n }\n\n private async handleAddedToChannelNotification(notification: Notification) {\n await this.addChannelFromNotification(notification);\n }\n\n private async addChannelFromNotification(notification: Notification) {\n const channel = this.chatClientService.chatClient.channel(\n notification.event.channel?.type!,\n notification.event.channel?.id\n );\n await channel.watch();\n this.watchForChannelEvents(channel);\n this.channelsSubject.next([\n channel,\n ...(this.channelsSubject.getValue() || []),\n ]);\n }\n\n private removeFromChannelList(cid: string) {\n const channels = this.channels.filter((c) => c.cid !== cid);\n if (channels.length < this.channels.length) {\n this.channelsSubject.next(channels);\n if (this.activeChannelSubject.getValue()!.cid === cid) {\n this.setAsActiveChannel(channels[0]);\n }\n }\n }\n\n private watchForActiveChannelEvents(channel: Channel) {\n this.activeChannelSubscriptions.push(\n channel.on('message.new', (event) => {\n this.ngZone.run(() => {\n event.message && event.message.parent_id\n ? this.activeThreadMessagesSubject.next([\n ...channel.state.threads[event.message.parent_id],\n ])\n : this.activeChannelMessagesSubject.next([\n ...channel.state.messages,\n ]);\n this.activeChannel$.pipe(first()).subscribe((c) => {\n if (this.canSendReadEvents) {\n void c?.markRead();\n }\n });\n });\n })\n );\n this.activeChannelSubscriptions.push(\n channel.on('message.updated', (event) => this.messageUpdated(event))\n );\n this.activeChannelSubscriptions.push(\n channel.on('message.deleted', (event) => this.messageUpdated(event))\n );\n this.activeChannelSubscriptions.push(\n channel.on('reaction.new', (e) => this.messageReactionEventReceived(e))\n );\n this.activeChannelSubscriptions.push(\n channel.on('reaction.deleted', (e) =>\n this.messageReactionEventReceived(e)\n )\n );\n this.activeChannelSubscriptions.push(\n channel.on('reaction.updated', (e) =>\n this.messageReactionEventReceived(e)\n )\n );\n this.activeChannelSubscriptions.push(\n channel.on('message.read', (e) => {\n this.ngZone.run(() => {\n let latestMessage!: StreamMessage;\n this.activeChannelMessages$.pipe(first()).subscribe((messages) => {\n latestMessage = messages[messages.length - 1];\n });\n if (!latestMessage || !e.user) {\n return;\n }\n latestMessage.readBy = getReadBy(latestMessage, channel);\n\n this.activeChannelMessagesSubject.next(\n this.activeChannelMessagesSubject.getValue()\n );\n });\n })\n );\n }\n\n private messageUpdated(event: Event) {\n this.ngZone.run(() => {\n const isThreadReply = event.message && event.message.parent_id;\n const messages = isThreadReply\n ? this.activeThreadMessagesSubject.getValue()\n : this.activeChannelMessagesSubject.getValue();\n const messageIndex = messages.findIndex(\n (m) => m.id === event.message?.id\n );\n if (messageIndex !== -1 && event.message) {\n messages[messageIndex] = event.message;\n isThreadReply\n ? this.activeThreadMessagesSubject.next([...messages])\n : this.activeChannelMessagesSubject.next([...messages]);\n }\n });\n }\n\n private messageReactionEventReceived(e: Event) {\n this.ngZone.run(() => {\n const isThreadMessage = e.message && e.message.parent_id;\n let messages!: StreamMessage[];\n (isThreadMessage\n ? this.activeThreadMessages$\n : this.activeChannelMessages$\n )\n .pipe(first())\n .subscribe((m) => (messages = m));\n const message = messages.find((m) => m.id === e?.message?.id);\n if (!message) {\n return;\n }\n message.reaction_counts = { ...e.message?.reaction_counts };\n message.reaction_scores = { ...e.message?.reaction_scores };\n message.latest_reactions = [...(e.message?.latest_reactions || [])];\n message.own_reactions = [...(e.message?.own_reactions || [])];\n isThreadMessage\n ? this.activeThreadMessagesSubject.next([...messages])\n : this.activeChannelMessagesSubject.next([...messages]);\n });\n }\n\n private formatMessage(message: MessageResponse) {\n return {\n ...message,\n // parse the date..\n pinned_at: message.pinned_at ? new Date(message.pinned_at) : null,\n created_at: message.created_at\n ? new Date(message.created_at)\n : new Date(),\n updated_at: message.updated_at\n ? new Date(message.updated_at)\n : new Date(),\n status: message.status || 'received',\n };\n }\n\n private isStreamMessage(\n message: StreamMessage | FormatMessageResponse | MessageResponse\n ): message is StreamMessage {\n return !!message.readBy;\n }\n\n private isFormatMessageResponse(\n message: StreamMessage | FormatMessageResponse | MessageResponse\n ): message is FormatMessageResponse {\n return message.created_at instanceof Date;\n }\n\n private stopWatchForActiveChannelEvents(channel: Channel | undefined) {\n if (!channel) {\n return;\n }\n this.activeChannelSubscriptions.forEach((s) => s.unsubscribe());\n this.activeChannelSubscriptions = [];\n }\n\n private async queryChannels() {\n try {\n const channels = await this.chatClientService.chatClient.queryChannels(\n this.filters!,\n this.sort,\n this.options\n );\n channels.forEach((c) => this.watchForChannelEvents(c));\n const prevChannels = this.channelsSubject.getValue() || [];\n this.channelsSubject.next([...prevChannels, ...channels]);\n if (channels.length > 0 && !this.activeChannelSubject.getValue()) {\n this.setAsActiveChannel(channels[0]);\n }\n this.hasMoreChannelsSubject.next(channels.length >= this.options!.limit!);\n } catch (error) {\n this.channelsSubject.error(error);\n }\n }\n\n private watchForChannelEvents(channel: Channel) {\n channel.on((event: Event) => {\n switch (event.type) {\n case 'message.new': {\n this.ngZone.run(() => {\n if (this.customNewMessageHandler) {\n this.customNewMessageHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleNewMessage(event, channel);\n }\n });\n break;\n }\n case 'channel.hidden': {\n this.ngZone.run(() => {\n if (this.customChannelHiddenHandler) {\n this.customChannelHiddenHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelHidden(event);\n }\n });\n break;\n }\n case 'channel.deleted': {\n this.ngZone.run(() => {\n if (this.customChannelDeletedHandler) {\n this.customChannelDeletedHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelDeleted(event);\n }\n });\n break;\n }\n case 'channel.visible': {\n this.ngZone.run(() => {\n if (this.customChannelVisibleHandler) {\n this.customChannelVisibleHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelVisible(event, channel);\n }\n });\n break;\n }\n case 'channel.updated': {\n this.ngZone.run(() => {\n if (this.customChannelUpdatedHandler) {\n this.customChannelUpdatedHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelUpdate(event);\n }\n });\n break;\n }\n case 'channel.truncated': {\n this.ngZone.run(() => {\n if (this.customChannelTruncatedHandler) {\n this.customChannelTruncatedHandler(\n event,\n channel,\n this.channelListSetter,\n this.messageListSetter,\n this.threadListSetter,\n this.parentMessageSetter\n );\n } else {\n this.handleChannelTruncate(event);\n }\n });\n break;\n }\n }\n });\n }\n\n private handleNewMessage(_: Event, channel: Channel) {\n const channelIndex = this.channels.findIndex((c) => c.cid === channel.cid);\n this.channels.splice(channelIndex, 1);\n this.channelsSubject.next([channel, ...this.channels]);\n }\n\n private handleChannelHidden(event: Event) {\n this.removeFromChannelList(event.channel!.cid);\n }\n\n private handleChannelDeleted(event: Event) {\n this.removeFromChannelList(event.channel!.cid);\n }\n\n private handleChannelVisible(event: Event, channel: Channel) {\n if (!this.channels.find((c) => c.cid === event.cid)) {\n this.ngZone.run(() =>\n this.channelsSubject.next([...this.channels, channel])\n );\n }\n }\n\n private handleChannelUpdate(event: Event) {\n const channelIndex = this.channels.findIndex(\n (c) => c.cid === event.channel!.cid\n );\n if (channelIndex !== -1) {\n this.channels[channelIndex].data = event.channel;\n this.channelsSubject.next([...this.channels]);\n if (event.channel?.cid === this.activeChannelSubject.getValue()?.cid) {\n const channel = this.activeChannelSubject.getValue()!;\n channel.data = event.channel;\n this.activeChannelSubject.next(channel);\n }\n }\n }\n\n // truncate active thread as well\n private handleChannelTruncate(event: Event) {\n const channelIndex = this.channels.findIndex(\n (c) => c.cid === event.channel!.cid\n );\n if (channelIndex !== -1) {\n this.channels[channelIndex].state.messages = [];\n this.channelsSubject.next([...this.channels]);\n if (event.channel?.cid === this.activeChannelSubject.getValue()?.cid) {\n const channel = this.activeChannelSubject.getValue()!;\n channel.state.messages = [];\n this.activeChannelSubject.next(channel);\n this.activeChannelMessagesSubject.next([]);\n this.activeParentMessageIdSubject.next(undefined);\n this.activeThreadMessagesSubject.next([]);\n }\n }\n }\n\n private get channels() {\n return this.channelsSubject.getValue() || [];\n }\n\n private get canSendReadEvents() {\n const channel = this.activeChannelSubject.getValue();\n if (!channel) {\n return false;\n }\n const capabilites = channel.data?.own_capabilities as string[];\n return capabilites.indexOf('read-events') !== -1;\n }\n\n private transformToStreamMessage(\n message: StreamMessage | MessageResponse | FormatMessageResponse,\n channel: Channel\n ) {\n const isThreadMessage = !!message.parent_id;\n if (\n this.isStreamMessage(message) &&\n this.isFormatMessageResponse(message)\n ) {\n return message;\n } else if (this.isFormatMessageResponse(message)) {\n return {\n ...message,\n readBy: isThreadMessage ? [] : getReadBy(message, channel),\n };\n } else {\n const formatMessage = this.formatMessage(message);\n return {\n ...formatMessage,\n readBy: isThreadMessage ? [] : getReadBy(formatMessage, channel),\n };\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nexport type Theme = 'light' | 'dark';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ThemeService {\n theme$ = new BehaviorSubject<Theme>('light');\n private _customLightThemeVariables: { [key: string]: string } | undefined;\n private _customDarkThemeVariables: { [key: string]: string } | undefined;\n private defaultDarkModeVariables = {\n '--bg-gradient-end': '#101214',\n '--bg-gradient-start': '#070a0d',\n '--black': '#ffffff',\n '--blue-alice': '#00193d',\n '--border': '#141924',\n '--button-background': '#ffffff',\n '--button-text': '#005fff',\n '--grey': '#7a7a7a',\n '--grey-gainsboro': '#2d2f2f',\n '--grey-whisper': '#1c1e22',\n '--modal-shadow': '#000000',\n '--overlay': '#00000066', // 66 = 40% opacity\n '--overlay-dark': '#ffffffcc', // CC = 80% opacity\n '--shadow-icon': '#00000080', // 80 = 50% opacity\n '--targetedMessageBackground': '#302d22',\n '--transparent': 'transparent',\n '--white': '#101418',\n '--white-smoke': '#13151b',\n '--white-snow': '#070a0d',\n };\n\n constructor() {\n this.theme$.subscribe((theme) => {\n const darkVariables = this.customDarkThemeVariables\n ? { ...this.defaultDarkModeVariables, ...this.customDarkThemeVariables }\n : this.defaultDarkModeVariables;\n const lightVariables = this.customLightThemeVariables\n ? this.customLightThemeVariables\n : {};\n if (theme === 'dark') {\n this.deleteVariables(lightVariables);\n this.setVariables(darkVariables);\n } else {\n this.deleteVariables(darkVariables);\n this.setVariables(lightVariables);\n }\n });\n }\n\n get customLightThemeVariables() {\n return this._customLightThemeVariables;\n }\n\n set customLightThemeVariables(\n variables: { [key: string]: string } | undefined\n ) {\n const prevVariables = this.customLightThemeVariables;\n this.deleteVariables(prevVariables);\n this._customLightThemeVariables = variables;\n }\n\n get customDarkThemeVariables() {\n return this._customDarkThemeVariables;\n }\n\n set customDarkThemeVariables(\n variables: { [key: string]: string } | undefined\n ) {\n const prevVariables = this.customDarkThemeVariables;\n this.deleteVariables(prevVariables);\n this._customDarkThemeVariables = variables;\n }\n\n private deleteVariables(variables: { [key: string]: string } | undefined) {\n if (!variables) {\n return;\n }\n Object.keys(variables).forEach((key) =>\n document.documentElement.style.setProperty(key, null)\n );\n }\n\n private setVariables(variables: { [key: string]: string } | undefined) {\n if (!variables) {\n return;\n }\n Object.keys(variables).forEach((key) =>\n document.documentElement.style.setProperty(key, variables[key])\n );\n }\n}\n","export const isImageFile = (file: File) => {\n // photoshop files begin with 'image/'\n return file.type.startsWith('image/') && !file.type.endsWith('.photoshop');\n};\n","import { Attachment } from 'stream-chat';\n\nexport const isImageAttachment = (attachment: Attachment) => {\n return (\n attachment.type === 'image' &&\n !attachment.title_link &&\n !attachment.og_scrape_url\n );\n};\n","import { Injectable } from '@angular/core';\nimport { isImageFile } from './is-image-file';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { Attachment } from 'stream-chat';\nimport { ChannelService } from './channel.service';\nimport { isImageAttachment } from './is-image-attachment';\nimport { NotificationService } from './notification.service';\nimport { AttachmentUpload } from './types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AttachmentService {\n attachmentUploadInProgressCounter$: Observable<number>;\n attachmentUploads$: Observable<AttachmentUpload[]>;\n private attachmentUploadInProgressCounterSubject =\n new BehaviorSubject<number>(0);\n private attachmentUploadsSubject = new BehaviorSubject<AttachmentUpload[]>(\n []\n );\n\n constructor(\n private channelService: ChannelService,\n private notificationService: NotificationService\n ) {\n this.attachmentUploadInProgressCounter$ =\n this.attachmentUploadInProgressCounterSubject.asObservable();\n this.attachmentUploads$ = this.attachmentUploadsSubject.asObservable();\n }\n\n resetAttachmentUploads() {\n this.attachmentUploadsSubject.next([]);\n }\n\n async filesSelected(fileList: FileList | null) {\n if (!fileList) {\n return;\n }\n const imageFiles: File[] = [];\n const dataFiles: File[] = [];\n\n Array.from(fileList).forEach((file) => {\n if (isImageFile(file)) {\n imageFiles.push(file);\n } else {\n dataFiles.push(file);\n }\n });\n imageFiles.forEach((f) => this.createPreview(f));\n const newUploads = [\n ...imageFiles.map((file) => ({\n file,\n state: 'uploading' as 'uploading',\n type: 'image' as 'image',\n })),\n ...dataFiles.map((file) => ({\n file,\n state: 'uploading' as 'uploading',\n type: 'file' as 'file',\n })),\n ];\n this.attachmentUploadsSubject.next([\n ...this.attachmentUploadsSubject.getValue(),\n ...newUploads,\n ]);\n await this.uploadAttachments(newUploads);\n }\n\n async retryAttachmentUpload(file: File) {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n const upload = attachmentUploads.find((u) => u.file === file);\n if (!upload) {\n return;\n }\n upload.state = 'uploading';\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n await this.uploadAttachments([upload]);\n }\n\n async deleteAttachment(upload: AttachmentUpload) {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n if (upload.state === 'success') {\n try {\n await this.channelService.deleteAttachment(upload);\n attachmentUploads.splice(attachmentUploads.indexOf(upload), 1);\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error deleting attachment'\n );\n }\n } else {\n attachmentUploads.splice(attachmentUploads.indexOf(upload), 1);\n }\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n }\n\n mapToAttachments() {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n return attachmentUploads\n .filter((r) => r.state === 'success')\n .map((r) => {\n const attachment: Attachment = {\n type: r.type,\n };\n if (r.type === 'image') {\n attachment.fallback = r.file?.name;\n attachment.image_url = r.url;\n } else {\n attachment.asset_url = r.url;\n attachment.title = r.file?.name;\n attachment.file_size = r.file?.size;\n }\n\n return attachment;\n });\n }\n\n createFromAttachments(attachments: Attachment[]) {\n const attachmentUploads: AttachmentUpload[] = [];\n attachments.forEach((attachment) => {\n if (isImageAttachment(attachment)) {\n attachmentUploads.push({\n url: (attachment.img_url ||\n attachment.thumb_url ||\n attachment.image_url) as string,\n state: 'success',\n type: 'image',\n file: {\n name: attachment.fallback,\n } as File,\n });\n } else if (attachment.type === 'file') {\n attachmentUploads.push({\n url: attachment.asset_url,\n state: 'success',\n file: {\n name: attachment.title,\n size: attachment.file_size,\n } as File,\n type: 'file',\n });\n }\n });\n\n if (attachmentUploads.length > 0) {\n this.attachmentUploadsSubject.next([\n ...this.attachmentUploadsSubject.getValue(),\n ...attachmentUploads,\n ]);\n }\n }\n\n private createPreview(file: File) {\n const reader = new FileReader();\n reader.onload = (event) => {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n const upload = attachmentUploads.find((upload) => upload.file === file);\n if (!upload) {\n return;\n }\n upload.previewUri = event.target?.result || undefined;\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n };\n reader.readAsDataURL(file as Blob);\n }\n\n private async uploadAttachments(uploads: AttachmentUpload[]) {\n const attachmentUploads = this.attachmentUploadsSubject.getValue();\n this.attachmentUploadInProgressCounterSubject.next(\n this.attachmentUploadInProgressCounterSubject.getValue() + 1\n );\n const result = await this.channelService.uploadAttachments(uploads);\n result.forEach((r) => {\n const upload = attachmentUploads.find((upload) => upload.file === r.file);\n if (!upload) {\n if (r.url) {\n void this.channelService.deleteAttachment(r);\n }\n return;\n }\n upload.state = r.state;\n upload.url = r.url;\n if (upload.state === 'error') {\n this.notificationService.addTemporaryNotification(\n upload.type === 'image'\n ? 'streamChat.Error uploading image'\n : 'streamChat.Error uploading file'\n );\n }\n });\n this.attachmentUploadInProgressCounterSubject.next(\n this.attachmentUploadInProgressCounterSubject.getValue() - 1\n );\n this.attachmentUploadsSubject.next([...attachmentUploads]);\n }\n}\n","export const en = {\n streamChat: {\n '1 reply': '1 reply',\n 'Attach files': 'Attach files',\n Cancel: 'Cancel',\n 'Channel Missing': 'Channel Missing',\n Close: 'Close',\n 'Close emoji picker': 'Close emoji picker',\n 'Commands matching': 'Commands matching',\n 'Connection failure, reconnecting now...':\n 'Connection failure, reconnecting now...',\n Delete: 'Delete',\n Delivered: 'Delivered',\n 'Edit Message': 'Edit Message',\n 'Edit message request failed': 'Edit message request failed',\n 'Emoji matching': 'Emoji matching',\n 'Empty message...': 'Empty message...',\n 'Error adding flag': 'Error adding flag',\n 'Error connecting to chat, refresh the page to try again.':\n 'Error connecting to chat, refresh the page to try again.',\n 'Error deleting message': 'Error deleting message',\n 'Error muting a user ...': 'Error muting a user ...',\n 'Error pinning message': 'Error pinning message',\n 'Error removing message pin': 'Error removing message pin',\n 'Error unmuting a user ...': 'Error unmuting a user ...',\n 'Error uploading file': 'Error uploading file',\n 'Error uploading image': 'Error uploading image',\n 'Error deleting attachment': 'Error deleting attachment',\n 'Error · Unsent': 'Error · Unsent',\n 'Error: {{ errorMessage }}': 'Error: {{ errorMessage }}',\n Flag: 'Flag',\n 'Message Failed': 'Message Failed',\n 'Message Failed · Unauthorized': 'Message Failed · Unauthorized',\n 'Message Failed · Click to try again':\n 'Message Failed · Click to try again',\n 'Message deleted': 'Message deleted',\n 'Message has been successfully flagged':\n 'Message has been successfully flagged',\n 'Message pinned': 'Message pinned',\n Mute: 'Mute',\n New: 'New',\n 'New Messages!': 'New Messages!',\n 'No results found': 'No results found',\n 'Nothing yet...': 'Nothing yet...',\n 'Only visible to you': 'Only visible to you',\n 'Open emoji picker': 'Open emoji picker',\n 'People matching': 'People matching',\n 'Pick your emoji': 'Pick your emoji',\n Pin: 'Pin',\n 'Pinned by': 'Pinned by',\n Reply: 'Reply',\n 'Reply to Message': 'Reply to Message',\n Search: 'Search',\n 'Searching...': 'Searching...',\n Send: 'Send',\n 'Send message request failed': 'Send message request failed',\n 'Sending...': 'Sending...',\n 'Slow Mode ON': 'Slow Mode ON',\n 'Start of a new thread': 'Start of a new thread',\n 'This message was deleted...': 'This message was deleted...',\n Thread: 'Thread',\n 'Type your message': 'Type your message',\n Unmute: 'Unmute',\n Unpin: 'Unpin',\n 'Wait until all attachments have uploaded':\n 'Wait until all attachments have uploaded',\n 'You have no channels currently': 'You have no channels currently',\n \"You've reached the maximum number of files\":\n \"You've reached the maximum number of files\",\n live: 'live',\n 'this content could not be displayed':\n 'this content could not be displayed',\n '{{ commaSeparatedUsers }} and {{ moreCount }} more':\n '{{ commaSeparatedUsers }} and {{ moreCount }} more',\n '{{ commaSeparatedUsers }}, and {{ lastUser }}':\n '{{ commaSeparatedUsers }}, and {{ lastUser }}',\n '{{ firstUser }} and {{ secondUser }}':\n '{{ firstUser }} and {{ secondUser }}',\n '{{ imageCount }} more': '{{ imageCount }} more',\n '{{ memberCount }} members': '{{ memberCount }} members',\n '{{ replyCount }} replies': '{{ replyCount }} replies',\n '{{ user }} has been muted': '{{ user }} has been muted',\n '{{ user }} has been unmuted': '{{ user }} has been unmuted',\n '{{ watcherCount }} online': '{{ watcherCount }} online',\n '🏙 Attachment...': '🏙 Attachment...',\n 'Connection error': 'Connection error',\n 'Load more': 'Load more',\n failed: 'failed',\n retry: 'retry',\n test: 'success',\n 'Sending links is not allowed in this conversation':\n 'Sending links is not allowed in this conversation',\n \"You can't send messages in this channel\":\n \"You can't send messages in this channel\",\n \"You can't send thread replies in this channel\":\n \"You can't send thread replies in this channel\",\n 'Unsupported file type: {{type}}': 'Unsupported file type: {{type}}',\n },\n};\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { en } from '../assets/i18n/en';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class StreamI18nService {\n constructor(private translteService: TranslateService) {}\n\n setTranslation(lang = 'en', overrides?: { [key: string]: string }) {\n if (!this.translteService.defaultLang) {\n this.translteService.defaultLang = lang;\n }\n this.translteService.setTranslation(\n lang,\n { streamChat: { ...en.streamChat, ...overrides } },\n true\n );\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'stream-avatar',\n templateUrl: './avatar.component.html',\n styleUrls: ['./avatar.component.scss'],\n})\nexport class AvatarComponent {\n @Input() name: string | undefined;\n @Input() imageUrl: string | undefined;\n @Input() size = 32;\n isLoaded = false;\n isError = false;\n\n constructor() {}\n\n get initials() {\n return (this.name?.toString() || '').charAt(0);\n }\n}\n","<div\n class=\"str-chat__avatar str-chat__avatar--circle\"\n title=\"{{ name }}\"\n [style]=\"{\n flexBasis: size + 'px',\n fontSize: size / 2 + 'px',\n height: size + 'px',\n lineHeight: size + 'px',\n width: size + 'px'\n }\"\n>\n <img\n *ngIf=\"imageUrl && !isError; else fallback\"\n class=\"str-chat__avatar-image str-chat__avatar-image{{\n isLoaded ? ' str-chat__avatar-image--loaded' : ''\n }}\"\n src=\"{{ imageUrl }}\"\n alt=\"{{ initials }}\"\n data-testid=\"avatar-img\"\n (load)=\"isLoaded = true\"\n (error)=\"isError = true\"\n [style]=\"{\n flexBasis: size + 'px',\n height: size + 'px',\n objectFit: 'cover',\n width: size + 'px'\n }\"\n />\n <ng-template #fallback>\n <div data-testid=\"fallback-img\" class=\"str-chat__avatar-fallback\">\n {{ initials }}\n </div>\n </ng-template>\n</div>\n","import { Component, Input } from '@angular/core';\n\nexport type Icon =\n | 'action-icon'\n | 'delivered-icon'\n | 'reaction-icon'\n | 'connection-error'\n | 'send'\n | 'file-upload'\n | 'retry'\n | 'close'\n | 'file'\n | 'reply'\n | 'close-no-outline'\n | 'reply-in-thread';\n\n@Component({\n selector: 'stream-icon',\n templateUrl: './icon.component.html',\n styles: [],\n})\nexport class IconComponent {\n @Input() icon: Icon | undefined;\n @Input() size: number | undefined;\n constructor() {}\n}\n","<svg\n data-testid=\"action-icon\"\n *ngIf=\"icon === 'action-icon'\"\n height=\"4\"\n viewBox=\"0 0 11 4\"\n width=\"11\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M1.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'delivered-icon'\"\n height=\"16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"delivered-icon\"\n>\n <path\n d=\"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0zm3.72 6.633a.955.955 0 1 0-1.352-1.352L6.986 8.663 5.633 7.31A.956.956 0 1 0 4.28 8.663l2.029 2.028a.956.956 0 0 0 1.353 0l4.058-4.058z\"\n fill=\"#006CFF\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'reaction-icon'\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n width=\"12\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"reaction-icon\"\n>\n <g clipRule=\"evenodd\" fillRule=\"evenodd\">\n <path\n d=\"M6 1.2C3.3 1.2 1.2 3.3 1.2 6c0 2.7 2.1 4.8 4.8 4.8 2.7 0 4.8-2.1 4.8-4.8 0-2.7-2.1-4.8-4.8-4.8zM0 6c0-3.3 2.7-6 6-6s6 2.7 6 6-2.7 6-6 6-6-2.7-6-6z\"\n ></path>\n <path\n d=\"M5.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM8.4 4.5c0 .5-.4.9-.9.9s-.9-.4-.9-.9.4-.9.9-.9.9.4.9.9zM3.3 6.7c.3-.2.6-.1.8.1.3.4.8.9 1.5 1 .6.2 1.4.1 2.4-1 .2-.2.6-.3.8 0 .2.2.3.6 0 .8-1.1 1.3-2.4 1.7-3.5 1.5-1-.2-1.8-.9-2.2-1.5-.2-.3-.1-.7.2-.9z\"\n ></path>\n </g>\n</svg>\n<svg\n data-testid=\"connection-error\"\n *ngIf=\"icon === 'connection-error'\"\n width=\"78px\"\n height=\"78px\"\n viewBox=\"0 0 78 78\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n>\n <!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->\n <title>Combined Shape</title>\n <desc>Created with Sketch.</desc>\n <g\n id=\"Interactions\"\n stroke=\"none\"\n stroke-width=\"1\"\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n id=\"Connection-Error-_-Connectivity\"\n transform=\"translate(-270.000000, -30.000000)\"\n fill=\"#CF1F25\"\n >\n <g\n id=\"109-network-connection\"\n transform=\"translate(270.000000, 30.000000)\"\n >\n <path\n d=\"M66.4609744,11.414231 C81.6225232,26.5757798 81.6225232,51.157545 66.4609744,66.3188467 C51.2994256,81.4803954 26.7176604,81.4803954 11.5563587,66.3188467 C-3.60519004,51.1572979 -3.60519004,26.5755327 11.5563587,11.414231 C26.7179075,-3.74731776 51.2996727,-3.74731776 66.4609744,11.414231 Z M54.7853215,45.8823776 L54.7853215,40.5882574 C54.7853215,39.613638 53.9952341,38.8235506 53.0206147,38.8235506 L44.9576695,38.8235506 L41.428256,42.3529641 L51.255555,42.3529641 L51.255555,45.8823776 L54.7853215,45.8823776 Z M40.6659027,43.1153174 L37.8988425,45.8823776 L40.6659027,45.8823776 L40.6659027,43.1153174 Z M51.1764962,56.4702653 L58.2353232,56.4702653 C59.2099355,56.4702653 60.00003,55.6801708 60.00003,54.7055585 L60.00003,51.176145 C60.00003,50.2015327 59.2099355,49.4114382 58.2353232,49.4114382 L51.1764962,49.4114382 C50.2018839,49.4114382 49.4117894,50.2015327 49.4117894,51.176145 L49.4117894,54.7055585 C49.4117894,55.6801708 50.2018839,56.4702653 51.1764962,56.4702653 Z M35.2941353,56.4702653 L42.3529624,56.4702653 C43.3275746,56.4702653 44.1176691,55.6801708 44.1176691,54.7055585 L44.1176691,51.176145 C44.1176691,50.2015327 43.3275746,49.4114382 42.3529624,49.4114382 L35.2941353,49.4114382 C34.319523,49.4114382 33.5294285,50.2015327 33.5294285,51.176145 L33.5294285,54.7055585 C33.5294285,55.6801708 34.319523,56.4702653 35.2941353,56.4702653 Z M56.6964989,19.0874231 C56.007381,18.3985134 54.8903216,18.3985134 54.2012036,19.087423 L45.882376,27.4062507 L45.882376,19.4117761 C45.882376,18.4371568 45.0922885,17.6470693 44.1176692,17.6470693 L33.5294286,17.6470693 C32.5548092,17.6470694 31.7647218,18.4371568 31.7647218,19.4117761 L31.7647218,30.0000167 C31.7647219,30.9746363 32.5548092,31.7647237 33.5294285,31.7647237 L41.5239031,31.7647237 L34.4650761,38.8235508 L24.7058947,38.8235508 C23.7312753,38.8235508 22.9411879,39.6136382 22.9411879,40.5882575 L22.9411879,45.8823778 L26.4706014,45.8823778 L26.4706014,42.3529643 L30.9356624,42.3529643 L23.8768354,49.4117914 L19.4117743,49.4117914 C18.4371549,49.4117914 17.6470675,50.2018788 17.6470675,51.1764981 L17.6470675,54.7059117 C17.6504049,54.9674302 17.7129076,55.2248042 17.8298886,55.4587302 L16.4456526,56.8429662 C15.7446193,57.5200453 15.7252005,58.6372282 16.4022825,59.3382615 C17.0793616,60.0392948 18.1965445,60.0587136 18.8975778,59.3816316 C18.9122847,59.3674273 18.9267436,59.3529684 18.940948,59.3382615 L56.6964963,21.5830662 C57.3856425,20.8939094 57.3856425,19.7765747 56.6964963,19.0874179 Z\"\n id=\"Combined-Shape\"\n ></path>\n </g>\n </g>\n </g>\n</svg>\n<svg\n *ngIf=\"icon === 'send'\"\n data-testid=\"send\"\n height=\"17\"\n viewBox=\"0 0 18 17\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <title translate>streamChat.Send</title>\n <path\n d=\"M0 17.015l17.333-8.508L0 0v6.617l12.417 1.89L0 10.397z\"\n fill=\"#006cff\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'file-upload'\"\n data-testid=\"file-upload\"\n height=\"14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <title translate>streamChat.Attach files</title>\n <path\n d=\"M1.667.333h10.666c.737 0 1.334.597 1.334 1.334v10.666c0 .737-.597 1.334-1.334 1.334H1.667a1.333 1.333 0 0 1-1.334-1.334V1.667C.333.93.93.333 1.667.333zm2 1.334a1.667 1.667 0 1 0 0 3.333 1.667 1.667 0 0 0 0-3.333zm-2 9.333v1.333h10.666v-4l-2-2-4 4-2-2L1.667 11z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n data-testid=\"retry\"\n *ngIf=\"icon === 'retry'\"\n width=\"22\"\n height=\"20\"\n viewBox=\"0 0 22 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M20 5.535V2a1 1 0 0 1 2 0v6a1 1 0 0 1-1 1h-6a1 1 0 0 1 0-2h3.638l-2.975-2.653a8 8 0 1 0 1.884 8.32 1 1 0 1 1 1.886.666A10 10 0 1 1 5.175 1.245c3.901-2.15 8.754-1.462 11.88 1.667L20 5.535z\"\n fill=\"#FFF\"\n fill-rule=\"nonzero\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'close'\"\n data-testid=\"close\"\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 28 28\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n>\n <defs>\n <path\n d=\"M465 5c5.53 0 10 4.47 10 10s-4.47 10-10 10-10-4.47-10-10 4.47-10 10-10zm3.59 5L465 13.59 461.41 10 460 11.41l3.59 3.59-3.59 3.59 1.41 1.41 3.59-3.59 3.59 3.59 1.41-1.41-3.59-3.59 3.59-3.59-1.41-1.41z\"\n id=\"b\"\n />\n <filter\n x=\"-30%\"\n y=\"-30%\"\n width=\"160%\"\n height=\"160%\"\n filterUnits=\"objectBoundingBox\"\n id=\"a\"\n >\n <feOffset in=\"SourceAlpha\" result=\"shadowOffsetOuter1\" />\n <feGaussianBlur\n stdDeviation=\"2\"\n in=\"shadowOffsetOuter1\"\n result=\"shadowBlurOuter1\"\n />\n <feColorMatrix\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0\"\n in=\"shadowBlurOuter1\"\n />\n </filter>\n </defs>\n <g transform=\"translate(-451 -1)\" fill-rule=\"nonzero\" fill=\"none\">\n <use fill=\"#000\" filter=\"url(#a)\" xlink:href=\"#b\" />\n <use fill=\"#FFF\" fill-rule=\"evenodd\" xlink:href=\"#b\" />\n </g>\n</svg>\n<svg\n *ngIf=\"icon === 'file'\"\n data-testid=\"file\"\n className=\"rfu-file-icon--small fa-file-fallback\"\n [attr.height]=\"size || 20\"\n [attr.width]=\"size || 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 384 512\"\n>\n <path\n d=\"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"\n fill=\"#414D54\"\n />\n</svg>\n<svg\n *ngIf=\"icon === 'reply'\"\n data-testid=\"reply\"\n height=\"15\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path\n d=\"M.56 10.946H.06l-.002-.498L.025.92a.5.5 0 1 1 1-.004l.032 9.029H9.06v-4l9 4.5-9 4.5v-4H.56z\"\n fillRule=\"nonzero\"\n />\n</svg>\n<svg\n height=\"10\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"close-no-outline\"\n *ngIf=\"icon === 'close-no-outline'\"\n>\n <path\n d=\"M9.916 1.027L8.973.084 5 4.058 1.027.084l-.943.943L4.058 5 .084 8.973l.943.943L5 5.942l3.973 3.974.943-.943L5.942 5z\"\n fillRule=\"evenodd\"\n />\n</svg>\n<svg\n height=\"10\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"reply-in-thread\"\n *ngIf=\"icon === 'reply-in-thread'\"\n>\n <path\n d=\"M8.516 3c4.78 0 4.972 6.5 4.972 6.5-1.6-2.906-2.847-3.184-4.972-3.184v2.872L3.772 4.994 8.516.5V3zM.484 5l4.5-4.237v1.78L2.416 5l2.568 2.125v1.828L.484 5z\"\n fillRule=\"evenodd\"\n />\n</svg>\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'stream-loading-indicator',\n templateUrl: './loading-indicator.component.html',\n styles: [],\n})\nexport class LoadingIndicatorComponent {\n @Input() size = 15;\n @Input() color = '#006CFF';\n\n constructor() {}\n}\n","<div class=\"str-chat__loading-indicator\">\n <svg\n [attr.height]=\"size\"\n viewBox=\"0 0 30 30\"\n [attr.width]=\"size\"\n data-testid=\"loading-indicator\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <linearGradient id=\"a\" x1=\"50%\" x2=\"50%\" y1=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#FFF\" stop-opacity=\"0\" />\n <stop\n data-testid=\"stop-color\"\n offset=\"100%\"\n [attr.stop-color]=\"color\"\n stop-opacity=\"1\"\n [ngStyle]=\"{ stopColor: color }\"\n />\n </linearGradient>\n </defs>\n <path\n d=\"M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z\"\n fill=\"url(#a)\"\n fillRule=\"evenodd\"\n />\n </svg>\n</div>\n","import { InjectionToken, Type } from '@angular/core';\nimport { TextareaInterface } from './message-input/textarea.interface';\n\nexport const textareaInjectionToken = new InjectionToken<\n Type<TextareaInterface>\n>('textareaInjectionToken');\n","import {\n ComponentRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { Directive } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { UserResponse } from 'stream-chat';\nimport {\n CommandAutocompleteListItemContext,\n MentionAutcompleteListItemContext,\n} from '../types';\nimport { TextareaInterface } from './textarea.interface';\n\n@Directive({\n selector: '[streamTextarea]',\n})\nexport class TextareaDirective implements OnChanges {\n @Input() componentRef: ComponentRef<TextareaInterface> | undefined;\n @Input() areMentionsEnabled: boolean | undefined;\n @Input() mentionAutocompleteItemTemplate:\n | TemplateRef<MentionAutcompleteListItemContext>\n | undefined;\n @Input() mentionScope?: 'channel' | 'application';\n @Input() commandAutocompleteItemTemplate:\n | TemplateRef<CommandAutocompleteListItemContext>\n | undefined;\n @Input() value = '';\n @Output() readonly valueChange = new EventEmitter<string>();\n @Output() readonly send = new EventEmitter<void>();\n @Output() readonly userMentions = new EventEmitter<UserResponse[]>();\n private subscriptions: Subscription[] = [];\n private unpropagatedChanges: SimpleChanges[] = [];\n constructor(public viewContainerRef: ViewContainerRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n this.unpropagatedChanges.push(changes);\n if (!this.componentRef) {\n return;\n }\n if (changes.componentRef) {\n this.subscriptions.forEach((s) => s.unsubscribe());\n if (this.componentRef) {\n this.subscriptions.push(\n this.componentRef.instance.valueChange.subscribe((value) =>\n this.valueChange.next(value)\n )\n );\n this.subscriptions.push(\n this.componentRef.instance.send.subscribe((value) =>\n this.send.next(value)\n )\n );\n if (this.componentRef.instance.userMentions) {\n this.subscriptions.push(\n this.componentRef.instance.userMentions.subscribe((value) =>\n this.userMentions.next(value)\n )\n );\n }\n this.componentRef.instance.areMentionsEnabled = this.areMentionsEnabled;\n this.componentRef.instance.mentionAutocompleteItemTemplate =\n this.mentionAutocompleteItemTemplate;\n this.componentRef.instance.commandAutocompleteItemTemplate =\n this.commandAutocompleteItemTemplate;\n this.componentRef.instance.mentionScope = this.mentionScope;\n this.componentRef.instance.value = this.value;\n }\n }\n if (changes.areMentionsEnabled) {\n this.componentRef.instance.areMentionsEnabled = this.areMentionsEnabled;\n }\n if (changes.mentionAutocompleteItemTemplate) {\n this.componentRef.instance.mentionAutocompleteItemTemplate =\n this.mentionAutocompleteItemTemplate;\n }\n if (changes.commandAutocompleteItemTemplate) {\n this.componentRef.instance.commandAutocompleteItemTemplate =\n this.commandAutocompleteItemTemplate;\n }\n if (changes.mentionScope) {\n this.componentRef.instance.mentionScope = this.mentionScope;\n }\n if (changes.value) {\n this.componentRef.instance.value = this.value;\n }\n // ngOnChanges not called for dynamic components since we don't use template binding\n let changesToPropagate = {};\n this.unpropagatedChanges.forEach(\n (c) => (changesToPropagate = { ...changesToPropagate, ...c })\n );\n // eslint-disable-next-line @angular-eslint/no-lifecycle-call\n this.componentRef.instance.ngOnChanges(changesToPropagate);\n this.unpropagatedChanges = [];\n }\n}\n","import { Injectable, TemplateRef } from '@angular/core';\nimport {\n CommandAutocompleteListItemContext,\n MentionAutcompleteListItemContext,\n} from '../types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MessageInputConfigService {\n isFileUploadEnabled: boolean | undefined = true;\n areMentionsEnabled: boolean | undefined = true;\n mentionAutocompleteItemTemplate:\n | TemplateRef<MentionAutcompleteListItemContext>\n | undefined;\n commandAutocompleteItemTemplate:\n | TemplateRef<CommandAutocompleteListItemContext>\n | undefined;\n /**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/services/message-input-config/#overview\n */\n acceptedFileTypes: string[] | undefined;\n isMultipleFileUploadEnabled: boolean | undefined = true;\n mentionScope: 'channel' | 'application' | undefined = 'channel';\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ImageLoadService {\n imageLoad$ = new Subject<void>();\n\n constructor() {}\n}\n","import { Component, Input, OnChanges } from '@angular/core';\nimport { Action, Attachment } from 'stream-chat';\nimport { ImageLoadService } from '../message-list/image-load.service';\nimport { DefaultAttachmentType } from '../types';\nimport prettybytes from 'pretty-bytes';\nimport { isImageAttachment } from '../is-image-attachment';\nimport { ChannelService } from '../channel.service';\n\n@Component({\n selector: 'stream-attachment-list',\n templateUrl: './attachment-list.component.html',\n styles: [],\n})\nexport class AttachmentListComponent implements OnChanges {\n @Input() messageId: string | undefined;\n @Input() attachments: Attachment<DefaultAttachmentType>[] = [];\n orderedAttachments: Attachment<DefaultAttachmentType>[] = [];\n\n constructor(\n private imageLoadService: ImageLoadService,\n private channelService: ChannelService\n ) {}\n\n ngOnChanges(): void {\n this.orderedAttachments = [\n ...this.attachments.filter((a) => this.isImage(a)),\n ...this.attachments.filter((a) => this.isFile(a)),\n ...this.attachments.filter((a) => this.isCard(a)),\n ];\n }\n\n trackById(index: number) {\n return index;\n }\n\n isImage(attachment: Attachment) {\n return isImageAttachment(attachment);\n }\n\n isFile(attachment: Attachment) {\n return attachment.type === 'file';\n }\n\n isCard(attachment: Attachment) {\n return (\n !attachment.type ||\n (attachment.type === 'image' && !this.isImage(attachment)) ||\n attachment.type === 'giphy'\n );\n }\n\n imageLoaded() {\n this.imageLoadService.imageLoad$.next();\n }\n\n hasFileSize(attachment: Attachment<DefaultAttachmentType>) {\n return (\n attachment.file_size && Number.isFinite(Number(attachment.file_size))\n );\n }\n\n getFileSize(attachment: Attachment<DefaultAttachmentType>) {\n return prettybytes(attachment.file_size!);\n }\n\n trimUrl(url?: string | null) {\n if (url !== undefined && url !== null) {\n const [trimmedUrl] = url\n .replace(/^(?:https?:\\/\\/)?(?:www\\.)?/i, '')\n .split('/');\n\n return trimmedUrl;\n }\n return null;\n }\n\n sendAction(action: Action) {\n void this.channelService.sendAction(this.messageId!, {\n [action.name!]: action.value!,\n });\n }\n\n trackByActionValue(_: number, item: Action) {\n return item.value;\n }\n}\n","<ng-container *ngFor=\"let attachment of orderedAttachments; trackBy: trackById\">\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }}\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n >\n <img\n *ngIf=\"isImage(attachment)\"\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"attachment.img_url || attachment.thumb_url || attachment.image_url\"\n [alt]=\"attachment?.fallback\"\n (load)=\"imageLoaded()\"\n />\n <div\n *ngIf=\"isFile(attachment)\"\n class=\"\n str-chat__message-attachment-file--item\n str-chat-angular__message-attachment-file-single\n \"\n >\n <stream-icon icon=\"file\" [size]=\"30\"></stream-icon>\n <div class=\"str-chat__message-attachment-file--item-text\">\n <a\n data-testclass=\"file-link\"\n download\n href=\"{{ attachment.asset_url }}\"\n target=\"_blank\"\n >\n {{ attachment.title }}\n </a>\n <span data-testclass=\"size\" *ngIf=\"hasFileSize(attachment)\">{{\n getFileSize(attachment)\n }}</span>\n </div>\n </div>\n <div\n *ngIf=\"isCard(attachment)\"\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachment.type\n }}\"\n >\n <div\n *ngIf=\"attachment.image_url || attachment.thumb_url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <img\n data-testclass=\"card-img\"\n alt=\"{{ attachment.image_url || attachment.thumb_url }}\"\n src=\"{{ attachment.image_url || attachment.thumb_url }}\"\n />\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachment.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachment.title }}\n </div>\n <div\n *ngIf=\"attachment.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachment.text }}\n </div>\n <a\n class=\"str-chat__message-attachment-card--url\"\n *ngIf=\"attachment.title_link || attachment.og_scrape_url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n href=\"{{ attachment.title_link || attachment.og_scrape_url }}\"\n target=\"_blank\"\n >\n {{ trimUrl(attachment.title_link || attachment.og_scrape_url) }}\n </a>\n </div>\n </div>\n </div>\n <div\n class=\"str-chat__message-attachment-actions\"\n *ngIf=\"attachment.actions && attachment.actions.length > 0\"\n >\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"let action of attachment.actions; trackBy: trackByActionValue\"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n data-testclass=\"attachment-action\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n","import { Component } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AttachmentService } from '../attachment.service';\nimport { AttachmentUpload } from '../types';\n\n@Component({\n selector: 'stream-attachment-preview-list',\n templateUrl: './attachment-preview-list.component.html',\n styles: [],\n})\nexport class AttachmentPreviewListComponent {\n attachmentUploads$: Observable<AttachmentUpload[]>;\n\n constructor(private attachmentService: AttachmentService) {\n this.attachmentUploads$ = this.attachmentService.attachmentUploads$;\n }\n\n async retryAttachmentUpload(file: File) {\n await this.attachmentService.retryAttachmentUpload(file);\n }\n\n async deleteAttachment(upload: AttachmentUpload) {\n await this.attachmentService.deleteAttachment(upload);\n }\n\n trackByFile(_: number, item: AttachmentUpload) {\n return item.file;\n }\n}\n","<div class=\"rfu-image-previewer\" *ngIf=\"(attachmentUploads$ | async)?.length\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"rfu-image-previewer__image\"\n [class.rfu-image-previewer__image--loaded]=\"\n attachmentUpload.state === 'success'\n \"\n data-testclass=\"attachment-image-preview\"\n >\n <div\n *ngIf=\"attachmentUpload.state === 'error'\"\n class=\"rfu-image-previewer__retry\"\n (click)=\"retryAttachmentUpload(attachmentUpload.file)\"\n (keyup.enter)=\"retryAttachmentUpload(attachmentUpload.file)\"\n data-testclass=\"upload-error\"\n >\n <stream-icon icon=\"retry\"></stream-icon>\n </div>\n <div class=\"rfu-thumbnail__wrapper\" style=\"width: 100; height: 100\">\n <div class=\"rfu-thumbnail__overlay\">\n <div\n class=\"rfu-icon-button\"\n data-testclass=\"delete-attachment\"\n role=\"button\"\n (click)=\"deleteAttachment(attachmentUpload)\"\n (keyup.enter)=\"deleteAttachment(attachmentUpload)\"\n >\n <stream-icon icon=\"close\"></stream-icon>\n </div>\n </div>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"attachmentUpload.file.name\"\n class=\"rfu-thumbnail__image\"\n data-testclass=\"attachment-image\"\n />\n </div>\n <stream-loading-indicator\n data-testclass=\"loading-indicator\"\n color=\"rgba(255,255,255,0.7)\"\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n ></stream-loading-indicator>\n </div>\n <div\n class=\"rfu-file-previewer\"\n *ngIf=\"attachmentUpload.type === 'file'\"\n data-testclass=\"attachment-file-preview\"\n >\n <ol>\n <li\n class=\"rfu-file-previewer__file\"\n [class.rfu-file-previewer__file--uploading]=\"\n attachmentUpload.state === 'uploading'\n \"\n [class.rfu-file-previewer__file--failed]=\"\n attachmentUpload.state === 'error'\n \"\n >\n <stream-icon icon=\"file\"></stream-icon>\n\n <a\n data-testclass=\"file-download-link\"\n href=\"{{ attachmentUpload.url }}\"\n (click)=\"attachmentUpload.url ? null : $event.preventDefault()\"\n (keyup.enter)=\"\n attachmentUpload.url ? null : $event.preventDefault()\n \"\n download\n >\n {{ attachmentUpload.file.name }}\n <ng-container *ngIf=\"attachmentUpload.state === 'error'\">\n <div\n data-testclass=\"file-upload-retry\"\n class=\"rfu-file-previewer__failed\"\n (click)=\"retryAttachmentUpload(attachmentUpload.file)\"\n (keyup.enter)=\"retryAttachmentUpload(attachmentUpload.file)\"\n translate\n >\n streamChat.failed\n </div>\n <div\n class=\"rfu-file-previewer__retry\"\n (click)=\"retryAttachmentUpload(attachmentUpload.file)\"\n (keyup.enter)=\"retryAttachmentUpload(attachmentUpload.file)\"\n translate\n >\n streamChat.retry\n </div>\n </ng-container>\n </a>\n\n <span\n data-testclass=\"file-delete\"\n class=\"rfu-file-previewer__close-button\"\n (click)=\"deleteAttachment(attachmentUpload)\"\n (keyup.enter)=\"deleteAttachment(attachmentUpload)\"\n >\n ✘\n </span>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"rfu-file-previewer__loading-indicator\"\n >\n <stream-loading-indicator></stream-loading-indicator>\n </div>\n </li>\n </ol>\n </div>\n </ng-container>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ComponentRef,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n TemplateRef,\n Type,\n ViewChild,\n} from '@angular/core';\nimport { ChatClientService } from '../chat-client.service';\nimport { Observable, Subscription } from 'rxjs';\nimport { first } from 'rxjs/operators';\nimport { AppSettings, Channel, UserResponse } from 'stream-chat';\nimport { AttachmentService } from '../attachment.service';\nimport { ChannelService } from '../channel.service';\nimport { textareaInjectionToken } from '../injection-tokens';\nimport { NotificationService } from '../notification.service';\nimport {\n AttachmentUpload,\n CommandAutocompleteListItemContext,\n MentionAutcompleteListItemContext,\n StreamMessage,\n} from '../types';\nimport { MessageInputConfigService } from './message-input-config.service';\nimport { TextareaDirective } from './textarea.directive';\nimport { TextareaInterface } from './textarea.interface';\nimport { isImageFile } from '../is-image-file';\n\n@Component({\n selector: 'stream-message-input',\n templateUrl: './message-input.component.html',\n styles: [],\n providers: [AttachmentService],\n})\nexport class MessageInputComponent\n implements OnChanges, OnDestroy, AfterViewInit\n{\n @Input() isFileUploadEnabled: boolean | undefined;\n @Input() areMentionsEnabled: boolean | undefined;\n @Input() mentionScope: 'channel' | 'application' | undefined;\n @Input() mentionAutocompleteItemTemplate:\n | TemplateRef<MentionAutcompleteListItemContext>\n | undefined;\n @Input() commandAutocompleteItemTemplate:\n | TemplateRef<CommandAutocompleteListItemContext>\n | undefined;\n @Input() mode: 'thread' | 'main' = 'main';\n /**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/components/message-input/#caution-acceptedfiletypes\n */\n @Input() acceptedFileTypes: string[] | undefined;\n @Input() isMultipleFileUploadEnabled: boolean | undefined;\n @Input() message: StreamMessage | undefined;\n @Output() readonly messageUpdate = new EventEmitter<void>();\n isFileUploadAuthorized: boolean | undefined;\n canSendLinks: boolean | undefined;\n canSendMessages: boolean | undefined;\n attachmentUploads$: Observable<AttachmentUpload[]>;\n textareaValue = '';\n textareaRef: ComponentRef<TextareaInterface> | undefined;\n mentionedUsers: UserResponse[] = [];\n quotedMessage: undefined | StreamMessage;\n @ViewChild('fileInput') private fileInput!: ElementRef<HTMLInputElement>;\n @ViewChild(TextareaDirective, { static: false })\n private textareaAnchor!: TextareaDirective;\n private subscriptions: Subscription[] = [];\n private hideNotification: Function | undefined;\n private isViewInited = false;\n private appSettings: AppSettings | undefined;\n private channel: Channel | undefined;\n constructor(\n private channelService: ChannelService,\n private notificationService: NotificationService,\n private attachmentService: AttachmentService,\n private configService: MessageInputConfigService,\n @Inject(textareaInjectionToken)\n private textareaType: Type<TextareaInterface>,\n private componentFactoryResolver: ComponentFactoryResolver,\n private cdRef: ChangeDetectorRef,\n private chatClient: ChatClientService\n ) {\n this.subscriptions.push(\n this.attachmentService.attachmentUploadInProgressCounter$.subscribe(\n (counter) => {\n if (counter === 0 && this.hideNotification) {\n this.hideNotification();\n this.hideNotification = undefined;\n }\n }\n )\n );\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe((channel) => {\n this.textareaValue = '';\n this.attachmentService.resetAttachmentUploads();\n const capabilities = channel?.data?.own_capabilities as string[];\n if (capabilities) {\n this.isFileUploadAuthorized =\n capabilities.indexOf('upload-file') !== -1;\n this.canSendLinks = capabilities.indexOf('send-links') !== -1;\n this.channel = channel;\n this.setCanSendMessages();\n }\n })\n );\n this.subscriptions.push(\n this.chatClient.appSettings$.subscribe(\n (appSettings) => (this.appSettings = appSettings)\n )\n );\n this.subscriptions.push(\n this.channelService.messageToQuote$.subscribe((m) => {\n const isThreadReply = m && m.parent_id;\n if (\n (this.mode === 'thread' && isThreadReply) ||\n (this.mode === 'thread' && this.quotedMessage && !m) ||\n (this.mode === 'main' && !isThreadReply)\n ) {\n this.quotedMessage = m;\n }\n })\n );\n this.attachmentUploads$ = this.attachmentService.attachmentUploads$;\n this.isFileUploadEnabled = this.configService.isFileUploadEnabled;\n this.acceptedFileTypes = this.configService.acceptedFileTypes;\n this.isMultipleFileUploadEnabled =\n this.configService.isMultipleFileUploadEnabled;\n this.areMentionsEnabled = this.configService.areMentionsEnabled;\n this.mentionAutocompleteItemTemplate =\n this.configService.mentionAutocompleteItemTemplate;\n this.mentionScope = this.configService.mentionScope;\n this.commandAutocompleteItemTemplate =\n this.configService.commandAutocompleteItemTemplate;\n }\n\n ngAfterViewInit(): void {\n this.isViewInited = true;\n this.initTextarea();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.message) {\n this.attachmentService.resetAttachmentUploads();\n if (this.isUpdate) {\n this.attachmentService.createFromAttachments(\n this.message!.attachments || []\n );\n this.textareaValue = this.message!.text || '';\n }\n }\n if (changes.isFileUploadEnabled) {\n this.configService.isFileUploadEnabled = this.isFileUploadEnabled;\n }\n if (changes.acceptedFileTypes) {\n this.configService.acceptedFileTypes = this.acceptedFileTypes;\n }\n if (changes.isMultipleFileUploadEnabled) {\n this.configService.isMultipleFileUploadEnabled =\n this.isMultipleFileUploadEnabled;\n }\n if (changes.areMentionsEnabled) {\n this.configService.areMentionsEnabled = this.areMentionsEnabled;\n }\n if (changes.mentionAutocompleteItemTemplate) {\n this.configService.mentionAutocompleteItemTemplate =\n this.mentionAutocompleteItemTemplate;\n }\n if (changes.commandAutocompleteItemTemplate) {\n this.configService.commandAutocompleteItemTemplate =\n this.commandAutocompleteItemTemplate;\n }\n if (changes.mentionScope) {\n this.configService.mentionScope = this.mentionScope;\n }\n if (changes.mode) {\n this.setCanSendMessages();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n async messageSent() {\n let attachmentUploadInProgressCounter!: number;\n this.attachmentService.attachmentUploadInProgressCounter$\n .pipe(first())\n .subscribe((counter) => (attachmentUploadInProgressCounter = counter));\n if (attachmentUploadInProgressCounter > 0) {\n if (!this.hideNotification) {\n this.hideNotification =\n this.notificationService.addPermanentNotification(\n 'streamChat.Wait until all attachments have uploaded'\n );\n }\n return;\n }\n const attachments = this.attachmentService.mapToAttachments();\n const text = this.textareaValue;\n if (!text && (!attachments || attachments.length === 0)) {\n return;\n }\n if (this.containsLinks && !this.canSendLinks) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Sending links is not allowed in this conversation'\n );\n return;\n }\n if (!this.isUpdate) {\n this.textareaValue = '';\n }\n let parentMessageId: string | undefined = undefined;\n if (this.mode === 'thread') {\n this.channelService.activeParentMessageId$\n .pipe(first())\n .subscribe((id) => (parentMessageId = id));\n }\n try {\n await (this.isUpdate\n ? this.channelService.updateMessage({\n ...this.message!,\n text: text,\n attachments: attachments,\n })\n : this.channelService.sendMessage(\n text,\n attachments,\n this.mentionedUsers,\n parentMessageId,\n this.quotedMessage?.id\n ));\n this.messageUpdate.emit();\n if (!this.isUpdate) {\n this.attachmentService.resetAttachmentUploads();\n }\n } catch (error) {\n if (this.isUpdate) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Edit message request failed'\n );\n }\n }\n if (this.quotedMessage) {\n this.deselectMessageToQuote();\n }\n }\n\n get containsLinks() {\n return /(?:(?:https?|ftp):\\/\\/)?[\\w/\\-?=%.]+\\.[\\w/\\-&?=%.]+/.test(\n this.textareaValue\n );\n }\n\n get accept() {\n return this.acceptedFileTypes ? this.acceptedFileTypes?.join(',') : '';\n }\n\n get quotedMessageAttachments() {\n const originalAttachments = this.quotedMessage?.attachments;\n return originalAttachments && originalAttachments.length\n ? [originalAttachments[0]]\n : [];\n }\n\n async filesSelected(fileList: FileList | null) {\n if (!(await this.areAttachemntsValid(fileList))) {\n return;\n }\n await this.attachmentService.filesSelected(fileList);\n this.clearFileInput();\n }\n\n deselectMessageToQuote() {\n this.channelService.selectMessageToQuote(undefined);\n }\n\n private clearFileInput() {\n this.fileInput.nativeElement.value = '';\n }\n\n private get isUpdate() {\n return !!this.message;\n }\n\n private initTextarea() {\n if (!this.canSendMessages || this.textareaRef || !this.textareaAnchor) {\n return;\n }\n const componentFactory =\n this.componentFactoryResolver.resolveComponentFactory(this.textareaType);\n this.textareaRef =\n this.textareaAnchor.viewContainerRef.createComponent<any>(\n componentFactory\n );\n this.cdRef.detectChanges();\n }\n\n private async areAttachemntsValid(fileList: FileList | null) {\n if (!fileList || this.acceptedFileTypes) {\n return true;\n }\n if (!this.appSettings) {\n await this.chatClient.getAppSettings();\n }\n let isValid = true;\n Array.from(fileList).forEach((f) => {\n let hasBlockedExtension: boolean;\n let hasBlockedMimeType: boolean;\n let hasNotAllowedExtension: boolean;\n let hasNotAllowedMimeType: boolean;\n if (isImageFile(f)) {\n hasBlockedExtension =\n !!this.appSettings?.image_upload_config?.blocked_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasBlockedMimeType =\n !!this.appSettings?.image_upload_config?.blocked_mime_types?.find(\n (type) => f.type === type\n );\n hasNotAllowedExtension =\n !!this.appSettings?.image_upload_config?.allowed_file_extensions\n ?.length &&\n !this.appSettings?.image_upload_config?.allowed_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasNotAllowedMimeType =\n !!this.appSettings?.image_upload_config?.allowed_mime_types?.length &&\n !this.appSettings?.image_upload_config?.allowed_mime_types?.find(\n (type) => f.type === type\n );\n } else {\n hasBlockedExtension =\n !!this.appSettings?.file_upload_config?.blocked_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasBlockedMimeType =\n !!this.appSettings?.file_upload_config?.blocked_mime_types?.find(\n (type) => f.type === type\n );\n hasNotAllowedExtension =\n !!this.appSettings?.file_upload_config?.allowed_file_extensions\n ?.length &&\n !this.appSettings?.file_upload_config?.allowed_file_extensions?.find(\n (ext) => f.name.endsWith(ext)\n );\n hasNotAllowedMimeType =\n !!this.appSettings?.file_upload_config?.allowed_mime_types?.length &&\n !this.appSettings?.file_upload_config?.allowed_mime_types?.find(\n (type) => f.type === type\n );\n }\n if (\n hasBlockedExtension ||\n hasBlockedMimeType ||\n hasNotAllowedExtension ||\n hasNotAllowedMimeType\n ) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Unsupported file type: {{type}}',\n undefined,\n undefined,\n { type: f.type }\n );\n isValid = false;\n }\n });\n return isValid;\n }\n\n private setCanSendMessages() {\n const capabilities = this.channel?.data?.own_capabilities as string[];\n if (!capabilities) {\n this.canSendMessages = false;\n } else {\n this.canSendMessages =\n capabilities.indexOf(\n this.mode === 'main' ? 'send-message' : 'send-reply'\n ) !== -1;\n }\n if (this.isViewInited) {\n this.cdRef.detectChanges();\n this.initTextarea();\n }\n }\n}\n","<div\n class=\"{{\n mode === 'main' ? 'str-chat__input-flat' : 'str-chat__small-message-input'\n }}\"\n [class.str-chat__input-flat-has-attachments]=\"\n (attachmentUploads$ | async)!.length > 0\n \"\n [class.str-chat__input-flat-quoted]=\"!!quotedMessage\"\n>\n <div\n data-testid=\"quoted-message-container\"\n class=\"quoted-message-preview\"\n *ngIf=\"quotedMessage\"\n >\n <div class=\"quoted-message-preview-header\">\n <div>{{ \"streamChat.Reply to Message\" | translate }}</div>\n <button\n class=\"str-chat__square-button\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToQuote()\"\n (keyup.enter)=\"deselectMessageToQuote()\"\n >\n <stream-icon\n icon=\"close-no-outline\"\n style=\"font-size: 10px; line-height: 10px\"\n ></stream-icon>\n </button>\n </div>\n <div class=\"quoted-message-preview-content\">\n <stream-avatar\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host\"\n [imageUrl]=\"quotedMessage?.user?.image\"\n [name]=\"quotedMessage?.user?.name || quotedMessage?.user?.id\"\n [size]=\"20\"\n ></stream-avatar>\n <div class=\"quoted-message-preview-content-inner\">\n <stream-attachment-list\n *ngIf=\"\n quotedMessage?.attachments && quotedMessage?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"quotedMessage?.id\"\n ></stream-attachment-list>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"quotedMessage?.html || quotedMessage?.text\"\n ></div>\n </div>\n </div>\n </div>\n <div class=\"str-chat__input-flat-wrapper\" style=\"width: 100%\">\n <div\n class=\"{{\n mode === 'main'\n ? 'str-chat__input-flat--textarea-wrapper'\n : 'str-chat__small-message-input--textarea-wrapper'\n }}\"\n >\n <stream-attachment-preview-list\n class=\"rfu-image-previewer-angular-host\"\n ></stream-attachment-preview-list>\n <div class=\"rta str-chat__textarea\">\n <ng-template\n *ngIf=\"canSendMessages; else notAllowed\"\n streamTextarea\n [(value)]=\"textareaValue\"\n (send)=\"messageSent()\"\n [componentRef]=\"textareaRef\"\n (userMentions)=\"mentionedUsers = $event\"\n [areMentionsEnabled]=\"areMentionsEnabled\"\n [mentionAutocompleteItemTemplate]=\"mentionAutocompleteItemTemplate\"\n [commandAutocompleteItemTemplate]=\"commandAutocompleteItemTemplate\"\n [mentionScope]=\"mentionScope\"\n ></ng-template>\n <ng-template #notAllowed>\n <textarea\n disabled\n rows=\"1\"\n [value]=\"\n (mode === 'thread'\n ? 'You can\\'t send thread replies in this channel'\n : 'streamChat.You can\\'t send messages in this channel'\n ) | translate\n \"\n class=\"rta__textarea str-chat__textarea__textarea\"\n ></textarea>\n </ng-template>\n </div>\n <div\n *ngIf=\"isFileUploadEnabled && isFileUploadAuthorized && canSendMessages\"\n class=\"str-chat__fileupload-wrapper\"\n data-testid=\"file-upload-button\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Attach files\" | translate }}\n </div>\n <div class=\"rfu-file-upload-button\">\n <label>\n <input\n #fileInput\n type=\"file\"\n class=\"rfu-file-input\"\n data-testid=\"file-input\"\n [accept]=\"accept\"\n [multiple]=\"isMultipleFileUploadEnabled\"\n (change)=\"filesSelected(fileInput.files)\"\n />\n <span class=\"str-chat__input-flat-fileupload\">\n <stream-icon icon=\"file-upload\"></stream-icon>\n </span>\n </label>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"canSendMessages\"\n data-testid=\"send-button\"\n class=\"str-chat__send-button\"\n (click)=\"messageSent()\"\n (keyup.enter)=\"messageSent()\"\n >\n <stream-icon icon=\"send\"></stream-icon>\n </button>\n </div>\n</div>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\n\n@Component({\n selector: 'stream-modal',\n templateUrl: './modal.component.html',\n styles: [],\n})\nexport class ModalComponent implements OnChanges {\n @Input() isOpen = false;\n @Output() readonly isOpenChange = new EventEmitter<boolean>();\n @ViewChild('content') private content: ElementRef<HTMLElement> | undefined;\n\n constructor() {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isOpen) {\n if (this.isOpen) {\n window.addEventListener('keyup', this.watchForEscPress);\n setTimeout(\n () => window.addEventListener('click', this.watchForOutsideClicks),\n 0\n );\n } else {\n this.stopWatchForOutsideClicks();\n this.stopWatchForEscPress();\n }\n }\n }\n\n close() {\n this.isOpen = false;\n this.isOpenChange.emit(false);\n this.stopWatchForOutsideClicks();\n this.stopWatchForEscPress();\n }\n\n private watchForEscPress = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.close();\n }\n };\n\n private stopWatchForEscPress = () => {\n window.removeEventListener('keyup', this.watchForEscPress);\n };\n\n private watchForOutsideClicks = (event: Event) => {\n if (!this.content?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n };\n\n private stopWatchForOutsideClicks() {\n window.removeEventListener('click', this.watchForOutsideClicks);\n }\n}\n","<div\n data-testid=\"modal\"\n class=\"str-chat__modal str-chat__modal--{{ isOpen ? 'open' : 'close' }}\"\n>\n <div\n data-testid=\"close\"\n class=\"str-chat__modal__close-button\"\n (click)=\"close()\"\n (keyup.enter)=\"close()\"\n translate\n >\n streamChat.Close\n <stream-icon icon=\"close\"></stream-icon>\n </div>\n <div class=\"str-chat__modal__inner\" #content>\n <ng-content></ng-content>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { NotificationType } from '../notification.service';\n\n@Component({\n selector: 'stream-notification',\n templateUrl: './notification.component.html',\n styles: [],\n})\nexport class NotificationComponent {\n @Input() type: NotificationType | undefined;\n\n constructor() {}\n}\n","<div\n class=\"str-chat__custom-notification notification-{{ type }}\"\n data-testid=\"custom-notification\"\n>\n <ng-content></ng-content>\n</div>\n","import { Component } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n NotificationPayload,\n NotificationService,\n} from '../notification.service';\n\n@Component({\n selector: 'stream-notification-list',\n templateUrl: './notification-list.component.html',\n styles: [],\n})\nexport class NotificationListComponent {\n notifications$: Observable<NotificationPayload[]>;\n\n constructor(private notificationService: NotificationService) {\n this.notifications$ = this.notificationService.notifications$;\n }\n\n trackByItem(_: number, item: NotificationPayload) {\n return item;\n }\n}\n","<div class=\"str-chat__list-notifications\">\n <stream-notification\n *ngFor=\"let notification of notifications$ | async; trackBy: trackByItem\"\n [type]=\"notification.type\"\n ><div data-testclass=\"notification-content\">\n {{ notification.text | translate: notification.translateParams }}\n </div></stream-notification\n >\n</div>\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { ChannelService } from '../channel.service';\nimport { ChatClientService } from '../chat-client.service';\nimport { MessageInputComponent } from '../message-input/message-input.component';\nimport { NotificationService } from '../notification.service';\nimport { StreamMessage } from '../types';\n\n/**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/components/message-actions/#required-enabledactions\n */\nexport type MessageActions =\n | 'edit'\n | 'delete'\n | 'edit-any'\n | 'delete-any'\n | 'pin'\n | 'quote'\n | 'flag'\n | 'mute';\n\n@Component({\n selector: 'stream-message-actions-box',\n templateUrl: './message-actions-box.component.html',\n styles: [],\n})\nexport class MessageActionsBoxComponent implements OnChanges {\n @Input() messageInputTemplate: TemplateRef<any> | undefined;\n @Input() isOpen = false;\n @Input() isMine = false;\n @Input() message: StreamMessage | undefined;\n @Input() enabledActions: string[] = [];\n @Output() readonly displayedActionsCount = new EventEmitter<number>();\n @Output() readonly isEditing = new EventEmitter<boolean>();\n isEditModalOpen = false;\n @ViewChild(MessageInputComponent) private messageInput:\n | MessageInputComponent\n | undefined;\n\n constructor(\n private chatClientService: ChatClientService,\n private notificationService: NotificationService,\n private channelService: ChannelService\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isMine || changes.enabledActions) {\n let displayedActionsCount = 0;\n if (this.isQuoteVisible) {\n displayedActionsCount++;\n }\n if (this.isEditVisible) {\n displayedActionsCount++;\n }\n if (this.isDeleteVisible) {\n displayedActionsCount++;\n }\n if (this.isMuteVisible) {\n displayedActionsCount++;\n }\n if (this.isFlagVisible) {\n displayedActionsCount++;\n }\n if (this.isPinVisible) {\n displayedActionsCount++;\n }\n this.displayedActionsCount.next(displayedActionsCount);\n }\n }\n\n get isQuoteVisible() {\n return (\n (this.enabledActions.indexOf('quote') !== -1 ||\n this.enabledActions.indexOf('quote-message') !== -1) &&\n !this.message?.quoted_message\n );\n }\n\n get isEditVisible() {\n return (\n ((this.enabledActions.indexOf('edit') !== -1 ||\n this.enabledActions.indexOf('update-own-message') !== -1) &&\n this.isMine) ||\n this.enabledActions.indexOf('edit-any') !== -1 ||\n this.enabledActions.indexOf('update-any-message') !== -1\n );\n }\n\n get isDeleteVisible() {\n return (\n ((this.enabledActions.indexOf('delete') !== -1 ||\n this.enabledActions.indexOf('delete-own-message') !== -1) &&\n this.isMine) ||\n this.enabledActions.indexOf('delete-any') !== -1 ||\n this.enabledActions.indexOf('delete-any-message') !== -1\n );\n }\n\n get isMuteVisible() {\n return this.enabledActions.indexOf('mute') !== -1;\n }\n\n get isFlagVisible() {\n return (\n (this.enabledActions.indexOf('flag') !== -1 ||\n this.enabledActions.indexOf('flag-message') !== -1) &&\n !this.isMine\n );\n }\n\n get isPinVisible() {\n return this.enabledActions.indexOf('pin') !== -1;\n }\n\n pinClicked() {\n alert('Feature not yet implemented');\n }\n\n async flagClicked() {\n try {\n await this.chatClientService.flagMessage(this.message!.id);\n this.notificationService.addTemporaryNotification(\n 'streamChat.Message has been successfully flagged',\n 'success'\n );\n } catch (err) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error adding flag'\n );\n }\n }\n\n muteClicked() {\n alert('Feature not yet implemented');\n }\n\n quoteClicked() {\n this.channelService.selectMessageToQuote(this.message);\n }\n\n editClicked() {\n this.isEditing.emit(true);\n this.isEditModalOpen = true;\n }\n\n sendClicked() {\n this.messageInput?.messageSent();\n }\n\n modalClosed = () => {\n this.isEditModalOpen = false;\n this.isEditing.emit(false);\n };\n\n async deleteClicked() {\n try {\n await this.channelService.deleteMessage(this.message!);\n } catch (error) {\n this.notificationService.addTemporaryNotification(\n 'streamChat.Error deleting message'\n );\n }\n }\n}\n","<div\n data-testid=\"action-box\"\n class=\"str-chat__message-actions-box\"\n [class.str-chat__message-actions-box--open]=\"isOpen\"\n [class.str-chat__message-actions-box--mine]=\"isMine\"\n>\n <ul class=\"str-chat__message-actions-list\">\n <button\n data-testid=\"quote-action\"\n *ngIf=\"isQuoteVisible\"\n (click)=\"quoteClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Reply\" | translate }}\n </li>\n </button>\n <button\n data-testid=\"pin-action\"\n *ngIf=\"isPinVisible\"\n (click)=\"pinClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{\n (message?.pinned ? \"streamChat.Unpin\" : \"streamChat.Pin\") | translate\n }}\n </li>\n </button>\n <button\n data-testid=\"flag-action\"\n *ngIf=\"isFlagVisible\"\n (click)=\"flagClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Flag\" | translate }}\n </li>\n </button>\n <button\n data-testid=\"mute-action\"\n *ngIf=\"isMuteVisible\"\n (click)=\"muteClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Mute\" | translate }}\n </li>\n </button>\n <button\n data-testid=\"edit-action\"\n *ngIf=\"isEditVisible\"\n (click)=\"editClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Edit Message\" | translate }}\n </li>\n </button>\n <button\n data-testid=\"delete-action\"\n *ngIf=\"isDeleteVisible\"\n (click)=\"deleteClicked()\"\n >\n <li class=\"str-chat__message-actions-list-item\">\n {{ \"streamChat.Delete\" | translate }}\n </li>\n </button>\n </ul>\n</div>\n\n<stream-modal\n [isOpen]=\"isEditModalOpen\"\n (isOpenChange)=\"\n isEditModalOpen = $event; isEditModalOpen ? '' : modalClosed()\n \"\n>\n <div class=\"str-chat__edit-message-form\" *ngIf=\"isEditModalOpen\">\n <ng-container *ngIf=\"messageInputTemplate; else defaultInput\">\n <ng-container\n *ngTemplateOutlet=\"\n messageInputTemplate;\n context: {\n message: message,\n messageUpdateHandler: modalClosed\n }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <stream-message-input\n [message]=\"message\"\n (messageUpdate)=\"modalClosed()\"\n ></stream-message-input>\n </ng-template>\n <stream-notification-list></stream-notification-list>\n <div\n class=\"\n str-chat__message-team-form-footer\n str-chat__message-team-form-footer-angular\n \"\n >\n <div class=\"str-chat__edit-message-form-options\">\n <button translate data-testid=\"cancel-button\" (click)=\"modalClosed()\">\n streamChat.Cancel\n </button>\n <button\n type=\"submit\"\n translate\n data-testid=\"send-button\"\n (click)=\"sendClicked()\"\n (keyup.enter)=\"sendClicked()\"\n >\n streamChat.Send\n </button>\n </div>\n </div>\n </div>\n</stream-modal>\n","import { Component } from '@angular/core';\nimport { Observable, of, Subscription } from 'rxjs';\nimport { catchError, map, startWith } from 'rxjs/operators';\nimport { ChannelService } from '../channel.service';\n\n@Component({\n selector: 'stream-channel',\n templateUrl: './channel.component.html',\n styles: [],\n})\nexport class ChannelComponent {\n isError$: Observable<boolean>;\n isInitializing$: Observable<boolean>;\n isActiveThread$: Observable<boolean>;\n subscriptions: Subscription[] = [];\n\n constructor(private channelService: ChannelService) {\n this.isError$ = this.channelService.channels$.pipe(\n map(() => false),\n catchError(() => of(true)),\n startWith(false)\n );\n this.isInitializing$ = this.channelService.channels$.pipe(\n map((channels) => !channels),\n catchError(() => of(false))\n );\n this.isActiveThread$ = this.channelService.activeParentMessageId$.pipe(\n map((id) => !!id)\n );\n }\n}\n","<div\n *ngIf=\"(isError$ | async) === false && (isInitializing$ | async) === false\"\n class=\"str-chat str-chat-channel messaging\"\n>\n <div class=\"str-chat__container\">\n <div class=\"str-chat__main-panel\">\n <ng-content></ng-content>\n </div>\n <ng-content\n *ngIf=\"isActiveThread$ | async\"\n select='[name=\"thread\"]'\n ></ng-content>\n </div>\n</div>\n","export type DeviceWidth = {\n device: 'mobile' | 'tablet' | 'full';\n width: number;\n};\n\nexport const getDeviceWidth = (): DeviceWidth => {\n const width = window.innerWidth;\n if (width < 768) return { device: 'mobile', width };\n if (width < 1024) return { device: 'tablet', width };\n return { device: 'full', width };\n};\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { distinctUntilChanged, filter, first } from 'rxjs/operators';\nimport { getDeviceWidth } from '../device-width';\n\n@Injectable({ providedIn: 'root' })\nexport class ChannelListToggleService {\n isOpen$: Observable<boolean>;\n private isOpenSubject = new BehaviorSubject<boolean>(false);\n private menuElement: HTMLElement | undefined;\n\n constructor() {\n this.isOpen$ = this.isOpenSubject\n .asObservable()\n .pipe(distinctUntilChanged());\n this.isOpen$.pipe(filter((s) => s)).subscribe(() => {\n if (getDeviceWidth().device === 'mobile') {\n this.watchForOutsideClicks();\n }\n });\n }\n\n open() {\n this.isOpenSubject.next(true);\n }\n\n close() {\n this.isOpenSubject.next(false);\n }\n\n toggle() {\n this.isOpenSubject.getValue() ? this.close() : this.open();\n }\n\n setMenuElement(element: HTMLElement | undefined) {\n this.menuElement = element;\n }\n\n channelSelected() {\n if (getDeviceWidth().device === 'mobile') {\n this.close();\n }\n }\n\n private watchForOutsideClicks() {\n if (!this.menuElement) {\n return;\n }\n const eventHandler = (event: Event) => {\n if (!this.menuElement!.contains(event.target as Node)) {\n this.close();\n window.removeEventListener('click', eventHandler);\n }\n };\n window.addEventListener('click', eventHandler);\n this.isOpen$\n .pipe(\n filter((s) => !s),\n first()\n )\n .subscribe(() => window.removeEventListener('click', eventHandler));\n }\n}\n","import { Component } from '@angular/core';\nimport { Channel } from 'stream-chat';\nimport { ChannelListToggleService } from '../channel-list/channel-list-toggle.service';\nimport { ChannelService } from '../channel.service';\n\n@Component({\n selector: 'stream-channel-header',\n templateUrl: './channel-header.component.html',\n styles: [],\n})\nexport class ChannelHeaderComponent {\n activeChannel: Channel | undefined;\n canReceiveConnectEvents: boolean | undefined;\n\n constructor(\n private channelService: ChannelService,\n private channelListToggleService: ChannelListToggleService\n ) {\n this.channelService.activeChannel$.subscribe((c) => {\n this.activeChannel = c;\n const capabilities = this.activeChannel?.data\n ?.own_capabilities as string[];\n if (!capabilities) {\n return;\n }\n this.canReceiveConnectEvents =\n capabilities.indexOf('connect-events') !== -1;\n });\n }\n\n toggleMenu(event: Event) {\n event.stopPropagation();\n this.channelListToggleService.toggle();\n }\n\n get memberCountParam() {\n return { memberCount: this.activeChannel?.data?.member_count || 0 };\n }\n\n get watcherCountParam() {\n return { watcherCount: this.activeChannel?.state?.watcher_count || 0 };\n }\n}\n","<div class=\"str-chat__header-livestream\">\n <div\n class=\"str-chat__header-hamburger\"\n (click)=\"toggleMenu($event)\"\n (keyup.enter)=\"toggleMenu($event)\"\n >\n <span class=\"str-chat__header-hamburger--line\"></span>\n <span class=\"str-chat__header-hamburger--line\"></span>\n <span class=\"str-chat__header-hamburger--line\"></span>\n </div>\n <stream-avatar\n imageUrl=\"{{ activeChannel?.data?.image }}\"\n name=\"{{ activeChannel?.data?.name }}\"\n ></stream-avatar>\n <div class=\"str-chat__header-livestream-left\">\n <p data-testid=\"name\" class=\"str-chat__header-livestream-left--title\">\n {{ activeChannel?.data?.name }}\n </p>\n <p data-testid=\"info\" class=\"str-chat__header-livestream-left--members\">\n {{'streamChat.{{ memberCount }} members' | translate:memberCountParam}}\n {{canReceiveConnectEvents ? ('streamChat.{{ watcherCount }} online' |\n translate:watcherCountParam) : ''}}\n </p>\n </div>\n</div>\n","import { Component, Input, NgZone, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport {\n Channel,\n Event,\n FormatMessageResponse,\n MessageResponse,\n} from 'stream-chat';\nimport { ChannelService } from '../channel.service';\n\n@Component({\n selector: 'stream-channel-preview',\n templateUrl: './channel-preview.component.html',\n styles: [],\n})\nexport class ChannelPreviewComponent implements OnInit, OnDestroy {\n @Input() channel: Channel | undefined;\n isActive = false;\n isUnread = false;\n latestMessage: string = 'Nothing yet...';\n private subscriptions: (Subscription | { unsubscribe: () => void })[] = [];\n private canSendReadEvents = true;\n\n constructor(private channelService: ChannelService, private ngZone: NgZone) {}\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe(\n (activeChannel) =>\n (this.isActive = activeChannel?.id === this.channel?.id)\n )\n );\n const messages = this.channel?.state?.messages;\n if (messages && messages.length > 0) {\n this.setLatestMessage(messages[messages.length - 1]);\n }\n this.isUnread = !!this.channel!.countUnread() && this.canSendReadEvents;\n const capabilities =\n (this.channel?.data?.own_capabilities as string[]) || [];\n this.canSendReadEvents = capabilities.indexOf('read-events') !== -1;\n this.subscriptions.push(\n this.channel!.on('message.new', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('message.updated', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('message.deleted', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('channel.truncated', this.handleMessageEvent.bind(this))\n );\n this.subscriptions.push(\n this.channel!.on('message.read', () =>\n this.ngZone.run(() => {\n this.isUnread =\n !!this.channel!.countUnread() && this.canSendReadEvents;\n })\n )\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n get avatarImage() {\n return this.channel?.data?.image;\n }\n\n get avatarName() {\n return this.channel?.data?.name;\n }\n\n get title() {\n return this.channel?.data?.name;\n }\n\n setAsActiveChannel(): void {\n void this.channelService.setAsActiveChannel(this.channel!);\n }\n\n private handleMessageEvent(event: Event) {\n this.ngZone.run(() => {\n if (this.channel?.state.messages.length === 0) {\n this.latestMessage = 'Nothing yet...';\n return;\n }\n if (\n !event.message ||\n this.channel?.state.messages[this.channel?.state.messages.length - 1]\n .id !== event.message.id\n ) {\n return;\n }\n this.setLatestMessage(event.message);\n this.isUnread = !!this.channel.countUnread() && this.canSendReadEvents;\n });\n }\n\n private setLatestMessage(message?: FormatMessageResponse | MessageResponse) {\n if (message?.deleted_at) {\n this.latestMessage = 'streamChat.Message deleted';\n } else if (message?.text) {\n this.latestMessage = message.text;\n } else if (message?.attachments && message.attachments.length) {\n this.latestMessage = 'streamChat.🏙 Attachment...';\n }\n }\n}\n","<button\n class=\"str-chat__channel-preview-messenger\"\n [class.str-chat__channel-preview-messenger--active]=\"isActive\"\n [class.str-chat__channel-preview-messenger--unread]=\"isUnread\"\n (click)=\"setAsActiveChannel()\"\n data-testid=\"channel-preview-container\"\n>\n <div class=\"str-chat__channel-preview-messenger--left\">\n <stream-avatar\n imageUrl=\"{{ avatarImage }}\"\n name=\"{{ avatarName }}\"\n [size]=\"40\"\n ></stream-avatar>\n </div>\n <div class=\"str-chat__channel-preview-messenger--right\">\n <div class=\"str-chat__channel-preview-messenger--name\">\n <span data-testid=\"channel-preview-title\">{{ title }}</span>\n </div>\n <div\n data-testid=\"latest-message\"\n class=\"str-chat__channel-preview-messenger--last-message\"\n >\n {{ latestMessage | translate }}\n </div>\n </div>\n</button>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, startWith } from 'rxjs/operators';\nimport { Channel } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { ChannelListToggleService } from './channel-list-toggle.service';\n\n@Component({\n selector: 'stream-channel-list',\n templateUrl: './channel-list.component.html',\n styles: [],\n})\nexport class ChannelListComponent implements AfterViewInit {\n @Input() customChannelPreviewTemplate: TemplateRef<any> | undefined;\n channels$: Observable<Channel[] | undefined>;\n isError$: Observable<boolean>;\n isInitializing$: Observable<boolean>;\n isLoadingMoreChannels = false;\n isOpen$: Observable<boolean>;\n hasMoreChannels$: Observable<boolean>;\n @ViewChild('container') private container!: ElementRef<HTMLElement>;\n\n constructor(\n private channelService: ChannelService,\n private channelListToggleService: ChannelListToggleService\n ) {\n this.isOpen$ = this.channelListToggleService.isOpen$;\n this.channels$ = this.channelService.channels$;\n this.hasMoreChannels$ = this.channelService.hasMoreChannels$;\n this.isError$ = this.channels$.pipe(\n map(() => false),\n catchError(() => of(true)),\n startWith(false)\n );\n this.isInitializing$ = this.channels$.pipe(\n map((channels) => !channels),\n catchError(() => of(false))\n );\n }\n ngAfterViewInit(): void {\n this.channelListToggleService.setMenuElement(this.container.nativeElement);\n }\n\n async loadMoreChannels() {\n this.isLoadingMoreChannels = true;\n await this.channelService.loadMoreChannels();\n this.isLoadingMoreChannels = false;\n }\n\n trackByChannelId(index: number, item: Channel) {\n return item.cid;\n }\n\n channelSelected() {\n this.channelListToggleService.channelSelected();\n }\n}\n","<div\n #container\n data-testid=\"channel-list-container\"\n class=\"str-chat str-chat-channel-list messaging\"\n [class.str-chat-channel-list--open]=\"(isOpen$ | async) === true\"\n>\n <div\n *ngIf=\"\n (isError$ | async) === false && (isInitializing$ | async) === false;\n else statusIndicator\n \"\n class=\"str-chat__channel-list-messenger\"\n >\n <div class=\"str-chat__channel-list-messenger__main\">\n <p\n data-testid=\"empty-channel-list-indicator\"\n *ngIf=\"!(channels$ | async)?.length\"\n >\n {{ \"streamChat.You have no channels currently\" | translate }}\n </p>\n <ng-container\n *ngFor=\"let channel of channels$ | async; trackBy: trackByChannelId\"\n >\n <ng-container\n *ngIf=\"customChannelPreviewTemplate; else defaultTemplate\"\n >\n <div (click)=\"channelSelected()\" (keyup.enter)=\"channelSelected()\">\n <ng-container\n *ngTemplateOutlet=\"\n customChannelPreviewTemplate;\n context: { channel: channel }\n \"\n ></ng-container>\n </div>\n </ng-container>\n <ng-template #defaultTemplate>\n <stream-channel-preview\n data-testclass=\"channel-preview\"\n [channel]=\"channel\"\n (click)=\"channelSelected()\"\n (keyup.enter)=\"channelSelected()\"\n ></stream-channel-preview>\n </ng-template>\n </ng-container>\n <div\n *ngIf=\"hasMoreChannels$ | async\"\n class=\"str-chat__load-more-button\"\n (click)=\"loadMoreChannels()\"\n (keyup.enter)=\"loadMoreChannels()\"\n data-testid=\"load-more\"\n >\n <button\n class=\"str-chat__load-more-button__button\"\n data-testid=\"load-more-button\"\n [disabled]=\"isLoadingMoreChannels\"\n >\n <span *ngIf=\"!isLoadingMoreChannels; else loadingIndicator\">{{\n \"Load more\" | translate\n }}</span>\n <ng-template #loadingIndicator\n ><stream-loading-indicator></stream-loading-indicator\n ></ng-template>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #statusIndicator>\n <ng-container *ngIf=\"isError$ | async\">\n <ng-container *ngTemplateOutlet=\"chatDown\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"isInitializing$ | async\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\"></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #chatDown>\n <div data-testid=\"chatdown-container\" class=\"str-chat__down\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\"></ng-container>\n <div class=\"str-chat__down-main\">\n <stream-icon icon=\"connection-error\"></stream-icon>\n <h1>{{ \"streamChat.Connection error\" | translate }}</h1>\n <h3>\n {{\n \"streamChat.Error connecting to chat, refresh the page to try again.\"\n | translate\n }}\n </h3>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loadingChannels>\n <div data-testid=\"loading-indicator\" class=\"str-chat__loading-channels\">\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n <ng-container *ngTemplateOutlet=\"loadingChannel\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #loadingChannel>\n <div class=\"str-chat__loading-channels-item\">\n <div class=\"str-chat__loading-channels-avatar\"></div>\n <div class=\"str-chat__loading-channels-meta\">\n <div class=\"str-chat__loading-channels-username\"></div>\n <div class=\"str-chat__loading-channels-status\"></div>\n </div>\n </div>\n</ng-template>\n","import Dayjs from 'dayjs';\nimport calendar from 'dayjs/plugin/calendar';\n\nDayjs.extend(calendar);\n\nexport const parseDate = (date: Date) => {\n const parsedTime = Dayjs(date);\n\n return parsedTime.calendar();\n};\n","import { UserResponse } from 'stream-chat';\n\nexport const getReadByText = (users: UserResponse[]) => {\n let outStr = '';\n\n const slicedArr = users.map((item) => item.name || item.id).slice(0, 5);\n const restLength = users.length - slicedArr.length;\n\n if (slicedArr.length === 1) {\n outStr = `${slicedArr[0]} `;\n } else if (slicedArr.length === 2) {\n // joins all with \"and\" but =no commas\n // example: \"bob and sam\"\n outStr = `${slicedArr[0]} and ${slicedArr[1]}`;\n } else if (slicedArr.length > 2) {\n // joins all with commas, but last one gets \", and\" (oxford comma!)\n // example: \"bob, joe, sam and 4 more\"\n if (restLength === 0) {\n // mutate slicedArr to remove last user to display it separately\n const lastUser = slicedArr.splice(slicedArr.length - 2, 1)[0];\n const commaSeparatedUsers = slicedArr.join(', ');\n outStr = `${commaSeparatedUsers}, and ${lastUser}`;\n } else {\n const commaSeparatedUsers = slicedArr.join(', ');\n outStr = `${commaSeparatedUsers} and ${restLength} more`;\n }\n }\n\n return outStr;\n};\n","import {\n AfterViewChecked,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { ReactionResponse } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { DefaultReactionType, DefaultUserType } from '../types';\n\nexport type MessageReactionType =\n | 'angry'\n | 'haha'\n | 'like'\n | 'love'\n | 'sad'\n | 'wow';\n\nconst emojiReactionsMapping: { [key in MessageReactionType]: string } = {\n like: '👍',\n angry: '😠',\n love: '❤️',\n haha: '😂',\n wow: '😮',\n sad: '😞',\n};\n@Component({\n selector: 'stream-message-reactions',\n templateUrl: './message-reactions.component.html',\n styles: ['.emoji {position: relative; display: inline-block; }'],\n})\nexport class MessageReactionsComponent implements AfterViewChecked, OnChanges {\n @Input() messageId: string | undefined;\n @Input() messageReactionCounts: { [key in MessageReactionType]?: number } =\n {};\n @Input() isSelectorOpen: boolean = false;\n @Output() readonly isSelectorOpenChange = new EventEmitter<boolean>();\n @Input() latestReactions: ReactionResponse<\n DefaultReactionType,\n DefaultUserType\n >[] = [];\n @Input() ownReactions: ReactionResponse<\n DefaultReactionType,\n DefaultUserType\n >[] = [];\n tooltipPositions: { arrow: number; tooltip: number } | undefined;\n tooltipText: string | undefined;\n @ViewChild('selectorContainer') private selectorContainer:\n | ElementRef<HTMLElement>\n | undefined;\n @ViewChild('selectorTooltip') private selectorTooltip:\n | ElementRef<HTMLElement>\n | undefined;\n currentTooltipTarget: HTMLElement | undefined;\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private channelService: ChannelService\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isSelectorOpen) {\n this.isSelectorOpen\n ? setTimeout(() => this.watchForOutsideClicks()) // setTimeout: wait for current click to bubble up, and only watch for clicks after that\n : this.stopWatchForOutsideClicks();\n }\n }\n\n ngAfterViewChecked(): void {\n if (this.tooltipText && !this.tooltipPositions) {\n this.setTooltipPosition();\n this.cdRef.detectChanges();\n }\n }\n\n get existingReactions(): MessageReactionType[] {\n return Object.keys(this.messageReactionCounts).filter(\n (k) => this.messageReactionCounts[k as MessageReactionType]! > 0\n ) as MessageReactionType[];\n }\n\n get reactionsCount() {\n return Object.values(this.messageReactionCounts).reduce(\n (total, count) => total + count,\n 0\n );\n }\n\n get reactionOptions(): MessageReactionType[] {\n return ['like', 'love', 'haha', 'wow', 'sad', 'angry'];\n }\n\n getLatestUserByReaction(reactionType: MessageReactionType) {\n return this.latestReactions.find((r) => r.type === reactionType && r.user)\n ?.user;\n }\n\n getEmojiByReaction(reactionType: MessageReactionType) {\n return emojiReactionsMapping[reactionType];\n }\n\n getUsersByReaction(reactionType: MessageReactionType) {\n return this.latestReactions\n .filter((r) => r.type === reactionType)\n .map((r) => r.user?.name || r.user?.id)\n .filter((i) => !!i)\n .join(', ');\n }\n\n showTooltip(event: Event, reactionType: MessageReactionType) {\n this.currentTooltipTarget = event.target as HTMLElement;\n this.tooltipText = this.getUsersByReaction(reactionType);\n }\n\n hideTooltip() {\n this.tooltipText = undefined;\n this.currentTooltipTarget = undefined;\n this.tooltipPositions = undefined;\n }\n\n trackByMessageReaction(index: number, item: MessageReactionType) {\n return item;\n }\n\n react(type: MessageReactionType) {\n this.ownReactions.find((r) => r.type === type)\n ? void this.channelService.removeReaction(this.messageId!, type)\n : void this.channelService.addReaction(this.messageId!, type);\n }\n\n private eventHandler = (event: Event) => {\n if (!this.selectorContainer?.nativeElement.contains(event.target as Node)) {\n this.isSelectorOpenChange.emit(false);\n }\n };\n\n private watchForOutsideClicks() {\n window.addEventListener('click', this.eventHandler);\n }\n\n private stopWatchForOutsideClicks() {\n window.removeEventListener('click', this.eventHandler);\n }\n\n private setTooltipPosition() {\n const tooltip = this.selectorTooltip?.nativeElement.getBoundingClientRect();\n const target = this.currentTooltipTarget?.getBoundingClientRect();\n\n const container =\n this.selectorContainer?.nativeElement.getBoundingClientRect();\n\n if (!tooltip || !target || !container) return;\n\n const tooltipPosition =\n tooltip.width === container.width || tooltip.x < container.x\n ? 0\n : target.left + target.width / 2 - container.left - tooltip.width / 2;\n\n const arrowPosition =\n target.x - tooltip.x + target.width / 2 - tooltipPosition;\n\n this.tooltipPositions = {\n tooltip: tooltipPosition,\n arrow: arrowPosition,\n };\n }\n}\n","<div\n *ngIf=\"existingReactions.length > 0 && !isSelectorOpen\"\n class=\"str-chat__reaction-list\"\n [class.str-chat__reaction-list--reverse]=\"true\"\n data-testid=\"reaction-list\"\n>\n <ul>\n <li\n *ngFor=\"\n let reactionType of existingReactions;\n trackBy: trackByMessageReaction\n \"\n data-testclass=\"emoji\"\n >\n <span class=\"emoji\">\n {{ getEmojiByReaction(reactionType) }}\n </span>\n &nbsp;\n </li>\n <li>\n <span\n data-testid=\"reactions-count\"\n class=\"str-chat__reaction-list--counter\"\n >{{ reactionsCount }}</span\n >\n </li>\n </ul>\n</div>\n\n<div\n #selectorContainer\n class=\"str-chat__reaction-selector\"\n *ngIf=\"isSelectorOpen\"\n data-testid=\"reaction-selector\"\n>\n <div\n *ngIf=\"tooltipText\"\n data-testid=\"tooltip\"\n #selectorTooltip\n class=\"str-chat__reaction-selector-tooltip\"\n [ngStyle]=\"{\n left: tooltipPositions?.tooltip + 'px',\n visibility: tooltipPositions ? 'visible' : 'hidden'\n }\"\n >\n <div\n class=\"arrow\"\n [ngStyle]=\"{ left: tooltipPositions?.arrow + 'px' }\"\n ></div>\n <span class=\"latest-user-username\">\n {{ tooltipText }}\n </span>\n </div>\n <ul class=\"str-chat__message-reactions-list\">\n <li\n class=\"str-chat__message-reactions-list-item\"\n *ngFor=\"\n let reactionType of reactionOptions;\n trackBy: trackByMessageReaction\n \"\n data-testclass=\"emoji-option\"\n (click)=\"react(reactionType)\"\n (keyup.enter)=\"react(reactionType)\"\n >\n <div\n *ngIf=\"getLatestUserByReaction(reactionType) as user\"\n class=\"latest-user\"\n (click)=\"hideTooltip()\"\n (keyup.enter)=\"hideTooltip()\"\n (mouseenter)=\"showTooltip($event, reactionType)\"\n (mouseleave)=\"hideTooltip()\"\n attr.data-testid=\"{{ reactionType }}-last-user\"\n >\n <stream-avatar\n attr.data-testid=\"{{ reactionType }}-avatar\"\n [imageUrl]=\"user.image\"\n [name]=\"user.name || user.id\"\n [size]=\"20\"\n ></stream-avatar>\n </div>\n <span class=\"emoji\" style=\"width: 20px; height: 20px; top: 10px\">\n {{ getEmojiByReaction(reactionType) }}\n </span>\n <span\n *ngIf=\"\n messageReactionCounts[reactionType] &&\n messageReactionCounts[reactionType]! > 0\n \"\n class=\"str-chat__message-reactions-list-item__count\"\n attr.data-testid=\"{{ reactionType }}-reaction-count\"\n >\n {{ messageReactionCounts[reactionType] }}\n </span>\n </li>\n </ul>\n</div>\n","import {\n Component,\n ElementRef,\n Input,\n TemplateRef,\n OnChanges,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { UserResponse } from 'stream-chat';\nimport { ChannelService } from '../channel.service';\nimport { ChatClientService } from '../chat-client.service';\nimport { getDeviceWidth } from '../device-width';\nimport { DefaultUserType, StreamMessage } from '../types';\nimport { parseDate } from './parse-date';\nimport { getReadByText } from './read-by-text';\n\ntype MessagePart = {\n content: string;\n type: 'text' | 'mention';\n user?: UserResponse;\n};\n\n@Component({\n selector: 'stream-message',\n templateUrl: './message.component.html',\n styles: [],\n})\nexport class MessageComponent implements OnChanges {\n @Input() messageInputTemplate: TemplateRef<any> | undefined;\n @Input() mentionTemplate: TemplateRef<any> | undefined;\n @Input() message: StreamMessage | undefined;\n @Input() enabledMessageActions: string[] = [];\n /**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/components/message_list/#caution-arereactionsenabled-deprecated\n */\n @Input() areReactionsEnabled: boolean | undefined;\n /**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/components/message_list/#canreacttomessage-deprecated\n */\n @Input() canReactToMessage: boolean | undefined;\n @Input() isLastSentMessage: boolean | undefined;\n /**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/components/message_list/#canreceivereadevents-deprecated\n */\n @Input() canReceiveReadEvents: boolean | undefined;\n @Input() mode: 'thread' | 'main' = 'main';\n isEditing: boolean | undefined;\n isActionBoxOpen = false;\n isReactionSelectorOpen = false;\n isPressedOnMobile = false;\n visibleMessageActionsCount = 0;\n messageTextParts: MessagePart[] = [];\n private user: UserResponse<DefaultUserType> | undefined;\n @ViewChild('container') private container:\n | ElementRef<HTMLElement>\n | undefined;\n\n constructor(\n private chatClientService: ChatClientService,\n private channelService: ChannelService\n ) {\n this.user = this.chatClientService.chatClient.user;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.message) {\n this.createMessageParts();\n }\n }\n\n get isSentByCurrentUser() {\n return this.message?.user?.id === this.user?.id;\n }\n\n get readByText() {\n return getReadByText(this.message!.readBy);\n }\n\n get lastReadUser() {\n return this.message?.readBy.filter((u) => u.id !== this.user?.id)[0];\n }\n\n get isOnlyReadByMe() {\n return this.message && this.message.readBy.length === 0;\n }\n\n get isReadByMultipleUsers() {\n return this.message && this.message.readBy.length > 1;\n }\n\n get isMessageDeliveredAndRead() {\n return (\n this.message &&\n this.message.readBy &&\n this.message.status === 'received' &&\n this.message.readBy.length > 0\n );\n }\n\n get parsedDate() {\n if (!this.message || !this.message?.created_at) {\n return;\n }\n return parseDate(this.message.created_at);\n }\n\n get areOptionsVisible() {\n if (!this.message) {\n return false;\n }\n return !(\n !this.message.type ||\n this.message.type === 'error' ||\n this.message.type === 'system' ||\n this.message.type === 'ephemeral' ||\n this.message.status === 'failed' ||\n this.message.status === 'sending' ||\n (this.mode === 'thread' && !this.message.parent_id)\n );\n }\n\n get hasAttachment() {\n return !!this.message?.attachments && !!this.message.attachments.length;\n }\n\n get hasReactions() {\n return (\n !!this.message?.reaction_counts &&\n Object.keys(this.message.reaction_counts).length > 0\n );\n }\n\n get replyCountParam() {\n return { replyCount: this.message?.reply_count };\n }\n\n get canDisplayReadStatus() {\n return (\n this.canReceiveReadEvents !== false &&\n this.enabledMessageActions.indexOf('read-events') !== -1\n );\n }\n\n get quotedMessageAttachments() {\n const originalAttachments = this.message?.quoted_message?.attachments;\n return originalAttachments && originalAttachments.length\n ? [originalAttachments[0]]\n : [];\n }\n\n resendMessage() {\n void this.channelService.resendMessage(this.message!);\n }\n\n textClicked() {\n if (getDeviceWidth().device !== 'mobile') {\n this.isPressedOnMobile = false;\n return;\n }\n if (this.isPressedOnMobile) {\n return;\n }\n this.isPressedOnMobile = true;\n const eventHandler = (event: Event) => {\n if (!this.container?.nativeElement.contains(event.target as Node)) {\n this.isPressedOnMobile = false;\n window.removeEventListener('click', eventHandler);\n }\n };\n window.addEventListener('click', eventHandler);\n }\n\n setAsActiveParentMessage() {\n void this.channelService.setAsActiveParentMessage(this.message);\n }\n\n private createMessageParts() {\n let content = this.message?.html || this.message?.text;\n if (!content) {\n this.messageTextParts = [];\n } else {\n // Backend will wrap HTML content with <p></p>\\n\n if (content.startsWith('<p>')) {\n content = content.replace('<p>', '');\n }\n if (content.endsWith('</p>\\n')) {\n content = content.replace('</p>\\n', '');\n }\n if (\n !this.message!.mentioned_users ||\n this.message!.mentioned_users.length === 0\n ) {\n this.messageTextParts = [{ content, type: 'text' }];\n } else {\n this.messageTextParts = [];\n let text = content;\n this.message!.mentioned_users.forEach((user) => {\n const mention = `@${user.name || user.id}`;\n const precedingText = text.substring(0, text.indexOf(mention));\n this.messageTextParts.push({\n content: precedingText,\n type: 'text',\n });\n this.messageTextParts.push({\n content: mention,\n type: 'mention',\n user,\n });\n text = text.replace(precedingText + mention, '');\n });\n if (text) {\n this.messageTextParts.push({ content: text, type: 'text' });\n }\n }\n }\n }\n}\n","<div\n #container\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.mobile-press]=\"isPressedOnMobile\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"\n areReactionsEnabled !== false && hasReactions\n \"\n data-testid=\"message-container\"\n (mouseleave)=\"isActionBoxOpen = false\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n mode === 'main' &&\n isMessageDeliveredAndRead &&\n canDisplayReadStatus;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n </ng-container>\n <stream-avatar\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n ></stream-avatar>\n <div class=\"str-chat__message-inner\">\n <div\n class=\"str-chat__message-simple__actions\"\n data-testid=\"message-options\"\n *ngIf=\"areOptionsVisible\"\n >\n <div\n data-testid=\"message-actions-container\"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--options\n \"\n [class.str-chat-angular__message-simple__actions__action--options--editing]=\"\n isEditing\n \"\n >\n <stream-message-actions-box\n [isOpen]=\"isActionBoxOpen\"\n [isMine]=\"isSentByCurrentUser\"\n [enabledActions]=\"enabledMessageActions\"\n [message]=\"message\"\n (displayedActionsCount)=\"visibleMessageActionsCount = $event\"\n (isEditing)=\"isEditing = $event; isActionBoxOpen = !isEditing\"\n [messageInputTemplate]=\"messageInputTemplate\"\n ></stream-message-actions-box>\n <stream-icon\n *ngIf=\"visibleMessageActionsCount > 0\"\n data-testid=\"action-icon\"\n icon=\"action-icon\"\n (keyup.enter)=\"isActionBoxOpen = !isActionBoxOpen\"\n (click)=\"isActionBoxOpen = !isActionBoxOpen\"\n ></stream-icon>\n </div>\n <!-- eslint-disable @angular-eslint/template/conditional-complexity -->\n <div\n *ngIf=\"\n enabledMessageActions.indexOf('send-reply') !== -1 &&\n mode === 'main'\n \"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--thread\n \"\n data-testid=\"reply-in-thread\"\n (click)=\"setAsActiveParentMessage()\"\n (keyup.enter)=\"setAsActiveParentMessage()\"\n >\n <stream-icon icon=\"reply-in-thread\"></stream-icon>\n </div>\n <div\n *ngIf=\"\n areReactionsEnabled !== false &&\n canReactToMessage !== false &&\n enabledMessageActions.indexOf('send-reaction') !== -1\n \"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--reactions\n \"\n data-testid=\"reaction-icon\"\n (click)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n (keyup.enter)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n >\n <stream-icon icon=\"reaction-icon\"></stream-icon>\n </div>\n </div>\n <!-- eslint-enable @angular-eslint/template/conditional-complexity -->\n <stream-message-reactions\n *ngIf=\"areReactionsEnabled !== false\"\n [messageReactionCounts]=\"message?.reaction_counts || {}\"\n [latestReactions]=\"message?.latest_reactions || []\"\n [(isSelectorOpen)]=\"isReactionSelectorOpen\"\n [messageId]=\"message?.id\"\n [ownReactions]=\"message?.own_reactions || []\"\n ></stream-message-reactions>\n <stream-attachment-list\n *ngIf=\"hasAttachment && !message?.quoted_message\"\n [attachments]=\"message!.attachments!\"\n [messageId]=\"message!.id\"\n ></stream-attachment-list>\n <div class=\"str-chat__message-text\" *ngIf=\"message?.text\">\n <div\n data-testid=\"inner-message\"\n class=\"\n str-chat__message-text-inner str-chat__message-simple-text-inner\n \"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n (click)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n (keyup.enter)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n >\n <ng-container *ngTemplateOutlet=\"quotedMessage\"></ng-container>\n <stream-attachment-list\n *ngIf=\"hasAttachment && message?.quoted_message\"\n [attachments]=\"message!.attachments!\"\n [messageId]=\"message!.id\"\n ></stream-attachment-list>\n <div\n data-testid=\"client-error-message\"\n *ngIf=\"message?.type === 'error'\"\n class=\"str-chat__simple-message--error-message\"\n >\n {{ \"streamChat.Error · Unsent\" | translate }}\n </div>\n <div\n data-testid=\"error-message\"\n *ngIf=\"message?.status === 'failed'\"\n class=\"str-chat__simple-message--error-message\"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed · Unauthorized\"\n : \"streamChat.Message Failed · Click to try again\"\n ) | translate\n }}\n </div>\n <div\n (click)=\"textClicked()\"\n (keyup.enter)=\"textClicked()\"\n data-testid=\"text\"\n >\n <p>\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-container *ngIf=\"mentionTemplate; else defaultMention\">\n <ng-container\n *ngTemplateOutlet=\"\n mentionTemplate;\n context: { user: part.user! }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultMention>\n <b>{{ part.content }}</b>\n </ng-template>\n </ng-template>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"str-chat__message-simple-reply-button\">\n <button\n *ngIf=\"\n !!message?.reply_count &&\n mode !== 'thread' &&\n enabledMessageActions.indexOf('send-reply') !== -1\n \"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n <stream-icon icon=\"reply\"></stream-icon>\n {{message?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </button>\n </div>\n <div class=\"str-chat__message-data str-chat__message-simple-data\">\n <span\n data-testid=\"sender\"\n *ngIf=\"!isSentByCurrentUser\"\n class=\"str-chat__message-simple-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span data-testid=\"date\" class=\"str-chat__message-simple-timestamp\">\n {{ parsedDate }}\n </span>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #sendingStatus>\n <span\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"sending-indicator\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n <stream-loading-indicator\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator>\n </span>\n</ng-template>\n<ng-template #readStatus>\n <span\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"read-indicator\"\n >\n <div class=\"str-chat__tooltip\" data-testid=\"read-by-tooltip\">\n {{ readByText }}\n </div>\n <stream-avatar\n class=\"str-chat-angular__avatar-host\"\n data-test-id=\"last-read-user-avatar\"\n [size]=\"15\"\n [imageUrl]=\"lastReadUser?.image\"\n [name]=\"lastReadUser?.name || lastReadUser?.id\"\n ></stream-avatar>\n <span\n data-test-id=\"read-by-length\"\n *ngIf=\"isReadByMultipleUsers\"\n class=\"str-chat__message-simple-status-number\"\n >\n {{ (message?.readBy)!.length }}\n </span>\n </span>\n</ng-template>\n<ng-template #deliveredStatus>\n <span\n *ngIf=\"mode === 'main'\"\n class=\"\n str-chat__message-simple-status str-chat__message-simple-status-angular\n \"\n data-testid=\"delivered-indicator\"\n >\n <div class=\"str-chat__tooltip\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n <stream-icon\n data-testid=\"delivered-icon\"\n icon=\"delivered-icon\"\n ></stream-icon>\n </span>\n</ng-template>\n\n<ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n</ng-template>\n\n<ng-template #systemMessage>\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ message?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #quotedMessage>\n <div\n *ngIf=\"message?.quoted_message\"\n class=\"quoted-message\"\n data-testid=\"quoted-message-container\"\n [class.mine]=\"isSentByCurrentUser\"\n >\n <stream-avatar\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host\"\n [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [size]=\"20\"\n ></stream-avatar>\n <div class=\"quoted-message-inner\">\n <stream-attachment-list\n *ngIf=\"\n message?.quoted_message?.attachments &&\n message?.quoted_message?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"message?.quoted_message?.id\"\n ></stream-attachment-list>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"\n message?.quoted_message?.html || message?.quoted_message?.text\n \"\n ></div>\n </div>\n </div>\n</ng-template>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n OnChanges,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { TextareaInterface } from '../textarea.interface';\n\n@Component({\n selector: 'stream-textarea',\n templateUrl: './textarea.component.html',\n styles: [],\n})\nexport class TextareaComponent implements TextareaInterface, OnChanges {\n @HostBinding() class = 'str-chat__textarea';\n @Input() value = '';\n @Output() readonly valueChange = new EventEmitter<string>();\n @Output() readonly send = new EventEmitter<void>();\n @ViewChild('input') private messageInput!: ElementRef<HTMLInputElement>;\n\n constructor() {}\n\n // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method\n ngOnChanges(): void {}\n\n inputChanged() {\n this.valueChange.emit(this.messageInput.nativeElement.value);\n }\n\n sent(event: Event) {\n event.preventDefault();\n this.send.next();\n }\n}\n","<textarea\n [value]=\"value || ''\"\n autofocus\n data-testid=\"textarea\"\n #input\n placeholder=\"{{ 'streamChat.Type your message' | translate }}\"\n class=\"rta__textarea str-chat__textarea__textarea\"\n rows=\"1\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"sent($event)\"\n></textarea>\n","import { Injectable } from '@angular/core';\nimport transliterate from '@stream-io/transliterate';\n\n@Injectable({ providedIn: 'root' })\nexport class TransliterationService {\n constructor() {}\n\n transliterate(s: string) {\n return transliterate(s);\n }\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { MentionConfig, Mentions } from 'angular-mentions';\nimport {\n MentionAutcompleteListItemContext,\n MentionAutcompleteListItem,\n CommandAutocompleteListItemContext,\n} from '../../types';\n\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { UserResponse } from 'stream-chat';\nimport { ChannelService } from '../../channel.service';\nimport { TextareaInterface } from '../textarea.interface';\nimport { ChatClientService } from '../../chat-client.service';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { TransliterationService } from '../../transliteration.service';\n\n@Component({\n selector: 'stream-autocomplete-textarea',\n templateUrl: './autocomplete-textarea.component.html',\n styles: [],\n})\nexport class AutocompleteTextareaComponent\n implements TextareaInterface, OnChanges\n{\n @HostBinding() class = 'str-chat__textarea';\n @Input() value = '';\n @Input() areMentionsEnabled: boolean | undefined = true;\n @Input() mentionAutocompleteItemTemplate:\n | TemplateRef<MentionAutcompleteListItemContext>\n | undefined;\n @Input() commandAutocompleteItemTemplate:\n | TemplateRef<CommandAutocompleteListItemContext>\n | undefined;\n @Input() mentionScope: 'channel' | 'application' = 'channel';\n @Output() readonly valueChange = new EventEmitter<string>();\n @Output() readonly send = new EventEmitter<void>();\n @Output() readonly userMentions = new EventEmitter<UserResponse[]>();\n private readonly autocompleteKey = 'autocompleteLabel';\n private readonly mentionTriggerChar = '@';\n private readonly commandTriggerChar = '/';\n autocompleteConfig: MentionConfig = {\n mentions: [],\n };\n @ViewChild('input') private messageInput!: ElementRef<HTMLInputElement>;\n private subscriptions: Subscription[] = [];\n private mentionedUsers: UserResponse[] = [];\n private userMentionConfig: Mentions = {\n triggerChar: this.mentionTriggerChar,\n dropUp: true,\n labelKey: this.autocompleteKey,\n returnTrigger: true,\n mentionFilter: (\n searchString: string,\n items: { autocompleteLabel: string }[]\n ) => this.filter(searchString, items),\n mentionSelect: (item, triggerChar) =>\n this.itemSelectedFromAutocompleteList(item, triggerChar),\n };\n private slashCommandConfig: Mentions = {\n triggerChar: this.commandTriggerChar,\n dropUp: true,\n labelKey: 'name',\n returnTrigger: true,\n mentionFilter: (\n searchString: string,\n items: { autocompleteLabel: string }[]\n ) => this.filter(searchString, items),\n mentionSelect: (item, triggerChar) =>\n this.itemSelectedFromAutocompleteList(item, triggerChar),\n };\n private searchTerm$ = new BehaviorSubject<string>('');\n\n constructor(\n private channelService: ChannelService,\n private chatClientService: ChatClientService,\n private transliterationService: TransliterationService\n ) {\n this.searchTerm$\n .pipe(debounceTime(300), distinctUntilChanged())\n .subscribe((searchTerm) => {\n if (searchTerm.startsWith(this.mentionTriggerChar)) {\n void this.updateMentionOptions(searchTerm);\n }\n });\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe((channel) => {\n const commands = channel?.getConfig()?.commands || [];\n this.slashCommandConfig.items = commands.map((c) => ({\n ...c,\n [this.autocompleteKey]: c.name,\n type: 'command',\n }));\n this.mentionedUsers = [];\n this.userMentions.next([...this.mentionedUsers]);\n void this.updateMentionOptions(this.searchTerm$.getValue());\n })\n );\n this.autocompleteConfig.mentions = [\n this.userMentionConfig,\n this.slashCommandConfig,\n ];\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.areMentionsEnabled) {\n if (this.areMentionsEnabled) {\n this.autocompleteConfig.mentions = [\n this.userMentionConfig,\n this.slashCommandConfig,\n ];\n this.autocompleteConfig = { ...this.autocompleteConfig };\n } else {\n this.autocompleteConfig.mentions = [this.slashCommandConfig];\n this.autocompleteConfig = { ...this.autocompleteConfig };\n }\n }\n if (changes.mentionScope) {\n void this.updateMentionOptions(this.searchTerm$.getValue());\n }\n }\n\n filter(searchString: string, items: { autocompleteLabel: string }[]) {\n return items.filter((item) =>\n this.transliterate(item.autocompleteLabel.toLowerCase()).includes(\n this.transliterate(searchString.toLowerCase())\n )\n );\n }\n\n itemSelectedFromAutocompleteList(\n item: MentionAutcompleteListItem,\n triggerChar = ''\n ) {\n if (triggerChar === this.mentionTriggerChar) {\n this.mentionedUsers.push((item.user ? item.user : item) as UserResponse);\n this.userMentions.next([...this.mentionedUsers]);\n }\n return (\n triggerChar +\n item.autocompleteLabel +\n (triggerChar === this.commandTriggerChar ? ' ' : '')\n );\n }\n\n autcompleteSearchTermChanged(searchTerm: string) {\n if (searchTerm === this.mentionTriggerChar) {\n void this.updateMentionOptions();\n } else {\n this.searchTerm$.next(searchTerm);\n }\n }\n\n inputChanged() {\n this.valueChange.emit(this.messageInput.nativeElement.value);\n }\n\n inputLeft() {\n this.updateMentionedUsersFromText();\n }\n\n sent(event: Event) {\n event.preventDefault();\n this.updateMentionedUsersFromText();\n this.send.next();\n }\n\n private transliterate(s: string) {\n if (this.transliterationService) {\n return this.transliterationService.transliterate(s);\n } else {\n return s;\n }\n }\n\n private async updateMentionOptions(searchTerm?: string) {\n if (!this.areMentionsEnabled) {\n return;\n }\n searchTerm = searchTerm?.replace(this.mentionTriggerChar, '');\n const request =\n this.mentionScope === 'application'\n ? (s: string) => this.chatClientService.autocompleteUsers(s)\n : (s: string) => this.channelService.autocompleteMembers(s);\n const result = await request(searchTerm || '');\n const items = this.filter(\n searchTerm || '',\n result.map((i) => {\n const user = (i.user ? i.user : i) as UserResponse;\n return {\n ...i,\n autocompleteLabel: user.name || user.id,\n type: 'mention',\n };\n })\n );\n this.userMentionConfig.items = items;\n this.autocompleteConfig.mentions = [\n this.userMentionConfig,\n this.slashCommandConfig,\n ];\n this.autocompleteConfig = { ...this.autocompleteConfig };\n }\n\n private updateMentionedUsersFromText() {\n const updatedMentionedUsers: UserResponse[] = [];\n this.mentionedUsers.forEach((u) => {\n const key = u.name || u.id;\n if (this.value.includes(`${this.mentionTriggerChar}${key}`)) {\n updatedMentionedUsers.push(u);\n }\n });\n if (updatedMentionedUsers.length !== this.mentionedUsers.length) {\n this.userMentions.next([...updatedMentionedUsers]);\n this.mentionedUsers = updatedMentionedUsers;\n }\n }\n}\n","<textarea\n [value]=\"value || ''\"\n autofocus\n data-testid=\"textarea\"\n #input\n placeholder=\"{{ 'streamChat.Type your message' | translate }}\"\n class=\"rta__textarea str-chat__textarea__textarea\"\n rows=\"1\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"sent($event)\"\n [mentionConfig]=\"autocompleteConfig\"\n (searchTerm)=\"autcompleteSearchTermChanged($event)\"\n [mentionListTemplate]=\"autocompleteItem\"\n (blur)=\"inputLeft()\"\n></textarea>\n<ng-template #autocompleteItem let-item=\"item\">\n <div class=\"rta rta__item str-chat__emojisearch__item\" [ngSwitch]=\"item.type\">\n <div class=\"rta__entity\" *ngSwitchCase=\"'mention'\">\n <ng-container\n *ngTemplateOutlet=\"\n mentionAutocompleteItemTemplate || defaultMentionTemplate;\n context: { item: item }\n \"\n ></ng-container>\n </div>\n <div class=\"rta__entity\" *ngSwitchCase=\"'command'\">\n <ng-container\n *ngTemplateOutlet=\"\n commandAutocompleteItemTemplate || defaultCommandTemplate;\n context: { item: item }\n \"\n ></ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultCommandTemplate let-item=\"item\">\n <div class=\"str-chat__slash-command\">\n <span class=\"str-chat__slash-command-header\">\n <strong data-testclass=\"command-name\">{{ item.name }}</strong>\n {{ item.args }}\n </span>\n <br />\n <span class=\"str-chat__slash-command-description\">{{\n item.description\n }}</span>\n </div>\n</ng-template>\n\n<ng-template #defaultMentionTemplate let-item=\"item\">\n <div class=\"str-chat__user-item\">\n <stream-avatar\n data-testclass=\"avatar\"\n class=\"str-chat__avatar str-chat__avatar--circle\"\n style=\"height: 20px\"\n [size]=\"20\"\n [imageUrl]=\"item.image || item.user?.image\"\n [name]=\"item.autocompleteLabel\"\n ></stream-avatar>\n <span data-testclass=\"username\" class=\"str-chat__user-item--name\">{{\n item.autocompleteLabel\n }}</span>\n </div>\n</ng-template>\n","import { StreamMessage } from '../types';\n\nexport type GroupStyle = '' | 'middle' | 'top' | 'bottom' | 'single';\n\nexport const getGroupStyles = (\n message: StreamMessage,\n previousMessage?: StreamMessage,\n nextMessage?: StreamMessage,\n noGroupByUser = false\n): GroupStyle => {\n if (\n noGroupByUser ||\n (message.attachments && message.attachments.length !== 0)\n )\n return 'single';\n\n const isTopMessage =\n !previousMessage ||\n !isOnSameDay(previousMessage.created_at, message.created_at) ||\n previousMessage.type === 'system' ||\n (previousMessage.attachments &&\n previousMessage.attachments?.length !== 0) ||\n message.user?.id !== previousMessage.user?.id ||\n previousMessage.type === 'error' ||\n previousMessage.deleted_at;\n\n const isBottomMessage =\n !nextMessage ||\n !isOnSameDay(message.created_at, nextMessage.created_at) ||\n nextMessage.type === 'system' ||\n (nextMessage.attachments && nextMessage.attachments?.length !== 0) ||\n message.user?.id !== nextMessage.user?.id ||\n nextMessage.type === 'error' ||\n nextMessage.deleted_at;\n\n if (!isTopMessage && !isBottomMessage) {\n if (message.deleted_at || message.type === 'error') return 'single';\n return 'middle';\n }\n\n if (isBottomMessage) {\n if (isTopMessage || message.deleted_at || message.type === 'error')\n return 'single';\n return 'bottom';\n }\n\n if (isTopMessage) return 'top';\n\n return '';\n};\n\nconst isOnSameDay = (date1: Date, date2: Date) => {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n","import {\n AfterViewChecked,\n Component,\n ElementRef,\n HostBinding,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { ChannelService } from '../channel.service';\nimport { Observable, Subscription } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { StreamMessage } from '../types';\nimport { ChatClientService } from '../chat-client.service';\nimport { getGroupStyles, GroupStyle } from './group-styles';\nimport { ImageLoadService } from './image-load.service';\n\n@Component({\n selector: 'stream-message-list',\n templateUrl: './message-list.component.html',\n styles: [],\n})\nexport class MessageListComponent\n implements AfterViewChecked, OnChanges, OnInit, OnDestroy\n{\n @Input() messageTemplate: TemplateRef<any> | undefined;\n @Input() messageInputTemplate: TemplateRef<any> | undefined;\n @Input() mentionTemplate: TemplateRef<any> | undefined;\n /**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/components/message_list/#caution-arereactionsenabled-deprecated\n */\n @Input() areReactionsEnabled: boolean | undefined = undefined;\n /**\n * @deprecated https://getstream.io/chat/docs/sdk/angular/components/message_list/#caution-enabledmessageactions-deprecated\n */\n /* eslint-disable-next-line @angular-eslint/no-input-rename */\n @Input('enabledMessageActions') enabledMessageActionsInput:\n | string[]\n | undefined = undefined;\n @Input() mode: 'main' | 'thread' = 'main';\n messages$!: Observable<StreamMessage[]>;\n canReactToMessage: boolean | undefined;\n canReceiveReadEvents: boolean | undefined;\n enabledMessageActions: string[] = [];\n @HostBinding('class') private class =\n 'str-chat-angular__main-panel-inner str-chat-angular__message-list-host';\n unreadMessageCount = 0;\n isUserScrolledUp: boolean | undefined;\n groupStyles: GroupStyle[] = [];\n lastSentMessageId: string | undefined;\n parentMessage: StreamMessage | undefined;\n @ViewChild('scrollContainer')\n private scrollContainer!: ElementRef<HTMLElement>;\n @ViewChild('parentMessageElement')\n private parentMessageElement!: ElementRef<HTMLElement>;\n private latestMessageDate: Date | undefined;\n private hasNewMessages: boolean | undefined;\n private containerHeight: number | undefined;\n private oldestMessageDate: Date | undefined;\n private olderMassagesLoaded: boolean | undefined;\n private isNewMessageSentByUser: boolean | undefined;\n private authorizedMessageActions: string[] = ['flag'];\n private readonly isUserScrolledUpThreshold = 300;\n private subscriptions: Subscription[] = [];\n private prevScrollTop: number | undefined;\n\n constructor(\n private channelService: ChannelService,\n private chatClientService: ChatClientService,\n private imageLoadService: ImageLoadService\n ) {\n this.subscriptions.push(\n this.channelService.activeChannel$.subscribe((channel) => {\n this.resetScrollState();\n const capabilites = channel?.data?.own_capabilities as string[];\n if (capabilites) {\n this.canReactToMessage = capabilites.indexOf('send-reaction') !== -1;\n this.canReceiveReadEvents = capabilites.indexOf('read-events') !== -1;\n this.authorizedMessageActions = [];\n if (this.canReactToMessage) {\n this.authorizedMessageActions.push('send-reaction');\n }\n if (this.canReceiveReadEvents) {\n this.authorizedMessageActions.push('read-events');\n }\n if (capabilites.indexOf('flag-message') !== -1) {\n this.authorizedMessageActions.push('flag');\n }\n if (capabilites.indexOf('update-own-message') !== -1) {\n this.authorizedMessageActions.push('edit');\n }\n if (capabilites.indexOf('update-any-message') !== -1) {\n this.authorizedMessageActions.push('edit');\n this.authorizedMessageActions.push('edit-any');\n }\n if (capabilites.indexOf('delete-own-message') !== -1) {\n this.authorizedMessageActions.push('delete');\n }\n if (capabilites.indexOf('delete-any-message') !== -1) {\n this.authorizedMessageActions.push('delete');\n this.authorizedMessageActions.push('delete-any');\n }\n if (capabilites.indexOf('send-reply') !== -1) {\n this.authorizedMessageActions.push('send-reply');\n }\n if (capabilites.indexOf('quote-message') !== -1) {\n this.authorizedMessageActions.push('quote-message');\n }\n this.setEnabledActions();\n }\n })\n );\n this.subscriptions.push(\n this.imageLoadService.imageLoad$.subscribe(() => {\n if (!this.isUserScrolledUp) {\n this.scrollToBottom();\n // Hacky and unreliable workaround to scroll down after loaded images move the scrollbar\n setTimeout(() => {\n this.scrollToBottom();\n }, 300);\n }\n })\n );\n this.subscriptions.push(\n this.channelService.activeParentMessage$.subscribe((message) => {\n if (\n message &&\n this.parentMessage &&\n message.id !== this.parentMessage.id &&\n this.mode === 'thread'\n ) {\n this.resetScrollState();\n }\n this.parentMessage = message;\n })\n );\n }\n\n ngOnInit(): void {\n this.setMessages$();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.enabledMessageActionsInput) {\n this.setEnabledActions();\n }\n if (changes.mode) {\n this.setMessages$();\n }\n }\n\n ngAfterViewChecked() {\n if (this.hasNewMessages) {\n if (!this.isUserScrolledUp || this.isNewMessageSentByUser) {\n this.scrollToBottom();\n // Hacky and unreliable workaround to scroll down after loaded images move the scrollbar\n setTimeout(() => {\n this.scrollToBottom();\n }, 300);\n }\n this.hasNewMessages = false;\n this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;\n } else if (this.olderMassagesLoaded) {\n this.preserveScrollbarPosition();\n this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;\n this.olderMassagesLoaded = false;\n } else if (\n this.containerHeight !== undefined &&\n this.containerHeight < this.scrollContainer.nativeElement.scrollHeight &&\n !this.isUserScrolledUp\n ) {\n this.scrollToBottom();\n this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n trackByMessageId(index: number, item: StreamMessage) {\n return item.id;\n }\n\n scrollToBottom(): void {\n this.scrollContainer.nativeElement.scrollTop =\n this.scrollContainer.nativeElement.scrollHeight;\n }\n\n scrolled() {\n this.isUserScrolledUp =\n this.scrollContainer.nativeElement.scrollHeight -\n (this.scrollContainer.nativeElement.scrollTop +\n this.scrollContainer.nativeElement.clientHeight) >\n this.isUserScrolledUpThreshold;\n if (!this.isUserScrolledUp) {\n this.unreadMessageCount = 0;\n }\n if (\n this.scrollContainer.nativeElement.scrollTop <=\n (this.parentMessageElement?.nativeElement.clientHeight || 0) &&\n (this.prevScrollTop === undefined ||\n this.prevScrollTop >\n (this.parentMessageElement?.nativeElement.clientHeight || 0))\n ) {\n this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;\n this.mode === 'main'\n ? void this.channelService.loadMoreMessages()\n : void this.channelService.loadMoreThreadReplies();\n }\n this.prevScrollTop = this.scrollContainer.nativeElement.scrollTop;\n }\n\n private preserveScrollbarPosition() {\n this.scrollContainer.nativeElement.scrollTop =\n (this.prevScrollTop || 0) +\n (this.scrollContainer.nativeElement.scrollHeight - this.containerHeight!);\n }\n\n private setEnabledActions() {\n this.enabledMessageActions = [];\n if (!this.enabledMessageActionsInput) {\n this.enabledMessageActions = this.authorizedMessageActions;\n return;\n }\n this.enabledMessageActionsInput = [\n ...this.enabledMessageActionsInput,\n 'send-reaction',\n 'read-events',\n 'send-reply',\n 'quote-message',\n ];\n this.enabledMessageActionsInput.forEach((action) => {\n const isAuthorized = this.authorizedMessageActions.indexOf(action) !== -1;\n if (isAuthorized) {\n this.enabledMessageActions.push(action);\n }\n });\n }\n\n private setMessages$() {\n this.messages$ = (\n this.mode === 'main'\n ? this.channelService.activeChannelMessages$\n : this.channelService.activeThreadMessages$\n ).pipe(\n tap((messages) => {\n if (messages.length === 0) {\n return;\n }\n const currentLatestMessageDate =\n messages[messages.length - 1].created_at;\n if (\n !this.latestMessageDate ||\n this.latestMessageDate?.getTime() < currentLatestMessageDate.getTime()\n ) {\n this.latestMessageDate = currentLatestMessageDate;\n this.hasNewMessages = true;\n this.isNewMessageSentByUser =\n messages[messages.length - 1].user?.id ===\n this.chatClientService.chatClient?.user?.id;\n if (this.isUserScrolledUp) {\n this.unreadMessageCount++;\n }\n }\n const currentOldestMessageDate = messages[0].created_at;\n if (!this.oldestMessageDate) {\n this.oldestMessageDate = currentOldestMessageDate;\n } else if (\n this.oldestMessageDate?.getTime() > currentOldestMessageDate.getTime()\n ) {\n this.oldestMessageDate = currentOldestMessageDate;\n this.olderMassagesLoaded = true;\n }\n }),\n tap((messages) => {\n this.groupStyles = messages.map((m, i) =>\n getGroupStyles(m, messages[i - 1], messages[i + 1])\n );\n }),\n tap(\n (messages) =>\n (this.lastSentMessageId = [...messages]\n .reverse()\n .find(\n (m) =>\n m.user?.id === this.chatClientService.chatClient?.user?.id &&\n m.status !== 'sending'\n )?.id)\n )\n );\n }\n\n private resetScrollState() {\n this.latestMessageDate = undefined;\n this.hasNewMessages = true;\n this.isUserScrolledUp = false;\n this.containerHeight = undefined;\n this.olderMassagesLoaded = false;\n this.oldestMessageDate = undefined;\n this.unreadMessageCount = 0;\n this.prevScrollTop = undefined;\n this.isNewMessageSentByUser = undefined;\n }\n}\n","<div\n #scrollContainer\n data-testid=\"scroll-container\"\n class=\"str-chat__list\"\n (scroll)=\"scrolled()\"\n>\n <div class=\"str-chat__reverse-infinite-scroll\">\n <ul class=\"str-chat__ul\">\n <li\n #parentMessageElement\n *ngIf=\"mode === 'thread'\"\n data-testid=\"parent-message\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: parentMessage }\n \"\n ></ng-container>\n <div class=\"str-chat__thread-start\" translate>\n streamChat.Start of a new thread\n </div>\n </li>\n <li\n data-testclass=\"message\"\n *ngFor=\"\n let message of messages$ | async;\n let i = index;\n trackBy: trackByMessageId\n \"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: message }\n \"\n ></ng-container>\n </li>\n </ul>\n </div>\n</div>\n<div class=\"str-chat__list-notifications\">\n <button\n data-testid=\"scroll-to-bottom\"\n *ngIf=\"isUserScrolledUp\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-right\n str-chat__message-notification-scroll-down\n \"\n (keyup.enter)=\"scrollToBottom()\"\n (click)=\"scrollToBottom()\"\n >\n <div\n *ngIf=\"unreadMessageCount > 0\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-scroll-down-unread-count\n \"\n >\n {{ unreadMessageCount }}\n </div>\n </button>\n</div>\n\n<ng-template #messageTemplateContainer let-message=\"message\">\n <ng-container *ngIf=\"messageTemplate; else defaultMessageTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate;\n context: {\n message: message,\n areReactionsEnabled: areReactionsEnabled,\n canReactToMessage: canReactToMessage,\n lastSentMessageId: !!(\n lastSentMessageId && message?.id === lastSentMessageId\n ),\n canReceiveReadEvents: canReceiveReadEvents,\n messageInputTemplate: messageInputTemplate,\n mentionTemplate: mentionTemplate,\n mode: mode\n }\n \"\n ></ng-container>\n </ng-container>\n <ng-template #defaultMessageTemplate>\n <stream-message\n [message]=\"message\"\n [areReactionsEnabled]=\"areReactionsEnabled\"\n [canReactToMessage]=\"canReactToMessage\"\n [isLastSentMessage]=\"\n !!(lastSentMessageId && message?.id === lastSentMessageId)\n \"\n [enabledMessageActions]=\"enabledMessageActions\"\n [canReceiveReadEvents]=\"canReceiveReadEvents\"\n [messageInputTemplate]=\"messageInputTemplate\"\n [mentionTemplate]=\"mentionTemplate\"\n [mode]=\"mode\"\n ></stream-message>\n </ng-template>\n</ng-template>\n","import { Component, HostBinding, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ChannelService } from '../channel.service';\nimport { StreamMessage } from '../types';\n\n@Component({\n selector: 'stream-thread',\n templateUrl: './thread.component.html',\n styles: [],\n})\nexport class ThreadComponent implements OnDestroy {\n @HostBinding('class') private class = 'str-chat__thread';\n parentMessage: StreamMessage | undefined;\n private subscriptions: Subscription[] = [];\n\n constructor(private channelService: ChannelService) {\n this.subscriptions.push(\n this.channelService.activeParentMessage$.subscribe(\n (parentMessage) => (this.parentMessage = parentMessage)\n )\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n get replyCountParam() {\n return { replyCount: this.parentMessage?.reply_count };\n }\n\n closeThread() {\n void this.channelService.setAsActiveParentMessage(undefined);\n }\n}\n","<div class=\"str-chat__thread-header\">\n <div class=\"str-chat__thread-header-details\">\n <strong translate>streamChat.Thread</strong>\n <small data-testid=\"reply-count\">\n {{parentMessage?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </small>\n </div>\n <button\n class=\"str-chat__square-button\"\n data-testid=\"close-button\"\n (click)=\"closeThread()\"\n >\n <stream-icon icon=\"close-no-outline\"></stream-icon>\n </button>\n</div>\n<ng-content select='[name=\"thread-message-list\"]'></ng-content>\n<div class=\"str-chat__small-message-input__wrapper\">\n <ng-content select='[name=\"thread-message-input\"]'></ng-content>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AvatarComponent } from './avatar/avatar.component';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n declarations: [AvatarComponent],\n imports: [CommonModule, TranslateModule],\n exports: [AvatarComponent],\n})\nexport class StreamAvatarModule {}\n","import { NgModule } from '@angular/core';\nimport { ChannelComponent } from './channel/channel.component';\nimport { ChannelHeaderComponent } from './channel-header/channel-header.component';\nimport { ChannelListComponent } from './channel-list/channel-list.component';\nimport { ChannelPreviewComponent } from './channel-preview/channel-preview.component';\nimport { MessageComponent } from './message/message.component';\nimport { MessageInputComponent } from './message-input/message-input.component';\nimport { MessageListComponent } from './message-list/message-list.component';\nimport { CommonModule } from '@angular/common';\nimport { LoadingIndicatorComponent } from './loading-indicator/loading-indicator.component';\nimport { IconComponent } from './icon/icon.component';\nimport { MessageActionsBoxComponent } from './message-actions-box/message-actions-box.component';\nimport { AttachmentListComponent } from './attachment-list/attachment-list.component';\nimport { MessageReactionsComponent } from './message-reactions/message-reactions.component';\nimport { NotificationComponent } from './notification/notification.component';\nimport { NotificationListComponent } from './notification-list/notification-list.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AttachmentPreviewListComponent } from './attachment-preview-list/attachment-preview-list.component';\nimport { ModalComponent } from './modal/modal.component';\nimport { TextareaDirective } from './message-input/textarea.directive';\nimport { StreamAvatarModule } from './stream-avatar.module';\nimport { ThreadComponent } from './thread/thread.component';\n\n@NgModule({\n declarations: [\n ChannelComponent,\n ChannelHeaderComponent,\n ChannelListComponent,\n ChannelPreviewComponent,\n MessageComponent,\n MessageInputComponent,\n MessageListComponent,\n LoadingIndicatorComponent,\n IconComponent,\n MessageActionsBoxComponent,\n AttachmentListComponent,\n MessageReactionsComponent,\n NotificationComponent,\n NotificationListComponent,\n AttachmentPreviewListComponent,\n ModalComponent,\n TextareaDirective,\n ThreadComponent,\n ],\n imports: [CommonModule, TranslateModule, StreamAvatarModule],\n exports: [\n ChannelComponent,\n ChannelHeaderComponent,\n ChannelListComponent,\n ChannelPreviewComponent,\n MessageComponent,\n MessageInputComponent,\n MessageListComponent,\n LoadingIndicatorComponent,\n IconComponent,\n MessageActionsBoxComponent,\n AttachmentListComponent,\n MessageReactionsComponent,\n NotificationComponent,\n NotificationListComponent,\n AttachmentPreviewListComponent,\n ModalComponent,\n StreamAvatarModule,\n ThreadComponent,\n ],\n})\nexport class StreamChatModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AutocompleteTextareaComponent } from './message-input/autocomplete-textarea/autocomplete-textarea.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MentionModule } from 'angular-mentions';\nimport { StreamAvatarModule } from './stream-avatar.module';\nimport { textareaInjectionToken } from './injection-tokens';\n\n@NgModule({\n declarations: [AutocompleteTextareaComponent],\n imports: [CommonModule, TranslateModule, MentionModule, StreamAvatarModule],\n exports: [AutocompleteTextareaComponent],\n providers: [\n {\n provide: textareaInjectionToken,\n useValue: AutocompleteTextareaComponent,\n },\n ],\n})\nexport class StreamAutocompleteTextareaModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { TextareaComponent } from './message-input/textarea/textarea.component';\nimport { textareaInjectionToken } from './injection-tokens';\n\n@NgModule({\n declarations: [TextareaComponent],\n imports: [CommonModule, TranslateModule],\n exports: [TextareaComponent],\n providers: [\n {\n provide: textareaInjectionToken,\n useValue: TextareaComponent,\n },\n ],\n})\nexport class StreamTextareaModule {}\n","/*\n * Public API Surface of stream-chat-angular\n */\n\nexport * from './lib/chat-client.service';\nexport * from './lib/channel.service';\nexport * from './lib/theme.service';\nexport * from './lib/attachment.service';\nexport * from './lib/stream-i18n.service';\nexport * from './lib/avatar/avatar.component';\nexport * from './lib/icon/icon.component';\nexport * from './lib/loading-indicator/loading-indicator.component';\nexport * from './lib/message-actions-box/message-actions-box.component';\nexport * from './lib/channel/channel.component';\nexport * from './lib/channel-header/channel-header.component';\nexport * from './lib/channel-preview/channel-preview.component';\nexport * from './lib/channel-list/channel-list.component';\nexport * from './lib/channel-list/channel-list-toggle.service';\nexport * from './lib/message/message.component';\nexport * from './lib/message/parse-date';\nexport * from './lib/message/read-by-text';\nexport * from './lib/message-input/message-input.component';\nexport * from './lib/message-input/textarea/textarea.component';\nexport * from './lib/message-input/autocomplete-textarea/autocomplete-textarea.component';\nexport * from './lib/message-input/message-input-config.service';\nexport * from './lib/message-input/textarea.directive';\nexport * from './lib/message-input/textarea.interface';\nexport * from './lib/message-list/message-list.component';\nexport * from './lib/message-list/image-load.service';\nexport * from './lib/message-list/group-styles';\nexport * from './lib/attachment-list/attachment-list.component';\nexport * from './lib/attachment-preview-list/attachment-preview-list.component';\nexport * from './lib/message-reactions/message-reactions.component';\nexport * from './lib/notification/notification.component';\nexport * from './lib/notification-list/notification-list.component';\nexport * from './lib/thread/thread.component';\nexport * from './lib/modal/modal.component';\nexport * from './lib/read-by';\nexport * from './lib/is-image-attachment';\nexport * from './lib/is-image-file';\nexport * from './lib/device-width';\nexport * from './lib/message-preview';\nexport * from './lib/notification.service';\nexport * from './lib/transliteration.service';\nexport * from './lib/stream-chat.module';\nexport * from './lib/stream-avatar.module';\nexport * from './lib/stream-autocomplete-textarea.module';\nexport * from './lib/stream-textarea.module';\nexport * from './lib/injection-tokens';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuidv4"],"mappings":"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"}