@banta/sdk 5.2.5 → 5.4.0
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/{esm2022 → esm2020}/banta-sdk.mjs +4 -4
- package/{esm2022 → esm2020}/lib/attachment-scraper.mjs +1 -1
- package/esm2020/lib/banta/banta.component.mjs +204 -0
- package/{esm2022 → esm2020}/lib/banta-logo.component.mjs +11 -11
- package/{esm2022 → esm2020}/lib/banta-sdk.module.mjs +135 -135
- package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +209 -0
- package/esm2020/lib/chat/chat-message/chat-message.component.mjs +62 -0
- package/esm2020/lib/chat/chat-view/chat-view.component.mjs +170 -0
- package/{esm2022 → esm2020}/lib/chat/chat.module.mjs +51 -51
- package/{esm2022 → esm2020}/lib/chat/index.mjs +5 -5
- package/esm2020/lib/chat/live-chat-message.component.mjs +80 -0
- package/esm2020/lib/chat-backend-base.mjs +31 -0
- package/esm2020/lib/chat-backend.mjs +194 -0
- package/{esm2022 → esm2020}/lib/chat-source-base.mjs +1 -1
- package/esm2020/lib/chat-source.mjs +233 -0
- package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +76 -0
- package/esm2020/lib/comments/attachment-scraper.directive.mjs +107 -0
- package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +749 -0
- package/esm2020/lib/comments/comment/comment.component.mjs +175 -0
- package/esm2020/lib/comments/comment-field/comment-field.component.mjs +401 -0
- package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
- package/esm2020/lib/comments/comment-view/comment-view.component.mjs +470 -0
- package/{esm2022 → esm2020}/lib/comments/comments.module.mjs +111 -111
- package/{esm2022 → esm2020}/lib/comments/index.mjs +10 -10
- package/esm2020/lib/comments/live-comment.component.mjs +80 -0
- package/{esm2022 → esm2020}/lib/comments/reply-send-options.directive.mjs +13 -13
- package/esm2020/lib/common/attachment/attachment.component.mjs +128 -0
- package/{esm2022 → esm2020}/lib/common/attachments/attachments.component.mjs +75 -75
- package/{esm2022 → esm2020}/lib/common/common.module.mjs +68 -68
- package/{esm2022 → esm2020}/lib/common/index.mjs +10 -10
- package/{esm2022 → esm2020}/lib/common/lazy-connection.mjs +14 -14
- package/esm2020/lib/common/lightbox/lightbox.component.mjs +31 -0
- package/esm2020/lib/common/markdown-to-html.pipe.mjs +88 -0
- package/esm2020/lib/common/mention-linker.pipe.mjs +35 -0
- package/esm2020/lib/common/timer-pool.service.mjs +83 -0
- package/esm2020/lib/common/timestamp.component.mjs +123 -0
- package/{esm2022 → esm2020}/lib/common/trust-resource-url.pipe.mjs +22 -22
- package/esm2020/lib/emoji/emoji-selector-button.component.mjs +116 -0
- package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +98 -0
- package/{esm2022 → esm2020}/lib/emoji/emoji.module.mjs +55 -55
- package/{esm2022 → esm2020}/lib/emoji/emojis.mjs +6507 -6507
- package/{esm2022 → esm2020}/lib/emoji/index.mjs +4 -4
- package/esm2020/lib/giphy-attachments.mjs +16 -0
- package/{esm2022 → esm2020}/lib/index.mjs +19 -19
- package/{esm2022 → esm2020}/lib/live-message.component.mjs +61 -61
- package/{esm2022 → esm2020}/lib/message-menu-item.mjs +1 -1
- package/{esm2022 → esm2020}/lib/sdk-options.mjs +1 -1
- package/esm2020/lib/static-chat-source.mjs +71 -0
- package/esm2020/lib/tweet-attachments.mjs +13 -0
- package/esm2020/lib/url-attachments.mjs +42 -0
- package/esm2020/lib/youtube-attachments.mjs +29 -0
- package/{esm2022 → esm2020}/public-api.mjs +4 -4
- package/fesm2015/banta-sdk.mjs +11258 -0
- package/fesm2015/banta-sdk.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/banta-sdk.mjs +10823 -10782
- package/fesm2020/banta-sdk.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/attachment-scraper.d.ts +15 -15
- package/lib/banta/banta.component.d.ts +58 -58
- package/lib/banta-logo.component.d.ts +5 -5
- package/lib/banta-sdk.module.d.ts +31 -31
- package/lib/chat/banta-chat/banta-chat.component.d.ts +79 -70
- package/lib/chat/chat-message/chat-message.component.d.ts +21 -21
- package/lib/chat/chat-view/chat-view.component.d.ts +52 -52
- package/lib/chat/chat.module.d.ts +15 -15
- package/lib/chat/index.d.ts +5 -5
- package/lib/chat/live-chat-message.component.d.ts +23 -23
- package/lib/chat-backend-base.d.ts +72 -71
- package/lib/chat-backend.d.ts +67 -67
- package/lib/chat-source-base.d.ts +44 -44
- package/lib/chat-source.d.ts +65 -65
- package/lib/comments/attachment-button/attachment-button.component.d.ts +17 -17
- package/lib/comments/attachment-scraper.directive.d.ts +21 -21
- package/lib/comments/banta-comments/banta-comments.component.d.ts +203 -196
- package/lib/comments/comment/comment.component.d.ts +72 -72
- package/lib/comments/comment-field/comment-field.component.d.ts +89 -89
- package/lib/comments/comment-sort/comment-sort.component.d.ts +16 -16
- package/lib/comments/comment-view/comment-view.component.d.ts +121 -121
- package/lib/comments/comments.module.d.ts +30 -30
- package/lib/comments/index.d.ts +10 -10
- package/lib/comments/live-comment.component.d.ts +23 -23
- package/lib/comments/reply-send-options.directive.d.ts +5 -5
- package/lib/common/attachment/attachment.component.d.ts +34 -34
- package/lib/common/attachments/attachments.component.d.ts +26 -26
- package/lib/common/common.module.d.ts +19 -19
- package/lib/common/index.d.ts +10 -10
- package/lib/common/lazy-connection.d.ts +6 -6
- package/lib/common/lightbox/lightbox.component.d.ts +14 -14
- package/lib/common/markdown-to-html.pipe.d.ts +15 -15
- package/lib/common/mention-linker.pipe.d.ts +13 -13
- package/lib/common/timer-pool.service.d.ts +15 -15
- package/lib/common/timestamp.component.d.ts +19 -19
- package/lib/common/trust-resource-url.pipe.d.ts +10 -10
- package/lib/emoji/emoji-selector-button.component.d.ts +30 -30
- package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +26 -26
- package/lib/emoji/emoji.module.d.ts +16 -16
- package/lib/emoji/emojis.d.ts +6507 -6507
- package/lib/emoji/index.d.ts +4 -4
- package/lib/giphy-attachments.d.ts +5 -5
- package/lib/index.d.ts +19 -19
- package/lib/live-message.component.d.ts +22 -22
- package/lib/message-menu-item.d.ts +6 -6
- package/lib/sdk-options.d.ts +5 -5
- package/lib/static-chat-source.d.ts +42 -42
- package/lib/tweet-attachments.d.ts +5 -5
- package/lib/url-attachments.d.ts +14 -14
- package/lib/youtube-attachments.d.ts +5 -5
- package/package.json +11 -5
- package/public-api.d.ts +1 -1
- package/esm2022/lib/banta/banta.component.mjs +0 -204
- package/esm2022/lib/chat/banta-chat/banta-chat.component.mjs +0 -187
- package/esm2022/lib/chat/chat-message/chat-message.component.mjs +0 -62
- package/esm2022/lib/chat/chat-view/chat-view.component.mjs +0 -170
- package/esm2022/lib/chat/live-chat-message.component.mjs +0 -80
- package/esm2022/lib/chat-backend-base.mjs +0 -31
- package/esm2022/lib/chat-backend.mjs +0 -194
- package/esm2022/lib/chat-source.mjs +0 -233
- package/esm2022/lib/comments/attachment-button/attachment-button.component.mjs +0 -76
- package/esm2022/lib/comments/attachment-scraper.directive.mjs +0 -107
- package/esm2022/lib/comments/banta-comments/banta-comments.component.mjs +0 -730
- package/esm2022/lib/comments/comment/comment.component.mjs +0 -175
- package/esm2022/lib/comments/comment-field/comment-field.component.mjs +0 -401
- package/esm2022/lib/comments/comment-sort/comment-sort.component.mjs +0 -37
- package/esm2022/lib/comments/comment-view/comment-view.component.mjs +0 -470
- package/esm2022/lib/comments/live-comment.component.mjs +0 -80
- package/esm2022/lib/common/attachment/attachment.component.mjs +0 -128
- package/esm2022/lib/common/lightbox/lightbox.component.mjs +0 -31
- package/esm2022/lib/common/markdown-to-html.pipe.mjs +0 -88
- package/esm2022/lib/common/mention-linker.pipe.mjs +0 -35
- package/esm2022/lib/common/timer-pool.service.mjs +0 -83
- package/esm2022/lib/common/timestamp.component.mjs +0 -123
- package/esm2022/lib/emoji/emoji-selector-button.component.mjs +0 -115
- package/esm2022/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +0 -98
- package/esm2022/lib/giphy-attachments.mjs +0 -16
- package/esm2022/lib/static-chat-source.mjs +0 -71
- package/esm2022/lib/tweet-attachments.mjs +0 -13
- package/esm2022/lib/url-attachments.mjs +0 -42
- package/esm2022/lib/youtube-attachments.mjs +0 -29
- package/fesm2022/banta-sdk.mjs.map +0 -1
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, Output, HostBinding, ViewChildren } from "@angular/core";
|
|
2
|
+
import { CommentsOrder, FilterMode } from '@banta/common';
|
|
3
|
+
import { Subject, Subscription } from 'rxjs';
|
|
4
|
+
import { CommentComponent } from "../comment/comment.component";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../chat-backend-base";
|
|
7
|
+
import * as i2 from "@angular/common";
|
|
8
|
+
import * as i3 from "@angular/material/icon";
|
|
9
|
+
import * as i4 from "@angular/material/button";
|
|
10
|
+
import * as i5 from "@angular/material/progress-spinner";
|
|
11
|
+
import * as i6 from "../comment/comment.component";
|
|
12
|
+
export class CommentViewComponent {
|
|
13
|
+
constructor(backend, elementRef) {
|
|
14
|
+
this.backend = backend;
|
|
15
|
+
this.elementRef = elementRef;
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region Fields
|
|
18
|
+
this._sourceSubs = new Subscription();
|
|
19
|
+
this.menuMessage = null;
|
|
20
|
+
this.messages = [];
|
|
21
|
+
this.customSortEnabled = false;
|
|
22
|
+
this.sourceLoaded = new Promise(r => this.markSourceLoaded = r);
|
|
23
|
+
this.isViewingMore = false;
|
|
24
|
+
this.isLoadingMore = false;
|
|
25
|
+
this.hasMore = false;
|
|
26
|
+
this.newMessages = [];
|
|
27
|
+
this.olderMessages = [];
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region Inputs
|
|
30
|
+
this.maxMessages = 2000;
|
|
31
|
+
this.maxVisibleMessages = 200;
|
|
32
|
+
this.newestLast = false;
|
|
33
|
+
this.holdNewMessages = false;
|
|
34
|
+
this.showEmptyState = true;
|
|
35
|
+
this.allowReplies = true;
|
|
36
|
+
this.enableHoldOnClick = false;
|
|
37
|
+
this.enableHoldOnScroll = true;
|
|
38
|
+
this.customMenuItems = [];
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region Outputs
|
|
41
|
+
this._selected = new Subject();
|
|
42
|
+
this._liked = new Subject();
|
|
43
|
+
this._unliked = new Subject();
|
|
44
|
+
this._reported = new Subject();
|
|
45
|
+
this._userSelected = new Subject();
|
|
46
|
+
this._usernameSelected = new Subject();
|
|
47
|
+
this._avatarSelected = new Subject();
|
|
48
|
+
this._shared = new Subject();
|
|
49
|
+
this._deleted = new Subject();
|
|
50
|
+
this._messageEdited = new Subject();
|
|
51
|
+
this._sortOrderChanged = new Subject();
|
|
52
|
+
this._filterModeChanged = new Subject();
|
|
53
|
+
this.userSelected = this._userSelected.asObservable();
|
|
54
|
+
this.reported = this._reported.asObservable();
|
|
55
|
+
this.liked = this._liked.asObservable();
|
|
56
|
+
this.unliked = this._unliked.asObservable();
|
|
57
|
+
this.usernameSelected = this._usernameSelected.asObservable();
|
|
58
|
+
this.avatarSelected = this._avatarSelected.asObservable();
|
|
59
|
+
this.shared = this._shared.asObservable();
|
|
60
|
+
this.deleted = this._deleted.asObservable();
|
|
61
|
+
this.selected = this._selected.asObservable();
|
|
62
|
+
this.messageEdited = this._messageEdited.asObservable();
|
|
63
|
+
this.sortOrderChanged = this._sortOrderChanged.asObservable();
|
|
64
|
+
this.filterModeChanged = this._filterModeChanged.asObservable();
|
|
65
|
+
}
|
|
66
|
+
get source() { return this._source; }
|
|
67
|
+
set source(value) { this.setSource(value); }
|
|
68
|
+
get comments() { return Array.from(this.commentsQuery); }
|
|
69
|
+
//#endregion
|
|
70
|
+
/**
|
|
71
|
+
* Returns true if this message can be found within one of the message buffers (older, current, newer)
|
|
72
|
+
* @param message
|
|
73
|
+
*/
|
|
74
|
+
isMessageLoadedInContext(message) {
|
|
75
|
+
return this.olderMessages.find(x => x.id === message.id)
|
|
76
|
+
|| this.messages.find(x => x.id === message.id)
|
|
77
|
+
|| this.newMessages.find(x => x.id === message.id);
|
|
78
|
+
}
|
|
79
|
+
async loadMessageInContext(message) {
|
|
80
|
+
await this.sourceLoaded;
|
|
81
|
+
console.log(`Loading message ${message.id} in context...`);
|
|
82
|
+
while (this.hasMore && !this.isMessageLoadedInContext(message)) {
|
|
83
|
+
console.log(`...Need to load more comments to find ${message.id}`);
|
|
84
|
+
await this.showMore();
|
|
85
|
+
}
|
|
86
|
+
if (!this.isMessageLoadedInContext(message)) {
|
|
87
|
+
console.error(`Error while loading message in context: Failed to find message ${message.id}, maybe it was deleted!`);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
let pageSize = this.maxVisibleMessages;
|
|
91
|
+
let items = [].concat(this.olderMessages, this.messages, this.newMessages);
|
|
92
|
+
let index = items.findIndex(x => x.id === message.id);
|
|
93
|
+
if (index < 0) {
|
|
94
|
+
console.error(`Error while loading message in context: Message was not present in message list!`);
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
let startIndex = Math.max(0, index - pageSize / 2);
|
|
98
|
+
this.newMessages = items.splice(0, startIndex);
|
|
99
|
+
this.messages = items.splice(0, pageSize);
|
|
100
|
+
this.olderMessages = items;
|
|
101
|
+
this.isViewingMore = true;
|
|
102
|
+
}
|
|
103
|
+
get shouldShowNewMessageIndicator() {
|
|
104
|
+
return this.isViewingMore
|
|
105
|
+
|| this.customSortEnabled
|
|
106
|
+
|| this.source.filterMode !== FilterMode.ALL
|
|
107
|
+
|| this.newMessages.length > 0;
|
|
108
|
+
}
|
|
109
|
+
get shouldHoldNewMessages() {
|
|
110
|
+
if (this.holdNewMessages || this.isViewingMore) {
|
|
111
|
+
console.log(`holding due to settings`);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
if (this.enableHoldOnScroll) {
|
|
115
|
+
let keyMessage;
|
|
116
|
+
if (this.newestLast)
|
|
117
|
+
keyMessage = this.messages[this.messages.length - 1];
|
|
118
|
+
else
|
|
119
|
+
keyMessage = this.messages[0];
|
|
120
|
+
if (keyMessage) {
|
|
121
|
+
const messageElement = this.getElementForComment(keyMessage.id);
|
|
122
|
+
if (messageElement) {
|
|
123
|
+
if (!this.isElementVisible(messageElement)) {
|
|
124
|
+
console.log(`key element is not visible`);
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
console.log(`key element is visible`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
console.log(`could not find key element`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log(`could not find key message`);
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
isElementVisible(element) {
|
|
143
|
+
const elementRect = element.getBoundingClientRect();
|
|
144
|
+
return !!elementRect
|
|
145
|
+
&& elementRect.bottom >= 0
|
|
146
|
+
&& elementRect.right >= 0
|
|
147
|
+
&& elementRect.left <= document.documentElement.clientWidth
|
|
148
|
+
&& elementRect.top <= document.documentElement.clientHeight;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get the CommentComponent instantiated for the given ChatMessage,
|
|
152
|
+
* if it exists in the current view. Note that messages which are not
|
|
153
|
+
* currently shown to the user will not return a CommentComponent.
|
|
154
|
+
* @param message
|
|
155
|
+
* @returns
|
|
156
|
+
*/
|
|
157
|
+
getCommentComponentForMessage(message) {
|
|
158
|
+
if (!message)
|
|
159
|
+
throw new Error(`You must pass a valid ChatMessage`);
|
|
160
|
+
return this.comments.find(x => x.message?.id === message.id);
|
|
161
|
+
}
|
|
162
|
+
saveEdit(message, newMessage) {
|
|
163
|
+
this._messageEdited.next({ message, newMessage });
|
|
164
|
+
}
|
|
165
|
+
likeMessage(message) {
|
|
166
|
+
this._liked.next(message);
|
|
167
|
+
}
|
|
168
|
+
unlikeMessage(message) {
|
|
169
|
+
this._unliked.next(message);
|
|
170
|
+
}
|
|
171
|
+
reportMessage(message) {
|
|
172
|
+
this._reported.next(message);
|
|
173
|
+
}
|
|
174
|
+
selectMessage(message) {
|
|
175
|
+
this._selected.next(message);
|
|
176
|
+
}
|
|
177
|
+
selectMessageUser(message) {
|
|
178
|
+
this._userSelected.next(message);
|
|
179
|
+
}
|
|
180
|
+
selectUsername(user) {
|
|
181
|
+
this._usernameSelected.next(user);
|
|
182
|
+
}
|
|
183
|
+
selectAvatar(user) {
|
|
184
|
+
this._avatarSelected.next(user);
|
|
185
|
+
}
|
|
186
|
+
sharedMessage(message) {
|
|
187
|
+
this._shared.next(message);
|
|
188
|
+
}
|
|
189
|
+
startEditing(message) {
|
|
190
|
+
this.messages.forEach(m => m.transientState.editing = false);
|
|
191
|
+
message.transientState.editing = true;
|
|
192
|
+
}
|
|
193
|
+
deleteMessage(message) {
|
|
194
|
+
this._deleted.next(message);
|
|
195
|
+
}
|
|
196
|
+
setSource(value) {
|
|
197
|
+
this.customSortEnabled = value?.sortOrder !== CommentsOrder.NEWEST;
|
|
198
|
+
this.newMessages = [];
|
|
199
|
+
this.olderMessages = [];
|
|
200
|
+
window.bantaSourceDebug = value;
|
|
201
|
+
if (this._sourceSubs) {
|
|
202
|
+
this._sourceSubs.unsubscribe();
|
|
203
|
+
this._sourceSubs = null;
|
|
204
|
+
}
|
|
205
|
+
this._source = value;
|
|
206
|
+
if (value) {
|
|
207
|
+
const messages = (value.messages || []).slice();
|
|
208
|
+
this.messages = messages;
|
|
209
|
+
this.olderMessages = messages.splice(this.maxVisibleMessages, messages.length);
|
|
210
|
+
this.hasMore = true; //this.olderMessages.length > 0;
|
|
211
|
+
this._sourceSubs = new Subscription();
|
|
212
|
+
this._sourceSubs.add(this._source.messageReceived.subscribe(msg => this.messageReceived(msg)));
|
|
213
|
+
this._sourceSubs.add(this._source.messageSent.subscribe(msg => this.messageSent(msg)));
|
|
214
|
+
this._sourceSubs.add(this.backend.userChanged.subscribe(user => this.currentUser = user));
|
|
215
|
+
this.getInitialMessages();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async getInitialMessages() {
|
|
219
|
+
let messages = (await this._source.getExistingMessages());
|
|
220
|
+
messages.forEach(m => m.transientState ?? (m.transientState = {}));
|
|
221
|
+
this.messages = this.newestLast ? messages.slice().reverse() : messages;
|
|
222
|
+
this.sortMessages();
|
|
223
|
+
if (this.markSourceLoaded)
|
|
224
|
+
this.markSourceLoaded();
|
|
225
|
+
}
|
|
226
|
+
messageIdentity(index, chatMessage) {
|
|
227
|
+
return chatMessage.id;
|
|
228
|
+
}
|
|
229
|
+
async showNew(event) {
|
|
230
|
+
let naturalOrder = CommentsOrder.NEWEST;
|
|
231
|
+
if (this.source && (this.source.sortOrder !== naturalOrder || this.source.filterMode !== FilterMode.ALL)) {
|
|
232
|
+
if (this.source.sortOrder !== naturalOrder)
|
|
233
|
+
this._sortOrderChanged.next(naturalOrder);
|
|
234
|
+
if (this.source.filterMode !== FilterMode.ALL)
|
|
235
|
+
this._filterModeChanged.next(FilterMode.ALL);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
this.isViewingMore = false;
|
|
239
|
+
if (this.newestLast)
|
|
240
|
+
this.messages = this.messages.concat(this.newMessages.splice(0, this.newMessages.length));
|
|
241
|
+
else
|
|
242
|
+
this.messages = this.newMessages.splice(0, this.newMessages.length).concat(this.messages);
|
|
243
|
+
let overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);
|
|
244
|
+
this.olderMessages = overflow.concat(this.olderMessages);
|
|
245
|
+
this.olderMessages.splice(this.maxMessages - this.maxVisibleMessages, this.olderMessages.length);
|
|
246
|
+
this.hasMore = this.olderMessages.length > 0;
|
|
247
|
+
if (this.messages.length > 0) {
|
|
248
|
+
if (this.newestLast) {
|
|
249
|
+
this.scrollToComment(this.messages[this.messages.length - 1].id);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
this.scrollToComment(this.messages[0].id);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async showMore() {
|
|
257
|
+
this.isViewingMore = true;
|
|
258
|
+
if (this.olderMessages.length > 0) {
|
|
259
|
+
this.isLoadingMore = false;
|
|
260
|
+
this.messages = this.messages.concat(this.olderMessages.splice(0, 50));
|
|
261
|
+
}
|
|
262
|
+
this.isLoadingMore = true;
|
|
263
|
+
let nextPageSize = 20;
|
|
264
|
+
let lastMessage;
|
|
265
|
+
if (this.newestLast) {
|
|
266
|
+
lastMessage = this.olderMessages[0] ?? this.messages[0];
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
lastMessage = this.olderMessages[this.olderMessages.length - 1] ?? this.messages[this.messages.length - 1];
|
|
270
|
+
}
|
|
271
|
+
if (!lastMessage) {
|
|
272
|
+
this.isLoadingMore = false;
|
|
273
|
+
this.hasMore = false;
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
let messages = await this.source.loadAfter(lastMessage, nextPageSize);
|
|
277
|
+
if (this.newestLast)
|
|
278
|
+
messages = messages.slice().reverse();
|
|
279
|
+
messages.forEach(m => m.transientState ?? (m.transientState = {}));
|
|
280
|
+
if (this.newestLast)
|
|
281
|
+
this.messages = messages.concat(this.messages);
|
|
282
|
+
else
|
|
283
|
+
this.messages = this.messages.concat(messages);
|
|
284
|
+
this.isLoadingMore = false;
|
|
285
|
+
if (messages.length === 0) {
|
|
286
|
+
console.log(`Reached the end of the list.`);
|
|
287
|
+
this.hasMore = false;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
addMessage(message) {
|
|
291
|
+
if (!message.transientState)
|
|
292
|
+
message.transientState ?? (message.transientState = {});
|
|
293
|
+
let destination = this.messages;
|
|
294
|
+
let bucket = this.olderMessages;
|
|
295
|
+
let newestLast = this.newestLast;
|
|
296
|
+
if (this.shouldHoldNewMessages) {
|
|
297
|
+
destination = this.newMessages;
|
|
298
|
+
bucket = null;
|
|
299
|
+
}
|
|
300
|
+
if (newestLast) {
|
|
301
|
+
destination.push(message);
|
|
302
|
+
let overflow = destination.splice(this.maxVisibleMessages, destination.length);
|
|
303
|
+
bucket?.push(...overflow);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
destination.unshift(message);
|
|
307
|
+
let overflow = destination.splice(this.maxVisibleMessages, destination.length);
|
|
308
|
+
bucket?.unshift(...overflow);
|
|
309
|
+
}
|
|
310
|
+
if (bucket?.length > 0)
|
|
311
|
+
this.hasMore = true;
|
|
312
|
+
message.pagingCursor = String(this.incrementPagingCursors());
|
|
313
|
+
this.sortMessages();
|
|
314
|
+
}
|
|
315
|
+
incrementPagingCursors() {
|
|
316
|
+
if (this.source.sortOrder !== CommentsOrder.NEWEST)
|
|
317
|
+
return;
|
|
318
|
+
let maxPagingCursor = 0;
|
|
319
|
+
for (let group of [this.messages, this.olderMessages, this.newMessages]) {
|
|
320
|
+
for (let message of group) {
|
|
321
|
+
if (message.pagingCursor) {
|
|
322
|
+
let pagingCursor = Number(message.pagingCursor) + 1;
|
|
323
|
+
if (pagingCursor > maxPagingCursor)
|
|
324
|
+
maxPagingCursor = pagingCursor;
|
|
325
|
+
message.pagingCursor = String(pagingCursor);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return maxPagingCursor;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Wait for all currently visible comments to be fully loaded, including all attachments.
|
|
333
|
+
* Doing this will prevent layout shift when scrolling to a specific comment.
|
|
334
|
+
*/
|
|
335
|
+
async waitForAllCommentsToLoad() {
|
|
336
|
+
await new Promise(r => setTimeout(r, 100));
|
|
337
|
+
await this.sourceLoaded;
|
|
338
|
+
await Promise.all(this.comments.map(x => x.waitForLoad()));
|
|
339
|
+
}
|
|
340
|
+
sortMessages() {
|
|
341
|
+
if (!this.source)
|
|
342
|
+
return;
|
|
343
|
+
let sorter;
|
|
344
|
+
if (this.source.sortOrder === CommentsOrder.LIKES)
|
|
345
|
+
sorter = (a, b) => b.likes - a.likes;
|
|
346
|
+
else if (this.source.sortOrder === CommentsOrder.NEWEST)
|
|
347
|
+
sorter = (a, b) => (b.sentAt - a.sentAt) * (this.newestLast ? -1 : 1);
|
|
348
|
+
else if (this.source.sortOrder === CommentsOrder.OLDEST)
|
|
349
|
+
sorter = (a, b) => (a.sentAt - b.sentAt) * (this.newestLast ? -1 : 1);
|
|
350
|
+
this.messages.sort(sorter);
|
|
351
|
+
this.olderMessages.sort(sorter);
|
|
352
|
+
this.newMessages.sort(sorter);
|
|
353
|
+
}
|
|
354
|
+
messageReceived(message) {
|
|
355
|
+
this.addMessage(message);
|
|
356
|
+
}
|
|
357
|
+
isScrolledToLatest() {
|
|
358
|
+
if (!this.messageContainer)
|
|
359
|
+
return false;
|
|
360
|
+
const el = this.messageContainer.nativeElement;
|
|
361
|
+
const currentScroll = el.scrollTop;
|
|
362
|
+
const currentTotal = el.scrollHeight - el.offsetHeight;
|
|
363
|
+
return currentScroll > currentTotal - 10;
|
|
364
|
+
}
|
|
365
|
+
messageSent(message) {
|
|
366
|
+
this.addMessage(message);
|
|
367
|
+
if (!this.messageContainer)
|
|
368
|
+
return;
|
|
369
|
+
this.scrollToLatest();
|
|
370
|
+
}
|
|
371
|
+
scrollToLatest() {
|
|
372
|
+
if (!this.messageContainer) {
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
const el = this.messageContainer.nativeElement;
|
|
376
|
+
el.scrollIntoView({ block: 'start' });
|
|
377
|
+
//el.scrollTop = el.scrollHeight;
|
|
378
|
+
}
|
|
379
|
+
get element() {
|
|
380
|
+
return this.elementRef.nativeElement;
|
|
381
|
+
}
|
|
382
|
+
async scrollToComment(commentId) {
|
|
383
|
+
if (typeof window === 'undefined')
|
|
384
|
+
return;
|
|
385
|
+
await this.waitForAllCommentsToLoad();
|
|
386
|
+
const comment = this.getElementForComment(commentId);
|
|
387
|
+
if (comment) {
|
|
388
|
+
comment.scrollIntoView({
|
|
389
|
+
inline: 'center',
|
|
390
|
+
block: 'center'
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
getElementForComment(commentId) {
|
|
395
|
+
return this.element.querySelector(`[data-comment-id="${commentId}"]`);
|
|
396
|
+
}
|
|
397
|
+
mentionsMe(message) {
|
|
398
|
+
if (!this.currentUser)
|
|
399
|
+
return false;
|
|
400
|
+
if (message.message.includes(`@${this.currentUser.username}`))
|
|
401
|
+
return true;
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
CommentViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CommentViewComponent, deps: [{ token: i1.ChatBackendBase }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
406
|
+
CommentViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CommentViewComponent, selector: "banta-comment-view", inputs: { source: "source", maxMessages: "maxMessages", maxVisibleMessages: "maxVisibleMessages", newestLast: "newestLast", holdNewMessages: "holdNewMessages", showEmptyState: "showEmptyState", allowReplies: "allowReplies", enableHoldOnClick: "enableHoldOnClick", enableHoldOnScroll: "enableHoldOnScroll", customMenuItems: "customMenuItems", fixedHeight: "fixedHeight", selectedMessage: "selectedMessage", genericAvatarUrl: "genericAvatarUrl" }, outputs: { userSelected: "userSelected", reported: "reported", liked: "liked", unliked: "unliked", usernameSelected: "usernameSelected", avatarSelected: "avatarSelected", shared: "shared", deleted: "deleted", selected: "selected", messageEdited: "messageEdited", sortOrderChanged: "sortOrderChanged", filterModeChanged: "filterModeChanged" }, host: { properties: { "class.fixed-height": "this.fixedHeight" } }, viewQueries: [{ propertyName: "messageContainer", first: true, predicate: ["messageContainer"], descendants: true }, { propertyName: "commentsQuery", predicate: CommentComponent, descendants: true }], ngImport: i0, template: "<div class=\"message-container\" #messageContainer>\r\n <ng-content select=\"[data-before]\"></ng-content>\r\n\r\n <div class=\"top-sticky\">\r\n <a *ngIf=\"!newestLast\" mat-button class=\"nav\" [class.visible]=\"shouldShowNewMessageIndicator\" href=\"javascript:;\" (click)=\"showNew($event)\">\r\n <mat-icon>file_upload</mat-icon>\r\n <ng-container *ngIf=\"newMessages.length >= 1\">\r\n New ({{newMessages.length}})\r\n </ng-container>\r\n <ng-container *ngIf=\"newMessages.length == 0\">\r\n Newest\r\n </ng-container>\r\n </a>\r\n </div>\r\n <a mat-button class=\"nav\" [class.visible]=\"newestLast && hasMore && !isLoadingMore\" href=\"javascript:;\" (click)=\"showMore()\">Show earlier</a>\r\n\r\n <ng-container *ngIf=\"messages.length === 0\">\r\n <div class=\"empty-state\" *ngIf=\"showEmptyState\">\r\n Be the first to comment!\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let message of messages; trackBy: messageIdentity\">\r\n <banta-comment\r\n *ngIf=\"!message.hidden\"\r\n class=\"abbreviated\"\r\n \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)=\"enableHoldOnClick ? (holdNewMessages = true) : undefined\"\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 (unliked)=\"unlikeMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (selected)=\"selectMessage(message)\"\r\n (shared)=\"sharedMessage($event)\"\r\n ></banta-comment>\r\n <div class=\"inline-replies-container\" *ngIf=\"selectedMessage === message\">\r\n <ng-content select=\".inline-replies\"></ng-content>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"nav-point bottom-sticky\">\r\n <a *ngIf=\"newestLast\" mat-button class=\"nav\" [class.visible]=\"shouldShowNewMessageIndicator\" href=\"javascript:;\" (click)=\"showNew($event)\">\r\n <mat-icon>file_download</mat-icon>\r\n <ng-container *ngIf=\"newMessages.length >= 1\">\r\n New ({{newMessages.length}})\r\n </ng-container>\r\n <ng-container *ngIf=\"newMessages.length == 0\">\r\n Newest\r\n </ng-container>\r\n </a>\r\n </div>\r\n <a mat-button class=\"nav\" [class.visible]=\"!newestLast && hasMore && !isLoadingMore\" href=\"javascript:;\" (click)=\"showMore()\">Show more</a>\r\n\r\n <div class=\"loading-more\" *ngIf=\"isLoadingMore\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n\r\n <!-- <div style=\"color: #666\">\r\n n={{newMessages.length}}, m={{messages.length}}, o={{olderMessages.length}},\r\n v={{maxVisibleMessages}}, M={{maxMessages}}\r\n </div> -->\r\n\r\n <ng-content select=\":not([data-before]):not(.inline-replies)\"></ng-content>\r\n</div>\r\n", styles: [":host{flex-grow:1;display:flex;flex-direction:column;opacity:1;transition:.2s opacity ease-in}.message-container{flex-grow:1;color:#111;background:white;padding:.5em 1em 3em .5em;opacity:1;transition:.5s opacity ease-in-out;position:relative}.message-container.no-scroll{height:auto;overflow-y:visible}.message-container.faded{opacity:.25}.message-container .overlay{position:absolute;inset:0;z-index:10}:host.fixed-height .message-container{overflow-y:auto}:host-context(.mat-dark-theme) .message-container{color:#fff;background:#111111}.empty-state{text-align:center;margin:3em;color:#666}:host-context(.mat-dark-theme) .empty-state{color:#666}a.nav{position:absolute;right:.5em;z-index:10;text-align:center;opacity:0;transition:.4s opacity ease-in-out;pointer-events:none;border-radius:2em;background:#222}a.nav.visible{opacity:1;pointer-events:initial}.top-sticky{position:sticky;top:.5em;z-index:10}.bottom-sticky{position:sticky;bottom:3em;z-index:10}.loading-more{padding:2em;text-align:center;margin:0 auto;width:-moz-fit-content;width:fit-content}@media (max-width: 400px){.message-container{padding:0 0 3em}}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i6.CommentComponent, selector: "banta-comment", inputs: ["message", "customMenuItems", "showReplyAction", "maxLength", "permissions", "mine", "editing", "genericAvatarUrl", "readonly"], outputs: ["liked", "unliked", "selected", "edited", "deleted", "editStarted", "editEnded", "shared", "userSelected", "usernameSelected", "avatarSelected", "reported", "loaded"] }] });
|
|
407
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CommentViewComponent, decorators: [{
|
|
408
|
+
type: Component,
|
|
409
|
+
args: [{ selector: 'banta-comment-view', template: "<div class=\"message-container\" #messageContainer>\r\n <ng-content select=\"[data-before]\"></ng-content>\r\n\r\n <div class=\"top-sticky\">\r\n <a *ngIf=\"!newestLast\" mat-button class=\"nav\" [class.visible]=\"shouldShowNewMessageIndicator\" href=\"javascript:;\" (click)=\"showNew($event)\">\r\n <mat-icon>file_upload</mat-icon>\r\n <ng-container *ngIf=\"newMessages.length >= 1\">\r\n New ({{newMessages.length}})\r\n </ng-container>\r\n <ng-container *ngIf=\"newMessages.length == 0\">\r\n Newest\r\n </ng-container>\r\n </a>\r\n </div>\r\n <a mat-button class=\"nav\" [class.visible]=\"newestLast && hasMore && !isLoadingMore\" href=\"javascript:;\" (click)=\"showMore()\">Show earlier</a>\r\n\r\n <ng-container *ngIf=\"messages.length === 0\">\r\n <div class=\"empty-state\" *ngIf=\"showEmptyState\">\r\n Be the first to comment!\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor=\"let message of messages; trackBy: messageIdentity\">\r\n <banta-comment\r\n *ngIf=\"!message.hidden\"\r\n class=\"abbreviated\"\r\n \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)=\"enableHoldOnClick ? (holdNewMessages = true) : undefined\"\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 (unliked)=\"unlikeMessage(message)\"\r\n (reported)=\"reportMessage(message)\"\r\n (selected)=\"selectMessage(message)\"\r\n (shared)=\"sharedMessage($event)\"\r\n ></banta-comment>\r\n <div class=\"inline-replies-container\" *ngIf=\"selectedMessage === message\">\r\n <ng-content select=\".inline-replies\"></ng-content>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"nav-point bottom-sticky\">\r\n <a *ngIf=\"newestLast\" mat-button class=\"nav\" [class.visible]=\"shouldShowNewMessageIndicator\" href=\"javascript:;\" (click)=\"showNew($event)\">\r\n <mat-icon>file_download</mat-icon>\r\n <ng-container *ngIf=\"newMessages.length >= 1\">\r\n New ({{newMessages.length}})\r\n </ng-container>\r\n <ng-container *ngIf=\"newMessages.length == 0\">\r\n Newest\r\n </ng-container>\r\n </a>\r\n </div>\r\n <a mat-button class=\"nav\" [class.visible]=\"!newestLast && hasMore && !isLoadingMore\" href=\"javascript:;\" (click)=\"showMore()\">Show more</a>\r\n\r\n <div class=\"loading-more\" *ngIf=\"isLoadingMore\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n\r\n <!-- <div style=\"color: #666\">\r\n n={{newMessages.length}}, m={{messages.length}}, o={{olderMessages.length}},\r\n v={{maxVisibleMessages}}, M={{maxMessages}}\r\n </div> -->\r\n\r\n <ng-content select=\":not([data-before]):not(.inline-replies)\"></ng-content>\r\n</div>\r\n", styles: [":host{flex-grow:1;display:flex;flex-direction:column;opacity:1;transition:.2s opacity ease-in}.message-container{flex-grow:1;color:#111;background:white;padding:.5em 1em 3em .5em;opacity:1;transition:.5s opacity ease-in-out;position:relative}.message-container.no-scroll{height:auto;overflow-y:visible}.message-container.faded{opacity:.25}.message-container .overlay{position:absolute;inset:0;z-index:10}:host.fixed-height .message-container{overflow-y:auto}:host-context(.mat-dark-theme) .message-container{color:#fff;background:#111111}.empty-state{text-align:center;margin:3em;color:#666}:host-context(.mat-dark-theme) .empty-state{color:#666}a.nav{position:absolute;right:.5em;z-index:10;text-align:center;opacity:0;transition:.4s opacity ease-in-out;pointer-events:none;border-radius:2em;background:#222}a.nav.visible{opacity:1;pointer-events:initial}.top-sticky{position:sticky;top:.5em;z-index:10}.bottom-sticky{position:sticky;bottom:3em;z-index:10}.loading-more{padding:2em;text-align:center;margin:0 auto;width:-moz-fit-content;width:fit-content}@media (max-width: 400px){.message-container{padding:0 0 3em}}\n"] }]
|
|
410
|
+
}], ctorParameters: function () { return [{ type: i1.ChatBackendBase }, { type: i0.ElementRef }]; }, propDecorators: { source: [{
|
|
411
|
+
type: Input
|
|
412
|
+
}], maxMessages: [{
|
|
413
|
+
type: Input
|
|
414
|
+
}], maxVisibleMessages: [{
|
|
415
|
+
type: Input
|
|
416
|
+
}], newestLast: [{
|
|
417
|
+
type: Input
|
|
418
|
+
}], holdNewMessages: [{
|
|
419
|
+
type: Input
|
|
420
|
+
}], showEmptyState: [{
|
|
421
|
+
type: Input
|
|
422
|
+
}], allowReplies: [{
|
|
423
|
+
type: Input
|
|
424
|
+
}], enableHoldOnClick: [{
|
|
425
|
+
type: Input
|
|
426
|
+
}], enableHoldOnScroll: [{
|
|
427
|
+
type: Input
|
|
428
|
+
}], customMenuItems: [{
|
|
429
|
+
type: Input
|
|
430
|
+
}], fixedHeight: [{
|
|
431
|
+
type: Input
|
|
432
|
+
}, {
|
|
433
|
+
type: HostBinding,
|
|
434
|
+
args: ['class.fixed-height']
|
|
435
|
+
}], selectedMessage: [{
|
|
436
|
+
type: Input
|
|
437
|
+
}], genericAvatarUrl: [{
|
|
438
|
+
type: Input
|
|
439
|
+
}], userSelected: [{
|
|
440
|
+
type: Output
|
|
441
|
+
}], reported: [{
|
|
442
|
+
type: Output
|
|
443
|
+
}], liked: [{
|
|
444
|
+
type: Output
|
|
445
|
+
}], unliked: [{
|
|
446
|
+
type: Output
|
|
447
|
+
}], usernameSelected: [{
|
|
448
|
+
type: Output
|
|
449
|
+
}], avatarSelected: [{
|
|
450
|
+
type: Output
|
|
451
|
+
}], shared: [{
|
|
452
|
+
type: Output
|
|
453
|
+
}], deleted: [{
|
|
454
|
+
type: Output
|
|
455
|
+
}], selected: [{
|
|
456
|
+
type: Output
|
|
457
|
+
}], messageEdited: [{
|
|
458
|
+
type: Output
|
|
459
|
+
}], sortOrderChanged: [{
|
|
460
|
+
type: Output
|
|
461
|
+
}], filterModeChanged: [{
|
|
462
|
+
type: Output
|
|
463
|
+
}], commentsQuery: [{
|
|
464
|
+
type: ViewChildren,
|
|
465
|
+
args: [CommentComponent]
|
|
466
|
+
}], messageContainer: [{
|
|
467
|
+
type: ViewChild,
|
|
468
|
+
args: ['messageContainer']
|
|
469
|
+
}] } });
|
|
470
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1lbnRzL2NvbW1lbnQtdmlldy9jb21tZW50LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvY29tbWVudC12aWV3L2NvbW1lbnQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFxQixhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7OztBQVloRSxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCLFlBQ1ksT0FBd0IsRUFDeEIsVUFBbUM7UUFEbkMsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFVL0MsWUFBWTtRQUNaLGdCQUFnQjtRQUVSLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN6QyxnQkFBVyxHQUFnQixJQUFJLENBQUM7UUFDaEMsYUFBUSxHQUFrQixFQUFFLENBQUM7UUFFN0Isc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRTFCLGlCQUFZLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakUsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsa0JBQWEs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QkFBeEIsS0FBSztnQkFrQmEsWUFBWTtzQkFBOUIsTUFBTTtnQkFDWSxRQUFRO3NCQUExQixNQUFNO2dCQUNZLEtBQUs7c0JBQXZCLE1BQU07Z0JBQ1ksT0FBTztzQkFBekIsTUFBTTtnQkFDWSxnQkFBZ0I7c0JBQWxDLE1BQU07Z0JBQ1ksY0FBYztzQkFBaEMsTUFBTTtnQkFDWSxNQUFNO3NCQUF4QixNQUFNO2dCQUNZLE9BQU87c0JBQXpCLE1BQU07Z0JBQ1ksUUFBUTtzQkFBMUIsTUFBTTtnQkFDWSxhQUFhO3NCQUEvQixNQUFNO2dCQUNZLGdCQUFnQjtzQkFBbEMsTUFBTTtnQkFDWSxpQkFBaUI7c0JBQW5DLE1BQU07Z0JBS3lCLGFBQWE7c0JBQTVDLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQUNDLGdCQUFnQjtzQkFBOUMsU0FBUzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIE91dHB1dCwgSG9zdEJpbmRpbmcsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlciwgQ2hhdE1lc3NhZ2UsIENvbW1lbnRzT3JkZXIsIEZpbHRlck1vZGUgfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kQmFzZSB9IGZyb20gXCIuLi8uLi9jaGF0LWJhY2tlbmQtYmFzZVwiO1xyXG5pbXBvcnQgeyBDaGF0U291cmNlQmFzZSB9IGZyb20gXCIuLi8uLi9jaGF0LXNvdXJjZS1iYXNlXCI7XHJcbmltcG9ydCB7IE1lc3NhZ2VNZW51SXRlbSB9IGZyb20gXCIuLi8uLi9tZXNzYWdlLW1lbnUtaXRlbVwiO1xyXG5pbXBvcnQgeyBDb21tZW50Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1lbnQvY29tbWVudC5jb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEV2ZW50IHtcclxuICAgIG1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG4gICAgbmV3TWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtY29tbWVudC12aWV3JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21tZW50LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY29tbWVudC12aWV3LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbW1lbnRWaWV3Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYmFja2VuZDogQ2hhdEJhY2tlbmRCYXNlLFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBTb3VyY2VcclxuXHJcbiAgICBwcml2YXRlIF9zb3VyY2U6IENoYXRTb3VyY2VCYXNlO1xyXG4gICAgQElucHV0KCkgZ2V0IHNvdXJjZSgpIHsgcmV0dXJuIHRoaXMuX3NvdXJjZTsgfVxyXG4gICAgc2V0IHNvdXJjZSh2YWx1ZSkgeyB0aGlzLnNldFNvdXJjZSh2YWx1ZSk7IH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIC8vI3JlZ2lvbiBGaWVsZHNcclxuXHJcbiAgICBwcml2YXRlIF9zb3VyY2VTdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICAgbWVudU1lc3NhZ2U6IENoYXRNZXNzYWdlID0gbnVsbDtcclxuICAgIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcbiAgICBjdXJyZW50VXNlcjogVXNlcjtcclxuICAgIGN1c3RvbVNvcnRFbmFibGVkID0gZmFsc2U7XHJcbiAgICBtYXJrU291cmNlTG9hZGVkOiAoKSA9PiB2b2lkO1xyXG4gICAgc291cmNlTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4ociA9PiB0aGlzLm1hcmtTb3VyY2VMb2FkZWQgPSByKTtcclxuICAgIGlzVmlld2luZ01vcmUgPSBmYWxzZTtcclxuICAgIGlzTG9hZGluZ01vcmUgPSBmYWxzZTtcclxuICAgIGhhc01vcmUgPSBmYWxzZTtcclxuICAgIG5ld01lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcbiAgICBvbGRlck1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgICAvLyNyZWdpb24gSW5wdXRzXHJcblxyXG4gICAgQElucHV0KCkgbWF4TWVzc2FnZXMgPSAyMDAwO1xyXG4gICAgQElucHV0KCkgbWF4VmlzaWJsZU1lc3NhZ2VzOiBudW1iZXIgPSAyMDA7XHJcbiAgICBASW5wdXQoKSBuZXdlc3RMYXN0ID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBob2xkTmV3TWVzc2FnZXMgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHNob3dFbXB0eVN0YXRlID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGFsbG93UmVwbGllcyA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBlbmFibGVIb2xkT25DbGljayA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgZW5hYmxlSG9sZE9uU2Nyb2xsID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGN1c3RvbU1lbnVJdGVtczogTWVzc2FnZU1lbnVJdGVtW10gPSBbXTtcclxuICAgIEBJbnB1dCgpIEBIb3N0QmluZGluZygnY2xhc3MuZml4ZWQtaGVpZ2h0JykgZml4ZWRIZWlnaHQ6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZE1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG4gICAgQElucHV0KCkgZ2VuZXJpY0F2YXRhclVybDogc3RyaW5nO1xyXG4gICAgXHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIC8vI3JlZ2lvbiBPdXRwdXRzXHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX2xpa2VkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF91bmxpa2VkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9yZXBvcnRlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfdXNlclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF91c2VybmFtZVNlbGVjdGVkID0gbmV3IFN1YmplY3Q8VXNlcj4oKTtcclxuICAgIHByaXZhdGUgX2F2YXRhclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8VXNlcj4oKTtcclxuICAgIHByaXZhdGUgX3NoYXJlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfZGVsZXRlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUVkaXRlZCA9IG5ldyBTdWJqZWN0PEVkaXRFdmVudD4oKTtcclxuICAgIHByaXZhdGUgX3NvcnRPcmRlckNoYW5nZWQgPSBuZXcgU3ViamVjdDxDb21tZW50c09yZGVyPigpO1xyXG4gICAgcHJpdmF0ZSBfZmlsdGVyTW9kZUNoYW5nZWQgPSBuZXcgU3ViamVjdDxGaWx0ZXJNb2RlPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKSByZWFkb25seSB1c2VyU2VsZWN0ZWQgPSB0aGlzLl91c2VyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgcmVwb3J0ZWQgPSB0aGlzLl9yZXBvcnRlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBsaWtlZCA9IHRoaXMuX2xpa2VkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVubGlrZWQgPSB0aGlzLl91bmxpa2VkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVzZXJuYW1lU2VsZWN0ZWQgPSB0aGlzLl91c2VybmFtZVNlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGF2YXRhclNlbGVjdGVkID0gdGhpcy5fYXZhdGFyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2hhcmVkID0gdGhpcy5fc2hhcmVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGRlbGV0ZWQgPSB0aGlzLl9kZWxldGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgbWVzc2FnZUVkaXRlZCA9IHRoaXMuX21lc3NhZ2VFZGl0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc29ydE9yZGVyQ2hhbmdlZCA9IHRoaXMuX3NvcnRPcmRlckNoYW5nZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZmlsdGVyTW9kZUNoYW5nZWQgPSB0aGlzLl9maWx0ZXJNb2RlQ2hhbmdlZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICAvLyNlbmRyZWdpb24gXHJcbiAgICAvLyNyZWdpb24gVUkgQmluZGluZ3NcclxuXHJcbiAgICBAVmlld0NoaWxkcmVuKENvbW1lbnRDb21wb25lbnQpIGNvbW1lbnRzUXVlcnk6IFF1ZXJ5TGlzdDxDb21tZW50Q29tcG9uZW50PjtcclxuICAgIEBWaWV3Q2hpbGQoJ21lc3NhZ2VDb250YWluZXInKSBtZXNzYWdlQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuICAgIGdldCBjb21tZW50cygpIHsgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb21tZW50c1F1ZXJ5KTsgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWVzc2FnZSBjYW4gYmUgZm91bmQgd2l0aGluIG9uZSBvZiB0aGUgbWVzc2FnZSBidWZmZXJzIChvbGRlciwgY3VycmVudCwgbmV3ZXIpXHJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBcclxuICAgICAqL1xyXG4gICAgaXNNZXNzYWdlTG9hZGVkSW5Db250ZXh0KG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2xkZXJNZXNzYWdlcy5maW5kKHggPT4geC5pZCA9PT0gbWVzc2FnZS5pZClcclxuICAgICAgICAgICAgfHwgdGhpcy5tZXNzYWdlcy5maW5kKHggPT4geC5pZCA9PT0gbWVzc2FnZS5pZClcclxuICAgICAgICAgICAgfHwgdGhpcy5uZXdNZXNzYWdlcy5maW5kKHggPT4geC5pZCA9PT0gbWVzc2FnZS5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZE1lc3NhZ2VJbkNvbnRleHQobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZUxvYWRlZDtcclxuICAgICAgICBcclxuICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBtZXNzYWdlICR7bWVzc2FnZS5pZH0gaW4gY29udGV4dC4uLmApO1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmhhc01vcmUgJiYgIXRoaXMuaXNNZXNzYWdlTG9hZGVkSW5Db250ZXh0KG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAuLi5OZWVkIHRvIGxvYWQgbW9yZSBjb21tZW50cyB0byBmaW5kICR7bWVzc2FnZS5pZH1gKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93TW9yZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWVzc2FnZUxvYWRlZEluQ29udGV4dChtZXNzYWdlKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciB3aGlsZSBsb2FkaW5nIG1lc3NhZ2UgaW4gY29udGV4dDogRmFpbGVkIHRvIGZpbmQgbWVzc2FnZSAke21lc3NhZ2UuaWR9LCBtYXliZSBpdCB3YXMgZGVsZXRlZCFgKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHBhZ2VTaXplID0gdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXM7XHJcbiAgICAgICAgbGV0IGl0ZW1zID0gW10uY29uY2F0KHRoaXMub2xkZXJNZXNzYWdlcywgdGhpcy5tZXNzYWdlcywgdGhpcy5uZXdNZXNzYWdlcyk7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KHggPT4geC5pZCA9PT0gbWVzc2FnZS5pZCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3Igd2hpbGUgbG9hZGluZyBtZXNzYWdlIGluIGNvbnRleHQ6IE1lc3NhZ2Ugd2FzIG5vdCBwcmVzZW50IGluIG1lc3NhZ2UgbGlzdCFgKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBNYXRoLm1heCgwLCBpbmRleCAtIHBhZ2VTaXplIC8gMik7ICAgICAgICBcclxuICAgICAgICB0aGlzLm5ld01lc3NhZ2VzID0gaXRlbXMuc3BsaWNlKDAsIHN0YXJ0SW5kZXgpO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSBpdGVtcy5zcGxpY2UoMCwgcGFnZVNpemUpO1xyXG4gICAgICAgIHRoaXMub2xkZXJNZXNzYWdlcyA9IGl0ZW1zO1xyXG4gICAgICAgIHRoaXMuaXNWaWV3aW5nTW9yZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNob3VsZFNob3dOZXdNZXNzYWdlSW5kaWNhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlzVmlld2luZ01vcmUgXHJcbiAgICAgICAgICAgIHx8IHRoaXMuY3VzdG9tU29ydEVuYWJsZWQgXHJcbiAgICAgICAgICAgIHx8IHRoaXMuc291cmNlLmZpbHRlck1vZGUgIT09IEZpbHRlck1vZGUuQUxMXHJcbiAgICAgICAgICAgIHx8IHRoaXMubmV3TWVzc2FnZXMubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2hvdWxkSG9sZE5ld01lc3NhZ2VzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmhvbGROZXdNZXNzYWdlcyB8fCB0aGlzLmlzVmlld2luZ01vcmUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYGhvbGRpbmcgZHVlIHRvIHNldHRpbmdzYCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlSG9sZE9uU2Nyb2xsKSB7XHJcbiAgICAgICAgICAgIGxldCBrZXlNZXNzYWdlOiBDaGF0TWVzc2FnZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5ld2VzdExhc3QpXHJcbiAgICAgICAgICAgICAgICBrZXlNZXNzYWdlID0gdGhpcy5tZXNzYWdlc1t0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBrZXlNZXNzYWdlID0gdGhpcy5tZXNzYWdlc1swXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChrZXlNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlRWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudEZvckNvbW1lbnQoa2V5TWVzc2FnZS5pZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNFbGVtZW50VmlzaWJsZShtZXNzYWdlRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYGtleSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBrZXkgZWxlbWVudCBpcyB2aXNpYmxlYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgY291bGQgbm90IGZpbmQga2V5IGVsZW1lbnRgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBjb3VsZCBub3QgZmluZCBrZXkgbWVzc2FnZWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0VsZW1lbnRWaXNpYmxlKGVsZW1lbnQ6IEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgcmV0dXJuICEhZWxlbWVudFJlY3QgXHJcbiAgICAgICAgICAgICYmIGVsZW1lbnRSZWN0LmJvdHRvbSA+PSAwXHJcbiAgICAgICAgICAgICYmIGVsZW1lbnRSZWN0LnJpZ2h0ID49IDBcclxuICAgICAgICAgICAgJiYgZWxlbWVudFJlY3QubGVmdCA8PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGhcclxuICAgICAgICAgICAgJiYgZWxlbWVudFJlY3QudG9wIDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIENvbW1lbnRDb21wb25lbnQgaW5zdGFudGlhdGVkIGZvciB0aGUgZ2l2ZW4gQ2hhdE1lc3NhZ2UsXHJcbiAgICAgKiBpZiBpdCBleGlzdHMgaW4gdGhlIGN1cnJlbnQgdmlldy4gTm90ZSB0aGF0IG1lc3NhZ2VzIHdoaWNoIGFyZSBub3QgXHJcbiAgICAgKiBjdXJyZW50bHkgc2hvd24gdG8gdGhlIHVzZXIgd2lsbCBub3QgcmV0dXJuIGEgQ29tbWVudENvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGdldENvbW1lbnRDb21wb25lbnRGb3JNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCFtZXNzYWdlKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSB2YWxpZCBDaGF0TWVzc2FnZWApO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRzLmZpbmQoeCA9PiB4Lm1lc3NhZ2U/LmlkID09PSBtZXNzYWdlLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlRWRpdChtZXNzYWdlOiBDaGF0TWVzc2FnZSwgbmV3TWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUVkaXRlZC5uZXh0KHsgbWVzc2FnZSwgbmV3TWVzc2FnZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsaWtlTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX2xpa2VkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdW5saWtlTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3VubGlrZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXBvcnRNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RNZXNzYWdlVXNlcihtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZWxlY3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVzZXJuYW1lKHVzZXI6IFVzZXIpIHtcclxuICAgICAgICB0aGlzLl91c2VybmFtZVNlbGVjdGVkLm5leHQodXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0QXZhdGFyKHVzZXI6IFVzZXIpIHtcclxuICAgICAgICB0aGlzLl9hdmF0YXJTZWxlY3RlZC5uZXh0KHVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHNoYXJlZE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9zaGFyZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydEVkaXRpbmcobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VzLmZvckVhY2gobSA9PiBtLnRyYW5zaWVudFN0YXRlLmVkaXRpbmcgPSBmYWxzZSk7XHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsZXRlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0U291cmNlKHZhbHVlOiBDaGF0U291cmNlQmFzZSkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tU29ydEVuYWJsZWQgPSB2YWx1ZT8uc29ydE9yZGVyICE9PSBDb21tZW50c09yZGVyLk5FV0VTVDtcclxuICAgICAgICB0aGlzLm5ld01lc3NhZ2VzID0gW107XHJcbiAgICAgICAgdGhpcy5vbGRlck1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgICAgICh3aW5kb3cgYXMgYW55KS5iYW50YVNvdXJjZURlYnVnID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VTdWJzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnMudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3VicyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSAodmFsdWUubWVzc2FnZXMgfHwgW10pLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcztcclxuICAgICAgICAgICAgdGhpcy5vbGRlck1lc3NhZ2VzID0gbWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCBtZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICB0aGlzLmhhc01vcmUgPSB0cnVlOyAvL3RoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vicy5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VSZWNlaXZlZC5zdWJzY3JpYmUobXNnID0+IHRoaXMubWVzc2FnZVJlY2VpdmVkKG1zZykpKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vicy5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VTZW50LnN1YnNjcmliZShtc2cgPT4gdGhpcy5tZXNzYWdlU2VudChtc2cpKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzLmFkZChcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja2VuZC51c2VyQ2hhbmdlZC5zdWJzY3JpYmUodXNlciA9PiB0aGlzLmN1cnJlbnRVc2VyID0gdXNlcilcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5pdGlhbE1lc3NhZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0SW5pdGlhbE1lc3NhZ2VzKCkge1xyXG4gICAgICAgIGxldCBtZXNzYWdlcyA9IChhd2FpdCB0aGlzLl9zb3VyY2UuZ2V0RXhpc3RpbmdNZXNzYWdlcygpKTtcclxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKG0gPT4gbS50cmFuc2llbnRTdGF0ZSA/Pz0ge30pO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm5ld2VzdExhc3QgPyBtZXNzYWdlcy5zbGljZSgpLnJldmVyc2UoKSA6IG1lc3NhZ2VzO1xyXG4gICAgICAgIHRoaXMuc29ydE1lc3NhZ2VzKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubWFya1NvdXJjZUxvYWRlZClcclxuICAgICAgICAgICAgdGhpcy5tYXJrU291cmNlTG9hZGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWVzc2FnZUlkZW50aXR5KGluZGV4OiBudW1iZXIsIGNoYXRNZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHJldHVybiBjaGF0TWVzc2FnZS5pZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93TmV3KGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgbGV0IG5hdHVyYWxPcmRlciA9IENvbW1lbnRzT3JkZXIuTkVXRVNUO1xyXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZSAmJiAodGhpcy5zb3VyY2Uuc29ydE9yZGVyICE9PSBuYXR1cmFsT3JkZXIgfHwgdGhpcy5zb3VyY2UuZmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5BTEwpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5zb3J0T3JkZXIgIT09IG5hdHVyYWxPcmRlcilcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRPcmRlckNoYW5nZWQubmV4dChuYXR1cmFsT3JkZXIpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2UuZmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5BTEwpXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJNb2RlQ2hhbmdlZC5uZXh0KEZpbHRlck1vZGUuQUxMKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1ZpZXdpbmdNb3JlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm5ld2VzdExhc3QpXHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLmNvbmNhdCh0aGlzLm5ld01lc3NhZ2VzLnNwbGljZSgwLCB0aGlzLm5ld01lc3NhZ2VzLmxlbmd0aCkpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IHRoaXMubmV3TWVzc2FnZXMuc3BsaWNlKDAsIHRoaXMubmV3TWVzc2FnZXMubGVuZ3RoKS5jb25jYXQodGhpcy5tZXNzYWdlcyk7XHJcbiAgICAgICAgbGV0IG92ZXJmbG93ID0gdGhpcy5tZXNzYWdlcy5zcGxpY2UodGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMsIHRoaXMubWVzc2FnZXMubGVuZ3RoKTtcclxuICAgICAgICB0aGlzLm9sZGVyTWVzc2FnZXMgPSBvdmVyZmxvdy5jb25jYXQodGhpcy5vbGRlck1lc3NhZ2VzKTtcclxuICAgICAgICB0aGlzLm9sZGVyTWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4TWVzc2FnZXMgLSB0aGlzLm1heFZpc2libGVNZXNzYWdlcywgdGhpcy5vbGRlck1lc3NhZ2VzLmxlbmd0aCk7XHJcbiAgICAgICAgdGhpcy5oYXNNb3JlID0gdGhpcy5vbGRlck1lc3NhZ2VzLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubmV3ZXN0TGFzdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0NvbW1lbnQodGhpcy5tZXNzYWdlc1t0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDFdLmlkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Db21tZW50KHRoaXMubWVzc2FnZXNbMF0uaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dNb3JlKCkge1xyXG4gICAgICAgIHRoaXMuaXNWaWV3aW5nTW9yZSA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9sZGVyTWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IHRoaXMubWVzc2FnZXMuY29uY2F0KHRoaXMub2xkZXJNZXNzYWdlcy5zcGxpY2UoMCwgNTApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgbGV0IG5leHRQYWdlU2l6ZSA9IDIwO1xyXG4gICAgICAgIGxldCBsYXN0TWVzc2FnZTogQ2hhdE1lc3NhZ2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm5ld2VzdExhc3QpIHtcclxuICAgICAgICAgICAgbGFzdE1lc3NhZ2UgPSB0aGlzLm9sZGVyTWVzc2FnZXNbMF0gPz8gdGhpcy5tZXNzYWdlc1swXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsYXN0TWVzc2FnZSA9IHRoaXMub2xkZXJNZXNzYWdlc1t0aGlzLm9sZGVyTWVzc2FnZXMubGVuZ3RoIC0gMV0gPz8gdGhpcy5tZXNzYWdlc1t0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFsYXN0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5oYXNNb3JlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMuc291cmNlLmxvYWRBZnRlcihsYXN0TWVzc2FnZSwgbmV4dFBhZ2VTaXplKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmV3ZXN0TGFzdClcclxuICAgICAgICAgICAgbWVzc2FnZXMgPSBtZXNzYWdlcy5zbGljZSgpLnJldmVyc2UoKTtcclxuICAgICAgICBcclxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKG0gPT4gbS50cmFuc2llbnRTdGF0ZSA/Pz0ge30pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5uZXdlc3RMYXN0KVxyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXMuY29uY2F0KHRoaXMubWVzc2FnZXMpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IHRoaXMubWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VzKTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmUgPSBmYWxzZTtcclxuICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpc3QuYCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGFzTW9yZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuXHJcbiAgICAgICAgaWYgKCFtZXNzYWdlLnRyYW5zaWVudFN0YXRlKVxyXG4gICAgICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlID8/PSB7fTtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgZGVzdGluYXRpb24gPSB0aGlzLm1lc3NhZ2VzO1xyXG4gICAgICAgIGxldCBidWNrZXQgPSB0aGlzLm9sZGVyTWVzc2FnZXM7XHJcbiAgICAgICAgbGV0IG5ld2VzdExhc3QgPSB0aGlzLm5ld2VzdExhc3Q7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3VsZEhvbGROZXdNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbiA9IHRoaXMubmV3TWVzc2FnZXM7XHJcbiAgICAgICAgICAgIGJ1Y2tldCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBcclxuICAgICAgICBpZiAobmV3ZXN0TGFzdCkge1xyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5wdXNoKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBsZXQgb3ZlcmZsb3cgPSBkZXN0aW5hdGlvbi5zcGxpY2UodGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMsIGRlc3RpbmF0aW9uLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGJ1Y2tldD8ucHVzaCguLi5vdmVyZmxvdyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGVzdGluYXRpb24udW5zaGlmdChtZXNzYWdlKTtcclxuICAgICAgICAgICAgbGV0IG92ZXJmbG93ID0gZGVzdGluYXRpb24uc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCBkZXN0aW5hdGlvbi5sZW5ndGgpO1xyXG4gICAgICAgICAgICBidWNrZXQ/LnVuc2hpZnQoLi4ub3ZlcmZsb3cpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJ1Y2tldD8ubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgdGhpcy5oYXNNb3JlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5wYWdpbmdDdXJzb3IgPSBTdHJpbmcodGhpcy5pbmNyZW1lbnRQYWdpbmdDdXJzb3JzKCkpO1xyXG4gICAgICAgIHRoaXMuc29ydE1lc3NhZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbmNyZW1lbnRQYWdpbmdDdXJzb3JzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZS5zb3J0T3JkZXIgIT09IENvbW1lbnRzT3JkZXIuTkVXRVNUKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IG1heFBhZ2luZ0N1cnNvciA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgZ3JvdXAgb2YgW3RoaXMubWVzc2FnZXMsIHRoaXMub2xkZXJNZXNzYWdlcywgdGhpcy5uZXdNZXNzYWdlc10pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgbWVzc2FnZSBvZiBncm91cCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFnaW5nQ3Vyc29yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2luZ0N1cnNvciA9IE51bWJlcihtZXNzYWdlLnBhZ2luZ0N1cnNvcikgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYWdpbmdDdXJzb3IgPiBtYXhQYWdpbmdDdXJzb3IpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhZ2luZ0N1cnNvciA9IHBhZ2luZ0N1cnNvcjtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBhZ2luZ0N1cnNvciA9IFN0cmluZyhwYWdpbmdDdXJzb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWF4UGFnaW5nQ3Vyc29yO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2FpdCBmb3IgYWxsIGN1cnJlbnRseSB2aXNpYmxlIGNvbW1lbnRzIHRvIGJlIGZ1bGx5IGxvYWRlZCwgaW5jbHVkaW5nIGFsbCBhdHRhY2htZW50cy5cclxuICAgICAqIERvaW5nIHRoaXMgd2lsbCBwcmV2ZW50IGxheW91dCBzaGlmdCB3aGVuIHNjcm9sbGluZyB0byBhIHNwZWNpZmljIGNvbW1lbnQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JBbGxDb21tZW50c1RvTG9hZCgpIHtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMTAwKSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VMb2FkZWQ7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5jb21tZW50cy5tYXAoeCA9PiB4LndhaXRGb3JMb2FkKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNvcnRNZXNzYWdlcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc291cmNlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHNvcnRlcjogKGE6IENoYXRNZXNzYWdlLCBiOiBDaGF0TWVzc2FnZSkgPT4gbnVtYmVyO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zb3VyY2Uuc29ydE9yZGVyID09PSBDb21tZW50c09yZGVyLkxJS0VTKVxyXG4gICAgICAgICAgICBzb3J0ZXIgPSAoYSwgYikgPT4gYi5saWtlcyAtIGEubGlrZXM7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb3VyY2Uuc29ydE9yZGVyID09PSBDb21tZW50c09yZGVyLk5FV0VTVClcclxuICAgICAgICAgICAgc29ydGVyID0gKGEsIGIpID0+IChiLnNlbnRBdCAtIGEuc2VudEF0KSAqICh0aGlzLm5ld2VzdExhc3QgPyAtMSA6IDEpO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc291cmNlLnNvcnRPcmRlciA9PT0gQ29tbWVudHNPcmRlci5PTERFU1QpXHJcbiAgICAgICAgICAgIHNvcnRlciA9IChhLCBiKSA9PiAoYS5zZW50QXQgLSBiLnNlbnRBdCkgKiAodGhpcy5uZXdlc3RMYXN0ID8gLTEgOiAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcy5zb3J0KHNvcnRlcik7XHJcbiAgICAgICAgdGhpcy5vbGRlck1lc3NhZ2VzLnNvcnQoc29ydGVyKTtcclxuICAgICAgICB0aGlzLm5ld01lc3NhZ2VzLnNvcnQoc29ydGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VSZWNlaXZlZChtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuYWRkTWVzc2FnZShtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBpc1Njcm9sbGVkVG9MYXRlc3QoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VDb250YWluZXIpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLm1lc3NhZ2VDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjdXJyZW50U2Nyb2xsID0gZWwuc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGVsLnNjcm9sbEhlaWdodCAtIGVsLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTY3JvbGwgPiBjdXJyZW50VG90YWwgLSAxMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VTZW50KG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUNvbnRhaW5lcilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnNjcm9sbFRvTGF0ZXN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsVG9MYXRlc3QoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VDb250YWluZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLm1lc3NhZ2VDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JyB9KTtcclxuICAgICAgICAvL2VsLnNjcm9sbFRvcCA9IGVsLnNjcm9sbEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2Nyb2xsVG9Db21tZW50KGNvbW1lbnRJZDogQ2hhdE1lc3NhZ2VbJ2lkJ10pIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JBbGxDb21tZW50c1RvTG9hZCgpO1xyXG5cclxuICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5nZXRFbGVtZW50Rm9yQ29tbWVudChjb21tZW50SWQpO1xyXG4gICAgICAgIGlmIChjb21tZW50KSB7XHJcbiAgICAgICAgICAgIGNvbW1lbnQuc2Nyb2xsSW50b1ZpZXcoe1xyXG4gICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgIGJsb2NrOiAnY2VudGVyJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RWxlbWVudEZvckNvbW1lbnQoY29tbWVudElkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWNvbW1lbnQtaWQ9XCIke2NvbW1lbnRJZH1cIl1gKTtcclxuICAgIH1cclxuXHJcbiAgICBtZW50aW9uc01lKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRVc2VyKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2UuaW5jbHVkZXMoYEAke3RoaXMuY3VycmVudFVzZXIudXNlcm5hbWV9YCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGFpbmVyXCIgI21lc3NhZ2VDb250YWluZXI+XHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZGF0YS1iZWZvcmVdXCI+PC9uZy1jb250ZW50PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b3Atc3RpY2t5XCI+XHJcbiAgICAgICAgPGEgKm5nSWY9XCIhbmV3ZXN0TGFzdFwiIG1hdC1idXR0b24gY2xhc3M9XCJuYXZcIiBbY2xhc3MudmlzaWJsZV09XCJzaG91bGRTaG93TmV3TWVzc2FnZUluZGljYXRvclwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAoY2xpY2spPVwic2hvd05ldygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5maWxlX3VwbG9hZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuZXdNZXNzYWdlcy5sZW5ndGggPj0gMVwiPlxyXG4gICAgICAgICAgICAgICAgTmV3ICh7e25ld01lc3NhZ2VzLmxlbmd0aH19KVxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5ld01lc3NhZ2VzLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICBOZXdlc3RcclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YSBtYXQtYnV0dG9uIGNsYXNzPVwibmF2XCIgW2NsYXNzLnZpc2libGVdPVwibmV3ZXN0TGFzdCAmJiBoYXNNb3JlICYmICFpc0xvYWRpbmdNb3JlXCIgaHJlZj1cImphdmFzY3JpcHQ6O1wiIChjbGljayk9XCJzaG93TW9yZSgpXCI+U2hvdyBlYXJsaWVyPC9hPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlcy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIiAqbmdJZj1cInNob3dFbXB0eVN0YXRlXCI+XHJcbiAgICAgICAgICAgIEJlIHRoZSBmaXJzdCB0byBjb21tZW50IVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIG1lc3NhZ2VzOyB0cmFja0J5OiBtZXNzYWdlSWRlbnRpdHlcIj5cclxuICAgICAgICA8YmFudGEtY29tbWVudFxyXG4gICAgICAgICAgICAqbmdJZj1cIiFtZXNzYWdlLmhpZGRlblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJicmV2aWF0ZWRcIlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgW2N1c3RvbU1lbnVJdGVtc109XCJjdXN0b21NZW51SXRlbXNcIlxyXG4gICAgICAgICAgICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcclxuICAgICAgICAgICAgW21pbmVdPVwiY3VycmVudFVzZXI/LmlkID09PSBtZXNzYWdlLnVzZXI/LmlkXCJcclxuICAgICAgICAgICAgW3Blcm1pc3Npb25zXT1cInNvdXJjZT8ucGVybWlzc2lvbnNcIlxyXG4gICAgICAgICAgICBbc2hvd1JlcGx5QWN0aW9uXT1cImFsbG93UmVwbGllc1wiXHJcbiAgICAgICAgICAgIFtlZGl0aW5nXT1cIm1lc3NhZ2UudHJhbnNpZW50U3RhdGUuZWRpdGluZ1wiXHJcbiAgICAgICAgICAgIFtnZW5lcmljQXZhdGFyVXJsXT1cImdlbmVyaWNBdmF0YXJVcmxcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwic291cmNlPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJlbmFibGVIb2xkT25DbGljayA/IChob2xkTmV3TWVzc2FnZXMgPSB0cnVlKSA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIChlZGl0U3RhcnRlZCk9XCJzdGFydEVkaXRpbmcobWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAoZGVsZXRlZCk9XCJkZWxldGVNZXNzYWdlKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKGVkaXRFbmRlZCk9XCJtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmcgPSBmYWxzZVwiXHJcbiAgICAgICAgICAgIChlZGl0ZWQpPVwic2F2ZUVkaXQobWVzc2FnZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh1c2VyU2VsZWN0ZWQpPVwic2VsZWN0TWVzc2FnZVVzZXIobWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAoYXZhdGFyU2VsZWN0ZWQpPVwic2VsZWN0QXZhdGFyKCRldmVudClcIlxyXG4gICAgICAgICAgICAodXNlcm5hbWVTZWxlY3RlZCk9XCJzZWxlY3RVc2VybmFtZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGxpa2VkKT1cImxpa2VNZXNzYWdlKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKHVubGlrZWQpPVwidW5saWtlTWVzc2FnZShtZXNzYWdlKVwiXHJcbiAgICAgICAgICAgIChyZXBvcnRlZCk9XCJyZXBvcnRNZXNzYWdlKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdE1lc3NhZ2UobWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAoc2hhcmVkKT1cInNoYXJlZE1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L2JhbnRhLWNvbW1lbnQ+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlubGluZS1yZXBsaWVzLWNvbnRhaW5lclwiICpuZ0lmPVwic2VsZWN0ZWRNZXNzYWdlID09PSBtZXNzYWdlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIi5pbmxpbmUtcmVwbGllc1wiPjwvbmctY29udGVudD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJuYXYtcG9pbnQgYm90dG9tLXN0aWNreVwiPlxyXG4gICAgICAgIDxhICpuZ0lmPVwibmV3ZXN0TGFzdFwiIG1hdC1idXR0b24gY2xhc3M9XCJuYXZcIiBbY2xhc3MudmlzaWJsZV09XCJzaG91bGRTaG93TmV3TWVzc2FnZUluZGljYXRvclwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAoY2xpY2spPVwic2hvd05ldygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5maWxlX2Rvd25sb2FkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5ld01lc3NhZ2VzLmxlbmd0aCA+PSAxXCI+XHJcbiAgICAgICAgICAgICAgICBOZXcgKHt7bmV3TWVzc2FnZXMubGVuZ3RofX0pXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibmV3TWVzc2FnZXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgIE5ld2VzdFxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2E+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxhIG1hdC1idXR0b24gY2xhc3M9XCJuYXZcIiBbY2xhc3MudmlzaWJsZV09XCIhbmV3ZXN0TGFzdCAmJiBoYXNNb3JlICYmICFpc0xvYWRpbmdNb3JlXCIgaHJlZj1cImphdmFzY3JpcHQ6O1wiIChjbGljayk9XCJzaG93TW9yZSgpXCI+U2hvdyBtb3JlPC9hPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLW1vcmVcIiAqbmdJZj1cImlzTG9hZGluZ01vcmVcIj5cclxuICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gPGRpdiBzdHlsZT1cImNvbG9yOiAjNjY2XCI+XHJcbiAgICAgICAgbj17e25ld01lc3NhZ2VzLmxlbmd0aH19LCBtPXt7bWVzc2FnZXMubGVuZ3RofX0sIG89e3tvbGRlck1lc3NhZ2VzLmxlbmd0aH19LFxyXG4gICAgICAgIHY9e3ttYXhWaXNpYmxlTWVzc2FnZXN9fSwgTT17e21heE1lc3NhZ2VzfX1cclxuICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCI6bm90KFtkYXRhLWJlZm9yZV0pOm5vdCguaW5saW5lLXJlcGxpZXMpXCI+PC9uZy1jb250ZW50PlxyXG48L2Rpdj5cclxuIl19
|