@banta/sdk 4.6.2 → 4.6.3
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/bundles/banta-sdk.umd.js +107 -20
- package/bundles/banta-sdk.umd.js.map +1 -1
- package/bundles/banta-sdk.umd.min.js +1 -1
- package/bundles/banta-sdk.umd.min.js.map +1 -1
- package/esm2015/lib/comments/banta-comments/banta-comments.component.js +21 -4
- package/esm2015/lib/comments/comment-view/comment-view.component.js +47 -1
- package/fesm2015/banta-sdk.js +66 -3
- package/fesm2015/banta-sdk.js.map +1 -1
- package/lib/comments/banta-comments/banta-comments.component.d.ts +5 -0
- package/lib/comments/comment-view/comment-view.component.d.ts +8 -0
- package/package.json +1 -1
|
@@ -18,6 +18,7 @@ export class BantaCommentsComponent {
|
|
|
18
18
|
this.activatedRoute = activatedRoute;
|
|
19
19
|
this.matSnackBar = matSnackBar;
|
|
20
20
|
this.ngZone = ngZone;
|
|
21
|
+
this.viewReady = new Promise(r => this.markViewReady = r);
|
|
21
22
|
// Loading Screen
|
|
22
23
|
this._loadingMessage = '';
|
|
23
24
|
this.loadingMessageVisible = false;
|
|
@@ -38,6 +39,7 @@ export class BantaCommentsComponent {
|
|
|
38
39
|
`
|
|
39
40
|
];
|
|
40
41
|
this.useInlineReplies = true;
|
|
42
|
+
this.loaded = new Promise(r => this.markLoaded = r);
|
|
41
43
|
// Properties
|
|
42
44
|
this._signInSelected = new Subject();
|
|
43
45
|
this._permissionDeniedError = new Subject();
|
|
@@ -74,6 +76,7 @@ export class BantaCommentsComponent {
|
|
|
74
76
|
{ hashtag: 'timeout', description: 'Cause a slow timeout error' },
|
|
75
77
|
{ hashtag: 'slow', description: 'Be slow when this message is posted' },
|
|
76
78
|
];
|
|
79
|
+
this.loadingSharedComment = false;
|
|
77
80
|
this.sendMessage = (message) => __awaiter(this, void 0, void 0, function* () {
|
|
78
81
|
var _a;
|
|
79
82
|
try {
|
|
@@ -170,6 +173,7 @@ export class BantaCommentsComponent {
|
|
|
170
173
|
}
|
|
171
174
|
callback();
|
|
172
175
|
}
|
|
176
|
+
this.markViewReady();
|
|
173
177
|
}
|
|
174
178
|
ngOnDestroy() {
|
|
175
179
|
this._subs.unsubscribe();
|
|
@@ -251,6 +255,7 @@ export class BantaCommentsComponent {
|
|
|
251
255
|
this.loadingMessage = `Here we go!`;
|
|
252
256
|
setTimeout(() => {
|
|
253
257
|
this.loading = false;
|
|
258
|
+
this.markLoaded();
|
|
254
259
|
}, 750);
|
|
255
260
|
return true;
|
|
256
261
|
}
|
|
@@ -330,15 +335,21 @@ export class BantaCommentsComponent {
|
|
|
330
335
|
const comment = document.querySelectorAll(`[data-comment-id="${commentId}"]`);
|
|
331
336
|
if (comment.length > 0) {
|
|
332
337
|
// comment.item(0).scroll({behavior: 'smooth'});
|
|
333
|
-
comment.item(0).scrollIntoView(
|
|
338
|
+
comment.item(0).scrollIntoView({
|
|
339
|
+
inline: 'center',
|
|
340
|
+
block: 'center'
|
|
341
|
+
});
|
|
334
342
|
}
|
|
335
343
|
}, 1000);
|
|
336
344
|
}
|
|
337
345
|
navigateToSharedComment(id) {
|
|
338
346
|
var _a, _b, _c, _d;
|
|
339
347
|
return __awaiter(this, void 0, void 0, function* () {
|
|
348
|
+
this.loadingSharedComment = true;
|
|
340
349
|
let source = this.source;
|
|
341
350
|
yield source.ready;
|
|
351
|
+
yield this.viewReady;
|
|
352
|
+
yield this.loaded;
|
|
342
353
|
console.log(`Navigating to shared comment with ID '${id}'...`);
|
|
343
354
|
let message;
|
|
344
355
|
try {
|
|
@@ -346,6 +357,7 @@ export class BantaCommentsComponent {
|
|
|
346
357
|
}
|
|
347
358
|
catch (e) {
|
|
348
359
|
console.error(`Failed to find comment from URL: ${e.message}`);
|
|
360
|
+
alert(`Could not load desired comment. It may have been removed.`);
|
|
349
361
|
return;
|
|
350
362
|
}
|
|
351
363
|
(_a = message.transientState) !== null && _a !== void 0 ? _a : (message.transientState = {});
|
|
@@ -354,6 +366,8 @@ export class BantaCommentsComponent {
|
|
|
354
366
|
if (message.parentMessageId) {
|
|
355
367
|
let parentMessage = yield this.source.get(message.parentMessageId);
|
|
356
368
|
(_b = parentMessage.transientState) !== null && _b !== void 0 ? _b : (parentMessage.transientState = {});
|
|
369
|
+
// Make sure that this message is loaded and visible to the user
|
|
370
|
+
yield this.commentView.loadMessageInContext(parentMessage);
|
|
357
371
|
let thread = yield this.selectMessage(parentMessage);
|
|
358
372
|
// Need to re-retrieve the message within the new chat source to affect its
|
|
359
373
|
// transient state.
|
|
@@ -365,10 +379,13 @@ export class BantaCommentsComponent {
|
|
|
365
379
|
yield new Promise(resolve => setTimeout(() => resolve(), 500));
|
|
366
380
|
}
|
|
367
381
|
else {
|
|
382
|
+
// Make sure that this message is loaded and visible to the user
|
|
383
|
+
yield this.commentView.loadMessageInContext(message);
|
|
368
384
|
(_d = message.transientState) !== null && _d !== void 0 ? _d : (message.transientState = {});
|
|
369
385
|
message.transientState.highlighted = true;
|
|
370
386
|
}
|
|
371
387
|
this.scrollToComment(id);
|
|
388
|
+
this.loadingSharedComment = false;
|
|
372
389
|
});
|
|
373
390
|
}
|
|
374
391
|
handlePermissionDenied(errorMessage) {
|
|
@@ -566,8 +583,8 @@ export class BantaCommentsComponent {
|
|
|
566
583
|
BantaCommentsComponent.decorators = [
|
|
567
584
|
{ type: Component, args: [{
|
|
568
585
|
selector: 'banta-comments',
|
|
569
|
-
template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>Loading...</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage && !useInlineReplies\">\r\n\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\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"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 (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 (selected)=\"selectMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"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]=\"false\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(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\r\n <banta-comment-field\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [maxLength]=\"maxCommentLength\"\r\n [canComment]=\"source?.permissions?.canPost\"\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 </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage && !useInlineReplies\">\r\n <banta-comment-field\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n [maxLength]=\"maxCommentLength\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n <banta-comment-sort\r\n [(sort)]=\"sortOrder\"></banta-comment-sort>\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 (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (selected)=\"selectMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(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\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n <div class=\"replies\">\r\n \r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(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 ></banta-comment-view>\r\n \r\n <banta-comment-field\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n [maxLength]=\"maxCommentLength\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [canComment]=\"source?.permissions?.canPost\"\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 </ng-container>\r\n </div>\r\n </div> \r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n</ng-container>\r\n",
|
|
570
|
-
styles: [":host{display:flex;flex-direction:column}@-webkit-keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{-webkit-animation-name:select-comment;animation-name:select-comment;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:2em;border-left:2px solid #333;padding-left:2em}banta-comment-view{opacity:1;transition:opacity .4s ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}.loading-screen{text-align:center;opacity:0;transition:opacity .25s ease-in-out}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:opacity .25s ease-in-out;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}banta-comment-sort{margin:0 0 0 auto;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;display:block}.inline-replies{margin-left:4em}@media (max-width:500px){.focused .replies{margin-left:0}.inline-replies{margin-left:1em}.focused .replies{padding-left:.5em}banta-comment-sort{margin:0;width:100%}}:host-context(.banta-mobile) .focused .replies{margin-left:0}:host-context(.banta-mobile) .inline-replies{margin-left:1em}:host-context(.banta-mobile) .focused .replies{padding-left:.5em}:host-context(.banta-mobile) banta-comment-sort{margin:0;width:100%}"]
|
|
586
|
+
template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>Loading...</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage && !useInlineReplies\">\r\n\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\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"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 (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 (selected)=\"selectMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"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]=\"false\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(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\r\n <banta-comment-field\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [maxLength]=\"maxCommentLength\"\r\n [canComment]=\"source?.permissions?.canPost\"\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 </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage && !useInlineReplies\">\r\n <banta-comment-field\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n [maxLength]=\"maxCommentLength\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n <banta-comment-sort\r\n [(sort)]=\"sortOrder\"></banta-comment-sort>\r\n\r\n <div class=\"loading-comment\" *ngIf=\"loadingSharedComment\">\r\n <h1>Loading desired comment...</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 <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 (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (selected)=\"selectMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(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\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n <div class=\"replies\">\r\n \r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(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 ></banta-comment-view>\r\n \r\n <banta-comment-field\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n [maxLength]=\"maxCommentLength\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [canComment]=\"source?.permissions?.canPost\"\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 </ng-container>\r\n </div>\r\n </div> \r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n</ng-container>\r\n",
|
|
587
|
+
styles: [":host{display:flex;flex-direction:column}@-webkit-keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{-webkit-animation-name:select-comment;animation-name:select-comment;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:2em;border-left:2px solid #333;padding-left:2em}banta-comment-view{opacity:1;transition:opacity .4s ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}.loading-screen{text-align:center;opacity:0;transition:opacity .25s ease-in-out}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:opacity .25s ease-in-out;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}banta-comment-sort{margin:0 0 0 auto;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;display:block}.inline-replies{margin-left:4em}@media (max-width:500px){.focused .replies{margin-left:0}.inline-replies{margin-left:1em}.focused .replies{padding-left:.5em}banta-comment-sort{margin:0;width:100%}}:host-context(.banta-mobile) .focused .replies{margin-left:0}:host-context(.banta-mobile) .inline-replies{margin-left:1em}:host-context(.banta-mobile) .focused .replies{padding-left:.5em}:host-context(.banta-mobile) banta-comment-sort{margin:0;width:100%}.loading-comment{z-index:100;border:1px solid #333;background:#000;color:#fff;padding:1em;border-radius:4px;text-align:center}.loading-comment h1{font-weight:100;text-align:center}.loading-comment mat-spinner{margin:0 auto}"]
|
|
571
588
|
},] }
|
|
572
589
|
];
|
|
573
590
|
BantaCommentsComponent.ctorParameters = () => [
|
|
@@ -614,4 +631,4 @@ BantaCommentsComponent.propDecorators = {
|
|
|
614
631
|
avatarSelected: [{ type: Output }],
|
|
615
632
|
shared: [{ type: Output }]
|
|
616
633
|
};
|
|
617
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFudGEtY29tbWVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYmFudGEtY29tbWVudHMvYmFudGEtY29tbWVudHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdEQUF3RDs7QUFFeEQsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hLLE9BQU8sRUFBcUIsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUc5RTs7R0FFRztBQU1ILE1BQU0sT0FBTyxzQkFBc0I7SUFDL0IsWUFDWSxPQUF3QixFQUN4QixVQUFtQyxFQUNuQyxjQUE4QixFQUM5QixXQUF3QixFQUN4QixNQUFjO1FBSmQsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENB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QztnQkFDaEQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2FBQzFDO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO2FBQ3JFO1FBQ0wsQ0FBQztLQUFBOzs7WUEvb0JKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQiw0aVZBQThDOzthQUVqRDs7O1lBZlEsZUFBZTtZQUx5QixVQUFVO1lBSWxELGNBQWM7WUFHZCxXQUFXO1lBUDZELE1BQU07Ozs0QkFnSGxGLFdBQVcsU0FBQyxvQkFBb0I7dUNBR2hDLFlBQVksU0FBQyw4QkFBOEIsRUFBRSxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUM7OEJBMkVoRSxLQUFLOytCQXNCTCxLQUFLOzhCQUNMLEtBQUs7K0JBWUwsS0FBSzswQkFZTCxTQUFTLFNBQUMsYUFBYTs4QkFHdkIsWUFBWSxTQUFDLG9CQUFvQjswQkFnRmpDLEtBQUs7d0JBQ0wsS0FBSzt5QkFDTCxLQUFLOzJCQUNMLEtBQUs7b0NBQ0wsS0FBSzsrQkFDTCxLQUFLOzZCQUNMLEtBQUs7K0JBQ0wsS0FBSzswQkFDTCxLQUFLOzBCQUNMLEtBQUs7aUNBQ0wsS0FBSzsrQkFDTCxLQUFLO3lDQUVMLEtBQUs7MkJBQ0wsS0FBSztxQkFJTCxLQUFLO3VCQTBDTCxLQUFLO3NCQU1MLEtBQUs7NkJBV0wsTUFBTTtpQ0FDTixNQUFNO29DQUNOLE1BQU07c0JBQ04sTUFBTTt1QkFDTixNQUFNO3VCQUNOLE1BQU07MkJBQ04sTUFBTTsrQkFDTixNQUFNOzZCQUNOLE1BQU07cUJBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiQHR5cGVzL3Jlc2l6ZS1vYnNlcnZlci1icm93c2VyXCIgLz5cclxuXHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE5nWm9uZSwgT3V0cHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVc2VyLCBDaGF0TWVzc2FnZSwgQ29tbWVudHNPcmRlciB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBIYXNoVGFnIH0gZnJvbSAnLi4vY29tbWVudC1maWVsZC9jb21tZW50LWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kQmFzZSB9IGZyb20gJy4uLy4uL2NoYXQtYmFja2VuZC1iYXNlJztcclxuaW1wb3J0IHsgQ2hhdFNvdXJjZUJhc2UgfSBmcm9tICcuLi8uLi9jaGF0LXNvdXJjZS1iYXNlJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBCYW50YVJlcGx5U2VuZE9wdGlvbnNEaXJlY3RpdmUgfSBmcm9tICcuLi9yZXBseS1zZW5kLW9wdGlvbnMuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTWVzc2FnZU1lbnVJdGVtIH0gZnJvbSAnLi4vLi4vbWVzc2FnZS1tZW51LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21tZW50Vmlld0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1lbnQtdmlldy9jb21tZW50LXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tbWVudENvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1lbnQvY29tbWVudC5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIENvbW1lbnRzIGNvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JhbnRhLWNvbW1lbnRzJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9iYW50YS1jb21tZW50cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9iYW50YS1jb21tZW50cy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYW50YUNvbW1lbnRzQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYmFja2VuZDogQ2hhdEJhY2tlbmRCYXNlLFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICAgICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJpdmF0ZSBtYXRTbmFja0JhcjogTWF0U25hY2tCYXIsXHJcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZSA9IGFzeW5jIChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0ID0gYXdhaXQgdGhpcy5zaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZD8uKG1lc3NhZ2UsIHRoaXMuc291cmNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghaW50ZXJjZXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2Uuc2VuZChtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2Uuc29ydE9yZGVyICE9PSBDb21tZW50c09yZGVyLk5FV0VTVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydE9yZGVyID0gQ29tbWVudHNPcmRlci5ORVdFU1Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uKGUsICdDb3VsZCBub3Qgc2VuZDogJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VuZFJlcGx5ID0gYXN5bmMgKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmNlcHQgPSBhd2FpdCB0aGlzLnNob3VsZEludGVyY2VwdE1lc3NhZ2VTZW5kPy4obWVzc2FnZSwgdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcmNlcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZC5zZW5kKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbihlLCAnQ291bGQgbm90IHNlbmQgcmVwbHk6ICcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbGVtZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUJhY2tlbmRFeGNlcHRpb25Bc0FsZXJ0KGU6IEVycm9yLCBwcmVmaXg6IHN0cmluZyA9ICcnKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uKGUsIHByZWZpeCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBhbGVydChlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUJhY2tlbmRFeGNlcHRpb24oZTogRXJyb3IsIHByZWZpeDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZS5tZXNzYWdlO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLnN0YXJ0c1dpdGgoJ3Blcm1pc3Npb24tZGVuaWVkfCcpKSB7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZS5yZXBsYWNlKC9ecGVybWlzc2lvbi1kZW5pZWRcXHwvLCAnJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLnN0YXJ0c1dpdGgoYGFwcC1oYW5kbGV8YCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYW4gZXJyb3IgZHVyaW5nIGF1dGhvcml6ZUFjdGlvbiBvbiB0aGUgYmFja2VuZCwgcGFzcyBjb250cm9sIHRvIHRoZSB1c2VyLXByb3ZpZGVkIFxyXG4gICAgICAgICAgICAgICAgLy8gcGVybWlzc2lvbi1kZW5pZWQgaGFuZGxlci5cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRQZXJtaXNzaW9uRGVuaWVkKGVycm9yTWVzc2FnZS5yZXBsYWNlKC9eYXBwLWhhbmRsZVxcfC8sICcnKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtwcmVmaXh9JHtlcnJvck1lc3NhZ2V9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIEV2ZW50cyAvIEluaXRpYWxpemF0aW9uXHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3Vicy5hZGQodGhpcy5iYWNrZW5kLnVzZXJDaGFuZ2VkLnN1YnNjcmliZSh1c2VyID0+IHRoaXMudXNlciA9IHVzZXIpKTtcclxuICAgICAgICB0aGlzLnN0YXJ0TG9hZGluZygpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgbGV0IHF1ZXJ5U3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgIGxldCBxdWVyeSA9IHF1ZXJ5U3RyaW5nLnNwbGl0KCcmJylcclxuICAgICAgICAgICAgICAgIC5tYXAocyA9PiBzLnNwbGl0KCc9JykpXHJcbiAgICAgICAgICAgICAgICAucmVkdWNlKChvLCBbaywgdl0pID0+IChvW2RlY29kZVVSSUNvbXBvbmVudChrKV0gPSBkZWNvZGVVUklDb21wb25lbnQodiksIG8pLCB7fSlcclxuICAgICAgICAgICAgO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY29tbWVudElEID0gcXVlcnlbJ2NvbW1lbnQnXTtcclxuICAgICAgICAgICAgaWYgKGNvbW1lbnRJRCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRDb21tZW50SUQgPSBjb21tZW50SUQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XHJcbiAgICBwcml2YXRlIHdpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGhlaWdodDogbnVtYmVyO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuYmFudGEtbW9iaWxlJylcclxuICAgIGdldCBpc01vYmlsZVNpemVkKCkgeyByZXR1cm4gdGhpcy53aWR0aCA8IDUwMDsgfVxyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoQmFudGFSZXBseVNlbmRPcHRpb25zRGlyZWN0aXZlLCB7cmVhZDogVGVtcGxhdGVSZWZ9KSBcclxuICAgIHNlbmRSZXBseU9wdGlvbnNUZW1wbGF0ZTogYW55O1xyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnRocmVhZFZpZXdRdWVyeS5jaGFuZ2VzLnN1YnNjcmliZShjaGFuZ2VzID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYGkgc2VlIGNoYW5nZXMuLi5gKTtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoY2hhbmdlcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBsZXQgY2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gc2l6ZS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHNpemUuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPbmUgY2hlY2sgaXMgYmV0dGVyIHRoYW4gbm90aGluZyFcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgIH0sIDEwMDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLl9zdWJzLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpXHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgc2V0U291cmNlRnJvbVRvcGljSUQodG9waWNJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW2JhbnRhLWNvbW1lbnRzXSBTdWJzY3JpYmluZyB0byB0b3BpYyBzb3VyY2UgJyR7dG9waWNJRH0nYCk7XHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gYXdhaXQgdGhpcy5iYWNrZW5kLmdldFNvdXJjZUZvclRvcGljKHRvcGljSUQsIHsgc29ydE9yZGVyOiB0aGlzLnNvcnRPcmRlciB9KTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlSXNPd25lZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTG9hZGluZyBTY3JlZW5cclxuICAgIHByaXZhdGUgX2xvYWRpbmdNZXNzYWdlID0gJyc7XHJcbiAgICBsb2FkaW5nTWVzc2FnZVZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgbG9hZGluZ01lc3NhZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdNZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBsb2FkaW5nTWVzc2FnZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2VWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdNZXNzYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdNZXNzYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZVZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBzaG93TG9hZGluZ1NjcmVlbiA9IGZhbHNlO1xyXG4gICAgbG9hZGluZ1N0YXJ0ZWRBdDogbnVtYmVyO1xyXG4gICAgbWVzc2FnZUNoYW5nZWRBdDogbnVtYmVyO1xyXG4gICAgc2hhcmVkQ29tbWVudElEOiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KCkgY3VzdG9tTWVudUl0ZW1zOiBNZXNzYWdlTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgc3RhcnRMb2FkaW5nKCkge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXJ0ZWRBdCA9IHRoaXMubWVzc2FnZUNoYW5nZWRBdCA9IERhdGUubm93KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDEwMCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDI1MCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhgW0JhbnRhXSBMb2FkaW5nIGlzIHRha2luZyBhIGxvbmcgdGltZSEgU2hvd2luZyBsb2FkaW5nIHNjcmVlbi5gKTtcclxuICAgICAgICB0aGlzLnNob3dMb2FkaW5nU2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdUaW1lciA9IHNldEludGVydmFsKCgpID0+IHRoaXMudXBkYXRlTG9hZGluZygpLCAxMDAwKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbG9hZGluZ1RpbWVyO1xyXG4gICAgcHJpdmF0ZSBfbG9hZGluZ01lc3NhZ2VJbmRleCA9IDA7XHJcblxyXG4gICAgQElucHV0KCkgbWF4Q29tbWVudExlbmd0aDogbnVtYmVyID0gMTUwMDtcclxuICAgIEBJbnB1dCgpIGxvYWRpbmdNZXNzYWdlczogc3RyaW5nW10gPSBbXHJcbiAgICAgICAgYEp1c3QgYSBzZWNvbmQuLi5gLFxyXG4gICAgICAgIGBXZSdyZSBkZWZpbml0ZWx5IHdvcmtpbmcgb24gaXQuYCxcclxuICAgICAgICBgVGhlcmUncyBubyBuZWVkIHRvIHJlZnJlc2guYCxcclxuICAgICAgICBgSXQncyBkZWZpbml0ZWx5IHdvcnRoIHRoZSB3YWl0IWAsXHJcbiAgICAgICAgYFRoaXMgaGFzIG5ldmVyIGhhcHBlbmVkIGJlZm9yZS5gLFxyXG4gICAgICAgIGBXZSdsbCBrZWVwIHRyeWluZywgYnV0IGl0J3Mgbm90IGxvb2tpbmcgZ3JlYXQuIFxyXG4gICAgICAgICAgICBDb21tZW50aW5nICYgY2hhdCBzZXJ2aWNlcyBtYXkgYmUgZG93bi4gXHJcbiAgICAgICAgICAgIElmIHlvdSBjb250aW51ZSB0byBleHBlcmllbmNlIGlzc3VlcywgcGxlYXNlIGNvbnRhY3Qgc3VwcG9ydC5cclxuICAgICAgICBgXHJcbiAgICBdO1xyXG5cclxuICAgIEBJbnB1dCgpIHVzZUlubGluZVJlcGxpZXMgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzIHRoZSBDb21tZW50Vmlld0NvbXBvbmVudCBmb3IgdGhpcyBCYW50YUNvbW1lbnRzQ29tcG9uZW50LiBcclxuICAgICAqIENvbW1lbnRWaWV3Q29tcG9uZW50IGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBDaGF0U291cmNlIFxyXG4gICAgICogb2JqZWN0IGFuZCByZW5kZXJpbmcgY29tbWVudHMgYXMgQ29tbWVudENvbXBvbmVudHMuIEl0IGlzIHRoZSBzb3VyY2Ugb2YgXHJcbiAgICAgKiB0cnV0aCBmb3Igd2hpY2ggQ29tbWVudENvbXBvbmVudCBjb3JyZXNwb25kcyB0byB3aGljaCBDaGF0TWVzc2FnZS4gXHJcbiAgICAgKiBcclxuICAgICAqIE5vdGUgdGhhdCB0aGlzIENvbW1lbnRWaWV3Q29tcG9uZW50IGlzIG9ubHkgZm9yIHRoZSB0b3AgbGV2ZWwgY29tbWVudHMuXHJcbiAgICAgKiBSZXBsaWVzIGFyZSBoYW5kbGVkIGJ5IGEgc2VwYXJhdGUgQ29tbWVudFZpZXdDb21wb25lbnQgd2hpY2ggY2FuIGJlIFxyXG4gICAgICogcmV0cmlldmVkIHVzaW5nIHRoZSB0aHJlYWRWaWV3IHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdjb21tZW50VmlldycpXHJcbiAgICBjb21tZW50VmlldzogQ29tbWVudFZpZXdDb21wb25lbnQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZHJlbihDb21tZW50Vmlld0NvbXBvbmVudClcclxuICAgIHRocmVhZFZpZXdRdWVyeTogUXVlcnlMaXN0PENvbW1lbnRWaWV3Q29tcG9uZW50PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGVtcHRzIHRvIGZpbmQgdGhlIENvbW1lbnRDb21wb25lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gQ2hhdE1lc3NhZ2UuXHJcbiAgICAgKiBUaGUgQ2hhdE1lc3NhZ2UgY291bGQgYmUgYSB0b3AtbGV2ZWwgbWVzc2FnZSBpbiB0aGlzIGNvbnZlcnNhdGlvbiwgb3IgYSByZXBseSwgXHJcbiAgICAgKiBidXQgbm90ZSB0aGF0IGEgQ29tbWVudENvbXBvbmVudCB3aWxsIG9ubHkgZXhpc3QgZm9yIGEgcmVwbHkgaWYgdGhlIHVzZXIgaGFzIFxyXG4gICAgICogdGhlIHJlbGV2YW50IHJlcGx5IHRocmVhZCBvcGVuLlxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9vayBmb3JcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tbWVudENvbXBvbmVudEZvck1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpOiBDb21tZW50Q29tcG9uZW50IHtcclxuICAgICAgICBpZiAobWVzc2FnZS5wYXJlbnRNZXNzYWdlSWQpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRocmVhZFZpZXc/LmdldENvbW1lbnRDb21wb25lbnRGb3JNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudFZpZXcuZ2V0Q29tbWVudENvbXBvbmVudEZvck1lc3NhZ2UobWVzc2FnZSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjY2VzcyB0aGUgQ29tbWVudFZpZXdDb21wb25lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudGx5IG9wZW4gcmVwbHkgdGhyZWFkLlxyXG4gICAgICogVGhpcyBpcyBub3QgdGhlIHRvcCBsZXZlbCBjb21tZW50cywgYnV0IGluc3RlYWQgdGhlIHJlcGx5IHRocmVhZCB0aGF0IHRoZSB1c2VyIGhhcyBcclxuICAgICAqIG9wZW5lZCAob25seSBvbmUgc2V0IG9mIHJlcGxpZXMgY2FuIGJlIG9wZW4gYXQgYSB0aW1lKS5cclxuICAgICAqIFxyXG4gICAgICogRm9yIGRldGFpbHMgYWJvdXQgd2hhdCBDb21tZW50Vmlld0NvbXBvbmVudCBhZmZvcmRzIHlvdSwgc2VlIHRoZSBjb21tZW50VmlldyBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgZ2V0IHRocmVhZFZpZXcoKSB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy50aHJlYWRWaWV3UXVlcnkpLmZpbHRlcih4ID0+IHggIT09IHRoaXMuY29tbWVudFZpZXcpWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlTG9hZGluZygpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5zb3VyY2U/LnN0YXRlICYmIHRoaXMuc291cmNlPy5zdGF0ZSAhPT0gJ2Nvbm5lY3RpbmcnKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fbG9hZGluZ1RpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IGBIZXJlIHdlIGdvIWA7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sIDc1MCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1lc3NhZ2VTd2l0Y2hUaW1lID0gNSoxMDAwO1xyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VDaGFuZ2VkQXQgKyBtZXNzYWdlU3dpdGNoVGltZSA8IERhdGUubm93KCkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubG9hZGluZ01lc3NhZ2VzW3RoaXMuX2xvYWRpbmdNZXNzYWdlSW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlID0gdGhpcy5sb2FkaW5nTWVzc2FnZXNbdGhpcy5fbG9hZGluZ01lc3NhZ2VJbmRleCsrXTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNoYW5nZWRBdCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9wZXJ0aWVzXHJcblxyXG4gICAgcHJpdmF0ZSBfc2lnbkluU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfcGVybWlzc2lvbkRlbmllZEVycm9yID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gICAgcHJpdmF0ZSBfZWRpdEF2YXRhclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3Vwdm90ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3JlcG9ydGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfdXNlclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9zaGFyZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3VzZXJuYW1lU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG4gICAgcHJpdmF0ZSBfYXZhdGFyU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG4gICAgcHJpdmF0ZSBfc291cmNlOiBDaGF0U291cmNlQmFzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNrIHdoZXRoZXIgd2UgY3JlYXRlZCB0aGlzIHNvdXJjZS4gSWYgd2UgZGlkIG5vdCAoaWUgaXQgd2FzIHBhc3NlZCBpbiBmcm9tIHRoZSBjYWxsZXIpLFxyXG4gICAgICogdGhlbiB3ZSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGNsb3NlKCkuIElmIHdlIGRvIG93biBpdCB0aG91Z2gsIHdlIHdpbGwgY2FsbCBjbG9zZSgpIFxyXG4gICAgICogd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGl0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9zb3VyY2VJc093bmVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9zdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICAgcHJpdmF0ZSBfc29ydE9yZGVyOiBDb21tZW50c09yZGVyID0gQ29tbWVudHNPcmRlci5ORVdFU1Q7XHJcbiAgICBwcml2YXRlIF90b3BpY0lEOiBzdHJpbmc7XHJcbiAgICBcclxuICAgIHVzZXI6IFVzZXI7XHJcbiAgICBzZWxlY3RlZE1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG4gICAgc2VsZWN0ZWRNZXNzYWdlVGhyZWFkOiBDaGF0U291cmNlQmFzZTtcclxuICAgIHNlbGVjdGVkTWVzc2FnZVZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBJbnB1dHNcclxuXHJcbiAgICBASW5wdXQoKSBzaWduSW5MYWJlbCA9ICdTaWduIEluJztcclxuICAgIEBJbnB1dCgpIHNlbmRMYWJlbCA9ICdTZW5kJztcclxuICAgIEBJbnB1dCgpIHJlcGx5TGFiZWwgPSAnUmVwbHknO1xyXG4gICAgQElucHV0KCkgc2VuZGluZ0xhYmVsID0gJ1NlbmRpbmcnO1xyXG4gICAgQElucHV0KCkgcGVybWlzc2lvbkRlbmllZExhYmVsID0gJ1NlbmQnO1xyXG4gICAgQElucHV0KCkgcG9zdENvbW1lbnRMYWJlbCA9ICdQb3N0IGEgY29tbWVudCc7XHJcbiAgICBASW5wdXQoKSBwb3N0UmVwbHlMYWJlbCA9ICdQb3N0IGEgcmVwbHknO1xyXG4gICAgQElucHV0KCkgYWxsb3dBdHRhY2htZW50cyA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBmaXhlZEhlaWdodDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIG1heE1lc3NhZ2VzOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBtYXhWaXNpYmxlTWVzc2FnZXM6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGdlbmVyaWNBdmF0YXJVcmwgPSBgaHR0cHM6Ly9ncmF2YXRhci5jb20vYXZhdGFyLyR7RGF0ZS5ub3coKS50b1N0cmluZygxNil9P3M9NTEyJmQ9cm9ib2hhc2hgO1xyXG5cclxuICAgIEBJbnB1dCgpIHNob3VsZEludGVyY2VwdE1lc3NhZ2VTZW5kPzogKG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBzb3VyY2U6IENoYXRTb3VyY2VCYXNlKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcclxuICAgIEBJbnB1dCgpIHBhcnRpY2lwYW50czogVXNlcltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBfc291cmNlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBzb3VyY2UoKTogQ2hhdFNvdXJjZUJhc2UgeyByZXR1cm4gdGhpcy5fc291cmNlOyB9XHJcbiAgICBzZXQgc291cmNlKHZhbHVlKSB7IFxyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlSXNPd25lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2UgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50cyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc291cmNlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fc291cmNlSXNPd25lZCA9IGZhbHNlOyAvLyBBc3N1bWUgd2UgZG9uJ3Qgb3duIHRoaXMgc291cmNlLlxyXG4gICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhcmVkQ29tbWVudElEKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9TaGFyZWRDb21tZW50KHRoaXMuc2hhcmVkQ29tbWVudElEKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkQ29tbWVudElEID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fc291cmNlLm1lc3NhZ2VzLmZvckVhY2gobSA9PiB0aGlzLmFkZFBhcnRpY2lwYW50KG0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbi5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VSZWNlaXZlZC5zdWJzY3JpYmUobSA9PiB0aGlzLmFkZFBhcnRpY2lwYW50KG0pKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbi5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VTZW50LnN1YnNjcmliZShtID0+IHRoaXMuYWRkUGFydGljaXBhbnQobSkpKTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5tZXNzYWdlVXBkYXRlZC5zdWJzY3JpYmUobXNnID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgY29tbWVudHMgcmVjZWl2ZWQgbWVzc2FnZTogYCwgbXNnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmlkID09PSB0aGlzLnNlbGVjdGVkTWVzc2FnZT8uaWQgJiYgbXNnLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0TWVzc2FnZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlRoZSB0aHJlYWQgeW91IHdlcmUgdmlld2luZyB3YXMgcmVtb3ZlZC5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgQElucHV0KCkgXHJcbiAgICBoYXNodGFnczogSGFzaFRhZ1tdID0gW1xyXG4gICAgICAgIHtoYXNodGFnOiAnZXJyb3InLCBkZXNjcmlwdGlvbjogJ0NhdXNlIGFuIGVycm9yJ30sXHJcbiAgICAgICAge2hhc2h0YWc6ICd0aW1lb3V0JywgZGVzY3JpcHRpb246ICdDYXVzZSBhIHNsb3cgdGltZW91dCBlcnJvcid9LFxyXG4gICAgICAgIHtoYXNodGFnOiAnc2xvdycsIGRlc2NyaXB0aW9uOiAnQmUgc2xvdyB3aGVuIHRoaXMgbWVzc2FnZSBpcyBwb3N0ZWQnfSxcclxuICAgIF07XHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHRvcGljSUQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3RvcGljSUQ7IH1cclxuICAgIHNldCB0b3BpY0lEKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RvcGljSUQgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RvcGljSUQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldFNvdXJjZUZyb21Ub3BpY0lEKHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE91dHB1dHNcclxuXHJcbiAgICBAT3V0cHV0KCkgZ2V0IHNpZ25JblNlbGVjdGVkKCk6IE9ic2VydmFibGU8dm9pZD4geyByZXR1cm4gdGhpcy5fc2lnbkluU2VsZWN0ZWQ7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgZWRpdEF2YXRhclNlbGVjdGVkKCkgeyByZXR1cm4gdGhpcy5fZWRpdEF2YXRhclNlbGVjdGVkOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHBlcm1pc3Npb25EZW5pZWRFcnJvcigpOiBPYnNlcnZhYmxlPHN0cmluZz4geyByZXR1cm4gdGhpcy5fcGVybWlzc2lvbkRlbmllZEVycm9yOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHVwdm90ZWQoKSB7IHJldHVybiB0aGlzLl91cHZvdGVkLmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHJlcG9ydGVkKCkgeyByZXR1cm4gdGhpcy5fcmVwb3J0ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgc2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZC5hc09ic2VydmFibGUoKTsgfVxyXG4gICAgQE91dHB1dCgpIGdldCB1c2VyU2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl91c2VyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgdXNlcm5hbWVTZWxlY3RlZCgpIHsgcmV0dXJuIHRoaXMuX3VzZXJuYW1lU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgYXZhdGFyU2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9hdmF0YXJTZWxlY3RlZC5hc09ic2VydmFibGUoKTsgfVxyXG4gICAgQE91dHB1dCgpIGdldCBzaGFyZWQoKSB7IHJldHVybiB0aGlzLl9zaGFyZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuXHJcbiAgICBnZXQgc29ydE9yZGVyKCkgeyByZXR1cm4gdGhpcy5fc29ydE9yZGVyOyB9XHJcbiAgICBzZXQgc29ydE9yZGVyKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NvcnRPcmRlciAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc29ydE9yZGVyID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTb3VyY2VGcm9tVG9waWNJRCh0aGlzLnRvcGljSUQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2VuZE1lc3NhZ2U6IChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4gdm9pZDtcclxuICAgIHNlbmRSZXBseTogKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB2b2lkO1xyXG5cclxuICAgIC8vIFVJIEludGVyYWN0aW9uc1xyXG5cclxuICAgIHNjcm9sbFRvQ29tbWVudChjb21tZW50SWQ6IENoYXRNZXNzYWdlWydpZCddKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb21tZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtY29tbWVudC1pZD1cIiR7Y29tbWVudElkfVwiXWApO1xyXG4gICAgICAgICAgaWYgKGNvbW1lbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBjb21tZW50Lml0ZW0oMCkuc2Nyb2xsKHtiZWhhdmlvcjogJ3Ntb290aCd9KTtcclxuICAgICAgICAgICAgY29tbWVudC5pdGVtKDApLnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbmF2aWdhdGVUb1NoYXJlZENvbW1lbnQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZTtcclxuXHJcbiAgICAgICAgYXdhaXQgc291cmNlLnJlYWR5O1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhgTmF2aWdhdGluZyB0byBzaGFyZWQgY29tbWVudCB3aXRoIElEICcke2lkfScuLi5gKTtcclxuICAgICAgICBsZXQgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMuc291cmNlLmdldChpZCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmluZCBjb21tZW50IGZyb20gVVJMOiAke2UubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZSA/Pz0ge307XHJcblxyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGFyZW50IG1lc3NhZ2UsIHdlIHNob3VsZCBpbnN0ZWFkIGZvY3VzIHRoYXQgYW5kIGxldCB0aGUgXHJcbiAgICAgICAgLy8gc2Nyb2xsVG9Db21tZW50IGFuZCBoaWdobGlnaHQgZG8gdGhlIHdvcmsuXHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlLnBhcmVudE1lc3NhZ2VJZCkge1xyXG5cclxuICAgICAgICAgICAgbGV0IHBhcmVudE1lc3NhZ2UgPSBhd2FpdCB0aGlzLnNvdXJjZS5nZXQobWVzc2FnZS5wYXJlbnRNZXNzYWdlSWQpO1xyXG4gICAgICAgICAgICBwYXJlbnRNZXNzYWdlLnRyYW5zaWVudFN0YXRlID8/PSB7fTtcclxuICAgICAgICAgICAgbGV0IHRocmVhZCA9IGF3YWl0IHRoaXMuc2VsZWN0TWVzc2FnZShwYXJlbnRNZXNzYWdlKTsgXHJcblxyXG4gICAgICAgICAgICAvLyBOZWVkIHRvIHJlLXJldHJpZXZlIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgbmV3IGNoYXQgc291cmNlIHRvIGFmZmVjdCBpdHNcclxuICAgICAgICAgICAgLy8gdHJhbnNpZW50IHN0YXRlLlxyXG4gICAgICAgICAgICBhd2FpdCB0aHJlYWQucmVhZHk7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aHJlYWQuZ2V0KG1lc3NhZ2UuaWQpO1xyXG4gICAgICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlID8/PSB7fTtcclxuICAgICAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5oaWdobGlnaHRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGlyKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCA1MDApKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZSA/Pz0ge307XHJcbiAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUuaGlnaGxpZ2h0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb0NvbW1lbnQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVBlcm1pc3Npb25EZW5pZWQoZXJyb3JNZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBUaGlzIGlzIHdoYXQgb3RoZXIgY29tcG9uZW50cyBjYWxsIHdoZW4gaGFuZGxpbmcgcGVybWlzc2lvbiBlcnJvcnNcclxuICAgICAgICBcclxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLnN0YXJ0c1dpdGgoYGFwcC1oYW5kbGV8YCkpIHtcclxuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBlcnJvciBkdXJpbmcgYXV0aG9yaXplQWN0aW9uIG9uIHRoZSBiYWNrZW5kLCBwYXNzIGNvbnRyb2wgdG8gdGhlIHVzZXItcHJvdmlkZWQgXHJcbiAgICAgICAgICAgIC8vIHBlcm1pc3Npb24tZGVuaWVkIGhhbmRsZXIuXHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbmRQZXJtaXNzaW9uRGVuaWVkKGVycm9yTWVzc2FnZS5yZXBsYWNlKC9eYXBwLWhhbmRsZVxcfC8sICcnKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFsZXJ0KGVycm9yTWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VuZFBlcm1pc3Npb25EZW5pZWQobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fcGVybWlzc2lvbkRlbmllZEVycm9yLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsVG9NZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgbGV0IGVsID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtY29tbWVudC1pZD1cIiR7bWVzc2FnZS5pZH1cIl1gKTtcclxuICAgICAgICBpZiAoIWVsKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiAnY2VudGVyJywgaW5saW5lOiAnc3RhcnQnfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRQYXJ0aWNpcGFudChtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGlmICghbWVzc2FnZSB8fCAhbWVzc2FnZS51c2VyIHx8ICFtZXNzYWdlLnVzZXIuaWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5wYXJ0aWNpcGFudHMuZmluZCh4ID0+IHguaWQgPT09IG1lc3NhZ2UudXNlci5pZCk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYXJ0aWNpcGFudHMucHVzaChtZXNzYWdlLnVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFjdGlvbnNcclxuXHJcbiAgICBhc3luYyBsaWtlTWVzc2FnZShzb3VyY2U6IENoYXRTb3VyY2VCYXNlLCBtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGlmICghdGhpcy51c2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1NpZ25JbigpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl91cHZvdGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5saWtpbmcgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5saWtlTWVzc2FnZShtZXNzYWdlLmlkKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbkFzQWxlcnQoZSwgJ0NvdWxkIG5vdCBsaWtlIHRoaXMgbWVzc2FnZTogJyk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMjUwKSk7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUubGlraW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGlrZU1lc3NhZ2Uoc291cmNlOiBDaGF0U291cmNlQmFzZSwgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dTaWduSW4oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdXB2b3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUubGlraW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlclN0YXRlPy5saWtlZClcclxuICAgICAgICAgICAgbWVzc2FnZS5saWtlcyA9IChtZXNzYWdlLmxpa2VzIHx8IDApIC0gMTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgc291cmNlLnVubGlrZU1lc3NhZ2UobWVzc2FnZS5pZCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tlbmRFeGNlcHRpb25Bc0FsZXJ0KGUsICdGYWlsZWQgdG8gdW5saWtlIHRoaXMgbWVzc2FnZTogJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAyNTApKTtcclxuICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmxpa2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlcG9ydE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVuc2VsZWN0TWVzc2FnZSgpIHtcclxuICAgICAgICBsZXQgbWVzc2FnZSA9IHRoaXMuc2VsZWN0ZWRNZXNzYWdlO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RlZC5uZXh0KG51bGwpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLmNsb3NlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1lc3NhZ2UpXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb01lc3NhZ2UobWVzc2FnZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNlbGVjdE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lc3NhZ2UgPT09IG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgdGhpcy51bnNlbGVjdE1lc3NhZ2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9zZWxlY3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNZXNzYWdlID0gbWVzc2FnZTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRNZXNzYWdlVGhyZWFkID0gYXdhaXQgdGhpcy5iYWNrZW5kLmdldFNvdXJjZUZvclRocmVhZCh0aGlzLnRvcGljSUQsIG1lc3NhZ2UuaWQpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0ZWRNZXNzYWdlVmlzaWJsZSA9IHRydWUpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZCA9IHNlbGVjdGVkTWVzc2FnZVRocmVhZDtcclxuICAgICAgICB9LCAyNTApO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRNZXNzYWdlVGhyZWFkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dTaWduSW4oKSB7XHJcbiAgICAgICAgdGhpcy5fc2lnbkluU2VsZWN0ZWQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dFZGl0QXZhdGFyKCkge1xyXG4gICAgICAgIHRoaXMuX2VkaXRBdmF0YXJTZWxlY3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2VsZWN0TWVzc2FnZVVzZXIobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2VsZWN0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZWxlY3RVc2VybmFtZSh1c2VyOiBVc2VyKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlcm5hbWVTZWxlY3RlZC5uZXh0KHVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNlbGVjdEF2YXRhcih1c2VyOiBVc2VyKSB7XHJcbiAgICAgICAgdGhpcy5fYXZhdGFyU2VsZWN0ZWQubmV4dCh1c2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaGFyZU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9zaGFyZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGVNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93U2lnbkluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlybShcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBjb21tZW50PyBZb3UgY2Fubm90IHVuZG8gdGhpcyBhY3Rpb24uXCIpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlLmRlbGV0ZU1lc3NhZ2UobWVzc2FnZS5pZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lc3NhZ2U/LmlkID09PSBtZXNzYWdlLmlkKVxyXG4gICAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdE1lc3NhZ2UoKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tlbmRFeGNlcHRpb25Bc0FsZXJ0KGUsIGBDb3VsZCBub3QgZGVsZXRlIG1lc3NhZ2U6IGApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlZGl0TWVzc2FnZShzb3VyY2U6IENoYXRTb3VyY2VCYXNlLCBtZXNzYWdlOiBDaGF0TWVzc2FnZSwgbmV3VGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93U2lnbkluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5lZGl0TWVzc2FnZShtZXNzYWdlLmlkLCBuZXdUZXh0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbkFzQWxlcnQoZSwgJ0NvdWxkIG5vdCBlZGl0IHRoaXMgbWVzc2FnZTogJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1lc3NhZ2UubWVzc2FnZSA9IG5ld1RleHQ7XHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnRFZGl0aW5nKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2UudHJhbnNpZW50U3RhdGUuZWRpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUuZWRpdGluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2F2ZUVkaXQobWVzc2FnZTogQ2hhdE1lc3NhZ2UsIHRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICghdGhpcy51c2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1NpZ25JbigpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlLmVkaXRNZXNzYWdlKG1lc3NhZ2UuaWQsIHRleHQpO1xyXG4gICAgICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbkFzQWxlcnQoZSwgYENvdWxkIG5vdCBlZGl0IG1lc3NhZ2U6IGApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|
|
634
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFudGEtY29tbWVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYmFudGEtY29tbWVudHMvYmFudGEtY29tbWVudHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdEQUF3RDs7QUFFeEQsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hLLE9BQU8sRUFBcUIsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUc5RTs7R0FFRztBQU1ILE1BQU0sT0FBTyxzQkFBc0I7SUFDL0IsWUFDWSxPQUF3QixFQUN4QixVQUFtQyxFQUNuQyxjQUE4QixFQUM5QixXQUF3QixFQUN4QixNQUFjO1FBSmQsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENB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UDZELE1BQU07Ozs0QkFnSGxGLFdBQVcsU0FBQyxvQkFBb0I7dUNBR2hDLFlBQVksU0FBQyw4QkFBOEIsRUFBRSxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUM7OEJBZ0ZoRSxLQUFLOytCQXNCTCxLQUFLOzhCQUNMLEtBQUs7K0JBWUwsS0FBSzswQkFZTCxTQUFTLFNBQUMsYUFBYTs4QkFHdkIsWUFBWSxTQUFDLG9CQUFvQjswQkFvRmpDLEtBQUs7d0JBQ0wsS0FBSzt5QkFDTCxLQUFLOzJCQUNMLEtBQUs7b0NBQ0wsS0FBSzsrQkFDTCxLQUFLOzZCQUNMLEtBQUs7K0JBQ0wsS0FBSzswQkFDTCxLQUFLOzBCQUNMLEtBQUs7aUNBQ0wsS0FBSzsrQkFDTCxLQUFLO3lDQUVMLEtBQUs7MkJBQ0wsS0FBSztxQkFJTCxLQUFLO3VCQTBDTCxLQUFLO3NCQU1MLEtBQUs7NkJBV0wsTUFBTTtpQ0FDTixNQUFNO29DQUNOLE1BQU07c0JBQ04sTUFBTTt1QkFDTixNQUFNO3VCQUNOLE1BQU07MkJBQ04sTUFBTTsrQkFDTixNQUFNOzZCQUNOLE1BQU07cUJBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiQHR5cGVzL3Jlc2l6ZS1vYnNlcnZlci1icm93c2VyXCIgLz5cclxuXHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE5nWm9uZSwgT3V0cHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVc2VyLCBDaGF0TWVzc2FnZSwgQ29tbWVudHNPcmRlciB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBIYXNoVGFnIH0gZnJvbSAnLi4vY29tbWVudC1maWVsZC9jb21tZW50LWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kQmFzZSB9IGZyb20gJy4uLy4uL2NoYXQtYmFja2VuZC1iYXNlJztcclxuaW1wb3J0IHsgQ2hhdFNvdXJjZUJhc2UgfSBmcm9tICcuLi8uLi9jaGF0LXNvdXJjZS1iYXNlJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBCYW50YVJlcGx5U2VuZE9wdGlvbnNEaXJlY3RpdmUgfSBmcm9tICcuLi9yZXBseS1zZW5kLW9wdGlvbnMuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTWVzc2FnZU1lbnVJdGVtIH0gZnJvbSAnLi4vLi4vbWVzc2FnZS1tZW51LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21tZW50Vmlld0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1lbnQtdmlldy9jb21tZW50LXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tbWVudENvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1lbnQvY29tbWVudC5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIENvbW1lbnRzIGNvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JhbnRhLWNvbW1lbnRzJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9iYW50YS1jb21tZW50cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9iYW50YS1jb21tZW50cy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYW50YUNvbW1lbnRzQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYmFja2VuZDogQ2hhdEJhY2tlbmRCYXNlLFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICAgICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJpdmF0ZSBtYXRTbmFja0JhcjogTWF0U25hY2tCYXIsXHJcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZSA9IGFzeW5jIChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0ID0gYXdhaXQgdGhpcy5zaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZD8uKG1lc3NhZ2UsIHRoaXMuc291cmNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghaW50ZXJjZXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2Uuc2VuZChtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2Uuc29ydE9yZGVyICE9PSBDb21tZW50c09yZGVyLk5FV0VTVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydE9yZGVyID0gQ29tbWVudHNPcmRlci5ORVdFU1Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uKGUsICdDb3VsZCBub3Qgc2VuZDogJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VuZFJlcGx5ID0gYXN5bmMgKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmNlcHQgPSBhd2FpdCB0aGlzLnNob3VsZEludGVyY2VwdE1lc3NhZ2VTZW5kPy4obWVzc2FnZSwgdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcmNlcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZC5zZW5kKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbihlLCAnQ291bGQgbm90IHNlbmQgcmVwbHk6ICcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbGVtZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUJhY2tlbmRFeGNlcHRpb25Bc0FsZXJ0KGU6IEVycm9yLCBwcmVmaXg6IHN0cmluZyA9ICcnKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uKGUsIHByZWZpeCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBhbGVydChlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUJhY2tlbmRFeGNlcHRpb24oZTogRXJyb3IsIHByZWZpeDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZS5tZXNzYWdlO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLnN0YXJ0c1dpdGgoJ3Blcm1pc3Npb24tZGVuaWVkfCcpKSB7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZS5yZXBsYWNlKC9ecGVybWlzc2lvbi1kZW5pZWRcXHwvLCAnJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLnN0YXJ0c1dpdGgoYGFwcC1oYW5kbGV8YCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYW4gZXJyb3IgZHVyaW5nIGF1dGhvcml6ZUFjdGlvbiBvbiB0aGUgYmFja2VuZCwgcGFzcyBjb250cm9sIHRvIHRoZSB1c2VyLXByb3ZpZGVkIFxyXG4gICAgICAgICAgICAgICAgLy8gcGVybWlzc2lvbi1kZW5pZWQgaGFuZGxlci5cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRQZXJtaXNzaW9uRGVuaWVkKGVycm9yTWVzc2FnZS5yZXBsYWNlKC9eYXBwLWhhbmRsZVxcfC8sICcnKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtwcmVmaXh9JHtlcnJvck1lc3NhZ2V9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIEV2ZW50cyAvIEluaXRpYWxpemF0aW9uXHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3Vicy5hZGQodGhpcy5iYWNrZW5kLnVzZXJDaGFuZ2VkLnN1YnNjcmliZSh1c2VyID0+IHRoaXMudXNlciA9IHVzZXIpKTtcclxuICAgICAgICB0aGlzLnN0YXJ0TG9hZGluZygpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgbGV0IHF1ZXJ5U3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgIGxldCBxdWVyeSA9IHF1ZXJ5U3RyaW5nLnNwbGl0KCcmJylcclxuICAgICAgICAgICAgICAgIC5tYXAocyA9PiBzLnNwbGl0KCc9JykpXHJcbiAgICAgICAgICAgICAgICAucmVkdWNlKChvLCBbaywgdl0pID0+IChvW2RlY29kZVVSSUNvbXBvbmVudChrKV0gPSBkZWNvZGVVUklDb21wb25lbnQodiksIG8pLCB7fSlcclxuICAgICAgICAgICAgO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY29tbWVudElEID0gcXVlcnlbJ2NvbW1lbnQnXTtcclxuICAgICAgICAgICAgaWYgKGNvbW1lbnRJRCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRDb21tZW50SUQgPSBjb21tZW50SUQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XHJcbiAgICBwcml2YXRlIHdpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGhlaWdodDogbnVtYmVyO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuYmFudGEtbW9iaWxlJylcclxuICAgIGdldCBpc01vYmlsZVNpemVkKCkgeyByZXR1cm4gdGhpcy53aWR0aCA8IDUwMDsgfVxyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoQmFudGFSZXBseVNlbmRPcHRpb25zRGlyZWN0aXZlLCB7cmVhZDogVGVtcGxhdGVSZWZ9KSBcclxuICAgIHNlbmRSZXBseU9wdGlvbnNUZW1wbGF0ZTogYW55O1xyXG5cclxuICAgIG1hcmtWaWV3UmVhZHk6ICgpID0+IHZvaWQ7XHJcbiAgICB2aWV3UmVhZHkgPSBuZXcgUHJvbWlzZTx2b2lkPihyID0+IHRoaXMubWFya1ZpZXdSZWFkeSA9IHIpO1xyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnRocmVhZFZpZXdRdWVyeS5jaGFuZ2VzLnN1YnNjcmliZShjaGFuZ2VzID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYGkgc2VlIGNoYW5nZXMuLi5gKTtcclxuICAgICAgICAgICAgY29uc29sZS5kaXIoY2hhbmdlcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBsZXQgY2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gc2l6ZS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHNpemUuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPbmUgY2hlY2sgaXMgYmV0dGVyIHRoYW4gbm90aGluZyFcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgIH0sIDEwMDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tYXJrVmlld1JlYWR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5fc3Vicy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKVxyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHNldFNvdXJjZUZyb21Ub3BpY0lEKHRvcGljSUQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFtiYW50YS1jb21tZW50c10gU3Vic2NyaWJpbmcgdG8gdG9waWMgc291cmNlICcke3RvcGljSUR9J2ApO1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IGF3YWl0IHRoaXMuYmFja2VuZC5nZXRTb3VyY2VGb3JUb3BpYyh0b3BpY0lELCB7IHNvcnRPcmRlcjogdGhpcy5zb3J0T3JkZXIgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUlzT3duZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExvYWRpbmcgU2NyZWVuXHJcbiAgICBwcml2YXRlIF9sb2FkaW5nTWVzc2FnZSA9ICcnO1xyXG4gICAgbG9hZGluZ01lc3NhZ2VWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgZ2V0IGxvYWRpbmdNZXNzYWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nTWVzc2FnZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbG9hZGluZ01lc3NhZ2UodmFsdWUpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nTWVzc2FnZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nTWVzc2FnZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2VWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgc2hvd0xvYWRpbmdTY3JlZW4gPSBmYWxzZTtcclxuICAgIGxvYWRpbmdTdGFydGVkQXQ6IG51bWJlcjtcclxuICAgIG1lc3NhZ2VDaGFuZ2VkQXQ6IG51bWJlcjtcclxuICAgIHNoYXJlZENvbW1lbnRJRDogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpIGN1c3RvbU1lbnVJdGVtczogTWVzc2FnZU1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHN0YXJ0TG9hZGluZygpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdGFydGVkQXQgPSB0aGlzLm1lc3NhZ2VDaGFuZ2VkQXQgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy51cGRhdGVMb2FkaW5nKCkpIHJldHVybjtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAxMDApKTtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVMb2FkaW5nKCkpIHJldHVybjtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAyNTApKTtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVMb2FkaW5nKCkpIHJldHVybjtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCA1MDApKTtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVMb2FkaW5nKCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coYFtCYW50YV0gTG9hZGluZyBpcyB0YWtpbmcgYSBsb25nIHRpbWUhIFNob3dpbmcgbG9hZGluZyBzY3JlZW4uYCk7XHJcbiAgICAgICAgdGhpcy5zaG93TG9hZGluZ1NjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnVwZGF0ZUxvYWRpbmcoKSwgMTAwMCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByaXZhdGUgX2xvYWRpbmdUaW1lcjtcclxuICAgIHByaXZhdGUgX2xvYWRpbmdNZXNzYWdlSW5kZXggPSAwO1xyXG5cclxuICAgIEBJbnB1dCgpIG1heENvbW1lbnRMZW5ndGg6IG51bWJlciA9IDE1MDA7XHJcbiAgICBASW5wdXQoKSBsb2FkaW5nTWVzc2FnZXM6IHN0cmluZ1tdID0gW1xyXG4gICAgICAgIGBKdXN0IGEgc2Vjb25kLi4uYCxcclxuICAgICAgICBgV2UncmUgZGVmaW5pdGVseSB3b3JraW5nIG9uIGl0LmAsXHJcbiAgICAgICAgYFRoZXJlJ3Mgbm8gbmVlZCB0byByZWZyZXNoLmAsXHJcbiAgICAgICAgYEl0J3MgZGVmaW5pdGVseSB3b3J0aCB0aGUgd2FpdCFgLFxyXG4gICAgICAgIGBUaGlzIGhhcyBuZXZlciBoYXBwZW5lZCBiZWZvcmUuYCxcclxuICAgICAgICBgV2UnbGwga2VlcCB0cnlpbmcsIGJ1dCBpdCdzIG5vdCBsb29raW5nIGdyZWF0LiBcclxuICAgICAgICAgICAgQ29tbWVudGluZyAmIGNoYXQgc2VydmljZXMgbWF5IGJlIGRvd24uIFxyXG4gICAgICAgICAgICBJZiB5b3UgY29udGludWUgdG8gZXhwZXJpZW5jZSBpc3N1ZXMsIHBsZWFzZSBjb250YWN0IHN1cHBvcnQuXHJcbiAgICAgICAgYFxyXG4gICAgXTtcclxuXHJcbiAgICBASW5wdXQoKSB1c2VJbmxpbmVSZXBsaWVzID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjY2VzcyB0aGUgQ29tbWVudFZpZXdDb21wb25lbnQgZm9yIHRoaXMgQmFudGFDb21tZW50c0NvbXBvbmVudC4gXHJcbiAgICAgKiBDb21tZW50Vmlld0NvbXBvbmVudCBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQ2hhdFNvdXJjZSBcclxuICAgICAqIG9iamVjdCBhbmQgcmVuZGVyaW5nIGNvbW1lbnRzIGFzIENvbW1lbnRDb21wb25lbnRzLiBJdCBpcyB0aGUgc291cmNlIG9mIFxyXG4gICAgICogdHJ1dGggZm9yIHdoaWNoIENvbW1lbnRDb21wb25lbnQgY29ycmVzcG9uZHMgdG8gd2hpY2ggQ2hhdE1lc3NhZ2UuIFxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBDb21tZW50Vmlld0NvbXBvbmVudCBpcyBvbmx5IGZvciB0aGUgdG9wIGxldmVsIGNvbW1lbnRzLlxyXG4gICAgICogUmVwbGllcyBhcmUgaGFuZGxlZCBieSBhIHNlcGFyYXRlIENvbW1lbnRWaWV3Q29tcG9uZW50IHdoaWNoIGNhbiBiZSBcclxuICAgICAqIHJldHJpZXZlZCB1c2luZyB0aGUgdGhyZWFkVmlldyBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnY29tbWVudFZpZXcnKVxyXG4gICAgY29tbWVudFZpZXc6IENvbW1lbnRWaWV3Q29tcG9uZW50O1xyXG5cclxuICAgIEBWaWV3Q2hpbGRyZW4oQ29tbWVudFZpZXdDb21wb25lbnQpXHJcbiAgICB0aHJlYWRWaWV3UXVlcnk6IFF1ZXJ5TGlzdDxDb21tZW50Vmlld0NvbXBvbmVudD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRlbXB0cyB0byBmaW5kIHRoZSBDb21tZW50Q29tcG9uZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIENoYXRNZXNzYWdlLlxyXG4gICAgICogVGhlIENoYXRNZXNzYWdlIGNvdWxkIGJlIGEgdG9wLWxldmVsIG1lc3NhZ2UgaW4gdGhpcyBjb252ZXJzYXRpb24sIG9yIGEgcmVwbHksIFxyXG4gICAgICogYnV0IG5vdGUgdGhhdCBhIENvbW1lbnRDb21wb25lbnQgd2lsbCBvbmx5IGV4aXN0IGZvciBhIHJlcGx5IGlmIHRoZSB1c2VyIGhhcyBcclxuICAgICAqIHRoZSByZWxldmFudCByZXBseSB0aHJlYWQgb3Blbi5cclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvb2sgZm9yXHJcbiAgICAgKi9cclxuICAgIGdldENvbW1lbnRDb21wb25lbnRGb3JNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKTogQ29tbWVudENvbXBvbmVudCB7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UucGFyZW50TWVzc2FnZUlkKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aHJlYWRWaWV3Py5nZXRDb21tZW50Q29tcG9uZW50Rm9yTWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRWaWV3LmdldENvbW1lbnRDb21wb25lbnRGb3JNZXNzYWdlKG1lc3NhZ2UpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY2Nlc3MgdGhlIENvbW1lbnRWaWV3Q29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnRseSBvcGVuIHJlcGx5IHRocmVhZC5cclxuICAgICAqIFRoaXMgaXMgbm90IHRoZSB0b3AgbGV2ZWwgY29tbWVudHMsIGJ1dCBpbnN0ZWFkIHRoZSByZXBseSB0aHJlYWQgdGhhdCB0aGUgdXNlciBoYXMgXHJcbiAgICAgKiBvcGVuZWQgKG9ubHkgb25lIHNldCBvZiByZXBsaWVzIGNhbiBiZSBvcGVuIGF0IGEgdGltZSkuXHJcbiAgICAgKiBcclxuICAgICAqIEZvciBkZXRhaWxzIGFib3V0IHdoYXQgQ29tbWVudFZpZXdDb21wb25lbnQgYWZmb3JkcyB5b3UsIHNlZSB0aGUgY29tbWVudFZpZXcgcHJvcGVydHkuXHJcbiAgICAgKi9cclxuICAgIGdldCB0aHJlYWRWaWV3KCkge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudGhyZWFkVmlld1F1ZXJ5KS5maWx0ZXIoeCA9PiB4ICE9PSB0aGlzLmNvbW1lbnRWaWV3KVswXTtcclxuICAgIH1cclxuXHJcbiAgICBtYXJrTG9hZGVkOiAoKSA9PiB2b2lkO1xyXG4gICAgbG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4ociA9PiB0aGlzLm1hcmtMb2FkZWQgPSByKTtcclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUxvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc291cmNlPy5zdGF0ZSAmJiB0aGlzLnNvdXJjZT8uc3RhdGUgIT09ICdjb25uZWN0aW5nJykge1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2xvYWRpbmdUaW1lcik7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBgSGVyZSB3ZSBnbyFgO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrTG9hZGVkKCk7XHJcbiAgICAgICAgICAgIH0sIDc1MCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1lc3NhZ2VTd2l0Y2hUaW1lID0gNSoxMDAwO1xyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VDaGFuZ2VkQXQgKyBtZXNzYWdlU3dpdGNoVGltZSA8IERhdGUubm93KCkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubG9hZGluZ01lc3NhZ2VzW3RoaXMuX2xvYWRpbmdNZXNzYWdlSW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlID0gdGhpcy5sb2FkaW5nTWVzc2FnZXNbdGhpcy5fbG9hZGluZ01lc3NhZ2VJbmRleCsrXTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNoYW5nZWRBdCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9wZXJ0aWVzXHJcblxyXG4gICAgcHJpdmF0ZSBfc2lnbkluU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfcGVybWlzc2lvbkRlbmllZEVycm9yID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gICAgcHJpdmF0ZSBfZWRpdEF2YXRhclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3Vwdm90ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3JlcG9ydGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfdXNlclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9zaGFyZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3VzZXJuYW1lU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG4gICAgcHJpdmF0ZSBfYXZhdGFyU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG4gICAgcHJpdmF0ZSBfc291cmNlOiBDaGF0U291cmNlQmFzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNrIHdoZXRoZXIgd2UgY3JlYXRlZCB0aGlzIHNvdXJjZS4gSWYgd2UgZGlkIG5vdCAoaWUgaXQgd2FzIHBhc3NlZCBpbiBmcm9tIHRoZSBjYWxsZXIpLFxyXG4gICAgICogdGhlbiB3ZSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGNsb3NlKCkuIElmIHdlIGRvIG93biBpdCB0aG91Z2gsIHdlIHdpbGwgY2FsbCBjbG9zZSgpIFxyXG4gICAgICogd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGl0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9zb3VyY2VJc093bmVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9zdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICAgcHJpdmF0ZSBfc29ydE9yZGVyOiBDb21tZW50c09yZGVyID0gQ29tbWVudHNPcmRlci5ORVdFU1Q7XHJcbiAgICBwcml2YXRlIF90b3BpY0lEOiBzdHJpbmc7XHJcbiAgICBcclxuICAgIHVzZXI6IFVzZXI7XHJcbiAgICBzZWxlY3RlZE1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG4gICAgc2VsZWN0ZWRNZXNzYWdlVGhyZWFkOiBDaGF0U291cmNlQmFzZTtcclxuICAgIHNlbGVjdGVkTWVzc2FnZVZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBJbnB1dHNcclxuXHJcbiAgICBASW5wdXQoKSBzaWduSW5MYWJlbCA9ICdTaWduIEluJztcclxuICAgIEBJbnB1dCgpIHNlbmRMYWJlbCA9ICdTZW5kJztcclxuICAgIEBJbnB1dCgpIHJlcGx5TGFiZWwgPSAnUmVwbHknO1xyXG4gICAgQElucHV0KCkgc2VuZGluZ0xhYmVsID0gJ1NlbmRpbmcnO1xyXG4gICAgQElucHV0KCkgcGVybWlzc2lvbkRlbmllZExhYmVsID0gJ1NlbmQnO1xyXG4gICAgQElucHV0KCkgcG9zdENvbW1lbnRMYWJlbCA9ICdQb3N0IGEgY29tbWVudCc7XHJcbiAgICBASW5wdXQoKSBwb3N0UmVwbHlMYWJlbCA9ICdQb3N0IGEgcmVwbHknO1xyXG4gICAgQElucHV0KCkgYWxsb3dBdHRhY2htZW50cyA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBmaXhlZEhlaWdodDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIG1heE1lc3NhZ2VzOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBtYXhWaXNpYmxlTWVzc2FnZXM6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGdlbmVyaWNBdmF0YXJVcmwgPSBgaHR0cHM6Ly9ncmF2YXRhci5jb20vYXZhdGFyLyR7RGF0ZS5ub3coKS50b1N0cmluZygxNil9P3M9NTEyJmQ9cm9ib2hhc2hgO1xyXG5cclxuICAgIEBJbnB1dCgpIHNob3VsZEludGVyY2VwdE1lc3NhZ2VTZW5kPzogKG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBzb3VyY2U6IENoYXRTb3VyY2VCYXNlKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcclxuICAgIEBJbnB1dCgpIHBhcnRpY2lwYW50czogVXNlcltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBfc291cmNlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBzb3VyY2UoKTogQ2hhdFNvdXJjZUJhc2UgeyByZXR1cm4gdGhpcy5fc291cmNlOyB9XHJcbiAgICBzZXQgc291cmNlKHZhbHVlKSB7IFxyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlSXNPd25lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2UgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50cyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc291cmNlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fc291cmNlSXNPd25lZCA9IGZhbHNlOyAvLyBBc3N1bWUgd2UgZG9uJ3Qgb3duIHRoaXMgc291cmNlLlxyXG4gICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhcmVkQ29tbWVudElEKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9TaGFyZWRDb21tZW50KHRoaXMuc2hhcmVkQ29tbWVudElEKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkQ29tbWVudElEID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fc291cmNlLm1lc3NhZ2VzLmZvckVhY2gobSA9PiB0aGlzLmFkZFBhcnRpY2lwYW50KG0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbi5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VSZWNlaXZlZC5zdWJzY3JpYmUobSA9PiB0aGlzLmFkZFBhcnRpY2lwYW50KG0pKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbi5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VTZW50LnN1YnNjcmliZShtID0+IHRoaXMuYWRkUGFydGljaXBhbnQobSkpKTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5tZXNzYWdlVXBkYXRlZC5zdWJzY3JpYmUobXNnID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgY29tbWVudHMgcmVjZWl2ZWQgbWVzc2FnZTogYCwgbXNnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmlkID09PSB0aGlzLnNlbGVjdGVkTWVzc2FnZT8uaWQgJiYgbXNnLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0TWVzc2FnZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlRoZSB0aHJlYWQgeW91IHdlcmUgdmlld2luZyB3YXMgcmVtb3ZlZC5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgQElucHV0KCkgXHJcbiAgICBoYXNodGFnczogSGFzaFRhZ1tdID0gW1xyXG4gICAgICAgIHtoYXNodGFnOiAnZXJyb3InLCBkZXNjcmlwdGlvbjogJ0NhdXNlIGFuIGVycm9yJ30sXHJcbiAgICAgICAge2hhc2h0YWc6ICd0aW1lb3V0JywgZGVzY3JpcHRpb246ICdDYXVzZSBhIHNsb3cgdGltZW91dCBlcnJvcid9LFxyXG4gICAgICAgIHtoYXNodGFnOiAnc2xvdycsIGRlc2NyaXB0aW9uOiAnQmUgc2xvdyB3aGVuIHRoaXMgbWVzc2FnZSBpcyBwb3N0ZWQnfSxcclxuICAgIF07XHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHRvcGljSUQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3RvcGljSUQ7IH1cclxuICAgIHNldCB0b3BpY0lEKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RvcGljSUQgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RvcGljSUQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldFNvdXJjZUZyb21Ub3BpY0lEKHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE91dHB1dHNcclxuXHJcbiAgICBAT3V0cHV0KCkgZ2V0IHNpZ25JblNlbGVjdGVkKCk6IE9ic2VydmFibGU8dm9pZD4geyByZXR1cm4gdGhpcy5fc2lnbkluU2VsZWN0ZWQ7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgZWRpdEF2YXRhclNlbGVjdGVkKCkgeyByZXR1cm4gdGhpcy5fZWRpdEF2YXRhclNlbGVjdGVkOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHBlcm1pc3Npb25EZW5pZWRFcnJvcigpOiBPYnNlcnZhYmxlPHN0cmluZz4geyByZXR1cm4gdGhpcy5fcGVybWlzc2lvbkRlbmllZEVycm9yOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHVwdm90ZWQoKSB7IHJldHVybiB0aGlzLl91cHZvdGVkLmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHJlcG9ydGVkKCkgeyByZXR1cm4gdGhpcy5fcmVwb3J0ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgc2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZC5hc09ic2VydmFibGUoKTsgfVxyXG4gICAgQE91dHB1dCgpIGdldCB1c2VyU2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl91c2VyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgdXNlcm5hbWVTZWxlY3RlZCgpIHsgcmV0dXJuIHRoaXMuX3VzZXJuYW1lU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgYXZhdGFyU2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9hdmF0YXJTZWxlY3RlZC5hc09ic2VydmFibGUoKTsgfVxyXG4gICAgQE91dHB1dCgpIGdldCBzaGFyZWQoKSB7IHJldHVybiB0aGlzLl9zaGFyZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuXHJcbiAgICBnZXQgc29ydE9yZGVyKCkgeyByZXR1cm4gdGhpcy5fc29ydE9yZGVyOyB9XHJcbiAgICBzZXQgc29ydE9yZGVyKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NvcnRPcmRlciAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc29ydE9yZGVyID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTb3VyY2VGcm9tVG9waWNJRCh0aGlzLnRvcGljSUQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2VuZE1lc3NhZ2U6IChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4gdm9pZDtcclxuICAgIHNlbmRSZXBseTogKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB2b2lkO1xyXG5cclxuICAgIC8vIFVJIEludGVyYWN0aW9uc1xyXG5cclxuICAgIHNjcm9sbFRvQ29tbWVudChjb21tZW50SWQ6IENoYXRNZXNzYWdlWydpZCddKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb21tZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtY29tbWVudC1pZD1cIiR7Y29tbWVudElkfVwiXWApO1xyXG4gICAgICAgICAgaWYgKGNvbW1lbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBjb21tZW50Lml0ZW0oMCkuc2Nyb2xsKHtiZWhhdmlvcjogJ3Ntb290aCd9KTtcclxuICAgICAgICAgICAgY29tbWVudC5pdGVtKDApLnNjcm9sbEludG9WaWV3KHtcclxuICAgICAgICAgICAgICAgIGlubGluZTogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICBibG9jazogJ2NlbnRlcidcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZGluZ1NoYXJlZENvbW1lbnQgPSBmYWxzZTtcclxuXHJcbiAgICBhc3luYyBuYXZpZ2F0ZVRvU2hhcmVkQ29tbWVudChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU2hhcmVkQ29tbWVudCA9IHRydWU7XHJcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuc291cmNlO1xyXG5cclxuICAgICAgICBhd2FpdCBzb3VyY2UucmVhZHk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy52aWV3UmVhZHk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkZWQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc29sZS5sb2coYE5hdmlnYXRpbmcgdG8gc2hhcmVkIGNvbW1lbnQgd2l0aCBJRCAnJHtpZH0nLi4uYCk7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnNvdXJjZS5nZXQoaWQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZpbmQgY29tbWVudCBmcm9tIFVSTDogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIGFsZXJ0KGBDb3VsZCBub3QgbG9hZCBkZXNpcmVkIGNvbW1lbnQuIEl0IG1heSBoYXZlIGJlZW4gcmVtb3ZlZC5gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZSA/Pz0ge307XHJcblxyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGFyZW50IG1lc3NhZ2UsIHdlIHNob3VsZCBpbnN0ZWFkIGZvY3VzIHRoYXQgYW5kIGxldCB0aGUgXHJcbiAgICAgICAgLy8gc2Nyb2xsVG9Db21tZW50IGFuZCBoaWdobGlnaHQgZG8gdGhlIHdvcmsuXHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlLnBhcmVudE1lc3NhZ2VJZCkge1xyXG5cclxuICAgICAgICAgICAgbGV0IHBhcmVudE1lc3NhZ2UgPSBhd2FpdCB0aGlzLnNvdXJjZS5nZXQobWVzc2FnZS5wYXJlbnRNZXNzYWdlSWQpO1xyXG4gICAgICAgICAgICBwYXJlbnRNZXNzYWdlLnRyYW5zaWVudFN0YXRlID8/PSB7fTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgbWVzc2FnZSBpcyBsb2FkZWQgYW5kIHZpc2libGUgdG8gdGhlIHVzZXJcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21tZW50Vmlldy5sb2FkTWVzc2FnZUluQ29udGV4dChwYXJlbnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCB0aHJlYWQgPSBhd2FpdCB0aGlzLnNlbGVjdE1lc3NhZ2UocGFyZW50TWVzc2FnZSk7IFxyXG5cclxuICAgICAgICAgICAgLy8gTmVlZCB0byByZS1yZXRyaWV2ZSB0aGUgbWVzc2FnZSB3aXRoaW4gdGhlIG5ldyBjaGF0IHNvdXJjZSB0byBhZmZlY3QgaXRzXHJcbiAgICAgICAgICAgIC8vIHRyYW5zaWVudCBzdGF0ZS5cclxuICAgICAgICAgICAgYXdhaXQgdGhyZWFkLnJlYWR5O1xyXG4gICAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhyZWFkLmdldChtZXNzYWdlLmlkKTtcclxuICAgICAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZSA/Pz0ge307XHJcbiAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUuaGlnaGxpZ2h0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRpcihtZXNzYWdlKTtcclxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgNTAwKSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgbWVzc2FnZSBpcyBsb2FkZWQgYW5kIHZpc2libGUgdG8gdGhlIHVzZXJcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21tZW50Vmlldy5sb2FkTWVzc2FnZUluQ29udGV4dChtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUgPz89IHt9O1xyXG4gICAgICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmhpZ2hsaWdodGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Db21tZW50KGlkKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTaGFyZWRDb21tZW50ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUGVybWlzc2lvbkRlbmllZChlcnJvck1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIC8vIFRoaXMgaXMgd2hhdCBvdGhlciBjb21wb25lbnRzIGNhbGwgd2hlbiBoYW5kbGluZyBwZXJtaXNzaW9uIGVycm9yc1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChlcnJvck1lc3NhZ2Uuc3RhcnRzV2l0aChgYXBwLWhhbmRsZXxgKSkge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGVycm9yIGR1cmluZyBhdXRob3JpemVBY3Rpb24gb24gdGhlIGJhY2tlbmQsIHBhc3MgY29udHJvbCB0byB0aGUgdXNlci1wcm92aWRlZCBcclxuICAgICAgICAgICAgLy8gcGVybWlzc2lvbi1kZW5pZWQgaGFuZGxlci5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VuZFBlcm1pc3Npb25EZW5pZWQoZXJyb3JNZXNzYWdlLnJlcGxhY2UoL15hcHAtaGFuZGxlXFx8LywgJycpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWxlcnQoZXJyb3JNZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZW5kUGVybWlzc2lvbkRlbmllZChtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9wZXJtaXNzaW9uRGVuaWVkRXJyb3IubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb01lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBsZXQgZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1jb21tZW50LWlkPVwiJHttZXNzYWdlLmlkfVwiXWApO1xyXG4gICAgICAgIGlmICghZWwpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbC5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ICdjZW50ZXInLCBpbmxpbmU6ICdzdGFydCd9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFBhcnRpY2lwYW50KG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCFtZXNzYWdlIHx8ICFtZXNzYWdlLnVzZXIgfHwgIW1lc3NhZ2UudXNlci5pZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLnBhcnRpY2lwYW50cy5maW5kKHggPT4geC5pZCA9PT0gbWVzc2FnZS51c2VyLmlkKTtcclxuICAgICAgICBpZiAoZXhpc3RpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLnBhcnRpY2lwYW50cy5wdXNoKG1lc3NhZ2UudXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWN0aW9uc1xyXG5cclxuICAgIGFzeW5jIGxpa2VNZXNzYWdlKHNvdXJjZTogQ2hhdFNvdXJjZUJhc2UsIG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93U2lnbkluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3Vwdm90ZWQubmV4dChtZXNzYWdlKTtcclxuICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmxpa2luZyA9IHRydWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgc291cmNlLmxpa2VNZXNzYWdlKG1lc3NhZ2UuaWQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uQXNBbGVydChlLCAnQ291bGQgbm90IGxpa2UgdGhpcyBtZXNzYWdlOiAnKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAyNTApKTtcclxuICAgICAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5saWtpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdW5saWtlTWVzc2FnZShzb3VyY2U6IENoYXRTb3VyY2VCYXNlLCBtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGlmICghdGhpcy51c2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1NpZ25JbigpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl91cHZvdGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5saWtpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAobWVzc2FnZS51c2VyU3RhdGU/Lmxpa2VkKVxyXG4gICAgICAgICAgICBtZXNzYWdlLmxpa2VzID0gKG1lc3NhZ2UubGlrZXMgfHwgMCkgLSAxO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBzb3VyY2UudW5saWtlTWVzc2FnZShtZXNzYWdlLmlkKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbkFzQWxlcnQoZSwgJ0ZhaWxlZCB0byB1bmxpa2UgdGhpcyBtZXNzYWdlOiAnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDI1MCkpO1xyXG4gICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUubGlraW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVwb3J0TWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdW5zZWxlY3RNZXNzYWdlKCkge1xyXG4gICAgICAgIGxldCBtZXNzYWdlID0gdGhpcy5zZWxlY3RlZE1lc3NhZ2U7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkLm5leHQobnVsbCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQuY2xvc2UpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZC5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWVzc2FnZSlcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvTWVzc2FnZShtZXNzYWdlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2VsZWN0TWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVzc2FnZSA9PT0gbWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVuc2VsZWN0TWVzc2FnZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZE1lc3NhZ2VUaHJlYWQgPSBhd2FpdCB0aGlzLmJhY2tlbmQuZ2V0U291cmNlRm9yVGhyZWFkKHRoaXMudG9waWNJRCwgbWVzc2FnZS5pZCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZWxlY3RlZE1lc3NhZ2VWaXNpYmxlID0gdHJ1ZSk7XHJcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkID0gc2VsZWN0ZWRNZXNzYWdlVGhyZWFkO1xyXG4gICAgICAgIH0sIDI1MCk7XHJcblxyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZE1lc3NhZ2VUaHJlYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd1NpZ25JbigpIHtcclxuICAgICAgICB0aGlzLl9zaWduSW5TZWxlY3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0VkaXRBdmF0YXIoKSB7XHJcbiAgICAgICAgdGhpcy5fZWRpdEF2YXRhclNlbGVjdGVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZWxlY3RNZXNzYWdlVXNlcihtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZWxlY3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNlbGVjdFVzZXJuYW1lKHVzZXI6IFVzZXIpIHtcclxuICAgICAgICB0aGlzLl91c2VybmFtZVNlbGVjdGVkLm5leHQodXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2VsZWN0QXZhdGFyKHVzZXI6IFVzZXIpIHtcclxuICAgICAgICB0aGlzLl9hdmF0YXJTZWxlY3RlZC5uZXh0KHVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNoYXJlTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3NoYXJlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dTaWduSW4oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25maXJtKFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbW1lbnQ/IFlvdSBjYW5ub3QgdW5kbyB0aGlzIGFjdGlvbi5cIikpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2UuZGVsZXRlTWVzc2FnZShtZXNzYWdlLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVzc2FnZT8uaWQgPT09IG1lc3NhZ2UuaWQpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0TWVzc2FnZSgpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbkFzQWxlcnQoZSwgYENvdWxkIG5vdCBkZWxldGUgbWVzc2FnZTogYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVkaXRNZXNzYWdlKHNvdXJjZTogQ2hhdFNvdXJjZUJhc2UsIG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBuZXdUZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dTaWduSW4oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgc291cmNlLmVkaXRNZXNzYWdlKG1lc3NhZ2UuaWQsIG5ld1RleHQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uQXNBbGVydChlLCAnQ291bGQgbm90IGVkaXQgdGhpcyBtZXNzYWdlOiAnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWVzc2FnZS5tZXNzYWdlID0gbmV3VGV4dDtcclxuICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdGFydEVkaXRpbmcobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzYXZlRWRpdChtZXNzYWdlOiBDaGF0TWVzc2FnZSwgdGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93U2lnbkluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2UuZWRpdE1lc3NhZ2UobWVzc2FnZS5pZCwgdGV4dCk7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUuZWRpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uQXNBbGVydChlLCBgQ291bGQgbm90IGVkaXQgbWVzc2FnZTogYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|