@banta/sdk 7.0.0 → 7.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/banta-sdk.mjs +66 -21
- package/fesm2022/banta-sdk.mjs.map +1 -1
- package/index.d.ts +9 -5
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banta-sdk.mjs","sources":["../../../projects/sdk/src/lib/common/lazy-connection.ts","../../../projects/sdk/src/lib/common/timer-pool.service.ts","../../../projects/sdk/src/lib/common/timestamp.component.ts","../../../projects/sdk/src/lib/common/lightbox/lightbox.component.ts","../../../projects/sdk/src/lib/common/lightbox/lightbox.component.html","../../../projects/sdk/src/lib/sdk-options.ts","../../../projects/sdk/src/lib/common/markdown-to-html.pipe.ts","../../../projects/sdk/src/lib/common/trust-resource-url.pipe.ts","../../../projects/sdk/src/lib/common/mention-linker.pipe.ts","../../../projects/sdk/src/lib/common/attachment/attachment.component.ts","../../../projects/sdk/src/lib/common/attachment/attachment.component.html","../../../projects/sdk/src/lib/common/attachments/attachments.component.ts","../../../projects/sdk/src/lib/common/attachments/attachments.component.html","../../../projects/sdk/src/lib/common/common.module.ts","../../../projects/sdk/src/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.ts","../../../projects/sdk/src/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.html","../../../projects/sdk/src/lib/emoji/emoji-selector-button.component.ts","../../../projects/sdk/src/lib/emoji/emoji.module.ts","../../../projects/sdk/src/lib/chat-backend-base.ts","../../../projects/sdk/src/lib/comments/comment/comment.component.ts","../../../projects/sdk/src/lib/comments/comment/comment.component.html","../../../projects/sdk/src/lib/comments/inline-replies.directive.ts","../../../projects/sdk/src/lib/comments/comment-view/comment-view.component.ts","../../../projects/sdk/src/lib/comments/comment-view/comment-view.component.html","../../../projects/sdk/src/lib/comments/reply-send-options.directive.ts","../../../projects/sdk/src/lib/comments/attachment-button/attachment-button.component.ts","../../../projects/sdk/src/lib/comments/attachment-button/attachment-button.component.html","../../../projects/sdk/src/lib/comments/attachment-scraper.directive.ts","../../../projects/sdk/src/lib/comments/comment-field/comment-field.component.ts","../../../projects/sdk/src/lib/comments/comment-field/comment-field.component.html","../../../projects/sdk/src/lib/comments/banta-comments/banta-comments.component.ts","../../../projects/sdk/src/lib/comments/banta-comments/banta-comments.component.html","../../../projects/sdk/src/lib/chat/chat-message/chat-message.component.ts","../../../projects/sdk/src/lib/chat/chat-message/chat-message.component.html","../../../projects/sdk/src/lib/chat/chat-view/chat-view.component.ts","../../../projects/sdk/src/lib/chat/chat-view/chat-view.component.html","../../../projects/sdk/src/lib/chat/banta-chat/banta-chat.component.ts","../../../projects/sdk/src/lib/chat/banta-chat/banta-chat.component.html","../../../projects/sdk/src/lib/comments/live-comment.component.ts","../../../projects/sdk/src/lib/chat/live-chat-message.component.ts","../../../projects/sdk/src/lib/live-message.component.ts","../../../projects/sdk/src/lib/banta/banta.component.ts","../../../projects/sdk/src/lib/banta/banta.component.html","../../../projects/sdk/src/lib/banta-logo.component.ts","../../../projects/sdk/src/lib/chat/chat.module.ts","../../../projects/sdk/src/lib/comments/comment-sort/comment-sort.component.ts","../../../projects/sdk/src/lib/comments/comment-sort/comment-sort.component.html","../../../projects/sdk/src/lib/comments/comments.module.ts","../../../projects/sdk/src/lib/chat-source.ts","../../../projects/sdk/src/lib/static-chat-source.ts","../../../projects/sdk/src/lib/chat-backend.ts","../../../projects/sdk/src/lib/url-attachments.ts","../../../projects/sdk/src/lib/youtube-attachments.ts","../../../projects/sdk/src/lib/giphy-attachments.ts","../../../projects/sdk/src/lib/tweet-attachments.ts","../../../projects/sdk/src/lib/banta-sdk.module.ts","../../../projects/sdk/src/public-api.ts","../../../projects/sdk/src/banta-sdk.ts"],"sourcesContent":["import { Subject, Observable, ConnectableObservable } from 'rxjs';\r\nimport { publish } from 'rxjs/operators';\r\n\r\nexport interface LazyConnectionOptions<T> {\r\n start : (subject : Subject<T>) => void;\r\n stop : () => void;\r\n}\r\n\r\nexport function lazyConnection<T>(options : LazyConnectionOptions<T>): Observable<T> {\r\n\r\n let obs = new Observable(observer => {\r\n let subject = new Subject<T>();\r\n let subscription = subject.subscribe(observer);\r\n\r\n options.start(subject);\r\n return () => {\r\n subscription.unsubscribe();\r\n options.stop();\r\n };\r\n });\r\n \r\n return (<ConnectableObservable<T>>obs.pipe(publish())).refCount();\r\n}","import { Injectable } from \"@banta/common\";\r\n\r\ninterface TimerState {\r\n handle?;\r\n subscribers: (() => void)[];\r\n}\r\n\r\n/**\r\n * Provides a way to hook in to a shared set of timers, instead of creating a timer per instance.\r\n * This is very useful for cases where the update is not extremely time-sensitive, but happens at scale.\r\n * The principal use case is the TimestampComponent. When several hundred (or several thousand) comments are \r\n * being displayed, we do not want to trigger thousands of independent relative timestamp updates, because over \r\n * time the updates will saturate the CPU since they don't perfectly align. \r\n */\r\n@Injectable()\r\nexport class TimerPool {\r\n private subscriptions = new Map<number, TimerState>();\r\n\r\n private newSubscriptionsNotice;\r\n private newSubscriptions = new Map<number, number>();\r\n\r\n private removedSubscriptionsNotice;\r\n private removedSubscriptions = new Map<number, number>();\r\n\r\n addTimer(interval: number, callback: () => void) {\r\n if (interval <= 0) {\r\n console.warn(`Refusing to set timer with interval of ${interval}!`);\r\n return () => {};\r\n }\r\n\r\n let state: TimerState;\r\n let sizeWas = this.subscriptions.size;\r\n\r\n if (!this.subscriptions.has(interval)) {\r\n state = { subscribers: [] };\r\n state.handle = setInterval(() => {\r\n console.debug(`[Banta/TimerPool] Notifying ${state.subscribers.length} subs [${interval}ms]`);\r\n state.subscribers.forEach(sub => sub());\r\n }, interval);\r\n this.subscriptions.set(interval, state);\r\n } else {\r\n state = this.subscriptions.get(interval);\r\n }\r\n\r\n state.subscribers.push(callback);\r\n\r\n // Debug information //////////////////////////\r\n //\r\n\r\n if (!this.newSubscriptions.has(interval))\r\n this.newSubscriptions.set(interval, 0);\r\n this.newSubscriptions.set(interval, (this.newSubscriptions.get(interval) ?? 0) + 1);\r\n\r\n clearTimeout(this.newSubscriptionsNotice);\r\n this.newSubscriptionsNotice = setTimeout(() => {\r\n for (let [interval, count] of this.newSubscriptions) {\r\n console.debug(`[Banta/TimerPool] ${count} new subscriptions to ${interval}ms [${state.subscribers.length} total]`);\r\n }\r\n\r\n this.newSubscriptions.clear();\r\n });\r\n\r\n //\r\n ///////////////////////////////////////////////\r\n\r\n if (sizeWas === 0) {\r\n console.debug(`[Banta/TimerPool] No longer idle.`);\r\n }\r\n\r\n // Unsubscribe function \r\n\r\n return () => {\r\n let state = this.subscriptions.get(interval);\r\n if (!state)\r\n return;\r\n\r\n let index = state.subscribers.indexOf(callback);\r\n if (index >= 0)\r\n state.subscribers.splice(index, 1);\r\n\r\n if (state.subscribers.length === 0) {\r\n clearInterval(state.handle);\r\n this.subscriptions.delete(interval);\r\n }\r\n\r\n if (!this.removedSubscriptions.has(interval))\r\n this.removedSubscriptions.set(interval, 0);\r\n this.removedSubscriptions.set(interval, (this.removedSubscriptions.get(interval) ?? 0) + 1);\r\n\r\n // Debug information ////////////////////////////////////////////////////////////////////\r\n\r\n clearTimeout(this.removedSubscriptionsNotice);\r\n this.removedSubscriptionsNotice = setTimeout(() => {\r\n for (let [interval, count] of this.removedSubscriptions) {\r\n let state = this.subscriptions.get(interval);\r\n console.debug(`[Banta/TimerPool] ${count} unsubscribed from ${interval}ms [${state?.subscribers?.length ?? 0} remain]`);\r\n }\r\n\r\n if (this.subscriptions.size === 0)\r\n console.debug(`[Banta/TimerPool] All subscriptions have been removed. Now idle.`);\r\n\r\n this.removedSubscriptions.clear();\r\n });\r\n };\r\n }\r\n}","import { Component, Input } from \"@angular/core\";\r\nimport { TimerPool } from \"../../lib/common/timer-pool.service\";\r\n\r\n@Component({\r\n selector: 'banta-timestamp',\r\n template: `\r\n @if (showAbsolute) {\r\n <span [title]=\"value | date : 'short'\">\r\n {{value | date : 'shortDate'}}\r\n </span>\r\n }\r\n @if (!showAbsolute) {\r\n <span [title]=\"value | date : 'short'\">\r\n {{relative}}\r\n </span>\r\n }\r\n `,\r\n styles: [``],\r\n standalone: false\r\n})\r\nexport class TimestampComponent {\r\n constructor(\r\n private timerPool: TimerPool\r\n ) {\r\n }\r\n\r\n private _value : number;\r\n relative = '';\r\n tooltip = '';\r\n\r\n private timerUnsubscribe: () => void;\r\n private timerInterval: number = 0;\r\n\r\n private _destroyed = false;\r\n\r\n ngOnDestroy() {\r\n this._destroyed = true;\r\n this.timerUnsubscribe?.();\r\n this.timerUnsubscribe = undefined;\r\n }\r\n\r\n @Input()\r\n get value() {\r\n return this._value;\r\n }\r\n\r\n showAbsolute = false;\r\n\r\n update() {\r\n if (this._destroyed)\r\n return;\r\n \r\n let now = Date.now();\r\n let diff = now - this.value;\r\n let minute = 1000*60;\r\n let hour = minute * 60;\r\n let day = hour * 24;\r\n let week = day * 7;\r\n let month = day * 30;\r\n let year = day * 365;\r\n this.showAbsolute = false;\r\n let updateTime = 0;\r\n\r\n if (diff > year) {\r\n this.showAbsolute = true;\r\n this.relative = 'abs';\r\n return;\r\n }\r\n\r\n if (diff > month) {\r\n let months = Math.floor(diff / month);\r\n\r\n if (months === 1)\r\n this.relative = `${months} month ago`;\r\n else\r\n this.relative = `${months} months ago`;\r\n \r\n } else if (diff > week) {\r\n let weeks = Math.floor(diff / week);\r\n\r\n if (weeks === 1)\r\n this.relative = `${weeks} week ago`;\r\n else\r\n this.relative = `${weeks} weeks ago`;\r\n } else if (diff > day) {\r\n let days = Math.floor(diff / day);\r\n if (days === 1)\r\n this.relative = `${days} day ago`;\r\n else\r\n this.relative = `${days} days ago`;\r\n } else if (diff > hour) {\r\n let hours = Math.floor(diff / hour);\r\n if (hours === 1)\r\n this.relative = `${hours} hour ago`;\r\n else\r\n this.relative = `${hours} hours ago`;\r\n \r\n updateTime = 1000 * 60 * 30;\r\n } else if (diff > minute) {\r\n let minutes = Math.floor(diff / minute);\r\n if (minutes === 1)\r\n this.relative = `${minutes} minute ago`;\r\n else\r\n this.relative = `${minutes} minutes ago`;\r\n updateTime = 1000 * 45;\r\n } else if (diff > 30_000) {\r\n this.relative = `about a minute ago`;\r\n updateTime = 1000 * 60;\r\n } else {\r\n this.relative = `just now`;\r\n updateTime = 1000 * 30;\r\n }\r\n \r\n if (typeof window !== 'undefined') {\r\n if (this.timerInterval !== updateTime) {\r\n this.timerInterval = updateTime;\r\n this.timerUnsubscribe?.();\r\n if (updateTime > 0) {\r\n this.timerUnsubscribe = this.timerPool.addTimer(updateTime, () => this.update());\r\n }\r\n }\r\n }\r\n }\r\n\r\n set value(v) {\r\n if (this._value !== v) {\r\n this._value = v;\r\n this.update();\r\n }\r\n }\r\n}","import { Component, ElementRef, ViewChild } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-lightbox',\r\n templateUrl: './lightbox.component.html',\r\n styleUrls: ['./lightbox.component.scss'],\r\n standalone: false\r\n})\r\nexport class LightboxComponent {\r\n @ViewChild('container') \r\n containerElement: ElementRef<HTMLDivElement>;\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n document.body.appendChild(this.containerElement.nativeElement);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.containerElement.nativeElement.remove();\r\n }\r\n\r\n images: string[];\r\n currentImage: string;\r\n\r\n isOpen: boolean;\r\n\r\n close() {\r\n this.isOpen = false;\r\n }\r\n\r\n open(currentImage: string, images: string[]) {\r\n this.currentImage = currentImage;\r\n this.images = images;\r\n this.isOpen = true;\r\n }\r\n}","<div \r\n class=\"banta-lightbox-container\" \r\n #container\r\n [class.open]=\"isOpen\"\r\n >\r\n\r\n <a class=\"underlay\" (click)=\"close()\" href=\"javascript:;\"></a>\r\n\r\n <a class=\"close-button\" href=\"javascript:;\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <img [src]=\"currentImage\" />\r\n</div>\r\n","import { InjectionToken, Type } from \"@angular/core\";\r\nimport { ChatBackendBase } from \"./chat-backend-base\";\r\n\r\nexport interface SdkOptions {\r\n serviceUrl?: string;\r\n emojiUrl?: string;\r\n backendClass?: Type<ChatBackendBase>\r\n}\r\n\r\nexport const BANTA_SDK_OPTIONS = new InjectionToken<SdkOptions>('BANTA_SDK_OPTIONS');","import { Pipe, PipeTransform, inject } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { BANTA_SDK_OPTIONS } from '../sdk-options';\r\n\r\nimport createDOMPurify from 'dompurify';\r\n\r\nimport * as marked from 'marked';\r\nimport { EmojiDecorator } from '@astronautlabs/emoji';\r\n\r\nconst underline = {\r\n name: 'underline',\r\n level: 'inline', // Is this a block-level or inline-level tokenizer?\r\n start(src) { return src.match(/\\+\\+/)?.index; }, // Hint to Marked.js to stop and check for a match\r\n tokenizer(src, tokens) {\r\n const rule = /^\\+\\+(.*?)\\+\\+/; // Regex for the complete token\r\n const match = rule.exec(src);\r\n if (match) {\r\n return { // Token to generate\r\n type: 'underline', // Should match \"name\" above\r\n raw: match[0], // Text to consume from the source\r\n text: this.lexer.inlineTokens(match[1].trim()), // Additional custom properties\r\n };\r\n }\r\n },\r\n renderer(token) {\r\n return `<u>${this.parser.parseInline(token.text)}</u>`;\r\n }\r\n};\r\n\r\nmarked.marked.use({\r\n extensions: [underline]\r\n});\r\n\r\n@Pipe({\r\n name: 'bantaMarkdownToHtml',\r\n standalone: false\r\n})\r\nexport class BantaMarkdownToHtmlPipe implements PipeTransform {\r\n private sanitizer = inject(DomSanitizer);\r\n private sdkOptions = inject(BANTA_SDK_OPTIONS, { optional: true });\r\n\r\n constructor() {\r\n this.renderer = new marked.Renderer();\r\n const linkRenderer = this.renderer.link;\r\n this.renderer.link = token => {\r\n const html = linkRenderer.call(this.renderer, token);\r\n return html.replace(/^<a /, '<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" ');\r\n };\r\n }\r\n\r\n\tprivate get emojiUrl() {\r\n\t\treturn this.sdkOptions?.emojiUrl ?? 'https://cdn.jsdelivr.net/gh/jdecked/twemoji@17.0.2/assets/';\r\n\t}\r\n\r\n renderer: marked.Renderer;\r\n transform(value: string) {\r\n if (!value)\r\n return '';\r\n\r\n let purifier = createDOMPurify(window);\r\n\r\n // https://github.com/cure53/DOMPurify/blob/e1c19cf6407d782b666cb1d02a6af191f9cbc09e/demos/hooks-target-blank-demo.html\r\n // Add a hook to make all links open a new window\r\n purifier.addHook('afterSanitizeAttributes', function(node: HTMLElement & { target?: string }) {\r\n // set all elements owning target to target=_blank\r\n if ('target' in node) {\r\n node.setAttribute('target','_blank');\r\n // prevent https://www.owasp.org/index.php/Reverse_Tabnabbing\r\n node.setAttribute('rel', 'noopener noreferrer nofollow');\r\n }\r\n // set non-HTML/MathML links to xlink:show=new\r\n if (!node.hasAttribute('target')\r\n && (node.hasAttribute('xlink:href')\r\n || node.hasAttribute('href'))) {\r\n node.setAttribute('xlink:show', 'new');\r\n }\r\n });\r\n\r\n value = marked.marked.parse(value, {\r\n renderer: this.renderer\r\n }) as string;\r\n\r\n value = EmojiDecorator.parse(value, { baseUrl: this.emojiUrl });\r\n\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n purifier.sanitize(value,\r\n {\r\n FORBID_TAGS: ['h1', 'h2', 'h3', 'h4', 'style', 'link', 'script'],\r\n FORBID_ATTR: ['style'],\r\n KEEP_CONTENT: true\r\n }\r\n )\r\n );\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'trustResourceUrl',\r\n standalone: false\r\n})\r\nexport class BantaTrustResourceUrlPipe implements PipeTransform {\r\n constructor(\r\n private sanitizer: DomSanitizer\r\n ) {\r\n }\r\n\r\n transform(value: string) {\r\n if (!value)\r\n return undefined;\r\n\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ChatMessageMention } from '@banta/common';\r\n\r\n@Pipe({\r\n name: 'mentionLinker',\r\n standalone: false\r\n})\r\nexport class BantaMentionLinkerPipe implements PipeTransform {\r\n transform(value: string, links?: ChatMessageMention[]) {\r\n if (!value)\r\n return '';\r\n\r\n if (!links)\r\n return value;\r\n\r\n let text = value;\r\n\r\n for (let i = 0, max = links.length; i < max; ++i) {\r\n let mention = links[i];\r\n text = text.replace(new RegExp(`${this.escapeRegExp(mention.text)}`, `gi`), `@{${i + 1}}`);\r\n }\r\n\r\n text = text.replace(/@\\{(\\d+)\\}/g, (text, i) => links[i - 1] ? this.formatLink(links[i - 1]) : text);\r\n\r\n return text;\r\n }\r\n\r\n formatLink(link: ChatMessageMention) {\r\n return `<a${ link.external ? ` target=\"_blank\" rel=\"noopener\"` : `` } class=\"mention\" href=\"${link.link}\">${link.text}</a>`;\r\n }\r\n\r\n /**\r\n * https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\r\n */\r\n escapeRegExp(string) {\r\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\r\n }\r\n}","import { Component, ElementRef, HostBinding, Input, Output } from \"@angular/core\";\r\nimport { ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\n\r\nlet TWITTER_LOADED = false;\r\n\r\n@Component({\r\n selector: 'banta-attachment',\r\n templateUrl: './attachment.component.html',\r\n styleUrls: ['./attachment.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaAttachmentComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n\r\n }\r\n\r\n private _attachment: ChatMessageAttachment;\r\n @Input() get attachment() { return this._attachment; }\r\n set attachment(value) {\r\n this._attachment = value;\r\n this.checkLoad();\r\n this.loadPlatformSpecific();\r\n }\r\n \r\n @Input() loading = false;\r\n @Input() editing = false;\r\n @Input() loadingMessage: string = 'Please wait...';\r\n @Input() error = false;\r\n @Input() errorMessage: string = 'An error has occurred';\r\n @Output() removed = new Subject<void>();\r\n @Output() activated = new Subject<void>();\r\n @Output() loaded = new Subject<void>();\r\n\r\n private _viewLoaded = false;\r\n ngAfterViewInit() {\r\n this._viewLoaded = true;\r\n this.checkLoad();\r\n }\r\n\r\n private loadTwitterWidgets() {\r\n if (typeof window !== 'undefined')\r\n window['twttr']?.widgets.load();\r\n }\r\n\r\n private loadPlatformSpecific() {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n if (this._attachment?.type === 'tweet') {\r\n if (!TWITTER_LOADED && document.querySelector('script[src=\"https://platform.twitter.com/widgets.js\"]'))\r\n TWITTER_LOADED = true;\r\n\r\n if (typeof window !== 'undefined' && !TWITTER_LOADED) {\r\n TWITTER_LOADED = true;\r\n let script = document.createElement('script');\r\n script.src = 'https://platform.twitter.com/widgets.js';\r\n script.async = true;\r\n script.addEventListener('load', () => setTimeout(() => this.loadTwitterWidgets()));\r\n document.body.appendChild(script);\r\n } else {\r\n setTimeout(() => this.loadTwitterWidgets());\r\n }\r\n }\r\n }\r\n\r\n private checkLoad() {\r\n if (!this._attachment || !this._viewLoaded || !this.elementRef?.nativeElement)\r\n return;\r\n\r\n if (typeof window === 'undefined')\r\n this.loaded.next();\r\n else\r\n setTimeout(() => this.loaded.next(), 250);\r\n }\r\n\r\n activate() {\r\n this.activated.next();\r\n }\r\n\r\n remove() {\r\n this.removed.next();\r\n }\r\n\r\n get isError() {\r\n return this.error || this.attachment?.transientState?.error;\r\n }\r\n\r\n get theErrorMessage() {\r\n return this.errorMessage || this.attachment?.transientState?.errorMessage;\r\n }\r\n\r\n @HostBinding('class.loading')\r\n get isLoading() {\r\n return this.editing && (\r\n this.loading || !this.attachment || this.attachment.transientState?.loading \r\n || !this.attachment.url\r\n );\r\n }\r\n\r\n get isImageAttachment() {\r\n return this.attachment?.type?.startsWith('image/');\r\n }\r\n\r\n get hasFrame() {\r\n if (!this.attachment)\r\n return false;\r\n\r\n return this.attachment.type === 'iframe' || (\r\n this.attachment.type === 'card' \r\n && this.attachment.card?.player\r\n );\r\n }\r\n\r\n get frameUrl() {\r\n if (!this.attachment)\r\n return undefined;\r\n \r\n if (this.attachment.type === 'iframe') {\r\n return this.attachment.url;\r\n } else if (this.attachment.type === 'card') {\r\n return this.attachment.card.player;\r\n }\r\n }\r\n}","@if (editing) {\r\n <button type=\"button\" (click)=\"remove()\" mat-mini-fab color=\"primary\" class=\"remove-button\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n}\r\n\r\n@if (isError) {\r\n <mat-icon class=\"error\">close</mat-icon>\r\n <em class=\"error\">{{theErrorMessage}}</em>\r\n}\r\n@if (!isError) {\r\n @if (isLoading) {\r\n <mat-spinner></mat-spinner>\r\n <em>{{loadingMessage}}</em>\r\n }\r\n @if (!isLoading && attachment) {\r\n @if (hasFrame) {\r\n <iframe\r\n sandbox=\"allow-scripts allow-popups allow-same-origin allow-presentation\"\r\n [src]=\"frameUrl | trustResourceUrl\"></iframe>\r\n }\r\n @if (attachment.type === 'card') {\r\n <a class=\"card-attachment\" [href]=\"attachment.url\" target=\"_blank\" [class.has-image]=\"attachment.card.image\">\r\n @if (attachment.card.image) {\r\n <img\r\n class=\"thumbnail\"\r\n [src]=\"attachment.card.image\"\r\n />\r\n }\r\n <div class=\"description\">\r\n <h1>{{attachment.card.title}}</h1>\r\n <div class=\"summary\">\r\n {{attachment.card.description}}\r\n </div>\r\n <cite>{{attachment.card.url}}</cite>\r\n </div>\r\n </a>\r\n }\r\n @if (isImageAttachment && attachment.url) {\r\n <a class=\"image-attachment\" href=\"javascript:;\" (click)=\"activate()\">\r\n <img [src]=\"attachment.url\" alt=\"Image Attachment\">\r\n </a>\r\n }\r\n @if (attachment.type === 'tweet') {\r\n <blockquote\r\n class=\"twitter-tweet\">\r\n <p lang=\"en\" dir=\"ltr\"></p>\r\n <a [href]=\"attachment.url\"></a>\r\n </blockquote>\r\n }\r\n }\r\n}","import { Component, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\nimport { LightboxComponent } from \"../lightbox/lightbox.component\";\r\n\r\n@Component({\r\n selector: 'banta-attachments',\r\n templateUrl: './attachments.component.html',\r\n styleUrls: ['./attachments.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaAttachmentsComponent {\r\n @Input() attachments: ChatMessageAttachment[];\r\n @Input() editing = false;\r\n @ViewChild('lightbox') lightbox: LightboxComponent;\r\n @Output() remove = new Subject<ChatMessageAttachment>();\r\n @Output() loaded = new Subject<void>();\r\n\r\n loadedAttachments = new WeakMap<ChatMessageAttachment, boolean>();\r\n\r\n ngAfterViewInit() {\r\n\r\n }\r\n\r\n markAttachmentLoaded(attachment: ChatMessageAttachment) {\r\n this.loadedAttachments.set(attachment, true);\r\n\r\n if (this.allAttachmentsLoaded)\r\n this.loaded.next();\r\n }\r\n\r\n isAttachmentLoaded(attachment: ChatMessageAttachment) {\r\n return this.loadedAttachments.has(attachment);\r\n }\r\n\r\n get allAttachmentsLoaded() {\r\n return this.attachments.every(x => this.isAttachmentLoaded(x));\r\n }\r\n\r\n removeAttachment(attachment: ChatMessageAttachment) {\r\n this.remove.next(attachment);\r\n }\r\n\r\n isImageAttachment(attachment: ChatMessageAttachment) {\r\n if (attachment.type.startsWith('image/'))\r\n return true;\r\n return false;\r\n }\r\n\r\n isCardAttachment(attachment: ChatMessageAttachment) {\r\n if (['card'].includes(attachment.type))\r\n return true;\r\n return false;\r\n }\r\n\r\n showLightbox(image: ChatMessageAttachment) {\r\n this.lightbox.open(\r\n image.url,\r\n this.attachments\r\n .filter(x => x.type === 'image/png')\r\n .map(x => x.url)\r\n )\r\n }\r\n\r\n get validAttachments() {\r\n return this.attachments.filter(x => x.type);\r\n }\r\n\r\n get inlineAttachments() {\r\n return this.validAttachments.filter(x => x.type !== 'card' && (x.style === 'inline' || !x.style));\r\n }\r\n\r\n get blockAttachments() {\r\n return this.validAttachments.filter(x => x.style === 'block' || x.type === 'card');\r\n }\r\n\r\n attachmentId(index: number, attachment: ChatMessageAttachment) {\r\n return attachment.url;\r\n }\r\n}","@if (attachments?.length > 0) {\r\n <banta-lightbox #lightbox></banta-lightbox>\r\n <div class=\"block-attachments\">\r\n @for (attachment of blockAttachments; track attachmentId($index, attachment)) {\r\n <banta-attachment\r\n [attachment]=\"attachment\"\r\n [editing]=\"editing\"\r\n (loaded)=\"markAttachmentLoaded(attachment)\"\r\n (removed)=\"removeAttachment(attachment)\"\r\n (activated)=\"showLightbox(attachment)\"\r\n ></banta-attachment>\r\n }\r\n </div>\r\n @if (attachments && attachments?.length > 0) {\r\n <div\r\n class=\"inline-attachments\"\r\n [class.single]=\"attachments?.length === 1\"\r\n >\r\n @for (attachment of inlineAttachments; track attachmentId($index, attachment)) {\r\n <banta-attachment\r\n [attachment]=\"attachment\"\r\n [editing]=\"editing\"\r\n (loaded)=\"markAttachmentLoaded(attachment)\"\r\n (removed)=\"removeAttachment(attachment)\"\r\n (activated)=\"showLightbox(attachment)\"\r\n ></banta-attachment>\r\n }\r\n </div>\r\n }\r\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { TimestampComponent } from './timestamp.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LightboxComponent } from './lightbox/lightbox.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { BantaMarkdownToHtmlPipe } from './markdown-to-html.pipe';\r\nimport { BantaAttachmentsComponent } from './attachments/attachments.component';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { BantaTrustResourceUrlPipe } from './trust-resource-url.pipe';\r\nimport { BantaAttachmentComponent } from './attachment/attachment.component';\r\nimport { BantaMentionLinkerPipe } from './mention-linker.pipe';\r\nimport { TimerPool } from './timer-pool.service';\r\n\r\nconst COMPONENTS = [\r\n TimestampComponent,\r\n LightboxComponent,\r\n BantaMarkdownToHtmlPipe,\r\n BantaMentionLinkerPipe,\r\n BantaTrustResourceUrlPipe,\r\n BantaAttachmentComponent,\r\n BantaAttachmentsComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatButtonModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class BantaCommonModule {\r\n static forRoot(): ModuleWithProviders<BantaCommonModule> {\r\n return {\r\n ngModule: BantaCommonModule,\r\n providers: [\r\n TimerPool\r\n ]\r\n }\r\n }\r\n}","import { Component, inject, OnInit, Output } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Subject } from 'rxjs';\r\nimport { BANTA_SDK_OPTIONS } from '../../sdk-options';\r\nimport { EmojiDecorator, EMOJI, EmojiCategory, Emoji } from '@astronautlabs/emoji';\r\n\r\nconst CATEGORY_ICONS = {\r\n symbols: 'warning',\r\n people: 'people',\r\n nature: 'nature',\r\n travel: 'location_on',\r\n activity: 'local_activity',\r\n food: 'restaurant',\r\n objects: 'computer',\r\n flags: 'flag'\r\n};\r\n\r\nexport interface AugmentedCategory extends EmojiCategory {\r\n icon: string,\r\n items: AugmentedEmoji[];\r\n}\r\n\r\nexport interface AugmentedEmoji extends Emoji {\r\n html: SafeHtml;\r\n}\r\n\r\n@Component({\r\n selector: 'emoji-selector-panel',\r\n templateUrl: './emoji-selector-panel.component.html',\r\n styleUrls: ['./emoji-selector-panel.component.scss'],\r\n standalone: false\r\n})\r\nexport class EmojiSelectorPanelComponent implements OnInit {\r\n\r\n private sanitizer = inject(DomSanitizer);\r\n private sdkOptions = inject(BANTA_SDK_OPTIONS, { optional: true });\r\n\r\n categories: AugmentedCategory[] = [];\r\n allEmoji: AugmentedEmoji[];\r\n activeCategory: string = 'people';\r\n searchResults: any[] = [];\r\n searchVisible = false;\r\n\r\n @Output()\r\n private selected: Subject<string> = new Subject();\r\n\r\n private _searchQuery: string;\r\n\r\n get searchQuery() {\r\n return this._searchQuery;\r\n }\r\n\r\n set searchQuery(value) {\r\n this._searchQuery = value;\r\n setTimeout(() => {\r\n this.searchResults = this.allEmoji\r\n .filter(k =>\r\n k.description?.includes(value)\r\n || k.shortcut?.includes(value)\r\n || k.keywords?.some(x => x.includes(value))\r\n )\r\n ;\r\n this.searchResults.splice(50, this.searchResults.length);\r\n });\r\n }\r\n\r\n humanize(str: string) {\r\n if (!str)\r\n return undefined;\r\n return str.replace(/(^| )[a-z]/g, k => k.toUpperCase()).replace(/_/g, ' ');\r\n }\r\n\r\n select(char: string) {\r\n this.selected.next(char);\r\n }\r\n\r\n hideSearch() {\r\n // because of the \"outside click detection\"\r\n setTimeout(() => {\r\n this.searchVisible = false;\r\n });\r\n }\r\n\r\n showSearch() {\r\n // because of the \"outside click detection\"\r\n setTimeout(() => {\r\n this.searchVisible = true;\r\n });\r\n }\r\n\r\n private get emojiUrl() {\r\n return this.sdkOptions?.emojiUrl ?? 'https://cdn.jsdelivr.net/gh/jdecked/twemoji@17.0.2/assets/';\r\n }\r\n\r\n ngOnInit() {\r\n for (let category of EMOJI.categories) {\r\n if (!CATEGORY_ICONS[category.id])\r\n console.error(`Missing icon for category '${category.id}'`);\r\n this.categories.push({\r\n ...category,\r\n icon: CATEGORY_ICONS[category.id] ?? 'code',\r\n items: category.items.map(emoji => ({\r\n ...emoji,\r\n html: this.sanitizer.bypassSecurityTrustHtml(\r\n EmojiDecorator.parse(emoji.string, { baseUrl: this.emojiUrl })\r\n )\r\n }))\r\n });\r\n }\r\n\r\n this.allEmoji = this.categories.flatMap(cat => cat.items);\r\n\r\n }\r\n\r\n}\r\n","@if (searchVisible) {\r\n <div class=\"search-box\">\r\n <a mat-icon-button href=\"javascript:;\" (click)=\"hideSearch()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </a>\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Search for emoji</mat-label>\r\n <input name=\"search\" type=\"text\" matInput placeholder=\"Start typing\" [(ngModel)]=\"searchQuery\" />\r\n </mat-form-field>\r\n </div>\r\n}\r\n\r\n<div class=\"selector\">\r\n @if (searchVisible) {\r\n <div class=\"emoji-list\">\r\n @for (emoji of searchResults; track emoji.unicode) {\r\n <a href=\"javascript:;\" (click)=\"select(emoji.char)\" [innerHtml]=\"emoji.html || ''\"></a>\r\n }\r\n </div>\r\n }\r\n @if (!searchVisible) {\r\n <div class=\"categories\">\r\n @if (!searchVisible) {\r\n @for (category of categories; track category.id) {\r\n <a [title]=\"humanize(category.title)\"\r\n [class.active]=\"activeCategory === category.id\"\r\n mat-icon-button\r\n (click)=\"activeCategory = category.id\">\r\n <mat-icon>{{category.icon}}</mat-icon>\r\n </a>\r\n }\r\n <a title=\"Search\" [class.active] mat-icon-button (click)=\"showSearch()\">\r\n <mat-icon>search</mat-icon>\r\n </a>\r\n }\r\n </div>\r\n @for (category of categories; track category.id) {\r\n @if (activeCategory && activeCategory == category.id) {\r\n <div class=\"emoji-list\">\r\n @for (emoji of category.items; track emoji.unicode) {\r\n <a href=\"javascript:;\"\r\n (click)=\"select(emoji.string)\"\r\n [innerHtml]=\"emoji.html || ''\"></a>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n</div>\r\n","/// <reference types=\"@types/resize-observer-browser\" />\r\n\r\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';\r\nimport { Component, ElementRef, HostBinding, Output, ViewChild, Input } from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { EmojiSelectorPanelComponent } from './emoji-selector-panel/emoji-selector-panel.component';\r\n\r\n@Component({\r\n selector: 'emoji-selector-button',\r\n template: `\r\n <button #button type=\"button\" mat-icon-button (click)=\"show()\" [disabled]=\"disabled\">\r\n <mat-icon>emoji_emotions</mat-icon>\r\n </button>\r\n <ng-template cdkPortal #selectorPanelTemplate=\"cdkPortal\">\r\n <emoji-selector-panel \r\n #panel\r\n (selected)=\"insert($event)\"\r\n ></emoji-selector-panel>\r\n </ng-template>\r\n `,\r\n styles: [`\r\n :host {\r\n display: block;\r\n position: relative;\r\n }\r\n\r\n button {\r\n color: #666\r\n }\r\n `],\r\n standalone: false\r\n})\r\nexport class EmojiSelectorButtonComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>,\r\n private overlay: Overlay\r\n ) {\r\n }\r\n\r\n @ViewChild('selectorPanelTemplate') selectorPanelTemplate: TemplatePortal<any>;\r\n\r\n private _selected = new Subject<string>();\r\n showEmojiPanel = false;\r\n\r\n @Output()\r\n get selected() : Observable<string> {\r\n return this._selected;\r\n }\r\n\r\n private overlayRef: OverlayRef;\r\n\r\n get isOpen() {\r\n return this.overlayRef;\r\n }\r\n\r\n /**\r\n * Insert the given emoji.\r\n * @param str \r\n */\r\n insert(str) {\r\n this._selected.next(str);\r\n this.close();\r\n }\r\n\r\n close() {\r\n if (this.overlayRef) {\r\n this.overlayRef.dispose();\r\n this.overlayRef = null;\r\n }\r\n }\r\n\r\n @Input() disabled = false;\r\n @Input() overlayX: 'start' | 'center' | 'end' = 'end';\r\n @Input() overlayY: 'top' | 'center' | 'bottom' = 'top';\r\n @Input() originX: 'start' | 'center' | 'end' = 'end';\r\n @Input() originY: 'top' | 'center' | 'bottom' = 'bottom';\r\n\r\n show() {\r\n if (this.isOpen) {\r\n this.close();\r\n }\r\n\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay.position()\r\n .flexibleConnectedTo(this.elementRef)\r\n .withPositions([\r\n { \r\n originX: this.originX, \r\n originY: this.originY,\r\n overlayX: this.overlayX,\r\n overlayY: this.overlayY\r\n }\r\n ])\r\n .withFlexibleDimensions(true),\r\n hasBackdrop: true,\r\n disposeOnNavigation: true,\r\n scrollStrategy: this.overlay.scrollStrategies.reposition({\r\n autoClose: true\r\n })\r\n });\r\n\r\n this.overlayRef.backdropClick().subscribe(() => {\r\n this.close();\r\n })\r\n\r\n this.overlayRef.keydownEvents().subscribe(event => {\r\n if (event.key === 'Escape') {\r\n this.close();\r\n }\r\n });\r\n this.overlayRef.attach(this.selectorPanelTemplate);\r\n }\r\n}","import { NgModule } from '@angular/core';\r\nimport { EmojiSelectorPanelComponent } from './emoji-selector-panel/emoji-selector-panel.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EmojiSelectorButtonComponent } from './emoji-selector-button.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\n\r\nconst COMPONENTS = [\r\n EmojiSelectorPanelComponent,\r\n EmojiSelectorButtonComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class EmojiModule {\r\n\r\n}","import { BehaviorSubject, Observable } from 'rxjs';\r\nimport { ChatMessage, Vote, CommentsOrder, Notification, User, UrlCard, FilterMode, Topic } from '@banta/common';\r\nimport { ChatSourceBase } from './chat-source-base';\r\nimport { AttachmentResolver, AttachmentScraper } from './attachment-scraper';\r\n\r\nexport interface ChatSourceOptions {\r\n sortOrder?: CommentsOrder;\r\n filterMode?: FilterMode;\r\n\r\n /**\r\n * How many messages should be loaded initially?\r\n */\r\n initialMessageCount?: number;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\nexport abstract class ChatBackendBase {\r\n constructor() {\r\n }\r\n \r\n abstract getSourceForTopic(topicId : string, options?: ChatSourceOptions) : Promise<ChatSourceBase>;\r\n abstract getSourceForThread(topicId : string, messageId : string, options?: ChatSourceOptions) : Promise<ChatSourceBase>;\r\n\r\n /**\r\n * Get the count of the given topic\r\n * @param topicId \r\n * @returns \r\n */\r\n abstract getSourceCountForTopic(topicId: string): Promise<number>;\r\n\r\n /**\r\n * Get the count of the given topics. \r\n * @param topicId Topics to count messages on. Maximum of 1000.\r\n * @returns \r\n */\r\n abstract getSourceCountForTopics(topicIds: string[]): Promise<Record<string, number>>;\r\n\r\n /**\r\n * Get information about the given topic. \r\n * @param topicId \r\n * @returns The topic object, or undefined if no such topic was found.\r\n */\r\n abstract getTopic(topicId: string): Promise<Topic | undefined>;\r\n\r\n /**\r\n * Get information about the given topics\r\n * @param topicIds The topic IDs to look up. Maximum of 1000.\r\n * @returns An array of matching topic objects.\r\n */\r\n abstract getTopicsById(topicIds: string[]): Promise<Topic[]>;\r\n\r\n /**\r\n * Get a set of messages from the given topic.\r\n * @param topicId \r\n * @returns \r\n */\r\n abstract getMessages(\r\n topicId: string, \r\n sort?: CommentsOrder, \r\n filter?: FilterMode, \r\n offset?: number, \r\n limit?: number,\r\n pinned?: boolean\r\n ): Promise<ChatMessage[]>;\r\n\r\n /**\r\n * Get a set of messages from the given topic.\r\n * @param topicId \r\n * @returns \r\n */\r\n abstract getReplies(\r\n parentMessageId: string,\r\n sort?: CommentsOrder, \r\n filter?: FilterMode, \r\n offset?: number, \r\n limit?: number\r\n ): Promise<ChatMessage[]>;\r\n\r\n abstract refreshMessage(message : ChatMessage): Promise<ChatMessage>;\r\n abstract getMessage(topicId : string, messageId : string): Promise<ChatMessage>;\r\n abstract getSubMessage(topicId : string, parentMessageId : string, messageId : string): Promise<ChatMessage>;\r\n abstract watchMessage(message : ChatMessage, handler : (message : ChatMessage) => void) : () => void;\r\n abstract getCardForUrl(url: string): Promise<UrlCard>;\r\n readonly notificationsChanged : Observable<Notification[]>;\r\n readonly newNotification : Observable<Notification>;\r\n \r\n private _userChanged = new BehaviorSubject<User>(null);\r\n private _user : User;\r\n \r\n get userChanged() : Observable<User> {\r\n return this._userChanged;\r\n }\r\n \r\n set user(user : User) {\r\n this._user = user;\r\n this._userChanged.next(user);\r\n }\r\n\r\n get user() {\r\n return this._user;\r\n }\r\n \r\n private _attachmentScrapers: AttachmentScraper[] = [];\r\n private _attachmentResolvers: AttachmentResolver[] = [];\r\n\r\n registerAttachmentScraper(scraper: AttachmentScraper) {\r\n this._attachmentScrapers.push(scraper);\r\n }\r\n\r\n registerAttachmentResolver(resolver: AttachmentResolver) {\r\n this._attachmentResolvers.push(resolver);\r\n }\r\n\r\n get attachmentScrapers() {\r\n return this._attachmentScrapers.slice();\r\n }\r\n\r\n get attachmentResolvers() {\r\n return this._attachmentResolvers.slice();\r\n }\r\n}","import { Component, Output, Input, HostBinding, ElementRef } from \"@angular/core\";\r\nimport { Subject } from 'rxjs';\r\nimport { ChatMessage, ChatPermissions, User } from '@banta/common';\r\nimport { MessageMenuItem } from \"../../message-menu-item\";\r\nimport { take } from 'rxjs/operators';\r\nimport { PinOptions } from \"../../chat-source\";\r\n\r\n@Component({\r\n selector: 'banta-comment',\r\n templateUrl: './comment.component.html',\r\n styleUrls: ['./comment.component.scss'],\r\n standalone: false\r\n})\r\nexport class CommentComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n let maxTime = 100;\r\n let minTime = 0;\r\n let randomTime = minTime + Math.random() * (maxTime - minTime);\r\n\r\n setTimeout(() => {\r\n this.isNew = true;\r\n this.visible = true;\r\n setTimeout(() => this.isNew = false, 1000);\r\n }, randomTime);\r\n }\r\n\r\n //#region Message\r\n\r\n @Input() busy = false;\r\n @Input() get message() { return this._message; }\r\n set message(value) { this.setMessage(value); }\r\n private _message : ChatMessage;\r\n\r\n //#endregion\r\n //#region Properties\r\n\r\n private isLoaded = false;\r\n editedMessage: string;\r\n pinFormVisible = false;\r\n pinUntilDate: Date;\r\n pinUntilTime: string;\r\n pinMode: 'forever' | 'until';\r\n today = new Date();\r\n\r\n //#endregion\r\n //#region Inputs\r\n\r\n @Input() customMenuItems: MessageMenuItem[];\r\n @Input() showReplyAction = true;\r\n @Input() maxLength: number = 1500;\r\n @Input() permissions: ChatPermissions;\r\n @Input() mine = false;\r\n @Input() editing = false;\r\n @Input() genericAvatarUrl: string;\r\n @Input() readonly = false;\r\n\r\n //#endregion\r\n //#region Outputs\r\n\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n private _liked = new Subject<void>();\r\n private _unliked = new Subject<void>();\r\n private _shared = new Subject<ChatMessage>();\r\n\tprivate _userSelected = new Subject<void>();\r\n\tprivate _avatarSelected = new Subject<User>();\r\n\tprivate _usernameSelected = new Subject<User>();\r\n private _editStarted = new Subject<void>();\r\n private _deleted = new Subject<void>();\r\n private _editEnded = new Subject<void>();\r\n private _edited = new Subject<string>();\r\n private _loaded = new Subject<void>();\r\n private _pinned = new Subject<{ message: ChatMessage, options: PinOptions }>();\r\n private _unpinned = new Subject<ChatMessage>();\r\n\r\n @Output() readonly liked = this._liked.asObservable();\r\n @Output() readonly unliked = this._unliked.asObservable();\r\n @Output() readonly selected = this._selected.asObservable();\r\n @Output() readonly edited = this._edited.asObservable();\r\n @Output() readonly deleted = this._deleted.asObservable();\r\n @Output() readonly editStarted = this._editStarted.asObservable();\r\n @Output() readonly editEnded = this._editEnded.asObservable();\r\n @Output() readonly shared = this._shared.asObservable();\r\n\t@Output() readonly userSelected = this._userSelected.asObservable();\r\n @Output() readonly usernameSelected = this._usernameSelected.asObservable();\r\n\t@Output() readonly avatarSelected = this._avatarSelected.asObservable();\r\n @Output() readonly reported = this._reported.asObservable();\r\n @Output() readonly loaded = this._loaded.asObservable();\r\n @Output() readonly pinned = this._pinned.asObservable();\r\n @Output() readonly unpinned = this._unpinned.asObservable();\r\n\r\n //#endregion\r\n //#region UI Bindings\r\n\r\n @HostBinding('attr.data-comment-id') get commentId() { return this.message?.id; }\r\n @HostBinding('class.new') isNew = false;\r\n @HostBinding('class.highlighted') get isHighlighted() { return this.message?.transientState?.highlighted ?? false; }\r\n @HostBinding('class.visible') visible = false;\r\n\r\n get replyCount() { return this.message.submessages?.length || this.message.submessageCount || 0; }\r\n get element() { return this.elementRef.nativeElement; }\r\n @HostBinding('class.pinned')\r\n get isPinned() {\r\n return this.message.pinned && (!this.message.pinnedUntil || this.message.pinnedUntil > Date.now());\r\n }\r\n\r\n get pinFormValid() {\r\n if (!this.pinMode)\r\n return false;\r\n\r\n if (this.pinMode === 'until') {\r\n return !!this.pinUntilDate && !!this.pinUntilTime;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n avatarForUser(user : User) { return `url(${user?.avatarUrl ?? this.genericAvatarUrl})`; }\r\n\r\n //#endregion\r\n //#region Public Component API\r\n\r\n async waitForLoad() {\r\n await this.isLoaded ? Promise.resolve() : this.loaded.pipe(take(1)).toPromise();\r\n }\r\n\r\n //#endregion\r\n //#region Private API\r\n\r\n private setMessage(value: ChatMessage) {\r\n this._message = value;\r\n if (this._message.attachments?.length > 0) {\r\n this.isLoaded = false;\r\n } else {\r\n this.isLoaded = true;\r\n this._loaded.next();\r\n }\r\n }\r\n\r\n //#endregion\r\n //#region Actions\r\n\r\n markAttachmentsLoaded() { this.isLoaded = true; this._loaded.next(); }\r\n saveEdit() { this._edited.next(this.editedMessage); }\r\n endEditing() { this._editEnded.next(); }\r\n delete() { this._deleted.next(); }\r\n report() { this._reported.next(); }\r\n like() { this._liked.next(); }\r\n unlike() { this._unliked.next(); }\r\n share() { this._shared.next(this.message); }\r\n unpin() { this._unpinned.next(this.message); }\r\n select() { this._selected.next(); }\r\n\tselectUser() { this._userSelected.next(); }\r\n startEdit() { this._editStarted.next(); this.editedMessage = this.message.message; }\r\n selectUsername(user: User) { this._usernameSelected.next(user); this.selectUser(); }\r\n\tselectAvatar(user: User) { this._avatarSelected.next(user); this.selectUser(); }\r\n\r\n showPinForm() {\r\n this.pinFormVisible = true;\r\n this.pinUntilTime = '08:00';\r\n }\r\n\r\n submitPin() {\r\n let pinUntil: number;\r\n if (this.pinMode === 'until') {\r\n let date = new Date(this.pinUntilDate);\r\n let [hour, minute] = this.pinUntilTime.split(':');\r\n date.setHours(Number(hour));\r\n date.setMinutes(Number(minute));\r\n pinUntil = date.getTime();\r\n }\r\n\r\n this.pinFormVisible = false;\r\n this._pinned.next({\r\n message: this.message,\r\n options: {\r\n until: pinUntil\r\n }\r\n })\r\n }\r\n\r\n //#endregion\r\n}\r\n","\r\n<mat-menu #pointItemMenu=\"matMenu\">\r\n @if (permissions.canPin) {\r\n @if (isPinned) {\r\n <button mat-menu-item (click)=\"unpin()\">\r\n <mat-icon>push_pin</mat-icon>\r\n Unpin\r\n </button>\r\n } @else {\r\n <button mat-menu-item (click)=\"showPinForm()\">\r\n <mat-icon>push_pin</mat-icon>\r\n Pin\r\n </button>\r\n }\r\n <mat-divider />\r\n }\r\n <button mat-menu-item (click)=\"share()\">\r\n <mat-icon>share</mat-icon>\r\n Share\r\n </button>\r\n @if (!mine) {\r\n <button mat-menu-item (click)=\"report()\">\r\n <mat-icon>warning</mat-icon>\r\n Report\r\n </button>\r\n }\r\n @if (mine) {\r\n <button [disabled]=\"!permissions?.canEdit || readonly\" mat-menu-item (click)=\"startEdit()\">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n }\r\n @if (mine) {\r\n <button [disabled]=\"!permissions?.canDelete || readonly\" mat-menu-item (click)=\"delete()\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n }\r\n\r\n @for (menuItem of customMenuItems; track menuItem) {\r\n <button mat-menu-item (click)=\"menuItem.action(message)\">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n }\r\n\r\n</mat-menu>\r\n\r\n<div class=\"banta-message-content-container\">\r\n <div class=\"banta-user\">\r\n <div class=\"banta-user-1\">\r\n <a\r\n href=\"javascript:;\"\r\n class=\"banta-avatar\"\r\n (click)=\"selectAvatar(message.user)\"\r\n [style.background-image]=\"avatarForUser(message.user)\"></a>\r\n <div class=\"banta-user-identity\">\r\n <a href=\"javascript:;\" class=\"banta-display-name\" (click)=\"selectUser()\">{{message.user.displayName}}</a>\r\n <a href=\"javascript:;\" class=\"banta-username\" (click)=\"selectUsername(message.user)\">@{{message.user.username}}</a>\r\n </div>\r\n </div>\r\n <div class=\"banta-user-2\">\r\n @if (message.user.tag) {\r\n <span class=\"banta-user-tag\">{{message.user.tag}}</span>\r\n }\r\n <banta-timestamp [value]=\"message.sentAt\"></banta-timestamp>\r\n <span class=\"spacer\"></span>\r\n </div>\r\n <div class=\"spacer\"></div>\r\n </div>\r\n @if (!editing) {\r\n <div class=\"banta-content\">\r\n <span class=\"banta-message-content\" [innerHTML]=\"message.message | mentionLinker: message.mentionLinks | bantaMarkdownToHtml\"></span>\r\n <banta-attachments\r\n [attachments]=\"message.attachments\"\r\n (loaded)=\"markAttachmentsLoaded()\"\r\n ></banta-attachments>\r\n <ul class=\"message-facts\">\r\n @if (message.edits?.length > 0) {\r\n <li>(Edited)</li>\r\n }\r\n </ul>\r\n @if (pinFormVisible) {\r\n <div class=\"banta-pin-form\">\r\n <div class=\"banta-pin-form-header\">\r\n <div class=\"banta-pin-form-header-title\">\r\n Pin message?\r\n </div>\r\n <div class=\"spacer\"></div>\r\n <!-- <div class=\"banta-pin-form-auth-explanation\">\r\n <mat-icon>lock</mat-icon> Only available to authorized users.\r\n </div> -->\r\n <button mat-icon-button (click)=\"pinFormVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n <p>\r\n Pinning this message will cause it to appear at the top of the discussion for all users.\r\n </p>\r\n <mat-radio-group [(ngModel)]=\"pinMode\">\r\n <div>\r\n <mat-radio-button value=\"forever\">Pin indefinitely</mat-radio-button>\r\n </div>\r\n <div>\r\n <mat-radio-button value=\"until\">Pin until a specific time:</mat-radio-button>\r\n </div>\r\n <div class=\"banta-pin-form-until\" [class.banta-pin-form-until-disabled]=\"pinMode !== 'until'\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Date</mat-label>\r\n <input\r\n matInput\r\n [min]=\"today\"\r\n [matDatepicker]=\"datepicker\"\r\n [(ngModel)]=\"pinUntilDate\"\r\n [disabled]=\"pinMode !== 'until'\"\r\n />\r\n <mat-datepicker #datepicker/>\r\n <mat-datepicker-toggle [for]=\"datepicker\" matSuffix/>\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Time</mat-label>\r\n <input matInput\r\n type=\"time\"\r\n [(ngModel)]=\"pinUntilTime\"\r\n [ngModelOptions]=\"{updateOn: 'blur'}\"\r\n [disabled]=\"pinMode !== 'until'\"\r\n />\r\n <!-- <mat-timepicker #timepicker/>\r\n <mat-timepicker-toggle [for]=\"timepicker\" matSuffix/> -->\r\n </mat-form-field>\r\n </div>\r\n </mat-radio-group>\r\n <div class=\"banta-pin-form-actions\">\r\n <button mat-button (click)=\"pinFormVisible = false\">\r\n Cancel\r\n </button>\r\n <button mat-raised-button color=\"primary\" (click)=\"submitPin()\" [disabled]=\"!pinFormValid\">\r\n Pin\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (editing) {\r\n <div class=\"banta-content\" style=\"padding-bottom: 2em;\">\r\n <div>\r\n <mat-form-field floatLabel=\"always\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]=\"editedMessage\" [maxlength]=\"maxLength\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)=\"saveEdit()\">Save</button> \r\n <button mat-button (click)=\"endEditing()\">Cancel</button>\r\n </div>\r\n }\r\n\r\n\r\n <div class=\"banta-actions\">\r\n @if (isPinned) {\r\n <div class=\"pin-indicator\">\r\n <mat-icon>push_pin</mat-icon> Pinned\r\n @if (message.pinnedUntil) {\r\n until <time [attr.datetime]=\"message.pinnedUntil | date: 'full'\">{{ message.pinnedUntil | date: 'short' }}</time>\r\n }\r\n </div>\r\n }\r\n <div class=\"spacer\"></div>\r\n @if (showReplyAction) {\r\n <div class=\"banta-counted-action\">\r\n <button mat-button [matTooltip]=\"replyCount > 0 ? 'Replies' : 'Reply'\" matTooltipPosition=\"below\" (click)=\"select()\">\r\n <mat-icon>comment</mat-icon>\r\n <span class=\"banta-count-indicator\">\r\n {{replyCount > 0 ? 'Replies' : 'Reply'}}\r\n {{replyCount > 0 ? '(' + replyCount + ')' : ''}}\r\n </span>\r\n </button>\r\n </div>\r\n }\r\n <div class=\"banta-counted-action\" [class.active]=\"message.userState?.liked\">\r\n @if (message.transientState?.liking) {\r\n <button\r\n mat-icon-button\r\n [disabled]=\"true\"\r\n [matTooltip]=\"busy ? 'Please wait...' : message.userState?.liked ? 'Unlike' : 'Like'\"\r\n matTooltipPosition=\"below\"\r\n >\r\n <mat-spinner [diameter]=\"15\" style=\"margin-left: 1em;\"></mat-spinner>\r\n </button>\r\n }\r\n @if (!message.transientState?.liking) {\r\n <button\r\n mat-button\r\n [disabled]=\"readonly\"\r\n [matTooltip]=\"permissions?.canLike ? busy ? 'Please wait...' : 'Like' : permissions?.canLikeErrorMessage\"\r\n matTooltipPosition=\"below\"\r\n (click)=\"message.userState?.liked ? unlike() : like()\"\r\n >\r\n <mat-icon>thumb_up</mat-icon>\r\n @if (message.likes > 0) {\r\n <span class=\"banta-count-indicator\">\r\n {{message.likes}}\r\n </span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"pointItemMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n","import { Directive } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: `[bantaInlineReplies]`,\r\n standalone: false\r\n})\r\nexport class BantaInlineRepliesDirective {}\r\n","import { Component, Input, ViewChild, ElementRef, Output, HostBinding, ViewChildren, QueryList, TemplateRef, ContentChild } from \"@angular/core\";\r\nimport { User, ChatMessage, CommentsOrder, FilterMode } from '@banta/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\nimport { MessageMenuItem } from \"../../message-menu-item\";\r\nimport { CommentComponent } from \"../comment/comment.component\";\r\nimport { PinOptions } from \"../../chat-source\";\r\nimport { BantaInlineRepliesDirective } from \"../inline-replies.directive\";\r\n\r\nexport interface EditEvent {\r\n message: ChatMessage;\r\n newMessage: string;\r\n}\r\n\r\nconst DEFAULT_MAX_MESSAGES = 2000;\r\nconst DEFAULT_MAX_VISIBLE_MESSAGES = 200;\r\n\r\n@Component({\r\n selector: 'banta-comment-view',\r\n templateUrl: './comment-view.component.html',\r\n styleUrls: ['./comment-view.component.scss'],\r\n standalone: false\r\n})\r\nexport class CommentViewComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n }\r\n\r\n //#region Source\r\n\r\n private _source: ChatSourceBase;\r\n @Input() get source() { return this._source; }\r\n set source(value) { this.setSource(value); }\r\n\r\n //#endregion\r\n //#region Fields\r\n\r\n private _sourceSubs = new Subscription();\r\n menuMessage: ChatMessage = null;\r\n pinnedMessages: ChatMessage[] = [];\r\n messages: ChatMessage[] = [];\r\n currentUser: User;\r\n customSortEnabled = false;\r\n markSourceLoaded: () => void;\r\n sourceLoaded = new Promise<void>(r => this.markSourceLoaded = r);\r\n isViewingMore = false;\r\n isLoadingMore = false;\r\n hasMore = false;\r\n messageClicked = false;\r\n\r\n get previousMessages() { return this.newestLast ? this.olderMessages : this.newMessages; }\r\n get nextMessages() { return this.newestLast ? this.newMessages : this.olderMessages; }\r\n\r\n /**\r\n * While this is called \"new\" messages, it really represents the messages that would be visible *at the beginning\r\n * of the sort order*, which can be flipped by the newestLast feature (used for replies mode).\r\n *\r\n * So, when newestLast is false (top-level comments), regardless of the current sortOrder, newMessages are conceptually\r\n * *above* the visible set of messages.\r\n *\r\n * When newestLast is true (as in replies mode), regardless of the current sortOrder, newMessages are conceptually\r\n * *below* the visible set of messages.\r\n */\r\n newMessages: ChatMessage[] = [];\r\n\r\n /**\r\n * While this is called \"older\" messages, it really represents the messages that would be visible *at the end of the\r\n * sort order*, which can be flipped by the newestLast feature (useds for replies mode).\r\n *\r\n * So, when newestLast is false, regardless of the current sortOrder, olderMessages are conceptually *below*\r\n * the visible set of messages.\r\n *\r\n * When newestLast is true (as in replies mode), regardless of the current sortOrder, olderMessages are conceptually\r\n * *above* the visible set of messages.\r\n */\r\n olderMessages: ChatMessage[] = [];\r\n\r\n //#endregion\r\n //#region Inputs\r\n\r\n private _maxMessages: number;\r\n @Input()\r\n set maxMessages(value) { this._maxMessages = value; }\r\n get maxMessages() { return this._maxMessages ?? DEFAULT_MAX_MESSAGES; }\r\n\r\n private _maxVisibleMessages: number;\r\n @Input()\r\n set maxVisibleMessages(value) { this._maxVisibleMessages = value; }\r\n get maxVisibleMessages() { return this._maxVisibleMessages ?? DEFAULT_MAX_VISIBLE_MESSAGES; }\r\n\r\n @Input() collapsePins = false;\r\n @Input() newestLast = false;\r\n @Input() holdNewMessages = false;\r\n @Input() showEmptyState = true;\r\n @Input() emptyStateMessage = 'Be the first to comment!';\r\n @Input() allowReplies = true;\r\n @Input() enableHoldOnClick = false;\r\n @Input() enableHoldOnScroll = true;\r\n @Input() customMenuItems: MessageMenuItem[] = [];\r\n @Input() @HostBinding('class.fixed-height') fixedHeight: boolean;\r\n @Input() selectedMessage: ChatMessage;\r\n @Input() genericAvatarUrl: string;\r\n\r\n @ContentChild(BantaInlineRepliesDirective, { read: TemplateRef })\r\n inlineRepliesTemplate: TemplateRef<any>;\r\n\r\n //#endregion\r\n //#region Outputs\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _liked = new Subject<ChatMessage>();\r\n private _unliked = new Subject<ChatMessage>();\r\n private _pinned = new Subject<{ message: ChatMessage, options: PinOptions }>();\r\n private _unpinned = new Subject<ChatMessage>();\r\n private _reported = new Subject<ChatMessage>();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _usernameSelected = new Subject<User>();\r\n private _avatarSelected = new Subject<User>();\r\n private _shared = new Subject<ChatMessage>();\r\n private _deleted = new Subject<ChatMessage>();\r\n private _messageEdited = new Subject<EditEvent>();\r\n private _sortOrderChanged = new Subject<CommentsOrder>();\r\n private _filterModeChanged = new Subject<FilterMode>();\r\n\r\n @Output() readonly userSelected = this._userSelected.asObservable();\r\n @Output() readonly reported = this._reported.asObservable();\r\n @Output() readonly liked = this._liked.asObservable();\r\n @Output() readonly unliked = this._unliked.asObservable();\r\n @Output() readonly pinned = this._pinned.asObservable();\r\n @Output() readonly unpinned = this._unpinned.asObservable();\r\n @Output() readonly usernameSelected = this._usernameSelected.asObservable();\r\n @Output() readonly avatarSelected = this._avatarSelected.asObservable();\r\n @Output() readonly shared = this._shared.asObservable();\r\n @Output() readonly deleted = this._deleted.asObservable();\r\n @Output() readonly selected = this._selected.asObservable();\r\n @Output() readonly messageEdited = this._messageEdited.asObservable();\r\n @Output() readonly sortOrderChanged = this._sortOrderChanged.asObservable();\r\n @Output() readonly filterModeChanged = this._filterModeChanged.asObservable();\r\n\r\n //#endregion\r\n //#region UI Bindings\r\n\r\n @ViewChildren(CommentComponent) commentsQuery: QueryList<CommentComponent>;\r\n @ViewChild('messageContainer') messageContainer: ElementRef<HTMLElement>;\r\n get comments() { return Array.from(this.commentsQuery); }\r\n\r\n //#endregion\r\n\r\n /**\r\n * Returns true if this message can be found within one of the message buffers (older, current, newer)\r\n * @param message\r\n */\r\n isMessageLoadedInContext(message: ChatMessage) {\r\n return this.olderMessages.find(x => x.id === message.id)\r\n || this.messages.find(x => x.id === message.id)\r\n || this.newMessages.find(x => x.id === message.id);\r\n }\r\n\r\n async loadMessageInContext(message: ChatMessage) {\r\n await this.sourceLoaded;\r\n\r\n console.log(`Loading message ${message.id} in context...`);\r\n while (this.hasMore && !this.isMessageLoadedInContext(message)) {\r\n console.log(`...Need to load more comments to find ${message.id}`);\r\n await this.showMore();\r\n }\r\n\r\n if (!this.isMessageLoadedInContext(message)) {\r\n console.error(`Error while loading message in context: Failed to find message ${message.id}, maybe it was deleted!`);\r\n return false;\r\n }\r\n\r\n let items = [].concat(this.olderMessages, this.messages, this.newMessages);\r\n let index = items.findIndex(x => x.id === message.id);\r\n\r\n if (index < 0) {\r\n console.error(`Error while loading message in context: Message was not present in message list!`);\r\n return false;\r\n }\r\n\r\n let startIndex = Math.max(0, index - this.maxVisibleMessages / 2);\r\n this.newMessages = items.splice(0, startIndex);\r\n this.messages = items.splice(0, this.maxVisibleMessages);\r\n this.olderMessages = items;\r\n this.isViewingMore = true;\r\n }\r\n\r\n get shouldShowNewMessageIndicator() {\r\n return this.isViewingMore\r\n || this.customSortEnabled\r\n || this.sourceFilterMode !== FilterMode.ALL\r\n || this.heldMessages.length > 0;\r\n }\r\n\r\n get shouldHoldNewMessages() {\r\n if (this.customSortEnabled)\r\n return true;\r\n if (this.holdNewMessages || this.isViewingMore) {\r\n console.log(`holding due to settings`);\r\n return true;\r\n }\r\n\r\n if (this.enableHoldOnClick && this.messageClicked)\r\n return true;\r\n\r\n if (this.enableHoldOnScroll) {\r\n let keyMessage: ChatMessage;\r\n\r\n if (this.newestLast)\r\n keyMessage = this.messages[this.messages.length - 1];\r\n else\r\n keyMessage = this.messages[0];\r\n\r\n if (keyMessage) {\r\n const messageElement = this.getElementForComment(keyMessage.id);\r\n if (messageElement) {\r\n if (!this.isElementVisible(messageElement)) {\r\n console.log(`key element is not visible`);\r\n return true;\r\n } else {\r\n console.log(`key element is visible`);\r\n }\r\n } else {\r\n console.log(`could not find key element`);\r\n }\r\n } else {\r\n console.log(`could not find key message`);\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private isElementVisible(element: Element) {\r\n const elementRect = element.getBoundingClientRect();\r\n return !!elementRect\r\n && elementRect.bottom >= 0\r\n && elementRect.right >= 0\r\n && elementRect.left <= document.documentElement.clientWidth\r\n && elementRect.top <= document.documentElement.clientHeight;\r\n }\r\n\r\n /**\r\n * Get the CommentComponent instantiated for the given ChatMessage,\r\n * if it exists in the current view. Note that messages which are not\r\n * currently shown to the user will not return a CommentComponent.\r\n * @param message\r\n * @returns\r\n */\r\n getCommentComponentForMessage(message: ChatMessage) {\r\n if (!message)\r\n throw new Error(`You must pass a valid ChatMessage`);\r\n return this.comments.find(x => x.message?.id === message.id);\r\n }\r\n\r\n saveEdit(message: ChatMessage, newMessage: string) {\r\n this._messageEdited.next({ message, newMessage });\r\n }\r\n\r\n likeMessage(message: ChatMessage) {\r\n this._liked.next(message);\r\n }\r\n\r\n unlikeMessage(message: ChatMessage) {\r\n this._unliked.next(message);\r\n }\r\n\r\n pinMessage(message: ChatMessage, options: PinOptions) {\r\n this._pinned.next({ message, options });\r\n }\r\n\r\n unpinMessage(message: ChatMessage) {\r\n this._unpinned.next(message);\r\n }\r\n\r\n reportMessage(message: ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n selectMessage(message: ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectMessageUser(message: ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n }\r\n\r\n selectAvatar(user: User) {\r\n this._avatarSelected.next(user);\r\n }\r\n\r\n sharedMessage(message: ChatMessage) {\r\n this._shared.next(message);\r\n }\r\n\r\n startEditing(message: ChatMessage) {\r\n this.messages.forEach(m => m.transientState.editing = false);\r\n message.transientState.editing = true;\r\n }\r\n\r\n deleteMessage(message: ChatMessage) {\r\n this._deleted.next(message);\r\n }\r\n\r\n private setSource(value: ChatSourceBase) {\r\n this.customSortEnabled = (value?.sortOrder ?? CommentsOrder.NEWEST) !== CommentsOrder.NEWEST;\r\n this.newMessages = [];\r\n this.olderMessages = [];\r\n this.heldMessages = [];\r\n\r\n (window as any).bantaSourceDebug = value;\r\n\r\n if (this._sourceSubs) {\r\n this._sourceSubs.unsubscribe();\r\n this._sourceSubs = null;\r\n }\r\n this._source = value;\r\n\r\n if (value) {\r\n const messages = (value.messages || []).slice();\r\n this.messages = messages;\r\n this.olderMessages = messages.splice(this.maxVisibleMessages, messages.length);\r\n this.hasMore = true; //this.olderMessages.length > 0;\r\n\r\n this._sourceSubs = new Subscription();\r\n this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));\r\n this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));\r\n this._sourceSubs.add(this._source.messageUpdated.subscribe(msg => this.messageUpdated(msg)));\r\n\r\n this._sourceSubs.add(\r\n this.backend.userChanged.subscribe(user => this.currentUser = user)\r\n );\r\n\r\n this.getInitialMessages();\r\n }\r\n }\r\n\r\n private async getInitialMessages() {\r\n\r\n // Get the pinned messages\r\n let pinnedMessages = await this._source.getPinnedMessages();\r\n pinnedMessages.forEach(m => m.transientState ??= {});\r\n this.pinnedMessages = pinnedMessages;\r\n\r\n\r\n let messages = await this._source.getExistingMessages();\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = this.newestLast ? messages.slice().reverse() : messages;\r\n\r\n if (this.messages.length > this.maxVisibleMessages) {\r\n if (this.newestLast) {\r\n this.previousMessages.push(...this.messages.splice(0, this.messages.length - this.maxVisibleMessages));\r\n } else {\r\n this.nextMessages.unshift(...this.messages.splice(this.maxVisibleMessages, this.messages.length));\r\n }\r\n }\r\n\r\n this.debugMessages();\r\n this.sortMessages();\r\n if (this.markSourceLoaded)\r\n this.markSourceLoaded();\r\n }\r\n\r\n debugMessages() {\r\n if (!this.showDebug)\r\n return;\r\n\r\n // console.log([\r\n // ...this.previousMessages.map(x => x.message),\r\n // '[[',\r\n // ...this.messages.map(x => x.message),\r\n // ']]',\r\n // ...this.nextMessages.map(x => x.message)\r\n // ].map(x => /\\d+/.test(x) ? this.zeroPad(x, 2) : x).join(\" \"));\r\n }\r\n\r\n zeroPad(number: number | string, count: number = 2) {\r\n let str: string;\r\n\r\n if (typeof number === 'number')\r\n str = String(number);\r\n else\r\n str = number;\r\n\r\n while (str.length < count)\r\n str = '0' + str;\r\n\r\n return str;\r\n }\r\n leftPad(str: string, count: number = 2) {\r\n while (str.length < count)\r\n str = ' ' + str;\r\n\r\n return str;\r\n }\r\n\r\n messageIdentity(index: number, chatMessage: ChatMessage) {\r\n return chatMessage.id;\r\n }\r\n\r\n get sourceSortOrder() {\r\n return this.source?.sortOrder ?? CommentsOrder.NEWEST;\r\n }\r\n\r\n get sourceFilterMode() {\r\n return this.source?.filterMode ?? FilterMode.ALL;\r\n }\r\n\r\n /**\r\n * Show the newest content.\r\n * - If an unnatural sort order is active (ie Oldest or Likes), it will be changed to Newest.\r\n * - The new content will be placed where new content goes based on newestLast (replies mode), so if it is true, the content is\r\n * placed at the end, otherwise it is placed at the beginning.\r\n *\r\n * @param event\r\n * @returns\r\n */\r\n async showNewest(event: MouseEvent) {\r\n\r\n // Regardless of how we handle this, clear out our held messages\r\n\r\n this.heldMessages = [];\r\n this.messageClicked = false;\r\n\r\n // If the sort order is not already Newest, switch to Newest and stop.\r\n // The act of changing the sort order will cause the newest content to be loaded.\r\n\r\n let naturalOrder = CommentsOrder.NEWEST;\r\n if (this.sourceSortOrder !== naturalOrder || this.sourceFilterMode !== FilterMode.ALL) {\r\n if (this.sourceSortOrder !== naturalOrder)\r\n this._sortOrderChanged.next(naturalOrder);\r\n if (this.sourceFilterMode !== FilterMode.ALL)\r\n this._filterModeChanged.next(FilterMode.ALL);\r\n return;\r\n }\r\n\r\n // On this path, we are already on Newest, but there is newer content available (such as when new content is\r\n // being buffered due to user engagement on a comment)\r\n\r\n this.isViewingMore = false;\r\n\r\n // Move all newerMessages into messages, respecting the newestLast direction (normal or replies mode)\r\n\r\n if (this.newestLast)\r\n this.messages = this.messages.concat(this.newMessages.splice(0, this.newMessages.length));\r\n else\r\n this.messages = this.newMessages.splice(0, this.newMessages.length).concat(this.messages);\r\n\r\n let overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);\r\n this.olderMessages = overflow.concat(this.olderMessages);\r\n this.olderMessages.splice(this.maxMessages - this.maxVisibleMessages, this.olderMessages.length);\r\n this.hasMore = this.olderMessages.length > 0;\r\n\r\n // Scroll to the newest comment.\r\n\r\n if (this.messages.length > 0) {\r\n if (this.newestLast) {\r\n this.scrollToComment(this.messages[this.messages.length - 1].id);\r\n } else {\r\n this.scrollToComment(this.messages[0].id);\r\n }\r\n }\r\n }\r\n\r\n get showDebug() {\r\n if (typeof window === 'undefined')\r\n return false;\r\n\r\n return localStorage['banta:debug'] === '1';\r\n }\r\n\r\n get shouldShowNext() {\r\n if (!this.newestLast) {\r\n return this.hasMore || this.nextMessages.length > 0;\r\n }\r\n\r\n return this.nextMessages.length > 0;\r\n }\r\n\r\n get shouldShowPrevious() {\r\n if (this.newestLast) {\r\n return this.hasMore || this.previousMessages.length > 0;\r\n }\r\n\r\n return this.previousMessages.length > 0;\r\n }\r\n\r\n get pageSize() {\r\n return Math.min(20, this.maxVisibleMessages || 20);\r\n }\r\n\r\n async showPrevious() {\r\n this.isViewingMore = true;\r\n let nextPageSize = this.pageSize;\r\n this.isLoadingMore = false;\r\n\r\n if (isNaN(nextPageSize))\r\n throw new Error(`Not safe to load more with NaN page size`);\r\n\r\n if (this.previousMessages.length > 0) {\r\n const storedMessages = this.previousMessages.splice(Math.max(0, this.previousMessages.length - nextPageSize), nextPageSize);\r\n this.messages = [...storedMessages, ...this.messages];\r\n nextPageSize -= storedMessages.length;\r\n }\r\n\r\n\r\n // Load more from backend if needed\r\n // Note: Backend only supports fetching more content in one direction.\r\n\r\n let lastMessage = this.previousMessages[0] ?? this.messages[0];\r\n\r\n if (nextPageSize > 0 && this.newestLast && lastMessage) {\r\n this.isLoadingMore = true;\r\n\r\n let messages = await this.source.loadAfter(lastMessage, nextPageSize);\r\n\r\n messages = messages.slice().reverse(); // because newestLast === true\r\n messages.forEach(m => m.transientState ??= {});\r\n\r\n // In replies mode (newestLast), we want to put these new messages onto the *top* of the set of visible messages.\r\n // Otherwise we want to put them on the *bottom*.\r\n\r\n this.messages = [...messages, ...this.messages];\r\n\r\n // If we didn't receive any messages at all, there's no more to fetch.\r\n\r\n if (messages.length === 0)\r\n this.hasMore = false;\r\n\r\n this.isLoadingMore = false;\r\n }\r\n\r\n // Extract the messages that do not fit in the maxVisibleMessages buffer.\r\n\r\n if (this.messages.length > this.maxVisibleMessages) {\r\n let overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);\r\n this.nextMessages.unshift(...overflow);\r\n if (this.nextMessages.length > this.maxMessages)\r\n this.nextMessages.splice(this.maxMessages, this.nextMessages.length);\r\n }\r\n\r\n this.debugMessages();\r\n }\r\n\r\n get sortNextLabel() {\r\n if (this.sourceSortOrder === 'newest') {\r\n return 'Older';\r\n } else if (this.sourceSortOrder === 'oldest') {\r\n return 'Newer';\r\n } else if (this.sourceSortOrder === 'likes') {\r\n return 'Less Likes';\r\n }\r\n\r\n return 'More';\r\n }\r\n\r\n get sortPreviousLabel() {\r\n if (this.sourceSortOrder === 'newest') {\r\n return 'Newer';\r\n } else if (this.sourceSortOrder === 'oldest') {\r\n return 'Older';\r\n } else if (this.sourceSortOrder === 'likes') {\r\n return 'More Likes';\r\n }\r\n\r\n return 'More';\r\n }\r\n\r\n get nextLabel() { return this.newestLast ? this.sortPreviousLabel : this.sortNextLabel; }\r\n get previousLabel() { return this.newestLast ? this.sortNextLabel : this.sortPreviousLabel; }\r\n\r\n /**\r\n * Show more content\r\n * - When in replies mode (newestLast), the content is added at the top\r\n * - When in normal mode, the content is added at the bottom\r\n * - The current sort order does *not* factor in here, which is why it is showMore() not showEarlier().\r\n *\r\n * @returns\r\n */\r\n async showNext() {\r\n this.isViewingMore = true;\r\n\r\n let nextPageSize = this.pageSize;\r\n\r\n if (isNaN(nextPageSize))\r\n throw new Error(`Not safe to load more with NaN page size`);\r\n\r\n this.isLoadingMore = false;\r\n\r\n if (this.nextMessages.length > 0) {\r\n const storedMessages = this.nextMessages.splice(0, nextPageSize);\r\n this.messages = [ ...this.messages, ...storedMessages ];\r\n nextPageSize -= storedMessages.length;\r\n }\r\n\r\n const lastMessage = this.olderMessages[this.olderMessages.length - 1] ?? this.messages[this.messages.length - 1];\r\n\r\n if (nextPageSize > 0 && !this.newestLast && lastMessage) {\r\n // Load more from backend\r\n\r\n this.isLoadingMore = true;\r\n\r\n let messages = await this.source.loadAfter(lastMessage, nextPageSize);\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = [ ...this.messages, ...messages ];\r\n\r\n // If we didn't receive any messages at all, there's no more to fetch.\r\n\r\n if (messages.length === 0)\r\n this.hasMore = false;\r\n\r\n this.isLoadingMore = false;\r\n }\r\n\r\n // Extract the messages that do not fit in the maxVisibleMessages buffer.\r\n\r\n\r\n if (this.messages.length > this.maxVisibleMessages) {\r\n let overflow = this.messages.splice(0, this.messages.length - this.maxVisibleMessages);\r\n\r\n // Regardless of the order (newestLast), newMessages represents the direction that is being pushed, since it's definition\r\n // depends on that order. Move overflowing messages into newMessages.\r\n\r\n this.previousMessages.push(...overflow);\r\n if (this.previousMessages.length > this.maxMessages)\r\n this.previousMessages.splice(0, this.previousMessages.length - this.maxMessages);\r\n }\r\n\r\n this.debugMessages();\r\n }\r\n\r\n /**\r\n * Show more content\r\n * - When in replies mode (newestLast), the content is added at the top\r\n * - When in normal mode, the content is added at the bottom\r\n * - The current sort order does *not* factor in here, which is why it is showMore() not showEarlier().\r\n *\r\n * @returns\r\n */\r\n async showMore() {\r\n this.isViewingMore = true;\r\n\r\n let nextPageSize = this.pageSize;\r\n\r\n if (isNaN(nextPageSize))\r\n throw new Error(`Not safe to load more with NaN page size`);\r\n\r\n this.isLoadingMore = false;\r\n\r\n if (this.olderMessages.length > 0) {\r\n const storedMessages = this.olderMessages.splice(0, nextPageSize);\r\n this.messages = this.messages.concat(storedMessages);\r\n nextPageSize -= storedMessages.length;\r\n this.hasMore = this.olderMessages.length > 0;\r\n }\r\n\r\n let lastMessage: ChatMessage;\r\n\r\n if (this.newestLast) {\r\n lastMessage = this.olderMessages[0] ?? this.messages[0];\r\n } else {\r\n lastMessage = this.olderMessages[this.olderMessages.length - 1] ?? this.messages[this.messages.length - 1];\r\n }\r\n\r\n if (nextPageSize > 0 && lastMessage) {\r\n // Load more from backend\r\n\r\n this.isLoadingMore = true;\r\n\r\n\r\n if (!lastMessage) {\r\n this.isLoadingMore = false;\r\n this.hasMore = false;\r\n return;\r\n }\r\n\r\n let messages = await this.source.loadAfter(lastMessage, nextPageSize);\r\n\r\n if (this.newestLast)\r\n messages = messages.slice().reverse();\r\n\r\n messages.forEach(m => m.transientState ??= {});\r\n\r\n // In replies mode (newestLast), we want to put these new messages onto the *top* of the set of visible messages.\r\n // Otherwise we want to put them on the *bottom*.\r\n\r\n if (this.newestLast) {\r\n this.messages = messages.concat(this.messages);\r\n } else {\r\n this.messages = this.messages.concat(messages);\r\n }\r\n\r\n // If we didn't receive any messages at all, there's no more to fetch.\r\n\r\n if (messages.length === 0) {\r\n this.hasMore = false;\r\n }\r\n\r\n this.isLoadingMore = false;\r\n }\r\n\r\n // Extract the messages that do not fit in the maxVisibleMessages buffer.\r\n\r\n if (this.messages.length > this.maxVisibleMessages) {\r\n let overflow: ChatMessage[] = [];\r\n\r\n // Move overflowing messages into newMessages.\r\n // Regardless of the order (newestLast), newMessages represents the direction that is being loaded,\r\n // since it's definition depends on that order.\r\n\r\n if (this.newestLast) {\r\n overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);\r\n this.newMessages = overflow.concat(this.newMessages);\r\n this.newMessages.splice(this.maxMessages - this.maxVisibleMessages, this.newMessages.length);\r\n } else {\r\n overflow = this.messages.splice(0, this.messages.length - this.maxVisibleMessages);\r\n this.newMessages.push(...overflow);\r\n if (this.newMessages.length > this.maxMessages - this.maxVisibleMessages)\r\n this.newMessages.splice(0, this.newMessages.length - (this.maxMessages - this.maxVisibleMessages));\r\n }\r\n\r\n }\r\n }\r\n\r\n heldMessages: ChatMessage[] = [];\r\n\r\n private addMessage(message: ChatMessage) {\r\n\r\n if (!message.transientState)\r\n message.transientState ??= {};\r\n\r\n let destination = this.messages;\r\n let bucket = this.olderMessages;\r\n let newestLast = this.newestLast;\r\n\r\n if (this.shouldHoldNewMessages) {\r\n this.heldMessages.push(message);\r\n destination = this.newMessages;\r\n bucket = null;\r\n }\r\n\r\n // If we aren't on the newest sort order, new messages shouldn't be added at all\r\n if (this.sourceSortOrder !== CommentsOrder.NEWEST)\r\n return;\r\n\r\n\r\n if (newestLast) {\r\n destination.push(message);\r\n\r\n if (this.maxVisibleMessages > 0) {\r\n let overflow = destination.splice(this.maxVisibleMessages, destination.length);\r\n bucket?.push(...overflow);\r\n }\r\n } else {\r\n destination.unshift(message);\r\n\r\n if (this.maxVisibleMessages > 0) {\r\n let overflow = destination.splice(this.maxVisibleMessages, destination.length);\r\n bucket?.unshift(...overflow);\r\n }\r\n }\r\n\r\n if (bucket?.length > 0)\r\n this.hasMore = true;\r\n\r\n message.pagingCursor = String(this.incrementPagingCursors());\r\n this.sortMessages();\r\n }\r\n\r\n private incrementPagingCursors() {\r\n if (this.source.sortOrder !== CommentsOrder.NEWEST)\r\n return;\r\n\r\n let maxPagingCursor = 0;\r\n for (let group of [this.messages, this.olderMessages, this.newMessages]) {\r\n for (let message of group) {\r\n if (message.pagingCursor) {\r\n let pagingCursor = Number(message.pagingCursor) + 1;\r\n if (pagingCursor > maxPagingCursor)\r\n maxPagingCursor = pagingCursor;\r\n message.pagingCursor = String(pagingCursor);\r\n }\r\n }\r\n }\r\n\r\n return maxPagingCursor;\r\n }\r\n\r\n /**\r\n * Wait for all currently visible comments to be fully loaded, including all attachments.\r\n * Doing this will prevent layout shift when scrolling to a specific comment.\r\n */\r\n async waitForAllCommentsToLoad() {\r\n await new Promise(r => setTimeout(r, 100));\r\n await this.sourceLoaded;\r\n await Promise.all(this.comments.map(x => x.waitForLoad()));\r\n }\r\n\r\n private sortMessages() {\r\n if (!this.source)\r\n return;\r\n\r\n let sorter: (a: ChatMessage, b: ChatMessage) => number;\r\n\r\n if (this.source.sortOrder === CommentsOrder.LIKES)\r\n sorter = (a, b) => b.likes - a.likes;\r\n else if (this.source.sortOrder === CommentsOrder.NEWEST)\r\n sorter = (a, b) => (b.sentAt - a.sentAt) * (this.newestLast ? -1 : 1);\r\n else if (this.source.sortOrder === CommentsOrder.OLDEST)\r\n sorter = (a, b) => (a.sentAt - b.sentAt) * (this.newestLast ? -1 : 1);\r\n\r\n this.messages.sort(sorter);\r\n this.olderMessages.sort(sorter);\r\n this.newMessages.sort(sorter);\r\n }\r\n\r\n private messageReceived(message: ChatMessage) {\r\n this.addMessage(message);\r\n }\r\n\r\n isScrolledToLatest() {\r\n if (!this.messageContainer)\r\n return false;\r\n\r\n const el = this.messageContainer.nativeElement;\r\n const currentScroll = el.scrollTop;\r\n const currentTotal = el.scrollHeight - el.offsetHeight;\r\n\r\n return currentScroll > currentTotal - 10;\r\n }\r\n\r\n private messageSent(message: ChatMessage) {\r\n this.addMessage(message);\r\n\r\n if (!this.messageContainer)\r\n return;\r\n\r\n this.scrollToLatest();\r\n }\r\n\r\n private isPinned(message: ChatMessage) {\r\n return message.pinned && (!message.pinnedUntil || message.pinnedUntil > Date.now());\r\n }\r\n\r\n private messageUpdated(message: ChatMessage) {\r\n let pinned = this.isPinned(message);\r\n let inPins = this.pinnedMessages.some(x => x.id === message.id);\r\n\r\n if (pinned && !inPins) {\r\n this.pinnedMessages.unshift(message);\r\n let index = this.messages.indexOf(message);\r\n if (index >= 0) {\r\n this.messages.splice(index, 1);\r\n }\r\n } else if (!pinned && inPins) {\r\n this.messages.push(message);\r\n let index = this.pinnedMessages.indexOf(message);\r\n if (index >= 0) {\r\n this.pinnedMessages.splice(index, 1);\r\n }\r\n\r\n this.sortMessages();\r\n }\r\n }\r\n\r\n scrollToLatest() {\r\n if (!this.messageContainer) {\r\n return;\r\n }\r\n\r\n const el = this.messageContainer.nativeElement;\r\n\r\n el.scrollIntoView({ block: 'start' });\r\n //el.scrollTop = el.scrollHeight;\r\n }\r\n\r\n get element() {\r\n return this.elementRef.nativeElement;\r\n }\r\n\r\n async scrollToComment(commentId: ChatMessage['id']) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n await this.waitForAllCommentsToLoad();\r\n\r\n const comment = this.getElementForComment(commentId);\r\n if (comment) {\r\n comment.scrollIntoView({\r\n inline: 'center',\r\n block: 'center'\r\n });\r\n }\r\n }\r\n\r\n getElementForComment(commentId: string) {\r\n return this.element.querySelector(`[data-comment-id=\"${commentId}\"]`);\r\n }\r\n\r\n mentionsMe(message: ChatMessage) {\r\n if (!this.currentUser)\r\n return false;\r\n\r\n if (message.message.includes(`@${this.currentUser.username}`))\r\n return true;\r\n\r\n return false;\r\n }\r\n}\r\n","<div class=\"banta-message-container\" #messageContainer>\r\n <ng-content select=\"[data-before]\"></ng-content>\r\n\r\n @if (!collapsePins) {\r\n @for (message of pinnedMessages; track message.id) {\r\n @if (!message.hidden) {\r\n <banta-comment\r\n class=\"abbreviated\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [message]=\"message\"\r\n [mine]=\"currentUser?.id === message.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"allowReplies\"\r\n [editing]=\"message.transientState.editing\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (click)=\"messageClicked = true\"\r\n (editStarted)=\"startEditing(message)\"\r\n (deleted)=\"deleteMessage(message)\"\r\n (editEnded)=\"message.transientState.editing = false\"\r\n (edited)=\"saveEdit(message, $event)\"\r\n (userSelected)=\"selectMessageUser(message)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(message)\"\r\n (pinned)=\"pinMessage(message, $event.options)\"\r\n (unpinned)=\"unpinMessage(message)\"\r\n (unliked)=\"unlikeMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (selected)=\"selectMessage(message)\"\r\n (shared)=\"sharedMessage($event)\"\r\n />\r\n @if (selectedMessage === message) {\r\n <div class=\"banta-inline-replies-container\">\r\n <ng-container *ngTemplateOutlet=\"inlineRepliesTemplate\" />\r\n </div>\r\n }\r\n }\r\n }\r\n }\r\n\r\n <div class=\"banta-top-sticky\">\r\n @if (!newestLast) {\r\n <button\r\n mat-button\r\n class=\"banta-nav\"\r\n [class.visible]=\"shouldShowNewMessageIndicator\"\r\n href=\"javascript:;\"\r\n (click)=\"showNewest($event)\"\r\n >\r\n <mat-icon>file_upload</mat-icon>\r\n Newest\r\n @if (heldMessages.length > 0) {\r\n <span class=\"count\">{{ heldMessages.length | number }}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n <button mat-button class=\"pager\" (click)=\"showPrevious()\" [class.visible]=\"shouldShowPrevious\" [disabled]=\"isLoadingMore\">\r\n <mat-icon>expand_less</mat-icon>\r\n {{ previousLabel }}\r\n </button>\r\n\r\n @for (message of messages; track message.id) {\r\n @if (!message.hidden) {\r\n <banta-comment\r\n class=\"abbreviated\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [message]=\"message\"\r\n [mine]=\"currentUser?.id === message.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"allowReplies\"\r\n [editing]=\"message.transientState.editing\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (click)=\"messageClicked = true\"\r\n (editStarted)=\"startEditing(message)\"\r\n (deleted)=\"deleteMessage(message)\"\r\n (editEnded)=\"message.transientState.editing = false\"\r\n (edited)=\"saveEdit(message, $event)\"\r\n (userSelected)=\"selectMessageUser(message)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(message)\"\r\n (pinned)=\"pinMessage(message, $event.options)\"\r\n (unpinned)=\"unpinMessage(message)\"\r\n (unliked)=\"unlikeMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (selected)=\"selectMessage(message)\"\r\n (shared)=\"sharedMessage($event)\"\r\n />\r\n @if (selectedMessage === message) {\r\n <div class=\"banta-inline-replies-container\">\r\n <ng-container *ngTemplateOutlet=\"inlineRepliesTemplate\" />\r\n </div>\r\n }\r\n }\r\n } @empty {\r\n @if (showEmptyState) {\r\n <div class=\"banta-empty-state\">\r\n {{ emptyStateMessage }}\r\n </div>\r\n }\r\n }\r\n\r\n <button mat-button class=\"pager\" (click)=\"showNext()\" [class.visible]=\"shouldShowNext\" [disabled]=\"isLoadingMore\">\r\n <mat-icon>expand_more</mat-icon>\r\n {{ nextLabel }}\r\n </button>\r\n\r\n <div class=\"banta-nav-point banta-bottom-sticky\">\r\n @if (newestLast) {\r\n <button\r\n [matBadge]=\"10\" matBadgeOverlap=\"false\"\r\n matBadgePosition=\"after\" matBadgeSize=\"large\"\r\n mat-button\r\n class=\"banta-nav\"\r\n [class.visible]=\"shouldShowNewMessageIndicator\"\r\n href=\"javascript:;\"\r\n (click)=\"showNewest($event)\"\r\n >\r\n <mat-icon>file_download</mat-icon>\r\n Newest\r\n @if (heldMessages.length > 0) {\r\n <span class=\"count\">{{ heldMessages.length | number }}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (isLoadingMore) {\r\n <div class=\"banta-loading-more\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n }\r\n\r\n @if (showDebug) {\r\n <div style=\"color: #666\">\r\n ({{ previousMessages.length }} .. {{ messages.length }} .. {{ nextMessages.length }})\r\n\r\n dir={{newestLast ? '-1' : '1'}}\r\n v={{maxVisibleMessages}}, M={{maxMessages}}\r\n </div>\r\n }\r\n\r\n <ng-content select=\":not([data-before]):not(.inline-replies)\"></ng-content>\r\n </div>\r\n","import { Directive } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: `[bantaReplySendOptions]`,\r\n standalone: false\r\n})\r\nexport class BantaReplySendOptionsDirective {}","import { Component, ElementRef, Input, Output, ViewChild } from '@angular/core';\r\nimport { CDNProvider, ChatMessageAttachment } from '@banta/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-attachment-button',\r\n templateUrl: './attachment-button.component.html',\r\n styleUrls: ['./attachment-button.component.scss'],\r\n standalone: false\r\n})\r\nexport class AttachmentButtonComponent {\r\n constructor(\r\n private cdnProvider: CDNProvider,\r\n ) {\r\n }\r\n\r\n //#region Properties\r\n\r\n private _addedAttachment = new Subject<ChatMessageAttachment>();\r\n private _attachmentError = new Subject<ChatMessageAttachment>();\r\n\r\n //#endregion\r\n //#region Inputs\r\n\r\n @Input() disabled = false;\r\n\r\n //#endregion\r\n //#region Outputs\r\n\r\n @Output() get addedAttachment() { return this._addedAttachment.asObservable(); }\r\n @Output() get attachmentError() { return this._attachmentError.asObservable(); }\r\n\r\n //#endregion\r\n //#region UI Bindings\r\n\r\n @ViewChild('fileUpload', { static: false }) fileInput: ElementRef<HTMLInputElement>;\r\n\r\n //#endregion\r\n\r\n show() { this.fileInput.nativeElement.click(); }\r\n\r\n async fileChange(event: Event): Promise<void> {\r\n const element = (event.currentTarget as HTMLInputElement);\r\n if (element.files.length) {\r\n const file = element.files[0];\r\n let publicURL: string;\r\n\r\n let attachment: ChatMessageAttachment = {\r\n type: file.type,\r\n url: undefined,\r\n transientState: {\r\n uploading: true,\r\n error: false,\r\n errorMessage: undefined\r\n }\r\n }\r\n\r\n this._addedAttachment.next(attachment);\r\n\r\n try {\r\n publicURL = await this.cdnProvider.uploadImage(file);\r\n } catch (e) {\r\n attachment.transientState.error = true;\r\n attachment.transientState.errorMessage = \"Failed to upload\";\r\n\r\n console.error(`[Banta] Caught an error while uploading image to CDN:`);\r\n console.error(e);\r\n alert(e.message);\r\n\r\n this._attachmentError.next(attachment);\r\n return;\r\n }\r\n\r\n // If no URL was returned, then an error must have occurred. Presumably the CDN\r\n // provider has conveyed an error to the user.\r\n if (!publicURL)\r\n return;\r\n\r\n attachment.url = publicURL;\r\n attachment.transientState = undefined;\r\n }\r\n }\r\n}","<button matTooltip=\"Add an image or gif\" #button type=\"button\" mat-icon-button (click)=\"show()\" [disabled]=\"disabled\">\r\n\t<mat-icon>image</mat-icon>\r\n</button>\r\n<input style=\"display: none;\" #fileUpload [multiple]=\"false\" (change)=\"fileChange($event)\" type=\"file\" >","import { Directive, ElementRef, Input, Output } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\nimport { AttachmentFragment } from \"../attachment-scraper\";\r\nimport { ChatBackendBase } from \"../chat-backend-base\";\r\n\r\ninterface AttachmentFragmentState {\r\n fragment: AttachmentFragment;\r\n resolution: Promise<ChatMessageAttachment>;\r\n}\r\n\r\n@Directive({\r\n selector: '[attachmentScraper]',\r\n standalone: false\r\n})\r\nexport class AttachmentScraperDirective {\r\n constructor(\r\n private elementRef: ElementRef<HTMLTextAreaElement>,\r\n private chatBackend: ChatBackendBase\r\n ) {\r\n }\r\n\r\n @Input() attachments: ChatMessageAttachment[] = [];\r\n @Output() attachmentsChange = new Subject<ChatMessageAttachment[]>();\r\n ngOnInit() {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n this.element.addEventListener('keydown', () => {\r\n clearTimeout(this.scrapeTimeout);\r\n this.scrapeTimeout = setTimeout(() => this.scrape(), this.scrapeDebounce);\r\n });\r\n }\r\n\r\n get element() {\r\n return this.elementRef?.nativeElement;\r\n }\r\n\r\n get text() {\r\n return this.element.value;\r\n }\r\n\r\n\r\n private scrapeTimeout;\r\n private scrapeDebounce = 1500;\r\n private fragments = new Map<string, AttachmentFragmentState>();\r\n private scrape() {\r\n let message: ChatMessage = {\r\n likes: 0,\r\n message: this.text,\r\n sentAt: undefined,\r\n user: null,\r\n attachments: this.attachments\r\n };\r\n\r\n let foundFragments: string[] = [];\r\n\r\n for (let scraper of this.chatBackend.attachmentScrapers) {\r\n let fragments = scraper.findFragments(message);\r\n if (!fragments) {\r\n console.error(`Attachment fragment scraper ${scraper.constructor.name} is implemented incorrectly: Returned null instead of array`);\r\n continue;\r\n }\r\n for (let fragment of fragments) {\r\n foundFragments.push(fragment.text);\r\n if (!this.fragments.has(fragment.text)) {\r\n this.fragments.set(fragment.text, {\r\n fragment,\r\n resolution: undefined\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Remove fragments that are no longer in the message.\r\n let removedFragments: string[] = [];\r\n for (let [key] of this.fragments) {\r\n if (!foundFragments.includes(key))\r\n removedFragments.push(key);\r\n }\r\n for (let removedFragment of removedFragments) {\r\n this.fragments.delete(removedFragment);\r\n }\r\n\r\n // Process any fragments that are not yet resolved (or being \r\n // resolved)\r\n\r\n for (let [key, state] of this.fragments) {\r\n if (state.resolution)\r\n continue;\r\n\r\n state.resolution = new Promise(async (resolve, reject) => {\r\n for (let resolver of this.chatBackend.attachmentResolvers) {\r\n try {\r\n let attachment = await resolver.resolveFragment(message, state.fragment);\r\n if (attachment) {\r\n console.dir(attachment);\r\n this.attachments.push(attachment);\r\n this.attachmentsChange.next(this.attachments.slice());\r\n resolve(attachment);\r\n break;\r\n }\r\n } catch (e) {\r\n console.error(`Caught error during attachment resolver ${resolver.constructor.name}:`);\r\n console.error(e);\r\n continue;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n}","import { Component, ElementRef, HostBinding, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment, User } from \"@banta/common\";\r\nimport { Subject, Subscription } from \"rxjs\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\nimport { AttachmentFragment } from \"../../attachment-scraper\";\r\nimport { EMOJI } from \"@astronautlabs/emoji\";\r\nimport { SignInState } from \"../../chat-source\";\r\n\r\nconst ALL_EMOJI_WITH_SHORTCUTS = EMOJI.categories.flatMap(c => c.items).filter(x => x.shortcut);\r\n\r\nexport interface AutoCompleteOption {\r\n label : string;\r\n action? : () => void;\r\n}\r\n\r\nexport interface HashTag {\r\n hashtag : string;\r\n description : string;\r\n}\r\n\r\ninterface AttachmentFragmentState {\r\n fragment: AttachmentFragment;\r\n resolution: Promise<ChatMessageAttachment>;\r\n}\r\n\r\n@Component({\r\n selector: 'banta-comment-field',\r\n templateUrl: './comment-field.component.html',\r\n styleUrls: ['./comment-field.component.scss'],\r\n standalone: false\r\n})\r\nexport class CommentFieldComponent {\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n let root = document.body.querySelector('[ng-version]') || document.body;\r\n root.appendChild(this.autocompleteEl.nativeElement);\r\n }\r\n }\r\n\r\n //#region Source\r\n\r\n private _source : ChatSourceBase;\r\n @Input() get source() : ChatSourceBase { return this._source; }\r\n set source(value) { this.setSource(value); }\r\n\r\n //#endregion\r\n //#region Properties\r\n\r\n private _permissionDeniedError = new Subject<string>();\r\n private errorTimeout;\r\n private _subs = new Subscription();\r\n\r\n sending = false;\r\n sendError : Error;\r\n expandError = false;\r\n autocompleteVisible = false;\r\n autocompleteOptions : AutoCompleteOption[] = [];\r\n completionFunc : (str : string) => AutoCompleteOption[];\r\n completionPrefix : string;\r\n autoCompleteSelected : number = 0;\r\n text: string = '';\r\n chatMessageAttachments: ChatMessageAttachment[] = [];\r\n\r\n //#endregion\r\n //#region Inputs\r\n\r\n @Input() user : User;\r\n @Input() @HostBinding('class.can-comment') canComment = true;\r\n @Input() signInState: SignInState;\r\n @Input() allowAttachments = false;\r\n @Input() transientMessage: string;\r\n @Input() sendLabel = 'Send';\r\n @Input() signingInLabel = 'Signing in...';\r\n @Input() sendingLabel = 'Sending';\r\n @Input() label = 'Post a comment';\r\n @Input() permissionDeniedLabel = 'Unavailable';\r\n @Input() signInLabel = 'Sign In';\r\n @Input() maxLength = 1500;\r\n @Input() placeholder = '';\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n @Input() hashtags : HashTag[];\r\n @Input() participants : User[] = [];\r\n @Input() genericAvatarUrl: string;\r\n @Input() url: string;\r\n @Input() submit: (message: ChatMessage) => void;\r\n @Input() readonly = false;\r\n @Input() allowServerInfoRequest = false;\r\n //#endregion\r\n //#region Outputs\r\n\r\n @Output() signInSelected = new Subject<void>();\r\n @Output() editAvatarSelected = new Subject<void>();\r\n @Output() focusChange = new Subject<boolean>();\r\n @Output() textChanged = new Subject<void>();\r\n @Output() serverInfoRequested = new Subject<void>();\r\n @Output() reconnectRequested = new Subject<void>();\r\n @Output() get permissionDeniedError() { return this._permissionDeniedError; }\r\n\r\n //#endregion\r\n //#region UI Bindings\r\n\r\n @ViewChild('autocomplete') autocompleteEl : ElementRef<HTMLElement>;\r\n @ViewChild('autocompleteContainer') autocompleteContainerEl : ElementRef<HTMLElement>;\r\n @ViewChild('textarea') textareaEl : ElementRef<HTMLTextAreaElement>;\r\n\r\n get indicatorState() {\r\n if (this.transientMessage) {\r\n return 'transient';\r\n } else if (this.sending) {\r\n return 'sending';\r\n } else if (this.sendError) {\r\n return 'error';\r\n } else {\r\n return 'none';\r\n }\r\n }\r\n\r\n get buttonState() {\r\n if (this.sending)\r\n return 'sending';\r\n else if (this.signInState === 'signing-in')\r\n return 'signing-in';\r\n else if (!this.canComment)\r\n return 'permission-denied';\r\n else\r\n return 'send';\r\n }\r\n\r\n get sendButtonEnabled() {\r\n if (this.readonly)\r\n return false;\r\n\r\n if (this.signInState === 'signing-in')\r\n return false;\r\n\r\n if (!['connected', 'restored'].includes(this.source?.state ?? 'connected'))\r\n return false;\r\n\r\n if (!this.canComment) {\r\n // In this case, we want to enable the button because we want to be able to\r\n // send the permissionDenied message up to the host.\r\n return true;\r\n }\r\n\r\n return this.isValidMessage\r\n && !this.hasPendingAttachments\r\n && !this.sending\r\n ;\r\n }\r\n\r\n get userAvatarUrl() { return this.user?.avatarUrl || this.genericAvatarUrl; }\r\n get isValidMessage() { return (this.text || this.chatMessageAttachments.length > 0); }\r\n get hasPendingAttachments() { return this.chatMessageAttachments.some(x => x.transientState); }\r\n\r\n //#endregion\r\n //#region Private Component API\r\n\r\n private setSource(value: ChatSourceBase) {\r\n if (this._source) {\r\n this._subs?.unsubscribe();\r\n this._source = null;\r\n }\r\n\r\n this._source = value;\r\n this._subs = new Subscription();\r\n if (this._source) {\r\n setTimeout(() => {\r\n if (this._source.connectionStateChanged) {\r\n this._subs.add(this._source.connectionStateChanged.subscribe(state => {\r\n if (state === 'lost') {\r\n if (this._source.errorState === 'server-issue')\r\n this.transientMessage = `Reconnecting..`;\r\n else\r\n this.transientMessage = `Reconnecting...`;\r\n } else if (state === 'restored') {\r\n this.transientMessage = undefined;\r\n } else if (state === 'connecting') {\r\n this.transientMessage = `Connecting...`;\r\n }\r\n }));\r\n }\r\n });\r\n }\r\n }\r\n\r\n //#endregion\r\n //#region Actions\r\n\r\n sendPermissionDenied(message: string) { this._permissionDeniedError.next(message); }\r\n activateAutoComplete(option : AutoCompleteOption) { option.action(); this.dismissAutoComplete(); }\r\n onFocus() { this.focusChange.next(true); }\r\n onBlur() { this.focusChange.next(false); setTimeout(() => this.dismissAutoComplete(), 250); }\r\n showSignIn() { this.signInSelected.next(); }\r\n showEditAvatar() { this.editAvatarSelected.next(); }\r\n insertEmoji(text : string) { this.text += text; }\r\n\r\n showAutoComplete(options : AutoCompleteOption[]) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n this.autoCompleteSelected = 0;\r\n this.autocompleteOptions = options;\r\n let pos = this.autocompleteContainerEl.nativeElement.getBoundingClientRect();\r\n let size = this.autocompleteEl.nativeElement.getBoundingClientRect();\r\n\r\n this.autocompleteEl.nativeElement.style.left = `${window.scrollX + pos.left}px`;\r\n this.autocompleteEl.nativeElement.style.top = `${window.scrollY + pos.top}px`;\r\n this.autocompleteEl.nativeElement.style.width = `${pos.width}px`;\r\n this.autocompleteVisible = true;\r\n }\r\n\r\n dismissAutoComplete() {\r\n this.autocompleteVisible = false;\r\n this.completionFunc = null;\r\n this.completionPrefix = '';\r\n }\r\n\r\n indicateError(message : string) {\r\n this.sendError = new Error(message);\r\n this.expandError = false;\r\n clearTimeout(this.errorTimeout);\r\n this.errorTimeout = setTimeout(() => {\r\n this.expandError = true;\r\n this.errorTimeout = setTimeout(() => {\r\n this.expandError = false;\r\n }, 5*1000);\r\n }, 100);\r\n\r\n // On mobile, just show an alert dialog\r\n if (typeof window !== 'undefined' && window.innerWidth < 430)\r\n alert(message);\r\n }\r\n\r\n async autocomplete(replacement : string) {\r\n let el = this.textareaEl.nativeElement;\r\n this.text = this.text.slice(0, el.selectionStart - this.completionPrefix.length) + replacement + this.text.slice(el.selectionStart);\r\n }\r\n\r\n async insert(str : string) {\r\n let el = this.textareaEl.nativeElement;\r\n this.text = this.text.slice(0, el.selectionStart) + str + this.text.slice(el.selectionStart);\r\n }\r\n\r\n async onKeyDown(event : KeyboardEvent) {\r\n if (this.autocompleteVisible) {\r\n if (event.key === 'Escape') {\r\n this.dismissAutoComplete();\r\n return;\r\n }\r\n\r\n if (event.key === 'Shift') {\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter') {\r\n if (this.autocompleteOptions[this.autoCompleteSelected]) {\r\n this.activateAutoComplete(this.autocompleteOptions[this.autoCompleteSelected]);\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n if (this.autoCompleteSelected === 0)\r\n this.autoCompleteSelected = this.autocompleteOptions.length - 1;\r\n else\r\n this.autoCompleteSelected = this.autoCompleteSelected - 1;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n } else if (event.key === 'ArrowDown') {\r\n this.autoCompleteSelected = (this.autoCompleteSelected + 1) % this.autocompleteOptions.length;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === ' ' || event.key === 'Enter') {\r\n let textarea = this.textareaEl.nativeElement;\r\n let cursorPos = textarea.selectionStart;\r\n let substr = this.text.slice(0, cursorPos);\r\n let following = this.text.slice(cursorPos);\r\n let match = /(:-\\)|:-\\(|:-S|:-\\/|:-\\\\)$/.exec(substr);\r\n console.log(`checking in '${substr}|${following}'`);\r\n\r\n if (event.key === ' ')\r\n following = ` ${following}`;\r\n\r\n if (match) {\r\n console.log('found emoticon');\r\n let emoticonStr = match[1];\r\n let emoticons = {\r\n ':-)': '🙂',\r\n ':-(': '🙁',\r\n ':-S': '😖',\r\n ':-/': '🫤',\r\n ':-\\\\': '🫤'\r\n }\r\n let emoji = emoticons[emoticonStr];\r\n if (emoji) {\r\n textarea.value = substr.slice(0, -match[0].length) + emoji + following;\r\n this.text = textarea.value;\r\n textarea.selectionStart = (substr.length - match[0].length) + emoji.length;\r\n if (event.key === ' ')\r\n textarea.selectionStart += 1;\r\n textarea.selectionEnd = textarea.selectionStart;\r\n } else {\r\n console.log(`no emoji for ${emoticonStr}`);\r\n }\r\n\r\n\r\n if (event.key !== 'Enter') {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === 'Enter' && event.ctrlKey) {\r\n await this.sendMessage();\r\n return;\r\n }\r\n }\r\n\r\n if (this.completionFunc) {\r\n console.log('completionfunc');\r\n if (event.key === 'Backspace') {\r\n this.completionPrefix = this.completionPrefix.slice(0, this.completionPrefix.length - 1);\r\n\r\n if (this.completionPrefix === '') {\r\n this.dismissAutoComplete();\r\n return;\r\n }\r\n } else if (event.key === ' ' || event.key.length > 1) {\r\n this.dismissAutoComplete();\r\n return;\r\n } else {\r\n this.completionPrefix += event.key;\r\n }\r\n\r\n this.showAutoComplete(this.completionFunc(this.completionPrefix));\r\n } else {\r\n if (event.key === ':') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n\r\n // TODO\r\n // makes :-), :-( etc work (as they are \":)\" etc in the db)\r\n if (prefix.startsWith('-'))\r\n prefix = prefix.slice(1);\r\n\r\n return ALL_EMOJI_WITH_SHORTCUTS\r\n .filter(emoji => emoji.shortcut.includes(prefix) || emoji.keywords.some(kw => kw.includes(prefix)))\r\n .map(emoji => ({\r\n label: `${emoji.string} ${emoji.shortcut}`,\r\n action: () => this.autocomplete(emoji.string)\r\n }))\r\n .slice(0, 5)\r\n ;\r\n });\r\n } else if (event.key === '@') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n return this.participants.filter(x => x.username.includes(prefix))\r\n .map(p => ({\r\n label: `@${p.username} -- ${p.displayName}`,\r\n action: () => this.autocomplete(`@${p.username}`)\r\n }))\r\n ;\r\n });\r\n } else if (event.key === '#') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n\r\n return this.hashtags\r\n .filter(ht => ht.hashtag.includes(prefix))\r\n .map(ht => ({\r\n label: `#${ht.hashtag}${ht.description ? ` -- ${ht.description}` : ``}`,\r\n action: () => this.autocomplete(`#${ht.hashtag}`)\r\n }))\r\n .slice(0, 5)\r\n ;\r\n });\r\n }\r\n }\r\n }\r\n\r\n startAutoComplete(event : KeyboardEvent, completionFunc : (str : string) => AutoCompleteOption[]) {\r\n this.completionPrefix = event.key;\r\n this.completionFunc = completionFunc;\r\n this.showAutoComplete(this.completionFunc(this.completionPrefix));\r\n }\r\n\r\n async sendMessage() {\r\n if (!this.source)\r\n return;\r\n\r\n this.sending = true;\r\n this.sendError = null;\r\n try {\r\n let text = (this.text || '').trim();\r\n\r\n if (this.canComment && !this.isValidMessage)\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: this.user,\r\n sentAt: Date.now(),\r\n url: this.url ?? (typeof window !== 'undefined' ? location.href : undefined),\r\n likes: 0,\r\n message: text,\r\n attachments: this.chatMessageAttachments.filter(x => x.url)\r\n };\r\n\r\n try {\r\n await this.submit(message);\r\n this.text = '';\r\n this.chatMessageAttachments = [];\r\n } catch (e) {\r\n console.error(`[Banta/CommentField] sendMessage() failed: ${e.message}`);\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 1000));\r\n this.indicateError(e.message);\r\n }\r\n\r\n } finally {\r\n this.sending = false;\r\n setTimeout(() => {\r\n this.textareaEl.nativeElement.focus();\r\n }, 100);\r\n }\r\n }\r\n\r\n addedAttachment(attachment: ChatMessageAttachment) { this.chatMessageAttachments.push(attachment); }\r\n\r\n attachmentError(attachment: ChatMessageAttachment) {\r\n setTimeout(() => {\r\n this.chatMessageAttachments = this.chatMessageAttachments.filter(x => x !== attachment);\r\n }, 3000);\r\n }\r\n\r\n\tremoveAttachment(attachment: ChatMessageAttachment) {\r\n let index = this.chatMessageAttachments.indexOf(attachment);\r\n if (index >= 0)\r\n\t\t this.chatMessageAttachments.splice(index, 1);\r\n\t}\r\n\r\n alertError() {\r\n if (!this.sendError)\r\n return;\r\n alert(this.sendError.message);\r\n }\r\n}\r\n","<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n <div class=\"banta-avatar-container\">\r\n <a href=\"javascript:;\"\r\n class=\"banta-avatar\"\r\n (click)=\"showEditAvatar()\"\r\n [style.background-image]=\"'url(' + userAvatarUrl + ')'\"\r\n ></a>\r\n </div>\r\n <div class=\"banta-text-container\">\r\n <div class=\"banta-field-container\">\r\n <div class=\"banta-field-row\">\r\n <mat-form-field class=\"message-field\" appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name=\"message\"\r\n attachmentScraper\r\n [(attachments)]=\"chatMessageAttachments\"\r\n [placeholder]=\"placeholder\"\r\n matInput\r\n cdkTextareaAutosize\r\n [maxlength]=\"maxLength\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n [disabled]=\"sending || readonly\"\r\n [(ngModel)]=\"text\"\r\n autocomplete=\"off\"\r\n ></textarea>\r\n </mat-form-field>\r\n <div class=\"banta-options-line\">\r\n @if (indicatorState === 'transient') {\r\n <div class=\"transient-message\" [class.expanded]=\"true\" [matTooltip]=\"transientMessage\" (click)=\"alertError()\">\r\n <mat-spinner [diameter]=\"15\"></mat-spinner>\r\n {{transientMessage}}\r\n </div>\r\n }\r\n @if (indicatorState === 'sending') {\r\n <div class=\"banta-transient-message\" [class.expanded]=\"true\" (click)=\"alertError()\">\r\n <mat-spinner [diameter]=\"15\"></mat-spinner>\r\n {{sendingLabel}}...\r\n </div>\r\n }\r\n @if (indicatorState === 'error') {\r\n <div class=\"banta-error-message\" [class.expanded]=\"expandError\" [matTooltip]=\"sendError.message\" (click)=\"alertError()\">\r\n @if (sendError) {\r\n <mat-icon>error</mat-icon>\r\n }\r\n {{sendError.message}}\r\n </div>\r\n }\r\n\r\n\r\n <div class=\"spacer\"></div>\r\n <div class=\"custom\">\r\n <ng-content></ng-content>\r\n </div>\r\n @if (allowAttachments) {\r\n <banta-attachment-button\r\n [disabled]=\"readonly\"\r\n (addedAttachment)=\"addedAttachment($event)\"\r\n (attachmentError)=\"attachmentError($event)\"\r\n ></banta-attachment-button>\r\n }\r\n <emoji-selector-button [disabled]=\"readonly\" (selected)=\"insertEmoji($event)\"></emoji-selector-button>\r\n <mat-menu #overflowMenu>\r\n <button mat-menu-item (click)=\"reconnectRequested.next()\">\r\n <mat-icon>refresh</mat-icon>\r\n Reconnect\r\n </button>\r\n @if (allowServerInfoRequest) {\r\n <button mat-menu-item (click)=\"serverInfoRequested.next()\">\r\n <mat-icon>code</mat-icon>\r\n Server Information\r\n </button>\r\n }\r\n </mat-menu>\r\n <button mat-icon-button [mat-menu-trigger-for]=\"overflowMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n <div #autocompleteContainer class=\"autocomplete-container\">\r\n <div #autocomplete class=\"autocomplete\" [class.visible]=\"autocompleteVisible\">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n @for (option of autocompleteOptions; track option; let index = $index) {\r\n <a\r\n mat-button\r\n (click)=\"activateAutoComplete(option)\"\r\n [class.active]=\"autoCompleteSelected === index\"\r\n >\r\n {{option.label}}\r\n </a>\r\n }\r\n </div>\r\n </div>\r\n\r\n <banta-attachments\r\n [attachments]=\"chatMessageAttachments\"\r\n [editing]=\"true\"\r\n (remove)=\"removeAttachment($event)\"\r\n ></banta-attachments>\r\n </div>\r\n </div>\r\n <div class=\"banta-actions\">\r\n @if (!user) {\r\n <button\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"showSignIn()\"\r\n >{{signInLabel}}</button>\r\n }\r\n @if (user) {\r\n @if (buttonState === 'send') {\r\n <button\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!sendButtonEnabled\"\r\n >\r\n <mat-icon>chevron_right</mat-icon>\r\n <span class=\"label\">{{sendLabel}}</span>\r\n </button>\r\n }\r\n @if (buttonState === 'sending' || buttonState === 'signing-in') {\r\n <button\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!sendButtonEnabled\"\r\n >\r\n <mat-spinner class=\"icon\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <span class=\"label\">\r\n @if (buttonState === 'sending') {\r\n {{sendingLabel}}\r\n }\r\n @if (buttonState === 'signing-in') {\r\n {{signingInLabel}}\r\n }\r\n </span>\r\n </button>\r\n }\r\n @if (buttonState === 'permission-denied') {\r\n <button\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!sendButtonEnabled\"\r\n >\r\n {{permissionDeniedLabel}}\r\n </button>\r\n }\r\n }\r\n </div>\r\n</form>\r\n","/// <reference types=\"@types/resize-observer-browser\" />\r\n\r\nimport { Component, ContentChild, ElementRef, HostBinding, Input, NgZone, Output, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';\r\nimport { User, ChatMessage, CommentsOrder, FilterMode, ServerInfo } from '@banta/common';\r\nimport { HashTag } from '../comment-field/comment-field.component';\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { ChatBackendBase } from '../../chat-backend-base';\r\nimport { ChatSourceBase } from '../../chat-source-base';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { BantaReplySendOptionsDirective } from '../reply-send-options.directive';\r\nimport { MessageMenuItem } from '../../message-menu-item';\r\nimport { CommentViewComponent } from '../comment-view/comment-view.component';\r\nimport { CommentComponent } from '../comment/comment.component';\r\nimport { PinOptions } from '../../chat-source';\r\n\r\n/**\r\n * Comments component\r\n */\r\n@Component({\r\n selector: 'banta-comments',\r\n templateUrl: './banta-comments.component.html',\r\n styleUrls: ['./banta-comments.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaCommentsComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef: ElementRef<HTMLElement>,\r\n private activatedRoute: ActivatedRoute,\r\n private matSnackBar: MatSnackBar,\r\n private ngZone: NgZone\r\n ) {\r\n this.sendMessage = async (message: ChatMessage) => {\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.source);\r\n if (!intercept) {\r\n await this.source.send(message);\r\n }\r\n\r\n if (this.source.sortOrder !== CommentsOrder.NEWEST)\r\n this.sortOrder = CommentsOrder.NEWEST;\r\n\r\n if (this.source.filterMode !== FilterMode.ALL)\r\n this.filterMode = FilterMode.ALL;\r\n\r\n return true;\r\n } catch (e) {\r\n this.handleBackendException(e, 'Could not send: ');\r\n }\r\n }\r\n\r\n this.sendReply = async (message: ChatMessage) => {\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.selectedMessageThread);\r\n if (!intercept) {\r\n await this.selectedMessageThread.send(message);\r\n }\r\n return true;\r\n } catch (e) {\r\n this.handleBackendException(e, 'Could not send reply: ');\r\n }\r\n }\r\n }\r\n\r\n get element() {\r\n return this.elementRef.nativeElement;\r\n }\r\n\r\n private handleBackendExceptionAsAlert(e: Error, prefix: string = '') {\r\n try {\r\n this.handleBackendException(e, prefix);\r\n } catch (e) {\r\n console.log(`[Banta/Comments] Showed user error (via alert): '${e.message}'`);\r\n console.error(e);\r\n\r\n alert(e.message);\r\n }\r\n }\r\n\r\n private handleBackendExceptionAsSnack(e: Error, prefix: string = '') {\r\n try {\r\n this.handleBackendException(e, prefix);\r\n } catch (e) {\r\n console.log(`[Banta/Comments] Showed user error (via snack): '${e.message}'`);\r\n console.error(e);\r\n\r\n this.matSnackBar.open(e.message, undefined, { duration: 3000 });\r\n //alert(e.message);\r\n }\r\n }\r\n\r\n private handleBackendException(e: Error, prefix: string = '') {\r\n let errorMessage = e.message;\r\n\r\n if (errorMessage.startsWith('permission-denied|')) {\r\n errorMessage = errorMessage.replace(/^permission-denied\\|/, '');\r\n\r\n if (errorMessage.startsWith(`app-handle|`)) {\r\n // If this is an error during authorizeAction on the backend, pass control to the user-provided\r\n // permission-denied handler.\r\n\r\n this.sendPermissionDenied(errorMessage.replace(/^app-handle\\|/, ''));\r\n return;\r\n }\r\n }\r\n\r\n throw new Error(`${prefix}${errorMessage}`);\r\n }\r\n\r\n // Lifecycle Events / Initialization\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));\r\n this.startLoading();\r\n\r\n if (typeof window !== 'undefined') {\r\n let queryString = window.location.search.substring(1);\r\n let query = queryString.split('&')\r\n .map(s => s.split('='))\r\n .reduce((o, [k, v]) => (o[decodeURIComponent(k)] = decodeURIComponent(v), o), {})\r\n ;\r\n\r\n const commentID = query['comment'];\r\n if (commentID) {\r\n this.sharedCommentID = commentID;\r\n }\r\n }\r\n }\r\n\r\n private resizeObserver: ResizeObserver;\r\n private width: number;\r\n private height: number;\r\n\r\n @HostBinding('class.banta-mobile')\r\n isMobileSized: boolean = false;\r\n\r\n @ContentChild(BantaReplySendOptionsDirective, {read: TemplateRef})\r\n sendReplyOptionsTemplate: any;\r\n\r\n markViewReady: () => void;\r\n viewReady = new Promise<void>(r => this.markViewReady = r);\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n let callback = () => {\r\n let size = this.elementRef.nativeElement.getBoundingClientRect();\r\n this.ngZone.run(() => {\r\n setTimeout(() => {\r\n this.width = size.width;\r\n this.height = size.height;\r\n this.isMobileSized = this.width < 500;\r\n });\r\n })\r\n };\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(callback);\r\n this.resizeObserver.observe(this.elementRef.nativeElement);\r\n } else {\r\n // One check is better than nothing!\r\n setTimeout(() => {\r\n this.width = this.elementRef.nativeElement.clientWidth;\r\n this.height = this.elementRef.nativeElement.clientHeight;\r\n this.isMobileSized = this.width < 500;\r\n }, 1000);\r\n }\r\n\r\n callback();\r\n }\r\n\r\n this.markViewReady();\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n if (this.resizeObserver)\r\n this.resizeObserver.disconnect();\r\n }\r\n\r\n private async setSourceFromTopicID(topicID: string) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n setTimeout(async () => {\r\n console.log(`[Banta/Comments] Subscribing to topic source '${topicID}'`);\r\n\r\n // If we are loading a shared comment, we must override the mode to be Newest/All\r\n // to ensure we can find the comment.\r\n\r\n if (this.sharedCommentID) {\r\n this._sortOrder = CommentsOrder.NEWEST;\r\n this._filterMode = FilterMode.ALL;\r\n }\r\n\r\n this.source = await this.backend.getSourceForTopic(topicID, {\r\n sortOrder: this.sortOrder,\r\n filterMode: this.filterMode,\r\n metadata: this.metadata,\r\n initialMessageCount: this.initialMessageCount\r\n });\r\n this._sourceIsOwned = true;\r\n });\r\n }\r\n\r\n loadingTitle = 'Loading...';\r\n\r\n // Loading Screen\r\n private _loadingMessage = '';\r\n loadingMessageVisible = false;\r\n\r\n get loadingMessage() {\r\n return this._loadingMessage;\r\n }\r\n\r\n set loadingMessage(value) {\r\n this.loadingMessageVisible = false;\r\n setTimeout(() => {\r\n this._loadingMessage = value;\r\n this._loadingMessage = value;\r\n setTimeout(() => {\r\n this.loadingMessageVisible = true;\r\n })\r\n }, 500);\r\n }\r\n\r\n loading: boolean = true;\r\n showLoadingScreen = false;\r\n loadingStartedAt: number;\r\n messageChangedAt: number;\r\n sharedCommentID: string;\r\n lastSharedCommentID: string;\r\n\r\n @Input() customMenuItems: MessageMenuItem[] = [];\r\n\r\n private async startLoading() {\r\n this.loadingStartedAt = this.messageChangedAt = Date.now();\r\n\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 100));\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 500));\r\n if (this.updateLoading()) return;\r\n\r\n console.log(`[Banta] Loading is taking a long time! Showing loading screen.`);\r\n this.showLoadingScreen = true;\r\n if (typeof window !== 'undefined')\r\n this._loadingTimer = setInterval(() => {\r\n this.updateLoading();\r\n this.loadingTitle = `Connecting to Live Comments service...`;\r\n }, 1000);\r\n }\r\n\r\n private _loadingTimer;\r\n private _loadingMessageIndex = 0;\r\n\r\n /**\r\n * The canonical URL where this comment section can be found. If not specified, uses the current URL.\r\n */\r\n @Input() url: string;\r\n\r\n @Input() maxCommentLength: number = 1500;\r\n @Input() loadingMessages: string[] = [\r\n `Just a second...`,\r\n `It's definitely worth the wait!`,\r\n `This has never happened before.`,\r\n `We'll keep trying, but it's not looking great.\r\n Commenting & chat services may be down or degraded. Try reloading the page.\r\n If you keep experiencing issues or reloading the page works for you, please let us know by contacting support.\r\n `\r\n ];\r\n\r\n @Input() useInlineReplies = true;\r\n\r\n /**\r\n * Access the CommentViewComponent for this BantaCommentsComponent.\r\n * CommentViewComponent is responsible for interacting with the ChatSource\r\n * object and rendering comments as CommentComponents. It is the source of\r\n * truth for which CommentComponent corresponds to which ChatMessage.\r\n *\r\n * Note that this CommentViewComponent is only for the top level comments.\r\n * Replies are handled by a separate CommentViewComponent which can be\r\n * retrieved using the threadView property.\r\n */\r\n @ViewChild('commentView')\r\n commentView: CommentViewComponent;\r\n\r\n @ViewChildren(CommentViewComponent)\r\n threadViewQuery: QueryList<CommentViewComponent>;\r\n\r\n /**\r\n * Attempts to find the CommentComponent that corresponds to the given ChatMessage.\r\n * The ChatMessage could be a top-level message in this conversation, or a reply,\r\n * but note that a CommentComponent will only exist for a reply if the user has\r\n * the relevant reply thread open.\r\n * @param message The message to look for\r\n */\r\n getCommentComponentForMessage(message: ChatMessage): CommentComponent {\r\n if (message.parentMessageId)\r\n return this.threadView?.getCommentComponentForMessage(message);\r\n else\r\n return this.commentView.getCommentComponentForMessage(message)\r\n }\r\n\r\n /**\r\n * Access the CommentViewComponent corresponding to the currently open reply thread.\r\n * This is not the top level comments, but instead the reply thread that the user has\r\n * opened (only one set of replies can be open at a time).\r\n *\r\n * For details about what CommentViewComponent affords you, see the commentView property.\r\n */\r\n get threadView() {\r\n return Array.from(this.threadViewQuery).filter(x => x !== this.commentView)[0];\r\n }\r\n\r\n async waitForThreadView() {\r\n if (this.threadView)\r\n return this.threadView;\r\n\r\n await this.threadViewQuery.changes.pipe(take(1)).toPromise();\r\n return this.threadView;\r\n }\r\n\r\n markLoaded: () => void;\r\n loaded = new Promise<void>(r => this.markLoaded = r);\r\n\r\n get sourceState() {\r\n if (!this.source)\r\n return 'no-source';\r\n\r\n return this.source.state ?? 'connected';\r\n }\r\n\r\n private updateLoading(): boolean {\r\n if (this.sourceState && !['connecting', 'lost', 'no-source'].includes(this.sourceState)) {\r\n clearInterval(this._loadingTimer);\r\n this.loadingMessage = `Here we go!`;\r\n setTimeout(() => {\r\n this.loading = false;\r\n this.markLoaded();\r\n }, 750);\r\n return true;\r\n }\r\n\r\n console.log(`[Banta/Loader] State=${this.sourceState}`);\r\n let messageSwitchTime = 5*1000;\r\n if (this.messageChangedAt + messageSwitchTime < Date.now()) {\r\n if (this.loadingMessages[this._loadingMessageIndex]) {\r\n this.loadingMessage = this.loadingMessages[this._loadingMessageIndex++];\r\n this.messageChangedAt = Date.now();\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // Properties\r\n\r\n private _signInSelected = new Subject<void>();\r\n private _permissionDeniedError = new Subject<string>();\r\n private _editAvatarSelected = new Subject<void>();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _reported = new Subject<ChatMessage>();\r\n private _selected = new Subject<ChatMessage>();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _shared = new Subject<ChatMessage>();\r\n private _usernameSelected = new Subject<User>();\r\n private _avatarSelected = new Subject<User>();\r\n private _reconnectRequested = new Subject<void>();\r\n private _source: ChatSourceBase;\r\n\r\n /**\r\n * Track whether we created this source. If we did not (ie it was passed in from the caller),\r\n * then we are not responsible for calling close(). If we do own it though, we will call close()\r\n * when we are done with it.\r\n */\r\n private _sourceIsOwned = false;\r\n private _subs = new Subscription();\r\n private _topicID: string;\r\n\r\n user: User;\r\n selectedMessage: ChatMessage;\r\n selectedMessageThread: ChatSourceBase;\r\n selectedMessageVisible = false;\r\n connectionState: string;\r\n\r\n // Inputs\r\n\r\n @Input() signInLabel = 'Sign In';\r\n @Input() sendLabel = 'Send';\r\n @Input() signingInLabel = 'Signing in...';\r\n @Input() replyLabel = 'Reply';\r\n @Input() sendingLabel = 'Sending';\r\n @Input() permissionDeniedLabel = 'Send';\r\n @Input() postCommentLabel = 'Post a comment';\r\n @Input() postReplyLabel = 'Post a reply';\r\n @Input() allowAttachments = true;\r\n @Input() allowServerInfoRequest = false;\r\n @Input() fixedHeight: boolean;\r\n @Input() maxMessages: number;\r\n @Input() maxVisibleMessages: number = 20;\r\n @Input() genericAvatarUrl = `https://gravatar.com/avatar/${Date.now().toString(16)}?s=512&d=robohash`;\r\n\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n @Input() participants: User[] = [];\r\n\r\n private _sourceSubscription: Subscription;\r\n\r\n reconnect() {\r\n if (this._sourceIsOwned) {\r\n this.reloadSource();\r\n } else {\r\n this._reconnectRequested.next();\r\n }\r\n }\r\n\r\n replyFieldFocused = false;\r\n\r\n @Input()\r\n get source(): ChatSourceBase { return this._source; }\r\n set source(value) {\r\n if (this._source && this._sourceIsOwned) {\r\n this._source.close();\r\n this._sourceSubscription?.unsubscribe();\r\n this._source = null;\r\n this.participants = [];\r\n }\r\n\r\n this._source = value;\r\n this._sourceIsOwned = false; // Assume we don't own this source.\r\n this._sourceSubscription = new Subscription();\r\n\r\n if (value) {\r\n if (this.sharedCommentID) {\r\n this.navigateToSharedComment(this.sharedCommentID);\r\n this.lastSharedCommentID = this.sharedCommentID;\r\n this.sharedCommentID = null;\r\n }\r\n\r\n this._source.messages.forEach(m => this.addParticipant(m));\r\n\r\n if (this._source.connectionStateChanged)\r\n this._sourceSubscription.add(this._source.connectionStateChanged.subscribe(state => this.connectionState = state));\r\n else\r\n this.connectionState = 'connected';\r\n\r\n this._sourceSubscription.add(this._source.messageReceived.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(this._source.messageSent.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(this._source.messageObserved.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(\r\n this._source.messageUpdated.subscribe(msg => {\r\n console.log(`comments received message: `, msg);\r\n if (msg.id === this.selectedMessage?.id && msg.hidden) {\r\n this.unselectMessage();\r\n this.matSnackBar.open(\r\n \"The thread you were viewing was removed.\",\r\n undefined,\r\n {\r\n duration: 2500\r\n }\r\n )\r\n }\r\n })\r\n );\r\n\r\n }\r\n }\r\n @Input()\r\n hashtags: HashTag[] = [\r\n {hashtag: 'error', description: 'Cause an error'},\r\n {hashtag: 'timeout', description: 'Cause a slow timeout error'},\r\n {hashtag: 'slow', description: 'Be slow when this message is posted'},\r\n ];\r\n @Input()\r\n get topicID(): string { return this._topicID; }\r\n set topicID(value) {\r\n if (this._topicID !== value) {\r\n this._topicID = value;\r\n setTimeout(() => this.setSourceFromTopicID(value));\r\n }\r\n }\r\n\r\n // Outputs\r\n\r\n @Output() readonly signInSelected = this._signInSelected.asObservable();\r\n @Output() readonly editAvatarSelected = this._editAvatarSelected.asObservable();\r\n @Output() readonly permissionDeniedError = this._permissionDeniedError.asObservable();\r\n @Output() readonly upvoted = this._upvoted.asObservable();\r\n @Output() readonly reported = this._reported.asObservable();\r\n @Output() readonly selected = this._selected.asObservable();\r\n @Output() readonly userSelected = this._userSelected.asObservable();\r\n @Output() readonly usernameSelected = this._usernameSelected.asObservable();\r\n @Output() readonly avatarSelected = this._avatarSelected.asObservable();\r\n @Output() readonly shared = this._shared.asObservable();\r\n @Output() readonly reconnectRequested = this._reconnectRequested.asObservable();\r\n\r\n private _reloadSourceTimeout;\r\n private reloadSource() {\r\n clearTimeout(this._reloadSourceTimeout);\r\n\r\n let showLoaderTimeout;\r\n showLoaderTimeout = setTimeout(() => {\r\n this.loading = true;\r\n this.loadingTitle = 'Applying filters...';\r\n this.loadingMessage = 'Applying your filters and sort order is taking more time than expected. Sit tight!';\r\n this.showLoadingScreen = true;\r\n }, 500);\r\n\r\n this._reloadSourceTimeout = setTimeout(async () => {\r\n await this.setSourceFromTopicID(this.topicID);\r\n clearTimeout(showLoaderTimeout);\r\n this.loading = false;\r\n this.showLoadingScreen = true;\r\n });\r\n }\r\n\r\n private _sortOrder: CommentsOrder = 'newest';\r\n @Input() get sortOrder() { return this._sortOrder; }\r\n set sortOrder(value) {\r\n if (this._sortOrder !== value) {\r\n this._sortOrder = value;\r\n this.reloadSource();\r\n }\r\n }\r\n\r\n private _filterMode: FilterMode = FilterMode.ALL;\r\n @Input() get filterMode() { return this._filterMode; }\r\n set filterMode(value) {\r\n if (this._filterMode !== value) {\r\n this._filterMode = value;\r\n this.reloadSource();\r\n }\r\n }\r\n\r\n @Input() initialMessageCount: number = 100;\r\n\r\n private _metadata: Record<string, any> = {};\r\n\r\n /**\r\n * Arbitrary metadata to send to the chat server. This can be used to provide context about the client to the server\r\n * for things like validating authorization and other uses.\r\n */\r\n @Input() get metadata() { return this._metadata; }\r\n set metadata(value) {\r\n if (JSON.stringify(this._metadata) !== JSON.stringify(value)) {\r\n this._metadata = value;\r\n this.reloadSource();\r\n }\r\n }\r\n\r\n get filterModes() {\r\n return FilterMode.options;\r\n }\r\n\r\n get filterModeLabels() {\r\n return {\r\n [FilterMode.ALL]: 'All',\r\n [FilterMode.MINE]: 'Mine',\r\n [FilterMode.THREADS]: 'Involving Me',\r\n [FilterMode.MY_LIKES]: 'My Likes'\r\n }\r\n }\r\n\r\n get sortOrders() {\r\n return CommentsOrder.options;\r\n }\r\n\r\n get sortOrderLabels() {\r\n return {\r\n [CommentsOrder.NEWEST]: 'Newest',\r\n [CommentsOrder.OLDEST]: 'Oldest',\r\n [CommentsOrder.LIKES]: 'Likes'\r\n }\r\n }\r\n\r\n sendMessage: (message: ChatMessage) => void;\r\n sendReply: (message: ChatMessage) => void;\r\n\r\n // UI Interactions\r\n\r\n async scrollToComment(commentId: ChatMessage['id']) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n await this.commentView.waitForAllCommentsToLoad();\r\n\r\n const comment = document.querySelector(`[data-comment-id=\"${commentId}\"]`);\r\n if (comment) {\r\n comment.scrollIntoView({\r\n inline: 'center',\r\n block: 'center'\r\n });\r\n }\r\n }\r\n\r\n serverInfoVisible = false;\r\n serverInfoLoading = true;\r\n serverInfo: ServerInfo;\r\n\r\n async showServerInfo() {\r\n this.serverInfoVisible = true;\r\n this.serverInfoLoading = true;\r\n this.serverInfo = await this.source.getServerInfo();\r\n this.serverInfoLoading = false;\r\n }\r\n\r\n loadingSharedComment = false;\r\n sharedCommentMissing = false;\r\n\r\n async navigateToSharedComment(id: string) {\r\n this.loadingSharedComment = true;\r\n await new Promise(r => setTimeout(r, 10));\r\n this.sharedCommentMissing = false;\r\n let source = this.source;\r\n\r\n await source.ready;\r\n await this.viewReady;\r\n await this.loaded;\r\n\r\n console.log(`Navigating to shared comment with ID '${id}'...`);\r\n let message: ChatMessage;\r\n\r\n try {\r\n message = await this.source.get(id);\r\n } catch (e) {\r\n console.error(`Failed to find comment from URL: ${e.message}`);\r\n this.sharedCommentMissing = true;\r\n this.loadingSharedComment = false;\r\n\r\n if (typeof window !== 'undefined') {\r\n setTimeout(() => {\r\n let notice = this.element.querySelector('.loading-comment');\r\n notice.scrollIntoView({\r\n block: 'center',\r\n inline: 'center'\r\n });\r\n }, 200);\r\n }\r\n return;\r\n }\r\n\r\n message.transientState ??= {};\r\n\r\n // If there is a parent message, we should instead focus that and let the\r\n // scrollToComment and highlight do the work.\r\n\r\n if (message.parentMessageId) {\r\n\r\n let parentMessage = await this.source.get(message.parentMessageId);\r\n parentMessage.transientState ??= {};\r\n\r\n // Make sure that this message is loaded and visible to the user\r\n await this.commentView.loadMessageInContext(parentMessage);\r\n\r\n let thread = await this.selectMessage(parentMessage);\r\n\r\n // Need to re-retrieve the message within the new chat source to affect its\r\n // transient state.\r\n await thread.ready;\r\n\r\n // Make sure that this message is loaded and visible to the user\r\n await this.waitForThreadView();\r\n await this.threadView.loadMessageInContext(message);\r\n\r\n message = await thread.get(message.id);\r\n\r\n if (message) {\r\n message.transientState ??= {};\r\n message.transientState.highlighted = true;\r\n console.dir(message);\r\n await new Promise<void>(r => setTimeout(r, 500));\r\n }\r\n } else {\r\n // Make sure that this message is loaded and visible to the user\r\n await this.commentView.loadMessageInContext(message);\r\n\r\n message = await source.get(message.id);\r\n if (message) {\r\n message.transientState ??= {};\r\n message.transientState.highlighted = true;\r\n }\r\n }\r\n\r\n this.loadingSharedComment = false;\r\n await this.scrollToComment(id);\r\n }\r\n\r\n handlePermissionDenied(errorMessage: string) {\r\n // This is what other components call when handling permission errors\r\n\r\n if (errorMessage.startsWith(`app-handle|`)) {\r\n // If this is an error during authorizeAction on the backend, pass control to the user-provided\r\n // permission-denied handler.\r\n\r\n this.sendPermissionDenied(errorMessage.replace(/^app-handle\\|/, ''));\r\n return;\r\n }\r\n\r\n alert(errorMessage);\r\n }\r\n\r\n sendPermissionDenied(message: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n scrollToMessage(message: ChatMessage) {\r\n let el = this.elementRef.nativeElement.querySelector(`[data-comment-id=\"${message.id}\"]`);\r\n if (!el)\r\n return;\r\n el.scrollIntoView({block: 'center', inline: 'start'});\r\n }\r\n\r\n private addParticipant(message: ChatMessage) {\r\n if (!message || !message.user || !message.user.id)\r\n return;\r\n\r\n let existing = this.participants.find(x => x.id === message.user.id);\r\n if (existing)\r\n return;\r\n this.participants.push(message.user);\r\n }\r\n\r\n // Actions\r\n\r\n async likeMessage(source: ChatSourceBase, message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n this._upvoted.next(message);\r\n message.transientState.liking = true;\r\n\r\n try {\r\n await source.likeMessage(message.id);\r\n } catch (e) {\r\n this.handleBackendExceptionAsSnack(e, 'Could not like this message: ');\r\n } finally {\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n message.transientState.liking = false;\r\n }\r\n }\r\n\r\n async pinMessage(source: ChatSourceBase, message: ChatMessage, options: PinOptions) {\r\n await source.pinMessage(message.id, options);\r\n //this.reloadSource();\r\n this.matSnackBar.open(`The message has been pinned.`, undefined, { duration: 5000 });\r\n }\r\n\r\n async unpinMessage(source: ChatSourceBase, message: ChatMessage) {\r\n await source.unpinMessage(message.id);\r\n //this.reloadSource();\r\n this.matSnackBar.open(`The message has been unpinned.`, undefined, { duration: 5000 });\r\n }\r\n\r\n async unlikeMessage(source: ChatSourceBase, message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n this._upvoted.next(message);\r\n message.transientState.liking = true;\r\n\r\n if (message.userState?.liked)\r\n message.likes = (message.likes || 0) - 1;\r\n\r\n try {\r\n await source.unlikeMessage(message.id);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Failed to unlike this message: ');\r\n }\r\n\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n message.transientState.liking = false;\r\n }\r\n\r\n async reportMessage(message: ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n async unselectMessage() {\r\n let message = this.selectedMessage;\r\n\r\n this._selected.next(null);\r\n this.selectedMessage = null;\r\n if (this.selectedMessageThread) {\r\n if (this.selectedMessageThread.close)\r\n this.selectedMessageThread.close();\r\n this.selectedMessageThread = null;\r\n }\r\n\r\n if (message)\r\n setTimeout(() => this.scrollToMessage(message));\r\n }\r\n\r\n async toggleSelectedMessage(message: ChatMessage) {\r\n if (this.selectedMessage === message) {\r\n await this.unselectMessage();\r\n } else {\r\n await this.selectMessage(message);\r\n }\r\n }\r\n\r\n async selectMessage(message: ChatMessage) {\r\n if (this.selectedMessage === message) {\r\n console.log(`[Banta] Thread ${this.topicID}/${message.id} is already open.`);\r\n return this.selectedMessageThread;\r\n }\r\n\r\n if (this.selectedMessageThread) {\r\n if (this.selectedMessageThread.close)\r\n this.selectedMessageThread.close();\r\n this.selectedMessageThread = null;\r\n }\r\n\r\n this._selected.next(message);\r\n this.selectedMessage = message;\r\n\r\n console.log(`[Banta] Opening thread for ${this.topicID}/${message.id}...`);\r\n let selectedMessageThread = await this.backend.getSourceForThread(this.topicID, message.id, {\r\n metadata: this.metadata\r\n });\r\n\r\n if (!selectedMessageThread) {\r\n console.warn(`Failed to locate thread for message ${this.topicID}/${message.id}!`);\r\n return null;\r\n }\r\n\r\n console.log(`[Banta] Thread opened for ${this.topicID}/${message.id}.`);\r\n\r\n setTimeout(() => this.selectedMessageVisible = true);\r\n setTimeout(async () => {\r\n this.selectedMessageThread = selectedMessageThread;\r\n }, 250);\r\n\r\n return selectedMessageThread;\r\n }\r\n\r\n async showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n async showEditAvatar() {\r\n this._editAvatarSelected.next();\r\n }\r\n\r\n async selectMessageUser(message: ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n async selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n }\r\n\r\n async selectAvatar(user: User) {\r\n this._avatarSelected.next(user);\r\n }\r\n\r\n async shareMessage(message: ChatMessage) {\r\n this._shared.next(message);\r\n }\r\n\r\n async deleteMessage(message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n if (!confirm(\"Are you sure you want to delete this comment? You cannot undo this action.\"))\r\n return;\r\n\r\n try {\r\n await this.source.deleteMessage(message.id);\r\n\r\n if (this.selectedMessage?.id === message.id)\r\n this.unselectMessage();\r\n\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, `Could not delete message: `);\r\n }\r\n }\r\n\r\n async editMessage(source: ChatSourceBase, message: ChatMessage, newText: string) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n try {\r\n await source.editMessage(message.id, newText);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Could not edit this message: ');\r\n return;\r\n }\r\n\r\n message.message = newText;\r\n message.transientState.editing = false;\r\n }\r\n\r\n async startEditing(message: ChatMessage) {\r\n this.selectedMessage.transientState.editing = false;\r\n message.transientState.editing = true;\r\n }\r\n\r\n async saveEdit(message: ChatMessage, text: string) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n try {\r\n await this.source.editMessage(message.id, text);\r\n message.transientState.editing = false;\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, `Could not edit message: `);\r\n }\r\n }\r\n}\r\n","@if (loading) {\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>{{loadingTitle}}</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n}\r\n@if (!loading) {\r\n @if (selectedMessage && !useInlineReplies) {\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\">\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [busy]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n [maxLength]=\"maxCommentLength\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (pinned)=\"pinMessage(source, selectedMessage, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, selectedMessage)\"\r\n (selected)=\"toggleSelectedMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n <div class=\"replies\">\r\n @if (!selectedMessageThread) {\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n }\r\n @if (selectedMessageThread) {\r\n <banta-comment-view\r\n class=\"replies\"\r\n #threadView\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"true\"\r\n emptyStateMessage=\"Be the first to reply!\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n [customMenuItems]=\"customMenuItems\"\r\n ></banta-comment-view>\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [readonly]=\"source?.readonly\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [maxLength]=\"maxCommentLength\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInState]=\"source?.signInState\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div class=\"main\" [class.hidden]=\"selectedMessage && !useInlineReplies\">\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n [maxLength]=\"maxCommentLength\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n [allowServerInfoRequest]=\"allowServerInfoRequest\"\r\n (serverInfoRequested)=\"showServerInfo()\"\r\n (reconnectRequested)=\"reconnect()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n >\r\n </banta-comment-field>\r\n @if (serverInfoVisible) {\r\n <div class=\"server-info\">\r\n <div class=\"server-info-header\">\r\n Server Info\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button matTooltip=\"Reload\" (click)=\"showServerInfo()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Hide\" (click)=\"serverInfoVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n @if (serverInfoLoading) {\r\n <mat-spinner />\r\n } @else {\r\n <pre>{{ serverInfo | json }}</pre>\r\n }\r\n </div>\r\n }\r\n <mat-menu #filterMenu=\"matMenu\">\r\n @for (filter of filterModes; track filter) {\r\n <button mat-menu-item (click)=\"filterMode = filter\">\r\n {{filterModeLabels[filter]}}\r\n </button>\r\n }\r\n </mat-menu>\r\n <mat-menu #sortMenu=\"matMenu\">\r\n @for (sort of sortOrders; track sort) {\r\n <button mat-menu-item (click)=\"sortOrder = sort\">\r\n {{sortOrderLabels[sort]}}\r\n </button>\r\n }\r\n </mat-menu>\r\n <div class=\"settings\">\r\n <button mat-button [matMenuTriggerFor]=\"filterMenu\">\r\n <mat-icon>filter_list</mat-icon>\r\n {{filterModeLabels[filterMode]}}\r\n </button>\r\n <button mat-button [matMenuTriggerFor]=\"sortMenu\">\r\n <mat-icon>sort</mat-icon>\r\n {{sortOrderLabels[sortOrder]}}\r\n </button>\r\n </div>\r\n @if (loadingSharedComment) {\r\n <div class=\"loading-comment\">\r\n <h1>Loading the comment you linked to...</h1>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n <p>\r\n If there are a lot of comments, this might take awhile!\r\n </p>\r\n </div>\r\n }\r\n @if (!loadingSharedComment && lastSharedCommentID) {\r\n <div class=\"loading-comment\">\r\n @if (sharedCommentMissing) {\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <h1>\r\n <mat-icon>error</mat-icon>\r\n Uh oh!\r\n </h1>\r\n <p>The comment you linked to can't be found! It may have been removed.</p>\r\n }\r\n @if (!sharedCommentMissing) {\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <button mat-button (click)=\"navigateToSharedComment(lastSharedCommentID)\">\r\n <mat-icon>move_down</mat-icon> Jump to shared comment\r\n </button>\r\n }\r\n </div>\r\n }\r\n <banta-comment-view\r\n #commentView\r\n [class.faded]=\"selectedMessage && !useInlineReplies\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [holdNewMessages]=\"selectedMessageVisible\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (filterModeChanged)=\"filterMode = $event\"\r\n (selected)=\"toggleSelectedMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (pinned)=\"pinMessage(source, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n [selectedMessage]=\"selectedMessage\"\r\n (deleted)=\"deleteMessage($event)\"\r\n >\r\n <div class=\"inline-replies\" *bantaInlineReplies>\r\n @if (selectedMessage) {\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\">\r\n <div class=\"replies\">\r\n @if (!selectedMessageThread) {\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n }\r\n @if (selectedMessageThread) {\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"true\"\r\n emptyStateMessage=\"Be the first to reply!\"\r\n [newestLast]=\"true\"\r\n [enableHoldOnClick]=\"false\"\r\n [holdNewMessages]=\"replyFieldFocused\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n />\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n [maxLength]=\"maxCommentLength\"\r\n [source]=\"selectedMessageThread\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [readonly]=\"source?.readonly\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (focusChange)=\"replyFieldFocused = $event\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n @if (connectionState === 'lost') {\r\n <div class=\"reconnecting\">\r\n <strong>Connection to Live Comments lost.</strong> Reconnecting...\r\n </div>\r\n }\r\n }\r\n","import { Component, Input, Output } from \"@angular/core\";\r\nimport { User, ChatMessage } from '@banta/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-chat-message',\r\n templateUrl: './chat-message.component.html',\r\n styleUrls: ['./chat-message.component.scss'],\r\n standalone: false\r\n})\r\nexport class ChatMessageComponent {\r\n private _selected = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _upvoted = new Subject<void>();\r\n private _userSelected = new Subject<User>();\r\n\r\n @Input()\r\n message : ChatMessage;\r\n \r\n @Output() \r\n get userSelected() {\r\n return this._userSelected;\r\n }\r\n\r\n @Output()\r\n get selected() {\r\n return this._selected;\r\n }\r\n\r\n @Output()\r\n get reported() {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get upvoted() {\r\n return this._upvoted;\r\n }\r\n\r\n avatarForUser(user : User) {\r\n if (user && user.avatarUrl) {\r\n let url = user.avatarUrl;\r\n return `url(${url})`;\r\n }\r\n\r\n return null;\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n \r\n selectUser() {\r\n this._userSelected.next(this.message.user);\r\n }\r\n\r\n}","<div class=\"message-content\">\r\n <div class=\"user\" (click)=\"selectUser()\">\r\n <div class=\"avatar\" [style.background-image]=\"avatarForUser(message.user)\"></div>\r\n <label>{{message.user.username}}</label>\r\n </div>\r\n <div class=\"content\">\r\n <div (click)=\"select()\">\r\n {{message.message}}\r\n </div>\r\n <div class=\"status\">\r\n @if (message.likes > 0) {\r\n <div class=\"count-indicator\">\r\n <mat-icon>star</mat-icon> {{message.likes}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"actions\">\r\n <button mat-icon-button matTooltip=\"Upvote\" matTooltipPosition=\"below\" (click)=\"upvote()\">\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Report\" matTooltipPosition=\"below\" (click)=\"report()\">\r\n <mat-icon>report</mat-icon>\r\n </button>\r\n</div>","import { Component, Input, ViewChild, ElementRef, Output } from \"@angular/core\";\r\nimport { User, ChatMessage } from '@banta/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\n\r\n@Component({\r\n selector: 'banta-chat-view',\r\n templateUrl: './chat-view.component.html',\r\n styleUrls: ['./chat-view.component.scss'],\r\n standalone: false\r\n})\r\nexport class ChatViewComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef : ElementRef<HTMLElement>\r\n ) {\r\n\r\n }\r\n\r\n private _sourceSubs = new Subscription();\r\n private _source : ChatSourceBase;\r\n\r\n @Input()\r\n get source() {\r\n return this._source;\r\n }\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _selected$ = this._selected.asObservable();\r\n private _reported = new Subject<ChatMessage>();\r\n private _reported$ = this._reported.asObservable();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _upvoted$ = this._upvoted.asObservable();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _userSelected$ = this._userSelected.asObservable();\r\n private _received = new Subject<ChatMessage>();\r\n private _received$ = this._received.asObservable();\r\n\r\n @Output() get selected() { return this._selected$; }\r\n @Output() get userSelected() { return this._userSelected$; }\r\n @Output() get reported() { return this._reported$; }\r\n @Output() get upvoted() { return this._upvoted$; }\r\n @Output() get received() { return this._received$; }\r\n\r\n set source(value) {\r\n if (this._sourceSubs) {\r\n this._sourceSubs.unsubscribe();\r\n this._sourceSubs = null;\r\n }\r\n\r\n this._source = value;\r\n\r\n this.messages = [];\r\n\r\n if (value) {\r\n this._sourceSubs = new Subscription();\r\n this.messages = value.messages.slice();\r\n\r\n this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));\r\n this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));\r\n\r\n this._sourceSubs.add(\r\n this.backend.userChanged\r\n .subscribe(user => this.currentUser = user)\r\n );\r\n \r\n this.getInitialMessages();\r\n }\r\n }\r\n\r\n private async getInitialMessages() {\r\n let messages = (await this._source.getExistingMessages());\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = messages.slice().reverse();\r\n this.sortMessages();\r\n }\r\n\r\n private sortMessages() {\r\n if (!this.source)\r\n return;\r\n \r\n let sorter: (a: ChatMessage, b: ChatMessage) => number;\r\n\r\n sorter = (a, b) => (a.sentAt - b.sentAt);\r\n\r\n this.messages.sort(sorter);\r\n }\r\n\r\n messages : ChatMessage[] = [];\r\n currentUser : User;\r\n\r\n @ViewChild('messageContainer')\r\n messageContainer : ElementRef<HTMLElement>;\r\n\r\n @Input() maxMessages : number = 200;\r\n @Input() emptyLabel = 'Be the first to chat';\r\n\r\n private addMessage(message : ChatMessage) {\r\n if (this.messages.length > this.maxMessages + 1) {\r\n while (this.messages.length > this.maxMessages)\r\n this.messages.shift();\r\n }\r\n\r\n this.messages.push(message);\r\n this.sortMessages();\r\n }\r\n\r\n private messageReceived(message : ChatMessage) {\r\n this.addMessage(message);\r\n this._received.next(message);\r\n\r\n if (this.isScrolledToLatest())\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n isScrolledToLatest() {\r\n if (!this.messageContainer)\r\n return false;\r\n\r\n let el = this.messageContainer.nativeElement;\r\n let currentScroll = el.scrollTop;\r\n let currentTotal = el.scrollHeight - el.offsetHeight;\r\n \r\n return currentScroll > currentTotal - 10;\r\n }\r\n\r\n private messageSent(message : ChatMessage) {\r\n this.addMessage(message);\r\n \r\n if (!this.messageContainer)\r\n return;\r\n\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n scrollToLatest() {\r\n if (!this.messageContainer)\r\n return;\r\n \r\n let el = this.messageContainer.nativeElement;\r\n el.scrollTop = el.scrollHeight;\r\n }\r\n\r\n jumpTo(message : ChatMessage) {\r\n let element = this.elementRef.nativeElement;\r\n let messageElement = element.querySelector(`banta-chat-message[data-id=\"${message.id}\"]`)\r\n\r\n if (!messageElement) {\r\n alert(`could not find message ${message.id}`);\r\n return;\r\n }\r\n\r\n messageElement.scrollIntoView({ behavior: 'smooth' });\r\n\r\n this.flashMessage(message);\r\n }\r\n\r\n flashMessage(message : ChatMessage) {\r\n if (!message)\r\n return;\r\n \r\n this.flashedMessageId = message.id;\r\n //setTimeout(() => this.flashedMessageId = null, 250);\r\n }\r\n\r\n flashedMessageId : string;\r\n\r\n\r\n mentionsMe(message : ChatMessage) {\r\n if (!this.currentUser)\r\n return false;\r\n\r\n if (message.message.includes(`@${this.currentUser.username}`))\r\n return true;\r\n \r\n return false;\r\n }\r\n \r\n upvoteMessage(message : ChatMessage) {\r\n this._upvoted.next(message);\r\n }\r\n\r\n reportMessage(message : ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n selectMessage(message : ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectMessageUser(message : ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n avatarForUser(user : User) {\r\n if (user && user.avatarUrl) {\r\n let url = user.avatarUrl;\r\n return `url(${url})`;\r\n }\r\n\r\n return null;\r\n }\r\n}","<div class=\"message-container\" #messageContainer>\r\n <ng-content select=\"[data-before]\"></ng-content>\r\n\r\n @if (messages.length === 0) {\r\n <div class=\"empty\">\r\n {{emptyLabel}}\r\n </div>\r\n }\r\n\r\n @for (message of messages; track message) {\r\n @if (!message.hidden) {\r\n <banta-chat-message\r\n [message]=\"message\"\r\n [class.highlight]=\"mentionsMe(message)\"\r\n [class.flash]=\"message.id === flashedMessageId\"\r\n (selected)=\"selectMessage(message)\"\r\n (upvoted)=\"upvoteMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (userSelected)=\"selectMessageUser(message)\"\r\n [attr.data-id]=\"message.id\"\r\n >\r\n </banta-chat-message>\r\n }\r\n }\r\n <ng-content select=\":not([data-before])\"></ng-content>\r\n</div>","import { Component, Input, Output, ViewChild, ElementRef } from \"@angular/core\";\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\n\r\nimport { User, ChatMessage, NewMessageForm } from '@banta/common';\r\nimport { ChatViewComponent } from '../chat-view/chat-view.component';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\n\r\n/**\r\n * Chat component\r\n */\r\n@Component({\r\n selector: 'banta-chat',\r\n templateUrl: './banta-chat.component.html',\r\n styleUrls: ['./banta-chat.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaChatComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n }\r\n\r\n private _source : ChatSourceBase;\r\n private _subs = new Subscription();\r\n user : User = null;\r\n\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n @Input() url: string;\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n }\r\n\r\n @Input()\r\n get source() : ChatSourceBase {\r\n return this._source;\r\n }\r\n\r\n set source(value) {\r\n this._source = value;\r\n }\r\n\r\n @Input()\r\n get topicID() : string {\r\n return this._source.identifier;\r\n }\r\n\r\n set topicID(value) {\r\n this.setSourceFromTopicID(value);\r\n }\r\n\r\n private _metadata: Record<string, any> = {};\r\n\r\n /**\r\n * Arbitrary metadata to send to the chat server. This can be used to provide context about the client to the server\r\n * for things like validating authorization and other uses.\r\n */\r\n @Input() get metadata() { return this._metadata; }\r\n set metadata(value) {\r\n if (JSON.stringify(this._metadata) !== JSON.stringify(value)) {\r\n this._metadata = value;\r\n this.reloadSource();\r\n }\r\n }\r\n\r\n private _reloadSourceTimeout;\r\n private reloadSource() {\r\n clearTimeout(this._reloadSourceTimeout);\r\n this._reloadSourceTimeout = setTimeout(() => {\r\n this.setSourceFromTopicID(this.topicID);\r\n });\r\n }\r\n\r\n private async setSourceFromTopicID(topicID : string) {\r\n if (this._source && this._source.close)\r\n this._source.close();\r\n this._source = null;\r\n this._source = await this.backend.getSourceForTopic(topicID, {\r\n metadata: this.metadata\r\n });\r\n }\r\n\r\n @Input() signInLabel = 'Sign In';\r\n @Input() sendLabel = 'Send';\r\n @Input() permissionDeniedLabel = 'Send';\r\n @Input() messageFieldPlaceholder = 'Chat';\r\n @Input() emptyLabel = 'Be the first to chat';\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _selected$ = this._selected.asObservable();\r\n private _reported = new Subject<ChatMessage>();\r\n private _reported$ = this._reported.asObservable();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _upvoted$ = this._upvoted.asObservable();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _userSelected$ = this._userSelected.asObservable();\r\n private _permissionDeniedError = new Subject<string>();\r\n private _permissionDeniedError$ = this._permissionDeniedError.asObservable();\r\n private _signInSelected = new Subject<void>();\r\n private _signInSelected$ = this._signInSelected.asObservable();\r\n private _received = new Subject<ChatMessage>();\r\n private _received$ = this._received.asObservable();\r\n\r\n @Output() get selected() { return this._selected$; }\r\n @Output() get reported() { return this._reported$; }\r\n @Output() get upvoted() { return this._upvoted$; }\r\n @Output() get userSelected() { return this._userSelected$; }\r\n @Output() get permissionDeniedError() { return this._permissionDeniedError$; }\r\n @Output() get signInSelected() { return this._signInSelected$; }\r\n @Output() get received() { return this._received$; }\r\n\r\n onReceived(message: ChatMessage) {\r\n this._received.next(message);\r\n }\r\n\r\n showEmojiPanel = false;\r\n\r\n showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n sendPermissionError(message?: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n insertEmoji(emoji) {\r\n let message = this.newMessage.message || '';\r\n\r\n this.newMessage.message = message + emoji;\r\n }\r\n\r\n onKeyDown(event : KeyboardEvent) {\r\n // TODO\r\n }\r\n\r\n @ViewChild('chatView') chatView : ChatViewComponent;\r\n @ViewChild('input') inputElementRef: ElementRef<HTMLInputElement>;\r\n\r\n jumpToMessage(message : ChatMessage) {\r\n if (this.chatView)\r\n this.chatView.jumpTo(message);\r\n }\r\n\r\n select(message : ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectUser(message : ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n report(message : ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n async upvote(message : ChatMessage) {\r\n await this.source.likeMessage(message.id);\r\n this._upvoted.next(message);\r\n }\r\n\r\n get canChat() {\r\n if (!this.user)\r\n return false;\r\n\r\n // TODO\r\n // if (!this.user.permissions)\r\n // return true;\r\n\r\n // if (!this.user.permissions.canChat)\r\n // return true;\r\n\r\n // return this.user.permissions?.canChat(this.source);\r\n\r\n return true;\r\n }\r\n\r\n newMessage : NewMessageForm = {};\r\n\r\n async sendMessage() {\r\n if (!this.source)\r\n return;\r\n\r\n let text = (this.newMessage.message || '').trim();\r\n this.newMessage.message = '';\r\n\r\n if (text === '')\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: null,\r\n sentAt: Date.now(),\r\n likes: 0,\r\n url: this.url ?? (typeof window !== 'undefined' ? location.href : undefined),\r\n message: text\r\n };\r\n\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.source);\r\n if (!intercept) {\r\n await this.source.send(message);\r\n }\r\n\r\n this.chatView.scrollToLatest();\r\n this.inputElementRef.nativeElement.focus();\r\n } catch (e) {\r\n console.error(`Failed to send message: `, message);\r\n console.error(e);\r\n }\r\n }\r\n}\r\n","<banta-chat-view\r\n #chatView\r\n [source]=\"source\"\r\n [emptyLabel]=\"emptyLabel\"\r\n (upvoted)=\"upvote($event)\"\r\n (reported)=\"report($event)\"\r\n (selected)=\"select($event)\"\r\n (received)=\"onReceived($event)\"\r\n (userSelected)=\"selectUser($event)\"\r\n></banta-chat-view>\r\n\r\n<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n\r\n <div class=\"entry-container\">\r\n <input\r\n #input\r\n type=\"text\"\r\n name=\"message\"\r\n autocomplete=\"off\"\r\n enterkeyhint=\"send\"\r\n [placeholder]=\"messageFieldPlaceholder\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [(ngModel)]=\"newMessage.message\" />\r\n\r\n <emoji-selector-button\r\n (selected)=\"insertEmoji($event)\"\r\n overlayY=\"bottom\"\r\n overlayX=\"end\"\r\n originY=\"top\"\r\n ></emoji-selector-button>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n\r\n @if (!user) {\r\n <button type=\"button\" (click)=\"showSignIn()\" mat-raised-button color=\"primary\">{{signInLabel}}</button>\r\n }\r\n @if (user) {\r\n @if (canChat) {\r\n <button [disabled]=\"!newMessage.message\" mat-raised-button color=\"primary\">{{sendLabel}}</button>\r\n }\r\n @if (!canChat) {\r\n <button type=\"button\" (click)=\"sendPermissionError()\" mat-raised-button color=\"primary\">{{permissionDeniedLabel}}</button>\r\n }\r\n }\r\n </div>\r\n </form>","import { Component, Input, Output } from '@angular/core';\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ChatBackendBase } from '../chat-backend-base';\r\n\r\n@Component({\r\n selector: 'banta-live-comment',\r\n template: `\r\n @if (message) {\r\n <banta-comment\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\"\r\n ></banta-comment>\r\n }\r\n `,\r\n styles: [``],\r\n standalone: false\r\n})\r\nexport class LiveCommentComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n @Output()\r\n get upvoted() : Observable<void> {\r\n return this._upvoted;\r\n }\r\n \r\n @Output()\r\n get reported() : Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected() : Observable<void> {\r\n return this._selected;\r\n }\r\n \r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n private unsubscribe : Function;\r\n\r\n set message(value) {\r\n let originalId = null;\r\n if (this._message)\r\n originalId = this._message.id;\r\n \r\n this._message = value;\r\n\r\n if (value && originalId === value.id) {\r\n return;\r\n }\r\n \r\n if (this.unsubscribe)\r\n this.unsubscribe();\r\n \r\n if (value) {\r\n this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);\r\n }\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n}","import { Component, Input, Output } from '@angular/core';\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ChatBackendBase } from '../chat-backend-base';\r\n\r\n@Component({\r\n selector: 'banta-live-chat-message',\r\n template: `\r\n @if (message) {\r\n <banta-chat-message\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\"\r\n ></banta-chat-message>\r\n }\r\n `,\r\n styles: [``],\r\n standalone: false\r\n})\r\nexport class LiveChatMessageComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n @Output()\r\n get upvoted() : Observable<void> {\r\n return this._upvoted;\r\n }\r\n \r\n @Output()\r\n get reported() : Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected() : Observable<void> {\r\n return this._selected;\r\n }\r\n \r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n private unsubscribe : Function;\r\n\r\n set message(value) {\r\n let originalId = null;\r\n if (this._message)\r\n originalId = this._message.id;\r\n \r\n this._message = value;\r\n\r\n if (value && originalId === value.id) {\r\n return;\r\n }\r\n\r\n if (this.unsubscribe)\r\n this.unsubscribe();\r\n \r\n if (value) {\r\n this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);\r\n }\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n}","import { Component, Input, Output } from \"@angular/core\";\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-live-message',\r\n template: `\r\n @if (message) {\r\n @if (viewType === 'chat') {\r\n <banta-live-chat-message\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\">\r\n </banta-live-chat-message>\r\n }\r\n @if (viewType === 'comment') {\r\n <banta-live-comment\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\">\r\n </banta-live-comment>\r\n }\r\n }\r\n `,\r\n styles: [``],\r\n standalone: false\r\n})\r\nexport class LiveMessageComponent {\r\n constructor() {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n viewType : string;\r\n\r\n @Output()\r\n get upvoted(): Observable<void> {\r\n return this._upvoted;\r\n }\r\n\r\n @Output()\r\n get reported(): Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected(): Observable<void> {\r\n return this._selected;\r\n }\r\n\r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n set message(value) {\r\n this._message = value;\r\n this.viewType = this.getViewType(value);\r\n }\r\n\r\n private getViewType(message : ChatMessage) {\r\n if (message.topicId.endsWith('_firehose'))\r\n return 'chat';\r\n else if (message.topicId.endsWith('_thepoint'))\r\n return 'comment';\r\n\r\n return 'comment';\r\n }\r\n\r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n\r\n}\r\n","import { Component, Input, ViewChild, HostBinding } from \"@angular/core\";\r\nimport { NewMessageForm, ChatMessage, User, Notification, UpvoteNotification, NoticeNotification, MentionNotification, ReplyNotification } from '@banta/common';\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { BantaChatComponent } from '../chat';\r\nimport { Output } from \"@angular/core\";\r\nimport { ChatBackendBase } from \"../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../chat-source-base\";\r\n\r\n/**\r\n * Unified chat and comments component\r\n */\r\n@Component({\r\n selector: `banta`,\r\n templateUrl: './banta.component.html',\r\n styleUrls: ['./banta.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaComponent {\r\n constructor(\r\n private backend : ChatBackendBase,\r\n private matDialog : MatDialog\r\n ) {\r\n }\r\n\r\n firehoseSource : ChatSourceBase;\r\n pointSource : ChatSourceBase;\r\n\r\n private _topicID : string;\r\n private _subs = new Subscription();\r\n\r\n auxOpen = false;\r\n auxTitle = 'Notifications';\r\n auxMode = 'notifications';\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.currentUser = user));\r\n this._subs.add(this.backend.notificationsChanged.subscribe(notifs => this.notifications = notifs));\r\n this._subs.add(this.backend.newNotification.subscribe(notif => {\r\n this.newNotifications = true;\r\n }));\r\n }\r\n\r\n mobileFocus : string = null;\r\n\r\n async sendPointSubMessage() {\r\n let text = (this.newPointSubMessage.message || '').trim();\r\n this.newPointSubMessage.message = '';\r\n\r\n if (text === '')\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: null,\r\n sentAt: Date.now(),\r\n likes: 0,\r\n message: text\r\n };\r\n\r\n try {\r\n await this.pointSubChat.send(message);\r\n } catch (e) {\r\n console.error(`Failed to send point sub-message:`);\r\n console.error(e);\r\n }\r\n }\r\n\r\n @ViewChild('firehose', { static: true })\r\n firehose : BantaChatComponent;\r\n\r\n async goToMessage(message : ChatMessage) {\r\n\r\n let targetMessage = message;\r\n\r\n if (message.parentMessageId) {\r\n // jump to the parent message thread...\r\n\r\n let parentMessage: ChatMessage;\r\n\r\n try {\r\n parentMessage = await this.backend.getMessage(message.topicId, message.parentMessageId);\r\n } catch (e) {\r\n console.error(`Received exception while fetching parent message:`);\r\n console.error(e);\r\n }\r\n\r\n if (!parentMessage) {\r\n console.error(`Failed to look up parent message ${message.topicId}/${message.parentMessageId}`);\r\n console.error(`Original message was:`);\r\n console.dir(targetMessage);\r\n return;\r\n }\r\n\r\n message = parentMessage;\r\n }\r\n\r\n let viewType = this.getViewType(message);\r\n\r\n if (viewType === 'comment') {\r\n if (this.pointSubChat) {\r\n if (this.pointSubChat.close)\r\n this.pointSubChat.close();\r\n this.pointSubChat = null;\r\n }\r\n this.mobileFocus = 'points';\r\n this.pointOpen = message;\r\n this.pointSubChat = await this.backend.getSourceForThread(message.topicId, message.id);\r\n this.pointOpen = await this.backend.refreshMessage(message);\r\n this.newPointSubMessage = {};\r\n } else if (viewType === 'chat') {\r\n this.mobileFocus = 'firehose';\r\n this.firehose.jumpToMessage(message);\r\n }\r\n }\r\n\r\n notifications : Notification[];\r\n newNotifications = false;\r\n\r\n pointUnfocus() {\r\n this.pointOpen = null;\r\n if (this.pointSubChat) {\r\n if (this.pointSubChat.close)\r\n this.pointSubChat.close();\r\n this.pointSubChat = null;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n }\r\n\r\n showAux(title : string, mode : string) {\r\n this.auxOpen = true;\r\n this.auxTitle = title;\r\n this.auxMode = mode;\r\n this.mobileFocus = 'aux';\r\n }\r\n\r\n showNotifications() {\r\n this.showAux('Notifications', 'notifications');\r\n }\r\n\r\n @Input()\r\n get topicID() : string {\r\n return this._topicID;\r\n }\r\n\r\n @Input() chatLabel = 'Chat';\r\n @Input() commentsLabel = 'Comments';\r\n @Input() allowServerInfoRequest = false;\r\n\r\n set topicID(value) {\r\n this._topicID = value;\r\n\r\n this.close();\r\n this.connectToTopic(this._topicID);\r\n }\r\n\r\n private async connectToTopic(id : string) {\r\n this.firehoseSource = await this.backend.getSourceForTopic(`${id}_firehose`);\r\n this.pointSource = await this.backend.getSourceForTopic(`${id}_thepoint`);\r\n }\r\n\r\n private _signInSelected = new Subject<void>();\r\n\r\n @Output()\r\n get signInSelected(): Observable<void> {\r\n return this._signInSelected;\r\n }\r\n\r\n showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n close() {\r\n if (this.firehoseSource) {\r\n if (this.firehoseSource.close)\r\n this.firehoseSource.close();\r\n this.firehoseSource = null;\r\n }\r\n\r\n if (this.pointSource) {\r\n if (this.pointSource.close)\r\n this.pointSource.close();\r\n this.pointSource = null;\r\n }\r\n }\r\n\r\n @HostBinding('class.point-focus')\r\n get hasPoint() {\r\n return this.pointOpen != null;\r\n }\r\n\r\n pointOpen : ChatMessage = null;\r\n pointSubChat : ChatSourceBase = null;\r\n\r\n closeAux() {\r\n this.auxOpen = false;\r\n this.mobileFocus = 'firehose';\r\n }\r\n\r\n getViewType(message : ChatMessage) {\r\n if (message.topicId.endsWith('_firehose'))\r\n return 'chat';\r\n else if (message.topicId.endsWith('_thepoint'))\r\n return 'comment';\r\n\r\n return 'comment';\r\n }\r\n\r\n async upvoteMessage(message : ChatMessage) {\r\n // TODO\r\n //await this.backend.likeMessage(message.id);\r\n }\r\n\r\n showProfile(user : User) {\r\n this.profileUser = user;\r\n this.showAux(`@${user.username}'s Profile`, 'profile');\r\n }\r\n\r\n profileUser : User;\r\n\r\n reportedMessage : ChatMessage;\r\n\r\n sendReport(message : ChatMessage) {\r\n this.auxOpen = false;\r\n alert('would send report');\r\n }\r\n\r\n reportMessage(message : ChatMessage) {\r\n this.reportedMessage = message;\r\n this.showAux(`Report message from @${message.user.username}`, 'report');\r\n }\r\n\r\n currentUser : User;\r\n\r\n newPointSubMessage : NewMessageForm = {};\r\n\r\n genericAvatarUrl = 'https://gravatar.com/avatar/915c804e0be607a4ad766ddadea5c48a?s=512&d=https://codepen.io/assets/avatars/user-avatar-512x512-6e240cf350d2f1cc07c2bed234c3a3bb5f1b237023c204c782622e80d6b212ba.png';\r\n\r\n notifIsUpvote(notif: Notification): notif is UpvoteNotification { return notif.type === 'upvote'; }\r\n notifIsNotice(notif: Notification): notif is NoticeNotification { return notif.type === 'notice'; }\r\n notifIsMention(notif: Notification): notif is MentionNotification { return notif.type === 'mention'; }\r\n notifIsReply(notif: Notification): notif is ReplyNotification { return notif.type === 'reply'; }\r\n}\r\n","\r\n<mat-menu #userMenu=\"matMenu\">\r\n @if (currentUser) {\r\n <button [disabled]=\"true\" mat-menu-item>{{currentUser.displayName}} (@{{currentUser.username}})</button>\r\n }\r\n @if (!currentUser) {\r\n <button mat-menu-item>Sign In</button>\r\n }\r\n <button mat-menu-item>Help</button>\r\n</mat-menu>\r\n\r\n<div class=\"tabs\">\r\n <div>\r\n <a mat-button (click)=\"mobileFocus = 'chat'\">{{chatLabel}}</a>\r\n <a mat-button (click)=\"mobileFocus = 'comments'\">{{commentsLabel}}</a>\r\n </div>\r\n <div class=\"spacer\"></div>\r\n <div>\r\n @if (currentUser) {\r\n <button mat-button [matMenuTriggerFor]=\"userMenu\">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)=\"showNotifications()\">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (!currentUser) {\r\n <button mat-button (click)=\"showSignIn()\">\r\n Sign In\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n\r\n<div class=\"firehose\" [class.focus]=\"mobileFocus === 'chat'\">\r\n <header>\r\n <div>\r\n <label (click)=\"mobileFocus = 'chat'\">{{chatLabel}}</label>\r\n <div class=\"spacer\"></div>\r\n\r\n @if (currentUser) {\r\n <button mat-button [matMenuTriggerFor]=\"userMenu\">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)=\"showNotifications()\">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (!currentUser) {\r\n <button mat-button (click)=\"showSignIn()\">\r\n Sign In\r\n </button>\r\n }\r\n </div>\r\n </header>\r\n <banta-chat\r\n #firehose\r\n [source]=\"firehoseSource\"\r\n (signInSelected)=\"showSignIn()\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n (reported)=\"reportMessage($event)\"\r\n ></banta-chat>\r\n</div>\r\n\r\n<div class=\"aux\" [class.focus]=\"mobileFocus === 'aux'\" [class.open]=\"auxOpen\">\r\n <header>\r\n <div>\r\n <label>{{auxTitle}}</label>\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button (click)=\"auxOpen = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </header>\r\n <div class=\"aux-contents\">\r\n @if (auxMode === 'profile') {\r\n @if (profileUser) {\r\n <div>\r\n <strong style=\"font-size: 125%;\">\r\n {{profileUser.displayName}}\r\n </strong>\r\n @{{profileUser.username}}\r\n </div>\r\n <br/>\r\n <strong>Top Messages</strong>\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n <br/>\r\n <strong>Recent Messages</strong>\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n }\r\n }\r\n\r\n @if (auxMode === 'report') {\r\n <p>Are you sure you want to report this message?</p>\r\n <banta-live-message [message]=\"reportedMessage\"></banta-live-message>\r\n <div style=\"text-align: center;\">\r\n <button mat-raised-button color=\"primary\" (click)=\"sendReport(reportedMessage)\">Yes, Report</button>\r\n \r\n <button mat-raised-button color=\"secondary\" (click)=\"auxOpen = false\">No, Cancel</button>\r\n </div>\r\n }\r\n\r\n @if (auxMode === 'notifications') {\r\n @if (!notifications || notifications.length === 0) {\r\n <div>\r\n <em>You do not have any notifications yet</em>\r\n </div>\r\n }\r\n <div class=\"notifications\">\r\n @for (notif of notifications; track notif) {\r\n <div class=\"notification\">\r\n <div>\r\n @if (notifIsUpvote(notif)) {\r\n @{{notif.message?.user?.username}} upvoted your post\r\n <banta-live-message\r\n [message]=\"notif.message\"\r\n (upvoted)=\"upvoteMessage(notif.message)\"\r\n (reported)=\"reportMessage(notif.message)\"\r\n (selected)=\"goToMessage(notif.message)\">\r\n </banta-live-message>\r\n } @else if (notifIsNotice(notif)) {\r\n <div>\r\n {{notif.message}}\r\n </div>\r\n <a mat-button target=\"_blank\" href=\"{{notif.actionUrl}}\">\r\n {{notif.actionLabel}}\r\n </a>\r\n } @else if (notifIsMention(notif)) {\r\n You were mentioned by @{{notif.message?.user?.username}}\r\n <banta-live-message\r\n [message]=\"notif.message\"\r\n (upvoted)=\"upvoteMessage(notif.message)\"\r\n (reported)=\"reportMessage(notif.message)\"\r\n (selected)=\"goToMessage(notif.message)\">\r\n </banta-live-message>\r\n } @else if (notifIsReply(notif)) {\r\n @{{notif.replyMessage?.user?.username}} replied to your post\r\n <banta-live-message\r\n [message]=\"notif.replyMessage\"\r\n (upvoted)=\"upvoteMessage(notif.replyMessage)\"\r\n (reported)=\"reportMessage(notif.replyMessage)\"\r\n (selected)=\"goToMessage(notif.replyMessage)\">\r\n </banta-live-message>\r\n }\r\n </div>\r\n <banta-timestamp [value]=\"notif.sentAt\"></banta-timestamp>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n<div class=\"points\" [class.focus]=\"mobileFocus === 'points'\">\r\n <header>\r\n <div>\r\n <label>{{commentsLabel}}</label>\r\n </div>\r\n </header>\r\n <div class=\"point-focus\">\r\n <div class=\"actions\">\r\n <button mat-button (click)=\"pointUnfocus()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Back\r\n </button>\r\n\r\n <div class=\"spacer\"></div>\r\n\r\n @if (pointOpen) {\r\n <div class=\"counted-action\">\r\n <div class=\"count-indicator\">\r\n {{pointOpen.likes}}\r\n </div>\r\n <button mat-icon-button>\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!pointSubChat) {\r\n <div>\r\n Error: No subchat\r\n </div>\r\n }\r\n\r\n @if (pointSubChat) {\r\n <banta-comment-view\r\n class=\"subcomments\"\r\n [newestLast]=\"true\"\r\n [allowReplies]=\"false\"\r\n [source]=\"pointSubChat\"\r\n (reported)=\"reportMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n >\r\n @if (pointOpen) {\r\n <banta-comment\r\n class=\"focused-comment\"\r\n data-before\r\n [showReplyAction]=\"false\"\r\n [message]=\"pointOpen\"\r\n [readonly]=\"pointSubChat?.readonly\"\r\n (upvoted)=\"upvoteMessage(pointOpen)\"\r\n (userSelected)=\"showProfile(pointOpen.user)\"\r\n (reported)=\"reportMessage(pointOpen)\"\r\n ></banta-comment>\r\n }\r\n <div class=\"message reply\">\r\n Reply:\r\n <form class=\"new-message\" (submit)=\"sendPointSubMessage()\">\r\n <textarea\r\n name=\"message\"\r\n [(ngModel)]=\"newPointSubMessage.message\"></textarea>\r\n <div class=\"actions\">\r\n <button [disabled]=\"!newPointSubMessage.message\"\r\n mat-raised-button color=\"primary\">Send</button>\r\n </div>\r\n </form>\r\n </div>\r\n </banta-comment-view>\r\n }\r\n </div>\r\n <div class=\"points-section\">\r\n <banta-comments\r\n [source]=\"pointSource\"\r\n [allowServerInfoRequest]=\"allowServerInfoRequest\"\r\n (signInSelected)=\"showSignIn()\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (reported)=\"reportMessage($event)\"\r\n (selected)=\"goToMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n ></banta-comments>\r\n </div>\r\n</div>\r\n","import { Component } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-logo',\r\n template: `banta`,\r\n styles: [\r\n `\r\n :host {\r\n font-family: 'Odibee Sans', sans-serif;\r\n font-size: 40pt;\r\n }\r\n\r\n :host.small {\r\n font-size: 30pt;\r\n }\r\n `\r\n ],\r\n standalone: false\r\n})\r\nexport class BantaLogoComponent {\r\n\r\n}","import { NgModule } from \"@angular/core\";\r\nimport { ChatMessageComponent } from './chat-message/chat-message.component';\r\nimport { ChatViewComponent } from './chat-view/chat-view.component';\r\nimport { BantaChatComponent } from './banta-chat/banta-chat.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { EmojiModule } from '../emoji';\r\nimport { LiveChatMessageComponent } from './live-chat-message.component';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nconst COMPONENTS = [\r\n ChatMessageComponent,\r\n LiveChatMessageComponent,\r\n ChatViewComponent,\r\n BantaChatComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n EmojiModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class ChatModule {\r\n}","import { Component, Input, Output } from '@angular/core';\r\nimport { CommentsOrder } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n@Component({\r\n selector: 'banta-comment-sort',\r\n templateUrl: './comment-sort.component.html',\r\n styleUrls: ['./comment-sort.component.scss'],\r\n standalone: false\r\n})\r\nexport class CommentSortComponent {\r\n\r\n commentsOrder = CommentsOrder;\r\n private _sortChange = new Subject<CommentsOrder>();\r\n private _sort: CommentsOrder = CommentsOrder.LIKES;\r\n\r\n @Input() \r\n get sort() { \r\n return this._sort;\r\n }\r\n\r\n set sort(value) {\r\n if (this._sort !== value) {\r\n this._sort = value;\r\n setTimeout(() => this._sortChange.next(value));\r\n }\r\n }\r\n\r\n @Output()\r\n get sortChange() {\r\n return this._sortChange.asObservable();\r\n }\r\n}\r\n","<mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Sort</mat-label>\r\n <mat-select [(value)]=\"sort\" >\r\n <mat-option [value]=\"commentsOrder.NEWEST\">Newest</mat-option>\r\n <mat-option [value]=\"commentsOrder.OLDEST\">Oldest</mat-option>\r\n <mat-option [value]=\"commentsOrder.LIKES\">Likes</mat-option>\r\n </mat-select>\r\n</mat-form-field>","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { TextFieldModule } from '@angular/cdk/text-field';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSelectModule } from \"@angular/material/select\";\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { BantaCommonModule } from '../common';\r\nimport { EmojiModule } from '../emoji';\r\nimport { AttachmentButtonComponent } from './attachment-button/attachment-button.component';\r\nimport { AttachmentScraperDirective } from './attachment-scraper.directive';\r\nimport { BantaCommentsComponent } from './banta-comments/banta-comments.component';\r\nimport { CommentFieldComponent } from './comment-field/comment-field.component';\r\nimport { CommentSortComponent } from \"./comment-sort/comment-sort.component\";\r\nimport { CommentViewComponent } from './comment-view/comment-view.component';\r\nimport { CommentComponent } from './comment/comment.component';\r\nimport { LiveCommentComponent } from './live-comment.component';\r\nimport { BantaReplySendOptionsDirective } from './reply-send-options.directive';\r\nimport { BantaInlineRepliesDirective } from './inline-replies.directive';\r\n\r\nconst COMPONENTS = [\r\n CommentComponent,\r\n CommentViewComponent,\r\n BantaCommentsComponent,\r\n LiveCommentComponent,\r\n CommentFieldComponent,\r\n CommentSortComponent,\r\n AttachmentButtonComponent,\r\n BantaReplySendOptionsDirective,\r\n BantaInlineRepliesDirective,\r\n AttachmentScraperDirective\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n TextFieldModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatMenuModule,\r\n MatDividerModule,\r\n MatProgressSpinnerModule,\r\n BantaCommonModule,\r\n EmojiModule,\r\n MatTooltipModule,\r\n MatDatepickerModule,\r\n MatSelectModule,\r\n MatBadgeModule,\r\n MatRadioModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class CommentsModule {\r\n}\r\n","import { ChatMessage, ChatPermissions, CommentsOrder, DurableSocket, ServerInfo, User } from \"@banta/common\";\r\nimport { BehaviorSubject, Subject, Subscription } from \"rxjs\";\r\nimport { RpcEvent, SocketRPC } from \"@banta/common\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { ChatBackend } from \"./chat-backend\";\r\nimport { v4 as uuid } from \"uuid\";\r\nimport { ChatSourceOptions } from \"./chat-backend-base\";\r\n\r\nexport type SignInState = 'signed-out' | 'signed-in' | 'signing-in';\r\n\r\nexport interface PinOptions {\r\n until?: number;\r\n}\r\n\r\nexport class ChatSource extends SocketRPC implements ChatSourceBase {\r\n constructor(\r\n readonly backend: ChatBackend,\r\n readonly identifier: string,\r\n readonly parentIdentifier: string,\r\n options: ChatSourceOptions\r\n ) {\r\n super();\r\n this.options = options ?? {};\r\n this.ready = new Promise<void>(resolve => this.markReady = resolve);\r\n }\r\n\r\n private options: ChatSourceOptions;\r\n private subscription = new Subscription();\r\n private markReady: () => void;\r\n\r\n readonly = false;\r\n canLoadMore = true;\r\n\r\n ready: Promise<void>;\r\n\r\n permissions: ChatPermissions;\r\n private _state: 'connected' | 'connecting' | 'lost' | 'restored' = 'connecting';\r\n\r\n get sortOrder() {\r\n return this.options?.sortOrder;\r\n }\r\n\r\n get filterMode() {\r\n return this.options?.filterMode;\r\n }\r\n\r\n get state() {\r\n return this._state;\r\n }\r\n\r\n set state(value) {\r\n this._state = value;\r\n setTimeout(() => this._connectionStateChanged.next(this._state));\r\n }\r\n\r\n private _connectionStateChanged = new Subject<'connected' | 'connecting' | 'lost' | 'restored'>();\r\n private _connectionStateChanged$ = this._connectionStateChanged.asObservable();\r\n get connectionStateChanged() { return this._connectionStateChanged$; }\r\n\r\n private wasRestored = false;\r\n\r\n async bind(socket: DurableSocket): Promise<this> {\r\n super.bind(socket);\r\n\r\n this.subscription.add(this.backend.userChanged.subscribe(() => this.authenticate()));\r\n\r\n socket.addEventListener('open', async () => {\r\n console.log(`[Banta/${this.identifier}] Socket is open`);\r\n });\r\n\r\n socket.addEventListener('error', async () => {\r\n console.log(`[Banta/${this.identifier}] Socket error`);\r\n });\r\n\r\n socket.addEventListener('lost', async () => {\r\n this.state = 'lost';\r\n });\r\n\r\n socket.addEventListener('restore', async () => {\r\n this.wasRestored = true;\r\n await this.authenticate();\r\n await this.subscribeToTopic();\r\n });\r\n\r\n try {\r\n await this.subscribeToTopic();\r\n } catch (e) {\r\n console.error(`[Banta/ChatSource] Error during initial subscribeToTopic: ${e.message}`);\r\n }\r\n \r\n return this;\r\n }\r\n\r\n private mapOrUpdateMessages(messages: ChatMessage[]): ChatMessage[] {\r\n return messages.map(message => this.mapOrUpdateMessage(message));\r\n }\r\n\r\n private mapOrUpdateMessage(message: ChatMessage): ChatMessage {\r\n let existingMessage = this.messageMap.get(message.id);\r\n if (existingMessage) {\r\n message = Object.assign(existingMessage, message);\r\n } else {\r\n this.messageMap.set(message.id, message);\r\n this._messageObserved.next(message);\r\n }\r\n\r\n return message;\r\n }\r\n\r\n /**\r\n * Ask server for messages that have occurred since the message with the given ID.\r\n * This is used during brief reconnects to avoid dropping messages, while also not \r\n * causing mobbing as everyone reconnects after an issue. The backend can choose to \r\n * not service this request, instead returning undefined. In that case, the client \r\n * is expected to fetch the existing messages and start state anew.\r\n * \r\n * TODO: this is not yet used\r\n * \r\n * @param id \r\n * @returns \r\n */\r\n async loadSince(id: string): Promise<ChatMessage[]> {\r\n try {\r\n let messages = await this.idempotentPeer.loadSince(id);\r\n if (messages) {\r\n messages = this.mapOrUpdateMessages(messages);\r\n }\r\n\r\n return messages;\r\n } catch (e) {\r\n console.error(`[Banta/${this.identifier}] Error occurred while trying to get existing messages:`);\r\n console.error(e);\r\n return [];\r\n }\r\n }\r\n\r\n async getExistingMessages(): Promise<ChatMessage[]> {\r\n try {\r\n let messages = await this.idempotentPeer.getExistingMessages(this.options.initialMessageCount ?? 20);\r\n messages = this.mapOrUpdateMessages(messages);\r\n return messages;\r\n } catch (e) {\r\n console.error(`[Banta/${this.identifier}] Error occurred while trying to get existing messages:`);\r\n console.error(e);\r\n return [];\r\n }\r\n }\r\n \r\n async getPinnedMessages(): Promise<ChatMessage[]> {\r\n try {\r\n let messages = await this.idempotentPeer.getPinnedMessages();\r\n messages = this.mapOrUpdateMessages(messages);\r\n return messages;\r\n } catch (e) {\r\n console.error(`[Banta/${this.identifier}] Error occurred while trying to get pinned messages:`);\r\n console.error(e);\r\n return [];\r\n }\r\n }\r\n\r\n private async ensureConnection(errorMessage?: string) {\r\n // let reason = `Connection to chat services is not currently available.`;\r\n // if (this.state !== 'connected' && this.state !== 'restored') {\r\n // if (errorMessage)\r\n // throw new Error(`${errorMessage}: ${reason}`);\r\n // else\r\n // throw new Error(`${reason}`);\r\n // }\r\n }\r\n\r\n async editMessage(messageId: string, text: string): Promise<void> {\r\n await this.ensureConnection();\r\n await this.peer.editMessage(messageId, text);\r\n }\r\n\r\n private subscribeAttempt = 0;\r\n private _errorState: string;\r\n\r\n get errorState() {\r\n return this._errorState;\r\n }\r\n\r\n async subscribeToTopic() {\r\n try {\r\n await this.immediatePeer.subscribe(\r\n this.identifier, this.parentIdentifier, this.options.sortOrder, \r\n this.options.filterMode,\r\n this.options.metadata ?? {}\r\n );\r\n this.subscribeAttempt = 0;\r\n this._errorState = undefined;\r\n this.state = this.wasRestored ? 'restored' : 'connected';\r\n this.markReady();\r\n\r\n } catch (e) {\r\n console.error(`[Banta/${this.identifier}] Error while subscribing to topic`);\r\n console.error(e);\r\n\r\n this.state = 'lost';\r\n this._errorState = 'server-issue';\r\n\r\n this.subscribeAttempt += 1;\r\n let delay = Math.min(30*1000, (3*1000 * this.subscribeAttempt) * (1 + Math.random()));\r\n console.error(`[Banta/${this.identifier}] Waiting ${delay}ms before attempting to reconnect...`);\r\n\r\n setTimeout(() => {\r\n if (this.state === 'lost') {\r\n console.info(`Attempting reconnection after error in subscribeToTopic...`);\r\n this.reconnect();\r\n }\r\n }, delay);\r\n\r\n throw e;\r\n }\r\n }\r\n\r\n private _signInState: SignInState = 'signed-out';\r\n private _signInStateChanged = new BehaviorSubject<SignInState>(this._signInState);\r\n private _signInStateChanged$ = this._signInStateChanged.asObservable();\r\n\r\n get signInState() { return this._signInState; }\r\n get signInStateChanged() { return this._signInStateChanged$; }\r\n\r\n private setSignInState(state: SignInState) {\r\n this._signInState = state;\r\n this._signInStateChanged.next(state);\r\n }\r\n async authenticate() {\r\n this.setSignInState('signing-in');\r\n if (this.backend.user) {\r\n try {\r\n await this.immediatePeer.authenticate(this.backend.user?.token);\r\n this.setSignInState('signed-in');\r\n } catch (e) {\r\n console.error(`[Banta] Could not authenticate:`);\r\n console.error(e);\r\n this.setSignInState('signed-out');\r\n }\r\n }\r\n }\r\n\r\n close(): void {\r\n super.close();\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n @RpcEvent()\r\n onPermissions(permissions: ChatPermissions) {\r\n (window as any).bantaPermissionsDebug = permissions;\r\n this.permissions = permissions;\r\n }\r\n\r\n @RpcEvent()\r\n onChatMessage(message: ChatMessage) {\r\n if (this.messageMap.has(message.id)) {\r\n message = this.mapOrUpdateMessage(message);\r\n this._messageUpdated.next(message);\r\n } else if (!message.hidden) {\r\n // Only process non-hidden messages through here. \r\n // Hidden messages may be sent to us when they become hidden (ie moderation is occurring).\r\n // But if we never had the message to begin with, we should discard it.\r\n this.messageMap.set(message.id, message);\r\n this._messageReceived.next(message);\r\n }\r\n }\r\n\r\n private messageMap = new Map<string, ChatMessage>();\r\n private _messageReceived = new Subject<ChatMessage>();\r\n private _messageUpdated = new Subject<ChatMessage>();\r\n private _messageSent = new Subject<ChatMessage>();\r\n private _messageObserved = new Subject<ChatMessage>();\r\n\r\n get messageReceived() { return this._messageReceived.asObservable(); }\r\n get messageUpdated() { return this._messageUpdated.asObservable(); }\r\n get messageSent() { return this._messageSent.asObservable(); }\r\n get messageObserved() { return this._messageObserved.asObservable(); }\r\n\r\n messages: ChatMessage[] = [];\r\n\r\n async getServerInfo(): Promise<ServerInfo> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.getServerInfo();\r\n }\r\n\r\n async send(message: ChatMessage): Promise<ChatMessage> {\r\n await this.ensureConnection();\r\n message.id ??= uuid();\r\n let finishedMessage = await this.idempotentPeer.sendMessage(message);\r\n\r\n return finishedMessage;\r\n }\r\n\r\n async loadAfter(message: ChatMessage, count: number): Promise<ChatMessage[]> {\r\n if (!message)\r\n return;\r\n\r\n if (!message.pagingCursor)\r\n return [];\r\n \r\n return this.mapOrUpdateMessages(\r\n await this.idempotentPeer.loadAfter(Number(message.pagingCursor), count)\r\n );\r\n }\r\n\r\n async get(id: string): Promise<ChatMessage> {\r\n if (this.messageMap.has(id))\r\n return this.messageMap.get(id);\r\n \r\n await this.ensureConnection(`Could not get message`);\r\n let message = await this.idempotentPeer.getMessage(id);\r\n\r\n if (this.messageMap.has(id)) {\r\n let existingMessage = this.messageMap.get(id);\r\n Object.assign(existingMessage, message);\r\n message = existingMessage;\r\n } else {\r\n this.messageMap.set(id, message);\r\n }\r\n\r\n return message;\r\n }\r\n\r\n async getCount(): Promise<number> {\r\n return await this.idempotentPeer.getCount();\r\n }\r\n\r\n async likeMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.likeMessage(messageId);\r\n }\r\n\r\n async pinMessage(messageId: string, options?: PinOptions): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.pinMessage(messageId, options);\r\n }\r\n\r\n async unpinMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.unpinMessage(messageId);\r\n }\r\n\r\n\r\n async unlikeMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.unlikeMessage(messageId);\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.deleteMessage(messageId);\r\n }\r\n\r\n}","import { ChatMessage, ChatPermissions, CommentsOrder, FilterMode, ServerInfo } from \"@banta/common\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { ChatBackend } from \"./chat-backend\";\r\nimport { ChatSourceOptions } from \"./chat-backend-base\";\r\n\r\n/**\r\n * A special ChatSource which uses the REST API to load a limited number of chat messages, and does not support \r\n * sending/editing/deleting messages, liking/unliking, or loading more messages.\r\n * \r\n * This is used within Banta's SSR support.\r\n */\r\nexport class StaticChatSource implements ChatSourceBase {\r\n constructor(\r\n private backend: ChatBackend, \r\n readonly identifier: string,\r\n readonly parentIdentifier?: string,\r\n options?: ChatSourceOptions\r\n ) {\r\n \r\n this.sortOrder = options?.sortOrder ?? CommentsOrder.NEWEST;\r\n this.filterMode = options?.filterMode ?? FilterMode.ALL;\r\n this.initialMessageCount = options?.initialMessageCount ?? 100;\r\n }\r\n\r\n initialMessageCount: number;\r\n sortOrder: CommentsOrder;\r\n filterMode: FilterMode;\r\n permissions: ChatPermissions; // TODO\r\n\r\n ready = Promise.resolve(); // TODO: should we do more than this?\r\n readonly = true;\r\n canLoadMore = false;\r\n\r\n messageReceived = new Subject<ChatMessage>();\r\n messageObserved = new Subject<ChatMessage>();\r\n messageUpdated = new Subject<ChatMessage>();\r\n messageSent = new Subject<ChatMessage>();\r\n\r\n messages: ChatMessage[] = [];\r\n\r\n async getServerInfo(): Promise<ServerInfo> {\r\n return {\r\n service: '@banta/static-chat-source',\r\n connections: 0,\r\n originId: '',\r\n serverId: '',\r\n cache: {\r\n topicCount: 0,\r\n messageCount: 0,\r\n topics: {}\r\n }\r\n };\r\n }\r\n\r\n async send(message: ChatMessage): Promise<ChatMessage> {\r\n throw new Error(`Cannot send a message in this state.`);\r\n }\r\n\r\n close() {\r\n // no op\r\n }\r\n\r\n async getCount() {\r\n if (this.parentIdentifier) {\r\n // TODO: We need a getReplyCount or something\r\n return 0;\r\n }\r\n\r\n this.backend.getSourceCountForTopic(this.identifier);\r\n }\r\n \r\n async loadSince(id: string) {\r\n return undefined;\r\n }\r\n\r\n async getExistingMessages() {\r\n if (this.parentIdentifier) {\r\n return await this.backend.getReplies(this.parentIdentifier, this.sortOrder, this.filterMode, 0, this.initialMessageCount);\r\n } else {\r\n return await this.backend.getMessages(this.identifier, this.sortOrder, this.filterMode, 0, this.initialMessageCount);\r\n }\r\n }\r\n\r\n async getPinnedMessages(): Promise<ChatMessage[]> {\r\n if (this.parentIdentifier) {\r\n return await this.backend.getReplies(this.parentIdentifier, this.sortOrder, this.filterMode, 0, this.initialMessageCount, true);\r\n } else {\r\n return await this.backend.getMessages(this.identifier, this.sortOrder, this.filterMode, 0, this.initialMessageCount, true);\r\n }\r\n }\r\n\r\n async loadAfter(message: ChatMessage, count: number): Promise<ChatMessage[]> {\r\n return []; // no op\r\n }\r\n\r\n async get(id: string) {\r\n return await this.backend.getMessage(this.identifier, id);\r\n }\r\n\r\n async likeMessage(messageId: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n async unlikeMessage(messageId: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n pinMessage(messageId: string, options?: { until?: number; }): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n unpinMessage(messageId: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n async editMessage(messageId: string, text: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n connectionStateChanged = new Subject<'connected' | 'connecting' | 'lost' | 'restored'>();\r\n state : 'connecting' | 'connected' | 'lost' | 'restored' = 'connected';\r\n\r\n get errorState() {\r\n return undefined;\r\n }\r\n}","import { inject, Inject, Injectable } from \"@angular/core\";\r\nimport { ChatMessage, CommentsOrder, DurableSocket, FilterMode, Notification, Topic, UrlCard, User, Vote, buildQuery } from \"@banta/common\";\r\nimport { Observable } from \"rxjs\";\r\nimport { ChatBackendBase, ChatSourceOptions } from \"./chat-backend-base\";\r\nimport { ChatSource } from \"./chat-source\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { BANTA_SDK_OPTIONS, SdkOptions } from \"./sdk-options\";\r\nimport { PLATFORM_ID } from \"@angular/core\";\r\nimport { isPlatformServer } from \"@angular/common\";\r\nimport { StaticChatSource } from \"./static-chat-source\";\r\nimport { v4 as uuid } from 'uuid';\r\n\r\n@Injectable()\r\nexport class ChatBackend extends ChatBackendBase {\r\n private options = inject(BANTA_SDK_OPTIONS);\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n runId = uuid();\r\n\r\n get serviceUrl() {\r\n return `${this.options?.serviceUrl ?? 'http://localhost:3422'}`;\r\n }\r\n\r\n private async connectToService() {\r\n let deviceId = uuid();\r\n if (typeof localStorage !== 'undefined') {\r\n if (localStorage['banta-chat:deviceId']) {\r\n deviceId = localStorage['banta-chat:deviceId'];\r\n } else {\r\n localStorage['banta-chat:deviceId'] = deviceId;\r\n }\r\n }\r\n\r\n let socket = new DurableSocket(`${this.serviceUrl.replace(/^http/, 'ws')}/socket`, undefined, `${deviceId},${this.runId}`);\r\n await new Promise<void>((resolve, reject) => {\r\n socket.onopen = () => {\r\n resolve();\r\n }\r\n\r\n socket.onclose = e => {\r\n if (e.code === 503) {\r\n console.error(`Failed to connect to chat service!`);\r\n reject(e);\r\n }\r\n }\r\n });\r\n\r\n socket.onerror = undefined;\r\n\r\n return socket;\r\n }\r\n\r\n private isServer() {\r\n if (typeof localStorage !== 'undefined' && localStorage['banta:debug:useStaticSource'] === '1')\r\n return true;\r\n\r\n return isPlatformServer(this.platformId);\r\n }\r\n\r\n /**\r\n * Check if we are currently running inside a Googlebot user agent or via the Google inspection tool in Search Console.\r\n * We'll use this to avoid WebSockets so that comments can be indexable.\r\n * @returns \r\n */\r\n private isGooglebot() {\r\n return typeof navigator !== 'undefined' && (\r\n navigator.userAgent.includes('Googlebot')\r\n || navigator.userAgent.includes('Google-InspectionTool')\r\n );\r\n }\r\n\r\n async getSourceForTopic(topicId: string, options?: ChatSourceOptions): Promise<ChatSourceBase> {\r\n // In some cases we need to do a single REST request to fetch the messages \r\n // and not use Banta's socket RPC since the open ended lifetime of a WebSocket connection \r\n // does not match the use case.\r\n // - When running in SSR\r\n // - When running in Googlebot (Googlebot also doesn't support WebSockets anyway)\r\n\r\n if (this.isServer() || this.isGooglebot()) {\r\n return new StaticChatSource(this, topicId, undefined, options);\r\n } else {\r\n return await new ChatSource(this, topicId, undefined, { sortOrder: CommentsOrder.NEWEST, filterMode: FilterMode.ALL, ...options })\r\n .bind(await this.connectToService());\r\n }\r\n }\r\n\r\n async getSourceForThread(topicId: string, messageId: string, options?: ChatSourceOptions): Promise<ChatSourceBase> {\r\n // When running on the server platform, we're just going to do a single REST request to fetch the messages \r\n // and not use Banta's socket RPC.\r\n \r\n if (this.isServer()) {\r\n return new StaticChatSource(this, topicId, messageId, options);\r\n } else {\r\n return await new ChatSource(this, topicId, messageId, { sortOrder: CommentsOrder.NEWEST, filterMode: FilterMode.ALL, ...options })\r\n .bind(await this.connectToService());\r\n }\r\n }\r\n\r\n /**\r\n * Get the count of the given topic\r\n * @param topicId \r\n * @returns \r\n */\r\n async getSourceCountForTopic(topicId: string): Promise<number> {\r\n try {\r\n let topic = await this.getTopic(topicId);\r\n return topic?.messageCount ?? 0;\r\n } catch (e) {\r\n console.error(`[Banta/${topicId}] Failed to get message count for topic:`);\r\n console.error(e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Get the count of the given topics. \r\n * @param topicId Topics to count messages on. Maximum of 1000.\r\n * @returns \r\n */\r\n async getSourceCountForTopics(topicIds: string[]): Promise<Record<string, number>> {\r\n try {\r\n let topics = await this.getTopicsById(topicIds);\r\n return Object.fromEntries(topics.map(topic => [ topic.id, topic.messageCount ?? 0 ]));\r\n } catch (e) {\r\n console.error(`[Banta/Topics] Failed to get message count for topics '${topicIds.join(',')}]':`);\r\n console.error(e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Get information about the given topic. \r\n * @param topicId \r\n * @returns The topic object, or undefined if no such topic was found.\r\n */\r\n async getTopic(topicId: string): Promise<Topic | undefined> {\r\n let response = await fetch(`${this.serviceUrl}/topics/${topicId}`)\r\n if (response.status === 404)\r\n return undefined;\r\n if (response.status >= 400)\r\n throw new Error(`Failed to fetch topic: ${response.status}`)\r\n\r\n return <Topic> await response.json();\r\n }\r\n\r\n /**\r\n * Get information about the given topics\r\n * @param topicIds The topic IDs to look up. Maximum of 1000.\r\n * @returns An array of matching topic objects.\r\n */\r\n async getTopicsById(topicIds: string[]): Promise<Topic[]> {\r\n if (topicIds.length > 1000)\r\n throw new Error(`Cannot look up more than 1000 topics at a time.`);\r\n\r\n let response = await fetch(`${this.serviceUrl}/topics?ids=${encodeURIComponent(topicIds.join(','))}`)\r\n if (response.status >= 400)\r\n throw new Error(`Failed to fetch topic: ${response.status}`)\r\n\r\n return <Topic[]> await response.json();\r\n }\r\n\r\n /**\r\n * Get a set of messages from the given topic.\r\n * @param topicId \r\n * @returns \r\n */\r\n async getMessages(\r\n topicId: string, \r\n sort?: CommentsOrder, \r\n filter?: FilterMode, \r\n offset?: number, \r\n limit?: number,\r\n pinned?: boolean\r\n ): Promise<ChatMessage[]> {\r\n let response = await fetch(\r\n `${this.serviceUrl}/topics/${topicId}/messages?${ buildQuery({ sort, filter, offset, limit, pinned }) }`\r\n );\r\n\r\n if (response.status >= 400)\r\n throw new Error(`Failed to fetch messages for topic: ${response.status}`)\r\n\r\n return <ChatMessage[]> await response.json();\r\n }\r\n\r\n /**\r\n * Get a set of messages from the given topic.\r\n * @param topicId \r\n * @returns \r\n */\r\n async getReplies(\r\n parentMessageId: string,\r\n sort?: CommentsOrder, \r\n filter?: FilterMode, \r\n offset?: number, \r\n limit?: number,\r\n pinned?: boolean\r\n ): Promise<ChatMessage[]> {\r\n let response = await fetch(\r\n `${this.serviceUrl}/messages/${parentMessageId}/replies?${ buildQuery({ sort, filter, offset, limit, pinned }) }`\r\n );\r\n\r\n if (response.status >= 400)\r\n throw new Error(`Failed to fetch replies: ${response.status}`)\r\n\r\n return <ChatMessage[]> await response.json();\r\n }\r\n\r\n refreshMessage(message: ChatMessage): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n \r\n getMessage(topicId: string, messageId: string): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n getSubMessage(topicId: string, parentMessageId: string, messageId: string): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n watchMessage(message: ChatMessage, handler: (message: ChatMessage) => void): () => void {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n notificationsChanged: Observable<Notification[]>;\r\n newNotification: Observable<Notification>;\r\n \r\n async getCardForUrl(url: string): Promise<UrlCard> {\r\n let response = await fetch(`${this.serviceUrl}/urls`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({\r\n url\r\n })\r\n });\r\n\r\n if (response.status == 404)\r\n return null;\r\n \r\n if (response.status >= 400)\r\n throw new Error(`Failed to retrieve URL card: ${response.status}. Body: '${await response.text()}'`);\r\n\r\n return await response.json();\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver, AttachmentScraper } from \"./attachment-scraper\";\r\nimport { ChatBackendBase } from \"./chat-backend-base\";\r\n\r\nconst URL_REGEX = new RegExp('(?!mailto:)(?:(?:http|https|ftp)://)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?', 'ig');\r\n\r\nexport class UrlAttachmentScraper implements AttachmentScraper {\r\n findFragments(message: ChatMessage): AttachmentFragment[] {\r\n // If a message already has a URL attachment, don't add another one.\r\n if (message.attachments && message.attachments.filter(x => x.type === 'url').length > 0)\r\n return null;\r\n\r\n return (Array.from(message.message.match(URL_REGEX) ?? []))\r\n .reduce((a, item) => (a.includes(item) ? undefined : a.push(item), a), [])\r\n .map(url => ({\r\n text: url, \r\n offset: message.message.indexOf(url),\r\n type: 'url'\r\n }))\r\n ;\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class UrlAttachmentResolver implements AttachmentResolver {\r\n constructor(private backend: ChatBackendBase) {\r\n }\r\n\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type !== 'url')\r\n return null;\r\n\r\n let urlCard = await this.backend.getCardForUrl(fragment.text);\r\n if (urlCard) {\r\n return {\r\n type: 'card',\r\n url: fragment.text,\r\n card: urlCard,\r\n style: 'block'\r\n }\r\n }\r\n }\r\n\r\n}","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class YouTubeAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type !== 'url')\r\n return null;\r\n\r\n let videoId: string;\r\n\r\n // https://youtu.be/jXzJ7FlqX6M\r\n\r\n if (fragment.text.match(/^https:\\/\\/youtu\\.be\\//)) {\r\n let match = /^https:\\/\\/youtu\\.be\\/([^\\/]+)/.exec(fragment.text);\r\n if (match) {\r\n videoId = match[1];\r\n }\r\n }\r\n\r\n if (!videoId && fragment.text.match(/^https?:\\/\\/(www\\.|m\\.)?youtube.com\\/watch\\?v=/)) {\r\n let match = /watch\\?v=([^&]+)/.exec(fragment.text);\r\n if (match) {\r\n videoId = match[1];\r\n }\r\n }\r\n\r\n if (videoId) {\r\n return {\r\n type: 'iframe',\r\n url: `https://www.youtube.com/embed/${videoId}`,\r\n style: 'block'\r\n };\r\n }\r\n return null;\r\n }\r\n}\r\n","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class GiphyAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type === 'url' && fragment.text.startsWith('https://giphy.com/gifs')) {\r\n let gifId = /[^-\\/]+$/.exec(fragment.text)?.toString();\r\n if (!gifId)\r\n return null;\r\n\r\n return {\r\n type: 'iframe',\r\n url: `https://giphy.com/embed/${gifId}`,\r\n style: 'inline'\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n}","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class TweetAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type === 'url' && (fragment.text.startsWith('https://twitter.com/') || fragment.text.startsWith('https://x.com/'))) {\r\n return {\r\n type: 'tweet',\r\n url: fragment.text,\r\n style: 'block'\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n}","import { inject, ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { CommentsModule } from './comments';\r\nimport { ChatModule } from './chat';\r\nimport { EmojiModule } from './emoji';\r\nimport { BantaComponent } from './banta/banta.component';\r\nimport { BantaLogoComponent } from './banta-logo.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BantaCommonModule } from './common/common.module';\r\nimport { LiveMessageComponent } from './live-message.component';\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { MatMenuModule } from \"@angular/material/menu\";\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatSnackBarModule } from \"@angular/material/snack-bar\";\r\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\r\nimport { ChatBackend } from './chat-backend';\r\nimport { SdkOptions } from './sdk-options';\r\nimport { BANTA_SDK_OPTIONS } from './sdk-options';\r\nimport { ChatBackendBase } from './chat-backend-base';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { UrlAttachmentResolver, UrlAttachmentScraper } from './url-attachments';\r\nimport { YouTubeAttachmentResolver } from './youtube-attachments';\r\nimport { GiphyAttachmentResolver } from './giphy-attachments';\r\nimport { TweetAttachmentResolver } from './tweet-attachments';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n BantaCommonModule.forRoot(),\r\n CommentsModule,\r\n ChatModule,\r\n EmojiModule,\r\n \r\n MatIconModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatMenuModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatProgressSpinnerModule,\r\n MatSnackBarModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n declarations: [\r\n BantaComponent,\r\n BantaLogoComponent,\r\n LiveMessageComponent\r\n ],\r\n exports: [\r\n BantaComponent,\r\n BantaLogoComponent,\r\n LiveMessageComponent,\r\n BantaCommonModule,\r\n ChatModule,\r\n CommentsModule,\r\n EmojiModule\r\n ]\r\n})\r\nexport class BantaSdkModule {\r\n chatBackend = inject(ChatBackendBase);\r\n\r\n constructor() {\r\n this.chatBackend.registerAttachmentScraper(new UrlAttachmentScraper());\r\n this.chatBackend.registerAttachmentResolver(new GiphyAttachmentResolver());\r\n this.chatBackend.registerAttachmentResolver(new YouTubeAttachmentResolver());\r\n this.chatBackend.registerAttachmentResolver(new TweetAttachmentResolver());\r\n this.chatBackend.registerAttachmentResolver(new UrlAttachmentResolver(this.chatBackend));\r\n }\r\n \r\n static configure(options?: SdkOptions): ModuleWithProviders<BantaSdkModule> {\r\n return {\r\n ngModule: BantaSdkModule,\r\n providers: [\r\n { \r\n provide: BANTA_SDK_OPTIONS, \r\n useValue: options || {}\r\n },\r\n { provide: ChatBackendBase, useClass: options?.backendClass ?? ChatBackend }\r\n ]\r\n }\r\n }\r\n}","/*\n * Public API Surface of sdk\n */\n\nexport * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TimerPool","i1","i2","i3","i4","i5.BantaTrustResourceUrlPipe","i1.LightboxComponent","i2.BantaAttachmentComponent","COMPONENTS","i5.EmojiSelectorPanelComponent","i5","i6","i7","i9.TimestampComponent","i10.BantaAttachmentsComponent","i14","i15.BantaMarkdownToHtmlPipe","i16.BantaMentionLinkerPipe","i1.ChatBackendBase","i7.CommentComponent","i9.BantaAttachmentsComponent","i10.EmojiSelectorButtonComponent","i12.AttachmentButtonComponent","i13.AttachmentScraperDirective","i9","i10.CommentComponent","i11.CommentViewComponent","i12.CommentFieldComponent","i13.BantaInlineRepliesDirective","i2.ChatMessageComponent","i4.EmojiSelectorButtonComponent","i5.ChatViewComponent","i2.CommentComponent","i1.LiveCommentComponent","i2.LiveChatMessageComponent","i4.TimestampComponent","i5.CommentComponent","i6.CommentViewComponent","i7.BantaCommentsComponent","i8.BantaChatComponent","i10","i11","i12.LiveMessageComponent","uuid","Injectable"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQM,SAAU,cAAc,CAAI,OAAkC,EAAA;AAEhE,IAAA,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,IAAG;AAChC,QAAA,IAAI,OAAO,GAAG,IAAI,OAAO,EAAK;QAC9B,IAAI,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;AAE9C,QAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;AACtB,QAAA,OAAO,MAAK;YACR,YAAY,CAAC,WAAW,EAAE;YAC1B,OAAO,CAAC,IAAI,EAAE;AAClB,QAAA,CAAC;AACL,IAAA,CAAC,CAAC;IAEF,OAAkC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAE,CAAC,QAAQ,EAAE;AACrE;;ACfA;;;;;;AAMG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAS,CAAA;AAAf,IAAA,WAAA,GAAA;AACK,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAsB;AAG7C,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,GAAG,EAAkB;AAG5C,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,GAAG,EAAkB;IAmF5D;IAjFI,QAAQ,CAAC,QAAgB,EAAE,QAAoB,EAAA;AAC3C,QAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,0CAA0C,QAAQ,CAAA,CAAA,CAAG,CAAC;AACnE,YAAA,OAAO,MAAK,EAAE,CAAC;QACnB;AAEA,QAAA,IAAI,KAAiB;AACrB,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI;QAErC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AACnC,YAAA,KAAK,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE;AAC3B,YAAA,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,MAAK;AAC5B,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,4BAAA,EAA+B,KAAK,CAAC,WAAW,CAAC,MAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,GAAA,CAAK,CAAC;AAC7F,gBAAA,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YAC3C,CAAC,EAAE,QAAQ,CAAC;YACZ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC3C;aAAO;YACH,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5C;AAEA,QAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;;;QAKhC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;YACpC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEnF,QAAA,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC;AACzC,QAAA,IAAI,CAAC,sBAAsB,GAAG,UAAU,CAAC,MAAK;YAC1C,KAAK,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACjD,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,kBAAA,EAAqB,KAAK,CAAA,sBAAA,EAAyB,QAAQ,CAAA,IAAA,EAAO,KAAK,CAAC,WAAW,CAAC,MAAM,CAAA,OAAA,CAAS,CAAC;YACtH;AAEA,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACjC,QAAA,CAAC,CAAC;;;AAKF,QAAA,IAAI,OAAO,KAAK,CAAC,EAAE;AACf,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,iCAAA,CAAmC,CAAC;QACtD;;AAIA,QAAA,OAAO,MAAK;YACR,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5C,YAAA,IAAI,CAAC,KAAK;gBACN;YAEJ,IAAI,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC/C,IAAI,KAAK,IAAI,CAAC;gBACV,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAEtC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,gBAAA,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;AAC3B,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;YACvC;YAEA,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACxC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;AAI3F,YAAA,YAAY,CAAC,IAAI,CAAC,0BAA0B,CAAC;AAC7C,YAAA,IAAI,CAAC,0BAA0B,GAAG,UAAU,CAAC,MAAK;gBAC9C,KAAK,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE;oBACrD,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5C,oBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,kBAAA,EAAqB,KAAK,sBAAsB,QAAQ,CAAA,IAAA,EAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC,CAAA,QAAA,CAAU,CAAC;gBAC3H;AAEA,gBAAA,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC;AAC7B,oBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,gEAAA,CAAkE,CAAC;AAErF,gBAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;AACrC,YAAA,CAAC,CAAC;AACN,QAAA,CAAC;IACL;;AAzFS,SAAS,GAAA,UAAA,CAAA;AADrB,IAAA,UAAU;AACE,CAAA,EAAA,SAAS,CA0FrB;;MCrFY,kBAAkB,CAAA;AAC3B,IAAA,WAAA,CACY,SAAoB,EAAA;QAApB,IAAA,CAAA,SAAS,GAAT,SAAS;QAKrB,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,OAAO,GAAG,EAAE;QAGJ,IAAA,CAAA,aAAa,GAAW,CAAC;QAEzB,IAAA,CAAA,UAAU,GAAG,KAAK;QAa1B,IAAA,CAAA,YAAY,GAAG,KAAK;IAtBpB;IAWA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,gBAAgB,IAAI;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;IACrC;AAEA,IAAA,IACI,KAAK,GAAA;QACL,OAAO,IAAI,CAAC,MAAM;IACtB;IAIA,MAAM,GAAA;QACF,IAAI,IAAI,CAAC,UAAU;YACf;AAEJ,QAAA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACpB,QAAA,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK;AAC3B,QAAA,IAAI,MAAM,GAAG,IAAI,GAAC,EAAE;AACpB,QAAA,IAAI,IAAI,GAAG,MAAM,GAAG,EAAE;AACtB,QAAA,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE;AACnB,QAAA,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC;AAClB,QAAA,IAAI,KAAK,GAAG,GAAG,GAAG,EAAE;AACpB,QAAA,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG;AACpB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QACzB,IAAI,UAAU,GAAG,CAAC;AAElB,QAAA,IAAI,IAAI,GAAG,IAAI,EAAE;AACb,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;YACrB;QACJ;AAEA,QAAA,IAAI,IAAI,GAAG,KAAK,EAAE;YACd,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;YAErC,IAAI,MAAM,KAAK,CAAC;AACZ,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,MAAM,YAAY;;AAErC,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,MAAM,aAAa;QAE9C;AAAO,aAAA,IAAI,IAAI,GAAG,IAAI,EAAE;YACpB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;YAEnC,IAAI,KAAK,KAAK,CAAC;AACX,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,KAAK,WAAW;;AAEnC,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,KAAK,YAAY;QAC5C;AAAO,aAAA,IAAI,IAAI,GAAG,GAAG,EAAE;YACnB,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;YACjC,IAAI,IAAI,KAAK,CAAC;AACV,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,UAAU;;AAEjC,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,WAAW;QAC1C;AAAO,aAAA,IAAI,IAAI,GAAG,IAAI,EAAE;YACpB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;YACnC,IAAI,KAAK,KAAK,CAAC;AACX,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,KAAK,WAAW;;AAEnC,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,KAAK,YAAY;AAExC,YAAA,UAAU,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE;QAC/B;AAAO,aAAA,IAAI,IAAI,GAAG,MAAM,EAAE;YACtB,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;YACvC,IAAI,OAAO,KAAK,CAAC;AACb,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,OAAO,aAAa;;AAEvC,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,OAAO,cAAc;AAC5C,YAAA,UAAU,GAAG,IAAI,GAAG,EAAE;QAC1B;AAAO,aAAA,IAAI,IAAI,GAAG,MAAM,EAAE;AACtB,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,kBAAA,CAAoB;AACpC,YAAA,UAAU,GAAG,IAAI,GAAG,EAAE;QAC1B;aAAO;AACH,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,QAAA,CAAU;AAC1B,YAAA,UAAU,GAAG,IAAI,GAAG,EAAE;QAC1B;AAEA,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAC/B,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,UAAU,EAAE;AACnC,gBAAA,IAAI,CAAC,aAAa,GAAG,UAAU;AAC/B,gBAAA,IAAI,CAAC,gBAAgB,IAAI;AACzB,gBAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAChB,oBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpF;YACJ;QACJ;IACJ;IAEA,IAAI,KAAK,CAAC,CAAC,EAAA;AACP,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACnB,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC;YACf,IAAI,CAAC,MAAM,EAAE;QACjB;IACJ;+GA7GS,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAfjB,CAAA;;;;;;;;;;;AAWL,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAII,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAjB9B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,QAAA,EACjB,CAAA;;;;;;;;;;;AAWL,QAAA,CAAA,EAAA,UAAA,EAEO,KAAK,EAAA;;sBAuBhB;;;MCjCQ,iBAAiB,CAAA;IAI1B,eAAe,GAAA;AACX,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YAC/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;QAClE;IACJ;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,MAAM,EAAE;IAChD;IAOA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;IACvB;IAEA,IAAI,CAAC,YAAoB,EAAE,MAAgB,EAAA;AACvC,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;IACtB;+GA3BS,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,0LCR9B,sXAcA,EAAA,MAAA,EAAA,CAAA,gkBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDNa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cAGd,KAAK,EAAA,QAAA,EAAA,sXAAA,EAAA,MAAA,EAAA,CAAA,gkBAAA,CAAA,EAAA;;sBAGhB,SAAS;uBAAC,WAAW;;;MEAb,iBAAiB,GAAG,IAAI,cAAc,CAAa,mBAAmB;;ACAnF,MAAM,SAAS,GAAG;AACd,IAAA,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,QAAQ;AACf,IAAA,KAAK,CAAC,GAAG,EAAA,EAAI,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAA;AACjB,QAAA,MAAM,IAAI,GAAG,gBAAgB,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5B,IAAI,KAAK,EAAE;YACP,OAAO;gBACH,IAAI,EAAE,WAAW;AACjB,gBAAA,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AACb,gBAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACjD;QACL;IACJ,CAAC;AACD,IAAA,QAAQ,CAAC,KAAK,EAAA;AACV,QAAA,OAAO,CAAA,GAAA,EAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA,IAAA,CAAM;IAC1D;CACH;AAED,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;IACd,UAAU,EAAE,CAAC,SAAS;AACzB,CAAA,CAAC;MAMW,uBAAuB,CAAA;AAIhC,IAAA,WAAA,GAAA;AAHQ,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;QAChC,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAG9D,IAAI,CAAC,QAAQ,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE;AACrC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;AACvC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,IAAG;AACzB,YAAA,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;YACpD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,wDAAwD,CAAC;AACzF,QAAA,CAAC;IACL;AAEH,IAAA,IAAY,QAAQ,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ,IAAI,4DAA4D;IACjG;AAGG,IAAA,SAAS,CAAC,KAAa,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK;AACN,YAAA,OAAO,EAAE;AAEb,QAAA,IAAI,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC;;;AAItC,QAAA,QAAQ,CAAC,OAAO,CAAC,yBAAyB,EAAE,UAAS,IAAuC,EAAA;;AAExF,YAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AAClB,gBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAC,QAAQ,CAAC;;AAEpC,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,8BAA8B,CAAC;YAC5D;;AAEA,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ;AACxB,oBAAC,IAAI,CAAC,YAAY,CAAC,YAAY;AAC3B,uBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE;AACnC,gBAAA,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC;YAC1C;AACJ,QAAA,CAAC,CAAC;QAEF,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;YAC/B,QAAQ,EAAE,IAAI,CAAC;AAClB,SAAA,CAAW;AAEZ,QAAA,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE/D,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CACzC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EACnB;AACI,YAAA,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;YAChE,WAAW,EAAE,CAAC,OAAO,CAAC;AACtB,YAAA,YAAY,EAAE;AACjB,SAAA,CACJ,CACJ;IACL;+GAxDS,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAvB,uBAAuB,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,CAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAJnC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,qBAAqB;AAC3B,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MC7BY,yBAAyB,CAAA;AAClC,IAAA,WAAA,CACY,SAAuB,EAAA;QAAvB,IAAA,CAAA,SAAS,GAAT,SAAS;IAErB;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK;AACN,YAAA,OAAO,SAAS;QAEpB,OAAO,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,KAAK,CAAC;IAC/D;+GAXS,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAzB,yBAAyB,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,kBAAkB;AACxB,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCEY,sBAAsB,CAAA;IAC/B,SAAS,CAAC,KAAa,EAAE,KAA4B,EAAA;AACjD,QAAA,IAAI,CAAC,KAAK;AACN,YAAA,OAAO,EAAE;AAEb,QAAA,IAAI,CAAC,KAAK;AACN,YAAA,OAAO,KAAK;QAEhB,IAAI,IAAI,GAAG,KAAK;AAEhB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;AAC9C,YAAA,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;AACtB,YAAA,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,EAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA,CAAE,EAAE,CAAA,EAAA,CAAI,CAAC,EAAE,CAAA,EAAA,EAAK,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC;QAC9F;AAEA,QAAA,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAEpG,QAAA,OAAO,IAAI;IACf;AAEA,IAAA,UAAU,CAAC,IAAwB,EAAA;QAC/B,OAAO,CAAA,EAAA,EAAM,IAAI,CAAC,QAAQ,GAAG,iCAAiC,GAAG,CAAA,CAAG,CAAA,uBAAA,EAA0B,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAA,IAAA,CAAM;IAC/H;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,MAAM,EAAA;QACf,OAAO,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACzD;+GA7BS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAtB,sBAAsB,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA,CAAA;;4FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,UAAU,EAAE;AACf,iBAAA;;;ACHD,IAAI,cAAc,GAAG,KAAK;MAQb,wBAAwB,CAAA;AACjC,IAAA,WAAA,CACY,UAAmC,EAAA;QAAnC,IAAA,CAAA,UAAU,GAAV,UAAU;QAab,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,cAAc,GAAW,gBAAgB;QACzC,IAAA,CAAA,KAAK,GAAG,KAAK;QACb,IAAA,CAAA,YAAY,GAAW,uBAAuB;AAC7C,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAQ;AAC7B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;AAC/B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,EAAQ;QAE9B,IAAA,CAAA,WAAW,GAAG,KAAK;IAnB3B;IAGA,IAAa,UAAU,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,KAAK,EAAA;AAChB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QACxB,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,oBAAoB,EAAE;IAC/B;IAYA,eAAe,GAAA;AACX,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACvB,IAAI,CAAC,SAAS,EAAE;IACpB;IAEQ,kBAAkB,GAAA;QACtB,IAAI,OAAO,MAAM,KAAK,WAAW;YAC7B,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE;IACvC;IAEQ,oBAAoB,GAAA;QACxB,IAAI,OAAO,MAAM,KAAK,WAAW;YAC7B;QAEJ,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,KAAK,OAAO,EAAE;YACpC,IAAI,CAAC,cAAc,IAAI,QAAQ,CAAC,aAAa,CAAC,uDAAuD,CAAC;gBAClG,cAAc,GAAG,IAAI;YAEzB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,cAAc,EAAE;gBAClD,cAAc,GAAG,IAAI;gBACrB,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC7C,gBAAA,MAAM,CAAC,GAAG,GAAG,yCAAyC;AACtD,gBAAA,MAAM,CAAC,KAAK,GAAG,IAAI;AACnB,gBAAA,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAClF,gBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACrC;iBAAO;gBACH,UAAU,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC/C;QACJ;IACJ;IAEQ,SAAS,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa;YACzE;QAEJ,IAAI,OAAO,MAAM,KAAK,WAAW;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;AAElB,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC;IACjD;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACvB;AAEA,IAAA,IAAI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK;IAC/D;AAEA,IAAA,IAAI,eAAe,GAAA;QACf,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY;IAC7E;AAEA,IAAA,IACI,SAAS,GAAA;QACT,OAAO,IAAI,CAAC,OAAO,KACf,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE;AACjE,eAAA,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAC1B;IACL;AAEA,IAAA,IAAI,iBAAiB,GAAA;QACjB,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;IACtD;AAEA,IAAA,IAAI,QAAQ,GAAA;QACR,IAAI,CAAC,IAAI,CAAC,UAAU;AAChB,YAAA,OAAO,KAAK;AAEhB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,KACpC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK;AACtB,eAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAClC;IACL;AAEA,IAAA,IAAI,QAAQ,GAAA;QACR,IAAI,CAAC,IAAI,CAAC,UAAU;AAChB,YAAA,OAAO,SAAS;QAEpB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE;AACnC,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG;QAC9B;aAAO,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE;AACxC,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM;QACtC;IACJ;+GAjHS,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,mXCZrC,wsDAmDC,EAAA,MAAA,EAAA,CAAA,igDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,0EAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,yBAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDvCY,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAGhB,KAAK,EAAA,QAAA,EAAA,wsDAAA,EAAA,MAAA,EAAA,CAAA,igDAAA,CAAA,EAAA;;sBAUhB;;sBAOA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBA4DA,WAAW;uBAAC,eAAe;;;MEnFnB,yBAAyB,CAAA;AANtC,IAAA,WAAA,GAAA;QAQa,IAAA,CAAA,OAAO,GAAG,KAAK;AAEd,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,EAAyB;AAC7C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,EAAQ;AAEtC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,OAAO,EAAkC;AA6DpE,IAAA;IA3DG,eAAe,GAAA;IAEf;AAEA,IAAA,oBAAoB,CAAC,UAAiC,EAAA;QAClD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC;QAE5C,IAAI,IAAI,CAAC,oBAAoB;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IAC1B;AAEA,IAAA,kBAAkB,CAAC,UAAiC,EAAA;QAChD,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC;IACjD;AAEA,IAAA,IAAI,oBAAoB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAClE;AAEA,IAAA,gBAAgB,CAAC,UAAiC,EAAA;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;IAChC;AAEA,IAAA,iBAAiB,CAAC,UAAiC,EAAA;AAC/C,QAAA,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AACpC,YAAA,OAAO,IAAI;AACf,QAAA,OAAO,KAAK;IAChB;AAEA,IAAA,gBAAgB,CAAC,UAAiC,EAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;AAClC,YAAA,OAAO,IAAI;AACf,QAAA,OAAO,KAAK;IAChB;AAEA,IAAA,YAAY,CAAC,KAA4B,EAAA;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CACd,KAAK,CAAC,GAAG,EACT,IAAI,CAAC;aACA,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;aAClC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CACvB;IACL;AAEA,IAAA,IAAI,gBAAgB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAC/C;AAEA,IAAA,IAAI,iBAAiB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,KAAK,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACrG;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAChB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;IACtF;IAEA,YAAY,CAAC,KAAa,EAAE,UAAiC,EAAA;QACzD,OAAO,UAAU,CAAC,GAAG;IACzB;+GAnES,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,iSCXtC,imCA6BC,EAAA,MAAA,EAAA,CAAA,qMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,iBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,wBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDlBY,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cAGjB,KAAK,EAAA,QAAA,EAAA,imCAAA,EAAA,MAAA,EAAA,CAAA,qMAAA,CAAA,EAAA;;sBAGhB;;sBACA;;sBACA,SAAS;uBAAC,UAAU;;sBACpB;;sBACA;;;AEFL,MAAMC,YAAU,GAAG;IACf,kBAAkB;IAClB,iBAAiB;IACjB,uBAAuB;IACvB,sBAAsB;IACtB,yBAAyB;IACzB,wBAAwB;IACxB;CACH;MAYY,iBAAiB,CAAA;AAC1B,IAAA,OAAO,OAAO,GAAA;QACV,OAAO;AACH,YAAA,QAAQ,EAAE,iBAAiB;AAC3B,YAAA,SAAS,EAAE;gBACP;AACH;SACJ;IACL;+GARS,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,iBAnB1B,kBAAkB;YAClB,iBAAiB;YACjB,uBAAuB;YACvB,sBAAsB;YACtB,yBAAyB;YACzB,wBAAwB;AACxB,YAAA,yBAAyB,aAMrB,YAAY;YACZ,aAAa;YACb,wBAAwB;AACxB,YAAA,eAAe,aAfnB,kBAAkB;YAClB,iBAAiB;YACjB,uBAAuB;YACvB,sBAAsB;YACtB,yBAAyB;YACzB,wBAAwB;YACxB,yBAAyB,CAAA,EAAA,CAAA,CAAA;AAahB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAPtB,YAAY;YACZ,aAAa;YACb,wBAAwB;YACxB,eAAe,CAAA,EAAA,CAAA,CAAA;;4FAIV,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAV7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,YAAY,EAAEA,YAAU;AACxB,oBAAA,OAAO,EAAE;wBACL,YAAY;wBACZ,aAAa;wBACb,wBAAwB;wBACxB;AACH,qBAAA;AACD,oBAAA,OAAO,EAAEA;AACZ,iBAAA;;;AC3BD,MAAM,cAAc,GAAG;AACnB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,MAAM,EAAE,aAAa;AACrB,IAAA,QAAQ,EAAE,gBAAgB;AAC1B,IAAA,IAAI,EAAE,YAAY;AAClB,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,KAAK,EAAE;CACV;MAiBY,2BAA2B,CAAA;AANxC,IAAA,WAAA,GAAA;AAQY,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;QAChC,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAElE,IAAA,CAAA,UAAU,GAAwB,EAAE;QAEpC,IAAA,CAAA,cAAc,GAAW,QAAQ;QACjC,IAAA,CAAA,aAAa,GAAU,EAAE;QACzB,IAAA,CAAA,aAAa,GAAG,KAAK;AAGb,QAAA,IAAA,CAAA,QAAQ,GAAoB,IAAI,OAAO,EAAE;AAsEpD,IAAA;AAlEG,IAAA,IAAI,WAAW,GAAA;QACX,OAAO,IAAI,CAAC,YAAY;IAC5B;IAEA,IAAI,WAAW,CAAC,KAAK,EAAA;AACjB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QACzB,UAAU,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AACrB,iBAAA,MAAM,CAAC,CAAC,IACL,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK;AAC1B,mBAAA,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK;AAC1B,mBAAA,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAC9C;AAEL,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC5D,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,QAAQ,CAAC,GAAW,EAAA;AAChB,QAAA,IAAI,CAAC,GAAG;AACJ,YAAA,OAAO,SAAS;QACpB,OAAO,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;IAC9E;AAEA,IAAA,MAAM,CAAC,IAAY,EAAA;AACf,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;IAEA,UAAU,GAAA;;QAEN,UAAU,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC9B,QAAA,CAAC,CAAC;IACN;IAEA,UAAU,GAAA;;QAEN,UAAU,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAC7B,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,IAAY,QAAQ,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ,IAAI,4DAA4D;IACpG;IAEA,QAAQ,GAAA;AACJ,QAAA,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC,UAAU,EAAE;AACnC,YAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,CAAA,2BAAA,EAA8B,QAAQ,CAAC,EAAE,CAAA,CAAA,CAAG,CAAC;AAC/D,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACjB,gBAAA,GAAG,QAAQ;gBACX,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM;gBAC3C,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK;AAChC,oBAAA,GAAG,KAAK;oBACR,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CACxC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAErE,iBAAA,CAAC;AACL,aAAA,CAAC;QACN;AAEA,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC;IAE7D;+GAhFS,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,oHChCxC,qxDAiDA,EAAA,MAAA,EAAA,CAAA,i1BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDjBa,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,cAGpB,KAAK,EAAA,QAAA,EAAA,qxDAAA,EAAA,MAAA,EAAA,CAAA,i1BAAA,CAAA,EAAA;;sBAahB;;;MEVQ,4BAA4B,CAAA;IACrC,WAAA,CACY,UAAmC,EACnC,OAAgB,EAAA;QADhB,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,OAAO,GAAP,OAAO;AAMX,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAU;QACzC,IAAA,CAAA,cAAc,GAAG,KAAK;QA6Bb,IAAA,CAAA,QAAQ,GAAG,KAAK;QAChB,IAAA,CAAA,QAAQ,GAA+B,KAAK;QAC5C,IAAA,CAAA,QAAQ,GAAgC,KAAK;QAC7C,IAAA,CAAA,OAAO,GAA+B,KAAK;QAC3C,IAAA,CAAA,OAAO,GAAgC,QAAQ;IAtCxD;AAOA,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS;IACzB;AAIA,IAAA,IAAI,MAAM,GAAA;QACN,OAAO,IAAI,CAAC,UAAU;IAC1B;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,GAAG,EAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE;IAChB;IAEA,KAAK,GAAA;AACD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACjB,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QAC1B;IACJ;IAQA,IAAI,GAAA;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,KAAK,EAAE;QAChB;QAEA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AAClC,YAAA,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;AAClC,iBAAA,mBAAmB,CAAC,IAAI,CAAC,UAAU;AACnC,iBAAA,aAAa,CAAC;AACX,gBAAA;oBACI,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ,EAAE,IAAI,CAAC;AAClB;aACJ;iBACA,sBAAsB,CAAC,IAAI,CAAC;AACjC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,mBAAmB,EAAE,IAAI;YACzB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC;AACrD,gBAAA,SAAS,EAAE;aACd;AACJ,SAAA,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,MAAK;YAC3C,IAAI,CAAC,KAAK,EAAE;AAChB,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,KAAK,IAAG;AAC9C,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;gBACxB,IAAI,CAAC,KAAK,EAAE;YAChB;AACJ,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC;IACtD;+GA/ES,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvB3B,CAAA;;;;;;;;;;AAUT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,2BAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAaQ,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAzBxC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,QAAA,EACvB,CAAA;;;;;;;;;;AAUT,IAAA,CAAA,EAAA,UAAA,EAWW,KAAK,EAAA,MAAA,EAAA,CAAA,4DAAA,CAAA,EAAA;;sBAShB,SAAS;uBAAC,uBAAuB;;sBAKjC;;sBA2BA;;sBACA;;sBACA;;sBACA;;sBACA;;;AChEL,MAAMD,YAAU,GAAG;IACf,2BAA2B;IAC3B;CACH;MAgBY,WAAW,CAAA;+GAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,iBAlBpB,2BAA2B;AAC3B,YAAA,4BAA4B,aAMxB,YAAY;YACZ,WAAW;YACX,aAAa;YACb,eAAe;YACf,kBAAkB;YAClB,cAAc;YACd,aAAa;AACb,YAAA,YAAY,aAdhB,2BAA2B;YAC3B,4BAA4B,CAAA,EAAA,CAAA,CAAA;AAiBnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,YAXhB,YAAY;YACZ,WAAW;YACX,aAAa;YACb,eAAe;YACf,kBAAkB;YAClB,cAAc;YACd,aAAa;YACb,YAAY,CAAA,EAAA,CAAA,CAAA;;4FAIP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAdvB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,YAAY,EAAEA,YAAU;AACxB,oBAAA,OAAO,EAAE;wBACL,YAAY;wBACZ,WAAW;wBACX,aAAa;wBACb,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,aAAa;wBACb;AACH,qBAAA;AACD,oBAAA,OAAO,EAAEA;AACZ,iBAAA;;;MCdqB,eAAe,CAAA;AACjC,IAAA,WAAA,GAAA;AAqEQ,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,eAAe,CAAO,IAAI,CAAC;QAgB9C,IAAA,CAAA,mBAAmB,GAAwB,EAAE;QAC7C,IAAA,CAAA,oBAAoB,GAAyB,EAAE;IArFvD;AAuEA,IAAA,IAAI,WAAW,GAAA;QACX,OAAO,IAAI,CAAC,YAAY;IAC5B;IAEA,IAAI,IAAI,CAAC,IAAW,EAAA;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC;AAEA,IAAA,IAAI,IAAI,GAAA;QACJ,OAAO,IAAI,CAAC,KAAK;IACrB;AAKA,IAAA,yBAAyB,CAAC,OAA0B,EAAA;AAChD,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC1C;AAEA,IAAA,0BAA0B,CAAC,QAA4B,EAAA;AACnD,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC5C;AAEA,IAAA,IAAI,kBAAkB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE;IAC3C;AAEA,IAAA,IAAI,mBAAmB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;IAC5C;AACH;;MC3GY,gBAAgB,CAAA;AACzB,IAAA,WAAA,CACY,UAAmC,EAAA;QAAnC,IAAA,CAAA,UAAU,GAAV,UAAU;;QAkBb,IAAA,CAAA,IAAI,GAAG,KAAK;;;QAQb,IAAA,CAAA,QAAQ,GAAG,KAAK;QAExB,IAAA,CAAA,cAAc,GAAG,KAAK;AAItB,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,IAAI,EAAE;QAMT,IAAA,CAAA,eAAe,GAAG,IAAI;QACtB,IAAA,CAAA,SAAS,GAAW,IAAI;QAExB,IAAA,CAAA,IAAI,GAAG,KAAK;QACZ,IAAA,CAAA,OAAO,GAAG,KAAK;QAEf,IAAA,CAAA,QAAQ,GAAG,KAAK;;;AAKjB,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;AAC/B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,EAAQ;AAC5B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAe;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAQ;AACnC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAQ;AACrC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,OAAO,EAAQ;AACpC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;AAClC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,OAAO,EAAQ;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAU;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAQ;AAC7B,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAiD;AACtE,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AAE3B,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AACtC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AACpC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;AAC9C,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;AAC1C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AACvC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AAC7C,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;AAC3D,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;AACjD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AACpC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AACpC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;QAMjC,IAAA,CAAA,KAAK,GAAG,KAAK;QAET,IAAA,CAAA,OAAO,GAAG,KAAK;IArF7C;IAEA,QAAQ,GAAA;QACJ,IAAI,OAAO,GAAG,GAAG;QACjB,IAAI,OAAO,GAAG,CAAC;AACf,QAAA,IAAI,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,OAAO,GAAG,OAAO,CAAC;QAE9D,UAAU,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,IAAI,CAAC;QAC9C,CAAC,EAAE,UAAU,CAAC;IAClB;IAKA,IAAa,OAAO,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/C,IAAA,IAAI,OAAO,CAAC,KAAK,EAAA,EAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;;;IAgE7C,IAAyC,SAAS,GAAA,EAAK,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAEhF,IAAA,IAAsC,aAAa,GAAA,EAAK,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,IAAI,KAAK,CAAC,CAAC;IAGnH,IAAI,UAAU,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;IACjG,IAAI,OAAO,GAAA,EAAK,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACtD,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtG;AAEA,IAAA,IAAI,YAAY,GAAA;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO;AACb,YAAA,OAAO,KAAK;AAEhB,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE;YAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY;QACrD;AAEA,QAAA,OAAO,IAAI;IACf;AAEA,IAAA,aAAa,CAAC,IAAW,EAAA,EAAI,OAAO,OAAO,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAA,CAAA,CAAG,CAAC,CAAC;;;AAKxF,IAAA,MAAM,WAAW,GAAA;QACb,MAAM,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;IACnF;;;AAKQ,IAAA,UAAU,CAAC,KAAkB,EAAA;AACjC,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE;AACvC,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QACzB;aAAO;AACH,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACvB;IACJ;;;AAKA,IAAA,qBAAqB,KAAK,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,IAAA,QAAQ,GAAA,EAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACpD,UAAU,GAAA,EAAK,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,GAAA,EAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,MAAM,GAAA,EAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,IAAI,GAAA,EAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B,MAAM,GAAA,EAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AACjC,IAAA,KAAK,GAAA,EAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3C,IAAA,KAAK,GAAA,EAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,MAAM,GAAA,EAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,UAAU,GAAA,EAAK,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,SAAS,GAAA,EAAK,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAE;AACpF,IAAA,cAAc,CAAC,IAAU,EAAA,EAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AACtF,IAAA,YAAY,CAAC,IAAU,EAAA,EAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAE5E,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO;IAC/B;IAEA,SAAS,GAAA;AACL,QAAA,IAAI,QAAgB;AACpB,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE;YAC1B,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AACtC,YAAA,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,YAAA,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE;QAC7B;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,OAAO,EAAE;AACL,gBAAA,KAAK,EAAE;AACV;AACJ,SAAA,CAAC;IACN;+GA3KS,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,u4BCb7B,guQAqNA,EAAA,MAAA,EAAA,CAAA,swJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,kBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,yBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,KAAA,EAAA,KAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,uBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDxMa,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAN5B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,cAGb,KAAK,EAAA,QAAA,EAAA,guQAAA,EAAA,MAAA,EAAA,CAAA,swJAAA,CAAA,EAAA;;sBAsBhB;;sBACA;;sBAkBA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAqBA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACH;;sBACG;;sBACH;;sBACG;;sBACA;;sBACA;;sBACA;;sBAKA,WAAW;uBAAC,sBAAsB;;sBAClC,WAAW;uBAAC,WAAW;;sBACvB,WAAW;uBAAC,mBAAmB;;sBAC/B,WAAW;uBAAC,eAAe;;sBAI3B,WAAW;uBAAC,cAAc;;;MEpGlB,2BAA2B,CAAA;+GAA3B,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA3B,2BAA2B,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAJvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,CAAA,oBAAA,CAAsB;AAChC,oBAAA,UAAU,EAAE;AACf,iBAAA;;;ACUD,MAAM,oBAAoB,GAAG,IAAI;AACjC,MAAM,4BAA4B,GAAG,GAAG;MAQ3B,oBAAoB,CAAA;IAC7B,WAAA,CACY,OAAwB,EACxB,UAAmC,EAAA;QADnC,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,UAAU,GAAV,UAAU;;;AAad,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAE;QACxC,IAAA,CAAA,WAAW,GAAgB,IAAI;QAC/B,IAAA,CAAA,cAAc,GAAkB,EAAE;QAClC,IAAA,CAAA,QAAQ,GAAkB,EAAE;QAE5B,IAAA,CAAA,iBAAiB,GAAG,KAAK;AAEzB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,CAAO,CAAC,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAChE,IAAA,CAAA,aAAa,GAAG,KAAK;QACrB,IAAA,CAAA,aAAa,GAAG,KAAK;QACrB,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,cAAc,GAAG,KAAK;AAKtB;;;;;;;;;AASG;QACH,IAAA,CAAA,WAAW,GAAkB,EAAE;AAE/B;;;;;;;;;AASG;QACH,IAAA,CAAA,aAAa,GAAkB,EAAE;QAexB,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,UAAU,GAAG,KAAK;QAClB,IAAA,CAAA,eAAe,GAAG,KAAK;QACvB,IAAA,CAAA,cAAc,GAAG,IAAI;QACrB,IAAA,CAAA,iBAAiB,GAAG,0BAA0B;QAC9C,IAAA,CAAA,YAAY,GAAG,IAAI;QACnB,IAAA,CAAA,iBAAiB,GAAG,KAAK;QACzB,IAAA,CAAA,kBAAkB,GAAG,IAAI;QACzB,IAAA,CAAA,eAAe,GAAsB,EAAE;;;AAWxC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,EAAe;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAe;AACrC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAiD;AACtE,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAe;AAC1C,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,OAAO,EAAQ;AACvC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAQ;AACrC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAe;AACpC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAe;AACrC,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAa;AACzC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,OAAO,EAAiB;AAChD,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,OAAO,EAAc;AAEnC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AAChD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AACtC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AACpC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;AACxD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;AACpD,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AACpC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AACtC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;AAClD,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;AACxD,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;QA+kB7E,IAAA,CAAA,YAAY,GAAkB,EAAE;IA9rBhC;IAKA,IAAa,MAAM,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7C,IAAA,IAAI,MAAM,CAAC,KAAK,EAAA,EAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAkB3C,IAAI,gBAAgB,KAAK,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IACzF,IAAI,YAAY,KAAK,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IA8BrF,IACI,WAAW,CAAC,KAAK,EAAA,EAAI,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC;IACpD,IAAI,WAAW,GAAA,EAAK,OAAO,IAAI,CAAC,YAAY,IAAI,oBAAoB,CAAC,CAAC;IAGtE,IACI,kBAAkB,CAAC,KAAK,EAAA,EAAI,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,CAAC;IAClE,IAAI,kBAAkB,GAAA,EAAK,OAAO,IAAI,CAAC,mBAAmB,IAAI,4BAA4B,CAAC,CAAC;AAwD5F,IAAA,IAAI,QAAQ,GAAA,EAAK,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;;AAIxD;;;AAGG;AACH,IAAA,wBAAwB,CAAC,OAAoB,EAAA;AACzC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;AAChD,eAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;AAC3C,eAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;IAC1D;IAEA,MAAM,oBAAoB,CAAC,OAAoB,EAAA;QAC3C,MAAM,IAAI,CAAC,YAAY;QAEvB,OAAO,CAAC,GAAG,CAAC,CAAA,gBAAA,EAAmB,OAAO,CAAC,EAAE,CAAA,cAAA,CAAgB,CAAC;AAC1D,QAAA,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE;YAC5D,OAAO,CAAC,GAAG,CAAC,CAAA,sCAAA,EAAyC,OAAO,CAAC,EAAE,CAAA,CAAE,CAAC;AAClE,YAAA,MAAM,IAAI,CAAC,QAAQ,EAAE;QACzB;QAEA,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE;YACzC,OAAO,CAAC,KAAK,CAAC,CAAA,+DAAA,EAAkE,OAAO,CAAC,EAAE,CAAA,uBAAA,CAAyB,CAAC;AACpH,YAAA,OAAO,KAAK;QAChB;AAEA,QAAA,IAAI,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;AAC1E,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;AAErD,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACX,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,gFAAA,CAAkF,CAAC;AACjG,YAAA,OAAO,KAAK;QAChB;AAEA,QAAA,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QACjE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC;AAC9C,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC;AACxD,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;IAC7B;AAEA,IAAA,IAAI,6BAA6B,GAAA;QAC7B,OAAO,IAAI,CAAC;AACL,eAAA,IAAI,CAAC;AACL,eAAA,IAAI,CAAC,gBAAgB,KAAK,UAAU,CAAC;AACrC,eAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;IACvC;AAEA,IAAA,IAAI,qBAAqB,GAAA;QACrB,IAAI,IAAI,CAAC,iBAAiB;AACtB,YAAA,OAAO,IAAI;QACf,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5C,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,uBAAA,CAAyB,CAAC;AACtC,YAAA,OAAO,IAAI;QACf;AAEA,QAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc;AAC7C,YAAA,OAAO,IAAI;AAEf,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,IAAI,UAAuB;YAE3B,IAAI,IAAI,CAAC,UAAU;AACf,gBAAA,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;;AAEpD,gBAAA,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEjC,IAAI,UAAU,EAAE;gBACZ,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/D,IAAI,cAAc,EAAE;oBAChB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE;AACxC,wBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,0BAAA,CAA4B,CAAC;AACzC,wBAAA,OAAO,IAAI;oBACf;yBAAO;AACH,wBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,sBAAA,CAAwB,CAAC;oBACzC;gBACJ;qBAAO;AACH,oBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,0BAAA,CAA4B,CAAC;gBAC7C;YACJ;iBAAO;AACH,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,0BAAA,CAA4B,CAAC;YAC7C;QACJ;AAEA,QAAA,OAAO,KAAK;IAChB;AAEQ,IAAA,gBAAgB,CAAC,OAAgB,EAAA;AACrC,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,EAAE;QACnD,OAAO,CAAC,CAAC;eACF,WAAW,CAAC,MAAM,IAAI;eACtB,WAAW,CAAC,KAAK,IAAI;AACrB,eAAA,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,eAAe,CAAC;eAC7C,WAAW,CAAC,GAAG,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY;IACnE;AAEA;;;;;;AAMG;AACH,IAAA,6BAA6B,CAAC,OAAoB,EAAA;AAC9C,QAAA,IAAI,CAAC,OAAO;AACR,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,iCAAA,CAAmC,CAAC;QACxD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;IAChE;IAEA,QAAQ,CAAC,OAAoB,EAAE,UAAkB,EAAA;QAC7C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACrD;AAEA,IAAA,WAAW,CAAC,OAAoB,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7B;AAEA,IAAA,aAAa,CAAC,OAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B;IAEA,UAAU,CAAC,OAAoB,EAAE,OAAmB,EAAA;QAChD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC3C;AAEA,IAAA,YAAY,CAAC,OAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,aAAa,CAAC,OAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,aAAa,CAAC,OAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,iBAAiB,CAAC,OAAoB,EAAA;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;AAEA,IAAA,cAAc,CAAC,IAAU,EAAA;AACrB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IACrC;AAEA,IAAA,YAAY,CAAC,IAAU,EAAA;AACnB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACnC;AAEA,IAAA,aAAa,CAAC,OAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;IAC9B;AAEA,IAAA,YAAY,CAAC,OAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC;AAC5D,QAAA,OAAO,CAAC,cAAc,CAAC,OAAO,GAAG,IAAI;IACzC;AAEA,IAAA,aAAa,CAAC,OAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B;AAEQ,IAAA,SAAS,CAAC,KAAqB,EAAA;AACnC,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,aAAa,CAAC,MAAM,MAAM,aAAa,CAAC,MAAM;AAC5F,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AAErB,QAAA,MAAc,CAAC,gBAAgB,GAAG,KAAK;AAExC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;AAC9B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QAC3B;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QAEpB,IAAI,KAAK,EAAE;AACP,YAAA,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,EAAE;AAC/C,YAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,YAAA,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC;AAC9E,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AAEpB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,YAAY,EAAE;YACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9F,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACtF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAE5F,IAAI,CAAC,WAAW,CAAC,GAAG,CAChB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CACtE;YAED,IAAI,CAAC,kBAAkB,EAAE;QAC7B;IACJ;AAEQ,IAAA,MAAM,kBAAkB,GAAA;;QAG5B,IAAI,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;AAC3D,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc;QAGpC,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;AACvD,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,GAAG,QAAQ;QAEvE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC1G;iBAAO;gBACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrG;QACJ;QAEA,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,IAAI,CAAC,gBAAgB;YACrB,IAAI,CAAC,gBAAgB,EAAE;IAC/B;IAEA,aAAa,GAAA;QACT,IAAI,CAAC,IAAI,CAAC,SAAS;YACf;;;;;;;;IASR;AAEA,IAAA,OAAO,CAAC,MAAuB,EAAE,KAAA,GAAgB,CAAC,EAAA;AAC9C,QAAA,IAAI,GAAW;QAEf,IAAI,OAAO,MAAM,KAAK,QAAQ;AAC1B,YAAA,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;;YAEpB,GAAG,GAAG,MAAM;AAEhB,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK;AACrB,YAAA,GAAG,GAAG,GAAG,GAAG,GAAG;AAEnB,QAAA,OAAO,GAAG;IACd;AACA,IAAA,OAAO,CAAC,GAAW,EAAE,KAAA,GAAgB,CAAC,EAAA;AAClC,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK;AACrB,YAAA,GAAG,GAAG,GAAG,GAAG,GAAG;AAEnB,QAAA,OAAO,GAAG;IACd;IAEA,eAAe,CAAC,KAAa,EAAE,WAAwB,EAAA;QACnD,OAAO,WAAW,CAAC,EAAE;IACzB;AAEA,IAAA,IAAI,eAAe,GAAA;QACf,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,aAAa,CAAC,MAAM;IACzD;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAChB,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,UAAU,CAAC,GAAG;IACpD;AAEA;;;;;;;;AAQG;IACH,MAAM,UAAU,CAAC,KAAiB,EAAA;;AAI9B,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;;;AAK3B,QAAA,IAAI,YAAY,GAAG,aAAa,CAAC,MAAM;AACvC,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,YAAY,IAAI,IAAI,CAAC,gBAAgB,KAAK,UAAU,CAAC,GAAG,EAAE;AACnF,YAAA,IAAI,IAAI,CAAC,eAAe,KAAK,YAAY;AACrC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC;AAC7C,YAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,UAAU,CAAC,GAAG;gBACxC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAChD;QACJ;;;AAKA,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;;QAI1B,IAAI,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;;YAEzF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AAE7F,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClF,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;AACxD,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAChG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;;QAI5C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1B,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACjB,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE;iBAAO;AACH,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C;QACJ;IACJ;AAEA,IAAA,IAAI,SAAS,GAAA;QACT,IAAI,OAAO,MAAM,KAAK,WAAW;AAC7B,YAAA,OAAO,KAAK;AAEhB,QAAA,OAAO,YAAY,CAAC,aAAa,CAAC,KAAK,GAAG;IAC9C;AAEA,IAAA,IAAI,cAAc,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;QACvD;AAEA,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;IACvC;AAEA,IAAA,IAAI,kBAAkB,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAC3D;AAEA,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;IAC3C;AAEA,IAAA,IAAI,QAAQ,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACtD;AAEA,IAAA,MAAM,YAAY,GAAA;AACd,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,QAAQ;AAChC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAE1B,IAAI,KAAK,CAAC,YAAY,CAAC;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,wCAAA,CAA0C,CAAC;QAE/D,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,YAAY,CAAC,EAAE,YAAY,CAAC;AAC3H,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;AACrD,YAAA,YAAY,IAAI,cAAc,CAAC,MAAM;QACzC;;;AAMA,QAAA,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9D,IAAI,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,WAAW,EAAE;AACpD,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,YAAA,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC;YAErE,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;AACtC,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC;;;AAK9C,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;;AAI/C,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AACrB,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AAExB,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC9B;;QAIA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,YAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAClF,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;YACtC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW;AAC3C,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC5E;QAEA,IAAI,CAAC,aAAa,EAAE;IACxB;AAEA,IAAA,IAAI,aAAa,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE;AACnC,YAAA,OAAO,OAAO;QAClB;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE;AAC1C,YAAA,OAAO,OAAO;QAClB;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,KAAK,OAAO,EAAE;AACzC,YAAA,OAAO,YAAY;QACvB;AAEA,QAAA,OAAO,MAAM;IACjB;AAEA,IAAA,IAAI,iBAAiB,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE;AACnC,YAAA,OAAO,OAAO;QAClB;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE;AAC1C,YAAA,OAAO,OAAO;QAClB;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,KAAK,OAAO,EAAE;AACzC,YAAA,OAAO,YAAY;QACvB;AAEA,QAAA,OAAO,MAAM;IACjB;IAEA,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACxF,IAAI,aAAa,KAAK,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAE5F;;;;;;;AAOG;AACH,IAAA,MAAM,QAAQ,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,QAAQ;QAEhC,IAAI,KAAK,CAAC,YAAY,CAAC;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,wCAAA,CAA0C,CAAC;AAE/D,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAE1B,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC;AAChE,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,CAAE;AACvD,YAAA,YAAY,IAAI,cAAc,CAAC,MAAM;QACzC;QAEA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhH,IAAI,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,WAAW,EAAE;;AAGrD,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,YAAA,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC;AACrE,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC;AAC9C,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAE;;AAIjD,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AACrB,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AAExB,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC9B;;QAKA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;YAChD,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC;;;YAKtF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YACvC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW;AAC/C,gBAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QACxF;QAEA,IAAI,CAAC,aAAa,EAAE;IACxB;AAEA;;;;;;;AAOG;AACH,IAAA,MAAM,QAAQ,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,QAAQ;QAEhC,IAAI,KAAK,CAAC,YAAY,CAAC;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,wCAAA,CAA0C,CAAC;AAE/D,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAE1B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/B,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC;YACjE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;AACpD,YAAA,YAAY,IAAI,cAAc,CAAC,MAAM;YACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAChD;AAEA,QAAA,IAAI,WAAwB;AAE5B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACjB,YAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3D;aAAO;YACH,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9G;AAEA,QAAA,IAAI,YAAY,GAAG,CAAC,IAAI,WAAW,EAAE;;AAGjC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;YAGzB,IAAI,CAAC,WAAW,EAAE;AACd,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;gBACpB;YACJ;AAEA,YAAA,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC;YAErE,IAAI,IAAI,CAAC,UAAU;gBACf,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE;AAEzC,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC;;;AAK9C,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClD;iBAAO;gBACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YAClD;;AAIA,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACxB;AAEA,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC9B;;QAIA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;YAChD,IAAI,QAAQ,GAAkB,EAAE;;;;AAMhC,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACjB,gBAAA,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC9E,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;AACpD,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAChG;iBAAO;AACH,gBAAA,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBAClF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;AAClC,gBAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB;oBACpE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC1G;QAEJ;IACJ;AAIQ,IAAA,UAAU,CAAC,OAAoB,EAAA;QAEnC,IAAI,CAAC,OAAO,CAAC,cAAc;AACvB,YAAA,OAAO,CAAC,cAAc,KAAK,EAAE;AAEjC,QAAA,IAAI,WAAW,GAAG,IAAI,CAAC,QAAQ;AAC/B,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa;AAC/B,QAAA,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU;AAEhC,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;AAC/B,YAAA,WAAW,GAAG,IAAI,CAAC,WAAW;YAC9B,MAAM,GAAG,IAAI;QACjB;;AAGA,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,aAAa,CAAC,MAAM;YAC7C;QAGJ,IAAI,UAAU,EAAE;AACZ,YAAA,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;AAEzB,YAAA,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE;AAC7B,gBAAA,IAAI,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC;AAC9E,gBAAA,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC;YAC7B;QACJ;aAAO;AACH,YAAA,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;AAE5B,YAAA,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE;AAC7B,gBAAA,IAAI,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC;AAC9E,gBAAA,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC;YAChC;QACJ;AAEA,QAAA,IAAI,MAAM,EAAE,MAAM,GAAG,CAAC;AAClB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QAEvB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,EAAE;IACvB;IAEQ,sBAAsB,GAAA;QAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,aAAa,CAAC,MAAM;YAC9C;QAEJ,IAAI,eAAe,GAAG,CAAC;AACvB,QAAA,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE;AACrE,YAAA,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;AACvB,gBAAA,IAAI,OAAO,CAAC,YAAY,EAAE;oBACtB,IAAI,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC;oBACnD,IAAI,YAAY,GAAG,eAAe;wBAC9B,eAAe,GAAG,YAAY;AAClC,oBAAA,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;gBAC/C;YACJ;QACJ;AAEA,QAAA,OAAO,eAAe;IAC1B;AAEA;;;AAGG;AACH,IAAA,MAAM,wBAAwB,GAAA;AAC1B,QAAA,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,YAAY;QACvB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D;IAEQ,YAAY,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM;YACZ;AAEJ,QAAA,IAAI,MAAkD;QAEtD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,aAAa,CAAC,KAAK;AAC7C,YAAA,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;aACnC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,aAAa,CAAC,MAAM;AACnD,YAAA,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;aACpE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,aAAa,CAAC,MAAM;AACnD,YAAA,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAEzE,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC;AAEQ,IAAA,eAAe,CAAC,OAAoB,EAAA;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;IAC5B;IAEA,kBAAkB,GAAA;QACd,IAAI,CAAC,IAAI,CAAC,gBAAgB;AACtB,YAAA,OAAO,KAAK;AAEhB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa;AAC9C,QAAA,MAAM,aAAa,GAAG,EAAE,CAAC,SAAS;QAClC,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY;AAEtD,QAAA,OAAO,aAAa,GAAG,YAAY,GAAG,EAAE;IAC5C;AAEQ,IAAA,WAAW,CAAC,OAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACtB;QAEJ,IAAI,CAAC,cAAc,EAAE;IACzB;AAEQ,IAAA,QAAQ,CAAC,OAAoB,EAAA;AACjC,QAAA,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvF;AAEQ,IAAA,cAAc,CAAC,OAAoB,EAAA;QACvC,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACnC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;AAE/D,QAAA,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE;AACnB,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;YACpC,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AAC1C,YAAA,IAAI,KAAK,IAAI,CAAC,EAAE;gBACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAClC;QACJ;AAAO,aAAA,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAC3B,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;AAChD,YAAA,IAAI,KAAK,IAAI,CAAC,EAAE;gBACZ,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACxC;YAEA,IAAI,CAAC,YAAY,EAAE;QACvB;IACJ;IAEA,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACxB;QACJ;AAEA,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa;QAE9C,EAAE,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;IAEzC;AAEA,IAAA,IAAI,OAAO,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa;IACxC;IAEA,MAAM,eAAe,CAAC,SAA4B,EAAA;QAC9C,IAAI,OAAO,MAAM,KAAK,WAAW;YAC7B;AAEJ,QAAA,MAAM,IAAI,CAAC,wBAAwB,EAAE;QAErC,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;QACpD,IAAI,OAAO,EAAE;YACT,OAAO,CAAC,cAAc,CAAC;AACnB,gBAAA,MAAM,EAAE,QAAQ;AAChB,gBAAA,KAAK,EAAE;AACV,aAAA,CAAC;QACN;IACJ;AAEA,IAAA,oBAAoB,CAAC,SAAiB,EAAA;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,CAAI,CAAC;IACzE;AAEA,IAAA,UAAU,CAAC,OAAoB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,WAAW;AACjB,YAAA,OAAO,KAAK;AAEhB,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;AACzD,YAAA,OAAO,IAAI;AAEf,QAAA,OAAO,KAAK;IAChB;+GA13BS,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,ykCAkFf,2BAA2B,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAU,WAAW,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EAuChD,gBAAgB,gDCjJlC,8vLAoJA,EAAA,MAAA,EAAA,CAAA,+iDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAf,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,gBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FD5Ha,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAGlB,KAAK,EAAA,QAAA,EAAA,8vLAAA,EAAA,MAAA,EAAA,CAAA,+iDAAA,CAAA,EAAA;;sBAYhB;;sBAkDA;;sBAKA;;sBAIA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAAS,WAAW;uBAAC,oBAAoB;;sBACzC;;sBACA;;sBAEA,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,2BAA2B,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;;sBAqB/D;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAKA,YAAY;uBAAC,gBAAgB;;sBAC7B,SAAS;uBAAC,kBAAkB;;;ME5IpB,8BAA8B,CAAA;+GAA9B,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA9B,8BAA8B,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA9B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAJ1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,CAAA,uBAAA,CAAyB;AACnC,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCKY,yBAAyB,CAAA;AAClC,IAAA,WAAA,CACY,WAAwB,EAAA;QAAxB,IAAA,CAAA,WAAW,GAAX,WAAW;;AAMf,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,OAAO,EAAyB;AACvD,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,OAAO,EAAyB;;;QAKtD,IAAA,CAAA,QAAQ,GAAG,KAAK;IAVzB;;;IAeA,IAAc,eAAe,GAAA,EAAK,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/E,IAAc,eAAe,GAAA,EAAK,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC;;IAS/E,IAAI,GAAA,EAAK,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;IAE/C,MAAM,UAAU,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,aAAkC;AACzD,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;YACtB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,YAAA,IAAI,SAAiB;AAErB,YAAA,IAAI,UAAU,GAA0B;gBACpC,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,cAAc,EAAE;AACZ,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,YAAY,EAAE;AACjB;aACJ;AAED,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEtC,YAAA,IAAI;gBACA,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC;YACxD;YAAE,OAAO,CAAC,EAAE;AACR,gBAAA,UAAU,CAAC,cAAc,CAAC,KAAK,GAAG,IAAI;AACtC,gBAAA,UAAU,CAAC,cAAc,CAAC,YAAY,GAAG,kBAAkB;AAE3D,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,qDAAA,CAAuD,CAAC;AACtE,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,gBAAA,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;AAEhB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;gBACtC;YACJ;;;AAIA,YAAA,IAAI,CAAC,SAAS;gBACV;AAEJ,YAAA,UAAU,CAAC,GAAG,GAAG,SAAS;AAC1B,YAAA,UAAU,CAAC,cAAc,GAAG,SAAS;QACzC;IACJ;+GAvES,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAlB,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,oTCVtC,kSAGyG,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDO5F,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,cAGvB,KAAK,EAAA,QAAA,EAAA,kSAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA;;sBAgBhB;;sBAKA;;sBACA;;sBAKA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;MEpBjC,0BAA0B,CAAA;IACnC,WAAA,CACY,UAA2C,EAC3C,WAA4B,EAAA;QAD5B,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,WAAW,GAAX,WAAW;QAId,IAAA,CAAA,WAAW,GAA4B,EAAE;AACxC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,OAAO,EAA2B;QAqB5D,IAAA,CAAA,cAAc,GAAG,IAAI;AACrB,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,GAAG,EAAmC;IAzB9D;IAIA,QAAQ,GAAA;QACJ,IAAI,OAAO,MAAM,KAAK,WAAW;YAC7B;QAEJ,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAK;AAC1C,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC;AAC7E,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,IAAI,OAAO,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,aAAa;IACzC;AAEA,IAAA,IAAI,IAAI,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;IAC7B;IAMQ,MAAM,GAAA;AACV,QAAA,IAAI,OAAO,GAAgB;AACvB,YAAA,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,IAAI;AAClB,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,IAAI,CAAC;SACrB;QAED,IAAI,cAAc,GAAa,EAAE;QAEjC,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE;YACrD,IAAI,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;YAC9C,IAAI,CAAC,SAAS,EAAE;gBACZ,OAAO,CAAC,KAAK,CAAC,CAAA,4BAAA,EAA+B,OAAO,CAAC,WAAW,CAAC,IAAI,CAAA,2DAAA,CAA6D,CAAC;gBACnI;YACJ;AACA,YAAA,KAAK,IAAI,QAAQ,IAAI,SAAS,EAAE;AAC5B,gBAAA,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAClC,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;oBACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;wBAC9B,QAAQ;AACR,wBAAA,UAAU,EAAE;AACf,qBAAA,CAAC;gBACN;YACJ;QACJ;;QAGA,IAAI,gBAAgB,GAAa,EAAE;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;AAC9B,YAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC7B,gBAAA,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;QAClC;AACA,QAAA,KAAK,IAAI,eAAe,IAAI,gBAAgB,EAAE;AAC1C,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC;QAC1C;;;QAKA,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;YACrC,IAAI,KAAK,CAAC,UAAU;gBAChB;AAEJ,YAAA,KAAK,CAAC,UAAU,GAAG,IAAI,OAAO,CAAC,OAAO,OAAO,EAAE,MAAM,KAAI;gBACrD,KAAK,IAAI,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE;AACvD,oBAAA,IAAI;AACA,wBAAA,IAAI,UAAU,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC;wBACxE,IAAI,UAAU,EAAE;AACZ,4BAAA,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AACvB,4BAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;AACjC,4BAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;4BACrD,OAAO,CAAC,UAAU,CAAC;4BACnB;wBACJ;oBACJ;oBAAE,OAAO,CAAC,EAAE;wBACR,OAAO,CAAC,KAAK,CAAC,CAAA,wCAAA,EAA2C,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAA,CAAA,CAAG,CAAC;AACtF,wBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;wBAChB;oBACJ;gBACJ;AACJ,YAAA,CAAC,CAAC;QACN;IACJ;+GA/FS,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAc,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,UAAU,EAAE;AACf,iBAAA;;sBAQI;;sBACA;;;ACfL,MAAM,wBAAwB,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;MAuBlF,qBAAqB,CAAA;AANlC,IAAA,WAAA,GAAA;;;AAuBY,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,OAAO,EAAU;AAE9C,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,YAAY,EAAE;QAElC,IAAA,CAAA,OAAO,GAAG,KAAK;QAEf,IAAA,CAAA,WAAW,GAAG,KAAK;QACnB,IAAA,CAAA,mBAAmB,GAAG,KAAK;QAC3B,IAAA,CAAA,mBAAmB,GAA0B,EAAE;QAG/C,IAAA,CAAA,oBAAoB,GAAY,CAAC;QACjC,IAAA,CAAA,IAAI,GAAW,EAAE;QACjB,IAAA,CAAA,sBAAsB,GAA4B,EAAE;QAMT,IAAA,CAAA,UAAU,GAAG,IAAI;QAEnD,IAAA,CAAA,gBAAgB,GAAG,KAAK;QAExB,IAAA,CAAA,SAAS,GAAG,MAAM;QAClB,IAAA,CAAA,cAAc,GAAG,eAAe;QAChC,IAAA,CAAA,YAAY,GAAG,SAAS;QACxB,IAAA,CAAA,KAAK,GAAG,gBAAgB;QACxB,IAAA,CAAA,qBAAqB,GAAG,aAAa;QACrC,IAAA,CAAA,WAAW,GAAG,SAAS;QACvB,IAAA,CAAA,SAAS,GAAG,IAAI;QAChB,IAAA,CAAA,WAAW,GAAG,EAAE;QAGhB,IAAA,CAAA,YAAY,GAAY,EAAE;QAI1B,IAAA,CAAA,QAAQ,GAAG,KAAK;QAChB,IAAA,CAAA,sBAAsB,GAAG,KAAK;;;AAI7B,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAQ;AACpC,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,OAAO,EAAQ;AACxC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAAW;AACpC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAAQ;AACjC,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAQ;AACzC,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,OAAO,EAAQ;AAsWrD,IAAA;IAraG,eAAe,GAAA;AACX,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAC/B,YAAA,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,IAAI;YACvE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;QACvD;IACJ;IAKA,IAAa,MAAM,KAAsB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9D,IAAA,IAAI,MAAM,CAAC,KAAK,EAAA,EAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAqD3C,IAAc,qBAAqB,KAAK,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAS5E,IAAA,IAAI,cAAc,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,OAAO,WAAW;QACtB;AAAO,aAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACrB,YAAA,OAAO,SAAS;QACpB;AAAO,aAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AACvB,YAAA,OAAO,OAAO;QAClB;aAAO;AACH,YAAA,OAAO,MAAM;QACjB;IACJ;AAEA,IAAA,IAAI,WAAW,GAAA;QACX,IAAI,IAAI,CAAC,OAAO;AACZ,YAAA,OAAO,SAAS;AACf,aAAA,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY;AACtC,YAAA,OAAO,YAAY;aAClB,IAAI,CAAC,IAAI,CAAC,UAAU;AACrB,YAAA,OAAO,mBAAmB;;AAE1B,YAAA,OAAO,MAAM;IACrB;AAEA,IAAA,IAAI,iBAAiB,GAAA;QACjB,IAAI,IAAI,CAAC,QAAQ;AACb,YAAA,OAAO,KAAK;AAEhB,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY;AACjC,YAAA,OAAO,KAAK;AAEhB,QAAA,IAAI,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,WAAW,CAAC;AACtE,YAAA,OAAO,KAAK;AAEhB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;;;AAGlB,YAAA,OAAO,IAAI;QACf;QAEA,OAAO,IAAI,CAAC;eACL,CAAC,IAAI,CAAC;eACN,CAAC,IAAI,CAAC,OAAO;IAExB;AAEA,IAAA,IAAI,aAAa,GAAA,EAAK,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC5E,IAAA,IAAI,cAAc,GAAA,EAAK,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;AACrF,IAAA,IAAI,qBAAqB,GAAA,EAAK,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;;;AAKtF,IAAA,SAAS,CAAC,KAAqB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE;AACzB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACvB;AAEA,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,EAAE;AAC/B,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,UAAU,CAAC,MAAK;AACZ,gBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;AACrC,oBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,CAAC,KAAK,IAAG;AACjE,wBAAA,IAAI,KAAK,KAAK,MAAM,EAAE;AAClB,4BAAA,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,cAAc;AAC1C,gCAAA,IAAI,CAAC,gBAAgB,GAAG,CAAA,cAAA,CAAgB;;AAExC,gCAAA,IAAI,CAAC,gBAAgB,GAAG,CAAA,eAAA,CAAiB;wBACjD;AAAO,6BAAA,IAAI,KAAK,KAAK,UAAU,EAAE;AAC7B,4BAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;wBACrC;AAAO,6BAAA,IAAI,KAAK,KAAK,YAAY,EAAE;AAC/B,4BAAA,IAAI,CAAC,gBAAgB,GAAG,CAAA,aAAA,CAAe;wBAC3C;oBACJ,CAAC,CAAC,CAAC;gBACP;AACJ,YAAA,CAAC,CAAC;QACN;IACJ;;;AAKA,IAAA,oBAAoB,CAAC,OAAe,EAAA,EAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnF,IAAA,oBAAoB,CAAC,MAA2B,EAAA,EAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACjG,OAAO,GAAA,EAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,GAAA,EAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5F,UAAU,GAAA,EAAK,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,cAAc,GAAA,EAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,WAAW,CAAC,IAAa,EAAA,EAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAEhD,IAAA,gBAAgB,CAAC,OAA8B,EAAA;QAC3C,IAAI,OAAO,MAAM,KAAK,WAAW;YAC7B;AAEJ,QAAA,IAAI,CAAC,oBAAoB,GAAG,CAAC;AAC7B,QAAA,IAAI,CAAC,mBAAmB,GAAG,OAAO;QAClC,IAAI,GAAG,GAAG,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,qBAAqB,EAAE;QAC5E,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAEpE,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI;AAC/E,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI;AAC7E,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,GAAG,CAAC,KAAK,IAAI;AAChE,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;IACnC;IAEA,mBAAmB,GAAA;AACf,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;IAC9B;AAEA,IAAA,aAAa,CAAC,OAAgB,EAAA;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC;AACnC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/B,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAChC,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAChC,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AAC5B,YAAA,CAAC,EAAE,CAAC,GAAC,IAAI,CAAC;QACd,CAAC,EAAE,GAAG,CAAC;;QAGP,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,GAAG,GAAG;YACxD,KAAK,CAAC,OAAO,CAAC;IACtB;IAEA,MAAM,YAAY,CAAC,WAAoB,EAAA;AACnC,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AACtC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC;IACvI;IAEA,MAAM,MAAM,CAAC,GAAY,EAAA;AACrB,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AACtC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC;IAChG;IAEA,MAAM,SAAS,CAAC,KAAqB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;gBACxB,IAAI,CAAC,mBAAmB,EAAE;gBAC1B;YACJ;AAEA,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;gBACvB;YACJ;AAEA,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;gBACvB,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE;AACrD,oBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBAC9E,KAAK,CAAC,eAAe,EAAE;oBACvB,KAAK,CAAC,cAAc,EAAE;oBACtB;gBACJ;YACJ;AAEA,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;AACzB,gBAAA,IAAI,IAAI,CAAC,oBAAoB,KAAK,CAAC;oBAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;;oBAE/D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,GAAG,CAAC;gBAC7D,KAAK,CAAC,eAAe,EAAE;gBACvB,KAAK,CAAC,cAAc,EAAE;gBACtB;YACJ;AAAO,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;AAClC,gBAAA,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM;gBAC7F,KAAK,CAAC,eAAe,EAAE;gBACvB,KAAK,CAAC,cAAc,EAAE;gBACtB;YACJ;QACJ;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;AAC5C,YAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC5C,YAAA,IAAI,SAAS,GAAG,QAAQ,CAAC,cAAc;AACvC,YAAA,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;YAC1C,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;YAC1C,IAAI,KAAK,GAAG,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAG,CAAC;AAEnD,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG;AACjB,gBAAA,SAAS,GAAG,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE;YAE/B,IAAI,KAAK,EAAE;AACP,gBAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAC7B,gBAAA,IAAI,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1B,gBAAA,IAAI,SAAS,GAAG;AACZ,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,MAAM,EAAE;iBACX;AACD,gBAAA,IAAI,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC;gBAClC,IAAI,KAAK,EAAE;oBACP,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,SAAS;AACtE,oBAAA,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK;AAC1B,oBAAA,QAAQ,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;AAC1E,oBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG;AACjB,wBAAA,QAAQ,CAAC,cAAc,IAAI,CAAC;AAChC,oBAAA,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,cAAc;gBACnD;qBAAO;AACH,oBAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAA,CAAE,CAAC;gBAC9C;AAGA,gBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;oBACvB,KAAK,CAAC,cAAc,EAAE;oBACtB,KAAK,CAAC,eAAe,EAAE;oBACvB;gBACJ;YACJ;YAEA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;AACxC,gBAAA,MAAM,IAAI,CAAC,WAAW,EAAE;gBACxB;YACJ;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAC7B,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;AAC3B,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;AAExF,gBAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,EAAE,EAAE;oBAC9B,IAAI,CAAC,mBAAmB,EAAE;oBAC1B;gBACJ;YACJ;AAAO,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;gBAClD,IAAI,CAAC,mBAAmB,EAAE;gBAC1B;YACJ;iBAAO;AACH,gBAAA,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC,GAAG;YACtC;AAEA,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrE;aAAO;AACH,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AACnB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,IAAG;AACnC,oBAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;;;AAIxB,oBAAA,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;AACtB,wBAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAE5B,oBAAA,OAAO;AACF,yBAAA,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACjG,yBAAA,GAAG,CAAC,KAAK,KAAK;wBACX,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAA,CAAE;wBAC1C,MAAM,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM;AAC/C,qBAAA,CAAC;AACD,yBAAA,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAEpB,gBAAA,CAAC,CAAC;YACN;AAAO,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AAC1B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,IAAG;AACnC,oBAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACxB,oBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC3D,yBAAA,GAAG,CAAC,CAAC,KAAK;wBACP,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAA,IAAA,EAAO,CAAC,CAAC,WAAW,CAAA,CAAE;AAC3C,wBAAA,MAAM,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC,QAAQ,EAAE;AACnD,qBAAA,CAAC,CAAC;AAEX,gBAAA,CAAC,CAAC;YACN;AAAO,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AAC1B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,IAAG;AACnC,oBAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAExB,OAAO,IAAI,CAAC;AACP,yBAAA,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AACxC,yBAAA,GAAG,CAAC,EAAE,KAAK;wBACR,KAAK,EAAE,IAAI,EAAE,CAAC,OAAO,CAAA,EAAG,EAAE,CAAC,WAAW,GAAG,CAAA,IAAA,EAAO,EAAE,CAAC,WAAW,EAAE,GAAG,CAAA,CAAE,CAAA,CAAE;AACvE,wBAAA,MAAM,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,OAAO,EAAE;AACnD,qBAAA,CAAC;AACD,yBAAA,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAEpB,gBAAA,CAAC,CAAC;YACN;QACJ;IACJ;IAEA,iBAAiB,CAAC,KAAqB,EAAE,cAAuD,EAAA;AAC5F,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,GAAG;AACjC,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc;AACpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrE;AAEA,IAAA,MAAM,WAAW,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,MAAM;YACZ;AAEJ,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI;AACA,YAAA,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE;AAEnC,YAAA,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,cAAc;gBACvC;AAEJ,YAAA,IAAI,OAAO,GAAiB;gBACxB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE;gBAClB,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,OAAO,MAAM,KAAK,WAAW,GAAG,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC;AAC5E,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,WAAW,EAAE,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG;aAC7D;AAED,YAAA,IAAI;AACA,gBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAC1B,gBAAA,IAAI,CAAC,IAAI,GAAG,EAAE;AACd,gBAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE;YACpC;YAAE,OAAO,CAAC,EAAE;gBACR,OAAO,CAAC,KAAK,CAAC,CAAA,2CAAA,EAA8C,CAAC,CAAC,OAAO,CAAA,CAAE,CAAC;AACxE,gBAAA,MAAM,IAAI,OAAO,CAAO,OAAO,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;AACrE,gBAAA,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;YACjC;QAEJ;gBAAU;AACN,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB,UAAU,CAAC,MAAK;AACZ,gBAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE;YACzC,CAAC,EAAE,GAAG,CAAC;QACX;IACJ;AAEA,IAAA,eAAe,CAAC,UAAiC,EAAA,EAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAEnG,IAAA,eAAe,CAAC,UAAiC,EAAA;QAC7C,UAAU,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC;QAC3F,CAAC,EAAE,IAAI,CAAC;IACZ;AAEH,IAAA,gBAAgB,CAAC,UAAiC,EAAA;QAC3C,IAAI,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3D,IAAI,KAAK,IAAI,CAAC;YAChB,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACjD;IAEG,UAAU,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,SAAS;YACf;AACJ,QAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IACjC;+GAraS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,q3CC/BlC,2vLAgKA,EAAA,MAAA,EAAA,CAAA,+tJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAjB,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAiB,yBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,4BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,yBAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,0BAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDjIa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cAGnB,KAAK,EAAA,QAAA,EAAA,2vLAAA,EAAA,MAAA,EAAA,CAAA,+tJAAA,CAAA,EAAA;;sBAahB;;sBAwBA;;sBACA;;sBAAS,WAAW;uBAAC,mBAAmB;;sBACxC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAIA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAKA,SAAS;uBAAC,cAAc;;sBACxB,SAAS;uBAAC,uBAAuB;;sBACjC,SAAS;uBAAC,UAAU;;;AEvGzB;AAkBA;;AAEG;MAOU,sBAAsB,CAAA;IAC/B,WAAA,CACY,OAAwB,EACxB,UAAmC,EACnC,cAA8B,EAC9B,WAAwB,EACxB,MAAc,EAAA;QAJd,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,MAAM,GAAN,MAAM;QAwGlB,IAAA,CAAA,aAAa,GAAY,KAAK;AAM9B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,CAAO,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAgE1D,IAAA,CAAA,YAAY,GAAG,YAAY;;QAGnB,IAAA,CAAA,eAAe,GAAG,EAAE;QAC5B,IAAA,CAAA,qBAAqB,GAAG,KAAK;QAiB7B,IAAA,CAAA,OAAO,GAAY,IAAI;QACvB,IAAA,CAAA,iBAAiB,GAAG,KAAK;QAMhB,IAAA,CAAA,eAAe,GAAsB,EAAE;QAuBxC,IAAA,CAAA,oBAAoB,GAAG,CAAC;QAOvB,IAAA,CAAA,gBAAgB,GAAW,IAAI;AAC/B,QAAA,IAAA,CAAA,eAAe,GAAa;YACjC,CAAA,gBAAA,CAAkB;YAClB,CAAA,+BAAA,CAAiC;YACjC,CAAA,+BAAA,CAAiC;AACjC,YAAA,CAAA;;;AAGC,QAAA;SACJ;QAEQ,IAAA,CAAA,gBAAgB,GAAG,IAAI;AAoDhC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;;AAkC5C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAQ;AACrC,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,OAAO,EAAU;AAC9C,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAQ;AACzC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAe;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAe;AAC1C,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAe;AACpC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,OAAO,EAAQ;AACvC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAQ;AACrC,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAQ;AAGjD;;;;AAIG;QACK,IAAA,CAAA,cAAc,GAAG,KAAK;AACtB,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,YAAY,EAAE;QAMlC,IAAA,CAAA,sBAAsB,GAAG,KAAK;;QAKrB,IAAA,CAAA,WAAW,GAAG,SAAS;QACvB,IAAA,CAAA,SAAS,GAAG,MAAM;QAClB,IAAA,CAAA,cAAc,GAAG,eAAe;QAChC,IAAA,CAAA,UAAU,GAAG,OAAO;QACpB,IAAA,CAAA,YAAY,GAAG,SAAS;QACxB,IAAA,CAAA,qBAAqB,GAAG,MAAM;QAC9B,IAAA,CAAA,gBAAgB,GAAG,gBAAgB;QACnC,IAAA,CAAA,cAAc,GAAG,cAAc;QAC/B,IAAA,CAAA,gBAAgB,GAAG,IAAI;QACvB,IAAA,CAAA,sBAAsB,GAAG,KAAK;QAG9B,IAAA,CAAA,kBAAkB,GAAW,EAAE;AAC/B,QAAA,IAAA,CAAA,gBAAgB,GAAG,CAAA,4BAAA,EAA+B,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA,iBAAA,CAAmB;QAG5F,IAAA,CAAA,YAAY,GAAW,EAAE;QAYlC,IAAA,CAAA,iBAAiB,GAAG,KAAK;AAoDzB,QAAA,IAAA,CAAA,QAAQ,GAAc;AAClB,YAAA,EAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAC;AACjD,YAAA,EAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,4BAA4B,EAAC;AAC/D,YAAA,EAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,qCAAqC,EAAC;SACxE;;AAYkB,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;AACpD,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE;AAC5D,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE;AAClE,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AACtC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AAChD,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;AACxD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;AACpD,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AACpC,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE;QAsBvE,IAAA,CAAA,UAAU,GAAkB,QAAQ;AASpC,QAAA,IAAA,CAAA,WAAW,GAAe,UAAU,CAAC,GAAG;QASvC,IAAA,CAAA,mBAAmB,GAAW,GAAG;QAElC,IAAA,CAAA,SAAS,GAAwB,EAAE;QA2D3C,IAAA,CAAA,iBAAiB,GAAG,KAAK;QACzB,IAAA,CAAA,iBAAiB,GAAG,IAAI;QAUxB,IAAA,CAAA,oBAAoB,GAAG,KAAK;QAC5B,IAAA,CAAA,oBAAoB,GAAG,KAAK;AAhkBxB,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,OAAoB,KAAI;AAC9C,YAAA,IAAI;AACA,gBAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,0BAA0B,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;gBAC/E,IAAI,CAAC,SAAS,EAAE;oBACZ,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;gBACnC;gBAEA,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,aAAa,CAAC,MAAM;AAC9C,oBAAA,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,MAAM;gBAEzC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC,GAAG;AACzC,oBAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG;AAEpC,gBAAA,OAAO,IAAI;YACf;YAAE,OAAO,CAAC,EAAE;AACR,gBAAA,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,CAAC;YACtD;AACJ,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO,OAAoB,KAAI;AAC5C,YAAA,IAAI;AACA,gBAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,0BAA0B,GAAG,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC;gBAC9F,IAAI,CAAC,SAAS,EAAE;oBACZ,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAClD;AACA,gBAAA,OAAO,IAAI;YACf;YAAE,OAAO,CAAC,EAAE;AACR,gBAAA,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,wBAAwB,CAAC;YAC5D;AACJ,QAAA,CAAC;IACL;AAEA,IAAA,IAAI,OAAO,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa;IACxC;AAEQ,IAAA,6BAA6B,CAAC,CAAQ,EAAE,MAAA,GAAiB,EAAE,EAAA;AAC/D,QAAA,IAAI;AACA,YAAA,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC;QAC1C;QAAE,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,GAAG,CAAC,CAAA,iDAAA,EAAoD,CAAC,CAAC,OAAO,CAAA,CAAA,CAAG,CAAC;AAC7E,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAEhB,YAAA,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACpB;IACJ;AAEQ,IAAA,6BAA6B,CAAC,CAAQ,EAAE,MAAA,GAAiB,EAAE,EAAA;AAC/D,QAAA,IAAI;AACA,YAAA,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC;QAC1C;QAAE,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,GAAG,CAAC,CAAA,iDAAA,EAAoD,CAAC,CAAC,OAAO,CAAA,CAAA,CAAG,CAAC;AAC7E,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAEhB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;QAEnE;IACJ;AAEQ,IAAA,sBAAsB,CAAC,CAAQ,EAAE,MAAA,GAAiB,EAAE,EAAA;AACxD,QAAA,IAAI,YAAY,GAAG,CAAC,CAAC,OAAO;AAE5B,QAAA,IAAI,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE;YAC/C,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;AAE/D,YAAA,IAAI,YAAY,CAAC,UAAU,CAAC,CAAA,WAAA,CAAa,CAAC,EAAE;;;AAIxC,gBAAA,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;gBACpE;YACJ;QACJ;QAEA,MAAM,IAAI,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,EAAG,YAAY,CAAA,CAAE,CAAC;IAC/C;;IAIA,QAAQ,GAAA;QACJ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,YAAY,EAAE;AAEnB,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAC/B,YAAA,IAAI,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AACrD,YAAA,IAAI,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG;iBAC5B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACrB,iBAAA,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAGrF,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YAClC,IAAI,SAAS,EAAE;AACX,gBAAA,IAAI,CAAC,eAAe,GAAG,SAAS;YACpC;QACJ;IACJ;IAeA,eAAe,GAAA;AACX,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YAC/B,IAAI,QAAQ,GAAG,MAAK;gBAChB,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAChE,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;oBACjB,UAAU,CAAC,MAAK;AACZ,wBAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AACvB,wBAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;wBACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG;AACzC,oBAAA,CAAC,CAAC;AACN,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC;AAED,YAAA,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;gBACvC,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC;gBAClD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAC9D;iBAAO;;gBAEH,UAAU,CAAC,MAAK;oBACZ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW;oBACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY;oBACxD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG;gBACzC,CAAC,EAAE,IAAI,CAAC;YACZ;AAEA,YAAA,QAAQ,EAAE;QACd;QAEA,IAAI,CAAC,aAAa,EAAE;IACxB;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;QACxB,IAAI,IAAI,CAAC,cAAc;AACnB,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;IACxC;IAEQ,MAAM,oBAAoB,CAAC,OAAe,EAAA;QAC9C,IAAI,OAAO,MAAM,KAAK,WAAW;YAC7B;QAEJ,UAAU,CAAC,YAAW;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,iDAAiD,OAAO,CAAA,CAAA,CAAG,CAAC;;;AAKxE,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACtB,gBAAA,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,MAAM;AACtC,gBAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG;YACrC;YAEA,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE;gBACxD,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,mBAAmB,EAAE,IAAI,CAAC;AAC7B,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC9B,QAAA,CAAC,CAAC;IACN;AAQA,IAAA,IAAI,cAAc,GAAA;QACd,OAAO,IAAI,CAAC,eAAe;IAC/B;IAEA,IAAI,cAAc,CAAC,KAAK,EAAA;AACpB,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;QAClC,UAAU,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;YAC5B,UAAU,CAAC,MAAK;AACZ,gBAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACrC,YAAA,CAAC,CAAC;QACN,CAAC,EAAE,GAAG,CAAC;IACX;AAWQ,IAAA,MAAM,YAAY,GAAA;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE;QAE1D,IAAI,IAAI,CAAC,aAAa,EAAE;YAAE;AAC1B,QAAA,MAAM,IAAI,OAAO,CAAO,OAAO,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,aAAa,EAAE;YAAE;AAC1B,QAAA,MAAM,IAAI,OAAO,CAAO,OAAO,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,aAAa,EAAE;YAAE;AAC1B,QAAA,MAAM,IAAI,OAAO,CAAO,OAAO,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,aAAa,EAAE;YAAE;AAE1B,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,8DAAA,CAAgE,CAAC;AAC7E,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC7B,IAAI,OAAO,MAAM,KAAK,WAAW;AAC7B,YAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,MAAK;gBAClC,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,IAAI,CAAC,YAAY,GAAG,CAAA,sCAAA,CAAwC;YAChE,CAAC,EAAE,IAAI,CAAC;IAChB;AAuCA;;;;;;AAMG;AACH,IAAA,6BAA6B,CAAC,OAAoB,EAAA;QAC9C,IAAI,OAAO,CAAC,eAAe;YACvB,OAAO,IAAI,CAAC,UAAU,EAAE,6BAA6B,CAAC,OAAO,CAAC;;YAE9D,OAAO,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,OAAO,CAAC;IACtE;AAEA;;;;;;AAMG;AACH,IAAA,IAAI,UAAU,GAAA;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAClF;AAEA,IAAA,MAAM,iBAAiB,GAAA;QACnB,IAAI,IAAI,CAAC,UAAU;YACf,OAAO,IAAI,CAAC,UAAU;AAE1B,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;QAC5D,OAAO,IAAI,CAAC,UAAU;IAC1B;AAKA,IAAA,IAAI,WAAW,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,MAAM;AACZ,YAAA,OAAO,WAAW;AAEtB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,WAAW;IAC3C;IAEQ,aAAa,GAAA;QACjB,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AACrF,YAAA,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,CAAA,WAAA,CAAa;YACnC,UAAU,CAAC,MAAK;AACZ,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;gBACpB,IAAI,CAAC,UAAU,EAAE;YACrB,CAAC,EAAE,GAAG,CAAC;AACP,YAAA,OAAO,IAAI;QACf;QAEA,OAAO,CAAC,GAAG,CAAC,CAAA,qBAAA,EAAwB,IAAI,CAAC,WAAW,CAAA,CAAE,CAAC;AACvD,QAAA,IAAI,iBAAiB,GAAG,CAAC,GAAC,IAAI;QAC9B,IAAI,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;YACxD,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE;AACjD,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AACvE,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE;YACtC;QACJ;AAEA,QAAA,OAAO,KAAK;IAChB;IAsDA,SAAS,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,YAAY,EAAE;QACvB;aAAO;AACH,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;QACnC;IACJ;IAIA,IACI,MAAM,KAAqB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,KAAK,EAAA;QACZ,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE;AACrC,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,YAAA,IAAI,CAAC,mBAAmB,EAAE,WAAW,EAAE;AACvC,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QAC1B;AAEA,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,YAAY,EAAE;QAE7C,IAAI,KAAK,EAAE;AACP,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACtB,gBAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,eAAe,CAAC;AAClD,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,eAAe;AAC/C,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI;YAC/B;AAEA,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AAE1D,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB;gBACnC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC;;AAElH,gBAAA,IAAI,CAAC,eAAe,GAAG,WAAW;YAEtC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACjG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7F,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AACjG,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CACxB,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,IAAG;AACxC,gBAAA,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC;AAC/C,gBAAA,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE;oBACnD,IAAI,CAAC,eAAe,EAAE;oBACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CACjB,0CAA0C,EAC1C,SAAS,EACT;AACI,wBAAA,QAAQ,EAAE;AACb,qBAAA,CACJ;gBACL;YACJ,CAAC,CAAC,CACL;QAEL;IACJ;IAOA,IACI,OAAO,KAAa,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,KAAK,EAAA;AACb,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE;AACzB,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;YACrB,UAAU,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACtD;IACJ;IAiBQ,YAAY,GAAA;AAChB,QAAA,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC;AAEvC,QAAA,IAAI,iBAAiB;AACrB,QAAA,iBAAiB,GAAG,UAAU,CAAC,MAAK;AAChC,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,YAAY,GAAG,qBAAqB;AACzC,YAAA,IAAI,CAAC,cAAc,GAAG,oFAAoF;AAC1G,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QACjC,CAAC,EAAE,GAAG,CAAC;AAEP,QAAA,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC,YAAW;YAC9C,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7C,YAAY,CAAC,iBAAiB,CAAC;AAC/B,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AACjC,QAAA,CAAC,CAAC;IACN;IAGA,IAAa,SAAS,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,SAAS,CAAC,KAAK,EAAA;AACf,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE;AAC3B,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;YACvB,IAAI,CAAC,YAAY,EAAE;QACvB;IACJ;IAGA,IAAa,UAAU,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,KAAK,EAAA;AAChB,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;AAC5B,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;YACxB,IAAI,CAAC,YAAY,EAAE;QACvB;IACJ;AAMA;;;AAGG;IACH,IAAa,QAAQ,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,KAAK,EAAA;AACd,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;AAC1D,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB,IAAI,CAAC,YAAY,EAAE;QACvB;IACJ;AAEA,IAAA,IAAI,WAAW,GAAA;QACX,OAAO,UAAU,CAAC,OAAO;IAC7B;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAChB,OAAO;AACH,YAAA,CAAC,UAAU,CAAC,GAAG,GAAG,KAAK;AACvB,YAAA,CAAC,UAAU,CAAC,IAAI,GAAG,MAAM;AACzB,YAAA,CAAC,UAAU,CAAC,OAAO,GAAG,cAAc;AACpC,YAAA,CAAC,UAAU,CAAC,QAAQ,GAAG;SAC1B;IACL;AAEA,IAAA,IAAI,UAAU,GAAA;QACV,OAAO,aAAa,CAAC,OAAO;IAChC;AAEA,IAAA,IAAI,eAAe,GAAA;QACf,OAAO;AACH,YAAA,CAAC,aAAa,CAAC,MAAM,GAAG,QAAQ;AAChC,YAAA,CAAC,aAAa,CAAC,MAAM,GAAG,QAAQ;AAChC,YAAA,CAAC,aAAa,CAAC,KAAK,GAAG;SAC1B;IACL;;IAOA,MAAM,eAAe,CAAC,SAA4B,EAAA;QAC9C,IAAI,OAAO,MAAM,KAAK,WAAW;YAC7B;AAEJ,QAAA,MAAM,IAAI,CAAC,WAAW,CAAC,wBAAwB,EAAE;QAEjD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,CAAI,CAAC;QAC1E,IAAI,OAAO,EAAE;YACT,OAAO,CAAC,cAAc,CAAC;AACnB,gBAAA,MAAM,EAAE,QAAQ;AAChB,gBAAA,KAAK,EAAE;AACV,aAAA,CAAC;QACN;IACJ;AAMA,IAAA,MAAM,cAAc,GAAA;AAChB,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC7B,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;AACnD,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;IAClC;IAKA,MAAM,uBAAuB,CAAC,EAAU,EAAA;AACpC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,QAAA,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;QAExB,MAAM,MAAM,CAAC,KAAK;QAClB,MAAM,IAAI,CAAC,SAAS;QACpB,MAAM,IAAI,CAAC,MAAM;AAEjB,QAAA,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,CAAA,IAAA,CAAM,CAAC;AAC9D,QAAA,IAAI,OAAoB;AAExB,QAAA,IAAI;YACA,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC;QAAE,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,CAAA,iCAAA,EAAoC,CAAC,CAAC,OAAO,CAAA,CAAE,CAAC;AAC9D,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AAEjC,YAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;gBAC/B,UAAU,CAAC,MAAK;oBACZ,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC;oBAC3D,MAAM,CAAC,cAAc,CAAC;AAClB,wBAAA,KAAK,EAAE,QAAQ;AACf,wBAAA,MAAM,EAAE;AACX,qBAAA,CAAC;gBACN,CAAC,EAAE,GAAG,CAAC;YACX;YACA;QACJ;AAEA,QAAA,OAAO,CAAC,cAAc,KAAK,EAAE;;;AAK7B,QAAA,IAAI,OAAO,CAAC,eAAe,EAAE;AAEzB,YAAA,IAAI,aAAa,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;AAClE,YAAA,aAAa,CAAC,cAAc,KAAK,EAAE;;YAGnC,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,aAAa,CAAC;YAE1D,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;;;YAIpD,MAAM,MAAM,CAAC,KAAK;;AAGlB,YAAA,MAAM,IAAI,CAAC,iBAAiB,EAAE;YAC9B,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAEnD,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAEtC,IAAI,OAAO,EAAE;AACT,gBAAA,OAAO,CAAC,cAAc,KAAK,EAAE;AAC7B,gBAAA,OAAO,CAAC,cAAc,CAAC,WAAW,GAAG,IAAI;AACzC,gBAAA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACpB,gBAAA,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACpD;QACJ;aAAO;;YAEH,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAEpD,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,IAAI,OAAO,EAAE;AACT,gBAAA,OAAO,CAAC,cAAc,KAAK,EAAE;AAC7B,gBAAA,OAAO,CAAC,cAAc,CAAC,WAAW,GAAG,IAAI;YAC7C;QACJ;AAEA,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;IAClC;AAEA,IAAA,sBAAsB,CAAC,YAAoB,EAAA;;AAGvC,QAAA,IAAI,YAAY,CAAC,UAAU,CAAC,CAAA,WAAA,CAAa,CAAC,EAAE;;;AAIxC,YAAA,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;YACpE;QACJ;QAEA,KAAK,CAAC,YAAY,CAAC;IACvB;AAEA,IAAA,oBAAoB,CAAC,OAAe,EAAA;AAChC,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7C;AAEA,IAAA,eAAe,CAAC,OAAoB,EAAA;AAChC,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,qBAAqB,OAAO,CAAC,EAAE,CAAA,EAAA,CAAI,CAAC;AACzF,QAAA,IAAI,CAAC,EAAE;YACH;AACJ,QAAA,EAAE,CAAC,cAAc,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAC,CAAC;IACzD;AAEQ,IAAA,cAAc,CAAC,OAAoB,EAAA;AACvC,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC7C;QAEJ,IAAI,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AACpE,QAAA,IAAI,QAAQ;YACR;QACJ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACxC;;AAIA,IAAA,MAAM,WAAW,CAAC,MAAsB,EAAE,OAAoB,EAAA;AAC1D,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACZ,YAAA,MAAM,IAAI,CAAC,UAAU,EAAE;YACvB;QACJ;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;AAC3B,QAAA,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI;AAEpC,QAAA,IAAI;YACA,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC;QAAE,OAAO,CAAC,EAAE;AACR,YAAA,IAAI,CAAC,6BAA6B,CAAC,CAAC,EAAE,+BAA+B,CAAC;QAC1E;gBAAU;AACN,YAAA,MAAM,IAAI,OAAO,CAAO,OAAO,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AACpE,YAAA,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,KAAK;QACzC;IACJ;AAEA,IAAA,MAAM,UAAU,CAAC,MAAsB,EAAE,OAAoB,EAAE,OAAmB,EAAA;QAC9E,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC;;AAE5C,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA,4BAAA,CAA8B,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACxF;AAEA,IAAA,MAAM,YAAY,CAAC,MAAsB,EAAE,OAAoB,EAAA;QAC3D,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;;AAErC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA,8BAAA,CAAgC,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1F;AAEA,IAAA,MAAM,aAAa,CAAC,MAAsB,EAAE,OAAoB,EAAA;AAC5D,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACZ,YAAA,MAAM,IAAI,CAAC,UAAU,EAAE;YACvB;QACJ;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;AAC3B,QAAA,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI;AAEpC,QAAA,IAAI,OAAO,CAAC,SAAS,EAAE,KAAK;AACxB,YAAA,OAAO,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC;AAE5C,QAAA,IAAI;YACA,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C;QAAE,OAAO,CAAC,EAAE;AACR,YAAA,IAAI,CAAC,6BAA6B,CAAC,CAAC,EAAE,iCAAiC,CAAC;QAC5E;AAEA,QAAA,MAAM,IAAI,OAAO,CAAO,OAAO,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AACpE,QAAA,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,KAAK;IACzC;IAEA,MAAM,aAAa,CAAC,OAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,MAAM,eAAe,GAAA;AACjB,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,eAAe;AAElC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK;AAChC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;AACtC,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;QACrC;AAEA,QAAA,IAAI,OAAO;YACP,UAAU,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACvD;IAEA,MAAM,qBAAqB,CAAC,OAAoB,EAAA;AAC5C,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,OAAO,EAAE;AAClC,YAAA,MAAM,IAAI,CAAC,eAAe,EAAE;QAChC;aAAO;AACH,YAAA,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;QACrC;IACJ;IAEA,MAAM,aAAa,CAAC,OAAoB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,OAAO,EAAE;AAClC,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,OAAO,CAAC,EAAE,CAAA,iBAAA,CAAmB,CAAC;YAC5E,OAAO,IAAI,CAAC,qBAAqB;QACrC;AAEA,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK;AAChC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;AACtC,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;QACrC;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AAC5B,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO;AAE9B,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,2BAAA,EAA8B,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,OAAO,CAAC,EAAE,CAAA,GAAA,CAAK,CAAC;AAC1E,QAAA,IAAI,qBAAqB,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE;YACxF,QAAQ,EAAE,IAAI,CAAC;AAClB,SAAA,CAAC;QAEF,IAAI,CAAC,qBAAqB,EAAE;AACxB,YAAA,OAAO,CAAC,IAAI,CAAC,CAAA,oCAAA,EAAuC,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,OAAO,CAAC,EAAE,CAAA,CAAA,CAAG,CAAC;AAClF,YAAA,OAAO,IAAI;QACf;AAEA,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,0BAAA,EAA6B,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,OAAO,CAAC,EAAE,CAAA,CAAA,CAAG,CAAC;QAEvE,UAAU,CAAC,MAAM,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACpD,UAAU,CAAC,YAAW;AAClB,YAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB;QACtD,CAAC,EAAE,GAAG,CAAC;AAEP,QAAA,OAAO,qBAAqB;IAChC;AAEA,IAAA,MAAM,UAAU,GAAA;AACZ,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC/B;AAEA,IAAA,MAAM,cAAc,GAAA;AAChB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;IACnC;IAEA,MAAM,iBAAiB,CAAC,OAAoB,EAAA;AACxC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;IAEA,MAAM,cAAc,CAAC,IAAU,EAAA;AAC3B,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IACrC;IAEA,MAAM,YAAY,CAAC,IAAU,EAAA;AACzB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACnC;IAEA,MAAM,YAAY,CAAC,OAAoB,EAAA;AACnC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;IAC9B;IAEA,MAAM,aAAa,CAAC,OAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACZ,YAAA,MAAM,IAAI,CAAC,UAAU,EAAE;YACvB;QACJ;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,4EAA4E,CAAC;YACtF;AAEJ,QAAA,IAAI;YACA,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAE3C,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE;gBACvC,IAAI,CAAC,eAAe,EAAE;QAE9B;QAAE,OAAO,CAAC,EAAE;AACR,YAAA,IAAI,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAA,0BAAA,CAA4B,CAAC;QACvE;IACJ;AAEA,IAAA,MAAM,WAAW,CAAC,MAAsB,EAAE,OAAoB,EAAE,OAAe,EAAA;AAC3E,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACZ,YAAA,MAAM,IAAI,CAAC,UAAU,EAAE;YACvB;QACJ;AAEA,QAAA,IAAI;YACA,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC;QACjD;QAAE,OAAO,CAAC,EAAE;AACR,YAAA,IAAI,CAAC,6BAA6B,CAAC,CAAC,EAAE,+BAA+B,CAAC;YACtE;QACJ;AAEA,QAAA,OAAO,CAAC,OAAO,GAAG,OAAO;AACzB,QAAA,OAAO,CAAC,cAAc,CAAC,OAAO,GAAG,KAAK;IAC1C;IAEA,MAAM,YAAY,CAAC,OAAoB,EAAA;QACnC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,GAAG,KAAK;AACnD,QAAA,OAAO,CAAC,cAAc,CAAC,OAAO,GAAG,IAAI;IACzC;AAEA,IAAA,MAAM,QAAQ,CAAC,OAAoB,EAAE,IAAY,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACZ,YAAA,MAAM,IAAI,CAAC,UAAU,EAAE;YACvB;QACJ;AAEA,QAAA,IAAI;AACA,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC;AAC/C,YAAA,OAAO,CAAC,cAAc,CAAC,OAAO,GAAG,KAAK;QAC1C;QAAE,OAAO,CAAC,EAAE;AACR,YAAA,IAAI,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAA,wBAAA,CAA0B,CAAC;QACrE;IACJ;+GA93BS,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAL,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAhB,IAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,48CAgHjB,8BAA8B,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAS,WAAW,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAwJlD,oBAAoB,gDCnStC,qpbA8SA,EAAA,MAAA,EAAA,CAAA,u8DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAc,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,gBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,qBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,OAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,QAAA,EAAA,UAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,2BAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAxB,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDnRa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cAGd,KAAK,EAAA,QAAA,EAAA,qpbAAA,EAAA,MAAA,EAAA,CAAA,u8DAAA,CAAA,EAAA;;sBA+GhB,WAAW;uBAAC,oBAAoB;;sBAGhC,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,8BAA8B,EAAE,EAAC,IAAI,EAAE,WAAW,EAAC;;sBAgGhE;;sBA4BA;;sBAEA;;sBACA;;sBAUA;;sBAYA,SAAS;uBAAC,aAAa;;sBAGvB,YAAY;uBAAC,oBAAoB;;sBAqGjC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBAcA;;sBAiDA;;sBAMA;;sBAWA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAuBA;;sBASA;;sBAQA;;sBAQA;;;MExhBQ,oBAAoB,CAAA;AANjC,IAAA,WAAA,GAAA;AAOY,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;AAC/B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAQ;AAkD9C,IAAA;AA7CG,IAAA,IACI,YAAY,GAAA;QACZ,OAAO,IAAI,CAAC,aAAa;IAC7B;AAEA,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA,IAAA,IACI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ;IACxB;AAEA,IAAA,aAAa,CAAC,IAAW,EAAA;AACrB,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AACxB,YAAA,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS;YACxB,OAAO,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,CAAG;QACxB;AAEA,QAAA,OAAO,IAAI;IACf;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACxB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;IAEA,UAAU,GAAA;QACN,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9C;+GApDS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,0NCVjC,o5BAyBM,EAAA,MAAA,EAAA,CAAA,6/DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDfO,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAGlB,KAAK,EAAA,QAAA,EAAA,o5BAAA,EAAA,MAAA,EAAA,CAAA,6/DAAA,CAAA,EAAA;;sBAQhB;;sBAGA;;sBAKA;;sBAKA;;sBAKA;;;MEtBQ,iBAAiB,CAAA;IAC1B,WAAA,CACY,OAAwB,EACxB,UAAoC,EAAA;QADpC,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,UAAU,GAAV,UAAU;AAKd,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAE;AAQhC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AAC1C,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AAC1C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAe;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAe;AAC1C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AAClD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;QAoDlD,IAAA,CAAA,QAAQ,GAAmB,EAAE;QAMpB,IAAA,CAAA,WAAW,GAAY,GAAG;QAC1B,IAAA,CAAA,UAAU,GAAG,sBAAsB;IA9E5C;AAKA,IAAA,IACI,MAAM,GAAA;QACN,OAAO,IAAI,CAAC,OAAO;IACvB;IAaA,IAAc,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,IAAc,YAAY,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAc,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,IAAc,OAAO,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,IAAc,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;IAEnD,IAAI,MAAM,CAAC,KAAK,EAAA;AACZ,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;AAC9B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QAC3B;AAEA,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AAEpB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;QAElB,IAAI,KAAK,EAAE;AACP,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,YAAY,EAAE;YACrC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE;YAEtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9F,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAEtF,IAAI,CAAC,WAAW,CAAC,GAAG,CAChB,IAAI,CAAC,OAAO,CAAC;AACR,iBAAA,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAClD;YAED,IAAI,CAAC,kBAAkB,EAAE;QAC7B;IACJ;AAEQ,IAAA,MAAM,kBAAkB,GAAA;QAC5B,IAAI,QAAQ,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;AACzD,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE;QAC1C,IAAI,CAAC,YAAY,EAAE;IACvB;IAEQ,YAAY,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM;YACZ;AAEJ,QAAA,IAAI,MAAkD;AAEtD,QAAA,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AAExC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9B;AAWQ,IAAA,UAAU,CAAC,OAAqB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW;AAC1C,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;QAC7B;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,YAAY,EAAE;IACvB;AAEQ,IAAA,eAAe,CAAC,OAAqB,EAAA;AACzC,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;QAE5B,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACzB,UAAU,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC/C;IAEA,kBAAkB,GAAA;QACd,IAAI,CAAC,IAAI,CAAC,gBAAgB;AACtB,YAAA,OAAO,KAAK;AAEhB,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa;AAC5C,QAAA,IAAI,aAAa,GAAG,EAAE,CAAC,SAAS;QAChC,IAAI,YAAY,GAAG,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY;AAEpD,QAAA,OAAO,aAAa,GAAG,YAAY,GAAG,EAAE;IAC5C;AAEQ,IAAA,WAAW,CAAC,OAAqB,EAAA;AACrC,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACtB;QAEJ,UAAU,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC3C;IAEA,cAAc,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACtB;AAEJ,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa;AAC5C,QAAA,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY;IAClC;AAEA,IAAA,MAAM,CAAC,OAAqB,EAAA;AACxB,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC3C,QAAA,IAAI,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA,4BAAA,EAA+B,OAAO,CAAC,EAAE,CAAA,EAAA,CAAI,CAAC;QAEzF,IAAI,CAAC,cAAc,EAAE;AACjB,YAAA,KAAK,CAAC,CAAA,uBAAA,EAA0B,OAAO,CAAC,EAAE,CAAA,CAAE,CAAC;YAC7C;QACJ;QAEA,cAAc,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAErD,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IAC9B;AAEA,IAAA,YAAY,CAAC,OAAqB,EAAA;AAC9B,QAAA,IAAI,CAAC,OAAO;YACR;AAEJ,QAAA,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,EAAE;;IAEtC;AAKA,IAAA,UAAU,CAAC,OAAqB,EAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW;AACjB,YAAA,OAAO,KAAK;AAEhB,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;AACzD,YAAA,OAAO,IAAI;AAEf,QAAA,OAAO,KAAK;IAChB;AAEA,IAAA,aAAa,CAAC,OAAqB,EAAA;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B;AAEA,IAAA,aAAa,CAAC,OAAqB,EAAA;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,aAAa,CAAC,OAAqB,EAAA;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,iBAAiB,CAAC,OAAqB,EAAA;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;AAEA,IAAA,aAAa,CAAC,IAAW,EAAA;AACrB,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AACxB,YAAA,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS;YACxB,OAAO,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,CAAG;QACxB;AAEA,QAAA,OAAO,IAAI;IACf;+GA9LS,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAgB,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,uZCZ9B,01BAyBM,EAAA,MAAA,EAAA,CAAA,2oBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAW,oBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDbO,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cAGf,KAAK,EAAA,QAAA,EAAA,01BAAA,EAAA,MAAA,EAAA,CAAA,2oBAAA,CAAA,EAAA;;sBAahB;;sBAgBA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAiDA,SAAS;uBAAC,kBAAkB;;sBAG5B;;sBACA;;;AExFL;;AAEG;MAOU,kBAAkB,CAAA;AAC3B,IAAA,WAAA,CACY,OAAyB,EAAA;QAAzB,IAAA,CAAA,OAAO,GAAP,OAAO;AAKX,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,YAAY,EAAE;QAClC,IAAA,CAAA,IAAI,GAAU,IAAI;QA+BV,IAAA,CAAA,SAAS,GAAwB,EAAE;QA+BlC,IAAA,CAAA,WAAW,GAAG,SAAS;QACvB,IAAA,CAAA,SAAS,GAAG,MAAM;QAClB,IAAA,CAAA,qBAAqB,GAAG,MAAM;QAC9B,IAAA,CAAA,uBAAuB,GAAG,MAAM;QAChC,IAAA,CAAA,UAAU,GAAG,sBAAsB;AAEpC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AAC1C,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AAC1C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAe;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAe;AAC1C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AAClD,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,OAAO,EAAU;AAC9C,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE;AACpE,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAQ;AACrC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;AACtD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAe;AACtC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;QAclD,IAAA,CAAA,cAAc,GAAG,KAAK;QA6DtB,IAAA,CAAA,UAAU,GAAoB,EAAE;IAhKhC;IASA,QAAQ,GAAA;QACJ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChF;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;IAC5B;AAEA,IAAA,IACI,MAAM,GAAA;QACN,OAAO,IAAI,CAAC,OAAO;IACvB;IAEA,IAAI,MAAM,CAAC,KAAK,EAAA;AACZ,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;IACxB;AAEA,IAAA,IACI,OAAO,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU;IAClC;IAEA,IAAI,OAAO,CAAC,KAAK,EAAA;AACb,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;IACpC;AAIA;;;AAGG;IACH,IAAa,QAAQ,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,KAAK,EAAA;AACd,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;AAC1D,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB,IAAI,CAAC,YAAY,EAAE;QACvB;IACJ;IAGQ,YAAY,GAAA;AAChB,QAAA,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACvC,QAAA,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;AAC3C,QAAA,CAAC,CAAC;IACN;IAEQ,MAAM,oBAAoB,CAAC,OAAgB,EAAA;QAC/C,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK;AAClC,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE;YACzD,QAAQ,EAAE,IAAI,CAAC;AAClB,SAAA,CAAC;IACN;IAuBA,IAAc,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,IAAc,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,IAAc,OAAO,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,IAAc,YAAY,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAc,qBAAqB,KAAK,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC7E,IAAc,cAAc,KAAK,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/D,IAAc,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;AAEnD,IAAA,UAAU,CAAC,OAAoB,EAAA;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC;IAIA,UAAU,GAAA;AACN,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC/B;AAEA,IAAA,mBAAmB,CAAC,OAAgB,EAAA;AAChC,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7C;AAEA,IAAA,WAAW,CAAC,KAAK,EAAA;QACb,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE;QAE3C,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,OAAO,GAAG,KAAK;IAC7C;AAEA,IAAA,SAAS,CAAC,KAAqB,EAAA;;IAE/B;AAKA,IAAA,aAAa,CAAC,OAAqB,EAAA;QAC/B,IAAI,IAAI,CAAC,QAAQ;AACb,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACrC;AAEA,IAAA,MAAM,CAAC,OAAqB,EAAA;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,UAAU,CAAC,OAAqB,EAAA;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;AAEA,IAAA,MAAM,CAAC,OAAqB,EAAA;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC;IAEA,MAAM,MAAM,CAAC,OAAqB,EAAA;QAC9B,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;AACzC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B;AAEA,IAAA,IAAI,OAAO,GAAA;QACP,IAAI,CAAC,IAAI,CAAC,IAAI;AACV,YAAA,OAAO,KAAK;;;;;;;AAWhB,QAAA,OAAO,IAAI;IACf;AAIA,IAAA,MAAM,WAAW,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,MAAM;YACZ;AAEJ,QAAA,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE;AACjD,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,EAAE;QAE5B,IAAI,IAAI,KAAK,EAAE;YACX;AAEJ,QAAA,IAAI,OAAO,GAAiB;AACxB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE;AAClB,YAAA,KAAK,EAAE,CAAC;YACR,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,OAAO,MAAM,KAAK,WAAW,GAAG,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC;AAC5E,YAAA,OAAO,EAAE;SACZ;AAED,QAAA,IAAI;AACA,YAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,0BAA0B,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YAC/E,IAAI,CAAC,SAAS,EAAE;gBACZ,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACnC;AAEA,YAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;AAC9B,YAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,EAAE;QAC9C;QAAE,OAAO,CAAC,EAAE;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,OAAO,CAAC;AAClD,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACpB;IACJ;+GApMS,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAX,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,2xBCjB/B,o9CA8CS,EAAA,MAAA,EAAA,CAAA,4uCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAhB,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA2B,4BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,iBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FD7BI,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,cAGV,KAAK,EAAA,QAAA,EAAA,o9CAAA,EAAA,MAAA,EAAA,CAAA,4uCAAA,CAAA,EAAA;;sBAYhB;;sBACA;;sBAUA;;sBASA;;sBAeA;;sBAyBA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAiBA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBA0BA,SAAS;uBAAC,UAAU;;sBACpB,SAAS;uBAAC,OAAO;;;MEzHT,oBAAoB,CAAA;AAC7B,IAAA,WAAA,CACY,OAAyB,EAAA;QAAzB,IAAA,CAAA,OAAO,GAAP,OAAO;AAMX,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;IALvC;AAOA,IAAA,IACI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ;IACxB;AAEA,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA,IAAA,IACI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ;IACxB;IAIA,IAAI,OAAO,CAAC,KAAK,EAAA;QACb,IAAI,UAAU,GAAG,IAAI;QACrB,IAAI,IAAI,CAAC,QAAQ;AACb,YAAA,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE;AAEjC,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QAErB,IAAI,KAAK,IAAI,UAAU,KAAK,KAAK,CAAC,EAAE,EAAE;YAClC;QACJ;QAEA,IAAI,IAAI,CAAC,WAAW;YAChB,IAAI,CAAC,WAAW,EAAE;QAEtB,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1F;IACJ;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACxB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;+GA/DS,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAb,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAbnB,CAAA;;;;;;;;;AASL,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAc,gBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAII,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAfhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,QAAA,EACpB,CAAA;;;;;;;;;AASL,QAAA,CAAA,EAAA,UAAA,EAEO,KAAK,EAAA;;sBAchB;;sBAKA;;sBAKA;;sBAKA;;;MC3BQ,wBAAwB,CAAA;AACjC,IAAA,WAAA,CACY,OAAyB,EAAA;QAAzB,IAAA,CAAA,OAAO,GAAP,OAAO;AAMX,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;IALvC;AAOA,IAAA,IACI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ;IACxB;AAEA,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA,IAAA,IACI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ;IACxB;IAIA,IAAI,OAAO,CAAC,KAAK,EAAA;QACb,IAAI,UAAU,GAAG,IAAI;QACrB,IAAI,IAAI,CAAC,QAAQ;AACb,YAAA,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE;AAEjC,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QAErB,IAAI,KAAK,IAAI,UAAU,KAAK,KAAK,CAAC,EAAE,EAAE;YAClC;QACJ;QAEA,IAAI,IAAI,CAAC,WAAW;YAChB,IAAI,CAAC,WAAW,EAAE;QAEtB,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1F;IACJ;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACxB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;+GA/DS,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAd,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAbvB,CAAA;;;;;;;;;AASL,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAW,oBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAII,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAfpC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,QAAA,EACzB,CAAA;;;;;;;;;AASL,QAAA,CAAA,EAAA,UAAA,EAEO,KAAK,EAAA;;sBAchB;;sBAKA;;sBAKA;;sBAKA;;;MClBQ,oBAAoB,CAAA;AAC7B,IAAA,WAAA,GAAA;AAKQ,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;IALvC;AASA,IAAA,IACI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ;IACxB;AAEA,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA,IAAA,IACI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA,IAAA,IACI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ;IACxB;IAEA,IAAI,OAAO,CAAC,KAAK,EAAA;AACb,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAC3C;AAEQ,IAAA,WAAW,CAAC,OAAqB,EAAA;AACrC,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;AACrC,YAAA,OAAO,MAAM;AACZ,aAAA,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC1C,YAAA,OAAO,SAAS;AAEpB,QAAA,OAAO,SAAS;IACpB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACxB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;+GAxDS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvBnB,CAAA;;;;;;;;;;;;;;;;;;;AAmBL,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,oBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,wBAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAII,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAzBhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,QAAA,EACpB,CAAA;;;;;;;;;;;;;;;;;;;AAmBL,QAAA,CAAA,EAAA,UAAA,EAEO,KAAK,EAAA;;sBAchB;;sBAKA;;sBAKA;;sBAKA;;;AC/CL;;AAEG;MAOU,cAAc,CAAA;IACvB,WAAA,CACY,OAAyB,EACzB,SAAqB,EAAA;QADrB,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,SAAS,GAAT,SAAS;AAQb,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,YAAY,EAAE;QAElC,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,QAAQ,GAAG,eAAe;QAC1B,IAAA,CAAA,OAAO,GAAG,eAAe;QAUzB,IAAA,CAAA,WAAW,GAAY,IAAI;QAyE3B,IAAA,CAAA,gBAAgB,GAAG,KAAK;QA+Bf,IAAA,CAAA,SAAS,GAAG,MAAM;QAClB,IAAA,CAAA,aAAa,GAAG,UAAU;QAC1B,IAAA,CAAA,sBAAsB,GAAG,KAAK;AAc/B,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAQ;QA8B7C,IAAA,CAAA,SAAS,GAAiB,IAAI;QAC9B,IAAA,CAAA,YAAY,GAAoB,IAAI;QA0CpC,IAAA,CAAA,kBAAkB,GAAoB,EAAE;QAExC,IAAA,CAAA,gBAAgB,GAAG,iMAAiM;IAvNpN;IAYA,QAAQ,GAAA;QACJ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QACnF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC;AAClG,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,IAAG;AACtD,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QACpC,CAAC,CAAC,CAAC;IACP;AAIA,IAAA,MAAM,mBAAmB,GAAA;AACrB,QAAA,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE;AACzD,QAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,GAAG,EAAE;QAEpC,IAAI,IAAI,KAAK,EAAE;YACX;AAEJ,QAAA,IAAI,OAAO,GAAiB;AACxB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE;AAClB,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,OAAO,EAAE;SACZ;AAED,QAAA,IAAI;YACA,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QACzC;QAAE,OAAO,CAAC,EAAE;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,iCAAA,CAAmC,CAAC;AAClD,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACpB;IACJ;IAKA,MAAM,WAAW,CAAC,OAAqB,EAAA;QAEnC,IAAI,aAAa,GAAG,OAAO;AAE3B,QAAA,IAAI,OAAO,CAAC,eAAe,EAAE;;AAGzB,YAAA,IAAI,aAA0B;AAE9B,YAAA,IAAI;AACA,gBAAA,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC;YAC3F;YAAE,OAAO,CAAC,EAAE;AACR,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,iDAAA,CAAmD,CAAC;AAClE,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACpB;YAEA,IAAI,CAAC,aAAa,EAAE;AAChB,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,iCAAA,EAAoC,OAAO,CAAC,OAAO,CAAA,CAAA,EAAI,OAAO,CAAC,eAAe,CAAA,CAAE,CAAC;AAC/F,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,qBAAA,CAAuB,CAAC;AACtC,gBAAA,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;gBAC1B;YACJ;YAEA,OAAO,GAAG,aAAa;QAC3B;QAEA,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AAExC,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,gBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK;AACvB,oBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YAC5B;AACA,YAAA,IAAI,CAAC,WAAW,GAAG,QAAQ;AAC3B,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO;AACxB,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;AACtF,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC;AAC3D,YAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;QAChC;AAAO,aAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;AAC5B,YAAA,IAAI,CAAC,WAAW,GAAG,UAAU;AAC7B,YAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;QACxC;IACJ;IAKA,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK;AACvB,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC5B;IACJ;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;IAC5B;IAEA,OAAO,CAAC,KAAc,EAAE,IAAa,EAAA;AACjC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;IAC5B;IAEA,iBAAiB,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,eAAe,CAAC;IAClD;AAEA,IAAA,IACI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ;IACxB;IAMA,IAAI,OAAO,CAAC,KAAK,EAAA;AACb,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QAErB,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;IACtC;IAEQ,MAAM,cAAc,CAAC,EAAW,EAAA;AACpC,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA,EAAG,EAAE,CAAA,SAAA,CAAW,CAAC;AAC5E,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA,EAAG,EAAE,CAAA,SAAA,CAAW,CAAC;IAC7E;AAIA,IAAA,IACI,cAAc,GAAA;QACd,OAAO,IAAI,CAAC,eAAe;IAC/B;IAEA,UAAU,GAAA;AACN,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC/B;IAEA,KAAK,GAAA;AACD,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK;AACzB,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC/B,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC9B;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AAC5B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QAC3B;IACJ;AAEA,IAAA,IACI,QAAQ,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI;IACjC;IAKA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU;IACjC;AAEA,IAAA,WAAW,CAAC,OAAqB,EAAA;AAC7B,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;AACrC,YAAA,OAAO,MAAM;AACZ,aAAA,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC1C,YAAA,OAAO,SAAS;AAEpB,QAAA,OAAO,SAAS;IACpB;IAEA,MAAM,aAAa,CAAC,OAAqB,EAAA;;;IAGzC;AAEA,IAAA,WAAW,CAAC,IAAW,EAAA;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACvB,IAAI,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,QAAQ,CAAA,UAAA,CAAY,EAAE,SAAS,CAAC;IAC1D;AAMA,IAAA,UAAU,CAAC,OAAqB,EAAA;AAC5B,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QACpB,KAAK,CAAC,mBAAmB,CAAC;IAC9B;AAEA,IAAA,aAAa,CAAC,OAAqB,EAAA;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO;AAC9B,QAAA,IAAI,CAAC,OAAO,CAAC,CAAA,qBAAA,EAAwB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAA,CAAE,EAAE,QAAQ,CAAC;IAC3E;IAQA,aAAa,CAAC,KAAmB,EAAA,EAAiC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAClG,aAAa,CAAC,KAAmB,EAAA,EAAiC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAClG,cAAc,CAAC,KAAmB,EAAA,EAAkC,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACrG,YAAY,CAAC,KAAmB,EAAA,EAAgC,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;+GAjOtF,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAhB,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAhB,IAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,+aClB3B,6kQAgPA,EAAA,MAAA,EAAA,CAAA,mvGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAgC,kBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,gBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,4BAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,4BAAA,EAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,EAAA,WAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAf,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAgB,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FD9Na,cAAc,EAAA,UAAA,EAAA,CAAA;kBAN1B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,KAAA,CAAO,cAGL,KAAK,EAAA,QAAA,EAAA,6kQAAA,EAAA,MAAA,EAAA,CAAA,mvGAAA,CAAA,EAAA;;sBAmDhB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBA2EtC;;sBAKA;;sBACA;;sBACA;;sBAgBA;;sBAuBA,WAAW;uBAAC,mBAAmB;;;MEzKvB,kBAAkB,CAAA;+GAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,uEAfjB,CAAA,KAAA,CAAO,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,uFAAA,CAAA,EAAA,CAAA,CAAA;;4FAeR,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAjB9B,SAAS;+BACI,YAAY,EAAA,QAAA,EACZ,CAAA,KAAA,CAAO,EAAA,UAAA,EAaL,KAAK,EAAA,MAAA,EAAA,CAAA,uFAAA,CAAA,EAAA;;;ACNrB,MAAMlC,YAAU,GAAG;IACf,oBAAoB;IACpB,wBAAwB;IACxB,iBAAiB;IACjB;CACH;MAaY,UAAU,CAAA;+GAAV,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAV,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,iBAjBnB,oBAAoB;YACpB,wBAAwB;YACxB,iBAAiB;AACjB,YAAA,kBAAkB,aAMd,YAAY;YACZ,WAAW;YACX,aAAa;YACb,eAAe;AACf,YAAA,WAAW,aAbf,oBAAoB;YACpB,wBAAwB;YACxB,iBAAiB;YACjB,kBAAkB,CAAA,EAAA,CAAA,CAAA;AAcT,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,YARf,YAAY;YACZ,WAAW;YACX,aAAa;YACb,eAAe;YACf,WAAW,CAAA,EAAA,CAAA,CAAA;;4FAIN,UAAU,EAAA,UAAA,EAAA,CAAA;kBAXtB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,YAAY,EAAEA,YAAU;AACxB,oBAAA,OAAO,EAAE;wBACL,YAAY;wBACZ,WAAW;wBACX,aAAa;wBACb,eAAe;wBACf;AACH,qBAAA;AACD,oBAAA,OAAO,EAAEA;AACZ,iBAAA;;;MClBY,oBAAoB,CAAA;AANjC,IAAA,WAAA,GAAA;QAQE,IAAA,CAAA,aAAa,GAAG,aAAa;AACrB,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAAiB;AAC1C,QAAA,IAAA,CAAA,KAAK,GAAkB,aAAa,CAAC,KAAK;AAkBnD,IAAA;AAhBC,IAAA,IACI,IAAI,GAAA;QACN,OAAO,IAAI,CAAC,KAAK;IACnB;IAEA,IAAI,IAAI,CAAC,KAAK,EAAA;AACZ,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD;IACF;AAEA,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;IACxC;+GArBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,gJCVjC,oYAOiB,EAAA,MAAA,EAAA,CAAA,8BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDGJ,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAGlB,KAAK,EAAA,QAAA,EAAA,oYAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,CAAA,EAAA;;sBAQlB;;sBAYA;;;AEGH,MAAM,UAAU,GAAG;IACf,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,oBAAoB;IACpB,yBAAyB;IACzB,8BAA8B;IAC9B,2BAA2B;IAC3B;CACH;MA2BY,cAAc,CAAA;+GAAd,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,iBArCvB,gBAAgB;YAChB,oBAAoB;YACpB,sBAAsB;YACtB,oBAAoB;YACpB,qBAAqB;YACrB,oBAAoB;YACpB,yBAAyB;YACzB,8BAA8B;YAC9B,2BAA2B;AAC3B,YAAA,0BAA0B,aAM1B,YAAY;YACZ,eAAe;YACf,WAAW;YACX,aAAa;YACb,kBAAkB;YAClB,cAAc;YACd,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,wBAAwB;YACxB,iBAAiB;YACjB,WAAW;YACX,gBAAgB;YAChB,mBAAmB;YACnB,eAAe;YACf,cAAc;YACd,cAAc;YACd,aAAa;AACb,YAAA,YAAY,aAjCZ,gBAAgB;YAChB,oBAAoB;YACpB,sBAAsB;YACtB,oBAAoB;YACpB,qBAAqB;YACrB,oBAAoB;YACpB,yBAAyB;YACzB,8BAA8B;YAC9B,2BAA2B;YAC3B,0BAA0B,CAAA,EAAA,CAAA,CAAA;AA4BjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAtBvB,YAAY;YACZ,eAAe;YACf,WAAW;YACX,aAAa;YACb,kBAAkB;YAClB,cAAc;YACd,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,wBAAwB;YACxB,iBAAiB;YACjB,WAAW;YACX,gBAAgB;YAChB,mBAAmB;YACnB,eAAe;YACf,cAAc;YACd,cAAc;YACd,aAAa;YACb,YAAY,CAAA,EAAA,CAAA,CAAA;;4FAIH,cAAc,EAAA,UAAA,EAAA,CAAA;kBAzB1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,YAAY,EAAE,UAAU;AAC1B,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,eAAe;wBACf,WAAW;wBACX,aAAa;wBACb,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,gBAAgB;wBAChB,wBAAwB;wBACxB,iBAAiB;wBACjB,WAAW;wBACX,gBAAgB;wBAChB,mBAAmB;wBACnB,eAAe;wBACf,cAAc;wBACd,cAAc;wBACd,aAAa;wBACb;AACD,qBAAA;AACC,oBAAA,OAAO,EAAE;AACZ,iBAAA;;;ACtDK,MAAO,UAAW,SAAQ,SAAS,CAAA;AACrC,IAAA,WAAA,CACa,OAAoB,EACpB,UAAkB,EAClB,gBAAwB,EACjC,OAA0B,EAAA;AAE1B,QAAA,KAAK,EAAE;QALE,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;AASrB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAE;QAGzC,IAAA,CAAA,QAAQ,GAAG,KAAK;QAChB,IAAA,CAAA,WAAW,GAAG,IAAI;QAKV,IAAA,CAAA,MAAM,GAAqD,YAAY;AAmBvE,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,OAAO,EAAoD;AACzF,QAAA,IAAA,CAAA,wBAAwB,GAAG,IAAI,CAAC,uBAAuB,CAAC,YAAY,EAAE;QAGtE,IAAA,CAAA,WAAW,GAAG,KAAK;QAoHnB,IAAA,CAAA,gBAAgB,GAAG,CAAC;QAyCpB,IAAA,CAAA,YAAY,GAAgB,YAAY;QACxC,IAAA,CAAA,mBAAmB,GAAG,IAAI,eAAe,CAAc,IAAI,CAAC,YAAY,CAAC;AACzE,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE;AAgD9D,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,GAAG,EAAuB;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,OAAO,EAAe;AAC7C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAe;AAC5C,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAe;AACzC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,OAAO,EAAe;QAOrD,IAAA,CAAA,QAAQ,GAAkB,EAAE;AA/PxB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE;AAC5B,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,CAAO,OAAO,IAAI,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;IACvE;AAcA,IAAA,IAAI,SAAS,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS;IAClC;AAEA,IAAA,IAAI,UAAU,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU;IACnC;AAEA,IAAA,IAAI,KAAK,GAAA;QACL,OAAO,IAAI,CAAC,MAAM;IACtB;IAEA,IAAI,KAAK,CAAC,KAAK,EAAA;AACX,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpE;IAIA,IAAI,sBAAsB,KAAK,OAAO,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAIrE,MAAM,IAAI,CAAC,MAAqB,EAAA;AAC5B,QAAA,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAElB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AAEpF,QAAA,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAW;YACvC,OAAO,CAAC,GAAG,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,CAAA,gBAAA,CAAkB,CAAC;AAC5D,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAW;YACxC,OAAO,CAAC,GAAG,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,CAAA,cAAA,CAAgB,CAAC;AAC1D,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAW;AACvC,YAAA,IAAI,CAAC,KAAK,GAAG,MAAM;AACvB,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAW;AAC1C,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,MAAM,IAAI,CAAC,YAAY,EAAE;AACzB,YAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;AACjC,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI;AACA,YAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QACjC;QAAE,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,CAAA,0DAAA,EAA6D,CAAC,CAAC,OAAO,CAAA,CAAE,CAAC;QAC3F;AAEA,QAAA,OAAO,IAAI;IACf;AAEQ,IAAA,mBAAmB,CAAC,QAAuB,EAAA;AAC/C,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACpE;AAEQ,IAAA,kBAAkB,CAAC,OAAoB,EAAA;AAC3C,QAAA,IAAI,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,IAAI,eAAe,EAAE;YACjB,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC;QACrD;aAAO;YACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC;AACxC,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QACvC;AAEA,QAAA,OAAO,OAAO;IAClB;AAEA;;;;;;;;;;;AAWG;IACH,MAAM,SAAS,CAAC,EAAU,EAAA;AACtB,QAAA,IAAI;YACA,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YACtD,IAAI,QAAQ,EAAE;AACV,gBAAA,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;YACjD;AAEA,YAAA,OAAO,QAAQ;QACnB;QAAE,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,CAAA,uDAAA,CAAyD,CAAC;AACjG,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,YAAA,OAAO,EAAE;QACb;IACJ;AAEA,IAAA,MAAM,mBAAmB,GAAA;AACrB,QAAA,IAAI;AACA,YAAA,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC;AACpG,YAAA,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;AAC7C,YAAA,OAAO,QAAQ;QACnB;QAAE,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,CAAA,uDAAA,CAAyD,CAAC;AACjG,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,YAAA,OAAO,EAAE;QACb;IACJ;AAEA,IAAA,MAAM,iBAAiB,GAAA;AACnB,QAAA,IAAI;YACA,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE;AAC5D,YAAA,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;AAC7C,YAAA,OAAO,QAAQ;QACnB;QAAE,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,CAAA,qDAAA,CAAuD,CAAC;AAC/F,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,YAAA,OAAO,EAAE;QACb;IACJ;IAEQ,MAAM,gBAAgB,CAAC,YAAqB,EAAA;;;;;;;;IAQpD;AAEA,IAAA,MAAM,WAAW,CAAC,SAAiB,EAAE,IAAY,EAAA;AAC7C,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;IAChD;AAKA,IAAA,IAAI,UAAU,GAAA;QACV,OAAO,IAAI,CAAC,WAAW;IAC3B;AAEA,IAAA,MAAM,gBAAgB,GAAA;AAClB,QAAA,IAAI;AACA,YAAA,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAC9B,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAC9D,IAAI,CAAC,OAAO,CAAC,UAAU,EACvB,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAC9B;AACD,YAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC;AACzB,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,UAAU,GAAG,WAAW;YACxD,IAAI,CAAC,SAAS,EAAE;QAEpB;QAAE,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,CAAA,kCAAA,CAAoC,CAAC;AAC5E,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAEhB,YAAA,IAAI,CAAC,KAAK,GAAG,MAAM;AACnB,YAAA,IAAI,CAAC,WAAW,GAAG,cAAc;AAEjC,YAAA,IAAI,CAAC,gBAAgB,IAAI,CAAC;AAC1B,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAC,IAAI,EAAE,CAAC,CAAC,GAAC,IAAI,GAAG,IAAI,CAAC,gBAAgB,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACrF,OAAO,CAAC,KAAK,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,CAAA,UAAA,EAAa,KAAK,CAAA,oCAAA,CAAsC,CAAC;YAEhG,UAAU,CAAC,MAAK;AACZ,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE;AACvB,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,0DAAA,CAA4D,CAAC;oBAC1E,IAAI,CAAC,SAAS,EAAE;gBACpB;YACJ,CAAC,EAAE,KAAK,CAAC;AAET,YAAA,MAAM,CAAC;QACX;IACJ;IAMA,IAAI,WAAW,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,kBAAkB,KAAK,OAAO,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAErD,IAAA,cAAc,CAAC,KAAkB,EAAA;AACrC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;IACxC;AACA,IAAA,MAAM,YAAY,GAAA;AACd,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;AACjC,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACnB,YAAA,IAAI;AACA,gBAAA,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;AAC/D,gBAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YACpC;YAAE,OAAO,CAAC,EAAE;AACR,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,+BAAA,CAAiC,CAAC;AAChD,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,gBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;YACrC;QACJ;IACJ;IAEA,KAAK,GAAA;QACD,KAAK,CAAC,KAAK,EAAE;AACb,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;IACnC;AAGA,IAAA,aAAa,CAAC,WAA4B,EAAA;AACrC,QAAA,MAAc,CAAC,qBAAqB,GAAG,WAAW;AACnD,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;IAClC;AAGA,IAAA,aAAa,CAAC,OAAoB,EAAA;QAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;AACjC,YAAA,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;AAC1C,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QACtC;AAAO,aAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;;;;YAIxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC;AACxC,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QACvC;IACJ;IAQA,IAAI,eAAe,GAAA,EAAK,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC;IACrE,IAAI,cAAc,GAAA,EAAK,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,CAAC;IACnE,IAAI,WAAW,GAAA,EAAK,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7D,IAAI,eAAe,GAAA,EAAK,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC;AAIrE,IAAA,MAAM,aAAa,GAAA;AACf,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;AAC7B,QAAA,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;IACpD;IAEA,MAAM,IAAI,CAAC,OAAoB,EAAA;AAC3B,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;AAC7B,QAAA,OAAO,CAAC,EAAE,KAAKyC,EAAI,EAAE;QACrB,IAAI,eAAe,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC;AAEpE,QAAA,OAAO,eAAe;IAC1B;AAEA,IAAA,MAAM,SAAS,CAAC,OAAoB,EAAE,KAAa,EAAA;AAC/C,QAAA,IAAI,CAAC,OAAO;YACR;QAEJ,IAAI,CAAC,OAAO,CAAC,YAAY;AACrB,YAAA,OAAO,EAAE;QAEb,OAAO,IAAI,CAAC,mBAAmB,CAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAC3E;IACL;IAEA,MAAM,GAAG,CAAC,EAAU,EAAA;AAChB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AAElC,QAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,CAAA,qBAAA,CAAuB,CAAC;QACpD,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;QAEtD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACzB,IAAI,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7C,YAAA,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC;YACvC,OAAO,GAAG,eAAe;QAC7B;aAAO;YACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC;QACpC;AAEA,QAAA,OAAO,OAAO;IAClB;AAEA,IAAA,MAAM,QAAQ,GAAA;AACV,QAAA,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;IAC/C;IAEA,MAAM,WAAW,CAAC,SAAiB,EAAA;AAC/B,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAC7B,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC;IAC3D;AAEA,IAAA,MAAM,UAAU,CAAC,SAAiB,EAAE,OAAoB,EAAA;AACpD,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAC7B,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC;IACnE;IAEA,MAAM,YAAY,CAAC,SAAiB,EAAA;AAChC,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAC7B,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC;IAC5D;IAGA,MAAM,aAAa,CAAC,SAAiB,EAAA;AACjC,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAC7B,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC;IAC7D;IAEA,MAAM,aAAa,CAAC,SAAiB,EAAA;AACjC,QAAA,MAAM,IAAI,CAAC,gBAAgB,EAAE;QAC7B,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC;IAC7D;AAEH;AAzGG,UAAA,CAAA;AADC,IAAA,QAAQ;AAIR,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,eAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,QAAQ;AAYR,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,eAAA,EAAA,IAAA,CAAA;;AClQL;;;;;AAKG;MACU,gBAAgB,CAAA;AACzB,IAAA,WAAA,CACY,OAAoB,EACnB,UAAkB,EAClB,gBAAyB,EAClC,OAA2B,EAAA;QAHnB,IAAA,CAAA,OAAO,GAAP,OAAO;QACN,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;AAc7B,QAAA,IAAA,CAAA,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAA,CAAA,QAAQ,GAAG,IAAI;QACf,IAAA,CAAA,WAAW,GAAG,KAAK;AAEnB,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAe;AAC5C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAe;AAC5C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAe;AAC3C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAAe;QAExC,IAAA,CAAA,QAAQ,GAAkB,EAAE;AAqF5B,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,OAAO,EAAoD;QACxF,IAAA,CAAA,KAAK,GAAsD,WAAW;QAzGlE,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,aAAa,CAAC,MAAM;QAC3D,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,UAAU,CAAC,GAAG;QACvD,IAAI,CAAC,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,IAAI,GAAG;IAClE;AAkBA,IAAA,MAAM,aAAa,GAAA;QACf,OAAO;AACH,YAAA,OAAO,EAAE,2BAA2B;AACpC,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,KAAK,EAAE;AACH,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,YAAY,EAAE,CAAC;AACf,gBAAA,MAAM,EAAE;AACX;SACJ;IACL;IAEA,MAAM,IAAI,CAAC,OAAoB,EAAA;AAC3B,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oCAAA,CAAsC,CAAC;IAC3D;IAEA,KAAK,GAAA;;IAEL;AAEA,IAAA,MAAM,QAAQ,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;;AAEvB,YAAA,OAAO,CAAC;QACZ;QAEA,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC;IACxD;IAEA,MAAM,SAAS,CAAC,EAAU,EAAA;AACtB,QAAA,OAAO,SAAS;IACpB;AAEA,IAAA,MAAM,mBAAmB,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;QAC7H;aAAO;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;QACxH;IACJ;AAEA,IAAA,MAAM,iBAAiB,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC;QACnI;aAAO;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC;QAC9H;IACJ;AAEA,IAAA,MAAM,SAAS,CAAC,OAAoB,EAAE,KAAa,EAAA;QAC/C,OAAO,EAAE,CAAC;IACd;IAEA,MAAM,GAAG,CAAC,EAAU,EAAA;AAChB,QAAA,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;IAC7D;IAEA,MAAM,WAAW,CAAC,SAAiB,EAAA;AAC/B,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,yCAAA,CAA2C,CAAC;IAChE;IAEA,MAAM,aAAa,CAAC,SAAiB,EAAA;AACjC,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,yCAAA,CAA2C,CAAC;IAChE;IAEA,UAAU,CAAC,SAAiB,EAAE,OAA6B,EAAA;AACvD,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,yCAAA,CAA2C,CAAC;IAChE;AAEA,IAAA,YAAY,CAAC,SAAiB,EAAA;AAC1B,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,yCAAA,CAA2C,CAAC;IAChE;AAEA,IAAA,MAAM,WAAW,CAAC,SAAiB,EAAE,IAAY,EAAA;AAC7C,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,yCAAA,CAA2C,CAAC;IAChE;IAEA,MAAM,aAAa,CAAC,SAAiB,EAAA;AACjC,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,yCAAA,CAA2C,CAAC;IAChE;AAKA,IAAA,IAAI,UAAU,GAAA;AACV,QAAA,OAAO,SAAS;IACpB;AACH;;ACrHK,MAAO,WAAY,SAAQ,eAAe,CAAA;AADhD,IAAA,WAAA,GAAA;;AAEY,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;QAExC,IAAA,CAAA,KAAK,GAAGA,EAAI,EAAE;AAiOjB,IAAA;AA/NG,IAAA,IAAI,UAAU,GAAA;QACV,OAAO,CAAA,EAAG,IAAI,CAAC,OAAO,EAAE,UAAU,IAAI,uBAAuB,CAAA,CAAE;IACnE;AAEQ,IAAA,MAAM,gBAAgB,GAAA;AAC1B,QAAA,IAAI,QAAQ,GAAGA,EAAI,EAAE;AACrB,QAAA,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE;AACrC,YAAA,IAAI,YAAY,CAAC,qBAAqB,CAAC,EAAE;AACrC,gBAAA,QAAQ,GAAG,YAAY,CAAC,qBAAqB,CAAC;YAClD;iBAAO;AACH,gBAAA,YAAY,CAAC,qBAAqB,CAAC,GAAG,QAAQ;YAClD;QACJ;AAEA,QAAA,IAAI,MAAM,GAAG,IAAI,aAAa,CAAC,CAAA,EAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA,OAAA,CAAS,EAAE,SAAS,EAAE,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC;QAC1H,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;AACxC,YAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACjB,gBAAA,OAAO,EAAE;AACb,YAAA,CAAC;AAED,YAAA,MAAM,CAAC,OAAO,GAAG,CAAC,IAAG;AACjB,gBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE;AAChB,oBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,kCAAA,CAAoC,CAAC;oBACnD,MAAM,CAAC,CAAC,CAAC;gBACb;AACJ,YAAA,CAAC;AACL,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,OAAO,GAAG,SAAS;AAE1B,QAAA,OAAO,MAAM;IACjB;IAEQ,QAAQ,GAAA;QACZ,IAAI,OAAO,YAAY,KAAK,WAAW,IAAI,YAAY,CAAC,6BAA6B,CAAC,KAAK,GAAG;AAC1F,YAAA,OAAO,IAAI;AAEf,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;IAC5C;AAEA;;;;AAIG;IACK,WAAW,GAAA;AACf,QAAA,OAAO,OAAO,SAAS,KAAK,WAAW,KACnC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW;eACrC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAC3D;IACL;AAEA,IAAA,MAAM,iBAAiB,CAAC,OAAe,EAAE,OAA2B,EAAA;;;;;;QAOhE,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACvC,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;QAClE;aAAO;YACH,OAAO,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE;AAC5H,iBAAA,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C;IACJ;AAEA,IAAA,MAAM,kBAAkB,CAAC,OAAe,EAAE,SAAiB,EAAE,OAA2B,EAAA;;;AAIpF,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACjB,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;QAClE;aAAO;YACH,OAAO,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE;AAC5H,iBAAA,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C;IACJ;AAEA;;;;AAIG;IACH,MAAM,sBAAsB,CAAC,OAAe,EAAA;AACxC,QAAA,IAAI;YACA,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AACxC,YAAA,OAAO,KAAK,EAAE,YAAY,IAAI,CAAC;QACnC;QAAE,OAAO,CAAC,EAAE;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,CAAA,wCAAA,CAA0C,CAAC;AAC1E,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,YAAA,OAAO,SAAS;QACpB;IACJ;AAEA;;;;AAIG;IACH,MAAM,uBAAuB,CAAC,QAAkB,EAAA;AAC5C,QAAA,IAAI;YACA,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC/C,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,CAAE,CAAC,CAAC;QACzF;QAAE,OAAO,CAAC,EAAE;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,uDAAA,EAA0D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,GAAA,CAAK,CAAC;AAChG,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,YAAA,OAAO,SAAS;QACpB;IACJ;AAEA;;;;AAIG;IACH,MAAM,QAAQ,CAAC,OAAe,EAAA;AAC1B,QAAA,IAAI,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,UAAU,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAC;AAClE,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;AACvB,YAAA,OAAO,SAAS;AACpB,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;YACtB,MAAM,IAAI,KAAK,CAAC,CAAA,uBAAA,EAA0B,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;AAEhE,QAAA,OAAe,MAAM,QAAQ,CAAC,IAAI,EAAE;IACxC;AAEA;;;;AAIG;IACH,MAAM,aAAa,CAAC,QAAkB,EAAA;AAClC,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,+CAAA,CAAiD,CAAC;QAEtE,IAAI,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,UAAU,CAAA,YAAA,EAAe,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA,CAAE,CAAC;AACrG,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;YACtB,MAAM,IAAI,KAAK,CAAC,CAAA,uBAAA,EAA0B,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;AAEhE,QAAA,OAAiB,MAAM,QAAQ,CAAC,IAAI,EAAE;IAC1C;AAEA;;;;AAIG;AACH,IAAA,MAAM,WAAW,CACb,OAAe,EACf,IAAoB,EACpB,MAAmB,EACnB,MAAe,EACf,KAAc,EACd,MAAgB,EAAA;AAEhB,QAAA,IAAI,QAAQ,GAAG,MAAM,KAAK,CACtB,CAAA,EAAG,IAAI,CAAC,UAAU,CAAA,QAAA,EAAW,OAAO,CAAA,UAAA,EAAc,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAE,CAAA,CAAE,CAC3G;AAED,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;YACtB,MAAM,IAAI,KAAK,CAAC,CAAA,oCAAA,EAAuC,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;AAE7E,QAAA,OAAuB,MAAM,QAAQ,CAAC,IAAI,EAAE;IAChD;AAEA;;;;AAIG;AACH,IAAA,MAAM,UAAU,CACZ,eAAuB,EACvB,IAAoB,EACpB,MAAmB,EACnB,MAAe,EACf,KAAc,EACd,MAAgB,EAAA;AAEhB,QAAA,IAAI,QAAQ,GAAG,MAAM,KAAK,CACtB,CAAA,EAAG,IAAI,CAAC,UAAU,CAAA,UAAA,EAAa,eAAe,CAAA,SAAA,EAAa,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAE,CAAA,CAAE,CACpH;AAED,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;YACtB,MAAM,IAAI,KAAK,CAAC,CAAA,yBAAA,EAA4B,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;AAElE,QAAA,OAAuB,MAAM,QAAQ,CAAC,IAAI,EAAE;IAChD;AAEA,IAAA,cAAc,CAAC,OAAoB,EAAA;AAC/B,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;IAC9C;IAEA,UAAU,CAAC,OAAe,EAAE,SAAiB,EAAA;AACzC,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;IAC9C;AACA,IAAA,aAAa,CAAC,OAAe,EAAE,eAAuB,EAAE,SAAiB,EAAA;AACrE,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;IAC9C;IACA,YAAY,CAAC,OAAoB,EAAE,OAAuC,EAAA;AACtE,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;IAC9C;IAIA,MAAM,aAAa,CAAC,GAAW,EAAA;QAC3B,IAAI,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,CAAA,KAAA,CAAO,EAAE;AAClD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACL,gBAAA,cAAc,EAAE;AACnB,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACjB;aACH;AACJ,SAAA,CAAC;AAEF,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;AACtB,YAAA,OAAO,IAAI;AAEf,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,6BAAA,EAAgC,QAAQ,CAAC,MAAM,CAAA,SAAA,EAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA,CAAA,CAAG,CAAC;AAExG,QAAA,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE;IAChC;+GApOS,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAX,WAAW,EAAA,CAAA,CAAA;;4FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBADvBC;;;ACPD,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,2YAA2Y,EAAE,IAAI,CAAC;MAEla,oBAAoB,CAAA;AAC7B,IAAA,aAAa,CAAC,OAAoB,EAAA;;QAE9B,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;AACnF,YAAA,OAAO,IAAI;AAEf,QAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACrD,aAAA,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;AACxE,aAAA,GAAG,CAAC,GAAG,KAAK;AACT,YAAA,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;AACpC,YAAA,IAAI,EAAE;AACT,SAAA,CAAC,CAAC;IAEX;AACH;MAGY,qBAAqB,CAAA;AAC9B,IAAA,WAAA,CAAoB,OAAwB,EAAA;QAAxB,IAAA,CAAA,OAAO,GAAP,OAAO;IAC3B;AAEA,IAAA,MAAM,eAAe,CAAC,OAAoB,EAAE,QAA4B,EAAA;AACpE,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK;AACvB,YAAA,OAAO,IAAI;AAEf,QAAA,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC7D,IAAI,OAAO,EAAE;YACT,OAAO;AACH,gBAAA,IAAI,EAAE,MAAM;gBACZ,GAAG,EAAE,QAAQ,CAAC,IAAI;AAClB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,KAAK,EAAE;aACV;QACL;IACJ;+GAjBS,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA1B,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAArB,qBAAqB,EAAA,CAAA,CAAA;;4FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC0B;;;MCrBY,yBAAyB,CAAA;AAClC,IAAA,MAAM,eAAe,CAAC,OAAoB,EAAE,QAA4B,EAAA;AACpE,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK;AACvB,YAAA,OAAO,IAAI;AAEf,QAAA,IAAI,OAAe;;QAInB,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE;YAC/C,IAAI,KAAK,GAAG,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChE,IAAI,KAAK,EAAE;AACP,gBAAA,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;YACtB;QACJ;AAEA,QAAA,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,gDAAgD,CAAC,EAAE;YACnF,IAAI,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClD,IAAI,KAAK,EAAE;AACP,gBAAA,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;YACtB;QACJ;QAEA,IAAI,OAAO,EAAE;YACT,OAAO;AACH,gBAAA,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,CAAA,8BAAA,EAAiC,OAAO,CAAA,CAAE;AAC/C,gBAAA,KAAK,EAAE;aACV;QACL;AACA,QAAA,OAAO,IAAI;IACf;AACH;;MChCY,uBAAuB,CAAA;AAChC,IAAA,MAAM,eAAe,CAAC,OAAoB,EAAE,QAA4B,EAAA;AACpE,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE;AAC/E,YAAA,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE;AACtD,YAAA,IAAI,CAAC,KAAK;AACN,gBAAA,OAAO,IAAI;YAEf,OAAO;AACH,gBAAA,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,CAAA,wBAAA,EAA2B,KAAK,CAAA,CAAE;AACvC,gBAAA,KAAK,EAAE;aACV;QACL;AAEA,QAAA,OAAO,IAAI;IACf;AACH;;MChBY,uBAAuB,CAAA;AAChC,IAAA,MAAM,eAAe,CAAC,OAAoB,EAAE,QAA4B,EAAA;QACpE,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE;YAC7H,OAAO;AACH,gBAAA,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,QAAQ,CAAC,IAAI;AAClB,gBAAA,KAAK,EAAE;aACV;QACL;AAEA,QAAA,OAAO,IAAI;IACf;AACH;;MCmDY,cAAc,CAAA;AAGvB,IAAA,WAAA,GAAA;AAFA,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;QAGjC,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAAC,IAAI,oBAAoB,EAAE,CAAC;QACtE,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,uBAAuB,EAAE,CAAC;QAC1E,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,yBAAyB,EAAE,CAAC;QAC5E,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,uBAAuB,EAAE,CAAC;AAC1E,QAAA,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5F;IAEA,OAAO,SAAS,CAAC,OAAoB,EAAA;QACjC,OAAO;AACH,YAAA,QAAQ,EAAE,cAAc;AACxB,YAAA,SAAS,EAAE;AACP,gBAAA;AACI,oBAAA,OAAO,EAAE,iBAAiB;oBAC1B,QAAQ,EAAE,OAAO,IAAI;AACxB,iBAAA;gBACD,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,IAAI,WAAW;AAC7E;SACJ;IACL;+GAtBS,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,iBAdnB,cAAc;YACd,kBAAkB;AAClB,YAAA,oBAAoB,aAtBpB,YAAY;AACZ,YAAA,WAAW,qBAEX,cAAc;YACd,UAAU;YACV,WAAW;YAEX,aAAa;YACb,eAAe;YACf,gBAAgB;YAChB,aAAa;YACb,eAAe;YACf,kBAAkB;YAClB,cAAc;YACd,wBAAwB;YACxB,iBAAiB;YACjB,aAAa;AACb,YAAA,YAAY,aAQZ,cAAc;YACd,kBAAkB;YAClB,oBAAoB;YACpB,iBAAiB;YACjB,UAAU;YACV,cAAc;YACd,WAAW,CAAA,EAAA,CAAA,CAAA;AAGN,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAlCnB,YAAY;YACZ,WAAW;YACX,iBAAiB,CAAC,OAAO,EAAE;YAC3B,cAAc;YACd,UAAU;YACV,WAAW;YAEX,aAAa;YACb,eAAe;YACf,gBAAgB;YAChB,aAAa;YACb,eAAe;YACf,kBAAkB;YAClB,cAAc;YACd,wBAAwB;YACxB,iBAAiB;YACjB,aAAa;AACb,YAAA,YAAY,EAWZ,iBAAiB;YACjB,UAAU;YACV,cAAc;YACd,WAAW,CAAA,EAAA,CAAA,CAAA;;4FAGN,cAAc,EAAA,UAAA,EAAA,CAAA;kBApC1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE;wBACL,YAAY;wBACZ,WAAW;wBACX,iBAAiB,CAAC,OAAO,EAAE;wBAC3B,cAAc;wBACd,UAAU;wBACV,WAAW;wBAEX,aAAa;wBACb,eAAe;wBACf,gBAAgB;wBAChB,aAAa;wBACb,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,wBAAwB;wBACxB,iBAAiB;wBACjB,aAAa;wBACb;AACH,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACV,cAAc;wBACd,kBAAkB;wBAClB;AACH,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACL,cAAc;wBACd,kBAAkB;wBAClB,oBAAoB;wBACpB,iBAAiB;wBACjB,UAAU;wBACV,cAAc;wBACd;AACH;AACJ,iBAAA;;;ACjED;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"banta-sdk.mjs","sources":["../../../projects/sdk/src/lib/common/lazy-connection.ts","../../../projects/sdk/src/lib/common/timer-pool.service.ts","../../../projects/sdk/src/lib/common/timestamp.component.ts","../../../projects/sdk/src/lib/common/lightbox/lightbox.component.ts","../../../projects/sdk/src/lib/common/lightbox/lightbox.component.html","../../../projects/sdk/src/lib/sdk-options.ts","../../../projects/sdk/src/lib/common/markdown-to-html.pipe.ts","../../../projects/sdk/src/lib/common/trust-resource-url.pipe.ts","../../../projects/sdk/src/lib/common/mention-linker.pipe.ts","../../../projects/sdk/src/lib/common/attachment/attachment.component.ts","../../../projects/sdk/src/lib/common/attachment/attachment.component.html","../../../projects/sdk/src/lib/common/attachments/attachments.component.ts","../../../projects/sdk/src/lib/common/attachments/attachments.component.html","../../../projects/sdk/src/lib/common/common.module.ts","../../../projects/sdk/src/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.ts","../../../projects/sdk/src/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.html","../../../projects/sdk/src/lib/emoji/emoji-selector-button.component.ts","../../../projects/sdk/src/lib/emoji/emoji.module.ts","../../../projects/sdk/src/lib/chat-backend-base.ts","../../../projects/sdk/src/lib/comments/comment/comment.component.ts","../../../projects/sdk/src/lib/comments/comment/comment.component.html","../../../projects/sdk/src/lib/comments/inline-replies.directive.ts","../../../projects/sdk/src/lib/comments/comment-view/comment-view.component.ts","../../../projects/sdk/src/lib/comments/comment-view/comment-view.component.html","../../../projects/sdk/src/lib/comments/reply-send-options.directive.ts","../../../projects/sdk/src/lib/comments/attachment-button/attachment-button.component.ts","../../../projects/sdk/src/lib/comments/attachment-button/attachment-button.component.html","../../../projects/sdk/src/lib/comments/attachment-scraper.directive.ts","../../../projects/sdk/src/lib/comments/comment-field/comment-field.component.ts","../../../projects/sdk/src/lib/comments/comment-field/comment-field.component.html","../../../projects/sdk/src/lib/comments/banta-comments/banta-comments.component.ts","../../../projects/sdk/src/lib/comments/banta-comments/banta-comments.component.html","../../../projects/sdk/src/lib/chat/chat-message/chat-message.component.ts","../../../projects/sdk/src/lib/chat/chat-message/chat-message.component.html","../../../projects/sdk/src/lib/chat/chat-view/chat-view.component.ts","../../../projects/sdk/src/lib/chat/chat-view/chat-view.component.html","../../../projects/sdk/src/lib/chat/banta-chat/banta-chat.component.ts","../../../projects/sdk/src/lib/chat/banta-chat/banta-chat.component.html","../../../projects/sdk/src/lib/comments/live-comment.component.ts","../../../projects/sdk/src/lib/chat/live-chat-message.component.ts","../../../projects/sdk/src/lib/live-message.component.ts","../../../projects/sdk/src/lib/banta/banta.component.ts","../../../projects/sdk/src/lib/banta/banta.component.html","../../../projects/sdk/src/lib/banta-logo.component.ts","../../../projects/sdk/src/lib/chat/chat.module.ts","../../../projects/sdk/src/lib/comments/comment-sort/comment-sort.component.ts","../../../projects/sdk/src/lib/comments/comment-sort/comment-sort.component.html","../../../projects/sdk/src/lib/comments/comments.module.ts","../../../projects/sdk/src/lib/chat-source.ts","../../../projects/sdk/src/lib/static-chat-source.ts","../../../projects/sdk/src/lib/chat-backend.ts","../../../projects/sdk/src/lib/url-attachments.ts","../../../projects/sdk/src/lib/youtube-attachments.ts","../../../projects/sdk/src/lib/giphy-attachments.ts","../../../projects/sdk/src/lib/tweet-attachments.ts","../../../projects/sdk/src/lib/banta-sdk.module.ts","../../../projects/sdk/src/public-api.ts","../../../projects/sdk/src/banta-sdk.ts"],"sourcesContent":["import { Subject, Observable, ConnectableObservable } from 'rxjs';\r\nimport { publish } from 'rxjs/operators';\r\n\r\nexport interface LazyConnectionOptions<T> {\r\n start : (subject : Subject<T>) => void;\r\n stop : () => void;\r\n}\r\n\r\nexport function lazyConnection<T>(options : LazyConnectionOptions<T>): Observable<T> {\r\n\r\n let obs = new Observable(observer => {\r\n let subject = new Subject<T>();\r\n let subscription = subject.subscribe(observer);\r\n\r\n options.start(subject);\r\n return () => {\r\n subscription.unsubscribe();\r\n options.stop();\r\n };\r\n });\r\n \r\n return (<ConnectableObservable<T>>obs.pipe(publish())).refCount();\r\n}","import { Injectable } from \"@banta/common\";\r\n\r\ninterface TimerState {\r\n handle?;\r\n subscribers: (() => void)[];\r\n}\r\n\r\n/**\r\n * Provides a way to hook in to a shared set of timers, instead of creating a timer per instance.\r\n * This is very useful for cases where the update is not extremely time-sensitive, but happens at scale.\r\n * The principal use case is the TimestampComponent. When several hundred (or several thousand) comments are \r\n * being displayed, we do not want to trigger thousands of independent relative timestamp updates, because over \r\n * time the updates will saturate the CPU since they don't perfectly align. \r\n */\r\n@Injectable()\r\nexport class TimerPool {\r\n private subscriptions = new Map<number, TimerState>();\r\n\r\n private newSubscriptionsNotice;\r\n private newSubscriptions = new Map<number, number>();\r\n\r\n private removedSubscriptionsNotice;\r\n private removedSubscriptions = new Map<number, number>();\r\n\r\n addTimer(interval: number, callback: () => void) {\r\n if (interval <= 0) {\r\n console.warn(`Refusing to set timer with interval of ${interval}!`);\r\n return () => {};\r\n }\r\n\r\n let state: TimerState;\r\n let sizeWas = this.subscriptions.size;\r\n\r\n if (!this.subscriptions.has(interval)) {\r\n state = { subscribers: [] };\r\n state.handle = setInterval(() => {\r\n console.debug(`[Banta/TimerPool] Notifying ${state.subscribers.length} subs [${interval}ms]`);\r\n state.subscribers.forEach(sub => sub());\r\n }, interval);\r\n this.subscriptions.set(interval, state);\r\n } else {\r\n state = this.subscriptions.get(interval);\r\n }\r\n\r\n state.subscribers.push(callback);\r\n\r\n // Debug information //////////////////////////\r\n //\r\n\r\n if (!this.newSubscriptions.has(interval))\r\n this.newSubscriptions.set(interval, 0);\r\n this.newSubscriptions.set(interval, (this.newSubscriptions.get(interval) ?? 0) + 1);\r\n\r\n clearTimeout(this.newSubscriptionsNotice);\r\n this.newSubscriptionsNotice = setTimeout(() => {\r\n for (let [interval, count] of this.newSubscriptions) {\r\n console.debug(`[Banta/TimerPool] ${count} new subscriptions to ${interval}ms [${state.subscribers.length} total]`);\r\n }\r\n\r\n this.newSubscriptions.clear();\r\n });\r\n\r\n //\r\n ///////////////////////////////////////////////\r\n\r\n if (sizeWas === 0) {\r\n console.debug(`[Banta/TimerPool] No longer idle.`);\r\n }\r\n\r\n // Unsubscribe function \r\n\r\n return () => {\r\n let state = this.subscriptions.get(interval);\r\n if (!state)\r\n return;\r\n\r\n let index = state.subscribers.indexOf(callback);\r\n if (index >= 0)\r\n state.subscribers.splice(index, 1);\r\n\r\n if (state.subscribers.length === 0) {\r\n clearInterval(state.handle);\r\n this.subscriptions.delete(interval);\r\n }\r\n\r\n if (!this.removedSubscriptions.has(interval))\r\n this.removedSubscriptions.set(interval, 0);\r\n this.removedSubscriptions.set(interval, (this.removedSubscriptions.get(interval) ?? 0) + 1);\r\n\r\n // Debug information ////////////////////////////////////////////////////////////////////\r\n\r\n clearTimeout(this.removedSubscriptionsNotice);\r\n this.removedSubscriptionsNotice = setTimeout(() => {\r\n for (let [interval, count] of this.removedSubscriptions) {\r\n let state = this.subscriptions.get(interval);\r\n console.debug(`[Banta/TimerPool] ${count} unsubscribed from ${interval}ms [${state?.subscribers?.length ?? 0} remain]`);\r\n }\r\n\r\n if (this.subscriptions.size === 0)\r\n console.debug(`[Banta/TimerPool] All subscriptions have been removed. Now idle.`);\r\n\r\n this.removedSubscriptions.clear();\r\n });\r\n };\r\n }\r\n}","import { Component, Input } from \"@angular/core\";\r\nimport { TimerPool } from \"../../lib/common/timer-pool.service\";\r\n\r\n@Component({\r\n selector: 'banta-timestamp',\r\n template: `\r\n @if (showAbsolute) {\r\n <span [title]=\"value | date : 'short'\">\r\n {{value | date : 'shortDate'}}\r\n </span>\r\n }\r\n @if (!showAbsolute) {\r\n <span [title]=\"value | date : 'short'\">\r\n {{relative}}\r\n </span>\r\n }\r\n `,\r\n styles: [``],\r\n standalone: false\r\n})\r\nexport class TimestampComponent {\r\n constructor(\r\n private timerPool: TimerPool\r\n ) {\r\n }\r\n\r\n private _value : number;\r\n relative = '';\r\n tooltip = '';\r\n\r\n private timerUnsubscribe: () => void;\r\n private timerInterval: number = 0;\r\n\r\n private _destroyed = false;\r\n\r\n ngOnDestroy() {\r\n this._destroyed = true;\r\n this.timerUnsubscribe?.();\r\n this.timerUnsubscribe = undefined;\r\n }\r\n\r\n @Input()\r\n get value() {\r\n return this._value;\r\n }\r\n\r\n showAbsolute = false;\r\n\r\n update() {\r\n if (this._destroyed)\r\n return;\r\n \r\n let now = Date.now();\r\n let diff = now - this.value;\r\n let minute = 1000*60;\r\n let hour = minute * 60;\r\n let day = hour * 24;\r\n let week = day * 7;\r\n let month = day * 30;\r\n let year = day * 365;\r\n this.showAbsolute = false;\r\n let updateTime = 0;\r\n\r\n if (diff > year) {\r\n this.showAbsolute = true;\r\n this.relative = 'abs';\r\n return;\r\n }\r\n\r\n if (diff > month) {\r\n let months = Math.floor(diff / month);\r\n\r\n if (months === 1)\r\n this.relative = `${months} month ago`;\r\n else\r\n this.relative = `${months} months ago`;\r\n \r\n } else if (diff > week) {\r\n let weeks = Math.floor(diff / week);\r\n\r\n if (weeks === 1)\r\n this.relative = `${weeks} week ago`;\r\n else\r\n this.relative = `${weeks} weeks ago`;\r\n } else if (diff > day) {\r\n let days = Math.floor(diff / day);\r\n if (days === 1)\r\n this.relative = `${days} day ago`;\r\n else\r\n this.relative = `${days} days ago`;\r\n } else if (diff > hour) {\r\n let hours = Math.floor(diff / hour);\r\n if (hours === 1)\r\n this.relative = `${hours} hour ago`;\r\n else\r\n this.relative = `${hours} hours ago`;\r\n \r\n updateTime = 1000 * 60 * 30;\r\n } else if (diff > minute) {\r\n let minutes = Math.floor(diff / minute);\r\n if (minutes === 1)\r\n this.relative = `${minutes} minute ago`;\r\n else\r\n this.relative = `${minutes} minutes ago`;\r\n updateTime = 1000 * 45;\r\n } else if (diff > 30_000) {\r\n this.relative = `about a minute ago`;\r\n updateTime = 1000 * 60;\r\n } else {\r\n this.relative = `just now`;\r\n updateTime = 1000 * 30;\r\n }\r\n \r\n if (typeof window !== 'undefined') {\r\n if (this.timerInterval !== updateTime) {\r\n this.timerInterval = updateTime;\r\n this.timerUnsubscribe?.();\r\n if (updateTime > 0) {\r\n this.timerUnsubscribe = this.timerPool.addTimer(updateTime, () => this.update());\r\n }\r\n }\r\n }\r\n }\r\n\r\n set value(v) {\r\n if (this._value !== v) {\r\n this._value = v;\r\n this.update();\r\n }\r\n }\r\n}","import { Component, ElementRef, ViewChild } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-lightbox',\r\n templateUrl: './lightbox.component.html',\r\n styleUrls: ['./lightbox.component.scss'],\r\n standalone: false\r\n})\r\nexport class LightboxComponent {\r\n @ViewChild('container') \r\n containerElement: ElementRef<HTMLDivElement>;\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n document.body.appendChild(this.containerElement.nativeElement);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.containerElement.nativeElement.remove();\r\n }\r\n\r\n images: string[];\r\n currentImage: string;\r\n\r\n isOpen: boolean;\r\n\r\n close() {\r\n this.isOpen = false;\r\n }\r\n\r\n open(currentImage: string, images: string[]) {\r\n this.currentImage = currentImage;\r\n this.images = images;\r\n this.isOpen = true;\r\n }\r\n}","<div \r\n class=\"banta-lightbox-container\" \r\n #container\r\n [class.open]=\"isOpen\"\r\n >\r\n\r\n <a class=\"underlay\" (click)=\"close()\" href=\"javascript:;\"></a>\r\n\r\n <a class=\"close-button\" href=\"javascript:;\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <img [src]=\"currentImage\" />\r\n</div>\r\n","import { InjectionToken, Type } from \"@angular/core\";\r\nimport { ChatBackendBase } from \"./chat-backend-base\";\r\n\r\nexport interface SdkOptions {\r\n serviceUrl?: string;\r\n emojiUrl?: string;\r\n backendClass?: Type<ChatBackendBase>\r\n}\r\n\r\nexport const BANTA_SDK_OPTIONS = new InjectionToken<SdkOptions>('BANTA_SDK_OPTIONS');","import { Pipe, PipeTransform, inject } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { BANTA_SDK_OPTIONS } from '../sdk-options';\r\n\r\nimport createDOMPurify from 'dompurify';\r\n\r\nimport * as marked from 'marked';\r\nimport { EmojiDecorator } from '@astronautlabs/emoji';\r\n\r\nconst underline = {\r\n name: 'underline',\r\n level: 'inline', // Is this a block-level or inline-level tokenizer?\r\n start(src) { return src.match(/\\+\\+/)?.index; }, // Hint to Marked.js to stop and check for a match\r\n tokenizer(src, tokens) {\r\n const rule = /^\\+\\+(.*?)\\+\\+/; // Regex for the complete token\r\n const match = rule.exec(src);\r\n if (match) {\r\n return { // Token to generate\r\n type: 'underline', // Should match \"name\" above\r\n raw: match[0], // Text to consume from the source\r\n text: this.lexer.inlineTokens(match[1].trim()), // Additional custom properties\r\n };\r\n }\r\n },\r\n renderer(token) {\r\n return `<u>${this.parser.parseInline(token.text)}</u>`;\r\n }\r\n};\r\n\r\nmarked.marked.use({\r\n extensions: [underline]\r\n});\r\n\r\n@Pipe({\r\n name: 'bantaMarkdownToHtml',\r\n standalone: false\r\n})\r\nexport class BantaMarkdownToHtmlPipe implements PipeTransform {\r\n private sanitizer = inject(DomSanitizer);\r\n private sdkOptions = inject(BANTA_SDK_OPTIONS, { optional: true });\r\n\r\n constructor() {\r\n this.renderer = new marked.Renderer();\r\n const linkRenderer = this.renderer.link;\r\n this.renderer.link = token => {\r\n const html = linkRenderer.call(this.renderer, token);\r\n return html.replace(/^<a /, '<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" ');\r\n };\r\n }\r\n\r\n\tprivate get emojiUrl() {\r\n\t\treturn this.sdkOptions?.emojiUrl ?? 'https://cdn.jsdelivr.net/gh/jdecked/twemoji@17.0.2/assets/';\r\n\t}\r\n\r\n renderer: marked.Renderer;\r\n transform(value: string) {\r\n if (!value)\r\n return '';\r\n\r\n let purifier = createDOMPurify(window);\r\n\r\n // https://github.com/cure53/DOMPurify/blob/e1c19cf6407d782b666cb1d02a6af191f9cbc09e/demos/hooks-target-blank-demo.html\r\n // Add a hook to make all links open a new window\r\n purifier.addHook('afterSanitizeAttributes', function(node: HTMLElement & { target?: string }) {\r\n // set all elements owning target to target=_blank\r\n if ('target' in node) {\r\n node.setAttribute('target','_blank');\r\n // prevent https://www.owasp.org/index.php/Reverse_Tabnabbing\r\n node.setAttribute('rel', 'noopener noreferrer nofollow');\r\n }\r\n // set non-HTML/MathML links to xlink:show=new\r\n if (!node.hasAttribute('target')\r\n && (node.hasAttribute('xlink:href')\r\n || node.hasAttribute('href'))) {\r\n node.setAttribute('xlink:show', 'new');\r\n }\r\n });\r\n\r\n value = marked.marked.parse(value, {\r\n renderer: this.renderer\r\n }) as string;\r\n\r\n value = EmojiDecorator.parse(value, { baseUrl: this.emojiUrl });\r\n\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n purifier.sanitize(value,\r\n {\r\n FORBID_TAGS: ['h1', 'h2', 'h3', 'h4', 'style', 'link', 'script'],\r\n FORBID_ATTR: ['style'],\r\n KEEP_CONTENT: true\r\n }\r\n )\r\n );\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'trustResourceUrl',\r\n standalone: false\r\n})\r\nexport class BantaTrustResourceUrlPipe implements PipeTransform {\r\n constructor(\r\n private sanitizer: DomSanitizer\r\n ) {\r\n }\r\n\r\n transform(value: string) {\r\n if (!value)\r\n return undefined;\r\n\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ChatMessageMention } from '@banta/common';\r\n\r\n@Pipe({\r\n name: 'mentionLinker',\r\n standalone: false\r\n})\r\nexport class BantaMentionLinkerPipe implements PipeTransform {\r\n transform(value: string, links?: ChatMessageMention[]) {\r\n if (!value)\r\n return '';\r\n\r\n if (!links)\r\n return value;\r\n\r\n let text = value;\r\n\r\n for (let i = 0, max = links.length; i < max; ++i) {\r\n let mention = links[i];\r\n text = text.replace(new RegExp(`${this.escapeRegExp(mention.text)}`, `gi`), `@{${i + 1}}`);\r\n }\r\n\r\n text = text.replace(/@\\{(\\d+)\\}/g, (text, i) => links[i - 1] ? this.formatLink(links[i - 1]) : text);\r\n\r\n return text;\r\n }\r\n\r\n formatLink(link: ChatMessageMention) {\r\n return `<a${ link.external ? ` target=\"_blank\" rel=\"noopener\"` : `` } class=\"mention\" href=\"${link.link}\">${link.text}</a>`;\r\n }\r\n\r\n /**\r\n * https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\r\n */\r\n escapeRegExp(string) {\r\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\r\n }\r\n}","import { Component, ElementRef, HostBinding, Input, Output } from \"@angular/core\";\r\nimport { ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\n\r\nlet TWITTER_LOADED = false;\r\n\r\n@Component({\r\n selector: 'banta-attachment',\r\n templateUrl: './attachment.component.html',\r\n styleUrls: ['./attachment.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaAttachmentComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n\r\n }\r\n\r\n private _attachment: ChatMessageAttachment;\r\n @Input() get attachment() { return this._attachment; }\r\n set attachment(value) {\r\n this._attachment = value;\r\n this.checkLoad();\r\n this.loadPlatformSpecific();\r\n }\r\n \r\n @Input() loading = false;\r\n @Input() editing = false;\r\n @Input() loadingMessage: string = 'Please wait...';\r\n @Input() error = false;\r\n @Input() errorMessage: string = 'An error has occurred';\r\n @Output() removed = new Subject<void>();\r\n @Output() activated = new Subject<void>();\r\n @Output() loaded = new Subject<void>();\r\n\r\n private _viewLoaded = false;\r\n ngAfterViewInit() {\r\n this._viewLoaded = true;\r\n this.checkLoad();\r\n }\r\n\r\n private loadTwitterWidgets() {\r\n if (typeof window !== 'undefined')\r\n window['twttr']?.widgets.load();\r\n }\r\n\r\n private loadPlatformSpecific() {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n if (this._attachment?.type === 'tweet') {\r\n if (!TWITTER_LOADED && document.querySelector('script[src=\"https://platform.twitter.com/widgets.js\"]'))\r\n TWITTER_LOADED = true;\r\n\r\n if (typeof window !== 'undefined' && !TWITTER_LOADED) {\r\n TWITTER_LOADED = true;\r\n let script = document.createElement('script');\r\n script.src = 'https://platform.twitter.com/widgets.js';\r\n script.async = true;\r\n script.addEventListener('load', () => setTimeout(() => this.loadTwitterWidgets()));\r\n document.body.appendChild(script);\r\n } else {\r\n setTimeout(() => this.loadTwitterWidgets());\r\n }\r\n }\r\n }\r\n\r\n private checkLoad() {\r\n if (!this._attachment || !this._viewLoaded || !this.elementRef?.nativeElement)\r\n return;\r\n\r\n if (typeof window === 'undefined')\r\n this.loaded.next();\r\n else\r\n setTimeout(() => this.loaded.next(), 250);\r\n }\r\n\r\n activate() {\r\n this.activated.next();\r\n }\r\n\r\n remove() {\r\n this.removed.next();\r\n }\r\n\r\n get isError() {\r\n return this.error || this.attachment?.transientState?.error;\r\n }\r\n\r\n get theErrorMessage() {\r\n return this.errorMessage || this.attachment?.transientState?.errorMessage;\r\n }\r\n\r\n @HostBinding('class.loading')\r\n get isLoading() {\r\n return this.editing && (\r\n this.loading || !this.attachment || this.attachment.transientState?.loading \r\n || !this.attachment.url\r\n );\r\n }\r\n\r\n get isImageAttachment() {\r\n return this.attachment?.type?.startsWith('image/');\r\n }\r\n\r\n get hasFrame() {\r\n if (!this.attachment)\r\n return false;\r\n\r\n return this.attachment.type === 'iframe' || (\r\n this.attachment.type === 'card' \r\n && this.attachment.card?.player\r\n );\r\n }\r\n\r\n get frameUrl() {\r\n if (!this.attachment)\r\n return undefined;\r\n \r\n if (this.attachment.type === 'iframe') {\r\n return this.attachment.url;\r\n } else if (this.attachment.type === 'card') {\r\n return this.attachment.card.player;\r\n }\r\n }\r\n}","@if (editing) {\r\n <button type=\"button\" (click)=\"remove()\" mat-mini-fab color=\"primary\" class=\"remove-button\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n}\r\n\r\n@if (isError) {\r\n <mat-icon class=\"error\">close</mat-icon>\r\n <em class=\"error\">{{theErrorMessage}}</em>\r\n}\r\n@if (!isError) {\r\n @if (isLoading) {\r\n <mat-spinner></mat-spinner>\r\n <em>{{loadingMessage}}</em>\r\n }\r\n @if (!isLoading && attachment) {\r\n @if (hasFrame) {\r\n <iframe\r\n sandbox=\"allow-scripts allow-popups allow-same-origin allow-presentation\"\r\n [src]=\"frameUrl | trustResourceUrl\"></iframe>\r\n }\r\n @if (attachment.type === 'card') {\r\n <a class=\"card-attachment\" [href]=\"attachment.url\" target=\"_blank\" [class.has-image]=\"attachment.card.image\">\r\n @if (attachment.card.image) {\r\n <img\r\n class=\"thumbnail\"\r\n [src]=\"attachment.card.image\"\r\n />\r\n }\r\n <div class=\"description\">\r\n <h1>{{attachment.card.title}}</h1>\r\n <div class=\"summary\">\r\n {{attachment.card.description}}\r\n </div>\r\n <cite>{{attachment.card.url}}</cite>\r\n </div>\r\n </a>\r\n }\r\n @if (isImageAttachment && attachment.url) {\r\n <a class=\"image-attachment\" href=\"javascript:;\" (click)=\"activate()\">\r\n <img [src]=\"attachment.url\" alt=\"Image Attachment\">\r\n </a>\r\n }\r\n @if (attachment.type === 'tweet') {\r\n <blockquote\r\n class=\"twitter-tweet\">\r\n <p lang=\"en\" dir=\"ltr\"></p>\r\n <a [href]=\"attachment.url\"></a>\r\n </blockquote>\r\n }\r\n }\r\n}","import { Component, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\nimport { LightboxComponent } from \"../lightbox/lightbox.component\";\r\n\r\n@Component({\r\n selector: 'banta-attachments',\r\n templateUrl: './attachments.component.html',\r\n styleUrls: ['./attachments.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaAttachmentsComponent {\r\n @Input() attachments: ChatMessageAttachment[];\r\n @Input() editing = false;\r\n @ViewChild('lightbox') lightbox: LightboxComponent;\r\n @Output() remove = new Subject<ChatMessageAttachment>();\r\n @Output() loaded = new Subject<void>();\r\n\r\n loadedAttachments = new WeakMap<ChatMessageAttachment, boolean>();\r\n\r\n ngAfterViewInit() {\r\n\r\n }\r\n\r\n markAttachmentLoaded(attachment: ChatMessageAttachment) {\r\n this.loadedAttachments.set(attachment, true);\r\n\r\n if (this.allAttachmentsLoaded)\r\n this.loaded.next();\r\n }\r\n\r\n isAttachmentLoaded(attachment: ChatMessageAttachment) {\r\n return this.loadedAttachments.has(attachment);\r\n }\r\n\r\n get allAttachmentsLoaded() {\r\n return this.attachments.every(x => this.isAttachmentLoaded(x));\r\n }\r\n\r\n removeAttachment(attachment: ChatMessageAttachment) {\r\n this.remove.next(attachment);\r\n }\r\n\r\n isImageAttachment(attachment: ChatMessageAttachment) {\r\n if (attachment.type.startsWith('image/'))\r\n return true;\r\n return false;\r\n }\r\n\r\n isCardAttachment(attachment: ChatMessageAttachment) {\r\n if (['card'].includes(attachment.type))\r\n return true;\r\n return false;\r\n }\r\n\r\n showLightbox(image: ChatMessageAttachment) {\r\n this.lightbox.open(\r\n image.url,\r\n this.attachments\r\n .filter(x => x.type === 'image/png')\r\n .map(x => x.url)\r\n )\r\n }\r\n\r\n get validAttachments() {\r\n return this.attachments.filter(x => x.type);\r\n }\r\n\r\n get inlineAttachments() {\r\n return this.validAttachments.filter(x => x.type !== 'card' && (x.style === 'inline' || !x.style));\r\n }\r\n\r\n get blockAttachments() {\r\n return this.validAttachments.filter(x => x.style === 'block' || x.type === 'card');\r\n }\r\n\r\n attachmentId(index: number, attachment: ChatMessageAttachment) {\r\n return attachment.url;\r\n }\r\n}","@if (attachments?.length > 0) {\r\n <banta-lightbox #lightbox></banta-lightbox>\r\n <div class=\"block-attachments\">\r\n @for (attachment of blockAttachments; track attachmentId($index, attachment)) {\r\n <banta-attachment\r\n [attachment]=\"attachment\"\r\n [editing]=\"editing\"\r\n (loaded)=\"markAttachmentLoaded(attachment)\"\r\n (removed)=\"removeAttachment(attachment)\"\r\n (activated)=\"showLightbox(attachment)\"\r\n ></banta-attachment>\r\n }\r\n </div>\r\n @if (attachments && attachments?.length > 0) {\r\n <div\r\n class=\"inline-attachments\"\r\n [class.single]=\"attachments?.length === 1\"\r\n >\r\n @for (attachment of inlineAttachments; track attachmentId($index, attachment)) {\r\n <banta-attachment\r\n [attachment]=\"attachment\"\r\n [editing]=\"editing\"\r\n (loaded)=\"markAttachmentLoaded(attachment)\"\r\n (removed)=\"removeAttachment(attachment)\"\r\n (activated)=\"showLightbox(attachment)\"\r\n ></banta-attachment>\r\n }\r\n </div>\r\n }\r\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { TimestampComponent } from './timestamp.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LightboxComponent } from './lightbox/lightbox.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { BantaMarkdownToHtmlPipe } from './markdown-to-html.pipe';\r\nimport { BantaAttachmentsComponent } from './attachments/attachments.component';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { BantaTrustResourceUrlPipe } from './trust-resource-url.pipe';\r\nimport { BantaAttachmentComponent } from './attachment/attachment.component';\r\nimport { BantaMentionLinkerPipe } from './mention-linker.pipe';\r\nimport { TimerPool } from './timer-pool.service';\r\n\r\nconst COMPONENTS = [\r\n TimestampComponent,\r\n LightboxComponent,\r\n BantaMarkdownToHtmlPipe,\r\n BantaMentionLinkerPipe,\r\n BantaTrustResourceUrlPipe,\r\n BantaAttachmentComponent,\r\n BantaAttachmentsComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatButtonModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class BantaCommonModule {\r\n static forRoot(): ModuleWithProviders<BantaCommonModule> {\r\n return {\r\n ngModule: BantaCommonModule,\r\n providers: [\r\n TimerPool\r\n ]\r\n }\r\n }\r\n}","import { Component, inject, OnInit, Output } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Subject } from 'rxjs';\r\nimport { BANTA_SDK_OPTIONS } from '../../sdk-options';\r\nimport { EmojiDecorator, EMOJI, EmojiCategory, Emoji } from '@astronautlabs/emoji';\r\n\r\nconst CATEGORY_ICONS = {\r\n symbols: 'warning',\r\n people: 'people',\r\n nature: 'nature',\r\n travel: 'location_on',\r\n activity: 'local_activity',\r\n food: 'restaurant',\r\n objects: 'computer',\r\n flags: 'flag'\r\n};\r\n\r\nexport interface AugmentedCategory extends EmojiCategory {\r\n icon: string,\r\n items: AugmentedEmoji[];\r\n}\r\n\r\nexport interface AugmentedEmoji extends Emoji {\r\n html: SafeHtml;\r\n}\r\n\r\n@Component({\r\n selector: 'emoji-selector-panel',\r\n templateUrl: './emoji-selector-panel.component.html',\r\n styleUrls: ['./emoji-selector-panel.component.scss'],\r\n standalone: false\r\n})\r\nexport class EmojiSelectorPanelComponent implements OnInit {\r\n\r\n private sanitizer = inject(DomSanitizer);\r\n private sdkOptions = inject(BANTA_SDK_OPTIONS, { optional: true });\r\n\r\n categories: AugmentedCategory[] = [];\r\n allEmoji: AugmentedEmoji[];\r\n activeCategory: string = 'people';\r\n searchResults: any[] = [];\r\n searchVisible = false;\r\n\r\n @Output()\r\n private selected: Subject<string> = new Subject();\r\n\r\n private _searchQuery: string;\r\n\r\n get searchQuery() {\r\n return this._searchQuery;\r\n }\r\n\r\n set searchQuery(value) {\r\n this._searchQuery = value;\r\n setTimeout(() => {\r\n this.searchResults = this.allEmoji\r\n .filter(k =>\r\n k.description?.includes(value)\r\n || k.shortcut?.includes(value)\r\n || k.keywords?.some(x => x.includes(value))\r\n )\r\n ;\r\n this.searchResults.splice(50, this.searchResults.length);\r\n });\r\n }\r\n\r\n humanize(str: string) {\r\n if (!str)\r\n return undefined;\r\n return str.replace(/(^| )[a-z]/g, k => k.toUpperCase()).replace(/_/g, ' ');\r\n }\r\n\r\n select(char: string) {\r\n this.selected.next(char);\r\n }\r\n\r\n hideSearch() {\r\n // because of the \"outside click detection\"\r\n setTimeout(() => {\r\n this.searchVisible = false;\r\n });\r\n }\r\n\r\n showSearch() {\r\n // because of the \"outside click detection\"\r\n setTimeout(() => {\r\n this.searchVisible = true;\r\n });\r\n }\r\n\r\n private get emojiUrl() {\r\n return this.sdkOptions?.emojiUrl ?? 'https://cdn.jsdelivr.net/gh/jdecked/twemoji@17.0.2/assets/';\r\n }\r\n\r\n ngOnInit() {\r\n for (let category of EMOJI.categories) {\r\n if (!CATEGORY_ICONS[category.id])\r\n console.error(`Missing icon for category '${category.id}'`);\r\n this.categories.push({\r\n ...category,\r\n icon: CATEGORY_ICONS[category.id] ?? 'code',\r\n items: category.items.map(emoji => ({\r\n ...emoji,\r\n html: this.sanitizer.bypassSecurityTrustHtml(\r\n EmojiDecorator.parse(emoji.string, { baseUrl: this.emojiUrl })\r\n )\r\n }))\r\n });\r\n }\r\n\r\n this.allEmoji = this.categories.flatMap(cat => cat.items);\r\n\r\n }\r\n\r\n}\r\n","@if (searchVisible) {\r\n <div class=\"search-box\">\r\n <a mat-icon-button href=\"javascript:;\" (click)=\"hideSearch()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </a>\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Search for emoji</mat-label>\r\n <input name=\"search\" type=\"text\" matInput placeholder=\"Start typing\" [(ngModel)]=\"searchQuery\" />\r\n </mat-form-field>\r\n </div>\r\n}\r\n\r\n<div class=\"selector\">\r\n @if (searchVisible) {\r\n <div class=\"emoji-list\">\r\n @for (emoji of searchResults; track emoji.unicode) {\r\n <a href=\"javascript:;\" (click)=\"select(emoji.char)\" [innerHtml]=\"emoji.html || ''\"></a>\r\n }\r\n </div>\r\n }\r\n @if (!searchVisible) {\r\n <div class=\"categories\">\r\n @if (!searchVisible) {\r\n @for (category of categories; track category.id) {\r\n <a [title]=\"humanize(category.title)\"\r\n [class.active]=\"activeCategory === category.id\"\r\n mat-icon-button\r\n (click)=\"activeCategory = category.id\">\r\n <mat-icon>{{category.icon}}</mat-icon>\r\n </a>\r\n }\r\n <a title=\"Search\" [class.active] mat-icon-button (click)=\"showSearch()\">\r\n <mat-icon>search</mat-icon>\r\n </a>\r\n }\r\n </div>\r\n @for (category of categories; track category.id) {\r\n @if (activeCategory && activeCategory == category.id) {\r\n <div class=\"emoji-list\">\r\n @for (emoji of category.items; track emoji.unicode) {\r\n <a href=\"javascript:;\"\r\n (click)=\"select(emoji.string)\"\r\n [innerHtml]=\"emoji.html || ''\"></a>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n</div>\r\n","/// <reference types=\"@types/resize-observer-browser\" />\r\n\r\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';\r\nimport { Component, ElementRef, HostBinding, Output, ViewChild, Input } from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { EmojiSelectorPanelComponent } from './emoji-selector-panel/emoji-selector-panel.component';\r\n\r\n@Component({\r\n selector: 'emoji-selector-button',\r\n template: `\r\n <button #button type=\"button\" mat-icon-button (click)=\"show()\" [disabled]=\"disabled\">\r\n <mat-icon>emoji_emotions</mat-icon>\r\n </button>\r\n <ng-template cdkPortal #selectorPanelTemplate=\"cdkPortal\">\r\n <emoji-selector-panel \r\n #panel\r\n (selected)=\"insert($event)\"\r\n ></emoji-selector-panel>\r\n </ng-template>\r\n `,\r\n styles: [`\r\n :host {\r\n display: block;\r\n position: relative;\r\n }\r\n\r\n button {\r\n color: #666\r\n }\r\n `],\r\n standalone: false\r\n})\r\nexport class EmojiSelectorButtonComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>,\r\n private overlay: Overlay\r\n ) {\r\n }\r\n\r\n @ViewChild('selectorPanelTemplate') selectorPanelTemplate: TemplatePortal<any>;\r\n\r\n private _selected = new Subject<string>();\r\n showEmojiPanel = false;\r\n\r\n @Output()\r\n get selected() : Observable<string> {\r\n return this._selected;\r\n }\r\n\r\n private overlayRef: OverlayRef;\r\n\r\n get isOpen() {\r\n return this.overlayRef;\r\n }\r\n\r\n /**\r\n * Insert the given emoji.\r\n * @param str \r\n */\r\n insert(str) {\r\n this._selected.next(str);\r\n this.close();\r\n }\r\n\r\n close() {\r\n if (this.overlayRef) {\r\n this.overlayRef.dispose();\r\n this.overlayRef = null;\r\n }\r\n }\r\n\r\n @Input() disabled = false;\r\n @Input() overlayX: 'start' | 'center' | 'end' = 'end';\r\n @Input() overlayY: 'top' | 'center' | 'bottom' = 'top';\r\n @Input() originX: 'start' | 'center' | 'end' = 'end';\r\n @Input() originY: 'top' | 'center' | 'bottom' = 'bottom';\r\n\r\n show() {\r\n if (this.isOpen) {\r\n this.close();\r\n }\r\n\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay.position()\r\n .flexibleConnectedTo(this.elementRef)\r\n .withPositions([\r\n { \r\n originX: this.originX, \r\n originY: this.originY,\r\n overlayX: this.overlayX,\r\n overlayY: this.overlayY\r\n }\r\n ])\r\n .withFlexibleDimensions(true),\r\n hasBackdrop: true,\r\n disposeOnNavigation: true,\r\n scrollStrategy: this.overlay.scrollStrategies.reposition({\r\n autoClose: true\r\n })\r\n });\r\n\r\n this.overlayRef.backdropClick().subscribe(() => {\r\n this.close();\r\n })\r\n\r\n this.overlayRef.keydownEvents().subscribe(event => {\r\n if (event.key === 'Escape') {\r\n this.close();\r\n }\r\n });\r\n this.overlayRef.attach(this.selectorPanelTemplate);\r\n }\r\n}","import { NgModule } from '@angular/core';\r\nimport { EmojiSelectorPanelComponent } from './emoji-selector-panel/emoji-selector-panel.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EmojiSelectorButtonComponent } from './emoji-selector-button.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\n\r\nconst COMPONENTS = [\r\n EmojiSelectorPanelComponent,\r\n EmojiSelectorButtonComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class EmojiModule {\r\n\r\n}","import { BehaviorSubject, Observable } from 'rxjs';\r\nimport { ChatMessage, Vote, CommentsOrder, Notification, User, UrlCard, FilterMode, Topic } from '@banta/common';\r\nimport { ChatSourceBase } from './chat-source-base';\r\nimport { AttachmentResolver, AttachmentScraper } from './attachment-scraper';\r\n\r\nexport interface ChatSourceOptions {\r\n sortOrder?: CommentsOrder;\r\n filterMode?: FilterMode;\r\n\r\n /**\r\n * How many messages should be loaded initially?\r\n */\r\n initialMessageCount?: number;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\nexport abstract class ChatBackendBase {\r\n constructor() {\r\n }\r\n \r\n abstract getSourceForTopic(topicId : string, options?: ChatSourceOptions) : Promise<ChatSourceBase>;\r\n abstract getSourceForThread(topicId : string, messageId : string, options?: ChatSourceOptions) : Promise<ChatSourceBase>;\r\n\r\n /**\r\n * Get the count of the given topic\r\n * @param topicId \r\n * @returns \r\n */\r\n abstract getSourceCountForTopic(topicId: string): Promise<number>;\r\n\r\n /**\r\n * Get the count of the given topics. \r\n * @param topicId Topics to count messages on. Maximum of 1000.\r\n * @returns \r\n */\r\n abstract getSourceCountForTopics(topicIds: string[]): Promise<Record<string, number>>;\r\n\r\n /**\r\n * Get information about the given topic. \r\n * @param topicId \r\n * @returns The topic object, or undefined if no such topic was found.\r\n */\r\n abstract getTopic(topicId: string): Promise<Topic | undefined>;\r\n\r\n /**\r\n * Get information about the given topics\r\n * @param topicIds The topic IDs to look up. Maximum of 1000.\r\n * @returns An array of matching topic objects.\r\n */\r\n abstract getTopicsById(topicIds: string[]): Promise<Topic[]>;\r\n\r\n /**\r\n * Get a set of messages from the given topic.\r\n * @param topicId \r\n * @returns \r\n */\r\n abstract getMessages(\r\n topicId: string, \r\n sort?: CommentsOrder, \r\n filter?: FilterMode, \r\n offset?: number, \r\n limit?: number,\r\n pinned?: boolean\r\n ): Promise<ChatMessage[]>;\r\n\r\n /**\r\n * Get a set of messages from the given topic.\r\n * @param topicId \r\n * @returns \r\n */\r\n abstract getReplies(\r\n parentMessageId: string,\r\n sort?: CommentsOrder, \r\n filter?: FilterMode, \r\n offset?: number, \r\n limit?: number\r\n ): Promise<ChatMessage[]>;\r\n\r\n abstract refreshMessage(message : ChatMessage): Promise<ChatMessage>;\r\n abstract getMessage(topicId : string, messageId : string): Promise<ChatMessage>;\r\n abstract getSubMessage(topicId : string, parentMessageId : string, messageId : string): Promise<ChatMessage>;\r\n abstract watchMessage(message : ChatMessage, handler : (message : ChatMessage) => void) : () => void;\r\n abstract getCardForUrl(url: string): Promise<UrlCard>;\r\n readonly notificationsChanged : Observable<Notification[]>;\r\n readonly newNotification : Observable<Notification>;\r\n \r\n private _userChanged = new BehaviorSubject<User>(null);\r\n private _user : User;\r\n \r\n get userChanged() : Observable<User> {\r\n return this._userChanged;\r\n }\r\n \r\n set user(user : User) {\r\n this._user = user;\r\n this._userChanged.next(user);\r\n }\r\n\r\n get user() {\r\n return this._user;\r\n }\r\n \r\n private _attachmentScrapers: AttachmentScraper[] = [];\r\n private _attachmentResolvers: AttachmentResolver[] = [];\r\n\r\n registerAttachmentScraper(scraper: AttachmentScraper) {\r\n this._attachmentScrapers.push(scraper);\r\n }\r\n\r\n registerAttachmentResolver(resolver: AttachmentResolver) {\r\n this._attachmentResolvers.push(resolver);\r\n }\r\n\r\n get attachmentScrapers() {\r\n return this._attachmentScrapers.slice();\r\n }\r\n\r\n get attachmentResolvers() {\r\n return this._attachmentResolvers.slice();\r\n }\r\n}","import { Component, Output, Input, HostBinding, ElementRef } from \"@angular/core\";\r\nimport { Subject } from 'rxjs';\r\nimport { ChatMessage, ChatPermissions, User } from '@banta/common';\r\nimport { MessageMenuItem } from \"../../message-menu-item\";\r\nimport { take } from 'rxjs/operators';\r\nimport { PinOptions } from \"../../chat-source\";\r\n\r\n@Component({\r\n selector: 'banta-comment',\r\n templateUrl: './comment.component.html',\r\n styleUrls: ['./comment.component.scss'],\r\n standalone: false\r\n})\r\nexport class CommentComponent {\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n let maxTime = 100;\r\n let minTime = 0;\r\n let randomTime = minTime + Math.random() * (maxTime - minTime);\r\n\r\n setTimeout(() => {\r\n this.isNew = true;\r\n this.visible = true;\r\n setTimeout(() => this.isNew = false, 1000);\r\n }, randomTime);\r\n }\r\n\r\n //#region Message\r\n\r\n @Input() busy = false;\r\n @Input() get message() { return this._message; }\r\n set message(value) { this.setMessage(value); }\r\n private _message : ChatMessage;\r\n\r\n //#endregion\r\n //#region Properties\r\n\r\n private isLoaded = false;\r\n editedMessage: string;\r\n pinFormVisible = false;\r\n pinUntilDate: Date;\r\n pinUntilTime: string;\r\n pinMode: 'forever' | 'until';\r\n today = new Date();\r\n\r\n //#endregion\r\n //#region Inputs\r\n\r\n @Input() customMenuItems: MessageMenuItem[];\r\n @Input() showReplyAction = true;\r\n @Input() maxLength: number = 1500;\r\n @Input() permissions: ChatPermissions;\r\n @Input() mine = false;\r\n @Input() editing = false;\r\n @Input() genericAvatarUrl: string;\r\n @Input() readonly = false;\r\n\r\n //#endregion\r\n //#region Outputs\r\n\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n private _liked = new Subject<void>();\r\n private _unliked = new Subject<void>();\r\n private _shared = new Subject<ChatMessage>();\r\n\tprivate _userSelected = new Subject<void>();\r\n\tprivate _avatarSelected = new Subject<User>();\r\n\tprivate _usernameSelected = new Subject<User>();\r\n private _editStarted = new Subject<void>();\r\n private _deleted = new Subject<void>();\r\n private _editEnded = new Subject<void>();\r\n private _edited = new Subject<string>();\r\n private _loaded = new Subject<void>();\r\n private _pinned = new Subject<{ message: ChatMessage, options: PinOptions }>();\r\n private _unpinned = new Subject<ChatMessage>();\r\n\r\n @Output() readonly liked = this._liked.asObservable();\r\n @Output() readonly unliked = this._unliked.asObservable();\r\n @Output() readonly selected = this._selected.asObservable();\r\n @Output() readonly edited = this._edited.asObservable();\r\n @Output() readonly deleted = this._deleted.asObservable();\r\n @Output() readonly editStarted = this._editStarted.asObservable();\r\n @Output() readonly editEnded = this._editEnded.asObservable();\r\n @Output() readonly shared = this._shared.asObservable();\r\n\t@Output() readonly userSelected = this._userSelected.asObservable();\r\n @Output() readonly usernameSelected = this._usernameSelected.asObservable();\r\n\t@Output() readonly avatarSelected = this._avatarSelected.asObservable();\r\n @Output() readonly reported = this._reported.asObservable();\r\n @Output() readonly loaded = this._loaded.asObservable();\r\n @Output() readonly pinned = this._pinned.asObservable();\r\n @Output() readonly unpinned = this._unpinned.asObservable();\r\n\r\n //#endregion\r\n //#region UI Bindings\r\n\r\n @HostBinding('attr.data-comment-id') get commentId() { return this.message?.id; }\r\n @HostBinding('class.new') isNew = false;\r\n @HostBinding('class.highlighted') get isHighlighted() { return this.message?.transientState?.highlighted ?? false; }\r\n @HostBinding('class.visible') visible = false;\r\n\r\n get replyCount() { return this.message.submessages?.length || this.message.submessageCount || 0; }\r\n get element() { return this.elementRef.nativeElement; }\r\n @HostBinding('class.pinned')\r\n get isPinned() {\r\n return this.message.pinned && (!this.message.pinnedUntil || this.message.pinnedUntil > Date.now());\r\n }\r\n\r\n get pinFormValid() {\r\n if (!this.pinMode)\r\n return false;\r\n\r\n if (this.pinMode === 'until') {\r\n return !!this.pinUntilDate && !!this.pinUntilTime;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n avatarForUser(user : User) { return `url(${user?.avatarUrl ?? this.genericAvatarUrl})`; }\r\n\r\n //#endregion\r\n //#region Public Component API\r\n\r\n async waitForLoad() {\r\n await this.isLoaded ? Promise.resolve() : this.loaded.pipe(take(1)).toPromise();\r\n }\r\n\r\n //#endregion\r\n //#region Private API\r\n\r\n private setMessage(value: ChatMessage) {\r\n this._message = value;\r\n if (this._message.attachments?.length > 0) {\r\n this.isLoaded = false;\r\n } else {\r\n this.isLoaded = true;\r\n this._loaded.next();\r\n }\r\n }\r\n\r\n //#endregion\r\n //#region Actions\r\n\r\n markAttachmentsLoaded() { this.isLoaded = true; this._loaded.next(); }\r\n saveEdit() { this._edited.next(this.editedMessage); }\r\n endEditing() { this._editEnded.next(); }\r\n delete() { this._deleted.next(); }\r\n report() { this._reported.next(); }\r\n like() { this._liked.next(); }\r\n unlike() { this._unliked.next(); }\r\n share() { this._shared.next(this.message); }\r\n unpin() { this._unpinned.next(this.message); }\r\n select() { this._selected.next(); }\r\n\tselectUser() { this._userSelected.next(); }\r\n startEdit() { this._editStarted.next(); this.editedMessage = this.message.message; }\r\n selectUsername(user: User) { this._usernameSelected.next(user); this.selectUser(); }\r\n\tselectAvatar(user: User) { this._avatarSelected.next(user); this.selectUser(); }\r\n\r\n showPinForm() {\r\n this.pinFormVisible = true;\r\n this.pinUntilTime = '08:00';\r\n }\r\n\r\n submitPin() {\r\n let pinUntil: number;\r\n if (this.pinMode === 'until') {\r\n let date = new Date(this.pinUntilDate);\r\n let [hour, minute] = this.pinUntilTime.split(':');\r\n date.setHours(Number(hour));\r\n date.setMinutes(Number(minute));\r\n pinUntil = date.getTime();\r\n }\r\n\r\n this.pinFormVisible = false;\r\n this._pinned.next({\r\n message: this.message,\r\n options: {\r\n until: pinUntil\r\n }\r\n })\r\n }\r\n\r\n //#endregion\r\n}\r\n","\r\n<mat-menu #pointItemMenu=\"matMenu\">\r\n @if (permissions.canPin) {\r\n @if (isPinned) {\r\n <button mat-menu-item (click)=\"unpin()\">\r\n <mat-icon>push_pin</mat-icon>\r\n Unpin\r\n </button>\r\n } @else {\r\n <button mat-menu-item (click)=\"showPinForm()\">\r\n <mat-icon>push_pin</mat-icon>\r\n Pin\r\n </button>\r\n }\r\n <mat-divider />\r\n }\r\n <button mat-menu-item (click)=\"share()\">\r\n <mat-icon>share</mat-icon>\r\n Share\r\n </button>\r\n @if (!mine) {\r\n <button mat-menu-item (click)=\"report()\">\r\n <mat-icon>warning</mat-icon>\r\n Report\r\n </button>\r\n }\r\n @if (mine) {\r\n <button [disabled]=\"!permissions?.canEdit || readonly\" mat-menu-item (click)=\"startEdit()\">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n }\r\n @if (mine) {\r\n <button [disabled]=\"!permissions?.canDelete || readonly\" mat-menu-item (click)=\"delete()\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n }\r\n\r\n @for (menuItem of customMenuItems; track menuItem) {\r\n <button mat-menu-item (click)=\"menuItem.action(message)\">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n }\r\n\r\n</mat-menu>\r\n\r\n<div class=\"banta-message-content-container\">\r\n <div class=\"banta-user\">\r\n <div class=\"banta-user-1\">\r\n <a\r\n href=\"javascript:;\"\r\n class=\"banta-avatar\"\r\n (click)=\"selectAvatar(message.user)\"\r\n [style.background-image]=\"avatarForUser(message.user)\"></a>\r\n <div class=\"banta-user-identity\">\r\n <a href=\"javascript:;\" class=\"banta-display-name\" (click)=\"selectUser()\">{{message.user.displayName}}</a>\r\n <a href=\"javascript:;\" class=\"banta-username\" (click)=\"selectUsername(message.user)\">@{{message.user.username}}</a>\r\n </div>\r\n </div>\r\n <div class=\"banta-user-2\">\r\n @if (message.user.tag) {\r\n <span class=\"banta-user-tag\">{{message.user.tag}}</span>\r\n }\r\n <banta-timestamp [value]=\"message.sentAt\"></banta-timestamp>\r\n <span class=\"spacer\"></span>\r\n </div>\r\n <div class=\"spacer\"></div>\r\n </div>\r\n @if (!editing) {\r\n <div class=\"banta-content\">\r\n <span class=\"banta-message-content\" [innerHTML]=\"message.message | mentionLinker: message.mentionLinks | bantaMarkdownToHtml\"></span>\r\n <banta-attachments\r\n [attachments]=\"message.attachments\"\r\n (loaded)=\"markAttachmentsLoaded()\"\r\n ></banta-attachments>\r\n <ul class=\"message-facts\">\r\n @if (message.edits?.length > 0) {\r\n <li>(Edited)</li>\r\n }\r\n </ul>\r\n @if (pinFormVisible) {\r\n <div class=\"banta-pin-form\">\r\n <div class=\"banta-pin-form-header\">\r\n <div class=\"banta-pin-form-header-title\">\r\n Pin message?\r\n </div>\r\n <div class=\"spacer\"></div>\r\n <!-- <div class=\"banta-pin-form-auth-explanation\">\r\n <mat-icon>lock</mat-icon> Only available to authorized users.\r\n </div> -->\r\n <button mat-icon-button (click)=\"pinFormVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n <p>\r\n Pinning this message will cause it to appear at the top of the discussion for all users.\r\n </p>\r\n <mat-radio-group [(ngModel)]=\"pinMode\">\r\n <div>\r\n <mat-radio-button value=\"forever\">Pin indefinitely</mat-radio-button>\r\n </div>\r\n <div>\r\n <mat-radio-button value=\"until\">Pin until a specific time:</mat-radio-button>\r\n </div>\r\n <div class=\"banta-pin-form-until\" [class.banta-pin-form-until-disabled]=\"pinMode !== 'until'\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Date</mat-label>\r\n <input\r\n matInput\r\n [min]=\"today\"\r\n [matDatepicker]=\"datepicker\"\r\n [(ngModel)]=\"pinUntilDate\"\r\n [disabled]=\"pinMode !== 'until'\"\r\n />\r\n <mat-datepicker #datepicker/>\r\n <mat-datepicker-toggle [for]=\"datepicker\" matSuffix/>\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Time</mat-label>\r\n <input matInput\r\n type=\"time\"\r\n [(ngModel)]=\"pinUntilTime\"\r\n [ngModelOptions]=\"{updateOn: 'blur'}\"\r\n [disabled]=\"pinMode !== 'until'\"\r\n />\r\n <!-- <mat-timepicker #timepicker/>\r\n <mat-timepicker-toggle [for]=\"timepicker\" matSuffix/> -->\r\n </mat-form-field>\r\n </div>\r\n </mat-radio-group>\r\n <div class=\"banta-pin-form-actions\">\r\n <button mat-button (click)=\"pinFormVisible = false\">\r\n Cancel\r\n </button>\r\n <button mat-raised-button color=\"primary\" (click)=\"submitPin()\" [disabled]=\"!pinFormValid\">\r\n Pin\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if (editing) {\r\n <div class=\"banta-content\" style=\"padding-bottom: 2em;\">\r\n <div>\r\n <mat-form-field floatLabel=\"always\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]=\"editedMessage\" [maxlength]=\"maxLength\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)=\"saveEdit()\">Save</button> \r\n <button mat-button (click)=\"endEditing()\">Cancel</button>\r\n </div>\r\n }\r\n\r\n\r\n <div class=\"banta-actions\">\r\n @if (isPinned) {\r\n <div class=\"pin-indicator\">\r\n <mat-icon>push_pin</mat-icon> Pinned\r\n @if (message.pinnedUntil) {\r\n until <time [attr.datetime]=\"message.pinnedUntil | date: 'full'\">{{ message.pinnedUntil | date: 'short' }}</time>\r\n }\r\n </div>\r\n }\r\n <div class=\"spacer\"></div>\r\n @if (showReplyAction) {\r\n <div class=\"banta-counted-action\">\r\n <button mat-button [matTooltip]=\"replyCount > 0 ? 'Replies' : 'Reply'\" matTooltipPosition=\"below\" (click)=\"select()\">\r\n <mat-icon>comment</mat-icon>\r\n <span class=\"banta-count-indicator\">\r\n {{replyCount > 0 ? 'Replies' : 'Reply'}}\r\n {{replyCount > 0 ? '(' + replyCount + ')' : ''}}\r\n </span>\r\n </button>\r\n </div>\r\n }\r\n <div class=\"banta-counted-action\" [class.active]=\"message.userState?.liked\">\r\n @if (message.transientState?.liking) {\r\n <button\r\n mat-icon-button\r\n [disabled]=\"true\"\r\n [matTooltip]=\"busy ? 'Please wait...' : message.userState?.liked ? 'Unlike' : 'Like'\"\r\n matTooltipPosition=\"below\"\r\n >\r\n <mat-spinner [diameter]=\"15\" style=\"margin-left: 1em;\"></mat-spinner>\r\n </button>\r\n }\r\n @if (!message.transientState?.liking) {\r\n <button\r\n mat-button\r\n [disabled]=\"readonly\"\r\n [matTooltip]=\"permissions?.canLike ? busy ? 'Please wait...' : 'Like' : permissions?.canLikeErrorMessage\"\r\n matTooltipPosition=\"below\"\r\n (click)=\"message.userState?.liked ? unlike() : like()\"\r\n >\r\n <mat-icon>thumb_up</mat-icon>\r\n @if (message.likes > 0) {\r\n <span class=\"banta-count-indicator\">\r\n {{message.likes}}\r\n </span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"pointItemMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n","import { Directive } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: `[bantaInlineReplies]`,\r\n standalone: false\r\n})\r\nexport class BantaInlineRepliesDirective {}\r\n","import { Component, Input, ViewChild, ElementRef, Output, HostBinding, ViewChildren, QueryList, TemplateRef, ContentChild } from \"@angular/core\";\r\nimport { User, ChatMessage, CommentsOrder, FilterMode } from '@banta/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\nimport { MessageMenuItem } from \"../../message-menu-item\";\r\nimport { CommentComponent } from \"../comment/comment.component\";\r\nimport { PinOptions } from \"../../chat-source\";\r\nimport { BantaInlineRepliesDirective } from \"../inline-replies.directive\";\r\n\r\nexport interface EditEvent {\r\n message: ChatMessage;\r\n newMessage: string;\r\n}\r\n\r\nconst DEFAULT_MAX_MESSAGES = 2000;\r\nconst DEFAULT_MAX_VISIBLE_MESSAGES = 200;\r\n\r\n@Component({\r\n selector: 'banta-comment-view',\r\n templateUrl: './comment-view.component.html',\r\n styleUrls: ['./comment-view.component.scss'],\r\n standalone: false\r\n})\r\nexport class CommentViewComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef: ElementRef<HTMLElement>\r\n ) {\r\n }\r\n\r\n //#region Source\r\n\r\n private _source: ChatSourceBase;\r\n @Input() get source() { return this._source; }\r\n set source(value) { this.setSource(value); }\r\n\r\n //#endregion\r\n //#region Fields\r\n\r\n private _sourceSubs = new Subscription();\r\n menuMessage: ChatMessage = null;\r\n pinnedMessages: ChatMessage[] = [];\r\n messages: ChatMessage[] = [];\r\n currentUser: User;\r\n customSortEnabled = false;\r\n markSourceLoaded: () => void;\r\n sourceLoaded = new Promise<void>(r => this.markSourceLoaded = r);\r\n isViewingMore = false;\r\n isLoadingMore = false;\r\n hasMore = false;\r\n messageClicked = false;\r\n\r\n get previousMessages() { return this.newestLast ? this.olderMessages : this.newMessages; }\r\n get nextMessages() { return this.newestLast ? this.newMessages : this.olderMessages; }\r\n\r\n /**\r\n * While this is called \"new\" messages, it really represents the messages that would be visible *at the beginning\r\n * of the sort order*, which can be flipped by the newestLast feature (used for replies mode).\r\n *\r\n * So, when newestLast is false (top-level comments), regardless of the current sortOrder, newMessages are conceptually\r\n * *above* the visible set of messages.\r\n *\r\n * When newestLast is true (as in replies mode), regardless of the current sortOrder, newMessages are conceptually\r\n * *below* the visible set of messages.\r\n */\r\n newMessages: ChatMessage[] = [];\r\n\r\n /**\r\n * While this is called \"older\" messages, it really represents the messages that would be visible *at the end of the\r\n * sort order*, which can be flipped by the newestLast feature (useds for replies mode).\r\n *\r\n * So, when newestLast is false, regardless of the current sortOrder, olderMessages are conceptually *below*\r\n * the visible set of messages.\r\n *\r\n * When newestLast is true (as in replies mode), regardless of the current sortOrder, olderMessages are conceptually\r\n * *above* the visible set of messages.\r\n */\r\n olderMessages: ChatMessage[] = [];\r\n\r\n //#endregion\r\n //#region Inputs\r\n\r\n private _maxMessages: number;\r\n @Input()\r\n set maxMessages(value) { this._maxMessages = value; }\r\n get maxMessages() { return this._maxMessages ?? DEFAULT_MAX_MESSAGES; }\r\n\r\n private _maxVisibleMessages: number;\r\n @Input()\r\n set maxVisibleMessages(value) { this._maxVisibleMessages = value; }\r\n get maxVisibleMessages() { return this._maxVisibleMessages ?? DEFAULT_MAX_VISIBLE_MESSAGES; }\r\n\r\n @Input() collapsePins = false;\r\n @Input() newestLast = false;\r\n @Input() holdNewMessages = false;\r\n @Input() showEmptyState = true;\r\n @Input() emptyStateMessage = 'Be the first to comment!';\r\n @Input() allowReplies = true;\r\n @Input() enableHoldOnClick = false;\r\n @Input() enableHoldOnScroll = true;\r\n @Input() customMenuItems: MessageMenuItem[] = [];\r\n @Input() @HostBinding('class.fixed-height') fixedHeight: boolean;\r\n @Input() selectedMessage: ChatMessage;\r\n @Input() genericAvatarUrl: string;\r\n\r\n @ContentChild(BantaInlineRepliesDirective, { read: TemplateRef })\r\n inlineRepliesTemplate: TemplateRef<any>;\r\n\r\n //#endregion\r\n //#region Outputs\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _liked = new Subject<ChatMessage>();\r\n private _unliked = new Subject<ChatMessage>();\r\n private _pinned = new Subject<{ message: ChatMessage, options: PinOptions }>();\r\n private _unpinned = new Subject<ChatMessage>();\r\n private _reported = new Subject<ChatMessage>();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _usernameSelected = new Subject<User>();\r\n private _avatarSelected = new Subject<User>();\r\n private _shared = new Subject<ChatMessage>();\r\n private _deleted = new Subject<ChatMessage>();\r\n private _messageEdited = new Subject<EditEvent>();\r\n private _sortOrderChanged = new Subject<CommentsOrder>();\r\n private _filterModeChanged = new Subject<FilterMode>();\r\n\r\n @Output() readonly userSelected = this._userSelected.asObservable();\r\n @Output() readonly reported = this._reported.asObservable();\r\n @Output() readonly liked = this._liked.asObservable();\r\n @Output() readonly unliked = this._unliked.asObservable();\r\n @Output() readonly pinned = this._pinned.asObservable();\r\n @Output() readonly unpinned = this._unpinned.asObservable();\r\n @Output() readonly usernameSelected = this._usernameSelected.asObservable();\r\n @Output() readonly avatarSelected = this._avatarSelected.asObservable();\r\n @Output() readonly shared = this._shared.asObservable();\r\n @Output() readonly deleted = this._deleted.asObservable();\r\n @Output() readonly selected = this._selected.asObservable();\r\n @Output() readonly messageEdited = this._messageEdited.asObservable();\r\n @Output() readonly sortOrderChanged = this._sortOrderChanged.asObservable();\r\n @Output() readonly filterModeChanged = this._filterModeChanged.asObservable();\r\n\r\n //#endregion\r\n //#region UI Bindings\r\n\r\n @ViewChildren(CommentComponent) commentsQuery: QueryList<CommentComponent>;\r\n @ViewChild('messageContainer') messageContainer: ElementRef<HTMLElement>;\r\n get comments() { return Array.from(this.commentsQuery); }\r\n\r\n //#endregion\r\n\r\n /**\r\n * Returns true if this message can be found within one of the message buffers (older, current, newer)\r\n * @param message\r\n */\r\n isMessageLoadedInContext(message: ChatMessage) {\r\n return this.olderMessages.find(x => x.id === message.id)\r\n || this.messages.find(x => x.id === message.id)\r\n || this.newMessages.find(x => x.id === message.id);\r\n }\r\n\r\n async loadMessageInContext(message: ChatMessage) {\r\n await this.sourceLoaded;\r\n\r\n console.log(`Loading message ${message.id} in context...`);\r\n while (this.hasMore && !this.isMessageLoadedInContext(message)) {\r\n console.log(`...Need to load more comments to find ${message.id}`);\r\n await this.showMore();\r\n }\r\n\r\n if (!this.isMessageLoadedInContext(message)) {\r\n console.error(`Error while loading message in context: Failed to find message ${message.id}, maybe it was deleted!`);\r\n return false;\r\n }\r\n\r\n let items = [].concat(this.olderMessages, this.messages, this.newMessages);\r\n let index = items.findIndex(x => x.id === message.id);\r\n\r\n if (index < 0) {\r\n console.error(`Error while loading message in context: Message was not present in message list!`);\r\n return false;\r\n }\r\n\r\n let startIndex = Math.max(0, index - this.maxVisibleMessages / 2);\r\n this.newMessages = items.splice(0, startIndex);\r\n this.messages = items.splice(0, this.maxVisibleMessages);\r\n this.olderMessages = items;\r\n this.isViewingMore = true;\r\n }\r\n\r\n get shouldShowNewMessageIndicator() {\r\n return this.isViewingMore\r\n || this.customSortEnabled\r\n || this.sourceFilterMode !== FilterMode.ALL\r\n || this.heldMessages.length > 0;\r\n }\r\n\r\n get shouldHoldNewMessages() {\r\n if (this.customSortEnabled)\r\n return true;\r\n if (this.holdNewMessages || this.isViewingMore) {\r\n console.log(`holding due to settings`);\r\n return true;\r\n }\r\n\r\n if (this.enableHoldOnClick && this.messageClicked)\r\n return true;\r\n\r\n if (this.enableHoldOnScroll) {\r\n let keyMessage: ChatMessage;\r\n\r\n if (this.newestLast)\r\n keyMessage = this.messages[this.messages.length - 1];\r\n else\r\n keyMessage = this.messages[0];\r\n\r\n if (keyMessage) {\r\n const messageElement = this.getElementForComment(keyMessage.id);\r\n if (messageElement) {\r\n if (!this.isElementVisible(messageElement)) {\r\n console.log(`key element is not visible`);\r\n return true;\r\n } else {\r\n console.log(`key element is visible`);\r\n }\r\n } else {\r\n console.log(`could not find key element`);\r\n }\r\n } else {\r\n console.log(`could not find key message`);\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private isElementVisible(element: Element) {\r\n const elementRect = element.getBoundingClientRect();\r\n return !!elementRect\r\n && elementRect.bottom >= 0\r\n && elementRect.right >= 0\r\n && elementRect.left <= document.documentElement.clientWidth\r\n && elementRect.top <= document.documentElement.clientHeight;\r\n }\r\n\r\n /**\r\n * Get the CommentComponent instantiated for the given ChatMessage,\r\n * if it exists in the current view. Note that messages which are not\r\n * currently shown to the user will not return a CommentComponent.\r\n * @param message\r\n * @returns\r\n */\r\n getCommentComponentForMessage(message: ChatMessage) {\r\n if (!message)\r\n throw new Error(`You must pass a valid ChatMessage`);\r\n return this.comments.find(x => x.message?.id === message.id);\r\n }\r\n\r\n saveEdit(message: ChatMessage, newMessage: string) {\r\n this._messageEdited.next({ message, newMessage });\r\n }\r\n\r\n likeMessage(message: ChatMessage) {\r\n this._liked.next(message);\r\n }\r\n\r\n unlikeMessage(message: ChatMessage) {\r\n this._unliked.next(message);\r\n }\r\n\r\n pinMessage(message: ChatMessage, options: PinOptions) {\r\n this._pinned.next({ message, options });\r\n }\r\n\r\n unpinMessage(message: ChatMessage) {\r\n this._unpinned.next(message);\r\n }\r\n\r\n reportMessage(message: ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n selectMessage(message: ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectMessageUser(message: ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n }\r\n\r\n selectAvatar(user: User) {\r\n this._avatarSelected.next(user);\r\n }\r\n\r\n sharedMessage(message: ChatMessage) {\r\n this._shared.next(message);\r\n }\r\n\r\n startEditing(message: ChatMessage) {\r\n this.messages.forEach(m => m.transientState.editing = false);\r\n message.transientState.editing = true;\r\n }\r\n\r\n deleteMessage(message: ChatMessage) {\r\n this._deleted.next(message);\r\n }\r\n\r\n private setSource(value: ChatSourceBase) {\r\n this.customSortEnabled = (value?.sortOrder ?? CommentsOrder.NEWEST) !== CommentsOrder.NEWEST;\r\n this.newMessages = [];\r\n this.olderMessages = [];\r\n this.heldMessages = [];\r\n\r\n (window as any).bantaSourceDebug = value;\r\n\r\n if (this._sourceSubs) {\r\n this._sourceSubs.unsubscribe();\r\n this._sourceSubs = null;\r\n }\r\n this._source = value;\r\n\r\n if (value) {\r\n const messages = (value.messages || []).slice();\r\n this.messages = messages;\r\n this.olderMessages = messages.splice(this.maxVisibleMessages, messages.length);\r\n this.hasMore = true; //this.olderMessages.length > 0;\r\n\r\n this._sourceSubs = new Subscription();\r\n this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));\r\n this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));\r\n this._sourceSubs.add(this._source.messageUpdated.subscribe(msg => this.messageUpdated(msg)));\r\n\r\n this._sourceSubs.add(\r\n this.backend.userChanged.subscribe(user => this.currentUser = user)\r\n );\r\n\r\n this.getInitialMessages();\r\n }\r\n }\r\n\r\n private async getInitialMessages() {\r\n\r\n // Get the pinned messages\r\n let pinnedMessages = await this._source.getPinnedMessages();\r\n pinnedMessages.forEach(m => m.transientState ??= {});\r\n this.pinnedMessages = pinnedMessages;\r\n\r\n\r\n let messages = await this._source.getExistingMessages();\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = this.newestLast ? messages.slice().reverse() : messages;\r\n\r\n if (this.messages.length > this.maxVisibleMessages) {\r\n if (this.newestLast) {\r\n this.previousMessages.push(...this.messages.splice(0, this.messages.length - this.maxVisibleMessages));\r\n } else {\r\n this.nextMessages.unshift(...this.messages.splice(this.maxVisibleMessages, this.messages.length));\r\n }\r\n }\r\n\r\n this.debugMessages();\r\n this.sortMessages();\r\n if (this.markSourceLoaded)\r\n this.markSourceLoaded();\r\n }\r\n\r\n debugMessages() {\r\n if (!this.showDebug)\r\n return;\r\n\r\n // console.log([\r\n // ...this.previousMessages.map(x => x.message),\r\n // '[[',\r\n // ...this.messages.map(x => x.message),\r\n // ']]',\r\n // ...this.nextMessages.map(x => x.message)\r\n // ].map(x => /\\d+/.test(x) ? this.zeroPad(x, 2) : x).join(\" \"));\r\n }\r\n\r\n zeroPad(number: number | string, count: number = 2) {\r\n let str: string;\r\n\r\n if (typeof number === 'number')\r\n str = String(number);\r\n else\r\n str = number;\r\n\r\n while (str.length < count)\r\n str = '0' + str;\r\n\r\n return str;\r\n }\r\n leftPad(str: string, count: number = 2) {\r\n while (str.length < count)\r\n str = ' ' + str;\r\n\r\n return str;\r\n }\r\n\r\n messageIdentity(index: number, chatMessage: ChatMessage) {\r\n return chatMessage.id;\r\n }\r\n\r\n get sourceSortOrder() {\r\n return this.source?.sortOrder ?? CommentsOrder.NEWEST;\r\n }\r\n\r\n get sourceFilterMode() {\r\n return this.source?.filterMode ?? FilterMode.ALL;\r\n }\r\n\r\n /**\r\n * Show the newest content.\r\n * - If an unnatural sort order is active (ie Oldest or Likes), it will be changed to Newest.\r\n * - The new content will be placed where new content goes based on newestLast (replies mode), so if it is true, the content is\r\n * placed at the end, otherwise it is placed at the beginning.\r\n *\r\n * @param event\r\n * @returns\r\n */\r\n async showNewest(event: MouseEvent) {\r\n\r\n // Regardless of how we handle this, clear out our held messages\r\n\r\n this.heldMessages = [];\r\n this.messageClicked = false;\r\n\r\n // If the sort order is not already Newest, switch to Newest and stop.\r\n // The act of changing the sort order will cause the newest content to be loaded.\r\n\r\n let naturalOrder = CommentsOrder.NEWEST;\r\n if (this.sourceSortOrder !== naturalOrder || this.sourceFilterMode !== FilterMode.ALL) {\r\n if (this.sourceSortOrder !== naturalOrder)\r\n this._sortOrderChanged.next(naturalOrder);\r\n if (this.sourceFilterMode !== FilterMode.ALL)\r\n this._filterModeChanged.next(FilterMode.ALL);\r\n return;\r\n }\r\n\r\n // On this path, we are already on Newest, but there is newer content available (such as when new content is\r\n // being buffered due to user engagement on a comment)\r\n\r\n this.isViewingMore = false;\r\n\r\n // Move all newerMessages into messages, respecting the newestLast direction (normal or replies mode)\r\n\r\n if (this.newestLast)\r\n this.messages = this.messages.concat(this.newMessages.splice(0, this.newMessages.length));\r\n else\r\n this.messages = this.newMessages.splice(0, this.newMessages.length).concat(this.messages);\r\n\r\n let overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);\r\n this.olderMessages = overflow.concat(this.olderMessages);\r\n this.olderMessages.splice(this.maxMessages - this.maxVisibleMessages, this.olderMessages.length);\r\n this.hasMore = this.olderMessages.length > 0;\r\n\r\n // Scroll to the newest comment.\r\n\r\n if (this.messages.length > 0) {\r\n if (this.newestLast) {\r\n this.scrollToComment(this.messages[this.messages.length - 1].id);\r\n } else {\r\n this.scrollToComment(this.messages[0].id);\r\n }\r\n }\r\n }\r\n\r\n get showDebug() {\r\n if (typeof window === 'undefined')\r\n return false;\r\n\r\n return localStorage['banta:debug'] === '1';\r\n }\r\n\r\n get shouldShowNext() {\r\n if (!this.newestLast) {\r\n return this.hasMore || this.nextMessages.length > 0;\r\n }\r\n\r\n return this.nextMessages.length > 0;\r\n }\r\n\r\n get shouldShowPrevious() {\r\n if (this.newestLast) {\r\n return this.hasMore || this.previousMessages.length > 0;\r\n }\r\n\r\n return this.previousMessages.length > 0;\r\n }\r\n\r\n get pageSize() {\r\n return Math.min(20, this.maxVisibleMessages || 20);\r\n }\r\n\r\n async showPrevious() {\r\n this.isViewingMore = true;\r\n let nextPageSize = this.pageSize;\r\n this.isLoadingMore = false;\r\n\r\n if (isNaN(nextPageSize))\r\n throw new Error(`Not safe to load more with NaN page size`);\r\n\r\n if (this.previousMessages.length > 0) {\r\n const storedMessages = this.previousMessages.splice(Math.max(0, this.previousMessages.length - nextPageSize), nextPageSize);\r\n this.messages = [...storedMessages, ...this.messages];\r\n nextPageSize -= storedMessages.length;\r\n }\r\n\r\n\r\n // Load more from backend if needed\r\n // Note: Backend only supports fetching more content in one direction.\r\n\r\n let lastMessage = this.previousMessages[0] ?? this.messages[0];\r\n\r\n if (nextPageSize > 0 && this.newestLast && lastMessage) {\r\n this.isLoadingMore = true;\r\n\r\n let messages = await this.source.loadAfter(lastMessage, nextPageSize);\r\n\r\n messages = messages.slice().reverse(); // because newestLast === true\r\n messages.forEach(m => m.transientState ??= {});\r\n\r\n // In replies mode (newestLast), we want to put these new messages onto the *top* of the set of visible messages.\r\n // Otherwise we want to put them on the *bottom*.\r\n\r\n this.messages = [...messages, ...this.messages];\r\n\r\n // If we didn't receive any messages at all, there's no more to fetch.\r\n\r\n if (messages.length === 0)\r\n this.hasMore = false;\r\n\r\n this.isLoadingMore = false;\r\n }\r\n\r\n // Extract the messages that do not fit in the maxVisibleMessages buffer.\r\n\r\n if (this.messages.length > this.maxVisibleMessages) {\r\n let overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);\r\n this.nextMessages.unshift(...overflow);\r\n if (this.nextMessages.length > this.maxMessages)\r\n this.nextMessages.splice(this.maxMessages, this.nextMessages.length);\r\n }\r\n\r\n this.debugMessages();\r\n }\r\n\r\n get sortNextLabel() {\r\n if (this.sourceSortOrder === 'newest') {\r\n return 'Older';\r\n } else if (this.sourceSortOrder === 'oldest') {\r\n return 'Newer';\r\n } else if (this.sourceSortOrder === 'likes') {\r\n return 'Less Likes';\r\n }\r\n\r\n return 'More';\r\n }\r\n\r\n get sortPreviousLabel() {\r\n if (this.sourceSortOrder === 'newest') {\r\n return 'Newer';\r\n } else if (this.sourceSortOrder === 'oldest') {\r\n return 'Older';\r\n } else if (this.sourceSortOrder === 'likes') {\r\n return 'More Likes';\r\n }\r\n\r\n return 'More';\r\n }\r\n\r\n get nextLabel() { return this.newestLast ? this.sortPreviousLabel : this.sortNextLabel; }\r\n get previousLabel() { return this.newestLast ? this.sortNextLabel : this.sortPreviousLabel; }\r\n\r\n /**\r\n * Show more content\r\n * - When in replies mode (newestLast), the content is added at the top\r\n * - When in normal mode, the content is added at the bottom\r\n * - The current sort order does *not* factor in here, which is why it is showMore() not showEarlier().\r\n *\r\n * @returns\r\n */\r\n async showNext() {\r\n this.isViewingMore = true;\r\n\r\n let nextPageSize = this.pageSize;\r\n\r\n if (isNaN(nextPageSize))\r\n throw new Error(`Not safe to load more with NaN page size`);\r\n\r\n this.isLoadingMore = false;\r\n\r\n if (this.nextMessages.length > 0) {\r\n const storedMessages = this.nextMessages.splice(0, nextPageSize);\r\n this.messages = [ ...this.messages, ...storedMessages ];\r\n nextPageSize -= storedMessages.length;\r\n }\r\n\r\n const lastMessage = this.olderMessages[this.olderMessages.length - 1] ?? this.messages[this.messages.length - 1];\r\n\r\n if (nextPageSize > 0 && !this.newestLast && lastMessage) {\r\n // Load more from backend\r\n\r\n this.isLoadingMore = true;\r\n\r\n let messages = await this.source.loadAfter(lastMessage, nextPageSize);\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = [ ...this.messages, ...messages ];\r\n\r\n // If we didn't receive any messages at all, there's no more to fetch.\r\n\r\n if (messages.length === 0)\r\n this.hasMore = false;\r\n\r\n this.isLoadingMore = false;\r\n }\r\n\r\n // Extract the messages that do not fit in the maxVisibleMessages buffer.\r\n\r\n\r\n if (this.messages.length > this.maxVisibleMessages) {\r\n let overflow = this.messages.splice(0, this.messages.length - this.maxVisibleMessages);\r\n\r\n // Regardless of the order (newestLast), newMessages represents the direction that is being pushed, since it's definition\r\n // depends on that order. Move overflowing messages into newMessages.\r\n\r\n this.previousMessages.push(...overflow);\r\n if (this.previousMessages.length > this.maxMessages)\r\n this.previousMessages.splice(0, this.previousMessages.length - this.maxMessages);\r\n }\r\n\r\n this.debugMessages();\r\n }\r\n\r\n /**\r\n * Show more content\r\n * - When in replies mode (newestLast), the content is added at the top\r\n * - When in normal mode, the content is added at the bottom\r\n * - The current sort order does *not* factor in here, which is why it is showMore() not showEarlier().\r\n *\r\n * @returns\r\n */\r\n async showMore() {\r\n this.isViewingMore = true;\r\n\r\n let nextPageSize = this.pageSize;\r\n\r\n if (isNaN(nextPageSize))\r\n throw new Error(`Not safe to load more with NaN page size`);\r\n\r\n this.isLoadingMore = false;\r\n\r\n if (this.olderMessages.length > 0) {\r\n const storedMessages = this.olderMessages.splice(0, nextPageSize);\r\n this.messages = this.messages.concat(storedMessages);\r\n nextPageSize -= storedMessages.length;\r\n this.hasMore = this.olderMessages.length > 0;\r\n }\r\n\r\n let lastMessage: ChatMessage;\r\n\r\n if (this.newestLast) {\r\n lastMessage = this.olderMessages[0] ?? this.messages[0];\r\n } else {\r\n lastMessage = this.olderMessages[this.olderMessages.length - 1] ?? this.messages[this.messages.length - 1];\r\n }\r\n\r\n if (nextPageSize > 0 && lastMessage) {\r\n // Load more from backend\r\n\r\n this.isLoadingMore = true;\r\n\r\n\r\n if (!lastMessage) {\r\n this.isLoadingMore = false;\r\n this.hasMore = false;\r\n return;\r\n }\r\n\r\n let messages = await this.source.loadAfter(lastMessage, nextPageSize);\r\n\r\n if (this.newestLast)\r\n messages = messages.slice().reverse();\r\n\r\n messages.forEach(m => m.transientState ??= {});\r\n\r\n // In replies mode (newestLast), we want to put these new messages onto the *top* of the set of visible messages.\r\n // Otherwise we want to put them on the *bottom*.\r\n\r\n if (this.newestLast) {\r\n this.messages = messages.concat(this.messages);\r\n } else {\r\n this.messages = this.messages.concat(messages);\r\n }\r\n\r\n // If we didn't receive any messages at all, there's no more to fetch.\r\n\r\n if (messages.length === 0) {\r\n this.hasMore = false;\r\n }\r\n\r\n this.isLoadingMore = false;\r\n }\r\n\r\n // Extract the messages that do not fit in the maxVisibleMessages buffer.\r\n\r\n if (this.messages.length > this.maxVisibleMessages) {\r\n let overflow: ChatMessage[] = [];\r\n\r\n // Move overflowing messages into newMessages.\r\n // Regardless of the order (newestLast), newMessages represents the direction that is being loaded,\r\n // since it's definition depends on that order.\r\n\r\n if (this.newestLast) {\r\n overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);\r\n this.newMessages = overflow.concat(this.newMessages);\r\n this.newMessages.splice(this.maxMessages - this.maxVisibleMessages, this.newMessages.length);\r\n } else {\r\n overflow = this.messages.splice(0, this.messages.length - this.maxVisibleMessages);\r\n this.newMessages.push(...overflow);\r\n if (this.newMessages.length > this.maxMessages - this.maxVisibleMessages)\r\n this.newMessages.splice(0, this.newMessages.length - (this.maxMessages - this.maxVisibleMessages));\r\n }\r\n\r\n }\r\n }\r\n\r\n heldMessages: ChatMessage[] = [];\r\n\r\n private addMessage(message: ChatMessage) {\r\n\r\n if (!message.transientState)\r\n message.transientState ??= {};\r\n\r\n let destination = this.messages;\r\n let bucket = this.olderMessages;\r\n let newestLast = this.newestLast;\r\n\r\n if (this.shouldHoldNewMessages) {\r\n this.heldMessages.push(message);\r\n destination = this.newMessages;\r\n bucket = null;\r\n }\r\n\r\n // If we aren't on the newest sort order, new messages shouldn't be added at all\r\n if (this.sourceSortOrder !== CommentsOrder.NEWEST)\r\n return;\r\n\r\n\r\n if (newestLast) {\r\n destination.push(message);\r\n\r\n if (this.maxVisibleMessages > 0) {\r\n let overflow = destination.splice(this.maxVisibleMessages, destination.length);\r\n bucket?.push(...overflow);\r\n }\r\n } else {\r\n destination.unshift(message);\r\n\r\n if (this.maxVisibleMessages > 0) {\r\n let overflow = destination.splice(this.maxVisibleMessages, destination.length);\r\n bucket?.unshift(...overflow);\r\n }\r\n }\r\n\r\n if (bucket?.length > 0)\r\n this.hasMore = true;\r\n\r\n message.pagingCursor = String(this.incrementPagingCursors());\r\n this.sortMessages();\r\n }\r\n\r\n private incrementPagingCursors() {\r\n if (this.source.sortOrder !== CommentsOrder.NEWEST)\r\n return;\r\n\r\n let maxPagingCursor = 0;\r\n for (let group of [this.messages, this.olderMessages, this.newMessages]) {\r\n for (let message of group) {\r\n if (message.pagingCursor) {\r\n let pagingCursor = Number(message.pagingCursor) + 1;\r\n if (pagingCursor > maxPagingCursor)\r\n maxPagingCursor = pagingCursor;\r\n message.pagingCursor = String(pagingCursor);\r\n }\r\n }\r\n }\r\n\r\n return maxPagingCursor;\r\n }\r\n\r\n /**\r\n * Wait for all currently visible comments to be fully loaded, including all attachments.\r\n * Doing this will prevent layout shift when scrolling to a specific comment.\r\n */\r\n async waitForAllCommentsToLoad() {\r\n await new Promise(r => setTimeout(r, 100));\r\n await this.sourceLoaded;\r\n await Promise.all(this.comments.map(x => x.waitForLoad()));\r\n }\r\n\r\n private sortMessages() {\r\n if (!this.source)\r\n return;\r\n\r\n let sorter: (a: ChatMessage, b: ChatMessage) => number;\r\n\r\n if (this.source.sortOrder === CommentsOrder.LIKES)\r\n sorter = (a, b) => b.likes - a.likes;\r\n else if (this.source.sortOrder === CommentsOrder.NEWEST)\r\n sorter = (a, b) => (b.sentAt - a.sentAt) * (this.newestLast ? -1 : 1);\r\n else if (this.source.sortOrder === CommentsOrder.OLDEST)\r\n sorter = (a, b) => (a.sentAt - b.sentAt) * (this.newestLast ? -1 : 1);\r\n\r\n this.messages.sort(sorter);\r\n this.olderMessages.sort(sorter);\r\n this.newMessages.sort(sorter);\r\n }\r\n\r\n private messageReceived(message: ChatMessage) {\r\n this.addMessage(message);\r\n }\r\n\r\n isScrolledToLatest() {\r\n if (!this.messageContainer)\r\n return false;\r\n\r\n const el = this.messageContainer.nativeElement;\r\n const currentScroll = el.scrollTop;\r\n const currentTotal = el.scrollHeight - el.offsetHeight;\r\n\r\n return currentScroll > currentTotal - 10;\r\n }\r\n\r\n private messageSent(message: ChatMessage) {\r\n this.addMessage(message);\r\n\r\n if (!this.messageContainer)\r\n return;\r\n\r\n this.scrollToLatest();\r\n }\r\n\r\n private isPinned(message: ChatMessage) {\r\n return message.pinned && (!message.pinnedUntil || message.pinnedUntil > Date.now());\r\n }\r\n\r\n private messageUpdated(message: ChatMessage) {\r\n let pinned = this.isPinned(message);\r\n let inPins = this.pinnedMessages.some(x => x.id === message.id);\r\n\r\n if (pinned && !inPins) {\r\n this.pinnedMessages.unshift(message);\r\n let index = this.messages.indexOf(message);\r\n if (index >= 0) {\r\n this.messages.splice(index, 1);\r\n }\r\n } else if (!pinned && inPins) {\r\n this.messages.push(message);\r\n let index = this.pinnedMessages.indexOf(message);\r\n if (index >= 0) {\r\n this.pinnedMessages.splice(index, 1);\r\n }\r\n\r\n this.sortMessages();\r\n }\r\n }\r\n\r\n scrollToLatest() {\r\n if (!this.messageContainer) {\r\n return;\r\n }\r\n\r\n const el = this.messageContainer.nativeElement;\r\n\r\n el.scrollIntoView({ block: 'start' });\r\n //el.scrollTop = el.scrollHeight;\r\n }\r\n\r\n get element() {\r\n return this.elementRef.nativeElement;\r\n }\r\n\r\n async scrollToComment(commentId: ChatMessage['id']) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n await this.waitForAllCommentsToLoad();\r\n\r\n const comment = this.getElementForComment(commentId);\r\n if (comment) {\r\n comment.scrollIntoView({\r\n inline: 'center',\r\n block: 'center'\r\n });\r\n }\r\n }\r\n\r\n getElementForComment(commentId: string) {\r\n return this.element.querySelector(`[data-comment-id=\"${commentId}\"]`);\r\n }\r\n\r\n mentionsMe(message: ChatMessage) {\r\n if (!this.currentUser)\r\n return false;\r\n\r\n if (message.message.includes(`@${this.currentUser.username}`))\r\n return true;\r\n\r\n return false;\r\n }\r\n}\r\n","<div class=\"banta-message-container\" #messageContainer>\r\n <ng-content select=\"[data-before]\"></ng-content>\r\n\r\n @if (!collapsePins) {\r\n @for (message of pinnedMessages; track message.id) {\r\n @if (!message.hidden) {\r\n <banta-comment\r\n class=\"abbreviated\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [message]=\"message\"\r\n [mine]=\"currentUser?.id === message.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"allowReplies\"\r\n [editing]=\"message.transientState.editing\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (click)=\"messageClicked = true\"\r\n (editStarted)=\"startEditing(message)\"\r\n (deleted)=\"deleteMessage(message)\"\r\n (editEnded)=\"message.transientState.editing = false\"\r\n (edited)=\"saveEdit(message, $event)\"\r\n (userSelected)=\"selectMessageUser(message)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(message)\"\r\n (pinned)=\"pinMessage(message, $event.options)\"\r\n (unpinned)=\"unpinMessage(message)\"\r\n (unliked)=\"unlikeMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (selected)=\"selectMessage(message)\"\r\n (shared)=\"sharedMessage($event)\"\r\n />\r\n @if (selectedMessage === message) {\r\n <div class=\"banta-inline-replies-container\">\r\n <ng-container *ngTemplateOutlet=\"inlineRepliesTemplate\" />\r\n </div>\r\n }\r\n }\r\n }\r\n }\r\n\r\n <div class=\"banta-top-sticky\">\r\n @if (!newestLast) {\r\n <button\r\n mat-button\r\n class=\"banta-nav\"\r\n [class.visible]=\"shouldShowNewMessageIndicator\"\r\n href=\"javascript:;\"\r\n (click)=\"showNewest($event)\"\r\n >\r\n <mat-icon>file_upload</mat-icon>\r\n Newest\r\n @if (heldMessages.length > 0) {\r\n <span class=\"count\">{{ heldMessages.length | number }}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n <button mat-button class=\"pager\" (click)=\"showPrevious()\" [class.visible]=\"shouldShowPrevious\" [disabled]=\"isLoadingMore\">\r\n <mat-icon>expand_less</mat-icon>\r\n {{ previousLabel }}\r\n </button>\r\n\r\n @for (message of messages; track message.id) {\r\n @if (!message.hidden) {\r\n <banta-comment\r\n class=\"abbreviated\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [message]=\"message\"\r\n [mine]=\"currentUser?.id === message.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"allowReplies\"\r\n [editing]=\"message.transientState.editing\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (click)=\"messageClicked = true\"\r\n (editStarted)=\"startEditing(message)\"\r\n (deleted)=\"deleteMessage(message)\"\r\n (editEnded)=\"message.transientState.editing = false\"\r\n (edited)=\"saveEdit(message, $event)\"\r\n (userSelected)=\"selectMessageUser(message)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(message)\"\r\n (pinned)=\"pinMessage(message, $event.options)\"\r\n (unpinned)=\"unpinMessage(message)\"\r\n (unliked)=\"unlikeMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (selected)=\"selectMessage(message)\"\r\n (shared)=\"sharedMessage($event)\"\r\n />\r\n @if (selectedMessage === message) {\r\n <div class=\"banta-inline-replies-container\">\r\n <ng-container *ngTemplateOutlet=\"inlineRepliesTemplate\" />\r\n </div>\r\n }\r\n }\r\n } @empty {\r\n @if (showEmptyState) {\r\n <div class=\"banta-empty-state\">\r\n {{ emptyStateMessage }}\r\n </div>\r\n }\r\n }\r\n\r\n <button mat-button class=\"pager\" (click)=\"showNext()\" [class.visible]=\"shouldShowNext\" [disabled]=\"isLoadingMore\">\r\n <mat-icon>expand_more</mat-icon>\r\n {{ nextLabel }}\r\n </button>\r\n\r\n <div class=\"banta-nav-point banta-bottom-sticky\">\r\n @if (newestLast) {\r\n <button\r\n [matBadge]=\"10\" matBadgeOverlap=\"false\"\r\n matBadgePosition=\"after\" matBadgeSize=\"large\"\r\n mat-button\r\n class=\"banta-nav\"\r\n [class.visible]=\"shouldShowNewMessageIndicator\"\r\n href=\"javascript:;\"\r\n (click)=\"showNewest($event)\"\r\n >\r\n <mat-icon>file_download</mat-icon>\r\n Newest\r\n @if (heldMessages.length > 0) {\r\n <span class=\"count\">{{ heldMessages.length | number }}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (isLoadingMore) {\r\n <div class=\"banta-loading-more\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n }\r\n\r\n @if (showDebug) {\r\n <div style=\"color: #666\">\r\n ({{ previousMessages.length }} .. {{ messages.length }} .. {{ nextMessages.length }})\r\n\r\n dir={{newestLast ? '-1' : '1'}}\r\n v={{maxVisibleMessages}}, M={{maxMessages}}\r\n </div>\r\n }\r\n\r\n <ng-content select=\":not([data-before]):not(.inline-replies)\"></ng-content>\r\n </div>\r\n","import { Directive } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: `[bantaReplySendOptions]`,\r\n standalone: false\r\n})\r\nexport class BantaReplySendOptionsDirective {}","import { Component, ElementRef, Input, Output, ViewChild } from '@angular/core';\r\nimport { CDNProvider, ChatMessageAttachment } from '@banta/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-attachment-button',\r\n templateUrl: './attachment-button.component.html',\r\n styleUrls: ['./attachment-button.component.scss'],\r\n standalone: false\r\n})\r\nexport class AttachmentButtonComponent {\r\n constructor(\r\n private cdnProvider: CDNProvider,\r\n ) {\r\n }\r\n\r\n //#region Properties\r\n\r\n private _addedAttachment = new Subject<ChatMessageAttachment>();\r\n private _attachmentError = new Subject<ChatMessageAttachment>();\r\n\r\n //#endregion\r\n //#region Inputs\r\n\r\n @Input() disabled = false;\r\n\r\n //#endregion\r\n //#region Outputs\r\n\r\n @Output() get addedAttachment() { return this._addedAttachment.asObservable(); }\r\n @Output() get attachmentError() { return this._attachmentError.asObservable(); }\r\n\r\n //#endregion\r\n //#region UI Bindings\r\n\r\n @ViewChild('fileUpload', { static: false }) fileInput: ElementRef<HTMLInputElement>;\r\n\r\n //#endregion\r\n\r\n show() { this.fileInput.nativeElement.click(); }\r\n\r\n async fileChange(event: Event): Promise<void> {\r\n const element = (event.currentTarget as HTMLInputElement);\r\n if (element.files.length) {\r\n const file = element.files[0];\r\n let publicURL: string;\r\n\r\n let attachment: ChatMessageAttachment = {\r\n type: file.type,\r\n url: undefined,\r\n transientState: {\r\n uploading: true,\r\n error: false,\r\n errorMessage: undefined\r\n }\r\n }\r\n\r\n this._addedAttachment.next(attachment);\r\n\r\n try {\r\n publicURL = await this.cdnProvider.uploadImage(file);\r\n } catch (e) {\r\n attachment.transientState.error = true;\r\n attachment.transientState.errorMessage = \"Failed to upload\";\r\n\r\n console.error(`[Banta] Caught an error while uploading image to CDN:`);\r\n console.error(e);\r\n alert(e.message);\r\n\r\n this._attachmentError.next(attachment);\r\n return;\r\n }\r\n\r\n // If no URL was returned, then an error must have occurred. Presumably the CDN\r\n // provider has conveyed an error to the user.\r\n if (!publicURL)\r\n return;\r\n\r\n attachment.url = publicURL;\r\n attachment.transientState = undefined;\r\n }\r\n }\r\n}","<button matTooltip=\"Add an image or gif\" #button type=\"button\" mat-icon-button (click)=\"show()\" [disabled]=\"disabled\">\r\n\t<mat-icon>image</mat-icon>\r\n</button>\r\n<input style=\"display: none;\" #fileUpload [multiple]=\"false\" (change)=\"fileChange($event)\" type=\"file\" >","import { Directive, ElementRef, Input, Output } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\nimport { AttachmentFragment } from \"../attachment-scraper\";\r\nimport { ChatBackendBase } from \"../chat-backend-base\";\r\n\r\ninterface AttachmentFragmentState {\r\n fragment: AttachmentFragment;\r\n resolution: Promise<ChatMessageAttachment>;\r\n}\r\n\r\n@Directive({\r\n selector: '[attachmentScraper]',\r\n standalone: false\r\n})\r\nexport class AttachmentScraperDirective {\r\n constructor(\r\n private elementRef: ElementRef<HTMLTextAreaElement>,\r\n private chatBackend: ChatBackendBase\r\n ) {\r\n }\r\n\r\n @Input() attachments: ChatMessageAttachment[] = [];\r\n @Output() attachmentsChange = new Subject<ChatMessageAttachment[]>();\r\n ngOnInit() {\r\n if (typeof window === 'undefined')\r\n return;\r\n \r\n this.element.addEventListener('keydown', () => {\r\n clearTimeout(this.scrapeTimeout);\r\n this.scrapeTimeout = setTimeout(() => this.scrape(), this.scrapeDebounce);\r\n });\r\n }\r\n\r\n get element() {\r\n return this.elementRef?.nativeElement;\r\n }\r\n\r\n get text() {\r\n return this.element.value;\r\n }\r\n\r\n\r\n private scrapeTimeout;\r\n private scrapeDebounce = 1500;\r\n private fragments = new Map<string, AttachmentFragmentState>();\r\n private scrape() {\r\n let message: ChatMessage = {\r\n likes: 0,\r\n message: this.text,\r\n sentAt: undefined,\r\n user: null,\r\n attachments: this.attachments\r\n };\r\n\r\n let foundFragments: string[] = [];\r\n\r\n for (let scraper of this.chatBackend.attachmentScrapers) {\r\n let fragments = scraper.findFragments(message);\r\n if (!fragments) {\r\n console.error(`Attachment fragment scraper ${scraper.constructor.name} is implemented incorrectly: Returned null instead of array`);\r\n continue;\r\n }\r\n for (let fragment of fragments) {\r\n foundFragments.push(fragment.text);\r\n if (!this.fragments.has(fragment.text)) {\r\n this.fragments.set(fragment.text, {\r\n fragment,\r\n resolution: undefined\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Remove fragments that are no longer in the message.\r\n let removedFragments: string[] = [];\r\n for (let [key] of this.fragments) {\r\n if (!foundFragments.includes(key))\r\n removedFragments.push(key);\r\n }\r\n for (let removedFragment of removedFragments) {\r\n this.fragments.delete(removedFragment);\r\n }\r\n\r\n // Process any fragments that are not yet resolved (or being \r\n // resolved)\r\n\r\n for (let [key, state] of this.fragments) {\r\n if (state.resolution)\r\n continue;\r\n\r\n state.resolution = new Promise(async (resolve, reject) => {\r\n for (let resolver of this.chatBackend.attachmentResolvers) {\r\n try {\r\n let attachment = await resolver.resolveFragment(message, state.fragment);\r\n if (attachment) {\r\n console.dir(attachment);\r\n this.attachments.push(attachment);\r\n this.attachmentsChange.next(this.attachments.slice());\r\n resolve(attachment);\r\n break;\r\n }\r\n } catch (e) {\r\n console.error(`Caught error during attachment resolver ${resolver.constructor.name}:`);\r\n console.error(e);\r\n continue;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n}","import { Component, ElementRef, HostBinding, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment, User } from \"@banta/common\";\r\nimport { Subject, Subscription } from \"rxjs\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\nimport { AttachmentFragment } from \"../../attachment-scraper\";\r\nimport { EMOJI } from \"@astronautlabs/emoji\";\r\nimport { SignInState } from \"../../chat-source\";\r\n\r\nconst ALL_EMOJI_WITH_SHORTCUTS = EMOJI.categories.flatMap(c => c.items).filter(x => x.shortcut);\r\n\r\nexport interface AutoCompleteOption {\r\n label : string;\r\n action? : () => void;\r\n}\r\n\r\nexport interface HashTag {\r\n hashtag : string;\r\n description : string;\r\n}\r\n\r\ninterface AttachmentFragmentState {\r\n fragment: AttachmentFragment;\r\n resolution: Promise<ChatMessageAttachment>;\r\n}\r\n\r\n@Component({\r\n selector: 'banta-comment-field',\r\n templateUrl: './comment-field.component.html',\r\n styleUrls: ['./comment-field.component.scss'],\r\n standalone: false\r\n})\r\nexport class CommentFieldComponent {\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n let root = document.body.querySelector('[ng-version]') || document.body;\r\n root.appendChild(this.autocompleteEl.nativeElement);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.autocompleteEl.nativeElement.remove();\r\n }\r\n\r\n //#region Source\r\n\r\n private _source : ChatSourceBase;\r\n @Input() get source() : ChatSourceBase { return this._source; }\r\n set source(value) { this.setSource(value); }\r\n\r\n //#endregion\r\n //#region Properties\r\n\r\n private _permissionDeniedError = new Subject<string>();\r\n private errorTimeout;\r\n private _subs = new Subscription();\r\n\r\n sending = false;\r\n sendError : Error;\r\n expandError = false;\r\n autocompleteVisible = false;\r\n autocompleteOptions : AutoCompleteOption[] = [];\r\n completionFunc : (str : string) => AutoCompleteOption[];\r\n completionPrefix : string;\r\n autoCompleteSelected : number = 0;\r\n text: string = '';\r\n chatMessageAttachments: ChatMessageAttachment[] = [];\r\n\r\n //#endregion\r\n //#region Inputs\r\n\r\n @Input() user : User;\r\n @Input() @HostBinding('class.can-comment') canComment = true;\r\n @Input() signInState: SignInState;\r\n @Input() allowAttachments = false;\r\n @Input() transientMessage: string;\r\n @Input() sendLabel = 'Send';\r\n @Input() signingInLabel = 'Signing in...';\r\n @Input() sendingLabel = 'Sending';\r\n @Input() label = 'Post a comment';\r\n @Input() permissionDeniedLabel = 'Unavailable';\r\n @Input() signInLabel = 'Sign In';\r\n @Input() maxLength = 1500;\r\n @Input() placeholder = '';\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n @Input() hashtags : HashTag[];\r\n @Input() participants : User[] = [];\r\n @Input() genericAvatarUrl: string;\r\n @Input() url: string;\r\n @Input() submit: (message: ChatMessage) => void;\r\n @Input() readonly = false;\r\n @Input() allowServerInfoRequest = false;\r\n //#endregion\r\n //#region Outputs\r\n\r\n @Output() signInSelected = new Subject<void>();\r\n @Output() editAvatarSelected = new Subject<void>();\r\n @Output() focusChange = new Subject<boolean>();\r\n @Output() textChanged = new Subject<void>();\r\n @Output() serverInfoRequested = new Subject<void>();\r\n @Output() reconnectRequested = new Subject<void>();\r\n @Output() get permissionDeniedError() { return this._permissionDeniedError; }\r\n\r\n //#endregion\r\n //#region UI Bindings\r\n\r\n @ViewChild('autocomplete') autocompleteEl : ElementRef<HTMLElement>;\r\n @ViewChild('autocompleteContainer') autocompleteContainerEl : ElementRef<HTMLElement>;\r\n @ViewChild('textarea') textareaEl : ElementRef<HTMLTextAreaElement>;\r\n\r\n get indicatorState() {\r\n if (this.transientMessage) {\r\n return 'transient';\r\n } else if (this.sending) {\r\n return 'sending';\r\n } else if (this.sendError) {\r\n return 'error';\r\n } else {\r\n return 'none';\r\n }\r\n }\r\n\r\n get buttonState() {\r\n if (this.sending)\r\n return 'sending';\r\n else if (this.signInState === 'signing-in')\r\n return 'signing-in';\r\n else if (!this.canComment)\r\n return 'permission-denied';\r\n else\r\n return 'send';\r\n }\r\n\r\n get sendButtonEnabled() {\r\n if (this.readonly)\r\n return false;\r\n\r\n if (this.signInState === 'signing-in')\r\n return false;\r\n\r\n if (!['connected', 'restored'].includes(this.source?.state ?? 'connected'))\r\n return false;\r\n\r\n if (!this.canComment) {\r\n // In this case, we want to enable the button because we want to be able to\r\n // send the permissionDenied message up to the host.\r\n return true;\r\n }\r\n\r\n return this.isValidMessage\r\n && !this.hasPendingAttachments\r\n && !this.sending\r\n ;\r\n }\r\n\r\n get userAvatarUrl() { return this.user?.avatarUrl || this.genericAvatarUrl; }\r\n get isValidMessage() { return (this.text || this.chatMessageAttachments.length > 0); }\r\n get hasPendingAttachments() { return this.chatMessageAttachments.some(x => x.transientState); }\r\n\r\n //#endregion\r\n //#region Private Component API\r\n\r\n private setSource(value: ChatSourceBase) {\r\n if (this._source) {\r\n this._subs?.unsubscribe();\r\n this._source = null;\r\n }\r\n\r\n this._source = value;\r\n this._subs = new Subscription();\r\n if (this._source) {\r\n setTimeout(() => {\r\n if (this._source.connectionStateChanged) {\r\n this._subs.add(this._source.connectionStateChanged.subscribe(state => {\r\n if (state === 'lost') {\r\n if (this._source.errorState === 'server-issue')\r\n this.transientMessage = `Reconnecting..`;\r\n else\r\n this.transientMessage = `Reconnecting...`;\r\n } else if (state === 'restored') {\r\n this.transientMessage = undefined;\r\n } else if (state === 'connecting') {\r\n this.transientMessage = `Connecting...`;\r\n }\r\n }));\r\n }\r\n });\r\n }\r\n }\r\n\r\n //#endregion\r\n //#region Actions\r\n\r\n sendPermissionDenied(message: string) { this._permissionDeniedError.next(message); }\r\n activateAutoComplete(option : AutoCompleteOption) { option.action(); this.dismissAutoComplete(); }\r\n onFocus() { this.focusChange.next(true); }\r\n onBlur() { this.focusChange.next(false); setTimeout(() => this.dismissAutoComplete(), 250); }\r\n showSignIn() { this.signInSelected.next(); }\r\n showEditAvatar() { this.editAvatarSelected.next(); }\r\n insertEmoji(text : string) { this.text += text; }\r\n\r\n showAutoComplete(options : AutoCompleteOption[]) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n this.autoCompleteSelected = 0;\r\n this.autocompleteOptions = options;\r\n let pos = this.autocompleteContainerEl.nativeElement.getBoundingClientRect();\r\n let size = this.autocompleteEl.nativeElement.getBoundingClientRect();\r\n\r\n this.autocompleteEl.nativeElement.style.left = `${window.scrollX + pos.left}px`;\r\n this.autocompleteEl.nativeElement.style.top = `${window.scrollY + pos.top}px`;\r\n this.autocompleteEl.nativeElement.style.width = `${pos.width}px`;\r\n this.autocompleteVisible = true;\r\n }\r\n\r\n dismissAutoComplete() {\r\n this.autocompleteVisible = false;\r\n this.completionFunc = null;\r\n this.completionPrefix = '';\r\n }\r\n\r\n indicateError(message : string) {\r\n this.sendError = new Error(message);\r\n this.expandError = false;\r\n clearTimeout(this.errorTimeout);\r\n this.errorTimeout = setTimeout(() => {\r\n this.expandError = true;\r\n this.errorTimeout = setTimeout(() => {\r\n this.expandError = false;\r\n }, 5*1000);\r\n }, 100);\r\n\r\n // On mobile, just show an alert dialog\r\n if (typeof window !== 'undefined' && window.innerWidth < 430)\r\n alert(message);\r\n }\r\n\r\n async autocomplete(replacement : string) {\r\n let el = this.textareaEl.nativeElement;\r\n this.text = this.text.slice(0, el.selectionStart - this.completionPrefix.length) + replacement + this.text.slice(el.selectionStart);\r\n }\r\n\r\n async insert(str : string) {\r\n let el = this.textareaEl.nativeElement;\r\n this.text = this.text.slice(0, el.selectionStart) + str + this.text.slice(el.selectionStart);\r\n }\r\n\r\n async onKeyDown(event : KeyboardEvent) {\r\n if (this.autocompleteVisible) {\r\n if (event.key === 'Escape') {\r\n this.dismissAutoComplete();\r\n return;\r\n }\r\n\r\n if (event.key === 'Shift') {\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter') {\r\n if (this.autocompleteOptions[this.autoCompleteSelected]) {\r\n this.activateAutoComplete(this.autocompleteOptions[this.autoCompleteSelected]);\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n if (this.autoCompleteSelected === 0)\r\n this.autoCompleteSelected = this.autocompleteOptions.length - 1;\r\n else\r\n this.autoCompleteSelected = this.autoCompleteSelected - 1;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n } else if (event.key === 'ArrowDown') {\r\n this.autoCompleteSelected = (this.autoCompleteSelected + 1) % this.autocompleteOptions.length;\r\n event.stopPropagation();\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === ' ' || event.key === 'Enter') {\r\n let textarea = this.textareaEl.nativeElement;\r\n let cursorPos = textarea.selectionStart;\r\n let substr = this.text.slice(0, cursorPos);\r\n let following = this.text.slice(cursorPos);\r\n let match = /(:-\\)|:-\\(|:-S|:-\\/|:-\\\\)$/.exec(substr);\r\n console.log(`checking in '${substr}|${following}'`);\r\n\r\n if (event.key === ' ')\r\n following = ` ${following}`;\r\n\r\n if (match) {\r\n console.log('found emoticon');\r\n let emoticonStr = match[1];\r\n let emoticons = {\r\n ':-)': '🙂',\r\n ':-(': '🙁',\r\n ':-S': '😖',\r\n ':-/': '🫤',\r\n ':-\\\\': '🫤'\r\n }\r\n let emoji = emoticons[emoticonStr];\r\n if (emoji) {\r\n textarea.value = substr.slice(0, -match[0].length) + emoji + following;\r\n this.text = textarea.value;\r\n textarea.selectionStart = (substr.length - match[0].length) + emoji.length;\r\n if (event.key === ' ')\r\n textarea.selectionStart += 1;\r\n textarea.selectionEnd = textarea.selectionStart;\r\n } else {\r\n console.log(`no emoji for ${emoticonStr}`);\r\n }\r\n\r\n\r\n if (event.key !== 'Enter') {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n }\r\n\r\n if (event.key === 'Enter' && event.ctrlKey) {\r\n await this.sendMessage();\r\n return;\r\n }\r\n }\r\n\r\n if (this.completionFunc) {\r\n console.log('completionfunc');\r\n if (event.key === 'Backspace') {\r\n this.completionPrefix = this.completionPrefix.slice(0, this.completionPrefix.length - 1);\r\n\r\n if (this.completionPrefix === '') {\r\n this.dismissAutoComplete();\r\n return;\r\n }\r\n } else if (event.key === ' ' || event.key.length > 1) {\r\n this.dismissAutoComplete();\r\n return;\r\n } else {\r\n this.completionPrefix += event.key;\r\n }\r\n\r\n this.showAutoComplete(this.completionFunc(this.completionPrefix));\r\n } else {\r\n if (event.key === ':') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n\r\n // TODO\r\n // makes :-), :-( etc work (as they are \":)\" etc in the db)\r\n if (prefix.startsWith('-'))\r\n prefix = prefix.slice(1);\r\n\r\n return ALL_EMOJI_WITH_SHORTCUTS\r\n .filter(emoji => emoji.shortcut.includes(prefix) || emoji.keywords.some(kw => kw.includes(prefix)))\r\n .map(emoji => ({\r\n label: `${emoji.string} ${emoji.shortcut}`,\r\n action: () => this.autocomplete(emoji.string)\r\n }))\r\n .slice(0, 5)\r\n ;\r\n });\r\n } else if (event.key === '@') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n return this.participants.filter(x => x.username.includes(prefix))\r\n .map(p => ({\r\n label: `@${p.username} -- ${p.displayName}`,\r\n action: () => this.autocomplete(`@${p.username}`)\r\n }))\r\n ;\r\n });\r\n } else if (event.key === '#') {\r\n this.startAutoComplete(event, prefix => {\r\n prefix = prefix.slice(1);\r\n\r\n return this.hashtags\r\n .filter(ht => ht.hashtag.includes(prefix))\r\n .map(ht => ({\r\n label: `#${ht.hashtag}${ht.description ? ` -- ${ht.description}` : ``}`,\r\n action: () => this.autocomplete(`#${ht.hashtag}`)\r\n }))\r\n .slice(0, 5)\r\n ;\r\n });\r\n }\r\n }\r\n }\r\n\r\n startAutoComplete(event : KeyboardEvent, completionFunc : (str : string) => AutoCompleteOption[]) {\r\n this.completionPrefix = event.key;\r\n this.completionFunc = completionFunc;\r\n this.showAutoComplete(this.completionFunc(this.completionPrefix));\r\n }\r\n\r\n async sendMessage() {\r\n if (!this.source)\r\n return;\r\n\r\n this.sending = true;\r\n this.sendError = null;\r\n try {\r\n let text = (this.text || '').trim();\r\n\r\n if (this.canComment && !this.isValidMessage)\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: this.user,\r\n sentAt: Date.now(),\r\n url: this.url ?? (typeof window !== 'undefined' ? location.href : undefined),\r\n likes: 0,\r\n message: text,\r\n attachments: this.chatMessageAttachments.filter(x => x.url)\r\n };\r\n\r\n try {\r\n await this.submit(message);\r\n this.text = '';\r\n this.chatMessageAttachments = [];\r\n } catch (e) {\r\n console.error(`[Banta/CommentField] sendMessage() failed: ${e.message}`);\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 1000));\r\n this.indicateError(e.message);\r\n }\r\n\r\n } finally {\r\n this.sending = false;\r\n setTimeout(() => {\r\n this.textareaEl.nativeElement.focus();\r\n }, 100);\r\n }\r\n }\r\n\r\n addedAttachment(attachment: ChatMessageAttachment) { this.chatMessageAttachments.push(attachment); }\r\n\r\n attachmentError(attachment: ChatMessageAttachment) {\r\n setTimeout(() => {\r\n this.chatMessageAttachments = this.chatMessageAttachments.filter(x => x !== attachment);\r\n }, 3000);\r\n }\r\n\r\n\tremoveAttachment(attachment: ChatMessageAttachment) {\r\n let index = this.chatMessageAttachments.indexOf(attachment);\r\n if (index >= 0)\r\n\t\t this.chatMessageAttachments.splice(index, 1);\r\n\t}\r\n\r\n alertError() {\r\n if (!this.sendError)\r\n return;\r\n alert(this.sendError.message);\r\n }\r\n}\r\n","<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n <div class=\"banta-avatar-container\">\r\n <a href=\"javascript:;\"\r\n class=\"banta-avatar\"\r\n (click)=\"showEditAvatar()\"\r\n [style.background-image]=\"'url(' + userAvatarUrl + ')'\"\r\n ></a>\r\n </div>\r\n <div class=\"banta-text-container\">\r\n <div class=\"banta-field-container\">\r\n <div class=\"banta-field-row\">\r\n <mat-form-field class=\"message-field\" appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name=\"message\"\r\n attachmentScraper\r\n [(attachments)]=\"chatMessageAttachments\"\r\n [placeholder]=\"placeholder\"\r\n matInput\r\n cdkTextareaAutosize\r\n [maxlength]=\"maxLength\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n [disabled]=\"sending || readonly\"\r\n [(ngModel)]=\"text\"\r\n autocomplete=\"off\"\r\n ></textarea>\r\n </mat-form-field>\r\n <div class=\"banta-options-line\">\r\n @if (indicatorState === 'transient') {\r\n <div class=\"transient-message\" [class.expanded]=\"true\" [matTooltip]=\"transientMessage\" (click)=\"alertError()\">\r\n <mat-spinner [diameter]=\"15\"></mat-spinner>\r\n {{transientMessage}}\r\n </div>\r\n }\r\n @if (indicatorState === 'sending') {\r\n <div class=\"banta-transient-message\" [class.expanded]=\"true\" (click)=\"alertError()\">\r\n <mat-spinner [diameter]=\"15\"></mat-spinner>\r\n {{sendingLabel}}...\r\n </div>\r\n }\r\n @if (indicatorState === 'error') {\r\n <div class=\"banta-error-message\" [class.expanded]=\"expandError\" [matTooltip]=\"sendError.message\" (click)=\"alertError()\">\r\n @if (sendError) {\r\n <mat-icon>error</mat-icon>\r\n }\r\n {{sendError.message}}\r\n </div>\r\n }\r\n\r\n\r\n <div class=\"spacer\"></div>\r\n <div class=\"custom\">\r\n <ng-content></ng-content>\r\n </div>\r\n @if (allowAttachments) {\r\n <banta-attachment-button\r\n [disabled]=\"readonly\"\r\n (addedAttachment)=\"addedAttachment($event)\"\r\n (attachmentError)=\"attachmentError($event)\"\r\n ></banta-attachment-button>\r\n }\r\n <emoji-selector-button [disabled]=\"readonly\" (selected)=\"insertEmoji($event)\"></emoji-selector-button>\r\n <mat-menu #overflowMenu>\r\n <button mat-menu-item (click)=\"reconnectRequested.next()\">\r\n <mat-icon>refresh</mat-icon>\r\n Reconnect\r\n </button>\r\n @if (allowServerInfoRequest) {\r\n <button mat-menu-item (click)=\"serverInfoRequested.next()\">\r\n <mat-icon>code</mat-icon>\r\n Server Information\r\n </button>\r\n }\r\n </mat-menu>\r\n <button mat-icon-button [mat-menu-trigger-for]=\"overflowMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n <div #autocompleteContainer class=\"autocomplete-container\">\r\n <div #autocomplete class=\"autocomplete\" [class.visible]=\"autocompleteVisible\">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n @for (option of autocompleteOptions; track option; let index = $index) {\r\n <a\r\n mat-button\r\n (click)=\"activateAutoComplete(option)\"\r\n [class.active]=\"autoCompleteSelected === index\"\r\n >\r\n {{option.label}}\r\n </a>\r\n }\r\n </div>\r\n </div>\r\n\r\n <banta-attachments\r\n [attachments]=\"chatMessageAttachments\"\r\n [editing]=\"true\"\r\n (remove)=\"removeAttachment($event)\"\r\n ></banta-attachments>\r\n </div>\r\n </div>\r\n <div class=\"banta-actions\">\r\n @if (!user) {\r\n <button\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"showSignIn()\"\r\n >{{signInLabel}}</button>\r\n }\r\n @if (user) {\r\n @if (buttonState === 'send') {\r\n <button\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!sendButtonEnabled\"\r\n >\r\n <mat-icon>chevron_right</mat-icon>\r\n <span class=\"label\">{{sendLabel}}</span>\r\n </button>\r\n }\r\n @if (buttonState === 'sending' || buttonState === 'signing-in') {\r\n <button\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!sendButtonEnabled\"\r\n >\r\n <mat-spinner class=\"icon\" diameter=\"18\" strokeWidth=\"2\"></mat-spinner>\r\n <span class=\"label\">\r\n @if (buttonState === 'sending') {\r\n {{sendingLabel}}\r\n }\r\n @if (buttonState === 'signing-in') {\r\n {{signingInLabel}}\r\n }\r\n </span>\r\n </button>\r\n }\r\n @if (buttonState === 'permission-denied') {\r\n <button\r\n mat-raised-button\r\n class=\"send\"\r\n color=\"primary\"\r\n [disabled]=\"!sendButtonEnabled\"\r\n >\r\n {{permissionDeniedLabel}}\r\n </button>\r\n }\r\n }\r\n </div>\r\n</form>\r\n","/// <reference types=\"@types/resize-observer-browser\" />\r\n\r\nimport { Component, ContentChild, ElementRef, HostBinding, Input, NgZone, Output, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';\r\nimport { User, ChatMessage, CommentsOrder, FilterMode, ServerInfo } from '@banta/common';\r\nimport { HashTag } from '../comment-field/comment-field.component';\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { ChatBackendBase } from '../../chat-backend-base';\r\nimport { ChatSourceBase } from '../../chat-source-base';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { BantaReplySendOptionsDirective } from '../reply-send-options.directive';\r\nimport { MessageMenuItem } from '../../message-menu-item';\r\nimport { CommentViewComponent } from '../comment-view/comment-view.component';\r\nimport { CommentComponent } from '../comment/comment.component';\r\nimport { PinOptions } from '../../chat-source';\r\n\r\n/**\r\n * Comments component\r\n */\r\n@Component({\r\n selector: 'banta-comments',\r\n templateUrl: './banta-comments.component.html',\r\n styleUrls: ['./banta-comments.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaCommentsComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef: ElementRef<HTMLElement>,\r\n private activatedRoute: ActivatedRoute,\r\n private matSnackBar: MatSnackBar,\r\n private ngZone: NgZone\r\n ) {\r\n this.sendMessage = async (message: ChatMessage) => {\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.source);\r\n if (!intercept) {\r\n await this.source.send(message);\r\n }\r\n\r\n if (this.source.sortOrder !== CommentsOrder.NEWEST)\r\n this.sortOrder = CommentsOrder.NEWEST;\r\n\r\n if (this.source.filterMode !== FilterMode.ALL)\r\n this.filterMode = FilterMode.ALL;\r\n\r\n return true;\r\n } catch (e) {\r\n this.handleBackendException(e, 'Could not send: ');\r\n }\r\n }\r\n\r\n this.sendReply = async (message: ChatMessage) => {\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.selectedMessageThread);\r\n if (!intercept) {\r\n await this.selectedMessageThread.send(message);\r\n }\r\n return true;\r\n } catch (e) {\r\n this.handleBackendException(e, 'Could not send reply: ');\r\n }\r\n }\r\n }\r\n\r\n get element() {\r\n return this.elementRef.nativeElement;\r\n }\r\n\r\n private handleBackendExceptionAsAlert(e: Error, prefix: string = '') {\r\n try {\r\n this.handleBackendException(e, prefix);\r\n } catch (e) {\r\n console.log(`[Banta/Comments] Showed user error (via alert): '${e.message}'`);\r\n console.error(e);\r\n\r\n alert(e.message);\r\n }\r\n }\r\n\r\n private handleBackendExceptionAsSnack(e: Error, prefix: string = '') {\r\n try {\r\n this.handleBackendException(e, prefix);\r\n } catch (e) {\r\n console.log(`[Banta/Comments] Showed user error (via snack): '${e.message}'`);\r\n console.error(e);\r\n\r\n this.matSnackBar.open(e.message, undefined, { duration: 3000 });\r\n //alert(e.message);\r\n }\r\n }\r\n\r\n private handleBackendException(e: Error, prefix: string = '') {\r\n let errorMessage = e.message;\r\n\r\n if (errorMessage.startsWith('permission-denied|')) {\r\n errorMessage = errorMessage.replace(/^permission-denied\\|/, '');\r\n\r\n if (errorMessage.startsWith(`app-handle|`)) {\r\n // If this is an error during authorizeAction on the backend, pass control to the user-provided\r\n // permission-denied handler.\r\n\r\n this.sendPermissionDenied(errorMessage.replace(/^app-handle\\|/, ''));\r\n return;\r\n }\r\n }\r\n\r\n throw new Error(`${prefix}${errorMessage}`);\r\n }\r\n\r\n // Lifecycle Events / Initialization\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));\r\n this.startLoading();\r\n\r\n if (typeof window !== 'undefined') {\r\n let queryString = window.location.search.substring(1);\r\n let query = queryString.split('&')\r\n .map(s => s.split('='))\r\n .reduce((o, [k, v]) => (o[decodeURIComponent(k)] = decodeURIComponent(v), o), {})\r\n ;\r\n\r\n const commentID = query['comment'];\r\n if (commentID) {\r\n this.sharedCommentID = commentID;\r\n }\r\n }\r\n }\r\n\r\n private resizeObserver: ResizeObserver;\r\n private width: number;\r\n private height: number;\r\n\r\n @HostBinding('class.banta-mobile')\r\n isMobileSized: boolean = false;\r\n\r\n @ContentChild(BantaReplySendOptionsDirective, {read: TemplateRef})\r\n sendReplyOptionsTemplate: any;\r\n\r\n markViewReady: () => void;\r\n viewReady = new Promise<void>(r => this.markViewReady = r);\r\n\r\n ngAfterViewInit() {\r\n if (typeof window !== 'undefined') {\r\n let callback = () => {\r\n let size = this.elementRef.nativeElement.getBoundingClientRect();\r\n this.ngZone.run(() => {\r\n setTimeout(() => {\r\n this.width = size.width;\r\n this.height = size.height;\r\n this.isMobileSized = this.width < 500;\r\n });\r\n })\r\n };\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(callback);\r\n this.resizeObserver.observe(this.elementRef.nativeElement);\r\n } else {\r\n // One check is better than nothing!\r\n setTimeout(() => {\r\n this.width = this.elementRef.nativeElement.clientWidth;\r\n this.height = this.elementRef.nativeElement.clientHeight;\r\n this.isMobileSized = this.width < 500;\r\n }, 1000);\r\n }\r\n\r\n callback();\r\n }\r\n\r\n this.markViewReady();\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n if (this.resizeObserver)\r\n this.resizeObserver.disconnect();\r\n }\r\n\r\n private async setSourceFromTopicID(topicID: string) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n setTimeout(async () => {\r\n console.log(`[Banta/Comments] Subscribing to topic source '${topicID}'`);\r\n\r\n // If we are loading a shared comment, we must override the mode to be Newest/All\r\n // to ensure we can find the comment.\r\n\r\n if (this.sharedCommentID) {\r\n this._sortOrder = CommentsOrder.NEWEST;\r\n this._filterMode = FilterMode.ALL;\r\n }\r\n\r\n this.source = await this.backend.getSourceForTopic(topicID, {\r\n sortOrder: this.sortOrder,\r\n filterMode: this.filterMode,\r\n metadata: this.metadata,\r\n initialMessageCount: this.initialMessageCount\r\n });\r\n this._sourceIsOwned = true;\r\n });\r\n }\r\n\r\n loadingTitle = 'Loading...';\r\n\r\n // Loading Screen\r\n private _loadingMessage = '';\r\n loadingMessageVisible = false;\r\n\r\n get loadingMessage() {\r\n return this._loadingMessage;\r\n }\r\n\r\n set loadingMessage(value) {\r\n this.loadingMessageVisible = false;\r\n setTimeout(() => {\r\n this._loadingMessage = value;\r\n this._loadingMessage = value;\r\n setTimeout(() => {\r\n this.loadingMessageVisible = true;\r\n })\r\n }, 500);\r\n }\r\n\r\n loading: boolean = true;\r\n showLoadingScreen = false;\r\n loadingStartedAt: number;\r\n messageChangedAt: number;\r\n sharedCommentID: string;\r\n lastSharedCommentID: string;\r\n\r\n @Input() customMenuItems: MessageMenuItem[] = [];\r\n\r\n private async startLoading() {\r\n this.loadingStartedAt = this.messageChangedAt = Date.now();\r\n\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 100));\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n if (this.updateLoading()) return;\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 500));\r\n if (this.updateLoading()) return;\r\n\r\n console.log(`[Banta] Loading is taking a long time! Showing loading screen.`);\r\n this.showLoadingScreen = true;\r\n if (typeof window !== 'undefined')\r\n this._loadingTimer = setInterval(() => {\r\n this.updateLoading();\r\n this.loadingTitle = `Connecting to Live Comments service...`;\r\n }, 1000);\r\n }\r\n\r\n private _loadingTimer;\r\n private _loadingMessageIndex = 0;\r\n\r\n /**\r\n * The canonical URL where this comment section can be found. If not specified, uses the current URL.\r\n */\r\n @Input() url: string;\r\n\r\n @Input() maxCommentLength: number = 1500;\r\n @Input() loadingMessages: string[] = [\r\n `Just a second...`,\r\n `It's definitely worth the wait!`,\r\n `This has never happened before.`,\r\n `We'll keep trying, but it's not looking great.\r\n Commenting & chat services may be down or degraded. Try reloading the page.\r\n If you keep experiencing issues or reloading the page works for you, please let us know by contacting support.\r\n `\r\n ];\r\n\r\n @Input() useInlineReplies = true;\r\n\r\n /**\r\n * Access the CommentViewComponent for this BantaCommentsComponent.\r\n * CommentViewComponent is responsible for interacting with the ChatSource\r\n * object and rendering comments as CommentComponents. It is the source of\r\n * truth for which CommentComponent corresponds to which ChatMessage.\r\n *\r\n * Note that this CommentViewComponent is only for the top level comments.\r\n * Replies are handled by a separate CommentViewComponent which can be\r\n * retrieved using the threadView property.\r\n */\r\n @ViewChild('commentView')\r\n commentView: CommentViewComponent;\r\n\r\n @ViewChildren(CommentViewComponent)\r\n threadViewQuery: QueryList<CommentViewComponent>;\r\n\r\n /**\r\n * Attempts to find the CommentComponent that corresponds to the given ChatMessage.\r\n * The ChatMessage could be a top-level message in this conversation, or a reply,\r\n * but note that a CommentComponent will only exist for a reply if the user has\r\n * the relevant reply thread open.\r\n * @param message The message to look for\r\n */\r\n getCommentComponentForMessage(message: ChatMessage): CommentComponent {\r\n if (message.parentMessageId)\r\n return this.threadView?.getCommentComponentForMessage(message);\r\n else\r\n return this.commentView.getCommentComponentForMessage(message)\r\n }\r\n\r\n /**\r\n * Access the CommentViewComponent corresponding to the currently open reply thread.\r\n * This is not the top level comments, but instead the reply thread that the user has\r\n * opened (only one set of replies can be open at a time).\r\n *\r\n * For details about what CommentViewComponent affords you, see the commentView property.\r\n */\r\n get threadView() {\r\n return Array.from(this.threadViewQuery).filter(x => x !== this.commentView)[0];\r\n }\r\n\r\n async waitForThreadView() {\r\n if (this.threadView)\r\n return this.threadView;\r\n\r\n await this.threadViewQuery.changes.pipe(take(1)).toPromise();\r\n return this.threadView;\r\n }\r\n\r\n markLoaded: () => void;\r\n loaded = new Promise<void>(r => this.markLoaded = r);\r\n\r\n get sourceState() {\r\n if (!this.source)\r\n return 'no-source';\r\n\r\n return this.source.state ?? 'connected';\r\n }\r\n\r\n private updateLoading(): boolean {\r\n if (this.sourceState && !['connecting', 'lost', 'no-source'].includes(this.sourceState)) {\r\n clearInterval(this._loadingTimer);\r\n this.loadingMessage = `Here we go!`;\r\n setTimeout(() => {\r\n this.loading = false;\r\n this.markLoaded();\r\n }, 750);\r\n return true;\r\n }\r\n\r\n console.log(`[Banta/Loader] State=${this.sourceState}`);\r\n let messageSwitchTime = 5*1000;\r\n if (this.messageChangedAt + messageSwitchTime < Date.now()) {\r\n if (this.loadingMessages[this._loadingMessageIndex]) {\r\n this.loadingMessage = this.loadingMessages[this._loadingMessageIndex++];\r\n this.messageChangedAt = Date.now();\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // Properties\r\n\r\n private _signInSelected = new Subject<void>();\r\n private _permissionDeniedError = new Subject<string>();\r\n private _editAvatarSelected = new Subject<void>();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _reported = new Subject<ChatMessage>();\r\n private _selected = new Subject<ChatMessage>();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _shared = new Subject<ChatMessage>();\r\n private _usernameSelected = new Subject<User>();\r\n private _avatarSelected = new Subject<User>();\r\n private _reconnectRequested = new Subject<void>();\r\n private _source: ChatSourceBase;\r\n\r\n /**\r\n * Track whether we created this source. If we did not (ie it was passed in from the caller),\r\n * then we are not responsible for calling close(). If we do own it though, we will call close()\r\n * when we are done with it.\r\n */\r\n private _sourceIsOwned = false;\r\n private _subs = new Subscription();\r\n private _topicID: string;\r\n\r\n user: User;\r\n selectedMessage: ChatMessage;\r\n selectedMessageThread: ChatSourceBase;\r\n selectedMessageVisible = false;\r\n connectionState: string;\r\n\r\n // Inputs\r\n\r\n @Input() signInLabel = 'Sign In';\r\n @Input() sendLabel = 'Send';\r\n @Input() signingInLabel = 'Signing in...';\r\n @Input() replyLabel = 'Reply';\r\n @Input() sendingLabel = 'Sending';\r\n @Input() permissionDeniedLabel = 'Send';\r\n @Input() postCommentLabel = 'Post a comment';\r\n @Input() postReplyLabel = 'Post a reply';\r\n @Input() allowAttachments = true;\r\n @Input() allowServerInfoRequest = false;\r\n @Input() fixedHeight: boolean;\r\n @Input() maxMessages: number;\r\n @Input() maxVisibleMessages: number = 20;\r\n @Input() genericAvatarUrl = `https://gravatar.com/avatar/${Date.now().toString(16)}?s=512&d=robohash`;\r\n\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n @Input() participants: User[] = [];\r\n\r\n private _sourceSubscription: Subscription;\r\n\r\n reconnect() {\r\n if (this._sourceIsOwned) {\r\n this.reloadSource();\r\n } else {\r\n this._reconnectRequested.next();\r\n }\r\n }\r\n\r\n replyFieldFocused = false;\r\n\r\n @Input()\r\n get source(): ChatSourceBase { return this._source; }\r\n set source(value) {\r\n if (this._source && this._sourceIsOwned) {\r\n this._source.close();\r\n this._sourceSubscription?.unsubscribe();\r\n this._source = null;\r\n this.participants = [];\r\n }\r\n\r\n this._source = value;\r\n this._sourceIsOwned = false; // Assume we don't own this source.\r\n this._sourceSubscription = new Subscription();\r\n\r\n if (value) {\r\n if (this.sharedCommentID) {\r\n this.navigateToSharedComment(this.sharedCommentID);\r\n this.lastSharedCommentID = this.sharedCommentID;\r\n this.sharedCommentID = null;\r\n }\r\n\r\n this._source.messages.forEach(m => this.addParticipant(m));\r\n\r\n if (this._source.connectionStateChanged)\r\n this._sourceSubscription.add(this._source.connectionStateChanged.subscribe(state => this.connectionState = state));\r\n else\r\n this.connectionState = 'connected';\r\n\r\n this._sourceSubscription.add(this._source.messageReceived.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(this._source.messageSent.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(this._source.messageObserved.subscribe(m => this.addParticipant(m)));\r\n this._sourceSubscription.add(\r\n this._source.messageUpdated.subscribe(msg => {\r\n console.log(`comments received message: `, msg);\r\n if (msg.id === this.selectedMessage?.id && msg.hidden) {\r\n this.unselectMessage();\r\n this.matSnackBar.open(\r\n \"The thread you were viewing was removed.\",\r\n undefined,\r\n {\r\n duration: 2500\r\n }\r\n )\r\n }\r\n })\r\n );\r\n\r\n }\r\n }\r\n @Input()\r\n hashtags: HashTag[] = [\r\n {hashtag: 'error', description: 'Cause an error'},\r\n {hashtag: 'timeout', description: 'Cause a slow timeout error'},\r\n {hashtag: 'slow', description: 'Be slow when this message is posted'},\r\n ];\r\n @Input()\r\n get topicID(): string { return this._topicID; }\r\n set topicID(value) {\r\n if (this._topicID !== value) {\r\n this._topicID = value;\r\n setTimeout(() => this.setSourceFromTopicID(value));\r\n }\r\n }\r\n\r\n // Outputs\r\n\r\n @Output() readonly signInSelected = this._signInSelected.asObservable();\r\n @Output() readonly editAvatarSelected = this._editAvatarSelected.asObservable();\r\n @Output() readonly permissionDeniedError = this._permissionDeniedError.asObservable();\r\n @Output() readonly upvoted = this._upvoted.asObservable();\r\n @Output() readonly reported = this._reported.asObservable();\r\n @Output() readonly selected = this._selected.asObservable();\r\n @Output() readonly userSelected = this._userSelected.asObservable();\r\n @Output() readonly usernameSelected = this._usernameSelected.asObservable();\r\n @Output() readonly avatarSelected = this._avatarSelected.asObservable();\r\n @Output() readonly shared = this._shared.asObservable();\r\n @Output() readonly reconnectRequested = this._reconnectRequested.asObservable();\r\n\r\n private _reloadSourceTimeout;\r\n private reloadSource() {\r\n clearTimeout(this._reloadSourceTimeout);\r\n\r\n let showLoaderTimeout;\r\n showLoaderTimeout = setTimeout(() => {\r\n this.loading = true;\r\n this.loadingTitle = 'Applying filters...';\r\n this.loadingMessage = 'Applying your filters and sort order is taking more time than expected. Sit tight!';\r\n this.showLoadingScreen = true;\r\n }, 500);\r\n\r\n this._reloadSourceTimeout = setTimeout(async () => {\r\n await this.setSourceFromTopicID(this.topicID);\r\n clearTimeout(showLoaderTimeout);\r\n this.loading = false;\r\n this.showLoadingScreen = true;\r\n });\r\n }\r\n\r\n private _sortOrder: CommentsOrder = 'newest';\r\n @Input() get sortOrder() { return this._sortOrder; }\r\n set sortOrder(value) {\r\n if (this._sortOrder !== value) {\r\n this._sortOrder = value;\r\n this.reloadSource();\r\n }\r\n }\r\n\r\n private _filterMode: FilterMode = FilterMode.ALL;\r\n @Input() get filterMode() { return this._filterMode; }\r\n set filterMode(value) {\r\n if (this._filterMode !== value) {\r\n this._filterMode = value;\r\n this.reloadSource();\r\n }\r\n }\r\n\r\n @Input() initialMessageCount: number = 100;\r\n\r\n private _metadata: Record<string, any> = {};\r\n\r\n /**\r\n * Arbitrary metadata to send to the chat server. This can be used to provide context about the client to the server\r\n * for things like validating authorization and other uses.\r\n */\r\n @Input() get metadata() { return this._metadata; }\r\n set metadata(value) {\r\n if (JSON.stringify(this._metadata) !== JSON.stringify(value)) {\r\n this._metadata = value;\r\n this.reloadSource();\r\n }\r\n }\r\n\r\n get filterModes() {\r\n return FilterMode.options;\r\n }\r\n\r\n get filterModeLabels() {\r\n return {\r\n [FilterMode.ALL]: 'All',\r\n [FilterMode.MINE]: 'Mine',\r\n [FilterMode.THREADS]: 'Involving Me',\r\n [FilterMode.MY_LIKES]: 'My Likes'\r\n }\r\n }\r\n\r\n get sortOrders() {\r\n return CommentsOrder.options;\r\n }\r\n\r\n get sortOrderLabels() {\r\n return {\r\n [CommentsOrder.NEWEST]: 'Newest',\r\n [CommentsOrder.OLDEST]: 'Oldest',\r\n [CommentsOrder.LIKES]: 'Likes'\r\n }\r\n }\r\n\r\n sendMessage: (message: ChatMessage) => void;\r\n sendReply: (message: ChatMessage) => void;\r\n\r\n // UI Interactions\r\n\r\n async scrollToComment(commentId: ChatMessage['id']) {\r\n if (typeof window === 'undefined')\r\n return;\r\n\r\n await this.commentView.waitForAllCommentsToLoad();\r\n\r\n const comment = document.querySelector(`[data-comment-id=\"${commentId}\"]`);\r\n if (comment) {\r\n comment.scrollIntoView({\r\n inline: 'center',\r\n block: 'center'\r\n });\r\n }\r\n }\r\n\r\n serverInfoVisible = false;\r\n serverInfoLoading = true;\r\n serverInfo: ServerInfo;\r\n\r\n async showServerInfo() {\r\n this.serverInfoVisible = true;\r\n this.serverInfoLoading = true;\r\n this.serverInfo = await this.source.getServerInfo();\r\n this.serverInfoLoading = false;\r\n }\r\n\r\n loadingSharedComment = false;\r\n sharedCommentMissing = false;\r\n\r\n async navigateToSharedComment(id: string) {\r\n this.loadingSharedComment = true;\r\n await new Promise(r => setTimeout(r, 10));\r\n this.sharedCommentMissing = false;\r\n let source = this.source;\r\n\r\n await source.ready;\r\n await this.viewReady;\r\n await this.loaded;\r\n\r\n console.log(`Navigating to shared comment with ID '${id}'...`);\r\n let message: ChatMessage;\r\n\r\n try {\r\n message = await this.source.get(id);\r\n } catch (e) {\r\n console.error(`Failed to find comment from URL: ${e.message}`);\r\n this.sharedCommentMissing = true;\r\n this.loadingSharedComment = false;\r\n\r\n if (typeof window !== 'undefined') {\r\n setTimeout(() => {\r\n let notice = this.element.querySelector('.loading-comment');\r\n notice.scrollIntoView({\r\n block: 'center',\r\n inline: 'center'\r\n });\r\n }, 200);\r\n }\r\n return;\r\n }\r\n\r\n message.transientState ??= {};\r\n\r\n // If there is a parent message, we should instead focus that and let the\r\n // scrollToComment and highlight do the work.\r\n\r\n if (message.parentMessageId) {\r\n\r\n let parentMessage = await this.source.get(message.parentMessageId);\r\n parentMessage.transientState ??= {};\r\n\r\n // Make sure that this message is loaded and visible to the user\r\n await this.commentView.loadMessageInContext(parentMessage);\r\n\r\n let thread = await this.selectMessage(parentMessage);\r\n\r\n // Need to re-retrieve the message within the new chat source to affect its\r\n // transient state.\r\n await thread.ready;\r\n\r\n // Make sure that this message is loaded and visible to the user\r\n await this.waitForThreadView();\r\n await this.threadView.loadMessageInContext(message);\r\n\r\n message = await thread.get(message.id);\r\n\r\n if (message) {\r\n message.transientState ??= {};\r\n message.transientState.highlighted = true;\r\n console.dir(message);\r\n await new Promise<void>(r => setTimeout(r, 500));\r\n }\r\n } else {\r\n // Make sure that this message is loaded and visible to the user\r\n await this.commentView.loadMessageInContext(message);\r\n\r\n message = await source.get(message.id);\r\n if (message) {\r\n message.transientState ??= {};\r\n message.transientState.highlighted = true;\r\n }\r\n }\r\n\r\n this.loadingSharedComment = false;\r\n await this.scrollToComment(id);\r\n }\r\n\r\n handlePermissionDenied(errorMessage: string) {\r\n // This is what other components call when handling permission errors\r\n\r\n if (errorMessage.startsWith(`app-handle|`)) {\r\n // If this is an error during authorizeAction on the backend, pass control to the user-provided\r\n // permission-denied handler.\r\n\r\n this.sendPermissionDenied(errorMessage.replace(/^app-handle\\|/, ''));\r\n return;\r\n }\r\n\r\n alert(errorMessage);\r\n }\r\n\r\n sendPermissionDenied(message: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n scrollToMessage(message: ChatMessage) {\r\n let el = this.elementRef.nativeElement.querySelector(`[data-comment-id=\"${message.id}\"]`);\r\n if (!el)\r\n return;\r\n el.scrollIntoView({block: 'center', inline: 'start'});\r\n }\r\n\r\n private addParticipant(message: ChatMessage) {\r\n if (!message || !message.user || !message.user.id)\r\n return;\r\n\r\n let existing = this.participants.find(x => x.id === message.user.id);\r\n if (existing)\r\n return;\r\n this.participants.push(message.user);\r\n }\r\n\r\n // Actions\r\n\r\n async likeMessage(source: ChatSourceBase, message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n this._upvoted.next(message);\r\n message.transientState.liking = true;\r\n\r\n try {\r\n await source.likeMessage(message.id);\r\n } catch (e) {\r\n this.handleBackendExceptionAsSnack(e, 'Could not like this message: ');\r\n } finally {\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n message.transientState.liking = false;\r\n }\r\n }\r\n\r\n async pinMessage(source: ChatSourceBase, message: ChatMessage, options: PinOptions) {\r\n await source.pinMessage(message.id, options);\r\n //this.reloadSource();\r\n this.matSnackBar.open(`The message has been pinned.`, undefined, { duration: 5000 });\r\n }\r\n\r\n async unpinMessage(source: ChatSourceBase, message: ChatMessage) {\r\n await source.unpinMessage(message.id);\r\n //this.reloadSource();\r\n this.matSnackBar.open(`The message has been unpinned.`, undefined, { duration: 5000 });\r\n }\r\n\r\n async unlikeMessage(source: ChatSourceBase, message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n this._upvoted.next(message);\r\n message.transientState.liking = true;\r\n\r\n if (message.userState?.liked)\r\n message.likes = (message.likes || 0) - 1;\r\n\r\n try {\r\n await source.unlikeMessage(message.id);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Failed to unlike this message: ');\r\n }\r\n\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n message.transientState.liking = false;\r\n }\r\n\r\n async reportMessage(message: ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n async unselectMessage() {\r\n let message = this.selectedMessage;\r\n\r\n this._selected.next(null);\r\n this.selectedMessage = null;\r\n if (this.selectedMessageThread) {\r\n if (this.selectedMessageThread.close)\r\n this.selectedMessageThread.close();\r\n this.selectedMessageThread = null;\r\n }\r\n\r\n if (message)\r\n setTimeout(() => this.scrollToMessage(message));\r\n }\r\n\r\n async toggleSelectedMessage(message: ChatMessage) {\r\n if (this.selectedMessage === message) {\r\n await this.unselectMessage();\r\n } else {\r\n await this.selectMessage(message);\r\n }\r\n }\r\n\r\n async selectMessage(message: ChatMessage) {\r\n if (this.selectedMessage === message) {\r\n console.log(`[Banta] Thread ${this.topicID}/${message.id} is already open.`);\r\n return this.selectedMessageThread;\r\n }\r\n\r\n if (this.selectedMessageThread) {\r\n if (this.selectedMessageThread.close)\r\n this.selectedMessageThread.close();\r\n this.selectedMessageThread = null;\r\n }\r\n\r\n this._selected.next(message);\r\n this.selectedMessage = message;\r\n\r\n console.log(`[Banta] Opening thread for ${this.topicID}/${message.id}...`);\r\n let selectedMessageThread = await this.backend.getSourceForThread(this.topicID, message.id, {\r\n metadata: this.metadata\r\n });\r\n\r\n if (!selectedMessageThread) {\r\n console.warn(`Failed to locate thread for message ${this.topicID}/${message.id}!`);\r\n return null;\r\n }\r\n\r\n console.log(`[Banta] Thread opened for ${this.topicID}/${message.id}.`);\r\n\r\n setTimeout(() => this.selectedMessageVisible = true);\r\n setTimeout(async () => {\r\n this.selectedMessageThread = selectedMessageThread;\r\n }, 250);\r\n\r\n return selectedMessageThread;\r\n }\r\n\r\n async showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n async showEditAvatar() {\r\n this._editAvatarSelected.next();\r\n }\r\n\r\n async selectMessageUser(message: ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n async selectUsername(user: User) {\r\n this._usernameSelected.next(user);\r\n }\r\n\r\n async selectAvatar(user: User) {\r\n this._avatarSelected.next(user);\r\n }\r\n\r\n async shareMessage(message: ChatMessage) {\r\n this._shared.next(message);\r\n }\r\n\r\n async deleteMessage(message: ChatMessage) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n if (!confirm(\"Are you sure you want to delete this comment? You cannot undo this action.\"))\r\n return;\r\n\r\n try {\r\n await this.source.deleteMessage(message.id);\r\n\r\n if (this.selectedMessage?.id === message.id)\r\n this.unselectMessage();\r\n\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, `Could not delete message: `);\r\n }\r\n }\r\n\r\n async editMessage(source: ChatSourceBase, message: ChatMessage, newText: string) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n try {\r\n await source.editMessage(message.id, newText);\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, 'Could not edit this message: ');\r\n return;\r\n }\r\n\r\n message.message = newText;\r\n message.transientState.editing = false;\r\n }\r\n\r\n async startEditing(message: ChatMessage) {\r\n this.selectedMessage.transientState.editing = false;\r\n message.transientState.editing = true;\r\n }\r\n\r\n async saveEdit(message: ChatMessage, text: string) {\r\n if (!this.user) {\r\n await this.showSignIn();\r\n return;\r\n }\r\n\r\n try {\r\n await this.source.editMessage(message.id, text);\r\n message.transientState.editing = false;\r\n } catch (e) {\r\n this.handleBackendExceptionAsAlert(e, `Could not edit message: `);\r\n }\r\n }\r\n}\r\n","@if (loading) {\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>{{loadingTitle}}</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n}\r\n@if (!loading) {\r\n @if (selectedMessage && !useInlineReplies) {\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\">\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [busy]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n [maxLength]=\"maxCommentLength\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (pinned)=\"pinMessage(source, selectedMessage, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, selectedMessage)\"\r\n (selected)=\"toggleSelectedMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n <div class=\"replies\">\r\n @if (!selectedMessageThread) {\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n }\r\n @if (selectedMessageThread) {\r\n <banta-comment-view\r\n class=\"replies\"\r\n #threadView\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"true\"\r\n emptyStateMessage=\"Be the first to reply!\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n [customMenuItems]=\"customMenuItems\"\r\n ></banta-comment-view>\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [readonly]=\"source?.readonly\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [maxLength]=\"maxCommentLength\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInState]=\"source?.signInState\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div class=\"main\" [class.hidden]=\"selectedMessage && !useInlineReplies\">\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n [maxLength]=\"maxCommentLength\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n [allowServerInfoRequest]=\"allowServerInfoRequest\"\r\n (serverInfoRequested)=\"showServerInfo()\"\r\n (reconnectRequested)=\"reconnect()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n >\r\n </banta-comment-field>\r\n @if (serverInfoVisible) {\r\n <div class=\"server-info\">\r\n <div class=\"server-info-header\">\r\n Server Info\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button matTooltip=\"Reload\" (click)=\"showServerInfo()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Hide\" (click)=\"serverInfoVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n @if (serverInfoLoading) {\r\n <mat-spinner />\r\n } @else {\r\n <pre>{{ serverInfo | json }}</pre>\r\n }\r\n </div>\r\n }\r\n <mat-menu #filterMenu=\"matMenu\">\r\n @for (filter of filterModes; track filter) {\r\n <button mat-menu-item (click)=\"filterMode = filter\">\r\n {{filterModeLabels[filter]}}\r\n </button>\r\n }\r\n </mat-menu>\r\n <mat-menu #sortMenu=\"matMenu\">\r\n @for (sort of sortOrders; track sort) {\r\n <button mat-menu-item (click)=\"sortOrder = sort\">\r\n {{sortOrderLabels[sort]}}\r\n </button>\r\n }\r\n </mat-menu>\r\n <div class=\"settings\">\r\n <button mat-button [matMenuTriggerFor]=\"filterMenu\">\r\n <mat-icon>filter_list</mat-icon>\r\n {{filterModeLabels[filterMode]}}\r\n </button>\r\n <button mat-button [matMenuTriggerFor]=\"sortMenu\">\r\n <mat-icon>sort</mat-icon>\r\n {{sortOrderLabels[sortOrder]}}\r\n </button>\r\n </div>\r\n @if (loadingSharedComment) {\r\n <div class=\"loading-comment\">\r\n <h1>Loading the comment you linked to...</h1>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n <p>\r\n If there are a lot of comments, this might take awhile!\r\n </p>\r\n </div>\r\n }\r\n @if (!loadingSharedComment && lastSharedCommentID) {\r\n <div class=\"loading-comment\">\r\n @if (sharedCommentMissing) {\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <h1>\r\n <mat-icon>error</mat-icon>\r\n Uh oh!\r\n </h1>\r\n <p>The comment you linked to can't be found! It may have been removed.</p>\r\n }\r\n @if (!sharedCommentMissing) {\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <button mat-button (click)=\"navigateToSharedComment(lastSharedCommentID)\">\r\n <mat-icon>move_down</mat-icon> Jump to shared comment\r\n </button>\r\n }\r\n </div>\r\n }\r\n <banta-comment-view\r\n #commentView\r\n [class.faded]=\"selectedMessage && !useInlineReplies\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [holdNewMessages]=\"selectedMessageVisible\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (filterModeChanged)=\"filterMode = $event\"\r\n (selected)=\"toggleSelectedMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (pinned)=\"pinMessage(source, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n [selectedMessage]=\"selectedMessage\"\r\n (deleted)=\"deleteMessage($event)\"\r\n >\r\n <div class=\"inline-replies\" *bantaInlineReplies>\r\n @if (selectedMessage) {\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\">\r\n <div class=\"replies\">\r\n @if (!selectedMessageThread) {\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n }\r\n @if (selectedMessageThread) {\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"true\"\r\n emptyStateMessage=\"Be the first to reply!\"\r\n [newestLast]=\"true\"\r\n [enableHoldOnClick]=\"false\"\r\n [holdNewMessages]=\"replyFieldFocused\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n />\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n [maxLength]=\"maxCommentLength\"\r\n [source]=\"selectedMessageThread\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [readonly]=\"source?.readonly\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (focusChange)=\"replyFieldFocused = $event\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n @if (connectionState === 'lost') {\r\n <div class=\"reconnecting\">\r\n <strong>Connection to Live Comments lost.</strong> Reconnecting...\r\n </div>\r\n }\r\n }\r\n","import { Component, Input, Output } from \"@angular/core\";\r\nimport { User, ChatMessage } from '@banta/common';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-chat-message',\r\n templateUrl: './chat-message.component.html',\r\n styleUrls: ['./chat-message.component.scss'],\r\n standalone: false\r\n})\r\nexport class ChatMessageComponent {\r\n private _selected = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _upvoted = new Subject<void>();\r\n private _userSelected = new Subject<User>();\r\n\r\n @Input()\r\n message : ChatMessage;\r\n \r\n @Output() \r\n get userSelected() {\r\n return this._userSelected;\r\n }\r\n\r\n @Output()\r\n get selected() {\r\n return this._selected;\r\n }\r\n\r\n @Output()\r\n get reported() {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get upvoted() {\r\n return this._upvoted;\r\n }\r\n\r\n avatarForUser(user : User) {\r\n if (user && user.avatarUrl) {\r\n let url = user.avatarUrl;\r\n return `url(${url})`;\r\n }\r\n\r\n return null;\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n \r\n selectUser() {\r\n this._userSelected.next(this.message.user);\r\n }\r\n\r\n}","<div class=\"message-content\">\r\n <div class=\"user\" (click)=\"selectUser()\">\r\n <div class=\"avatar\" [style.background-image]=\"avatarForUser(message.user)\"></div>\r\n <label>{{message.user.username}}</label>\r\n </div>\r\n <div class=\"content\">\r\n <div (click)=\"select()\">\r\n {{message.message}}\r\n </div>\r\n <div class=\"status\">\r\n @if (message.likes > 0) {\r\n <div class=\"count-indicator\">\r\n <mat-icon>star</mat-icon> {{message.likes}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"actions\">\r\n <button mat-icon-button matTooltip=\"Upvote\" matTooltipPosition=\"below\" (click)=\"upvote()\">\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Report\" matTooltipPosition=\"below\" (click)=\"report()\">\r\n <mat-icon>report</mat-icon>\r\n </button>\r\n</div>","import { Component, Input, ViewChild, ElementRef, Output } from \"@angular/core\";\r\nimport { User, ChatMessage } from '@banta/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\n\r\n@Component({\r\n selector: 'banta-chat-view',\r\n templateUrl: './chat-view.component.html',\r\n styleUrls: ['./chat-view.component.scss'],\r\n standalone: false\r\n})\r\nexport class ChatViewComponent {\r\n constructor(\r\n private backend: ChatBackendBase,\r\n private elementRef : ElementRef<HTMLElement>\r\n ) {\r\n\r\n }\r\n\r\n private _sourceSubs = new Subscription();\r\n private _source : ChatSourceBase;\r\n\r\n @Input()\r\n get source() {\r\n return this._source;\r\n }\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _selected$ = this._selected.asObservable();\r\n private _reported = new Subject<ChatMessage>();\r\n private _reported$ = this._reported.asObservable();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _upvoted$ = this._upvoted.asObservable();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _userSelected$ = this._userSelected.asObservable();\r\n private _received = new Subject<ChatMessage>();\r\n private _received$ = this._received.asObservable();\r\n\r\n @Output() get selected() { return this._selected$; }\r\n @Output() get userSelected() { return this._userSelected$; }\r\n @Output() get reported() { return this._reported$; }\r\n @Output() get upvoted() { return this._upvoted$; }\r\n @Output() get received() { return this._received$; }\r\n\r\n set source(value) {\r\n if (this._sourceSubs) {\r\n this._sourceSubs.unsubscribe();\r\n this._sourceSubs = null;\r\n }\r\n\r\n this._source = value;\r\n\r\n this.messages = [];\r\n\r\n if (value) {\r\n this._sourceSubs = new Subscription();\r\n this.messages = value.messages.slice();\r\n\r\n this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));\r\n this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));\r\n\r\n this._sourceSubs.add(\r\n this.backend.userChanged\r\n .subscribe(user => this.currentUser = user)\r\n );\r\n \r\n this.getInitialMessages();\r\n }\r\n }\r\n\r\n private async getInitialMessages() {\r\n let messages = (await this._source.getExistingMessages());\r\n messages.forEach(m => m.transientState ??= {});\r\n this.messages = messages.slice().reverse();\r\n this.sortMessages();\r\n }\r\n\r\n private sortMessages() {\r\n if (!this.source)\r\n return;\r\n \r\n let sorter: (a: ChatMessage, b: ChatMessage) => number;\r\n\r\n sorter = (a, b) => (a.sentAt - b.sentAt);\r\n\r\n this.messages.sort(sorter);\r\n }\r\n\r\n messages : ChatMessage[] = [];\r\n currentUser : User;\r\n\r\n @ViewChild('messageContainer')\r\n messageContainer : ElementRef<HTMLElement>;\r\n\r\n @Input() maxMessages : number = 200;\r\n @Input() emptyLabel = 'Be the first to chat';\r\n\r\n private addMessage(message : ChatMessage) {\r\n if (this.messages.length > this.maxMessages + 1) {\r\n while (this.messages.length > this.maxMessages)\r\n this.messages.shift();\r\n }\r\n\r\n this.messages.push(message);\r\n this.sortMessages();\r\n }\r\n\r\n private messageReceived(message : ChatMessage) {\r\n this.addMessage(message);\r\n this._received.next(message);\r\n\r\n if (this.isScrolledToLatest())\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n isScrolledToLatest() {\r\n if (!this.messageContainer)\r\n return false;\r\n\r\n let el = this.messageContainer.nativeElement;\r\n let currentScroll = el.scrollTop;\r\n let currentTotal = el.scrollHeight - el.offsetHeight;\r\n \r\n return currentScroll > currentTotal - 10;\r\n }\r\n\r\n private messageSent(message : ChatMessage) {\r\n this.addMessage(message);\r\n \r\n if (!this.messageContainer)\r\n return;\r\n\r\n setTimeout(() => this.scrollToLatest());\r\n }\r\n\r\n scrollToLatest() {\r\n if (!this.messageContainer)\r\n return;\r\n \r\n let el = this.messageContainer.nativeElement;\r\n el.scrollTop = el.scrollHeight;\r\n }\r\n\r\n jumpTo(message : ChatMessage) {\r\n let element = this.elementRef.nativeElement;\r\n let messageElement = element.querySelector(`banta-chat-message[data-id=\"${message.id}\"]`)\r\n\r\n if (!messageElement) {\r\n alert(`could not find message ${message.id}`);\r\n return;\r\n }\r\n\r\n messageElement.scrollIntoView({ behavior: 'smooth' });\r\n\r\n this.flashMessage(message);\r\n }\r\n\r\n flashMessage(message : ChatMessage) {\r\n if (!message)\r\n return;\r\n \r\n this.flashedMessageId = message.id;\r\n //setTimeout(() => this.flashedMessageId = null, 250);\r\n }\r\n\r\n flashedMessageId : string;\r\n\r\n\r\n mentionsMe(message : ChatMessage) {\r\n if (!this.currentUser)\r\n return false;\r\n\r\n if (message.message.includes(`@${this.currentUser.username}`))\r\n return true;\r\n \r\n return false;\r\n }\r\n \r\n upvoteMessage(message : ChatMessage) {\r\n this._upvoted.next(message);\r\n }\r\n\r\n reportMessage(message : ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n selectMessage(message : ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectMessageUser(message : ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n avatarForUser(user : User) {\r\n if (user && user.avatarUrl) {\r\n let url = user.avatarUrl;\r\n return `url(${url})`;\r\n }\r\n\r\n return null;\r\n }\r\n}","<div class=\"message-container\" #messageContainer>\r\n <ng-content select=\"[data-before]\"></ng-content>\r\n\r\n @if (messages.length === 0) {\r\n <div class=\"empty\">\r\n {{emptyLabel}}\r\n </div>\r\n }\r\n\r\n @for (message of messages; track message) {\r\n @if (!message.hidden) {\r\n <banta-chat-message\r\n [message]=\"message\"\r\n [class.highlight]=\"mentionsMe(message)\"\r\n [class.flash]=\"message.id === flashedMessageId\"\r\n (selected)=\"selectMessage(message)\"\r\n (upvoted)=\"upvoteMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (userSelected)=\"selectMessageUser(message)\"\r\n [attr.data-id]=\"message.id\"\r\n >\r\n </banta-chat-message>\r\n }\r\n }\r\n <ng-content select=\":not([data-before])\"></ng-content>\r\n</div>","import { Component, Input, Output, ViewChild, ElementRef } from \"@angular/core\";\r\nimport { MatSnackBar } from \"@angular/material/snack-bar\";\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\n\r\nimport { User, ChatMessage, NewMessageForm } from '@banta/common';\r\nimport { ChatViewComponent } from '../chat-view/chat-view.component';\r\nimport { ChatBackendBase } from \"../../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../../chat-source-base\";\r\n\r\n/**\r\n * Chat component\r\n */\r\n@Component({\r\n selector: 'banta-chat',\r\n templateUrl: './banta-chat.component.html',\r\n styleUrls: ['./banta-chat.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaChatComponent {\r\n constructor(\r\n private backend : ChatBackendBase,\r\n private matSnackBar: MatSnackBar\r\n ) {\r\n }\r\n\r\n private _source : ChatSourceBase;\r\n private _subs = new Subscription();\r\n user : User = null;\r\n\r\n @Input() shouldInterceptMessageSend?: (message: ChatMessage, source: ChatSourceBase) => boolean | Promise<boolean>;\r\n @Input() url: string;\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n }\r\n\r\n @Input()\r\n get source() : ChatSourceBase {\r\n return this._source;\r\n }\r\n\r\n set source(value) {\r\n this._source = value;\r\n }\r\n\r\n @Input()\r\n get topicID() : string {\r\n return this._source.identifier;\r\n }\r\n\r\n set topicID(value) {\r\n this.setSourceFromTopicID(value);\r\n }\r\n\r\n private _metadata: Record<string, any> = {};\r\n\r\n /**\r\n * Arbitrary metadata to send to the chat server. This can be used to provide context about the client to the server\r\n * for things like validating authorization and other uses.\r\n */\r\n @Input() get metadata() { return this._metadata; }\r\n set metadata(value) {\r\n if (JSON.stringify(this._metadata) !== JSON.stringify(value)) {\r\n this._metadata = value;\r\n this.reloadSource();\r\n }\r\n }\r\n\r\n private _reloadSourceTimeout;\r\n private reloadSource() {\r\n clearTimeout(this._reloadSourceTimeout);\r\n this._reloadSourceTimeout = setTimeout(() => {\r\n this.setSourceFromTopicID(this.topicID);\r\n });\r\n }\r\n\r\n private async setSourceFromTopicID(topicID : string) {\r\n if (this._source && this._source.close)\r\n this._source.close();\r\n this._source = null;\r\n this._source = await this.backend.getSourceForTopic(topicID, {\r\n metadata: this.metadata\r\n });\r\n }\r\n\r\n @Input() signInLabel = 'Sign In';\r\n @Input() sendLabel = 'Send';\r\n @Input() permissionDeniedLabel = 'Send';\r\n @Input() messageFieldPlaceholder = 'Chat';\r\n @Input() emptyLabel = 'Be the first to chat';\r\n\r\n private _selected = new Subject<ChatMessage>();\r\n private _selected$ = this._selected.asObservable();\r\n private _reported = new Subject<ChatMessage>();\r\n private _reported$ = this._reported.asObservable();\r\n private _upvoted = new Subject<ChatMessage>();\r\n private _upvoted$ = this._upvoted.asObservable();\r\n private _userSelected = new Subject<ChatMessage>();\r\n private _userSelected$ = this._userSelected.asObservable();\r\n private _permissionDeniedError = new Subject<string>();\r\n private _permissionDeniedError$ = this._permissionDeniedError.asObservable();\r\n private _signInSelected = new Subject<void>();\r\n private _signInSelected$ = this._signInSelected.asObservable();\r\n private _received = new Subject<ChatMessage>();\r\n private _received$ = this._received.asObservable();\r\n\r\n @Output() get selected() { return this._selected$; }\r\n @Output() get reported() { return this._reported$; }\r\n @Output() get upvoted() { return this._upvoted$; }\r\n @Output() get userSelected() { return this._userSelected$; }\r\n @Output() get permissionDeniedError() { return this._permissionDeniedError$; }\r\n @Output() get signInSelected() { return this._signInSelected$; }\r\n @Output() get received() { return this._received$; }\r\n\r\n onReceived(message: ChatMessage) {\r\n this._received.next(message);\r\n }\r\n\r\n showEmojiPanel = false;\r\n\r\n private handleBackendExceptionAsSnack(e: Error, prefix: string = '') {\r\n try {\r\n this.handleBackendException(e, prefix);\r\n } catch (e) {\r\n console.log(`[Banta/Comments] Showed user error (via snack): '${e.message}'`);\r\n console.error(e);\r\n\r\n this.matSnackBar.open(e.message, undefined, { duration: 3000 });\r\n }\r\n }\r\n\r\n private handleBackendException(e: Error, prefix: string = '') {\r\n let errorMessage = e.message;\r\n\r\n if (errorMessage.startsWith('permission-denied|')) {\r\n errorMessage = errorMessage.replace(/^permission-denied\\|/, '');\r\n\r\n if (errorMessage.startsWith(`app-handle|`)) {\r\n // If this is an error during authorizeAction on the backend, pass control to the user-provided\r\n // permission-denied handler.\r\n\r\n this.sendPermissionError(errorMessage.replace(/^app-handle\\|/, ''));\r\n return;\r\n }\r\n }\r\n\r\n throw new Error(`${prefix}${errorMessage}`);\r\n }\r\n\r\n showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n sendPermissionError(message?: string) {\r\n this._permissionDeniedError.next(message);\r\n }\r\n\r\n insertEmoji(emoji) {\r\n let message = this.newMessage.message || '';\r\n\r\n this.newMessage.message = message + emoji;\r\n }\r\n\r\n onKeyDown(event : KeyboardEvent) {\r\n // TODO\r\n }\r\n\r\n @ViewChild('chatView') chatView : ChatViewComponent;\r\n @ViewChild('input') inputElementRef: ElementRef<HTMLInputElement>;\r\n\r\n jumpToMessage(message : ChatMessage) {\r\n if (this.chatView)\r\n this.chatView.jumpTo(message);\r\n }\r\n\r\n select(message : ChatMessage) {\r\n this._selected.next(message);\r\n }\r\n\r\n selectUser(message : ChatMessage) {\r\n this._userSelected.next(message);\r\n }\r\n\r\n report(message : ChatMessage) {\r\n this._reported.next(message);\r\n }\r\n\r\n async upvote(message : ChatMessage) {\r\n if (!this.user) {\r\n this.showSignIn();\r\n return;\r\n }\r\n\r\n this._upvoted.next(message);\r\n message.transientState ??= {};\r\n message.transientState.liking = true;\r\n\r\n try {\r\n await this.source.likeMessage(message.id);\r\n } catch (e) {\r\n this.handleBackendExceptionAsSnack(e, 'Could not like this message: ');\r\n } finally {\r\n await new Promise<void>(resolve => setTimeout(() => resolve(), 250));\r\n message.transientState.liking = false;\r\n }\r\n }\r\n\r\n get canChat() {\r\n if (!this.user)\r\n return false;\r\n\r\n // TODO\r\n // if (!this.user.permissions)\r\n // return true;\r\n\r\n // if (!this.user.permissions.canChat)\r\n // return true;\r\n\r\n // return this.user.permissions?.canChat(this.source);\r\n\r\n return true;\r\n }\r\n\r\n newMessage : NewMessageForm = {};\r\n\r\n async sendMessage() {\r\n if (!this.source)\r\n return;\r\n\r\n let text = (this.newMessage.message || '').trim();\r\n this.newMessage.message = '';\r\n\r\n if (text === '')\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: null,\r\n sentAt: Date.now(),\r\n likes: 0,\r\n url: this.url ?? (typeof window !== 'undefined' ? location.href : undefined),\r\n message: text\r\n };\r\n\r\n try {\r\n const intercept = await this.shouldInterceptMessageSend?.(message, this.source);\r\n if (!intercept) {\r\n await this.source.send(message);\r\n }\r\n\r\n this.chatView.scrollToLatest();\r\n this.inputElementRef.nativeElement.focus();\r\n } catch (e) {\r\n console.error(`Failed to send message: `, message);\r\n console.error(e);\r\n }\r\n }\r\n}\r\n","<banta-chat-view\r\n #chatView\r\n [source]=\"source\"\r\n [emptyLabel]=\"emptyLabel\"\r\n (upvoted)=\"upvote($event)\"\r\n (reported)=\"report($event)\"\r\n (selected)=\"select($event)\"\r\n (received)=\"onReceived($event)\"\r\n (userSelected)=\"selectUser($event)\"\r\n></banta-chat-view>\r\n\r\n<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n\r\n <div class=\"entry-container\">\r\n <input\r\n #input\r\n type=\"text\"\r\n name=\"message\"\r\n autocomplete=\"off\"\r\n enterkeyhint=\"send\"\r\n [placeholder]=\"messageFieldPlaceholder\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [(ngModel)]=\"newMessage.message\" />\r\n\r\n <emoji-selector-button\r\n (selected)=\"insertEmoji($event)\"\r\n overlayY=\"bottom\"\r\n overlayX=\"end\"\r\n originY=\"top\"\r\n ></emoji-selector-button>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n\r\n @if (!user) {\r\n <button type=\"button\" (click)=\"showSignIn()\" mat-raised-button color=\"primary\">{{signInLabel}}</button>\r\n }\r\n @if (user) {\r\n @if (canChat) {\r\n <button [disabled]=\"!newMessage.message\" mat-raised-button color=\"primary\">{{sendLabel}}</button>\r\n }\r\n @if (!canChat) {\r\n <button type=\"button\" (click)=\"sendPermissionError()\" mat-raised-button color=\"primary\">{{permissionDeniedLabel}}</button>\r\n }\r\n }\r\n </div>\r\n </form>","import { Component, Input, Output } from '@angular/core';\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ChatBackendBase } from '../chat-backend-base';\r\n\r\n@Component({\r\n selector: 'banta-live-comment',\r\n template: `\r\n @if (message) {\r\n <banta-comment\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\"\r\n ></banta-comment>\r\n }\r\n `,\r\n styles: [``],\r\n standalone: false\r\n})\r\nexport class LiveCommentComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n @Output()\r\n get upvoted() : Observable<void> {\r\n return this._upvoted;\r\n }\r\n \r\n @Output()\r\n get reported() : Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected() : Observable<void> {\r\n return this._selected;\r\n }\r\n \r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n private unsubscribe : Function;\r\n\r\n set message(value) {\r\n let originalId = null;\r\n if (this._message)\r\n originalId = this._message.id;\r\n \r\n this._message = value;\r\n\r\n if (value && originalId === value.id) {\r\n return;\r\n }\r\n \r\n if (this.unsubscribe)\r\n this.unsubscribe();\r\n \r\n if (value) {\r\n this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);\r\n }\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n}","import { Component, Input, Output } from '@angular/core';\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ChatBackendBase } from '../chat-backend-base';\r\n\r\n@Component({\r\n selector: 'banta-live-chat-message',\r\n template: `\r\n @if (message) {\r\n <banta-chat-message\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\"\r\n ></banta-chat-message>\r\n }\r\n `,\r\n styles: [``],\r\n standalone: false\r\n})\r\nexport class LiveChatMessageComponent {\r\n constructor(\r\n private backend : ChatBackendBase\r\n ) {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n @Output()\r\n get upvoted() : Observable<void> {\r\n return this._upvoted;\r\n }\r\n \r\n @Output()\r\n get reported() : Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected() : Observable<void> {\r\n return this._selected;\r\n }\r\n \r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n private unsubscribe : Function;\r\n\r\n set message(value) {\r\n let originalId = null;\r\n if (this._message)\r\n originalId = this._message.id;\r\n \r\n this._message = value;\r\n\r\n if (value && originalId === value.id) {\r\n return;\r\n }\r\n\r\n if (this.unsubscribe)\r\n this.unsubscribe();\r\n \r\n if (value) {\r\n this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);\r\n }\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n \r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n}","import { Component, Input, Output } from \"@angular/core\";\r\nimport { ChatMessage } from '@banta/common';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'banta-live-message',\r\n template: `\r\n @if (message) {\r\n @if (viewType === 'chat') {\r\n <banta-live-chat-message\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\">\r\n </banta-live-chat-message>\r\n }\r\n @if (viewType === 'comment') {\r\n <banta-live-comment\r\n [message]=\"message\"\r\n (upvoted)=\"upvote()\"\r\n (reported)=\"report()\"\r\n (selected)=\"select()\">\r\n </banta-live-comment>\r\n }\r\n }\r\n `,\r\n styles: [``],\r\n standalone: false\r\n})\r\nexport class LiveMessageComponent {\r\n constructor() {\r\n\r\n }\r\n\r\n private _message : ChatMessage;\r\n private _upvoted = new Subject<void>();\r\n private _reported = new Subject<void>();\r\n private _selected = new Subject<void>();\r\n\r\n viewType : string;\r\n\r\n @Output()\r\n get upvoted(): Observable<void> {\r\n return this._upvoted;\r\n }\r\n\r\n @Output()\r\n get reported(): Observable<void> {\r\n return this._reported;\r\n }\r\n\r\n @Output()\r\n get selected(): Observable<void> {\r\n return this._selected;\r\n }\r\n\r\n @Input()\r\n get message() : ChatMessage {\r\n return this._message;\r\n }\r\n\r\n set message(value) {\r\n this._message = value;\r\n this.viewType = this.getViewType(value);\r\n }\r\n\r\n private getViewType(message : ChatMessage) {\r\n if (message.topicId.endsWith('_firehose'))\r\n return 'chat';\r\n else if (message.topicId.endsWith('_thepoint'))\r\n return 'comment';\r\n\r\n return 'comment';\r\n }\r\n\r\n upvote() {\r\n this._upvoted.next();\r\n }\r\n\r\n report() {\r\n this._reported.next();\r\n }\r\n\r\n select() {\r\n this._selected.next();\r\n }\r\n\r\n}\r\n","import { Component, Input, ViewChild, HostBinding } from \"@angular/core\";\r\nimport { NewMessageForm, ChatMessage, User, Notification, UpvoteNotification, NoticeNotification, MentionNotification, ReplyNotification } from '@banta/common';\r\nimport { Subject, Observable, Subscription } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { BantaChatComponent } from '../chat';\r\nimport { Output } from \"@angular/core\";\r\nimport { ChatBackendBase } from \"../chat-backend-base\";\r\nimport { ChatSourceBase } from \"../chat-source-base\";\r\n\r\n/**\r\n * Unified chat and comments component\r\n */\r\n@Component({\r\n selector: `banta`,\r\n templateUrl: './banta.component.html',\r\n styleUrls: ['./banta.component.scss'],\r\n standalone: false\r\n})\r\nexport class BantaComponent {\r\n constructor(\r\n private backend : ChatBackendBase,\r\n private matDialog : MatDialog\r\n ) {\r\n }\r\n\r\n firehoseSource : ChatSourceBase;\r\n pointSource : ChatSourceBase;\r\n\r\n private _topicID : string;\r\n private _subs = new Subscription();\r\n\r\n auxOpen = false;\r\n auxTitle = 'Notifications';\r\n auxMode = 'notifications';\r\n\r\n ngOnInit() {\r\n this._subs.add(this.backend.userChanged.subscribe(user => this.currentUser = user));\r\n this._subs.add(this.backend.notificationsChanged.subscribe(notifs => this.notifications = notifs));\r\n this._subs.add(this.backend.newNotification.subscribe(notif => {\r\n this.newNotifications = true;\r\n }));\r\n }\r\n\r\n mobileFocus : string = null;\r\n\r\n async sendPointSubMessage() {\r\n let text = (this.newPointSubMessage.message || '').trim();\r\n this.newPointSubMessage.message = '';\r\n\r\n if (text === '')\r\n return;\r\n\r\n let message : ChatMessage = {\r\n user: null,\r\n sentAt: Date.now(),\r\n likes: 0,\r\n message: text\r\n };\r\n\r\n try {\r\n await this.pointSubChat.send(message);\r\n } catch (e) {\r\n console.error(`Failed to send point sub-message:`);\r\n console.error(e);\r\n }\r\n }\r\n\r\n @ViewChild('firehose', { static: true })\r\n firehose : BantaChatComponent;\r\n\r\n async goToMessage(message : ChatMessage) {\r\n\r\n let targetMessage = message;\r\n\r\n if (message.parentMessageId) {\r\n // jump to the parent message thread...\r\n\r\n let parentMessage: ChatMessage;\r\n\r\n try {\r\n parentMessage = await this.backend.getMessage(message.topicId, message.parentMessageId);\r\n } catch (e) {\r\n console.error(`Received exception while fetching parent message:`);\r\n console.error(e);\r\n }\r\n\r\n if (!parentMessage) {\r\n console.error(`Failed to look up parent message ${message.topicId}/${message.parentMessageId}`);\r\n console.error(`Original message was:`);\r\n console.dir(targetMessage);\r\n return;\r\n }\r\n\r\n message = parentMessage;\r\n }\r\n\r\n let viewType = this.getViewType(message);\r\n\r\n if (viewType === 'comment') {\r\n if (this.pointSubChat) {\r\n if (this.pointSubChat.close)\r\n this.pointSubChat.close();\r\n this.pointSubChat = null;\r\n }\r\n this.mobileFocus = 'points';\r\n this.pointOpen = message;\r\n this.pointSubChat = await this.backend.getSourceForThread(message.topicId, message.id);\r\n this.pointOpen = await this.backend.refreshMessage(message);\r\n this.newPointSubMessage = {};\r\n } else if (viewType === 'chat') {\r\n this.mobileFocus = 'firehose';\r\n this.firehose.jumpToMessage(message);\r\n }\r\n }\r\n\r\n notifications : Notification[];\r\n newNotifications = false;\r\n\r\n pointUnfocus() {\r\n this.pointOpen = null;\r\n if (this.pointSubChat) {\r\n if (this.pointSubChat.close)\r\n this.pointSubChat.close();\r\n this.pointSubChat = null;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._subs.unsubscribe();\r\n }\r\n\r\n showAux(title : string, mode : string) {\r\n this.auxOpen = true;\r\n this.auxTitle = title;\r\n this.auxMode = mode;\r\n this.mobileFocus = 'aux';\r\n }\r\n\r\n showNotifications() {\r\n this.showAux('Notifications', 'notifications');\r\n }\r\n\r\n @Input()\r\n get topicID() : string {\r\n return this._topicID;\r\n }\r\n\r\n @Input() chatLabel = 'Chat';\r\n @Input() commentsLabel = 'Comments';\r\n @Input() allowServerInfoRequest = false;\r\n\r\n set topicID(value) {\r\n this._topicID = value;\r\n\r\n this.close();\r\n this.connectToTopic(this._topicID);\r\n }\r\n\r\n private async connectToTopic(id : string) {\r\n this.firehoseSource = await this.backend.getSourceForTopic(`${id}_firehose`);\r\n this.pointSource = await this.backend.getSourceForTopic(`${id}_thepoint`);\r\n }\r\n\r\n private _signInSelected = new Subject<void>();\r\n\r\n @Output()\r\n get signInSelected(): Observable<void> {\r\n return this._signInSelected;\r\n }\r\n\r\n showSignIn() {\r\n this._signInSelected.next();\r\n }\r\n\r\n close() {\r\n if (this.firehoseSource) {\r\n if (this.firehoseSource.close)\r\n this.firehoseSource.close();\r\n this.firehoseSource = null;\r\n }\r\n\r\n if (this.pointSource) {\r\n if (this.pointSource.close)\r\n this.pointSource.close();\r\n this.pointSource = null;\r\n }\r\n }\r\n\r\n @HostBinding('class.point-focus')\r\n get hasPoint() {\r\n return this.pointOpen != null;\r\n }\r\n\r\n pointOpen : ChatMessage = null;\r\n pointSubChat : ChatSourceBase = null;\r\n\r\n closeAux() {\r\n this.auxOpen = false;\r\n this.mobileFocus = 'firehose';\r\n }\r\n\r\n getViewType(message : ChatMessage) {\r\n if (message.topicId.endsWith('_firehose'))\r\n return 'chat';\r\n else if (message.topicId.endsWith('_thepoint'))\r\n return 'comment';\r\n\r\n return 'comment';\r\n }\r\n\r\n async upvoteMessage(message : ChatMessage) {\r\n // TODO\r\n //await this.backend.likeMessage(message.id);\r\n }\r\n\r\n showProfile(user : User) {\r\n this.profileUser = user;\r\n this.showAux(`@${user.username}'s Profile`, 'profile');\r\n }\r\n\r\n profileUser : User;\r\n\r\n reportedMessage : ChatMessage;\r\n\r\n sendReport(message : ChatMessage) {\r\n this.auxOpen = false;\r\n alert('would send report');\r\n }\r\n\r\n reportMessage(message : ChatMessage) {\r\n this.reportedMessage = message;\r\n this.showAux(`Report message from @${message.user.username}`, 'report');\r\n }\r\n\r\n currentUser : User;\r\n\r\n newPointSubMessage : NewMessageForm = {};\r\n\r\n genericAvatarUrl = 'https://gravatar.com/avatar/915c804e0be607a4ad766ddadea5c48a?s=512&d=https://codepen.io/assets/avatars/user-avatar-512x512-6e240cf350d2f1cc07c2bed234c3a3bb5f1b237023c204c782622e80d6b212ba.png';\r\n\r\n notifIsUpvote(notif: Notification): notif is UpvoteNotification { return notif.type === 'upvote'; }\r\n notifIsNotice(notif: Notification): notif is NoticeNotification { return notif.type === 'notice'; }\r\n notifIsMention(notif: Notification): notif is MentionNotification { return notif.type === 'mention'; }\r\n notifIsReply(notif: Notification): notif is ReplyNotification { return notif.type === 'reply'; }\r\n}\r\n","\r\n<mat-menu #userMenu=\"matMenu\">\r\n @if (currentUser) {\r\n <button [disabled]=\"true\" mat-menu-item>{{currentUser.displayName}} (@{{currentUser.username}})</button>\r\n }\r\n @if (!currentUser) {\r\n <button mat-menu-item>Sign In</button>\r\n }\r\n <button mat-menu-item>Help</button>\r\n</mat-menu>\r\n\r\n<div class=\"tabs\">\r\n <div>\r\n <a mat-button (click)=\"mobileFocus = 'chat'\">{{chatLabel}}</a>\r\n <a mat-button (click)=\"mobileFocus = 'comments'\">{{commentsLabel}}</a>\r\n </div>\r\n <div class=\"spacer\"></div>\r\n <div>\r\n @if (currentUser) {\r\n <button mat-button [matMenuTriggerFor]=\"userMenu\">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)=\"showNotifications()\">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (!currentUser) {\r\n <button mat-button (click)=\"showSignIn()\">\r\n Sign In\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n\r\n<div class=\"firehose\" [class.focus]=\"mobileFocus === 'chat'\">\r\n <header>\r\n <div>\r\n <label (click)=\"mobileFocus = 'chat'\">{{chatLabel}}</label>\r\n <div class=\"spacer\"></div>\r\n\r\n @if (currentUser) {\r\n <button mat-button [matMenuTriggerFor]=\"userMenu\">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)=\"showNotifications()\">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (!currentUser) {\r\n <button mat-button (click)=\"showSignIn()\">\r\n Sign In\r\n </button>\r\n }\r\n </div>\r\n </header>\r\n <banta-chat\r\n #firehose\r\n [source]=\"firehoseSource\"\r\n (signInSelected)=\"showSignIn()\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n (reported)=\"reportMessage($event)\"\r\n ></banta-chat>\r\n</div>\r\n\r\n<div class=\"aux\" [class.focus]=\"mobileFocus === 'aux'\" [class.open]=\"auxOpen\">\r\n <header>\r\n <div>\r\n <label>{{auxTitle}}</label>\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button (click)=\"auxOpen = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </header>\r\n <div class=\"aux-contents\">\r\n @if (auxMode === 'profile') {\r\n @if (profileUser) {\r\n <div>\r\n <strong style=\"font-size: 125%;\">\r\n {{profileUser.displayName}}\r\n </strong>\r\n @{{profileUser.username}}\r\n </div>\r\n <br/>\r\n <strong>Top Messages</strong>\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n <br/>\r\n <strong>Recent Messages</strong>\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n }\r\n }\r\n\r\n @if (auxMode === 'report') {\r\n <p>Are you sure you want to report this message?</p>\r\n <banta-live-message [message]=\"reportedMessage\"></banta-live-message>\r\n <div style=\"text-align: center;\">\r\n <button mat-raised-button color=\"primary\" (click)=\"sendReport(reportedMessage)\">Yes, Report</button>\r\n \r\n <button mat-raised-button color=\"secondary\" (click)=\"auxOpen = false\">No, Cancel</button>\r\n </div>\r\n }\r\n\r\n @if (auxMode === 'notifications') {\r\n @if (!notifications || notifications.length === 0) {\r\n <div>\r\n <em>You do not have any notifications yet</em>\r\n </div>\r\n }\r\n <div class=\"notifications\">\r\n @for (notif of notifications; track notif) {\r\n <div class=\"notification\">\r\n <div>\r\n @if (notifIsUpvote(notif)) {\r\n @{{notif.message?.user?.username}} upvoted your post\r\n <banta-live-message\r\n [message]=\"notif.message\"\r\n (upvoted)=\"upvoteMessage(notif.message)\"\r\n (reported)=\"reportMessage(notif.message)\"\r\n (selected)=\"goToMessage(notif.message)\">\r\n </banta-live-message>\r\n } @else if (notifIsNotice(notif)) {\r\n <div>\r\n {{notif.message}}\r\n </div>\r\n <a mat-button target=\"_blank\" href=\"{{notif.actionUrl}}\">\r\n {{notif.actionLabel}}\r\n </a>\r\n } @else if (notifIsMention(notif)) {\r\n You were mentioned by @{{notif.message?.user?.username}}\r\n <banta-live-message\r\n [message]=\"notif.message\"\r\n (upvoted)=\"upvoteMessage(notif.message)\"\r\n (reported)=\"reportMessage(notif.message)\"\r\n (selected)=\"goToMessage(notif.message)\">\r\n </banta-live-message>\r\n } @else if (notifIsReply(notif)) {\r\n @{{notif.replyMessage?.user?.username}} replied to your post\r\n <banta-live-message\r\n [message]=\"notif.replyMessage\"\r\n (upvoted)=\"upvoteMessage(notif.replyMessage)\"\r\n (reported)=\"reportMessage(notif.replyMessage)\"\r\n (selected)=\"goToMessage(notif.replyMessage)\">\r\n </banta-live-message>\r\n }\r\n </div>\r\n <banta-timestamp [value]=\"notif.sentAt\"></banta-timestamp>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n<div class=\"points\" [class.focus]=\"mobileFocus === 'points'\">\r\n <header>\r\n <div>\r\n <label>{{commentsLabel}}</label>\r\n </div>\r\n </header>\r\n <div class=\"point-focus\">\r\n <div class=\"actions\">\r\n <button mat-button (click)=\"pointUnfocus()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Back\r\n </button>\r\n\r\n <div class=\"spacer\"></div>\r\n\r\n @if (pointOpen) {\r\n <div class=\"counted-action\">\r\n <div class=\"count-indicator\">\r\n {{pointOpen.likes}}\r\n </div>\r\n <button mat-icon-button>\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!pointSubChat) {\r\n <div>\r\n Error: No subchat\r\n </div>\r\n }\r\n\r\n @if (pointSubChat) {\r\n <banta-comment-view\r\n class=\"subcomments\"\r\n [newestLast]=\"true\"\r\n [allowReplies]=\"false\"\r\n [source]=\"pointSubChat\"\r\n (reported)=\"reportMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n >\r\n @if (pointOpen) {\r\n <banta-comment\r\n class=\"focused-comment\"\r\n data-before\r\n [showReplyAction]=\"false\"\r\n [message]=\"pointOpen\"\r\n [readonly]=\"pointSubChat?.readonly\"\r\n (upvoted)=\"upvoteMessage(pointOpen)\"\r\n (userSelected)=\"showProfile(pointOpen.user)\"\r\n (reported)=\"reportMessage(pointOpen)\"\r\n ></banta-comment>\r\n }\r\n <div class=\"message reply\">\r\n Reply:\r\n <form class=\"new-message\" (submit)=\"sendPointSubMessage()\">\r\n <textarea\r\n name=\"message\"\r\n [(ngModel)]=\"newPointSubMessage.message\"></textarea>\r\n <div class=\"actions\">\r\n <button [disabled]=\"!newPointSubMessage.message\"\r\n mat-raised-button color=\"primary\">Send</button>\r\n </div>\r\n </form>\r\n </div>\r\n </banta-comment-view>\r\n }\r\n </div>\r\n <div class=\"points-section\">\r\n <banta-comments\r\n [source]=\"pointSource\"\r\n [allowServerInfoRequest]=\"allowServerInfoRequest\"\r\n (signInSelected)=\"showSignIn()\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (reported)=\"reportMessage($event)\"\r\n (selected)=\"goToMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n ></banta-comments>\r\n </div>\r\n</div>\r\n","import { Component } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'banta-logo',\r\n template: `banta`,\r\n styles: [\r\n `\r\n :host {\r\n font-family: 'Odibee Sans', sans-serif;\r\n font-size: 40pt;\r\n }\r\n\r\n :host.small {\r\n font-size: 30pt;\r\n }\r\n `\r\n ],\r\n standalone: false\r\n})\r\nexport class BantaLogoComponent {\r\n\r\n}","import { NgModule } from \"@angular/core\";\r\nimport { ChatMessageComponent } from './chat-message/chat-message.component';\r\nimport { ChatViewComponent } from './chat-view/chat-view.component';\r\nimport { BantaChatComponent } from './banta-chat/banta-chat.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { EmojiModule } from '../emoji';\r\nimport { LiveChatMessageComponent } from './live-chat-message.component';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\n\r\nconst COMPONENTS = [\r\n ChatMessageComponent,\r\n LiveChatMessageComponent,\r\n ChatViewComponent,\r\n BantaChatComponent\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatSnackBarModule,\r\n EmojiModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class ChatModule {\r\n}","import { Component, Input, Output } from '@angular/core';\r\nimport { CommentsOrder } from \"@banta/common\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n@Component({\r\n selector: 'banta-comment-sort',\r\n templateUrl: './comment-sort.component.html',\r\n styleUrls: ['./comment-sort.component.scss'],\r\n standalone: false\r\n})\r\nexport class CommentSortComponent {\r\n\r\n commentsOrder = CommentsOrder;\r\n private _sortChange = new Subject<CommentsOrder>();\r\n private _sort: CommentsOrder = CommentsOrder.LIKES;\r\n\r\n @Input() \r\n get sort() { \r\n return this._sort;\r\n }\r\n\r\n set sort(value) {\r\n if (this._sort !== value) {\r\n this._sort = value;\r\n setTimeout(() => this._sortChange.next(value));\r\n }\r\n }\r\n\r\n @Output()\r\n get sortChange() {\r\n return this._sortChange.asObservable();\r\n }\r\n}\r\n","<mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Sort</mat-label>\r\n <mat-select [(value)]=\"sort\" >\r\n <mat-option [value]=\"commentsOrder.NEWEST\">Newest</mat-option>\r\n <mat-option [value]=\"commentsOrder.OLDEST\">Oldest</mat-option>\r\n <mat-option [value]=\"commentsOrder.LIKES\">Likes</mat-option>\r\n </mat-select>\r\n</mat-form-field>","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { TextFieldModule } from '@angular/cdk/text-field';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSelectModule } from \"@angular/material/select\";\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { BantaCommonModule } from '../common';\r\nimport { EmojiModule } from '../emoji';\r\nimport { AttachmentButtonComponent } from './attachment-button/attachment-button.component';\r\nimport { AttachmentScraperDirective } from './attachment-scraper.directive';\r\nimport { BantaCommentsComponent } from './banta-comments/banta-comments.component';\r\nimport { CommentFieldComponent } from './comment-field/comment-field.component';\r\nimport { CommentSortComponent } from \"./comment-sort/comment-sort.component\";\r\nimport { CommentViewComponent } from './comment-view/comment-view.component';\r\nimport { CommentComponent } from './comment/comment.component';\r\nimport { LiveCommentComponent } from './live-comment.component';\r\nimport { BantaReplySendOptionsDirective } from './reply-send-options.directive';\r\nimport { BantaInlineRepliesDirective } from './inline-replies.directive';\r\n\r\nconst COMPONENTS = [\r\n CommentComponent,\r\n CommentViewComponent,\r\n BantaCommentsComponent,\r\n LiveCommentComponent,\r\n CommentFieldComponent,\r\n CommentSortComponent,\r\n AttachmentButtonComponent,\r\n BantaReplySendOptionsDirective,\r\n BantaInlineRepliesDirective,\r\n AttachmentScraperDirective\r\n];\r\n\r\n@NgModule({\r\n declarations: COMPONENTS,\r\n imports: [\r\n CommonModule,\r\n TextFieldModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatMenuModule,\r\n MatDividerModule,\r\n MatProgressSpinnerModule,\r\n BantaCommonModule,\r\n EmojiModule,\r\n MatTooltipModule,\r\n MatDatepickerModule,\r\n MatSelectModule,\r\n MatBadgeModule,\r\n MatRadioModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n exports: COMPONENTS\r\n})\r\nexport class CommentsModule {\r\n}\r\n","import { ChatMessage, ChatPermissions, CommentsOrder, DurableSocket, ServerInfo, User } from \"@banta/common\";\r\nimport { BehaviorSubject, Subject, Subscription } from \"rxjs\";\r\nimport { RpcEvent, SocketRPC } from \"@banta/common\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { ChatBackend } from \"./chat-backend\";\r\nimport { v4 as uuid } from \"uuid\";\r\nimport { ChatSourceOptions } from \"./chat-backend-base\";\r\n\r\nexport type SignInState = 'signed-out' | 'signed-in' | 'signing-in';\r\n\r\nexport interface PinOptions {\r\n until?: number;\r\n}\r\n\r\nexport class ChatSource extends SocketRPC implements ChatSourceBase {\r\n constructor(\r\n readonly backend: ChatBackend,\r\n readonly identifier: string,\r\n readonly parentIdentifier: string,\r\n options: ChatSourceOptions\r\n ) {\r\n super();\r\n this.options = options ?? {};\r\n this.ready = new Promise<void>(resolve => this.markReady = resolve);\r\n }\r\n\r\n private options: ChatSourceOptions;\r\n private subscription = new Subscription();\r\n private markReady: () => void;\r\n\r\n readonly = false;\r\n canLoadMore = true;\r\n\r\n ready: Promise<void>;\r\n\r\n permissions: ChatPermissions;\r\n private _state: 'connected' | 'connecting' | 'lost' | 'restored' = 'connecting';\r\n\r\n get sortOrder() {\r\n return this.options?.sortOrder;\r\n }\r\n\r\n get filterMode() {\r\n return this.options?.filterMode;\r\n }\r\n\r\n get state() {\r\n return this._state;\r\n }\r\n\r\n set state(value) {\r\n this._state = value;\r\n setTimeout(() => this._connectionStateChanged.next(this._state));\r\n }\r\n\r\n private _connectionStateChanged = new Subject<'connected' | 'connecting' | 'lost' | 'restored'>();\r\n private _connectionStateChanged$ = this._connectionStateChanged.asObservable();\r\n get connectionStateChanged() { return this._connectionStateChanged$; }\r\n\r\n private wasRestored = false;\r\n\r\n async bind(socket: DurableSocket): Promise<this> {\r\n super.bind(socket);\r\n\r\n this.subscription.add(this.backend.userChanged.subscribe(() => this.authenticate()));\r\n\r\n socket.addEventListener('open', async () => {\r\n console.log(`[Banta/${this.identifier}] Socket is open`);\r\n });\r\n\r\n socket.addEventListener('error', async () => {\r\n console.log(`[Banta/${this.identifier}] Socket error`);\r\n });\r\n\r\n socket.addEventListener('lost', async () => {\r\n this.state = 'lost';\r\n });\r\n\r\n socket.addEventListener('restore', async () => {\r\n this.wasRestored = true;\r\n await this.authenticate();\r\n await this.subscribeToTopic();\r\n });\r\n\r\n try {\r\n await this.subscribeToTopic();\r\n } catch (e) {\r\n console.error(`[Banta/ChatSource] Error during initial subscribeToTopic: ${e.message}`);\r\n }\r\n \r\n return this;\r\n }\r\n\r\n private mapOrUpdateMessages(messages: ChatMessage[]): ChatMessage[] {\r\n return messages.map(message => this.mapOrUpdateMessage(message));\r\n }\r\n\r\n private mapOrUpdateMessage(message: ChatMessage): ChatMessage {\r\n let existingMessage = this.messageMap.get(message.id);\r\n if (existingMessage) {\r\n message = Object.assign(existingMessage, message);\r\n } else {\r\n this.messageMap.set(message.id, message);\r\n this._messageObserved.next(message);\r\n }\r\n\r\n return message;\r\n }\r\n\r\n /**\r\n * Ask server for messages that have occurred since the message with the given ID.\r\n * This is used during brief reconnects to avoid dropping messages, while also not \r\n * causing mobbing as everyone reconnects after an issue. The backend can choose to \r\n * not service this request, instead returning undefined. In that case, the client \r\n * is expected to fetch the existing messages and start state anew.\r\n * \r\n * TODO: this is not yet used\r\n * \r\n * @param id \r\n * @returns \r\n */\r\n async loadSince(id: string): Promise<ChatMessage[]> {\r\n try {\r\n let messages = await this.idempotentPeer.loadSince(id);\r\n if (messages) {\r\n messages = this.mapOrUpdateMessages(messages);\r\n }\r\n\r\n return messages;\r\n } catch (e) {\r\n console.error(`[Banta/${this.identifier}] Error occurred while trying to get existing messages:`);\r\n console.error(e);\r\n return [];\r\n }\r\n }\r\n\r\n async getExistingMessages(): Promise<ChatMessage[]> {\r\n try {\r\n let messages = await this.idempotentPeer.getExistingMessages(this.options.initialMessageCount ?? 20);\r\n messages = this.mapOrUpdateMessages(messages);\r\n return messages;\r\n } catch (e) {\r\n console.error(`[Banta/${this.identifier}] Error occurred while trying to get existing messages:`);\r\n console.error(e);\r\n return [];\r\n }\r\n }\r\n \r\n async getPinnedMessages(): Promise<ChatMessage[]> {\r\n try {\r\n let messages = await this.idempotentPeer.getPinnedMessages();\r\n messages = this.mapOrUpdateMessages(messages);\r\n return messages;\r\n } catch (e) {\r\n console.error(`[Banta/${this.identifier}] Error occurred while trying to get pinned messages:`);\r\n console.error(e);\r\n return [];\r\n }\r\n }\r\n\r\n private async ensureConnection(errorMessage?: string) {\r\n // let reason = `Connection to chat services is not currently available.`;\r\n // if (this.state !== 'connected' && this.state !== 'restored') {\r\n // if (errorMessage)\r\n // throw new Error(`${errorMessage}: ${reason}`);\r\n // else\r\n // throw new Error(`${reason}`);\r\n // }\r\n }\r\n\r\n async editMessage(messageId: string, text: string): Promise<void> {\r\n await this.ensureConnection();\r\n await this.peer.editMessage(messageId, text);\r\n }\r\n\r\n private subscribeAttempt = 0;\r\n private _errorState: string;\r\n\r\n get errorState() {\r\n return this._errorState;\r\n }\r\n\r\n async subscribeToTopic() {\r\n try {\r\n await this.immediatePeer.subscribe(\r\n this.identifier, this.parentIdentifier, this.options.sortOrder, \r\n this.options.filterMode,\r\n this.options.metadata ?? {}\r\n );\r\n this.subscribeAttempt = 0;\r\n this._errorState = undefined;\r\n this.state = this.wasRestored ? 'restored' : 'connected';\r\n this.markReady();\r\n\r\n } catch (e) {\r\n console.error(`[Banta/${this.identifier}] Error while subscribing to topic`);\r\n console.error(e);\r\n\r\n this.state = 'lost';\r\n this._errorState = 'server-issue';\r\n\r\n this.subscribeAttempt += 1;\r\n let delay = Math.min(30*1000, (3*1000 * this.subscribeAttempt) * (1 + Math.random()));\r\n console.error(`[Banta/${this.identifier}] Waiting ${delay}ms before attempting to reconnect...`);\r\n\r\n setTimeout(() => {\r\n if (this.state === 'lost') {\r\n console.info(`Attempting reconnection after error in subscribeToTopic...`);\r\n this.reconnect();\r\n }\r\n }, delay);\r\n\r\n throw e;\r\n }\r\n }\r\n\r\n private _signInState: SignInState = 'signed-out';\r\n private _signInStateChanged = new BehaviorSubject<SignInState>(this._signInState);\r\n private _signInStateChanged$ = this._signInStateChanged.asObservable();\r\n\r\n get signInState() { return this._signInState; }\r\n get signInStateChanged() { return this._signInStateChanged$; }\r\n\r\n private setSignInState(state: SignInState) {\r\n this._signInState = state;\r\n this._signInStateChanged.next(state);\r\n }\r\n async authenticate() {\r\n this.setSignInState('signing-in');\r\n if (this.backend.user) {\r\n try {\r\n await this.immediatePeer.authenticate(this.backend.user?.token);\r\n this.setSignInState('signed-in');\r\n } catch (e) {\r\n console.error(`[Banta] Could not authenticate:`);\r\n console.error(e);\r\n this.setSignInState('signed-out');\r\n }\r\n }\r\n }\r\n\r\n close(): void {\r\n super.close();\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n @RpcEvent()\r\n onPermissions(permissions: ChatPermissions) {\r\n (window as any).bantaPermissionsDebug = permissions;\r\n this.permissions = permissions;\r\n }\r\n\r\n @RpcEvent()\r\n onChatMessage(message: ChatMessage) {\r\n if (this.messageMap.has(message.id)) {\r\n message = this.mapOrUpdateMessage(message);\r\n this._messageUpdated.next(message);\r\n } else if (!message.hidden) {\r\n // Only process non-hidden messages through here. \r\n // Hidden messages may be sent to us when they become hidden (ie moderation is occurring).\r\n // But if we never had the message to begin with, we should discard it.\r\n this.messageMap.set(message.id, message);\r\n this._messageReceived.next(message);\r\n }\r\n }\r\n\r\n private messageMap = new Map<string, ChatMessage>();\r\n private _messageReceived = new Subject<ChatMessage>();\r\n private _messageUpdated = new Subject<ChatMessage>();\r\n private _messageSent = new Subject<ChatMessage>();\r\n private _messageObserved = new Subject<ChatMessage>();\r\n\r\n get messageReceived() { return this._messageReceived.asObservable(); }\r\n get messageUpdated() { return this._messageUpdated.asObservable(); }\r\n get messageSent() { return this._messageSent.asObservable(); }\r\n get messageObserved() { return this._messageObserved.asObservable(); }\r\n\r\n messages: ChatMessage[] = [];\r\n\r\n async getServerInfo(): Promise<ServerInfo> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.getServerInfo();\r\n }\r\n\r\n async send(message: ChatMessage): Promise<ChatMessage> {\r\n await this.ensureConnection();\r\n message.id ??= uuid();\r\n let finishedMessage = await this.idempotentPeer.sendMessage(message);\r\n\r\n return finishedMessage;\r\n }\r\n\r\n async loadAfter(message: ChatMessage, count: number): Promise<ChatMessage[]> {\r\n if (!message)\r\n return;\r\n\r\n if (!message.pagingCursor)\r\n return [];\r\n \r\n return this.mapOrUpdateMessages(\r\n await this.idempotentPeer.loadAfter(Number(message.pagingCursor), count)\r\n );\r\n }\r\n\r\n async get(id: string): Promise<ChatMessage> {\r\n if (this.messageMap.has(id))\r\n return this.messageMap.get(id);\r\n \r\n await this.ensureConnection(`Could not get message`);\r\n let message = await this.idempotentPeer.getMessage(id);\r\n\r\n if (this.messageMap.has(id)) {\r\n let existingMessage = this.messageMap.get(id);\r\n Object.assign(existingMessage, message);\r\n message = existingMessage;\r\n } else {\r\n this.messageMap.set(id, message);\r\n }\r\n\r\n return message;\r\n }\r\n\r\n async getCount(): Promise<number> {\r\n return await this.idempotentPeer.getCount();\r\n }\r\n\r\n async likeMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.likeMessage(messageId);\r\n }\r\n\r\n async pinMessage(messageId: string, options?: PinOptions): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.pinMessage(messageId, options);\r\n }\r\n\r\n async unpinMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.unpinMessage(messageId);\r\n }\r\n\r\n\r\n async unlikeMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.unlikeMessage(messageId);\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n await this.ensureConnection();\r\n return await this.idempotentPeer.deleteMessage(messageId);\r\n }\r\n\r\n}","import { ChatMessage, ChatPermissions, CommentsOrder, FilterMode, ServerInfo } from \"@banta/common\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { ChatBackend } from \"./chat-backend\";\r\nimport { ChatSourceOptions } from \"./chat-backend-base\";\r\n\r\n/**\r\n * A special ChatSource which uses the REST API to load a limited number of chat messages, and does not support \r\n * sending/editing/deleting messages, liking/unliking, or loading more messages.\r\n * \r\n * This is used within Banta's SSR support.\r\n */\r\nexport class StaticChatSource implements ChatSourceBase {\r\n constructor(\r\n private backend: ChatBackend, \r\n readonly identifier: string,\r\n readonly parentIdentifier?: string,\r\n options?: ChatSourceOptions\r\n ) {\r\n \r\n this.sortOrder = options?.sortOrder ?? CommentsOrder.NEWEST;\r\n this.filterMode = options?.filterMode ?? FilterMode.ALL;\r\n this.initialMessageCount = options?.initialMessageCount ?? 100;\r\n }\r\n\r\n initialMessageCount: number;\r\n sortOrder: CommentsOrder;\r\n filterMode: FilterMode;\r\n permissions: ChatPermissions; // TODO\r\n\r\n ready = Promise.resolve(); // TODO: should we do more than this?\r\n readonly = true;\r\n canLoadMore = false;\r\n\r\n messageReceived = new Subject<ChatMessage>();\r\n messageObserved = new Subject<ChatMessage>();\r\n messageUpdated = new Subject<ChatMessage>();\r\n messageSent = new Subject<ChatMessage>();\r\n\r\n messages: ChatMessage[] = [];\r\n\r\n async getServerInfo(): Promise<ServerInfo> {\r\n return {\r\n service: '@banta/static-chat-source',\r\n connections: 0,\r\n originId: '',\r\n serverId: '',\r\n cache: {\r\n topicCount: 0,\r\n messageCount: 0,\r\n topics: {}\r\n }\r\n };\r\n }\r\n\r\n async send(message: ChatMessage): Promise<ChatMessage> {\r\n throw new Error(`Cannot send a message in this state.`);\r\n }\r\n\r\n close() {\r\n // no op\r\n }\r\n\r\n async getCount() {\r\n if (this.parentIdentifier) {\r\n // TODO: We need a getReplyCount or something\r\n return 0;\r\n }\r\n\r\n this.backend.getSourceCountForTopic(this.identifier);\r\n }\r\n \r\n async loadSince(id: string) {\r\n return undefined;\r\n }\r\n\r\n async getExistingMessages() {\r\n if (this.parentIdentifier) {\r\n return await this.backend.getReplies(this.parentIdentifier, this.sortOrder, this.filterMode, 0, this.initialMessageCount);\r\n } else {\r\n return await this.backend.getMessages(this.identifier, this.sortOrder, this.filterMode, 0, this.initialMessageCount);\r\n }\r\n }\r\n\r\n async getPinnedMessages(): Promise<ChatMessage[]> {\r\n if (this.parentIdentifier) {\r\n return await this.backend.getReplies(this.parentIdentifier, this.sortOrder, this.filterMode, 0, this.initialMessageCount, true);\r\n } else {\r\n return await this.backend.getMessages(this.identifier, this.sortOrder, this.filterMode, 0, this.initialMessageCount, true);\r\n }\r\n }\r\n\r\n async loadAfter(message: ChatMessage, count: number): Promise<ChatMessage[]> {\r\n return []; // no op\r\n }\r\n\r\n async get(id: string) {\r\n return await this.backend.getMessage(this.identifier, id);\r\n }\r\n\r\n async likeMessage(messageId: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n async unlikeMessage(messageId: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n pinMessage(messageId: string, options?: { until?: number; }): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n unpinMessage(messageId: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n async editMessage(messageId: string, text: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n async deleteMessage(messageId: string): Promise<void> {\r\n throw new Error(`Cannot perform this action in this state.`);\r\n }\r\n\r\n connectionStateChanged = new Subject<'connected' | 'connecting' | 'lost' | 'restored'>();\r\n state : 'connecting' | 'connected' | 'lost' | 'restored' = 'connected';\r\n\r\n get errorState() {\r\n return undefined;\r\n }\r\n}","import { inject, Inject, Injectable } from \"@angular/core\";\r\nimport { ChatMessage, CommentsOrder, DurableSocket, FilterMode, Notification, Topic, UrlCard, User, Vote, buildQuery } from \"@banta/common\";\r\nimport { Observable } from \"rxjs\";\r\nimport { ChatBackendBase, ChatSourceOptions } from \"./chat-backend-base\";\r\nimport { ChatSource } from \"./chat-source\";\r\nimport { ChatSourceBase } from \"./chat-source-base\";\r\nimport { BANTA_SDK_OPTIONS, SdkOptions } from \"./sdk-options\";\r\nimport { PLATFORM_ID } from \"@angular/core\";\r\nimport { isPlatformServer } from \"@angular/common\";\r\nimport { StaticChatSource } from \"./static-chat-source\";\r\nimport { v4 as uuid } from 'uuid';\r\n\r\n@Injectable()\r\nexport class ChatBackend extends ChatBackendBase {\r\n private options = inject(BANTA_SDK_OPTIONS);\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n runId = uuid();\r\n\r\n get serviceUrl() {\r\n return `${this.options?.serviceUrl ?? 'http://localhost:3422'}`;\r\n }\r\n\r\n private async connectToService() {\r\n let deviceId = uuid();\r\n if (typeof localStorage !== 'undefined') {\r\n if (localStorage['banta-chat:deviceId']) {\r\n deviceId = localStorage['banta-chat:deviceId'];\r\n } else {\r\n localStorage['banta-chat:deviceId'] = deviceId;\r\n }\r\n }\r\n\r\n let socket = new DurableSocket(`${this.serviceUrl.replace(/^http/, 'ws')}/socket`, undefined, `${deviceId},${this.runId}`);\r\n await new Promise<void>((resolve, reject) => {\r\n socket.onopen = () => {\r\n resolve();\r\n }\r\n\r\n socket.onclose = e => {\r\n if (e.code === 503) {\r\n console.error(`Failed to connect to chat service!`);\r\n reject(e);\r\n }\r\n }\r\n });\r\n\r\n socket.onerror = undefined;\r\n\r\n return socket;\r\n }\r\n\r\n private isServer() {\r\n if (typeof localStorage !== 'undefined' && localStorage['banta:debug:useStaticSource'] === '1')\r\n return true;\r\n\r\n return isPlatformServer(this.platformId);\r\n }\r\n\r\n /**\r\n * Check if we are currently running inside a Googlebot user agent or via the Google inspection tool in Search Console.\r\n * We'll use this to avoid WebSockets so that comments can be indexable.\r\n * @returns \r\n */\r\n private isGooglebot() {\r\n return typeof navigator !== 'undefined' && (\r\n navigator.userAgent.includes('Googlebot')\r\n || navigator.userAgent.includes('Google-InspectionTool')\r\n );\r\n }\r\n\r\n async getSourceForTopic(topicId: string, options?: ChatSourceOptions): Promise<ChatSourceBase> {\r\n // In some cases we need to do a single REST request to fetch the messages \r\n // and not use Banta's socket RPC since the open ended lifetime of a WebSocket connection \r\n // does not match the use case.\r\n // - When running in SSR\r\n // - When running in Googlebot (Googlebot also doesn't support WebSockets anyway)\r\n\r\n if (this.isServer() || this.isGooglebot()) {\r\n return new StaticChatSource(this, topicId, undefined, options);\r\n } else {\r\n return await new ChatSource(this, topicId, undefined, { sortOrder: CommentsOrder.NEWEST, filterMode: FilterMode.ALL, ...options })\r\n .bind(await this.connectToService());\r\n }\r\n }\r\n\r\n async getSourceForThread(topicId: string, messageId: string, options?: ChatSourceOptions): Promise<ChatSourceBase> {\r\n // When running on the server platform, we're just going to do a single REST request to fetch the messages \r\n // and not use Banta's socket RPC.\r\n \r\n if (this.isServer()) {\r\n return new StaticChatSource(this, topicId, messageId, options);\r\n } else {\r\n return await new ChatSource(this, topicId, messageId, { sortOrder: CommentsOrder.NEWEST, filterMode: FilterMode.ALL, ...options })\r\n .bind(await this.connectToService());\r\n }\r\n }\r\n\r\n /**\r\n * Get the count of the given topic\r\n * @param topicId \r\n * @returns \r\n */\r\n async getSourceCountForTopic(topicId: string): Promise<number> {\r\n try {\r\n let topic = await this.getTopic(topicId);\r\n return topic?.messageCount ?? 0;\r\n } catch (e) {\r\n console.error(`[Banta/${topicId}] Failed to get message count for topic:`);\r\n console.error(e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Get the count of the given topics. \r\n * @param topicId Topics to count messages on. Maximum of 1000.\r\n * @returns \r\n */\r\n async getSourceCountForTopics(topicIds: string[]): Promise<Record<string, number>> {\r\n try {\r\n let topics = await this.getTopicsById(topicIds);\r\n return Object.fromEntries(topics.map(topic => [ topic.id, topic.messageCount ?? 0 ]));\r\n } catch (e) {\r\n console.error(`[Banta/Topics] Failed to get message count for topics '${topicIds.join(',')}]':`);\r\n console.error(e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Get information about the given topic. \r\n * @param topicId \r\n * @returns The topic object, or undefined if no such topic was found.\r\n */\r\n async getTopic(topicId: string): Promise<Topic | undefined> {\r\n let response = await fetch(`${this.serviceUrl}/topics/${topicId}`)\r\n if (response.status === 404)\r\n return undefined;\r\n if (response.status >= 400)\r\n throw new Error(`Failed to fetch topic: ${response.status}`)\r\n\r\n return <Topic> await response.json();\r\n }\r\n\r\n /**\r\n * Get information about the given topics\r\n * @param topicIds The topic IDs to look up. Maximum of 1000.\r\n * @returns An array of matching topic objects.\r\n */\r\n async getTopicsById(topicIds: string[]): Promise<Topic[]> {\r\n if (topicIds.length > 1000)\r\n throw new Error(`Cannot look up more than 1000 topics at a time.`);\r\n\r\n let response = await fetch(`${this.serviceUrl}/topics?ids=${encodeURIComponent(topicIds.join(','))}`)\r\n if (response.status >= 400)\r\n throw new Error(`Failed to fetch topic: ${response.status}`)\r\n\r\n return <Topic[]> await response.json();\r\n }\r\n\r\n /**\r\n * Get a set of messages from the given topic.\r\n * @param topicId \r\n * @returns \r\n */\r\n async getMessages(\r\n topicId: string, \r\n sort?: CommentsOrder, \r\n filter?: FilterMode, \r\n offset?: number, \r\n limit?: number,\r\n pinned?: boolean\r\n ): Promise<ChatMessage[]> {\r\n let response = await fetch(\r\n `${this.serviceUrl}/topics/${topicId}/messages?${ buildQuery({ sort, filter, offset, limit, pinned }) }`\r\n );\r\n\r\n if (response.status >= 400)\r\n throw new Error(`Failed to fetch messages for topic: ${response.status}`)\r\n\r\n return <ChatMessage[]> await response.json();\r\n }\r\n\r\n /**\r\n * Get a set of messages from the given topic.\r\n * @param topicId \r\n * @returns \r\n */\r\n async getReplies(\r\n parentMessageId: string,\r\n sort?: CommentsOrder, \r\n filter?: FilterMode, \r\n offset?: number, \r\n limit?: number,\r\n pinned?: boolean\r\n ): Promise<ChatMessage[]> {\r\n let response = await fetch(\r\n `${this.serviceUrl}/messages/${parentMessageId}/replies?${ buildQuery({ sort, filter, offset, limit, pinned }) }`\r\n );\r\n\r\n if (response.status >= 400)\r\n throw new Error(`Failed to fetch replies: ${response.status}`)\r\n\r\n return <ChatMessage[]> await response.json();\r\n }\r\n\r\n refreshMessage(message: ChatMessage): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n \r\n getMessage(topicId: string, messageId: string): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n getSubMessage(topicId: string, parentMessageId: string, messageId: string): Promise<ChatMessage> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n watchMessage(message: ChatMessage, handler: (message: ChatMessage) => void): () => void {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n notificationsChanged: Observable<Notification[]>;\r\n newNotification: Observable<Notification>;\r\n \r\n async getCardForUrl(url: string): Promise<UrlCard> {\r\n let response = await fetch(`${this.serviceUrl}/urls`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({\r\n url\r\n })\r\n });\r\n\r\n if (response.status == 404)\r\n return null;\r\n \r\n if (response.status >= 400)\r\n throw new Error(`Failed to retrieve URL card: ${response.status}. Body: '${await response.text()}'`);\r\n\r\n return await response.json();\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver, AttachmentScraper } from \"./attachment-scraper\";\r\nimport { ChatBackendBase } from \"./chat-backend-base\";\r\n\r\nconst URL_REGEX = new RegExp('(?!mailto:)(?:(?:http|https|ftp)://)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?', 'ig');\r\n\r\nexport class UrlAttachmentScraper implements AttachmentScraper {\r\n findFragments(message: ChatMessage): AttachmentFragment[] {\r\n // If a message already has a URL attachment, don't add another one.\r\n if (message.attachments && message.attachments.filter(x => x.type === 'url').length > 0)\r\n return null;\r\n\r\n return (Array.from(message.message.match(URL_REGEX) ?? []))\r\n .reduce((a, item) => (a.includes(item) ? undefined : a.push(item), a), [])\r\n .map(url => ({\r\n text: url, \r\n offset: message.message.indexOf(url),\r\n type: 'url'\r\n }))\r\n ;\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class UrlAttachmentResolver implements AttachmentResolver {\r\n constructor(private backend: ChatBackendBase) {\r\n }\r\n\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type !== 'url')\r\n return null;\r\n\r\n let urlCard = await this.backend.getCardForUrl(fragment.text);\r\n if (urlCard) {\r\n return {\r\n type: 'card',\r\n url: fragment.text,\r\n card: urlCard,\r\n style: 'block'\r\n }\r\n }\r\n }\r\n\r\n}","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class YouTubeAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type !== 'url')\r\n return null;\r\n\r\n let videoId: string;\r\n\r\n // https://youtu.be/jXzJ7FlqX6M\r\n\r\n if (fragment.text.match(/^https:\\/\\/youtu\\.be\\//)) {\r\n let match = /^https:\\/\\/youtu\\.be\\/([^\\/]+)/.exec(fragment.text);\r\n if (match) {\r\n videoId = match[1];\r\n }\r\n }\r\n\r\n if (!videoId && fragment.text.match(/^https?:\\/\\/(www\\.|m\\.)?youtube.com\\/watch\\?v=/)) {\r\n let match = /watch\\?v=([^&]+)/.exec(fragment.text);\r\n if (match) {\r\n videoId = match[1];\r\n }\r\n }\r\n\r\n if (videoId) {\r\n return {\r\n type: 'iframe',\r\n url: `https://www.youtube.com/embed/${videoId}`,\r\n style: 'block'\r\n };\r\n }\r\n return null;\r\n }\r\n}\r\n","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class GiphyAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type === 'url' && fragment.text.startsWith('https://giphy.com/gifs')) {\r\n let gifId = /[^-\\/]+$/.exec(fragment.text)?.toString();\r\n if (!gifId)\r\n return null;\r\n\r\n return {\r\n type: 'iframe',\r\n url: `https://giphy.com/embed/${gifId}`,\r\n style: 'inline'\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n}","import { ChatMessage, ChatMessageAttachment } from \"@banta/common\";\r\nimport { AttachmentFragment, AttachmentResolver } from \"./attachment-scraper\";\r\n\r\nexport class TweetAttachmentResolver implements AttachmentResolver {\r\n async resolveFragment(message: ChatMessage, fragment: AttachmentFragment): Promise<ChatMessageAttachment> {\r\n if (fragment.type === 'url' && (fragment.text.startsWith('https://twitter.com/') || fragment.text.startsWith('https://x.com/'))) {\r\n return {\r\n type: 'tweet',\r\n url: fragment.text,\r\n style: 'block'\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n}","import { inject, ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { CommentsModule } from './comments';\r\nimport { ChatModule } from './chat';\r\nimport { EmojiModule } from './emoji';\r\nimport { BantaComponent } from './banta/banta.component';\r\nimport { BantaLogoComponent } from './banta-logo.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { BantaCommonModule } from './common/common.module';\r\nimport { LiveMessageComponent } from './live-message.component';\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { MatMenuModule } from \"@angular/material/menu\";\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatSnackBarModule } from \"@angular/material/snack-bar\";\r\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\r\nimport { ChatBackend } from './chat-backend';\r\nimport { SdkOptions } from './sdk-options';\r\nimport { BANTA_SDK_OPTIONS } from './sdk-options';\r\nimport { ChatBackendBase } from './chat-backend-base';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { UrlAttachmentResolver, UrlAttachmentScraper } from './url-attachments';\r\nimport { YouTubeAttachmentResolver } from './youtube-attachments';\r\nimport { GiphyAttachmentResolver } from './giphy-attachments';\r\nimport { TweetAttachmentResolver } from './tweet-attachments';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n BantaCommonModule.forRoot(),\r\n CommentsModule,\r\n ChatModule,\r\n EmojiModule,\r\n \r\n MatIconModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n MatMenuModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatProgressSpinnerModule,\r\n MatSnackBarModule,\r\n OverlayModule,\r\n PortalModule\r\n ],\r\n declarations: [\r\n BantaComponent,\r\n BantaLogoComponent,\r\n LiveMessageComponent\r\n ],\r\n exports: [\r\n BantaComponent,\r\n BantaLogoComponent,\r\n LiveMessageComponent,\r\n BantaCommonModule,\r\n ChatModule,\r\n CommentsModule,\r\n EmojiModule\r\n ]\r\n})\r\nexport class BantaSdkModule {\r\n chatBackend = inject(ChatBackendBase);\r\n\r\n constructor() {\r\n this.chatBackend.registerAttachmentScraper(new UrlAttachmentScraper());\r\n this.chatBackend.registerAttachmentResolver(new GiphyAttachmentResolver());\r\n this.chatBackend.registerAttachmentResolver(new YouTubeAttachmentResolver());\r\n this.chatBackend.registerAttachmentResolver(new TweetAttachmentResolver());\r\n this.chatBackend.registerAttachmentResolver(new UrlAttachmentResolver(this.chatBackend));\r\n }\r\n \r\n static configure(options?: SdkOptions): ModuleWithProviders<BantaSdkModule> {\r\n return {\r\n ngModule: BantaSdkModule,\r\n providers: [\r\n { \r\n provide: BANTA_SDK_OPTIONS, \r\n useValue: options || {}\r\n },\r\n { provide: ChatBackendBase, useClass: options?.backendClass ?? ChatBackend }\r\n ]\r\n }\r\n }\r\n}","/*\n * Public API Surface of sdk\n */\n\nexport * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TimerPool","i1","i2","i3","i4","i5.BantaTrustResourceUrlPipe","i1.LightboxComponent","i2.BantaAttachmentComponent","COMPONENTS","i5.EmojiSelectorPanelComponent","i5","i6","i7","i9.TimestampComponent","i10.BantaAttachmentsComponent","i14","i15.BantaMarkdownToHtmlPipe","i16.BantaMentionLinkerPipe","i1.ChatBackendBase","i7.CommentComponent","i9.BantaAttachmentsComponent","i10.EmojiSelectorButtonComponent","i12.AttachmentButtonComponent","i13.AttachmentScraperDirective","i9","i10.CommentComponent","i11.CommentViewComponent","i12.CommentFieldComponent","i13.BantaInlineRepliesDirective","i2.ChatMessageComponent","i5.EmojiSelectorButtonComponent","i6.ChatViewComponent","i2.CommentComponent","i1.LiveCommentComponent","i2.LiveChatMessageComponent","i4.TimestampComponent","i5.CommentComponent","i6.CommentViewComponent","i7.BantaCommentsComponent","i8.BantaChatComponent","i10","i11","i12.LiveMessageComponent","uuid","Injectable"],"mappings":"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"}
|