stream-chat-angular 5.0.0-v5.21 → 5.0.0-v5.23
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/assets/version.d.ts +1 -1
- package/esm2020/assets/version.mjs +2 -2
- package/esm2020/lib/channel/channel.component.mjs +5 -6
- package/esm2020/lib/custom-templates.service.mjs +1 -10
- package/esm2020/lib/message/message.component.mjs +51 -21
- package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +1 -1
- package/esm2020/lib/message-actions.service.mjs +22 -4
- package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +13 -1
- package/esm2020/lib/message-input/message-input.component.mjs +75 -23
- package/esm2020/lib/message-input/textarea/textarea.component.mjs +13 -1
- package/esm2020/lib/message-list/message-list.component.mjs +5 -3
- package/esm2020/lib/stream-chat.module.mjs +1 -6
- package/esm2020/lib/types.mjs +1 -1
- package/esm2020/public-api.mjs +1 -2
- package/fesm2015/stream-chat-angular.mjs +2028 -1989
- package/fesm2015/stream-chat-angular.mjs.map +1 -1
- package/fesm2020/stream-chat-angular.mjs +1669 -1631
- package/fesm2020/stream-chat-angular.mjs.map +1 -1
- package/lib/custom-templates.service.d.ts +1 -10
- package/lib/message/message.component.d.ts +11 -3
- package/lib/message-actions-box/message-actions-box.component.d.ts +1 -2
- package/lib/message-actions.service.d.ts +1 -0
- package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -0
- package/lib/message-input/message-input.component.d.ts +19 -3
- package/lib/message-input/textarea/textarea.component.d.ts +1 -0
- package/lib/message-list/message-list.component.d.ts +2 -1
- package/lib/stream-chat.module.d.ts +9 -10
- package/lib/types.d.ts +1 -10
- package/package.json +1 -1
- package/public-api.d.ts +0 -1
- package/src/assets/version.ts +1 -1
- package/esm2020/lib/edit-message-form/edit-message-form.component.mjs +0 -83
- package/lib/edit-message-form/edit-message-form.component.d.ts +0 -31
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Component, Input, ChangeDetectionStrategy, ViewChild, } from '@angular/core';
|
|
2
2
|
import emojiRegex from 'emoji-regex';
|
|
3
|
+
import { take } from 'rxjs';
|
|
3
4
|
import { listUsers } from '../list-users';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
import * as i1 from "../chat-client.service";
|
|
@@ -21,7 +22,7 @@ import * as i15 from "../loading-indicator-placeholder/loading-indicator-placeho
|
|
|
21
22
|
* The `Message` component displays a message with additional information such as sender and date, and enables [interaction with the message (i.e. edit or react)](../concepts/message-interactions.mdx).
|
|
22
23
|
*/
|
|
23
24
|
export class MessageComponent {
|
|
24
|
-
constructor(chatClientService, channelService, customTemplatesService, cdRef, dateParser, messageService, messageActionsService) {
|
|
25
|
+
constructor(chatClientService, channelService, customTemplatesService, cdRef, dateParser, messageService, messageActionsService, ngZone) {
|
|
25
26
|
this.chatClientService = chatClientService;
|
|
26
27
|
this.channelService = channelService;
|
|
27
28
|
this.customTemplatesService = customTemplatesService;
|
|
@@ -29,6 +30,7 @@ export class MessageComponent {
|
|
|
29
30
|
this.dateParser = dateParser;
|
|
30
31
|
this.messageService = messageService;
|
|
31
32
|
this.messageActionsService = messageActionsService;
|
|
33
|
+
this.ngZone = ngZone;
|
|
32
34
|
/**
|
|
33
35
|
* The list of [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript) that are enabled for the current user, the list of [supported interactions](../concepts/message-interactions.mdx) can be found in our message interaction guide. Unathorized actions won't be displayed on the UI. The [`MessageList`](./MessageListComponent.mdx) component automatically sets this based on [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript).
|
|
34
36
|
*/
|
|
@@ -185,6 +187,11 @@ export class MessageComponent {
|
|
|
185
187
|
}
|
|
186
188
|
ngAfterViewInit() {
|
|
187
189
|
this.isViewInited = true;
|
|
190
|
+
if (this.hasTouchSupport && this.messageBubble?.nativeElement) {
|
|
191
|
+
this.ngZone.runOutsideAngular(() => {
|
|
192
|
+
this.registerMenuTriggerEventHandlers();
|
|
193
|
+
});
|
|
194
|
+
}
|
|
188
195
|
}
|
|
189
196
|
ngOnDestroy() {
|
|
190
197
|
this.subscriptions.forEach((s) => s.unsubscribe());
|
|
@@ -258,6 +265,7 @@ export class MessageComponent {
|
|
|
258
265
|
mode: this.mode,
|
|
259
266
|
customActions: this.messageActionsService.customActions$.getValue(),
|
|
260
267
|
parsedDate: this.parsedDate,
|
|
268
|
+
scroll$: this.scroll$,
|
|
261
269
|
};
|
|
262
270
|
}
|
|
263
271
|
getQuotedMessageAttachmentListContext() {
|
|
@@ -429,27 +437,44 @@ export class MessageComponent {
|
|
|
429
437
|
}
|
|
430
438
|
startMessageMenuShowTimer(options) {
|
|
431
439
|
this.stopMessageMenuShowTimer();
|
|
440
|
+
if (this.scroll$) {
|
|
441
|
+
this.subscriptions.push(this.scroll$.pipe(take(1)).subscribe(() => {
|
|
442
|
+
this.stopMessageMenuShowTimer();
|
|
443
|
+
}));
|
|
444
|
+
}
|
|
432
445
|
this.showMessageMenuTimeout = setTimeout(() => {
|
|
433
446
|
if (!this.message) {
|
|
434
447
|
return;
|
|
435
448
|
}
|
|
436
|
-
|
|
437
|
-
this.messageActionsService.customActionClickHandler
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
449
|
+
this.ngZone.run(() => {
|
|
450
|
+
if (this.messageActionsService.customActionClickHandler) {
|
|
451
|
+
this.messageActionsService.customActionClickHandler({
|
|
452
|
+
message: this.message,
|
|
453
|
+
enabledActions: this.enabledMessageActions,
|
|
454
|
+
customActions: this.messageActionsService.customActions$.getValue(),
|
|
455
|
+
isMine: this.isSentByCurrentUser,
|
|
456
|
+
messageTextHtmlElement: this.messageTextElement?.nativeElement,
|
|
457
|
+
});
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
this.shouldPreventMessageMenuClose = !options.fromTouch;
|
|
462
|
+
this.messageMenuTrigger?.show();
|
|
463
|
+
}
|
|
464
|
+
if (this.isViewInited) {
|
|
465
|
+
this.cdRef.detectChanges();
|
|
466
|
+
}
|
|
467
|
+
this.showMessageMenuTimeout = undefined;
|
|
468
|
+
});
|
|
451
469
|
}, 400);
|
|
452
470
|
}
|
|
471
|
+
registerMenuTriggerEventHandlers() {
|
|
472
|
+
this.messageBubble.nativeElement.addEventListener('touchstart', () => this.touchStarted());
|
|
473
|
+
this.messageBubble.nativeElement.addEventListener('touchend', () => this.touchEnded());
|
|
474
|
+
this.messageBubble.nativeElement.addEventListener('mousedown', (e) => this.mousePushedDown(e));
|
|
475
|
+
this.messageBubble.nativeElement.addEventListener('mouseup', () => this.mouseReleased());
|
|
476
|
+
this.messageBubble.nativeElement.addEventListener('click', (e) => this.messageBubbleClicked(e));
|
|
477
|
+
}
|
|
453
478
|
stopMessageMenuShowTimer() {
|
|
454
479
|
if (this.showMessageMenuTimeout) {
|
|
455
480
|
clearTimeout(this.showMessageMenuTimeout);
|
|
@@ -457,12 +482,12 @@ export class MessageComponent {
|
|
|
457
482
|
}
|
|
458
483
|
}
|
|
459
484
|
}
|
|
460
|
-
MessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageComponent, deps: [{ token: i1.ChatClientService }, { token: i2.ChannelService }, { token: i3.CustomTemplatesService }, { token: i0.ChangeDetectorRef }, { token: i4.DateParserService }, { token: i5.MessageService }, { token: i6.MessageActionsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
461
|
-
MessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: MessageComponent, selector: "stream-message", inputs: { message: "message", enabledMessageActions: "enabledMessageActions", isLastSentMessage: "isLastSentMessage", mode: "mode", isHighlighted: "isHighlighted" }, viewQueries: [{ propertyName: "messageMenuTrigger", first: true, predicate: ["messageMenuTrigger"], descendants: true }, { propertyName: "messageMenuFloat", first: true, predicate: ["messageMenuFloat"], descendants: true }, { propertyName: "messageTextElement", first: true, predicate: ["messageTextElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #container\n data-testid=\"message-container\"\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }} str-chat__message-menu-{{ areMessageOptionsOpen ? 'opened' : 'closed' }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--other]=\"!isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"hasReactions\"\n [class.str-chat__message--highlighted]=\"isHighlighted\"\n [class.str-chat__message-with-thread-link]=\"shouldDisplayThreadLink\"\n [class.str-chat__message-send-can-be-retried]=\"\n (message?.status === 'failed' && message?.errorStatusCode !== 403) ||\n (message?.type === 'error' && message?.moderation_details)\n \"\n [class.str-chat__message-with-touch-support]=\"hasTouchSupport\"\n [class.str-chat__message-without-touch-support]=\"!hasTouchSupport\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <stream-avatar-placeholder\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"message-sender\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n [user]=\"message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__message-inner\">\n <div\n *ngIf=\"!hasTouchSupport && areOptionsVisible\"\n class=\"str-chat__message-simple__actions str-chat__message-options\"\n data-testid=\"message-options\"\n [class.str-chat__message-actions-open]=\"areMessageOptionsOpen\"\n >\n <div\n #messageActionsToggle\n data-testid=\"message-actions-container\"\n class=\"\n str-chat__message-actions-container\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--options\n \"\n [floatUiLoose]=\"messageMenuFloat\"\n looseTrigger=\"click\"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n (onSHown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n >\n <div\n *ngIf=\"visibleMessageActionsCount > 0\"\n class=\"str-chat__message-actions-box-button\"\n data-testid=\"message-options-button\"\n (click)=\"messageOptionsButtonClicked()\"\n (keyup.enter)=\"messageOptionsButtonClicked()\"\n >\n <stream-icon-placeholder\n icon=\"action\"\n class=\"str-chat__message-action-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n </div>\n <div class=\"str-chat__message-reactions-host\">\n <ng-template\n #defaultMessageReactions\n let-messageReactionCounts=\"messageReactionCounts\"\n let-latestReactions=\"latestReactions\"\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n ></stream-message-reactions>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageReactionsTemplate$ | async) ||\n defaultMessageReactions;\n context: getMessageReactionsContext()\n \"\n ></ng-container>\n </div>\n <float-ui-content #messageMenuFloat>\n <ng-template\n #defaultMessageActionsBox\n let-isMine=\"isMine\"\n let-messageInput=\"message\"\n let-enabledActions=\"enabledActions\"\n let-messageTextHtmlElement=\"messageTextHtmlElement\"\n >\n <stream-message-actions-box\n [isMine]=\"isMine\"\n [message]=\"messageInput\"\n [enabledActions]=\"enabledActions\"\n [messageTextHtmlElement]=\"messageTextHtmlElement\"\n (click)=\"messageActionsBoxClicked(messageMenuFloat)\"\n ></stream-message-actions-box>\n </ng-template>\n <ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageActionsBoxTemplate$ | async) ||\n defaultMessageActionsBox;\n context: getMessageActionsBoxContext()\n \"\n >\n </ng-container>\n </ng-container>\n </float-ui-content>\n <div\n class=\"str-chat__message-bubble str-chat-angular__message-bubble\"\n [class.str-chat-angular__message-bubble--attachment-modal-open]=\"\n imageAttachmentModalState === 'opened'\n \"\n data-testid=\"message-bubble\"\n [floatUiLoose]=\"messageMenuFloat\"\n #messageMenuTrigger=\"floatUiLoose\"\n looseTrigger=\"none\"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"true\"\n [preventOverflow]=\"true\"\n (onShown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n [positionFixed]=\"true\"\n (mousedown)=\"mousePushedDown($event)\"\n (mouseup)=\"mouseReleased()\"\n (touchstart)=\"touchStarted()\"\n (touchend)=\"touchEnded()\"\n (click)=\"messageBubbleClicked($event)\"\n (keyup.enter)=\"messageBubbleClicked($event)\"\n >\n <ng-container *ngIf=\"hasAttachment && !message?.quoted_message\">\n <div class=\"str-chat__attachments-container\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"message?.text || (message?.quoted_message && hasAttachment)\"\n class=\"str-chat__message-text\"\n tabindex=\"0\"\n [class.str-chat__message-text--pointer-cursor]=\"\n (message?.status === 'failed' &&\n message?.errorStatusCode !== 403) ||\n (this.message?.type === 'error' &&\n this.message?.moderation_details) ||\n message?.message_text_updated_at\n \"\n (click)=\"messageClicked()\"\n (keyup.enter)=\"messageClicked()\"\n >\n <div\n data-testid=\"inner-message\"\n class=\"\n str-chat__message-text-inner str-chat__message-simple-text-inner\n \"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n >\n <ng-container *ngTemplateOutlet=\"quotedMessage\"></ng-container>\n <ng-container *ngIf=\"hasAttachment && message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </ng-container>\n <div\n *ngIf=\"message?.type === 'error'\"\n data-testid=\"client-error-message\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n <ng-container *ngIf=\"!message?.moderation_details\">{{\n \"streamChat.Error \u00B7 Unsent\" | translate\n }}</ng-container>\n </div>\n <div\n *ngIf=\"message?.status === 'failed'\"\n data-testid=\"error-message\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed \u00B7 Unauthorized\"\n : \"streamChat.Message Failed \u00B7 Click to try again\"\n ) | translate\n }}\n </div>\n <div #messageTextElement data-testid=\"text\">\n <p>\n <ng-container *ngIf=\"messageTextParts; else defaultContent\">\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-template #defaultMention let-content=\"content\">\n <span class=\"str-chat__message-mention\">{{\n content\n }}</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.mentionTemplate$ | async) ||\n defaultMention;\n context: getMentionContext(part)\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #defaultContent>\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ messageText || \"\" }}\n </ng-container>\n <ng-template #asHTML\n ><span\n data-testid=\"html-content\"\n [innerHTML]=\"messageText\"\n ></span\n ></ng-template>\n </ng-template>\n </p>\n </div>\n </div>\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-error-icon\"\n icon=\"error\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <ng-container\n *ngTemplateOutlet=\"replyCountButton; context: { message: message }\"\n ></ng-container>\n\n <ng-container *ngTemplateOutlet=\"messageDateAndSender\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n</ng-template>\n\n<ng-template #systemMessage>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.systemMessageTemplate$ | async) ||\n defaultSystemMessage;\n context: getMessageContext()\n \"\n ></ng-container>\n <ng-template #defaultSystemMessage let-messageInput=\"message\">\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ messageInput?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #quotedMessage>\n <div\n *ngIf=\"message?.quoted_message\"\n class=\"quoted-message str-chat__quoted-message-preview\"\n data-testid=\"quoted-message-container\"\n [class.mine]=\"isSentByCurrentUser\"\n (click)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n (keyup.enter)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [user]=\"message?.quoted_message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"quoted-message-inner str-chat__quoted-message-bubble\">\n <ng-container\n *ngIf=\"\n message?.quoted_message?.attachments &&\n message?.quoted_message?.attachments?.length\n \"\n >\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getQuotedMessageAttachmentListContext()\n \"\n ></ng-container>\n </ng-container>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"\n message?.quoted_message?.translation ||\n message?.quoted_message?.html ||\n message?.quoted_message?.text\n \"\n ></div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #messageDateAndSender>\n <ng-container>\n <div\n *ngIf=\"shouldDisplayTranslationNotice\"\n class=\"str-chat__translation-notice\"\n data-testid=\"translation-notice\"\n >\n <button\n *ngIf=\"displayedMessageTextContent === 'translation'\"\n data-testid=\"see-original\"\n translate\n (click)=\"displayOriginalMessage()\"\n (keyup.enter)=\"displayOriginalMessage()\"\n >\n streamChat.See original (automatically translated)\n </button>\n <button\n *ngIf=\"displayedMessageTextContent === 'original'\"\n data-testid=\"see-translation\"\n translate\n (click)=\"displayTranslatedMessage()\"\n (keyup.enter)=\"displayTranslatedMessage()\"\n >\n streamChat.See translation\n </button>\n </div>\n <ng-container\n *ngIf=\"customTemplatesService.customMessageMetadataTemplate$ | async\"\n >\n <div class=\"str-chat__custom-message-metadata\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.customMessageMetadataTemplate$ | async)!;\n context: getMessageMetadataContext()\n \"\n ></ng-container>\n </div>\n </ng-container>\n <div\n class=\"\n str-chat__message-data\n str-chat__message-simple-data\n str-chat__message-metadata\n \"\n >\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n\n <span\n *ngIf=\"!isSentByCurrentUser\"\n data-testid=\"sender\"\n class=\"str-chat__message-simple-name str-chat__message-sender-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span\n data-testid=\"date\"\n class=\"str-chat__message-simple-timestamp str-chat__message-simple-time\"\n >\n {{ parsedDate }}\n </span>\n <ng-container *ngIf=\"message?.message_text_updated_at\">\n <span\n data-testid=\"edited-flag\"\n class=\"str-chat__mesage-simple-edited\"\n translate\n >streamChat.Edited</span\n >\n <div\n data-testid=\"edited-timestamp\"\n class=\"str-chat__message-edited-timestamp\"\n [ngClass]=\"{\n 'str-chat__message-edited-timestamp--open': isEditedFlagOpened,\n 'str-chat__message-edited-timestamp--collapsed': !isEditedFlagOpened\n }\"\n >\n <span translate>streamChat.Edited</span>\n <time\n dateTime=\"{{ message?.message_text_updated_at }}\"\n title=\"{{ message?.message_text_updated_at }}\"\n >\n {{ pasedEditedDate }}\n </time>\n </div>\n </ng-container>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #messageStatus>\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n mode === 'main' && isMessageDeliveredAndRead && canDisplayReadStatus;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #deliveredStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.deliveredStatusTemplate$ | async) ||\n defaultDeliveredStatus;\n context: getDeliveredStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultDeliveredStatus>\n <span\n *ngIf=\"mode === 'main'\"\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"delivered-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder\n data-testid=\"delivered-icon\"\n icon=\"delivered\"\n ></stream-icon-placeholder>\n </span>\n </ng-template>\n <ng-template #sendingStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.sendingStatusTemplate$ | async) ||\n defaultSendingStatus;\n context: getSendingStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultSendingStatus>\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"sending-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n </float-ui-content>\n <stream-loading-indicator-placeholder\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </span>\n </ng-template>\n <ng-template #readStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.readStatusTemplate$ | async) ||\n defaultReadStatus;\n context: getReadStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultReadStatus let-readByText=\"readByText\">\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"read-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div\n class=\"str-chat__tooltip str-chat__tooltip-angular\"\n data-testid=\"read-by-tooltip\"\n >\n {{ readByText }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder icon=\"read\"></stream-icon-placeholder>\n </span>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #replyCountButton>\n <div\n class=\"\n str-chat__message-simple-reply-button\n str-chat__message-replies-count-button-wrapper\n \"\n >\n <button\n *ngIf=\"shouldDisplayThreadLink\"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n {{message?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </button>\n </div>\n</ng-template>\n\n<ng-template #attachmentsTemplate>\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getAttachmentListContext()\n \"\n ></ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i8.NgxFloatUiContentComponent, selector: "float-ui-content", exportAs: ["ngxFloatUiContent"] }, { kind: "directive", type: i8.NgxFloatUiLooseDirective, selector: "[floatUiLoose]", inputs: ["floatUiLoose", "loosePlacement", "looseTrigger"], exportAs: ["floatUiLoose"] }, { kind: "component", type: i9.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "directive", type: i10.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i11.MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: ["isMine", "message", "messageTextHtmlElement", "enabledActions"] }, { kind: "component", type: i12.AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "parentMessageId", "attachments"], outputs: ["imageModalStateChange"] }, { kind: "component", type: i13.MessageReactionsComponent, selector: "stream-message-reactions", inputs: ["messageId", "messageReactionCounts", "latestReactions", "ownReactions"] }, { kind: "component", type: i14.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "component", type: i15.LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
485
|
+
MessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageComponent, deps: [{ token: i1.ChatClientService }, { token: i2.ChannelService }, { token: i3.CustomTemplatesService }, { token: i0.ChangeDetectorRef }, { token: i4.DateParserService }, { token: i5.MessageService }, { token: i6.MessageActionsService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
486
|
+
MessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: MessageComponent, selector: "stream-message", inputs: { message: "message", enabledMessageActions: "enabledMessageActions", isLastSentMessage: "isLastSentMessage", mode: "mode", isHighlighted: "isHighlighted", scroll$: "scroll$" }, viewQueries: [{ propertyName: "messageMenuTrigger", first: true, predicate: ["messageMenuTrigger"], descendants: true }, { propertyName: "messageMenuFloat", first: true, predicate: ["messageMenuFloat"], descendants: true }, { propertyName: "messageTextElement", first: true, predicate: ["messageTextElement"], descendants: true }, { propertyName: "messageBubble", first: true, predicate: ["messageBubble"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #container\n data-testid=\"message-container\"\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }} str-chat__message-menu-{{ areMessageOptionsOpen ? 'opened' : 'closed' }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--other]=\"!isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"hasReactions\"\n [class.str-chat__message--highlighted]=\"isHighlighted\"\n [class.str-chat__message-with-thread-link]=\"shouldDisplayThreadLink\"\n [class.str-chat__message-send-can-be-retried]=\"\n (message?.status === 'failed' && message?.errorStatusCode !== 403) ||\n (message?.type === 'error' && message?.moderation_details)\n \"\n [class.str-chat__message-with-touch-support]=\"hasTouchSupport\"\n [class.str-chat__message-without-touch-support]=\"!hasTouchSupport\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <stream-avatar-placeholder\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"message-sender\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n [user]=\"message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__message-inner\">\n <div\n *ngIf=\"!hasTouchSupport && areOptionsVisible\"\n class=\"str-chat__message-simple__actions str-chat__message-options\"\n data-testid=\"message-options\"\n [class.str-chat__message-actions-open]=\"areMessageOptionsOpen\"\n >\n <div\n #messageActionsToggle\n data-testid=\"message-actions-container\"\n class=\"\n str-chat__message-actions-container\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--options\n \"\n [floatUiLoose]=\"messageMenuFloat\"\n looseTrigger=\"click\"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n (onSHown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n >\n <div\n *ngIf=\"visibleMessageActionsCount > 0\"\n class=\"str-chat__message-actions-box-button\"\n data-testid=\"message-options-button\"\n (click)=\"messageOptionsButtonClicked()\"\n (keyup.enter)=\"messageOptionsButtonClicked()\"\n >\n <stream-icon-placeholder\n icon=\"action\"\n class=\"str-chat__message-action-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n </div>\n <div class=\"str-chat__message-reactions-host\">\n <ng-template\n #defaultMessageReactions\n let-messageReactionCounts=\"messageReactionCounts\"\n let-latestReactions=\"latestReactions\"\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n ></stream-message-reactions>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageReactionsTemplate$ | async) ||\n defaultMessageReactions;\n context: getMessageReactionsContext()\n \"\n ></ng-container>\n </div>\n <float-ui-content #messageMenuFloat>\n <ng-template\n #defaultMessageActionsBox\n let-isMine=\"isMine\"\n let-messageInput=\"message\"\n let-enabledActions=\"enabledActions\"\n let-messageTextHtmlElement=\"messageTextHtmlElement\"\n >\n <stream-message-actions-box\n [isMine]=\"isMine\"\n [message]=\"messageInput\"\n [enabledActions]=\"enabledActions\"\n [messageTextHtmlElement]=\"messageTextHtmlElement\"\n (click)=\"messageActionsBoxClicked(messageMenuFloat)\"\n ></stream-message-actions-box>\n </ng-template>\n <ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageActionsBoxTemplate$ | async) ||\n defaultMessageActionsBox;\n context: getMessageActionsBoxContext()\n \"\n >\n </ng-container>\n </ng-container>\n </float-ui-content>\n <div\n class=\"str-chat__message-bubble str-chat-angular__message-bubble\"\n [class.str-chat-angular__message-bubble--attachment-modal-open]=\"\n imageAttachmentModalState === 'opened'\n \"\n data-testid=\"message-bubble\"\n [floatUiLoose]=\"messageMenuFloat\"\n #messageMenuTrigger=\"floatUiLoose\"\n #messageBubble\n looseTrigger=\"none\"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"true\"\n [preventOverflow]=\"true\"\n (onShown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n [positionFixed]=\"true\"\n >\n <ng-container *ngIf=\"hasAttachment && !message?.quoted_message\">\n <div class=\"str-chat__attachments-container\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"message?.text || (message?.quoted_message && hasAttachment)\"\n class=\"str-chat__message-text\"\n tabindex=\"0\"\n [class.str-chat__message-text--pointer-cursor]=\"\n (message?.status === 'failed' &&\n message?.errorStatusCode !== 403) ||\n (this.message?.type === 'error' &&\n this.message?.moderation_details) ||\n message?.message_text_updated_at\n \"\n (click)=\"messageClicked()\"\n (keyup.enter)=\"messageClicked()\"\n >\n <div\n data-testid=\"inner-message\"\n class=\"\n str-chat__message-text-inner str-chat__message-simple-text-inner\n \"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n >\n <ng-container *ngTemplateOutlet=\"quotedMessage\"></ng-container>\n <ng-container *ngIf=\"hasAttachment && message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </ng-container>\n <div\n *ngIf=\"message?.type === 'error'\"\n data-testid=\"client-error-message\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n <ng-container *ngIf=\"!message?.moderation_details\">{{\n \"streamChat.Error \u00B7 Unsent\" | translate\n }}</ng-container>\n </div>\n <div\n *ngIf=\"message?.status === 'failed'\"\n data-testid=\"error-message\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed \u00B7 Unauthorized\"\n : \"streamChat.Message Failed \u00B7 Click to try again\"\n ) | translate\n }}\n </div>\n <div #messageTextElement data-testid=\"text\">\n <p>\n <ng-container *ngIf=\"messageTextParts; else defaultContent\">\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-template #defaultMention let-content=\"content\">\n <span class=\"str-chat__message-mention\">{{\n content\n }}</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.mentionTemplate$ | async) ||\n defaultMention;\n context: getMentionContext(part)\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #defaultContent>\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ messageText || \"\" }}\n </ng-container>\n <ng-template #asHTML\n ><span\n data-testid=\"html-content\"\n [innerHTML]=\"messageText\"\n ></span\n ></ng-template>\n </ng-template>\n </p>\n </div>\n </div>\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-error-icon\"\n icon=\"error\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <ng-container\n *ngTemplateOutlet=\"replyCountButton; context: { message: message }\"\n ></ng-container>\n\n <ng-container *ngTemplateOutlet=\"messageDateAndSender\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n</ng-template>\n\n<ng-template #systemMessage>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.systemMessageTemplate$ | async) ||\n defaultSystemMessage;\n context: getMessageContext()\n \"\n ></ng-container>\n <ng-template #defaultSystemMessage let-messageInput=\"message\">\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ messageInput?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #quotedMessage>\n <div\n *ngIf=\"message?.quoted_message\"\n class=\"quoted-message str-chat__quoted-message-preview\"\n data-testid=\"quoted-message-container\"\n [class.mine]=\"isSentByCurrentUser\"\n (click)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n (keyup.enter)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [user]=\"message?.quoted_message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"quoted-message-inner str-chat__quoted-message-bubble\">\n <ng-container\n *ngIf=\"\n message?.quoted_message?.attachments &&\n message?.quoted_message?.attachments?.length\n \"\n >\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getQuotedMessageAttachmentListContext()\n \"\n ></ng-container>\n </ng-container>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"\n message?.quoted_message?.translation ||\n message?.quoted_message?.html ||\n message?.quoted_message?.text\n \"\n ></div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #messageDateAndSender>\n <ng-container>\n <div\n *ngIf=\"shouldDisplayTranslationNotice\"\n class=\"str-chat__translation-notice\"\n data-testid=\"translation-notice\"\n >\n <button\n *ngIf=\"displayedMessageTextContent === 'translation'\"\n data-testid=\"see-original\"\n translate\n (click)=\"displayOriginalMessage()\"\n (keyup.enter)=\"displayOriginalMessage()\"\n >\n streamChat.See original (automatically translated)\n </button>\n <button\n *ngIf=\"displayedMessageTextContent === 'original'\"\n data-testid=\"see-translation\"\n translate\n (click)=\"displayTranslatedMessage()\"\n (keyup.enter)=\"displayTranslatedMessage()\"\n >\n streamChat.See translation\n </button>\n </div>\n <ng-container\n *ngIf=\"customTemplatesService.customMessageMetadataTemplate$ | async\"\n >\n <div class=\"str-chat__custom-message-metadata\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.customMessageMetadataTemplate$ | async)!;\n context: getMessageMetadataContext()\n \"\n ></ng-container>\n </div>\n </ng-container>\n <div\n class=\"\n str-chat__message-data\n str-chat__message-simple-data\n str-chat__message-metadata\n \"\n >\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n\n <span\n *ngIf=\"!isSentByCurrentUser\"\n data-testid=\"sender\"\n class=\"str-chat__message-simple-name str-chat__message-sender-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span\n data-testid=\"date\"\n class=\"str-chat__message-simple-timestamp str-chat__message-simple-time\"\n >\n {{ parsedDate }}\n </span>\n <ng-container *ngIf=\"message?.message_text_updated_at\">\n <span\n data-testid=\"edited-flag\"\n class=\"str-chat__mesage-simple-edited\"\n translate\n >streamChat.Edited</span\n >\n <div\n data-testid=\"edited-timestamp\"\n class=\"str-chat__message-edited-timestamp\"\n [ngClass]=\"{\n 'str-chat__message-edited-timestamp--open': isEditedFlagOpened,\n 'str-chat__message-edited-timestamp--collapsed': !isEditedFlagOpened\n }\"\n >\n <span translate>streamChat.Edited</span>\n <time\n dateTime=\"{{ message?.message_text_updated_at }}\"\n title=\"{{ message?.message_text_updated_at }}\"\n >\n {{ pasedEditedDate }}\n </time>\n </div>\n </ng-container>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #messageStatus>\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n mode === 'main' && isMessageDeliveredAndRead && canDisplayReadStatus;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #deliveredStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.deliveredStatusTemplate$ | async) ||\n defaultDeliveredStatus;\n context: getDeliveredStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultDeliveredStatus>\n <span\n *ngIf=\"mode === 'main'\"\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"delivered-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder\n data-testid=\"delivered-icon\"\n icon=\"delivered\"\n ></stream-icon-placeholder>\n </span>\n </ng-template>\n <ng-template #sendingStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.sendingStatusTemplate$ | async) ||\n defaultSendingStatus;\n context: getSendingStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultSendingStatus>\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"sending-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n </float-ui-content>\n <stream-loading-indicator-placeholder\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </span>\n </ng-template>\n <ng-template #readStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.readStatusTemplate$ | async) ||\n defaultReadStatus;\n context: getReadStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultReadStatus let-readByText=\"readByText\">\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"read-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div\n class=\"str-chat__tooltip str-chat__tooltip-angular\"\n data-testid=\"read-by-tooltip\"\n >\n {{ readByText }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder icon=\"read\"></stream-icon-placeholder>\n </span>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #replyCountButton>\n <div\n class=\"\n str-chat__message-simple-reply-button\n str-chat__message-replies-count-button-wrapper\n \"\n >\n <button\n *ngIf=\"shouldDisplayThreadLink\"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n {{message?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </button>\n </div>\n</ng-template>\n\n<ng-template #attachmentsTemplate>\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getAttachmentListContext()\n \"\n ></ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i8.NgxFloatUiContentComponent, selector: "float-ui-content", exportAs: ["ngxFloatUiContent"] }, { kind: "directive", type: i8.NgxFloatUiLooseDirective, selector: "[floatUiLoose]", inputs: ["floatUiLoose", "loosePlacement", "looseTrigger"], exportAs: ["floatUiLoose"] }, { kind: "component", type: i9.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "directive", type: i10.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i11.MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: ["isMine", "message", "messageTextHtmlElement", "enabledActions"] }, { kind: "component", type: i12.AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "parentMessageId", "attachments"], outputs: ["imageModalStateChange"] }, { kind: "component", type: i13.MessageReactionsComponent, selector: "stream-message-reactions", inputs: ["messageId", "messageReactionCounts", "latestReactions", "ownReactions"] }, { kind: "component", type: i14.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "component", type: i15.LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
462
487
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageComponent, decorators: [{
|
|
463
488
|
type: Component,
|
|
464
|
-
args: [{ selector: 'stream-message', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #container\n data-testid=\"message-container\"\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }} str-chat__message-menu-{{ areMessageOptionsOpen ? 'opened' : 'closed' }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--other]=\"!isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"hasReactions\"\n [class.str-chat__message--highlighted]=\"isHighlighted\"\n [class.str-chat__message-with-thread-link]=\"shouldDisplayThreadLink\"\n [class.str-chat__message-send-can-be-retried]=\"\n (message?.status === 'failed' && message?.errorStatusCode !== 403) ||\n (message?.type === 'error' && message?.moderation_details)\n \"\n [class.str-chat__message-with-touch-support]=\"hasTouchSupport\"\n [class.str-chat__message-without-touch-support]=\"!hasTouchSupport\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <stream-avatar-placeholder\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"message-sender\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n [user]=\"message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__message-inner\">\n <div\n *ngIf=\"!hasTouchSupport && areOptionsVisible\"\n class=\"str-chat__message-simple__actions str-chat__message-options\"\n data-testid=\"message-options\"\n [class.str-chat__message-actions-open]=\"areMessageOptionsOpen\"\n >\n <div\n #messageActionsToggle\n data-testid=\"message-actions-container\"\n class=\"\n str-chat__message-actions-container\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--options\n \"\n [floatUiLoose]=\"messageMenuFloat\"\n looseTrigger=\"click\"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n (onSHown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n >\n <div\n *ngIf=\"visibleMessageActionsCount > 0\"\n class=\"str-chat__message-actions-box-button\"\n data-testid=\"message-options-button\"\n (click)=\"messageOptionsButtonClicked()\"\n (keyup.enter)=\"messageOptionsButtonClicked()\"\n >\n <stream-icon-placeholder\n icon=\"action\"\n class=\"str-chat__message-action-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n </div>\n <div class=\"str-chat__message-reactions-host\">\n <ng-template\n #defaultMessageReactions\n let-messageReactionCounts=\"messageReactionCounts\"\n let-latestReactions=\"latestReactions\"\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n ></stream-message-reactions>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageReactionsTemplate$ | async) ||\n defaultMessageReactions;\n context: getMessageReactionsContext()\n \"\n ></ng-container>\n </div>\n <float-ui-content #messageMenuFloat>\n <ng-template\n #defaultMessageActionsBox\n let-isMine=\"isMine\"\n let-messageInput=\"message\"\n let-enabledActions=\"enabledActions\"\n let-messageTextHtmlElement=\"messageTextHtmlElement\"\n >\n <stream-message-actions-box\n [isMine]=\"isMine\"\n [message]=\"messageInput\"\n [enabledActions]=\"enabledActions\"\n [messageTextHtmlElement]=\"messageTextHtmlElement\"\n (click)=\"messageActionsBoxClicked(messageMenuFloat)\"\n ></stream-message-actions-box>\n </ng-template>\n <ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageActionsBoxTemplate$ | async) ||\n defaultMessageActionsBox;\n context: getMessageActionsBoxContext()\n \"\n >\n </ng-container>\n </ng-container>\n </float-ui-content>\n <div\n class=\"str-chat__message-bubble str-chat-angular__message-bubble\"\n [class.str-chat-angular__message-bubble--attachment-modal-open]=\"\n imageAttachmentModalState === 'opened'\n \"\n data-testid=\"message-bubble\"\n [floatUiLoose]=\"messageMenuFloat\"\n #messageMenuTrigger=\"floatUiLoose\"\n looseTrigger=\"none\"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"true\"\n [preventOverflow]=\"true\"\n (onShown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n [positionFixed]=\"true\"\n (mousedown)=\"mousePushedDown($event)\"\n (mouseup)=\"mouseReleased()\"\n (touchstart)=\"touchStarted()\"\n (touchend)=\"touchEnded()\"\n (click)=\"messageBubbleClicked($event)\"\n (keyup.enter)=\"messageBubbleClicked($event)\"\n >\n <ng-container *ngIf=\"hasAttachment && !message?.quoted_message\">\n <div class=\"str-chat__attachments-container\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"message?.text || (message?.quoted_message && hasAttachment)\"\n class=\"str-chat__message-text\"\n tabindex=\"0\"\n [class.str-chat__message-text--pointer-cursor]=\"\n (message?.status === 'failed' &&\n message?.errorStatusCode !== 403) ||\n (this.message?.type === 'error' &&\n this.message?.moderation_details) ||\n message?.message_text_updated_at\n \"\n (click)=\"messageClicked()\"\n (keyup.enter)=\"messageClicked()\"\n >\n <div\n data-testid=\"inner-message\"\n class=\"\n str-chat__message-text-inner str-chat__message-simple-text-inner\n \"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n >\n <ng-container *ngTemplateOutlet=\"quotedMessage\"></ng-container>\n <ng-container *ngIf=\"hasAttachment && message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </ng-container>\n <div\n *ngIf=\"message?.type === 'error'\"\n data-testid=\"client-error-message\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n <ng-container *ngIf=\"!message?.moderation_details\">{{\n \"streamChat.Error \u00B7 Unsent\" | translate\n }}</ng-container>\n </div>\n <div\n *ngIf=\"message?.status === 'failed'\"\n data-testid=\"error-message\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed \u00B7 Unauthorized\"\n : \"streamChat.Message Failed \u00B7 Click to try again\"\n ) | translate\n }}\n </div>\n <div #messageTextElement data-testid=\"text\">\n <p>\n <ng-container *ngIf=\"messageTextParts; else defaultContent\">\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-template #defaultMention let-content=\"content\">\n <span class=\"str-chat__message-mention\">{{\n content\n }}</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.mentionTemplate$ | async) ||\n defaultMention;\n context: getMentionContext(part)\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #defaultContent>\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ messageText || \"\" }}\n </ng-container>\n <ng-template #asHTML\n ><span\n data-testid=\"html-content\"\n [innerHTML]=\"messageText\"\n ></span\n ></ng-template>\n </ng-template>\n </p>\n </div>\n </div>\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-error-icon\"\n icon=\"error\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <ng-container\n *ngTemplateOutlet=\"replyCountButton; context: { message: message }\"\n ></ng-container>\n\n <ng-container *ngTemplateOutlet=\"messageDateAndSender\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n</ng-template>\n\n<ng-template #systemMessage>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.systemMessageTemplate$ | async) ||\n defaultSystemMessage;\n context: getMessageContext()\n \"\n ></ng-container>\n <ng-template #defaultSystemMessage let-messageInput=\"message\">\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ messageInput?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #quotedMessage>\n <div\n *ngIf=\"message?.quoted_message\"\n class=\"quoted-message str-chat__quoted-message-preview\"\n data-testid=\"quoted-message-container\"\n [class.mine]=\"isSentByCurrentUser\"\n (click)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n (keyup.enter)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [user]=\"message?.quoted_message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"quoted-message-inner str-chat__quoted-message-bubble\">\n <ng-container\n *ngIf=\"\n message?.quoted_message?.attachments &&\n message?.quoted_message?.attachments?.length\n \"\n >\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getQuotedMessageAttachmentListContext()\n \"\n ></ng-container>\n </ng-container>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"\n message?.quoted_message?.translation ||\n message?.quoted_message?.html ||\n message?.quoted_message?.text\n \"\n ></div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #messageDateAndSender>\n <ng-container>\n <div\n *ngIf=\"shouldDisplayTranslationNotice\"\n class=\"str-chat__translation-notice\"\n data-testid=\"translation-notice\"\n >\n <button\n *ngIf=\"displayedMessageTextContent === 'translation'\"\n data-testid=\"see-original\"\n translate\n (click)=\"displayOriginalMessage()\"\n (keyup.enter)=\"displayOriginalMessage()\"\n >\n streamChat.See original (automatically translated)\n </button>\n <button\n *ngIf=\"displayedMessageTextContent === 'original'\"\n data-testid=\"see-translation\"\n translate\n (click)=\"displayTranslatedMessage()\"\n (keyup.enter)=\"displayTranslatedMessage()\"\n >\n streamChat.See translation\n </button>\n </div>\n <ng-container\n *ngIf=\"customTemplatesService.customMessageMetadataTemplate$ | async\"\n >\n <div class=\"str-chat__custom-message-metadata\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.customMessageMetadataTemplate$ | async)!;\n context: getMessageMetadataContext()\n \"\n ></ng-container>\n </div>\n </ng-container>\n <div\n class=\"\n str-chat__message-data\n str-chat__message-simple-data\n str-chat__message-metadata\n \"\n >\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n\n <span\n *ngIf=\"!isSentByCurrentUser\"\n data-testid=\"sender\"\n class=\"str-chat__message-simple-name str-chat__message-sender-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span\n data-testid=\"date\"\n class=\"str-chat__message-simple-timestamp str-chat__message-simple-time\"\n >\n {{ parsedDate }}\n </span>\n <ng-container *ngIf=\"message?.message_text_updated_at\">\n <span\n data-testid=\"edited-flag\"\n class=\"str-chat__mesage-simple-edited\"\n translate\n >streamChat.Edited</span\n >\n <div\n data-testid=\"edited-timestamp\"\n class=\"str-chat__message-edited-timestamp\"\n [ngClass]=\"{\n 'str-chat__message-edited-timestamp--open': isEditedFlagOpened,\n 'str-chat__message-edited-timestamp--collapsed': !isEditedFlagOpened\n }\"\n >\n <span translate>streamChat.Edited</span>\n <time\n dateTime=\"{{ message?.message_text_updated_at }}\"\n title=\"{{ message?.message_text_updated_at }}\"\n >\n {{ pasedEditedDate }}\n </time>\n </div>\n </ng-container>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #messageStatus>\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n mode === 'main' && isMessageDeliveredAndRead && canDisplayReadStatus;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #deliveredStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.deliveredStatusTemplate$ | async) ||\n defaultDeliveredStatus;\n context: getDeliveredStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultDeliveredStatus>\n <span\n *ngIf=\"mode === 'main'\"\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"delivered-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder\n data-testid=\"delivered-icon\"\n icon=\"delivered\"\n ></stream-icon-placeholder>\n </span>\n </ng-template>\n <ng-template #sendingStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.sendingStatusTemplate$ | async) ||\n defaultSendingStatus;\n context: getSendingStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultSendingStatus>\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"sending-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n </float-ui-content>\n <stream-loading-indicator-placeholder\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </span>\n </ng-template>\n <ng-template #readStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.readStatusTemplate$ | async) ||\n defaultReadStatus;\n context: getReadStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultReadStatus let-readByText=\"readByText\">\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"read-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div\n class=\"str-chat__tooltip str-chat__tooltip-angular\"\n data-testid=\"read-by-tooltip\"\n >\n {{ readByText }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder icon=\"read\"></stream-icon-placeholder>\n </span>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #replyCountButton>\n <div\n class=\"\n str-chat__message-simple-reply-button\n str-chat__message-replies-count-button-wrapper\n \"\n >\n <button\n *ngIf=\"shouldDisplayThreadLink\"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n {{message?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </button>\n </div>\n</ng-template>\n\n<ng-template #attachmentsTemplate>\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getAttachmentListContext()\n \"\n ></ng-container>\n</ng-template>\n" }]
|
|
465
|
-
}], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i2.ChannelService }, { type: i3.CustomTemplatesService }, { type: i0.ChangeDetectorRef }, { type: i4.DateParserService }, { type: i5.MessageService }, { type: i6.MessageActionsService }]; }, propDecorators: { message: [{
|
|
489
|
+
args: [{ selector: 'stream-message', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #container\n data-testid=\"message-container\"\n class=\"str-chat__message-simple str-chat__message str-chat__message--{{\n message?.type\n }} str-chat__message--{{ message?.status }} {{\n message?.text ? 'str-chat__message--has-text' : 'has-no-text'\n }} str-chat__message-menu-{{ areMessageOptionsOpen ? 'opened' : 'closed' }}\"\n [class.str-chat__message--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--other]=\"!isSentByCurrentUser\"\n [class.str-chat__message-simple--me]=\"isSentByCurrentUser\"\n [class.str-chat__message--has-attachment]=\"hasAttachment\"\n [class.str-chat__message--with-reactions]=\"hasReactions\"\n [class.str-chat__message--highlighted]=\"isHighlighted\"\n [class.str-chat__message-with-thread-link]=\"shouldDisplayThreadLink\"\n [class.str-chat__message-send-can-be-retried]=\"\n (message?.status === 'failed' && message?.errorStatusCode !== 403) ||\n (message?.type === 'error' && message?.moderation_details)\n \"\n [class.str-chat__message-with-touch-support]=\"hasTouchSupport\"\n [class.str-chat__message-without-touch-support]=\"!hasTouchSupport\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <stream-avatar-placeholder\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"message-sender\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n [user]=\"message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__message-inner\">\n <div\n *ngIf=\"!hasTouchSupport && areOptionsVisible\"\n class=\"str-chat__message-simple__actions str-chat__message-options\"\n data-testid=\"message-options\"\n [class.str-chat__message-actions-open]=\"areMessageOptionsOpen\"\n >\n <div\n #messageActionsToggle\n data-testid=\"message-actions-container\"\n class=\"\n str-chat__message-actions-container\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--options\n \"\n [floatUiLoose]=\"messageMenuFloat\"\n looseTrigger=\"click\"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n (onSHown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n >\n <div\n *ngIf=\"visibleMessageActionsCount > 0\"\n class=\"str-chat__message-actions-box-button\"\n data-testid=\"message-options-button\"\n (click)=\"messageOptionsButtonClicked()\"\n (keyup.enter)=\"messageOptionsButtonClicked()\"\n >\n <stream-icon-placeholder\n icon=\"action\"\n class=\"str-chat__message-action-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n </div>\n <div class=\"str-chat__message-reactions-host\">\n <ng-template\n #defaultMessageReactions\n let-messageReactionCounts=\"messageReactionCounts\"\n let-latestReactions=\"latestReactions\"\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n ></stream-message-reactions>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageReactionsTemplate$ | async) ||\n defaultMessageReactions;\n context: getMessageReactionsContext()\n \"\n ></ng-container>\n </div>\n <float-ui-content #messageMenuFloat>\n <ng-template\n #defaultMessageActionsBox\n let-isMine=\"isMine\"\n let-messageInput=\"message\"\n let-enabledActions=\"enabledActions\"\n let-messageTextHtmlElement=\"messageTextHtmlElement\"\n >\n <stream-message-actions-box\n [isMine]=\"isMine\"\n [message]=\"messageInput\"\n [enabledActions]=\"enabledActions\"\n [messageTextHtmlElement]=\"messageTextHtmlElement\"\n (click)=\"messageActionsBoxClicked(messageMenuFloat)\"\n ></stream-message-actions-box>\n </ng-template>\n <ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageActionsBoxTemplate$ | async) ||\n defaultMessageActionsBox;\n context: getMessageActionsBoxContext()\n \"\n >\n </ng-container>\n </ng-container>\n </float-ui-content>\n <div\n class=\"str-chat__message-bubble str-chat-angular__message-bubble\"\n [class.str-chat-angular__message-bubble--attachment-modal-open]=\"\n imageAttachmentModalState === 'opened'\n \"\n data-testid=\"message-bubble\"\n [floatUiLoose]=\"messageMenuFloat\"\n #messageMenuTrigger=\"floatUiLoose\"\n #messageBubble\n looseTrigger=\"none\"\n [hideOnScroll]=\"false\"\n [hideOnClickOutside]=\"true\"\n [hideOnMouseLeave]=\"false\"\n [disableAnimation]=\"true\"\n [preventOverflow]=\"true\"\n (onShown)=\"areMessageOptionsOpen = true\"\n (onHidden)=\"areMessageOptionsOpen = false\"\n [positionFixed]=\"true\"\n >\n <ng-container *ngIf=\"hasAttachment && !message?.quoted_message\">\n <div class=\"str-chat__attachments-container\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"message?.text || (message?.quoted_message && hasAttachment)\"\n class=\"str-chat__message-text\"\n tabindex=\"0\"\n [class.str-chat__message-text--pointer-cursor]=\"\n (message?.status === 'failed' &&\n message?.errorStatusCode !== 403) ||\n (this.message?.type === 'error' &&\n this.message?.moderation_details) ||\n message?.message_text_updated_at\n \"\n (click)=\"messageClicked()\"\n (keyup.enter)=\"messageClicked()\"\n >\n <div\n data-testid=\"inner-message\"\n class=\"\n str-chat__message-text-inner str-chat__message-simple-text-inner\n \"\n [class.str-chat__message-light-text-inner--has-attachment]=\"\n hasAttachment\n \"\n >\n <ng-container *ngTemplateOutlet=\"quotedMessage\"></ng-container>\n <ng-container *ngIf=\"hasAttachment && message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </ng-container>\n <div\n *ngIf=\"message?.type === 'error'\"\n data-testid=\"client-error-message\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n <ng-container *ngIf=\"!message?.moderation_details\">{{\n \"streamChat.Error \u00B7 Unsent\" | translate\n }}</ng-container>\n </div>\n <div\n *ngIf=\"message?.status === 'failed'\"\n data-testid=\"error-message\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n {{\n (message?.errorStatusCode === 403\n ? \"streamChat.Message Failed \u00B7 Unauthorized\"\n : \"streamChat.Message Failed \u00B7 Click to try again\"\n ) | translate\n }}\n </div>\n <div #messageTextElement data-testid=\"text\">\n <p>\n <ng-container *ngIf=\"messageTextParts; else defaultContent\">\n <!-- eslint-disable-next-line @angular-eslint/template/use-track-by-function -->\n <ng-container *ngFor=\"let part of messageTextParts\">\n <span\n *ngIf=\"part.type === 'text'; else mention\"\n [innerHTML]=\"part.content\"\n ></span>\n <ng-template #mention>\n <ng-template #defaultMention let-content=\"content\">\n <span class=\"str-chat__message-mention\">{{\n content\n }}</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.mentionTemplate$ | async) ||\n defaultMention;\n context: getMentionContext(part)\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-template #defaultContent>\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ messageText || \"\" }}\n </ng-container>\n <ng-template #asHTML\n ><span\n data-testid=\"html-content\"\n [innerHTML]=\"messageText\"\n ></span\n ></ng-template>\n </ng-template>\n </p>\n </div>\n </div>\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-error-icon\"\n icon=\"error\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <ng-container\n *ngTemplateOutlet=\"replyCountButton; context: { message: message }\"\n ></ng-container>\n\n <ng-container *ngTemplateOutlet=\"messageDateAndSender\"></ng-container>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #deletedMessage>\n <div data-testid=\"message-deleted-component\">\n <div class=\"str-chat__message--deleted-inner\" translate>\n streamChat.This message was deleted...\n </div>\n </div>\n</ng-template>\n\n<ng-template #systemMessage>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.systemMessageTemplate$ | async) ||\n defaultSystemMessage;\n context: getMessageContext()\n \"\n ></ng-container>\n <ng-template #defaultSystemMessage let-messageInput=\"message\">\n <div data-testid=\"system-message\" class=\"str-chat__message--system\">\n <div class=\"str-chat__message--system__text\">\n <div class=\"str-chat__message--system__line\"></div>\n <p>{{ messageInput?.text }}</p>\n <div class=\"str-chat__message--system__line\"></div>\n </div>\n <div class=\"str-chat__message--system__date\">\n {{ parsedDate }}\n </div>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #quotedMessage>\n <div\n *ngIf=\"message?.quoted_message\"\n class=\"quoted-message str-chat__quoted-message-preview\"\n data-testid=\"quoted-message-container\"\n [class.mine]=\"isSentByCurrentUser\"\n (click)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n (keyup.enter)=\"\n jumpToMessage(\n (message?.quoted_message)!.id,\n message?.quoted_message?.parent_id\n )\n \"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [user]=\"message?.quoted_message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"quoted-message-inner str-chat__quoted-message-bubble\">\n <ng-container\n *ngIf=\"\n message?.quoted_message?.attachments &&\n message?.quoted_message?.attachments?.length\n \"\n >\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getQuotedMessageAttachmentListContext()\n \"\n ></ng-container>\n </ng-container>\n <div\n data-testid=\"quoted-message-text\"\n [innerHTML]=\"\n message?.quoted_message?.translation ||\n message?.quoted_message?.html ||\n message?.quoted_message?.text\n \"\n ></div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #messageDateAndSender>\n <ng-container>\n <div\n *ngIf=\"shouldDisplayTranslationNotice\"\n class=\"str-chat__translation-notice\"\n data-testid=\"translation-notice\"\n >\n <button\n *ngIf=\"displayedMessageTextContent === 'translation'\"\n data-testid=\"see-original\"\n translate\n (click)=\"displayOriginalMessage()\"\n (keyup.enter)=\"displayOriginalMessage()\"\n >\n streamChat.See original (automatically translated)\n </button>\n <button\n *ngIf=\"displayedMessageTextContent === 'original'\"\n data-testid=\"see-translation\"\n translate\n (click)=\"displayTranslatedMessage()\"\n (keyup.enter)=\"displayTranslatedMessage()\"\n >\n streamChat.See translation\n </button>\n </div>\n <ng-container\n *ngIf=\"customTemplatesService.customMessageMetadataTemplate$ | async\"\n >\n <div class=\"str-chat__custom-message-metadata\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.customMessageMetadataTemplate$ | async)!;\n context: getMessageMetadataContext()\n \"\n ></ng-container>\n </div>\n </ng-container>\n <div\n class=\"\n str-chat__message-data\n str-chat__message-simple-data\n str-chat__message-metadata\n \"\n >\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n\n <span\n *ngIf=\"!isSentByCurrentUser\"\n data-testid=\"sender\"\n class=\"str-chat__message-simple-name str-chat__message-sender-name\"\n >\n {{ message?.user?.name ? message?.user?.name : message?.user?.id }}\n </span>\n <span\n data-testid=\"date\"\n class=\"str-chat__message-simple-timestamp str-chat__message-simple-time\"\n >\n {{ parsedDate }}\n </span>\n <ng-container *ngIf=\"message?.message_text_updated_at\">\n <span\n data-testid=\"edited-flag\"\n class=\"str-chat__mesage-simple-edited\"\n translate\n >streamChat.Edited</span\n >\n <div\n data-testid=\"edited-timestamp\"\n class=\"str-chat__message-edited-timestamp\"\n [ngClass]=\"{\n 'str-chat__message-edited-timestamp--open': isEditedFlagOpened,\n 'str-chat__message-edited-timestamp--collapsed': !isEditedFlagOpened\n }\"\n >\n <span translate>streamChat.Edited</span>\n <time\n dateTime=\"{{ message?.message_text_updated_at }}\"\n title=\"{{ message?.message_text_updated_at }}\"\n >\n {{ pasedEditedDate }}\n </time>\n </div>\n </ng-container>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #messageStatus>\n <ng-container\n *ngIf=\"\n isSentByCurrentUser &&\n ((isLastSentMessage && message?.status === 'received') ||\n message?.status === 'sending')\n \"\n >\n <ng-container *ngIf=\"message?.status === 'sending'; else sentStatus\">\n <ng-container *ngTemplateOutlet=\"sendingStatus\"></ng-container>\n </ng-container>\n <ng-template #sentStatus>\n <ng-container\n *ngIf=\"\n mode === 'main' && isMessageDeliveredAndRead && canDisplayReadStatus;\n else deliveredStatus\n \"\n >\n <ng-container *ngTemplateOutlet=\"readStatus\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #deliveredStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.deliveredStatusTemplate$ | async) ||\n defaultDeliveredStatus;\n context: getDeliveredStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultDeliveredStatus>\n <span\n *ngIf=\"mode === 'main'\"\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"delivered-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder\n data-testid=\"delivered-icon\"\n icon=\"delivered\"\n ></stream-icon-placeholder>\n </span>\n </ng-template>\n <ng-template #sendingStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.sendingStatusTemplate$ | async) ||\n defaultSendingStatus;\n context: getSendingStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultSendingStatus>\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"sending-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n </float-ui-content>\n <stream-loading-indicator-placeholder\n data-testid=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </span>\n </ng-template>\n <ng-template #readStatus>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.readStatusTemplate$ | async) ||\n defaultReadStatus;\n context: getReadStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultReadStatus let-readByText=\"readByText\">\n <span\n class=\"\n str-chat__message-simple-status\n str-chat__message-simple-status-angular\n str-chat__message-status\n \"\n data-testid=\"read-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n looseTrigger=\"hover\"\n [disableAnimation]=\"false\"\n [preventOverflow]=\"true\"\n [positionFixed]=\"true\"\n >\n <float-ui-content #floatingContent>\n <div\n class=\"str-chat__tooltip str-chat__tooltip-angular\"\n data-testid=\"read-by-tooltip\"\n >\n {{ readByText }}\n </div>\n </float-ui-content>\n <stream-icon-placeholder icon=\"read\"></stream-icon-placeholder>\n </span>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #replyCountButton>\n <div\n class=\"\n str-chat__message-simple-reply-button\n str-chat__message-replies-count-button-wrapper\n \"\n >\n <button\n *ngIf=\"shouldDisplayThreadLink\"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n {{message?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </button>\n </div>\n</ng-template>\n\n<ng-template #attachmentsTemplate>\n <ng-template\n #defaultAttachments\n let-messageId=\"messageId\"\n let-attachments=\"attachments\"\n let-parentMessageId=\"parentMessageId\"\n let-imageModalStateChangeHandler=\"imageModalStateChangeHandler\"\n >\n <stream-attachment-list\n [messageId]=\"messageId\"\n [attachments]=\"attachments\"\n [parentMessageId]=\"parentMessageId\"\n (imageModalStateChange)=\"imageModalStateChangeHandler($event)\"\n ></stream-attachment-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentListTemplate$ | async) ||\n defaultAttachments;\n context: getAttachmentListContext()\n \"\n ></ng-container>\n</ng-template>\n" }]
|
|
490
|
+
}], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i2.ChannelService }, { type: i3.CustomTemplatesService }, { type: i0.ChangeDetectorRef }, { type: i4.DateParserService }, { type: i5.MessageService }, { type: i6.MessageActionsService }, { type: i0.NgZone }]; }, propDecorators: { message: [{
|
|
466
491
|
type: Input
|
|
467
492
|
}], enabledMessageActions: [{
|
|
468
493
|
type: Input
|
|
@@ -472,6 +497,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
|
|
|
472
497
|
type: Input
|
|
473
498
|
}], isHighlighted: [{
|
|
474
499
|
type: Input
|
|
500
|
+
}], scroll$: [{
|
|
501
|
+
type: Input
|
|
475
502
|
}], messageMenuTrigger: [{
|
|
476
503
|
type: ViewChild,
|
|
477
504
|
args: ['messageMenuTrigger']
|
|
@@ -481,5 +508,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
|
|
|
481
508
|
}], messageTextElement: [{
|
|
482
509
|
type: ViewChild,
|
|
483
510
|
args: ['messageTextElement']
|
|
511
|
+
}], messageBubble: [{
|
|
512
|
+
type: ViewChild,
|
|
513
|
+
args: ['messageBubble']
|
|
484
514
|
}] } });
|
|
485
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS9tZXNzYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlL21lc3NhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBTUwsdUJBQXVCLEVBRXZCLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQWlCdkIsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBR3JDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZTFDOztHQUVHO0FBT0gsTUFBTSxPQUFPLGdCQUFnQjtJQWtFM0IsWUFDVSxpQkFBb0MsRUFDcEMsY0FBOEIsRUFDL0Isc0JBQThDLEVBQzdDLEtBQXdCLEVBQ3hCLFVBQTZCLEVBQzdCLGNBQThCLEVBQzlCLHFCQUE0QztRQU41QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUMvQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzdDLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBbEV0RDs7V0FFRztRQUNNLDBCQUFxQixHQUFhLEVBQUUsQ0FBQztRQUs5Qzs7V0FFRztRQUNNLFNBQUksR0FBc0IsTUFBTSxDQUFDO1FBQzFDOztXQUVHO1FBQ00sa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHL0IsdUJBQWtCLEdBQUcsS0FBSyxDQUFD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UyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDakM7WUFDRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO1FBQzFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsWUFBWSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7U0FDekM7SUFDSCxDQUFDOzs2R0F6aEJVLGdCQUFnQjtpR0FBaEIsZ0JBQWdCLDZqQkN4RDdCLDBvdEJBaW5CQTsyRkR6akJhLGdCQUFnQjtrQkFONUIsU0FBUzsrQkFDRSxnQkFBZ0IsbUJBR1QsdUJBQXVCLENBQUMsTUFBTTsyU0FRdEMsT0FBTztzQkFBZixLQUFLO2dCQUlHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFJRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBSUcsSUFBSTtzQkFBWixLQUFLO2dCQUlHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBb0NOLGtCQUFrQjtzQkFEakIsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBRy9CLGdCQUFnQjtzQkFEZixTQUFTO3VCQUFDLGtCQUFrQjtnQkFFSSxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBBZnRlclZpZXdJbml0LFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXR0YWNobWVudCwgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRMaXN0Q29udGV4dCxcbiAgTWVudGlvblRlbXBsYXRlQ29udGV4dCxcbiAgTWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0LFxuICBNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCxcbiAgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbiAgU3RyZWFtTWVzc2FnZSxcbiAgRGVsaXZlcmVkU3RhdHVzQ29udGV4dCxcbiAgU2VuZGluZ1N0YXR1c0NvbnRleHQsXG4gIFJlYWRTdGF0dXNDb250ZXh0LFxuICBTeXN0ZW1NZXNzYWdlQ29udGV4dCxcbiAgQ3VzdG9tTWV0YWRhdGFDb250ZXh0LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZW1vamlSZWdleCBmcm9tICdlbW9qaS1yZWdleCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgbGlzdFVzZXJzIH0gZnJvbSAnLi4vbGlzdC11c2Vycyc7XG5pbXBvcnQgeyBEYXRlUGFyc2VyU2VydmljZSB9IGZyb20gJy4uL2RhdGUtcGFyc2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnZUFjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS1hY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTmd4RmxvYXRVaUNvbnRlbnRDb21wb25lbnQsXG4gIE5neEZsb2F0VWlMb29zZURpcmVjdGl2ZSxcbn0gZnJvbSAnbmd4LWZsb2F0LXVpJztcblxudHlwZSBNZXNzYWdlUGFydCA9IHtcbiAgY29udGVudDogc3RyaW5nO1xuICB0eXBlOiAndGV4dCcgfCAnbWVudGlvbic7XG4gIHVzZXI/OiBVc2VyUmVzcG9uc2U7XG59O1xuXG4vKipcbiAqIFRoZSBgTWVzc2FnZWAgY29tcG9uZW50IGRpc3BsYXlzIGEgbWVzc2FnZSB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBzZW5kZXIgYW5kIGRhdGUsIGFuZCBlbmFibGVzIFtpbnRlcmFjdGlvbiB3aXRoIHRoZSBtZXNzYWdlIChpLmUuIGVkaXQgb3IgcmVhY3QpXSguLi9jb25jZXB0cy9tZXNzYWdlLWludGVyYWN0aW9ucy5tZHgpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tbWVzc2FnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWRcbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBbY2hhbm5lbCBjYXBhYmlsaXRpZXNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2NoYW5uZWxfY2FwYWJpbGl0aWVzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSB0aGF0IGFyZSBlbmFibGVkIGZvciB0aGUgY3VycmVudCB1c2VyLCB0aGUgbGlzdCBvZiBbc3VwcG9ydGVkIGludGVyYWN0aW9uc10oLi4vY29uY2VwdHMvbWVzc2FnZS1pbnRlcmFjdGlvbnMubWR4KSBjYW4gYmUgZm91bmQgaW4gb3VyIG1lc3NhZ2UgaW50ZXJhY3Rpb24gZ3VpZGUuIFVuYXRob3JpemVkIGFjdGlvbnMgd29uJ3QgYmUgZGlzcGxheWVkIG9uIHRoZSBVSS4gVGhlIFtgTWVzc2FnZUxpc3RgXSguL01lc3NhZ2VMaXN0Q29tcG9uZW50Lm1keCkgY29tcG9uZW50IGF1dG9tYXRpY2FsbHkgc2V0cyB0aGlzIGJhc2VkIG9uIFtjaGFubmVsIGNhcGFiaWxpdGllc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvY2hhbm5lbF9jYXBhYmlsaXRpZXMvP2xhbmd1YWdlPWphdmFzY3JpcHQpLlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgbWVzc2FnZSBzdGF0dXMgKHNlbmRpbmcsIHNlbnQsIHdobyByZWFkIHRoZSBtZXNzYWdlKSBpcyBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBpc0xhc3RTZW50TWVzc2FnZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIG1lc3NhZ2UgaXMgYmVpbmcgZGlzcGFseWVkIGluIGEgY2hhbm5lbCBvciBpbiBhIFt0aHJlYWRdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3RocmVhZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpLlxuICAgKi9cbiAgQElucHV0KCkgbW9kZTogJ3RocmVhZCcgfCAnbWFpbicgPSAnbWFpbic7XG4gIC8qKlxuICAgKiBIaWdobGlnaHRpbmcgaXMgdXNlZCB0byBhZGQgdmlzdWFsIGVtcGhhc2l6ZSB0byBhIG1lc3NhZ2Ugd2hlbiBqdW1waW5nIHRvIHRoZSBtZXNzYWdlXG4gICAqL1xuICBASW5wdXQoKSBpc0hpZ2hsaWdodGVkID0gZmFsc2U7XG4gIGNhblJlY2VpdmVSZWFkRXZlbnRzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBjYW5SZWFjdFRvTWVzc2FnZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgaXNFZGl0ZWRGbGFnT3BlbmVkID0gZmFsc2U7XG4gIG1lc3NhZ2VUZXh0UGFydHM6IE1lc3NhZ2VQYXJ0W10gfCB1bmRlZmluZWQgPSBbXTtcbiAgbWVzc2FnZVRleHQ/OiBzdHJpbmc7XG4gIHNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZSA9IGZhbHNlO1xuICBkaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQ6ICdvcmlnaW5hbCcgfCAndHJhbnNsYXRpb24nID0gJ29yaWdpbmFsJztcbiAgaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZTogJ29wZW5lZCcgfCAnY2xvc2VkJyA9ICdjbG9zZWQnO1xuICBzaG91bGREaXNwbGF5VGhyZWFkTGluayA9IGZhbHNlO1xuICBpc1NlbnRCeUN1cnJlbnRVc2VyID0gZmFsc2U7XG4gIHJlYWRCeVRleHQgPSAnJztcbiAgZGlzcGxheUFzOiAndGV4dCcgfCAnaHRtbCc7XG4gIGxhc3RSZWFkVXNlcjogVXNlclJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBpc09ubHlSZWFkQnlNZSA9IGZhbHNlO1xuICBpc1JlYWRCeU11bHRpcGxlVXNlcnMgPSBmYWxzZTtcbiAgaXNNZXNzYWdlRGVsaXZlcmVkQW5kUmVhZCA9IGZhbHNlO1xuICBwYXJzZWREYXRlID0gJyc7XG4gIHBhc2VkRWRpdGVkRGF0ZSA9ICcnO1xuICBhcmVPcHRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICBoYXNBdHRhY2htZW50ID0gZmFsc2U7XG4gIGhhc1JlYWN0aW9ucyA9IGZhbHNlO1xuICByZXBseUNvdW50UGFyYW06IHsgcmVwbHlDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkIH0gPSB7XG4gICAgcmVwbHlDb3VudDogdW5kZWZpbmVkLFxuICB9O1xuICBhcmVNZXNzYWdlT3B0aW9uc09wZW4gPSBmYWxzZTtcbiAgY2FuRGlzcGxheVJlYWRTdGF0dXMgPSBmYWxzZTtcbiAgaGFzVG91Y2hTdXBwb3J0ID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDA7XG4gIHByaXZhdGUgcXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRzOiBBdHRhY2htZW50W10gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB1c2VySWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsUmVnZXhwID1cbiAgICAvKD86KD86aHR0cHM/fGZ0cHxmaWxlKTpcXC9cXC98d3d3XFwufGZ0cFxcLikoPzpcXChbLUEtWjAtOSsmQCMvJT1+X3wkPyE6LC5dKlxcKXxbLUEtWjAtOSsmQCMvJT1+X3wkPyE6LC5dKSooPzpcXChbLUEtWjAtOSsmQCMvJT1+X3wkPyE6LC5dKlxcKXxbQS1aMC05KyZAIy8lPX5ffCRdKS9naW07XG4gIHByaXZhdGUgZW1vamlSZWdleHAgPSBuZXcgUmVnRXhwKGVtb2ppUmVnZXgoKSwgJ2cnKTtcbiAgQFZpZXdDaGlsZCgnbWVzc2FnZU1lbnVUcmlnZ2VyJylcbiAgbWVzc2FnZU1lbnVUcmlnZ2VyITogTmd4RmxvYXRVaUxvb3NlRGlyZWN0aXZlO1xuICBAVmlld0NoaWxkKCdtZXNzYWdlTWVudUZsb2F0JylcbiAgbWVzc2FnZU1lbnVGbG9hdCE6IE5neEZsb2F0VWlDb250ZW50Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdtZXNzYWdlVGV4dEVsZW1lbnQnKSBtZXNzYWdlVGV4dEVsZW1lbnQ/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSBzaG93TWVzc2FnZU1lbnVUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgc2hvdWxkUHJldmVudE1lc3NhZ2VNZW51Q2xvc2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHB1YmxpYyBjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlOiBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZGF0ZVBhcnNlcjogRGF0ZVBhcnNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlQWN0aW9uc1NlcnZpY2U6IE1lc3NhZ2VBY3Rpb25zU2VydmljZVxuICApIHtcbiAgICB0aGlzLmRpc3BsYXlBcyA9IHRoaXMubWVzc2FnZVNlcnZpY2UuZGlzcGxheUFzO1xuICB9XG5cbiAgZ2V0IHZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudDtcbiAgfVxuXG4gIHNldCB2aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudChjb3VudDogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSBjb3VudDtcbiAgICBpZiAodGhpcy5hcmVPcHRpb25zVmlzaWJsZSAmJiB0aGlzLl92aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5hcmVPcHRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS51c2VyJC5zdWJzY3JpYmUoKHUpID0+IHtcbiAgICAgICAgaWYgKHU/LmlkICE9PSB0aGlzLnVzZXJJZCkge1xuICAgICAgICAgIHRoaXMudXNlcklkID0gdT8uaWQ7XG4gICAgICAgICAgdGhpcy5zZXRJc1NlbnRCeUN1cnJlbnRVc2VyKCk7XG4gICAgICAgICAgdGhpcy5zZXRMYXN0UmVhZFVzZXIoKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9ucyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZSkge1xuICAgICAgICAgIGNvbnN0IG51bWJlck9mRW5hYmxlZEFjdGlvbnMgPVxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuZ2V0QXV0aG9yaXplZE1lc3NhZ2VBY3Rpb25zQ291bnQoXG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZSxcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG51bWJlck9mRW5hYmxlZEFjdGlvbnMgIT09IHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSBudW1iZXJPZkVuYWJsZWRBY3Rpb25zO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuc2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlID0gZmFsc2U7XG4gICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICdvcmlnaW5hbCc7XG4gICAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VQYXJ0cygpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxBdHRhY2htZW50cyA9IHRoaXMubWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LmF0dGFjaG1lbnRzO1xuICAgICAgdGhpcy5xdW90ZWRNZXNzYWdlQXR0YWNobWVudHMgPVxuICAgICAgICBvcmlnaW5hbEF0dGFjaG1lbnRzICYmIG9yaWdpbmFsQXR0YWNobWVudHMubGVuZ3RoXG4gICAgICAgICAgPyBbb3JpZ2luYWxBdHRhY2htZW50c1swXV1cbiAgICAgICAgICA6IFtdO1xuICAgICAgdGhpcy5zZXRJc1NlbnRCeUN1cnJlbnRVc2VyKCk7XG4gICAgICB0aGlzLnNldExhc3RSZWFkVXNlcigpO1xuICAgICAgdGhpcy5yZWFkQnlUZXh0ID0gdGhpcy5tZXNzYWdlPy5yZWFkQnlcbiAgICAgICAgPyBsaXN0VXNlcnModGhpcy5tZXNzYWdlLnJlYWRCeSlcbiAgICAgICAgOiAnJztcbiAgICAgIHRoaXMuaXNPbmx5UmVhZEJ5TWUgPSAhIShcbiAgICAgICAgdGhpcy5tZXNzYWdlICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeS5sZW5ndGggPT09IDBcbiAgICAgICk7XG4gICAgICB0aGlzLmlzUmVhZEJ5TXVsdGlwbGVVc2VycyA9ICEhKFxuICAgICAgICB0aGlzLm1lc3NhZ2UgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeSAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA+IDFcbiAgICAgICk7XG4gICAgICB0aGlzLmlzTWVzc2FnZURlbGl2ZXJlZEFuZFJlYWQgPSAhIShcbiAgICAgICAgdGhpcy5tZXNzYWdlICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnN0YXR1cyA9PT0gJ3JlY2VpdmVkJyAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICB0aGlzLnBhcnNlZERhdGUgPVxuICAgICAgICAodGhpcy5tZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZWRfYXQgJiZcbiAgICAgICAgICB0aGlzLmRhdGVQYXJzZXIucGFyc2VEYXRlVGltZSh0aGlzLm1lc3NhZ2UuY3JlYXRlZF9hdCkpIHx8XG4gICAgICAgICcnO1xuICAgICAgdGhpcy5wYXNlZEVkaXRlZERhdGUgPVxuICAgICAgICAodGhpcy5tZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5tZXNzYWdlLm1lc3NhZ2VfdGV4dF91cGRhdGVkX2F0ICYmXG4gICAgICAgICAgdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZVRpbWUoXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLm1lc3NhZ2UubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXQpXG4gICAgICAgICAgKSkgfHxcbiAgICAgICAgJyc7XG4gICAgICB0aGlzLmhhc0F0dGFjaG1lbnQgPVxuICAgICAgICAhIXRoaXMubWVzc2FnZT8uYXR0YWNobWVudHMgJiYgISF0aGlzLm1lc3NhZ2UuYXR0YWNobWVudHMubGVuZ3RoO1xuICAgICAgdGhpcy5oYXNSZWFjdGlvbnMgPVxuICAgICAgICAhIXRoaXMubWVzc2FnZT8ucmVhY3Rpb25fY291bnRzICYmXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMubWVzc2FnZS5yZWFjdGlvbl9jb3VudHMpLmxlbmd0aCA+IDA7XG4gICAgICB0aGlzLnJlcGx5Q291bnRQYXJhbSA9IHsgcmVwbHlDb3VudDogdGhpcy5tZXNzYWdlPy5yZXBseV9jb3VudCB9O1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMpIHtcbiAgICAgIHRoaXMuY2FuUmVhY3RUb01lc3NhZ2UgPVxuICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdzZW5kLXJlYWN0aW9uJykgIT09IC0xO1xuICAgICAgdGhpcy5jYW5SZWNlaXZlUmVhZEV2ZW50cyA9XG4gICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICAgICAgdGhpcy5jYW5EaXNwbGF5UmVhZFN0YXR1cyA9XG4gICAgICAgIHRoaXMuY2FuUmVjZWl2ZVJlYWRFdmVudHMgIT09IGZhbHNlICYmXG4gICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlIHx8IGNoYW5nZXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zIHx8IGNoYW5nZXMubW9kZSkge1xuICAgICAgdGhpcy5zaG91bGREaXNwbGF5VGhyZWFkTGluayA9XG4gICAgICAgICEhdGhpcy5tZXNzYWdlPy5yZXBseV9jb3VudCAmJiB0aGlzLm1vZGUgIT09ICd0aHJlYWQnO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlIHx8IGNoYW5nZXMubW9kZSB8fCBjaGFuZ2VzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucykge1xuICAgICAgdGhpcy5hcmVPcHRpb25zVmlzaWJsZSA9IHRoaXMubWVzc2FnZVxuICAgICAgICA/ICEoXG4gICAgICAgICAgICAhdGhpcy5tZXNzYWdlLnR5cGUgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS50eXBlID09PSAnZXJyb3InIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UudHlwZSA9PT0gJ3N5c3RlbScgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS50eXBlID09PSAnZGVsZXRlZCcgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS50eXBlID09PSAnZXBoZW1lcmFsJyB8fFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS5zdGF0dXMgPT09ICdzZW5kaW5nJyB8fFxuICAgICAgICAgICAgKHRoaXMubW9kZSA9PT0gJ3RocmVhZCcgJiYgIXRoaXMubWVzc2FnZS5wYXJlbnRfaWQpIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UuZGVsZXRlZF9hdCB8fFxuICAgICAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMubGVuZ3RoID09PSAwXG4gICAgICAgICAgKVxuICAgICAgICA6IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlIHx8IGNoYW5nZXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zKSB7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPVxuICAgICAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmdldEF1dGhvcml6ZWRNZXNzYWdlQWN0aW9uc0NvdW50KFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgbW91c2VQdXNoZWREb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGFzVG91Y2hTdXBwb3J0IHx8XG4gICAgICBldmVudC5idXR0b24gIT09IDAgfHxcbiAgICAgICF0aGlzLmFyZU9wdGlvbnNWaXNpYmxlXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhcnRNZXNzYWdlTWVudVNob3dUaW1lcih7IGZyb21Ub3VjaDogZmFsc2UgfSk7XG4gIH1cblxuICBtb3VzZVJlbGVhc2VkKCkge1xuICAgIHRoaXMuc3RvcE1lc3NhZ2VNZW51U2hvd1RpbWVyKCk7XG4gIH1cblxuICB0b3VjaFN0YXJ0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmFyZU9wdGlvbnNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhcnRNZXNzYWdlTWVudVNob3dUaW1lcih7IGZyb21Ub3VjaDogdHJ1ZSB9KTtcbiAgfVxuXG4gIHRvdWNoRW5kZWQoKSB7XG4gICAgdGhpcy5zdG9wTWVzc2FnZU1lbnVTaG93VGltZXIoKTtcbiAgfVxuXG4gIG1lc3NhZ2VCdWJibGVDbGlja2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5oYXNUb3VjaFN1cHBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvdWxkUHJldmVudE1lc3NhZ2VNZW51Q2xvc2UpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5zaG91bGRQcmV2ZW50TWVzc2FnZU1lbnVDbG9zZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hcmVNZXNzYWdlT3B0aW9uc09wZW4pIHtcbiAgICAgIHRoaXMubWVzc2FnZU1lbnVUcmlnZ2VyPy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgbWVzc2FnZU9wdGlvbnNCdXR0b25DbGlja2VkKCkge1xuICAgIGlmICghdGhpcy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25DbGlja0hhbmRsZXIpIHtcbiAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbkNsaWNrSGFuZGxlcih7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgZW5hYmxlZEFjdGlvbnM6IHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgICBjdXN0b21BY3Rpb25zOiB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25zJC5nZXRWYWx1ZSgpLFxuICAgICAgICBpc01pbmU6IHRoaXMuaXNTZW50QnlDdXJyZW50VXNlcixcbiAgICAgICAgbWVzc2FnZVRleHRIdG1sRWxlbWVudDogdGhpcy5tZXNzYWdlVGV4dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcmVNZXNzYWdlT3B0aW9uc09wZW4gPSAhdGhpcy5hcmVNZXNzYWdlT3B0aW9uc09wZW47XG4gICAgfVxuICB9XG5cbiAgbWVzc2FnZUFjdGlvbnNCb3hDbGlja2VkKGZsb2F0aW5nQ29udGVudDogTmd4RmxvYXRVaUNvbnRlbnRDb21wb25lbnQpIHtcbiAgICBmbG9hdGluZ0NvbnRlbnQuaGlkZSgpO1xuICB9XG5cbiAgZ2V0QXR0YWNobWVudExpc3RDb250ZXh0KCk6IEF0dGFjaG1lbnRMaXN0Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5pZCB8fCAnJyxcbiAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLm1lc3NhZ2U/LmF0dGFjaG1lbnRzIHx8IFtdLFxuICAgICAgcGFyZW50TWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LnBhcmVudF9pZCxcbiAgICAgIGltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXI6IChzdGF0ZSkgPT5cbiAgICAgICAgKHRoaXMuaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZSA9IHN0YXRlKSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TWVzc2FnZUNvbnRleHQoKTogU3lzdGVtTWVzc2FnZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgaXNIaWdobGlnaHRlZDogdGhpcy5pc0hpZ2hsaWdodGVkLFxuICAgICAgaXNMYXN0U2VudE1lc3NhZ2U6IHRoaXMuaXNMYXN0U2VudE1lc3NhZ2UsXG4gICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICBjdXN0b21BY3Rpb25zOiB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25zJC5nZXRWYWx1ZSgpLFxuICAgICAgcGFyc2VkRGF0ZTogdGhpcy5wYXJzZWREYXRlLFxuICAgIH07XG4gIH1cblxuICBnZXRRdW90ZWRNZXNzYWdlQXR0YWNobWVudExpc3RDb250ZXh0KCk6IEF0dGFjaG1lbnRMaXN0Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uaWQgfHwgJycsXG4gICAgICBhdHRhY2htZW50czogdGhpcy5xdW90ZWRNZXNzYWdlQXR0YWNobWVudHMhLFxuICAgICAgcGFyZW50TWVzc2FnZUlkOiB0aGlzPy5tZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8ucGFyZW50X2lkLFxuICAgIH07XG4gIH1cblxuICBnZXRNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCgpOiBNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VSZWFjdGlvbkNvdW50czogdGhpcy5tZXNzYWdlPy5yZWFjdGlvbl9jb3VudHMgfHwge30sXG4gICAgICBsYXRlc3RSZWFjdGlvbnM6IHRoaXMubWVzc2FnZT8ubGF0ZXN0X3JlYWN0aW9ucyB8fCBbXSxcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5pZCxcbiAgICAgIG93blJlYWN0aW9uczogdGhpcy5tZXNzYWdlPy5vd25fcmVhY3Rpb25zIHx8IFtdLFxuICAgIH07XG4gIH1cblxuICBtZXNzYWdlQ2xpY2tlZCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1lc3NhZ2U/LnN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiZcbiAgICAgIHRoaXMubWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlICE9PSA0MDNcbiAgICApIHtcbiAgICAgIHRoaXMucmVzZW5kTWVzc2FnZSgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLm1lc3NhZ2U/LnR5cGUgPT09ICdlcnJvcicgJiZcbiAgICAgIHRoaXMubWVzc2FnZT8ubW9kZXJhdGlvbl9kZXRhaWxzXG4gICAgKSB7XG4gICAgICB0aGlzLm9wZW5NZXNzYWdlQm91bmNlUHJvbXB0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNFZGl0ZWRGbGFnT3BlbmVkID0gIXRoaXMuaXNFZGl0ZWRGbGFnT3BlbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlc2VuZE1lc3NhZ2UoKSB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnJlc2VuZE1lc3NhZ2UodGhpcy5tZXNzYWdlISk7XG4gIH1cblxuICBzZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UoKSB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSh0aGlzLm1lc3NhZ2UpO1xuICB9XG5cbiAgZ2V0TWVudGlvbkNvbnRleHQobWVzc2FnZVBhcnQ6IE1lc3NhZ2VQYXJ0KTogTWVudGlvblRlbXBsYXRlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IG1lc3NhZ2VQYXJ0LmNvbnRlbnQsXG4gICAgICB1c2VyOiBtZXNzYWdlUGFydC51c2VyISxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0KCk6IE1lc3NhZ2VBY3Rpb25zQm94Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTWluZTogdGhpcy5pc1NlbnRCeUN1cnJlbnRVc2VyLFxuICAgICAgZW5hYmxlZEFjdGlvbnM6IHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgbWVzc2FnZVRleHRIdG1sRWxlbWVudDogdGhpcy5tZXNzYWdlVGV4dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgfTtcbiAgfVxuXG4gIGdldERlbGl2ZXJlZFN0YXR1c0NvbnRleHQoKTogRGVsaXZlcmVkU3RhdHVzQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSEsXG4gICAgfTtcbiAgfVxuXG4gIGdldFNlbmRpbmdTdGF0dXNDb250ZXh0KCk6IFNlbmRpbmdTdGF0dXNDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICB9O1xuICB9XG5cbiAgZ2V0UmVhZFN0YXR1c0NvbnRleHQoKTogUmVhZFN0YXR1c0NvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UhLFxuICAgICAgcmVhZEJ5VGV4dDogdGhpcy5yZWFkQnlUZXh0LFxuICAgIH07XG4gIH1cblxuICBnZXRNZXNzYWdlTWV0YWRhdGFDb250ZXh0KCk6IEN1c3RvbU1ldGFkYXRhQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSEsXG4gICAgfTtcbiAgfVxuXG4gIGp1bXBUb01lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcsIHBhcmVudE1lc3NhZ2VJZD86IHN0cmluZykge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlKG1lc3NhZ2VJZCwgcGFyZW50TWVzc2FnZUlkKTtcbiAgfVxuXG4gIGRpc3BsYXlUcmFuc2xhdGVkTWVzc2FnZSgpIHtcbiAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VQYXJ0cyh0cnVlKTtcbiAgfVxuXG4gIGRpc3BsYXlPcmlnaW5hbE1lc3NhZ2UoKSB7XG4gICAgdGhpcy5jcmVhdGVNZXNzYWdlUGFydHMoZmFsc2UpO1xuICB9XG5cbiAgb3Blbk1lc3NhZ2VCb3VuY2VQcm9tcHQoKSB7XG4gICAgdGhpcy5jaGFubmVsU2VydmljZS5ib3VuY2VkTWVzc2FnZSQubmV4dCh0aGlzLm1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNZXNzYWdlUGFydHMoc2hvdWxkVHJhbnNsYXRlID0gdHJ1ZSkge1xuICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1lc3NhZ2VUZXh0ID0gdW5kZWZpbmVkO1xuICAgIGxldCBjb250ZW50ID0gdGhpcy5nZXRNZXNzYWdlQ29udGVudChzaG91bGRUcmFuc2xhdGUpO1xuICAgIGlmIChcbiAgICAgICghdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMgfHxcbiAgICAgICAgdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMubGVuZ3RoID09PSAwKSAmJlxuICAgICAgIWNvbnRlbnQ/Lm1hdGNoKHRoaXMuZW1vamlSZWdleHApICYmXG4gICAgICAhY29udGVudD8ubWF0Y2godGhpcy51cmxSZWdleHApXG4gICAgKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm1lc3NhZ2VUZXh0ID0gY29udGVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgICF0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2VycyB8fFxuICAgICAgdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBjb250ZW50ID0gdGhpcy5maXhFbW9qaURpc3BsYXkoY29udGVudCk7XG4gICAgICBjb250ZW50ID0gdGhpcy53cmFwTGlua3NXaXRoQW5jaG9yVGFnKGNvbnRlbnQpO1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gW3sgY29udGVudCwgdHlwZTogJ3RleHQnIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMgPSBbXTtcbiAgICAgIGxldCB0ZXh0ID0gY29udGVudDtcbiAgICAgIHRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcbiAgICAgICAgY29uc3QgbWVudGlvbiA9IGBAJHt1c2VyLm5hbWUgfHwgdXNlci5pZH1gO1xuICAgICAgICBjb25zdCBwcmVjZWRpbmdUZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5pbmRleE9mKG1lbnRpb24pKTtcbiAgICAgICAgbGV0IGZvcm1hdHRlZFByZWNlZGluZ1RleHQgPSB0aGlzLmZpeEVtb2ppRGlzcGxheShwcmVjZWRpbmdUZXh0KTtcbiAgICAgICAgZm9ybWF0dGVkUHJlY2VkaW5nVGV4dCA9IHRoaXMud3JhcExpbmtzV2l0aEFuY2hvclRhZyhcbiAgICAgICAgICBmb3JtYXR0ZWRQcmVjZWRpbmdUZXh0XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyEucHVzaCh7XG4gICAgICAgICAgY29udGVudDogZm9ybWF0dGVkUHJlY2VkaW5nVGV4dCxcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMhLnB1c2goe1xuICAgICAgICAgIGNvbnRlbnQ6IG1lbnRpb24sXG4gICAgICAgICAgdHlwZTogJ21lbnRpb24nLFxuICAgICAgICAgIHVzZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHByZWNlZGluZ1RleHQgKyBtZW50aW9uLCAnJyk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHRleHQgPSB0aGlzLmZpeEVtb2ppRGlzcGxheSh0ZXh0KTtcbiAgICAgICAgdGV4dCA9IHRoaXMud3JhcExpbmtzV2l0aEFuY2hvclRhZyh0ZXh0KTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzLnB1c2goeyBjb250ZW50OiB0ZXh0LCB0eXBlOiAndGV4dCcgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZXNzYWdlQ29udGVudChzaG91bGRUcmFuc2xhdGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSB0aGlzLm1lc3NhZ2U/LnRleHQ7XG4gICAgaWYgKHNob3VsZFRyYW5zbGF0ZSkge1xuICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0aGlzLm1lc3NhZ2U/LnRyYW5zbGF0aW9uO1xuICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgIHRoaXMuc2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPSAndHJhbnNsYXRpb24nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uIHx8IG9yaWdpbmFsQ29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPSAnb3JpZ2luYWwnO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsQ29udGVudDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpeEVtb2ppRGlzcGxheShjb250ZW50OiBzdHJpbmcpIHtcbiAgICAvLyBXcmFwIGVtb2ppcyBpbiBzcGFuIHRvIGRpc3BsYXkgZW1vamlzIGNvcnJlY3RseSBpbiBDaHJvbWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTk2MjIzXG4gICAgLy8gQmFzZWQgb24gdGhpczogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDU2NTExMi9qYXZhc2NyaXB0LWhvdy10by1maW5kLW91dC1pZi10aGUtdXNlci1icm93c2VyLWlzLWNocm9tZVxuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICAgIGNvbnN0IGlzQ2hyb21lID1cbiAgICAgICEhKHdpbmRvdyBhcyBhbnkpLmNocm9tZSAmJiB0eXBlb2YgKHdpbmRvdyBhcyBhbnkpLm9wciA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgdGhpcy5lbW9qaVJlZ2V4cCxcbiAgICAgIChtYXRjaCkgPT5cbiAgICAgICAgYDxzcGFuICR7XG4gICAgICAgICAgaXNDaHJvbWUgPyAnY2xhc3M9XCJzdHItY2hhdF9fZW1vamktZGlzcGxheS1maXhcIicgOiAnJ1xuICAgICAgICB9PiR7bWF0Y2h9PC9zcGFuPmBcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIHdyYXBMaW5rc1dpdGhBbmNob3JUYWcoY29udGVudDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZGlzcGxheUFzID09PSAnaHRtbCcpIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKHRoaXMudXJsUmVnZXhwLCAobWF0Y2gpID0+XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmN1c3RvbUxpbmtSZW5kZXJlclxuICAgICAgICA/IHRoaXMubWVzc2FnZVNlcnZpY2UuY3VzdG9tTGlua1JlbmRlcmVyKG1hdGNoKVxuICAgICAgICA6IGA8YSBocmVmPVwiJHttYXRjaH1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub2ZvbGxvd1wiPiR7bWF0Y2h9PC9hPmBcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIHNldElzU2VudEJ5Q3VycmVudFVzZXIoKSB7XG4gICAgdGhpcy5pc1NlbnRCeUN1cnJlbnRVc2VyID0gdGhpcy5tZXNzYWdlPy51c2VyPy5pZCA9PT0gdGhpcy51c2VySWQ7XG4gIH1cblxuICBwcml2YXRlIHNldExhc3RSZWFkVXNlcigpIHtcbiAgICB0aGlzLmxhc3RSZWFkVXNlciA9IHRoaXMubWVzc2FnZT8ucmVhZEJ5Py5maWx0ZXIoXG4gICAgICAodSkgPT4gdS5pZCAhPT0gdGhpcy51c2VySWRcbiAgICApWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydE1lc3NhZ2VNZW51U2hvd1RpbWVyKG9wdGlvbnM6IHsgZnJvbVRvdWNoOiBib29sZWFuIH0pIHtcbiAgICB0aGlzLnN0b3BNZXNzYWdlTWVudVNob3dUaW1lcigpO1xuICAgIHRoaXMuc2hvd01lc3NhZ2VNZW51VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbkNsaWNrSGFuZGxlcikge1xuICAgICAgICB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25DbGlja0hhbmRsZXIoe1xuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICBlbmFibGVkQWN0aW9uczogdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICAgICAgY3VzdG9tQWN0aW9uczogdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9ucyQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICBpc01pbmU6IHRoaXMuaXNTZW50QnlDdXJyZW50VXNlcixcbiAgICAgICAgICBtZXNzYWdlVGV4dEh0bWxFbGVtZW50OiB0aGlzLm1lc3NhZ2VUZXh0RWxlbWVudD8ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvdWxkUHJldmVudE1lc3NhZ2VNZW51Q2xvc2UgPSAhb3B0aW9ucy5mcm9tVG91Y2g7XG4gICAgICAgIHRoaXMubWVzc2FnZU1lbnVUcmlnZ2VyPy5zaG93KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNob3dNZXNzYWdlTWVudVRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfSwgNDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcE1lc3NhZ2VNZW51U2hvd1RpbWVyKCkge1xuICAgIGlmICh0aGlzLnNob3dNZXNzYWdlTWVudVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dNZXNzYWdlTWVudVRpbWVvdXQpO1xuICAgICAgdGhpcy5zaG93TWVzc2FnZU1lbnVUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICAjY29udGFpbmVyXG4gIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1jb250YWluZXJcIlxuICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZSBzdHItY2hhdF9fbWVzc2FnZSBzdHItY2hhdF9fbWVzc2FnZS0te3tcbiAgICBtZXNzYWdlPy50eXBlXG4gIH19IHN0ci1jaGF0X19tZXNzYWdlLS17eyBtZXNzYWdlPy5zdGF0dXMgfX0ge3tcbiAgICBtZXNzYWdlPy50ZXh0ID8gJ3N0ci1jaGF0X19tZXNzYWdlLS1oYXMtdGV4dCcgOiAnaGFzLW5vLXRleHQnXG4gIH19IHN0ci1jaGF0X19tZXNzYWdlLW1lbnUte3sgYXJlTWVzc2FnZU9wdGlvbnNPcGVuID8gJ29wZW5lZCcgOiAnY2xvc2VkJyB9fVwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0tbWVdPVwiaXNTZW50QnlDdXJyZW50VXNlclwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0tb3RoZXJdPVwiIWlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLS1tZV09XCJpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1oYXMtYXR0YWNobWVudF09XCJoYXNBdHRhY2htZW50XCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS13aXRoLXJlYWN0aW9uc109XCJoYXNSZWFjdGlvbnNcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLWhpZ2hsaWdodGVkXT1cImlzSGlnaGxpZ2h0ZWRcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utd2l0aC10aHJlYWQtbGlua109XCJzaG91bGREaXNwbGF5VGhyZWFkTGlua1wiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1zZW5kLWNhbi1iZS1yZXRyaWVkXT1cIlxuICAgIChtZXNzYWdlPy5zdGF0dXMgPT09ICdmYWlsZWQnICYmIG1lc3NhZ2U/LmVycm9yU3RhdHVzQ29kZSAhPT0gNDAzKSB8fFxuICAgIChtZXNzYWdlPy50eXBlID09PSAnZXJyb3InICYmIG1lc3NhZ2U/Lm1vZGVyYXRpb25fZGV0YWlscylcbiAgXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXdpdGgtdG91Y2gtc3VwcG9ydF09XCJoYXNUb3VjaFN1cHBvcnRcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utd2l0aG91dC10b3VjaC1zdXBwb3J0XT1cIiFoYXNUb3VjaFN1cHBvcnRcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1lc3NhZ2U/LmRlbGV0ZWRfYXQ7IGVsc2UgZGVsZXRlZE1lc3NhZ2VcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZT8udHlwZSAhPT0gJ3N5c3RlbSc7IGVsc2Ugc3lzdGVtTWVzc2FnZVwiPlxuICAgICAgPHN0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJhdmF0YXJcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0LWFuZ3VsYXJfX2F2YXRhci1ob3N0IHN0ci1jaGF0X19tZXNzYWdlLXNlbmRlci1hdmF0YXJcIlxuICAgICAgICB0eXBlPVwidXNlclwiXG4gICAgICAgIGxvY2F0aW9uPVwibWVzc2FnZS1zZW5kZXJcIlxuICAgICAgICBbaW1hZ2VVcmxdPVwibWVzc2FnZT8udXNlcj8uaW1hZ2VcIlxuICAgICAgICBbbmFtZV09XCJtZXNzYWdlPy51c2VyPy5uYW1lIHx8IG1lc3NhZ2U/LnVzZXI/LmlkXCJcbiAgICAgICAgW3VzZXJdPVwibWVzc2FnZT8udXNlciB8fCB1bmRlZmluZWRcIlxuICAgICAgPjwvc3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1pbm5lclwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCIhaGFzVG91Y2hTdXBwb3J0ICYmIGFyZU9wdGlvbnNWaXNpYmxlXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9ucyBzdHItY2hhdF9fbWVzc2FnZS1vcHRpb25zXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1lc3NhZ2Utb3B0aW9uc1wiXG4gICAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbnMtb3Blbl09XCJhcmVNZXNzYWdlT3B0aW9uc09wZW5cIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI21lc3NhZ2VBY3Rpb25zVG9nZ2xlXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1lc3NhZ2UtYWN0aW9ucy1jb250YWluZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1jb250YWluZXJcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb25cbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb24tLW9wdGlvbnNcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbZmxvYXRVaUxvb3NlXT1cIm1lc3NhZ2VNZW51RmxvYXRcIlxuICAgICAgICAgICAgbG9vc2VUcmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICAgICAgW2hpZGVPblNjcm9sbF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZU9uQ2xpY2tPdXRzaWRlXT1cInRydWVcIlxuICAgICAgICAgICAgW2hpZGVPbk1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2Rpc2FibGVBbmltYXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3ByZXZlbnRPdmVyZmxvd109XCJ0cnVlXCJcbiAgICAgICAgICAgIFtwb3NpdGlvbkZpeGVkXT1cInRydWVcIlxuICAgICAgICAgICAgKG9uU0hvd24pPVwiYXJlTWVzc2FnZU9wdGlvbnNPcGVuID0gdHJ1ZVwiXG4gICAgICAgICAgICAob25IaWRkZW4pPVwiYXJlTWVzc2FnZU9wdGlvbnNPcGVuID0gZmFsc2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJ2aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA+IDBcIlxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbnMtYm94LWJ1dHRvblwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1vcHRpb25zLWJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJtZXNzYWdlT3B0aW9uc0J1dHRvbkNsaWNrZWQoKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJtZXNzYWdlT3B0aW9uc0J1dHRvbkNsaWNrZWQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIGljb249XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1ob3N0XCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjZGVmYXVsdE1lc3NhZ2VSZWFjdGlvbnNcbiAgICAgICAgICAgIGxldC1tZXNzYWdlUmVhY3Rpb25Db3VudHM9XCJtZXNzYWdlUmVhY3Rpb25Db3VudHNcIlxuICAgICAgICAgICAgbGV0LWxhdGVzdFJlYWN0aW9ucz1cImxhdGVzdFJlYWN0aW9uc1wiXG4gICAgICAgICAgICBsZXQtbWVzc2FnZUlkPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICAgIGxldC1vd25SZWFjdGlvbnM9XCJvd25SZWFjdGlvbnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0tbWVzc2FnZS1yZWFjdGlvbnNcbiAgICAgICAgICAgICAgW21lc3NhZ2VSZWFjdGlvbkNvdW50c109XCJtZXNzYWdlUmVhY3Rpb25Db3VudHNcIlxuICAgICAgICAgICAgICBbbGF0ZXN0UmVhY3Rpb25zXT1cImxhdGVzdFJlYWN0aW9uc1wiXG4gICAgICAgICAgICAgIFttZXNzYWdlSWRdPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICAgICAgW293blJlYWN0aW9uc109XCJvd25SZWFjdGlvbnNcIlxuICAgICAgICAgICAgPjwvc3RyZWFtLW1lc3NhZ2UtcmVhY3Rpb25zPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubWVzc2FnZVJlYWN0aW9uc1RlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlUmVhY3Rpb25zO1xuICAgICAgICAgICAgICBjb250ZXh0OiBnZXRNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCgpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxmbG9hdC11aS1jb250ZW50ICNtZXNzYWdlTWVudUZsb2F0PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2RlZmF1bHRNZXNzYWdlQWN0aW9uc0JveFxuICAgICAgICAgICAgbGV0LWlzTWluZT1cImlzTWluZVwiXG4gICAgICAgICAgICBsZXQtbWVzc2FnZUlucHV0PVwibWVzc2FnZVwiXG4gICAgICAgICAgICBsZXQtZW5hYmxlZEFjdGlvbnM9XCJlbmFibGVkQWN0aW9uc1wiXG4gICAgICAgICAgICBsZXQtbWVzc2FnZVRleHRIdG1sRWxlbWVudD1cIm1lc3NhZ2VUZXh0SHRtbEVsZW1lbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0tbWVzc2FnZS1hY3Rpb25zLWJveFxuICAgICAgICAgICAgICBbaXNNaW5lXT1cImlzTWluZVwiXG4gICAgICAgICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VJbnB1dFwiXG4gICAgICAgICAgICAgIFtlbmFibGVkQWN0aW9uc109XCJlbmFibGVkQWN0aW9uc1wiXG4gICAgICAgICAgICAgIFttZXNzYWdlVGV4dEh0bWxFbGVtZW50XT1cIm1lc3NhZ2VUZXh0SHRtbEVsZW1lbnRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZUFjdGlvbnNCb3hDbGlja2VkKG1lc3NhZ2VNZW51RmxvYXQpXCJcbiAgICAgICAgICAgID48L3N0cmVhbS1tZXNzYWdlLWFjdGlvbnMtYm94PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlQWN0aW9uc0JveFRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2VBY3Rpb25zQm94O1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lc3NhZ2VBY3Rpb25zQm94Q29udGV4dCgpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mbG9hdC11aS1jb250ZW50PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1idWJibGUgc3RyLWNoYXQtYW5ndWxhcl9fbWVzc2FnZS1idWJibGVcIlxuICAgICAgICAgIFtjbGFzcy5zdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWJ1YmJsZS0tYXR0YWNobWVudC1tb2RhbC1vcGVuXT1cIlxuICAgICAgICAgICAgaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZSA9PT0gJ29wZW5lZCdcbiAgICAgICAgICBcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1idWJibGVcIlxuICAgICAgICAgIFtmbG9hdFVpTG9vc2VdPVwibWVzc2FnZU1lbnVGbG9hdFwiXG4gICAgICAgICAgI21lc3NhZ2VNZW51VHJpZ2dlcj1cImZsb2F0VWlMb29zZVwiXG4gICAgICAgICAgbG9vc2VUcmlnZ2VyPVwibm9uZVwiXG4gICAgICAgICAgW2hpZGVPblNjcm9sbF09XCJmYWxzZVwiXG4gICAgICAgICAgW2hpZGVPbkNsaWNrT3V0c2lkZV09XCJ0cnVlXCJcbiAgICAgICAgICBbaGlkZU9uTW91c2VMZWF2ZV09XCJmYWxzZVwiXG4gICAgICAgICAgW2Rpc2FibGVBbmltYXRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgW3ByZXZlbnRPdmVyZmxvd109XCJ0cnVlXCJcbiAgICAgICAgICAob25TaG93bik9XCJhcmVNZXNzYWdlT3B0aW9uc09wZW4gPSB0cnVlXCJcbiAgICAgICAgICAob25IaWRkZW4pPVwiYXJlTWVzc2FnZU9wdGlvbnNPcGVuID0gZmFsc2VcIlxuICAgICAgICAgIFtwb3NpdGlvbkZpeGVkXT1cInRydWVcIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwibW91c2VQdXNoZWREb3duKCRldmVudClcIlxuICAgICAgICAgIChtb3VzZXVwKT1cIm1vdXNlUmVsZWFzZWQoKVwiXG4gICAgICAgICAgKHRvdWNoc3RhcnQpPVwidG91Y2hTdGFydGVkKClcIlxuICAgICAgICAgICh0b3VjaGVuZCk9XCJ0b3VjaEVuZGVkKClcIlxuICAgICAgICAgIChjbGljayk9XCJtZXNzYWdlQnViYmxlQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwibWVzc2FnZUJ1YmJsZUNsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQXR0YWNobWVudCAmJiAhbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2VcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImF0dGFjaG1lbnRzVGVtcGxhdGVcIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2U/LnRleHQgfHwgKG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlICYmIGhhc0F0dGFjaG1lbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtdGV4dFwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXRleHQtLXBvaW50ZXItY3Vyc29yXT1cIlxuICAgICAgICAgICAgICAobWVzc2FnZT8uc3RhdHVzID09PSAnZmFpbGVkJyAmJlxuICAgICAgICAgICAgICAgIG1lc3NhZ2U/LmVycm9yU3RhdHVzQ29kZSAhPT0gNDAzKSB8fFxuICAgICAgICAgICAgICAodGhpcy5tZXNzYWdlPy50eXBlID09PSAnZXJyb3InICYmXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlPy5tb2RlcmF0aW9uX2RldGFpbHMpIHx8XG4gICAgICAgICAgICAgIG1lc3NhZ2U/Lm1lc3NhZ2VfdGV4dF91cGRhdGVkX2F0XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1lc3NhZ2VDbGlja2VkKClcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIm1lc3NhZ2VDbGlja2VkKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpbm5lci1tZXNzYWdlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS10ZXh0LWlubmVyIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS10ZXh0LWlubmVyXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1saWdodC10ZXh0LWlubmVyLS1oYXMtYXR0YWNobWVudF09XCJcbiAgICAgICAgICAgICAgICBoYXNBdHRhY2htZW50XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJxdW90ZWRNZXNzYWdlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNBdHRhY2htZW50ICYmIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhdHRhY2htZW50c1RlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJtZXNzYWdlPy50eXBlID09PSAnZXJyb3InXCJcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImNsaWVudC1lcnJvci1tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgICAgICAgc3RyLWNoYXRfX3NpbXBsZS1tZXNzYWdlLS1lcnJvci1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS0tZXJyb3ItbWVzc2FnZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1lc3NhZ2U/Lm1vZGVyYXRpb25fZGV0YWlsc1wiPnt7XG4gICAgICAgICAgICAgICAgICBcInN0cmVhbUNoYXQuRXJyb3IgwrcgVW5zZW50XCIgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZT8uc3RhdHVzID09PSAnZmFpbGVkJ1wiXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJlcnJvci1tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgICAgICAgc3RyLWNoYXRfX3NpbXBsZS1tZXNzYWdlLS1lcnJvci1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS0tZXJyb3ItbWVzc2FnZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgKG1lc3NhZ2U/LmVycm9yU3RhdHVzQ29kZSA9PT0gNDAzXG4gICAgICAgICAgICAgICAgICAgID8gXCJzdHJlYW1DaGF0Lk1lc3NhZ2UgRmFpbGVkIMK3IFVuYXV0aG9yaXplZFwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJzdHJlYW1DaGF0Lk1lc3NhZ2UgRmFpbGVkIMK3IENsaWNrIHRvIHRyeSBhZ2FpblwiXG4gICAgICAgICAgICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgI21lc3NhZ2VUZXh0RWxlbWVudCBkYXRhLXRlc3RpZD1cInRleHRcIj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlVGV4dFBhcnRzOyBlbHNlIGRlZmF1bHRDb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS91c2UtdHJhY2stYnktZnVuY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHBhcnQgb2YgbWVzc2FnZVRleHRQYXJ0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInBhcnQudHlwZSA9PT0gJ3RleHQnOyBlbHNlIG1lbnRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJwYXJ0LmNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtZW50aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TWVudGlvbiBsZXQtY29udGVudD1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1tZW50aW9uXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZW50aW9uVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVudGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBnZXRNZW50aW9uQ29udGV4dChwYXJ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheUFzID09PSAndGV4dCc7IGVsc2UgYXNIVE1MXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgbWVzc2FnZVRleHQgfHwgXCJcIiB9fVxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNhc0hUTUxcbiAgICAgICAgICAgICAgICAgICAgICA+PHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiaHRtbC1jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibWVzc2FnZVRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtZXJyb3ItaWNvblwiXG4gICAgICAgICAgICBpY29uPVwiZXJyb3JcIlxuICAgICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJlcGx5Q291bnRCdXR0b247IGNvbnRleHQ6IHsgbWVzc2FnZTogbWVzc2FnZSB9XCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1lc3NhZ2VEYXRlQW5kU2VuZGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZGVsZXRlZE1lc3NhZ2U+XG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWRlbGV0ZWQtY29tcG9uZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1kZWxldGVkLWlubmVyXCIgdHJhbnNsYXRlPlxuICAgICAgc3RyZWFtQ2hhdC5UaGlzIG1lc3NhZ2Ugd2FzIGRlbGV0ZWQuLi5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3N5c3RlbU1lc3NhZ2U+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2Uuc3lzdGVtTWVzc2FnZVRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICBkZWZhdWx0U3lzdGVtTWVzc2FnZTtcbiAgICAgIGNvbnRleHQ6IGdldE1lc3NhZ2VDb250ZXh0KClcbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG4gIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFN5c3RlbU1lc3NhZ2UgbGV0LW1lc3NhZ2VJbnB1dD1cIm1lc3NhZ2VcIj5cbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwic3lzdGVtLW1lc3NhZ2VcIiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1zeXN0ZW1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS0tc3lzdGVtX190ZXh0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS0tc3lzdGVtX19saW5lXCI+PC9kaXY+XG4gICAgICAgIDxwPnt7IG1lc3NhZ2VJbnB1dD8udGV4dCB9fTwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1zeXN0ZW1fX2xpbmVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1zeXN0ZW1fX2RhdGVcIj5cbiAgICAgICAge3sgcGFyc2VkRGF0ZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3F1b3RlZE1lc3NhZ2U+XG4gIDxkaXZcbiAgICAqbmdJZj1cIm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlXCJcbiAgICBjbGFzcz1cInF1b3RlZC1tZXNzYWdlIHN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1wcmV2aWV3XCJcbiAgICBkYXRhLXRlc3RpZD1cInF1b3RlZC1tZXNzYWdlLWNvbnRhaW5lclwiXG4gICAgW2NsYXNzLm1pbmVdPVwiaXNTZW50QnlDdXJyZW50VXNlclwiXG4gICAgKGNsaWNrKT1cIlxuICAgICAganVtcFRvTWVzc2FnZShcbiAgICAgICAgKG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlKSEuaWQsXG4gICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5wYXJlbnRfaWRcbiAgICAgIClcbiAgICBcIlxuICAgIChrZXl1cC5lbnRlcik9XCJcbiAgICAgIGp1bXBUb01lc3NhZ2UoXG4gICAgICAgIChtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZSkhLmlkLFxuICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8ucGFyZW50X2lkXG4gICAgICApXG4gICAgXCJcbiAgPlxuICAgIDxzdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyXG4gICAgICBkYXRhLXRlc3RpZD1cInFvdXRlZC1tZXNzYWdlLWF2YXRhclwiXG4gICAgICBjbGFzcz1cInN0ci1jaGF0LWFuZ3VsYXJfX2F2YXRhci1ob3N0IHN0ci1jaGF0X19tZXNzYWdlLXNlbmRlci1hdmF0YXJcIlxuICAgICAgdHlwZT1cInVzZXJcIlxuICAgICAgbG9jYXRpb249XCJxdW90ZWQtbWVzc2FnZS1zZW5kZXJcIlxuICAgICAgW2ltYWdlVXJsXT1cIm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy51c2VyPy5pbWFnZVwiXG4gICAgICBbbmFtZV09XCJcbiAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnVzZXI/Lm5hbWUgfHwgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnVzZXI/LmlkXG4gICAgICBcIlxuICAgICAgW3VzZXJdPVwibWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnVzZXIgfHwgdW5kZWZpbmVkXCJcbiAgICA+PC9zdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJxdW90ZWQtbWVzc2FnZS1pbm5lciBzdHItY2hhdF9fcXVvdGVkLW1lc3NhZ2UtYnViYmxlXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LmF0dGFjaG1lbnRzICYmXG4gICAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LmF0dGFjaG1lbnRzPy5sZW5ndGhcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgI2RlZmF1bHRBdHRhY2htZW50c1xuICAgICAgICAgIGxldC1tZXNzYWdlSWQ9XCJtZXNzYWdlSWRcIlxuICAgICAgICAgIGxldC1hdHRhY2htZW50cz1cImF0dGFjaG1lbnRzXCJcbiAgICAgICAgICBsZXQtcGFyZW50TWVzc2FnZUlkPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICAgICAgICBsZXQtaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcj1cImltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN0cmVhbS1hdHRhY2htZW50LWxpc3RcbiAgICAgICAgICAgIFttZXNzYWdlSWRdPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICAgIFthdHRhY2htZW50c109XCJhdHRhY2htZW50c1wiXG4gICAgICAgICAgICBbcGFyZW50TWVzc2FnZUlkXT1cInBhcmVudE1lc3NhZ2VJZFwiXG4gICAgICAgICAgICAoaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlKT1cImltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvc3RyZWFtLWF0dGFjaG1lbnQtbGlzdD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5hdHRhY2htZW50TGlzdFRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICBkZWZhdWx0QXR0YWNobWVudHM7XG4gICAgICAgICAgICBjb250ZXh0OiBnZXRRdW90ZWRNZXNzYWdlQXR0YWNobWVudExpc3RDb250ZXh0KClcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXZcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJxdW90ZWQtbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udHJhbnNsYXRpb24gfHxcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uaHRtbCB8fFxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy50ZXh0XG4gICAgICAgIFwiXG4gICAgICA+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtZXNzYWdlRGF0ZUFuZFNlbmRlcj5cbiAgPG5nLWNvbnRhaW5lcj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZVwiXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X190cmFuc2xhdGlvbi1ub3RpY2VcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJ0cmFuc2xhdGlvbi1ub3RpY2VcIlxuICAgID5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPT09ICd0cmFuc2xhdGlvbidcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlZS1vcmlnaW5hbFwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAoY2xpY2spPVwiZGlzcGxheU9yaWdpbmFsTWVzc2FnZSgpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cImRpc3BsYXlPcmlnaW5hbE1lc3NhZ2UoKVwiXG4gICAgICA+XG4gICAgICAgIHN0cmVhbUNoYXQuU2VlIG9yaWdpbmFsIChhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQpXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPT09ICdvcmlnaW5hbCdcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlZS10cmFuc2xhdGlvblwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAoY2xpY2spPVwiZGlzcGxheVRyYW5zbGF0ZWRNZXNzYWdlKClcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiZGlzcGxheVRyYW5zbGF0ZWRNZXNzYWdlKClcIlxuICAgICAgPlxuICAgICAgICBzdHJlYW1DaGF0LlNlZSB0cmFuc2xhdGlvblxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nSWY9XCJjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmN1c3RvbU1lc3NhZ2VNZXRhZGF0YVRlbXBsYXRlJCB8IGFzeW5jXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2N1c3RvbS1tZXNzYWdlLW1ldGFkYXRhXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuY3VzdG9tTWVzc2FnZU1ldGFkYXRhVGVtcGxhdGUkIHwgYXN5bmMpITtcbiAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lc3NhZ2VNZXRhZGF0YUNvbnRleHQoKVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLWRhdGFcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLWRhdGFcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtbWV0YWRhdGFcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1lc3NhZ2VTdGF0dXNcIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCIhaXNTZW50QnlDdXJyZW50VXNlclwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VuZGVyXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtbmFtZSBzdHItY2hhdF9fbWVzc2FnZS1zZW5kZXItbmFtZVwiXG4gICAgICA+XG4gICAgICAgIHt7IG1lc3NhZ2U/LnVzZXI/Lm5hbWUgPyBtZXNzYWdlPy51c2VyPy5uYW1lIDogbWVzc2FnZT8udXNlcj8uaWQgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiZGF0ZVwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXRpbWVzdGFtcCBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtdGltZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHBhcnNlZERhdGUgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy5tZXNzYWdlX3RleHRfdXBkYXRlZF9hdFwiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZWRpdGVkLWZsYWdcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc2FnZS1zaW1wbGUtZWRpdGVkXCJcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+c3RyZWFtQ2hhdC5FZGl0ZWQ8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJlZGl0ZWQtdGltZXN0YW1wXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWVkaXRlZC10aW1lc3RhbXBcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdzdHItY2hhdF9fbWVzc2FnZS1lZGl0ZWQtdGltZXN0YW1wLS1vcGVuJzogaXNFZGl0ZWRGbGFnT3BlbmVkLFxuICAgICAgICAgICAgJ3N0ci1jaGF0X19tZXNzYWdlLWVkaXRlZC10aW1lc3RhbXAtLWNvbGxhcHNlZCc6ICFpc0VkaXRlZEZsYWdPcGVuZWRcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5zdHJlYW1DaGF0LkVkaXRlZDwvc3Bhbj5cbiAgICAgICAgICA8dGltZVxuICAgICAgICAgICAgZGF0ZVRpbWU9XCJ7eyBtZXNzYWdlPy5tZXNzYWdlX3RleHRfdXBkYXRlZF9hdCB9fVwiXG4gICAgICAgICAgICB0aXRsZT1cInt7IG1lc3NhZ2U/Lm1lc3NhZ2VfdGV4dF91cGRhdGVkX2F0IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBwYXNlZEVkaXRlZERhdGUgfX1cbiAgICAgICAgICA8L3RpbWU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtZXNzYWdlU3RhdHVzPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJcbiAgICAgIGlzU2VudEJ5Q3VycmVudFVzZXIgJiZcbiAgICAgICgoaXNMYXN0U2VudE1lc3NhZ2UgJiYgbWVzc2FnZT8uc3RhdHVzID09PSAncmVjZWl2ZWQnKSB8fFxuICAgICAgICBtZXNzYWdlPy5zdGF0dXMgPT09ICdzZW5kaW5nJylcbiAgICBcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2U/LnN0YXR1cyA9PT0gJ3NlbmRpbmcnOyBlbHNlIHNlbnRTdGF0dXNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZW5kaW5nU3RhdHVzXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNzZW50U3RhdHVzPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIG1vZGUgPT09ICdtYWluJyAmJiBpc01lc3NhZ2VEZWxpdmVyZWRBbmRSZWFkICYmIGNhbkRpc3BsYXlSZWFkU3RhdHVzO1xuICAgICAgICAgIGVsc2UgZGVsaXZlcmVkU3RhdHVzXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZWFkU3RhdHVzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVsaXZlcmVkU3RhdHVzPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmRlbGl2ZXJlZFN0YXR1c1RlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgZGVmYXVsdERlbGl2ZXJlZFN0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXREZWxpdmVyZWRTdGF0dXNDb250ZXh0KClcbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdERlbGl2ZXJlZFN0YXR1cz5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0lmPVwibW9kZSA9PT0gJ21haW4nXCJcbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1cy1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc3RhdHVzXG4gICAgICAgIFwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiZGVsaXZlcmVkLWluZGljYXRvclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFtmbG9hdFVpTG9vc2VdPVwiZmxvYXRpbmdDb250ZW50XCJcbiAgICAgICAgbG9vc2VQbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICBsb29zZVRyaWdnZXI9XCJob3ZlclwiXG4gICAgICA+XG4gICAgICAgIDxmbG9hdC11aS1jb250ZW50ICNmbG9hdGluZ0NvbnRlbnQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIj5cbiAgICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5EZWxpdmVyZWRcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zsb2F0LXVpLWNvbnRlbnQ+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGVsaXZlcmVkLWljb25cIlxuICAgICAgICAgIGljb249XCJkZWxpdmVyZWRcIlxuICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjc2VuZGluZ1N0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5zZW5kaW5nU3RhdHVzVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICBkZWZhdWx0U2VuZGluZ1N0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXRTZW5kaW5nU3RhdHVzQ29udGV4dCgpXG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTZW5kaW5nU3RhdHVzPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1cy1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc3RhdHVzXG4gICAgICAgIFwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VuZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBbZmxvYXRVaUxvb3NlXT1cImZsb2F0aW5nQ29udGVudFwiXG4gICAgICAgIGxvb3NlUGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgbG9vc2VUcmlnZ2VyPVwiaG92ZXJcIlxuICAgICAgICBbZGlzYWJsZUFuaW1hdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIFtwcmV2ZW50T3ZlcmZsb3ddPVwidHJ1ZVwiXG4gICAgICAgIFtwb3NpdGlvbkZpeGVkXT1cInRydWVcIlxuICAgICAgPlxuICAgICAgICA8ZmxvYXQtdWktY29udGVudCAjZmxvYXRpbmdDb250ZW50PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fdG9vbHRpcCBzdHItY2hhdF9fdG9vbHRpcC1hbmd1bGFyXCI+XG4gICAgICAgICAgICB7eyBcInN0cmVhbUNoYXQuU2VuZGluZy4uLlwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmxvYXQtdWktY29udGVudD5cbiAgICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlclxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibG9hZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3ItcGxhY2Vob2xkZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI3JlYWRTdGF0dXM+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UucmVhZFN0YXR1c1RlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgZGVmYXVsdFJlYWRTdGF0dXM7XG4gICAgICAgICAgY29udGV4dDogZ2V0UmVhZFN0YXR1c0NvbnRleHQoKVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UmVhZFN0YXR1cyBsZXQtcmVhZEJ5VGV4dD1cInJlYWRCeVRleHRcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1c1xuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXMtYW5ndWxhclxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXN0YXR1c1xuICAgICAgICBcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInJlYWQtaW5kaWNhdG9yXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW2Zsb2F0VWlMb29zZV09XCJmbG9hdGluZ0NvbnRlbnRcIlxuICAgICAgICBsb29zZVBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgIGxvb3NlVHJpZ2dlcj1cImhvdmVyXCJcbiAgICAgICAgW2Rpc2FibGVBbmltYXRpb25dPVwiZmFsc2VcIlxuICAgICAgICBbcHJldmVudE92ZXJmbG93XT1cInRydWVcIlxuICAgICAgICBbcG9zaXRpb25GaXhlZF09XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgICAgPGZsb2F0LXVpLWNvbnRlbnQgI2Zsb2F0aW5nQ29udGVudD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJyZWFkLWJ5LXRvb2x0aXBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHJlYWRCeVRleHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mbG9hdC11aS1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cInJlYWRcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNyZXBseUNvdW50QnV0dG9uPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJcbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1yZXBseS1idXR0b25cbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXJlcGxpZXMtY291bnQtYnV0dG9uLXdyYXBwZXJcbiAgICBcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJzaG91bGREaXNwbGF5VGhyZWFkTGlua1wiXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlcGxpZXMtY291bnQtYnV0dG9uXCJcbiAgICAgIGRhdGEtdGVzdGlkPVwicmVwbHktY291bnQtYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJzZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UoKVwiXG4gICAgPlxuICAgICAge3ttZXNzYWdlPy5yZXBseV9jb3VudCA9PT0gMSA/ICgnc3RyZWFtQ2hhdC4xIHJlcGx5JyB8IHRyYW5zbGF0ZSkgOiAoJ3N0cmVhbUNoYXQue3sgcmVwbHlDb3VudCB9fVxuICAgICAgcmVwbGllcycgfCB0cmFuc2xhdGU6cmVwbHlDb3VudFBhcmFtKX19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhdHRhY2htZW50c1RlbXBsYXRlPlxuICA8bmctdGVtcGxhdGVcbiAgICAjZGVmYXVsdEF0dGFjaG1lbnRzXG4gICAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gICAgbGV0LWF0dGFjaG1lbnRzPVwiYXR0YWNobWVudHNcIlxuICAgIGxldC1wYXJlbnRNZXNzYWdlSWQ9XCJwYXJlbnRNZXNzYWdlSWRcIlxuICAgIGxldC1pbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlclwiXG4gID5cbiAgICA8c3RyZWFtLWF0dGFjaG1lbnQtbGlzdFxuICAgICAgW21lc3NhZ2VJZF09XCJtZXNzYWdlSWRcIlxuICAgICAgW2F0dGFjaG1lbnRzXT1cImF0dGFjaG1lbnRzXCJcbiAgICAgIFtwYXJlbnRNZXNzYWdlSWRdPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICAgIChpbWFnZU1vZGFsU3RhdGVDaGFuZ2UpPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcigkZXZlbnQpXCJcbiAgICA+PC9zdHJlYW0tYXR0YWNobWVudC1saXN0PlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmF0dGFjaG1lbnRMaXN0VGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgIGRlZmF1bHRBdHRhY2htZW50cztcbiAgICAgIGNvbnRleHQ6IGdldEF0dGFjaG1lbnRMaXN0Q29udGV4dCgpXG4gICAgXCJcbiAgPjwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
515
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS9tZXNzYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlL21lc3NhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBTUwsdUJBQXVCLEVBRXZCLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQWlCdkIsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBNEIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZTFDOztHQUVHO0FBT0gsTUFBTSxPQUFPLGdCQUFnQjtJQXVFM0IsWUFDVSxpQkFBb0MsRUFDcEMsY0FBOEIsRUFDL0Isc0JBQThDLEVBQzdDLEtBQXdCLEVBQ3hCLFVBQTZCLEVBQzdCLGNBQThCLEVBQzlCLHFCQUE0QyxFQUM1QyxNQUFjO1FBUGQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM3QyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBeEV4Qjs7V0FFRztRQUNNLDBCQUFxQixHQUFhLEVBQUUsQ0FBQztRQUs5Qzs7V0FFRztRQUNNLFNBQUksR0FBc0IsTUFBTSxDQUFDO1FBQzFDOztXQUVHO1FBQ00sa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFPL0IsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQzNCLHFCQUFnQixHQUE4QixFQUFFLENBQUM7UUFFakQsbUNBQThCLEdBQUcsS0FBSyxDQUFDO1FBQ3ZDLGdDQUEyQixHQUErQixVQUFVLENBQUM7UUFDckUsOEJBQXlCLEdBQXdCLFFBQVEsQ0FBQztRQUMxRCw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDaEMsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFaEIsaUJBQVksR0FBd0QsU0FBUyxDQUFDO1FBQzlFLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5Qiw4QkFBeUIsR0FBRyxLQUFLLENBQUM7UUFDbEMsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUNyQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsb0JBQWUsR0FBdUM7WUFDcEQsVUFBVSxFQUFFLFNBQVM7U0FDdEIsQ0FBQztRQUNGLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5Qix5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDN0Isb0JBQWUsR0FBRyxjQUFjLElBQUksTUFBTSxJQUFJLFNBQVMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBRW5FLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVaLGNBQVMsR0FDeEIsZ0tBQWdLLENBQUM7UUFDM0osZ0JBQVcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQVE1QyxrQ0FBNkIsR0FBRyxLQUFLLENBQUM7UUFDdEMsZ0NBQTJCLEdBQUcsQ0FBQyxDQUFDO1FBWXRDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7SUFDakQsQ0FBQztJQUVELElBQUksMEJBQTBCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLDBCQUEwQixDQUFDLEtBQWE7UUFDMUMsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEtBQUssQ0FBQyxFQUFFO1lBQ3BFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDNUI7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3ZELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsTUFBTSxzQkFBc0IsR0FDMUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGdDQUFnQyxDQUN6RCxJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxxQkFBcUIsQ0FDM0IsQ0FBQztnQkFDSixJQUFJLHNCQUFzQixLQUFLLElBQUksQ0FBQywwQkFBMEIsRUFBRTtvQkFDOUQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLHNCQUFzQixDQUFDO29CQUN6RCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7cUJBQzVCO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDbkIsSUFBSSxDQUFDLDhCQUE4QixHQUFHLEtBQUssQ0FBQztZQUM1QyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsVUFBVSxDQUFDO1lBQzlDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDO1lBQ3RFLElBQUksQ0FBQyx3QkFBd0I7Z0JBQzNCLG1CQUFtQixJQUFJLG1CQUFtQixDQUFDLE1BQU07b0JBQy9DLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNO2dCQUNwQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUNoQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FDdEIsSUFBSSxDQUFDLE9BQU87Z0JBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUNqQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUM3QixJQUFJLENBQUMsT0FBTztnQkFDWixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07Z0JBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQy9CLENBQUM7WUFDRixJQUFJLENBQUMseUJBQXlCLEdBQUcsQ0FBQyxDQUFDLENBQ2pDLElBQUksQ0FBQyxPQUFPO2dCQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtnQkFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVTtnQkFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDL0IsQ0FBQztZQUNGLElBQUksQ0FBQyxVQUFVO2dCQUNiLENBQUMsSUFBSSxDQUFDLE9BQU87b0JBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO29CQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUN6RCxFQUFFLENBQUM7WUFDTCxJQUFJLENBQUMsZUFBZTtnQkFDbEIsQ0FBQyxJQUFJLENBQUMsT0FBTztvQkFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QjtvQkFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQzNCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FDL0MsQ0FBQztvQkFDSixFQUFFLENBQUM7WUFDTCxJQUFJLENBQUMsYUFBYTtnQkFDaEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDbkUsSUFBSSxDQUFDLFlBQVk7Z0JBQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZUFBZTtvQkFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7WUFDakMsSUFBSSxDQUFDLGlCQUFpQjtnQkFDcEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsb0JBQW9CO2dCQUN2QixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxvQkFBb0I7Z0JBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxLQUFLO29CQUNuQyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ3BFLElBQUksQ0FBQyx1QkFBdUI7Z0JBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztTQUN6RDtRQUNELElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtZQUNwRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU87Z0JBQ25DLENBQUMsQ0FBQyxDQUFDLENBQ0MsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7b0JBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU87b0JBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVE7b0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVM7b0JBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVc7b0JBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVE7b0JBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVM7b0JBQ2pDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztvQkFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO29CQUN2QixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FDeEM7Z0JBQ0gsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNYO1FBQ0QsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtZQUNwRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQywwQkFBMEI7b0JBQzdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxnQ0FBZ0MsQ0FDekQsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMscUJBQXFCLENBQzNCLENBQUM7YUFDTDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO2FBQ3JDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRTtZQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDakMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7WUFDMUMsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxlQUFlLENBQUMsS0FBaUI7UUFDL0IsSUFDRSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3JCLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNsQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFDdkI7WUFDQSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFZO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3RDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsNkJBQTZCLEdBQUcsS0FBSyxDQUFDO1NBQzVDO2FBQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDckMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVELDJCQUEyQjtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsRUFBRTtZQUN2RCxJQUFJLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUM7Z0JBQ2xELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsY0FBYyxFQUFFLElBQUksQ0FBQyxxQkFBcUI7Z0JBQzFDLGFBQWEsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRTtnQkFDbkUsTUFBTSxFQUFFLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ2hDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxhQUFhO2FBQy9ELENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsZUFBMkM7UUFDbEUsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFO1lBQ2pDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsSUFBSSxFQUFFO1lBQzVDLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVM7WUFDeEMsNEJBQTRCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN0QyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7U0FDM0MsQ0FBQztJQUNKLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLHFCQUFxQixFQUFFLElBQUksQ0FBQyxxQkFBcUI7WUFDakQsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDekMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsYUFBYSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1lBQ25FLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFFRCxxQ0FBcUM7UUFDbkMsT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRTtZQUNqRCxXQUFXLEVBQUUsSUFBSSxDQUFDLHdCQUF5QjtZQUMzQyxlQUFlLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUztTQUMxRCxDQUFDO0lBQ0osQ0FBQztJQUVELDBCQUEwQjtRQUN4QixPQUFPO1lBQ0wscUJBQXFCLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLElBQUksRUFBRTtZQUMxRCxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxFQUFFO1lBQ3JELFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDM0IsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxJQUFJLEVBQUU7U0FDaEQsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFDRSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sS0FBSyxRQUFRO1lBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsZUFBZSxLQUFLLEdBQUcsRUFDckM7WUFDQSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7YUFBTSxJQUNMLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxLQUFLLE9BQU87WUFDOUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFDaEM7WUFDQSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUNoQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELGlCQUFpQixDQUFDLFdBQXdCO1FBQ3hDLE9BQU87WUFDTCxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87WUFDNUIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFLO1NBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUNoQyxjQUFjLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtZQUMxQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLGFBQWE7U0FDL0QsQ0FBQztJQUNKLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBUTtTQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVELHVCQUF1QjtRQUNyQixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFRO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQVE7WUFDdEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQVE7U0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsU0FBaUIsRUFBRSxlQUF3QjtRQUN2RCxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGVBQWUsR0FBRyxJQUFJO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDN0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RELElBQ0UsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFRLENBQUMsZUFBZTtZQUM3QixJQUFJLENBQUMsT0FBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQzdDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ2pDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQy9CO1lBQ0EsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztZQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztZQUMzQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsSUFDRSxDQUFDLElBQUksQ0FBQyxPQUFRLENBQUMsZUFBZTtZQUM5QixJQUFJLENBQUMsT0FBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUMxQztZQUNBLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7WUFDM0IsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDO1lBQ25CLElBQUksQ0FBQyxPQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELElBQUksc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDakUsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUNsRCxzQkFBc0IsQ0FDdkIsQ0FBQztnQkFDRixJQUFJLENBQUMsZ0JBQWlCLENBQUMsSUFBSSxDQUFDO29CQUMxQixPQUFPLEVBQUUsc0JBQXNCO29CQUMvQixJQUFJLEVBQUUsTUFBTTtpQkFDYixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGdCQUFpQixDQUFDLElBQUksQ0FBQztvQkFDMUIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLElBQUksRUFBRSxTQUFTO29CQUNmLElBQUk7aUJBQ0wsQ0FBQyxDQUFDO2dCQUNILElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDN0Q7U0FDRjtJQUNILENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxlQUF3QjtRQUNoRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztRQUMzQyxJQUFJLGVBQWUsRUFBRTtZQUNuQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztZQUM5QyxJQUFJLFdBQVcsRUFBRTtnQkFDZixJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsYUFBYSxDQUFDO2FBQ2xEO1lBQ0QsT0FBTyxXQUFXLElBQUksZUFBZSxDQUFDO1NBQ3ZDO2FBQU07WUFDTCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsVUFBVSxDQUFDO1lBQzlDLE9BQU8sZUFBZSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUFlO1FBQ3JDLHlIQUF5SDtRQUN6SCxzSEFBc0g7UUFDdEgsbUdBQW1HO1FBQ25HLE1BQU0sUUFBUSxHQUNaLENBQUMsQ0FBRSxNQUFjLENBQUMsTUFBTSxJQUFJLE9BQVEsTUFBYyxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUM7UUFDekUsa0dBQWtHO1FBQ2xHLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUN2QixJQUFJLENBQUMsV0FBVyxFQUNoQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQ1IsU0FDRSxRQUFRLENBQUMsQ0FBQyxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQyxFQUNyRCxJQUFJLEtBQUssU0FBUyxDQUNyQixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQWU7UUFDNUMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sRUFBRTtZQUM3QixPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQjtZQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7WUFDL0MsQ0FBQyxDQUFDLFlBQVksS0FBSyxvQ0FBb0MsS0FBSyxNQUFNLENBQ3JFLENBQUM7UUFFRixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNwRSxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FDOUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxPQUErQjtRQUMvRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUNILENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNqQixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ25CLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLHdCQUF3QixFQUFFO29CQUN2RCxJQUFJLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUM7d0JBQ2xELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTzt3QkFDckIsY0FBYyxFQUFFLElBQUksQ0FBQyxxQkFBcUI7d0JBQzFDLGFBQWEsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRTt3QkFDbkUsTUFBTSxFQUFFLElBQUksQ0FBQyxtQkFBbUI7d0JBQ2hDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxhQUFhO3FCQUMvRCxDQUFDLENBQUM7b0JBQ0gsT0FBTztpQkFDUjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO29CQUN4RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQ2pDO2dCQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDNUI7Z0JBQ0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFNBQVMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFTyxnQ0FBZ0M7UUFDdEMsSUFBSSxDQUFDLGFBQWMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUNwRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQ3BCLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQ2xFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FDbEIsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFjLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3BFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQ3hCLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQ2pFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FDckIsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFjLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2hFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsWUFBWSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7U0FDekM7SUFDSCxDQUFDOzs2R0Fua0JVLGdCQUFnQjtpR0FBaEIsZ0JBQWdCLGtyQkN6RDdCLHc0c0JBNG1CQTsyRkRuakJhLGdCQUFnQjtrQkFONUIsU0FBUzsrQkFDRSxnQkFBZ0IsbUJBR1QsdUJBQXVCLENBQUMsTUFBTTtnVUFRdEMsT0FBTztzQkFBZixLQUFLO2dCQUlHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFJRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBSUcsSUFBSTtzQkFBWixLQUFLO2dCQUlHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLO2dCQW9DTixrQkFBa0I7c0JBRGpCLFNBQVM7dUJBQUMsb0JBQW9CO2dCQUcvQixnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBRUksa0JBQWtCO3NCQUFsRCxTQUFTO3VCQUFDLG9CQUFvQjtnQkFDSCxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF0dGFjaG1lbnQsIFVzZXJSZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IENoYW5uZWxTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhbm5lbC5zZXJ2aWNlJztcbmltcG9ydCB7IENoYXRDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhdC1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQge1xuICBBdHRhY2htZW50TGlzdENvbnRleHQsXG4gIE1lbnRpb25UZW1wbGF0ZUNvbnRleHQsXG4gIE1lc3NhZ2VBY3Rpb25zQm94Q29udGV4dCxcbiAgTWVzc2FnZVJlYWN0aW9uc0NvbnRleHQsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIFN0cmVhbU1lc3NhZ2UsXG4gIERlbGl2ZXJlZFN0YXR1c0NvbnRleHQsXG4gIFNlbmRpbmdTdGF0dXNDb250ZXh0LFxuICBSZWFkU3RhdHVzQ29udGV4dCxcbiAgU3lzdGVtTWVzc2FnZUNvbnRleHQsXG4gIEN1c3RvbU1ldGFkYXRhQ29udGV4dCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGVtb2ppUmVnZXggZnJvbSAnZW1vamktcmVnZXgnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IGxpc3RVc2VycyB9IGZyb20gJy4uL2xpc3QtdXNlcnMnO1xuaW1wb3J0IHsgRGF0ZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuLi9kYXRlLXBhcnNlci5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2VBY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2UtYWN0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIE5neEZsb2F0VWlDb250ZW50Q29tcG9uZW50LFxuICBOZ3hGbG9hdFVpTG9vc2VEaXJlY3RpdmUsXG59IGZyb20gJ25neC1mbG9hdC11aSc7XG5cbnR5cGUgTWVzc2FnZVBhcnQgPSB7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgdHlwZTogJ3RleHQnIHwgJ21lbnRpb24nO1xuICB1c2VyPzogVXNlclJlc3BvbnNlO1xufTtcblxuLyoqXG4gKiBUaGUgYE1lc3NhZ2VgIGNvbXBvbmVudCBkaXNwbGF5cyBhIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgc2VuZGVyIGFuZCBkYXRlLCBhbmQgZW5hYmxlcyBbaW50ZXJhY3Rpb24gd2l0aCB0aGUgbWVzc2FnZSAoaS5lLiBlZGl0IG9yIHJlYWN0KV0oLi4vY29uY2VwdHMvbWVzc2FnZS1pbnRlcmFjdGlvbnMubWR4KS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLW1lc3NhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgW2NoYW5uZWwgY2FwYWJpbGl0aWVzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9jaGFubmVsX2NhcGFiaWxpdGllcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgdGhhdCBhcmUgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgdXNlciwgdGhlIGxpc3Qgb2YgW3N1cHBvcnRlZCBpbnRlcmFjdGlvbnNdKC4uL2NvbmNlcHRzL21lc3NhZ2UtaW50ZXJhY3Rpb25zLm1keCkgY2FuIGJlIGZvdW5kIGluIG91ciBtZXNzYWdlIGludGVyYWN0aW9uIGd1aWRlLiBVbmF0aG9yaXplZCBhY3Rpb25zIHdvbid0IGJlIGRpc3BsYXllZCBvbiB0aGUgVUkuIFRoZSBbYE1lc3NhZ2VMaXN0YF0oLi9NZXNzYWdlTGlzdENvbXBvbmVudC5tZHgpIGNvbXBvbmVudCBhdXRvbWF0aWNhbGx5IHNldHMgdGhpcyBiYXNlZCBvbiBbY2hhbm5lbCBjYXBhYmlsaXRpZXNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2NoYW5uZWxfY2FwYWJpbGl0aWVzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZWRNZXNzYWdlQWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIG1lc3NhZ2Ugc3RhdHVzIChzZW5kaW5nLCBzZW50LCB3aG8gcmVhZCB0aGUgbWVzc2FnZSkgaXMgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgaXNMYXN0U2VudE1lc3NhZ2U6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBtZXNzYWdlIGlzIGJlaW5nIGRpc3BhbHllZCBpbiBhIGNoYW5uZWwgb3IgaW4gYSBbdGhyZWFkXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC90aHJlYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGU6ICd0aHJlYWQnIHwgJ21haW4nID0gJ21haW4nO1xuICAvKipcbiAgICogSGlnaGxpZ2h0aW5nIGlzIHVzZWQgdG8gYWRkIHZpc3VhbCBlbXBoYXNpemUgdG8gYSBtZXNzYWdlIHdoZW4ganVtcGluZyB0byB0aGUgbWVzc2FnZVxuICAgKi9cbiAgQElucHV0KCkgaXNIaWdobGlnaHRlZCA9IGZhbHNlO1xuICAvKipcbiAgICogQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIG1lc3NhZ2UgbGlzdCBpcyBzY3JvbGxlZCwgaXQncyB1c2VkIHRvIHByZXZlbnQgb3BlbmluZyB0aGUgbWVzc2FnZSBtZW51IHdoaWxlIHNjcm9sbCBpcyBpbiBwcm9ncmVzc1xuICAgKi9cbiAgQElucHV0KCkgc2Nyb2xsJD86IE9ic2VydmFibGU8dm9pZD47XG4gIGNhblJlY2VpdmVSZWFkRXZlbnRzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBjYW5SZWFjdFRvTWVzc2FnZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgaXNFZGl0ZWRGbGFnT3BlbmVkID0gZmFsc2U7XG4gIG1lc3NhZ2VUZXh0UGFydHM6IE1lc3NhZ2VQYXJ0W10gfCB1bmRlZmluZWQgPSBbXTtcbiAgbWVzc2FnZVRleHQ/OiBzdHJpbmc7XG4gIHNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZSA9IGZhbHNlO1xuICBkaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQ6ICdvcmlnaW5hbCcgfCAndHJhbnNsYXRpb24nID0gJ29yaWdpbmFsJztcbiAgaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZTogJ29wZW5lZCcgfCAnY2xvc2VkJyA9ICdjbG9zZWQnO1xuICBzaG91bGREaXNwbGF5VGhyZWFkTGluayA9IGZhbHNlO1xuICBpc1NlbnRCeUN1cnJlbnRVc2VyID0gZmFsc2U7XG4gIHJlYWRCeVRleHQgPSAnJztcbiAgZGlzcGxheUFzOiAndGV4dCcgfCAnaHRtbCc7XG4gIGxhc3RSZWFkVXNlcjogVXNlclJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBpc09ubHlSZWFkQnlNZSA9IGZhbHNlO1xuICBpc1JlYWRCeU11bHRpcGxlVXNlcnMgPSBmYWxzZTtcbiAgaXNNZXNzYWdlRGVsaXZlcmVkQW5kUmVhZCA9IGZhbHNlO1xuICBwYXJzZWREYXRlID0gJyc7XG4gIHBhc2VkRWRpdGVkRGF0ZSA9ICcnO1xuICBhcmVPcHRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICBoYXNBdHRhY2htZW50ID0gZmFsc2U7XG4gIGhhc1JlYWN0aW9ucyA9IGZhbHNlO1xuICByZXBseUNvdW50UGFyYW06IHsgcmVwbHlDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkIH0gPSB7XG4gICAgcmVwbHlDb3VudDogdW5kZWZpbmVkLFxuICB9O1xuICBhcmVNZXNzYWdlT3B0aW9uc09wZW4gPSBmYWxzZTtcbiAgY2FuRGlzcGxheVJlYWRTdGF0dXMgPSBmYWxzZTtcbiAgaGFzVG91Y2hTdXBwb3J0ID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDA7XG4gIHByaXZhdGUgcXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRzOiBBdHRhY2htZW50W10gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB1c2VySWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsUmVnZXhwID1cbiAgICAvKD86KD86aHR0cHM/fGZ0cHxmaWxlKTpcXC9cXC98d3d3XFwufGZ0cFxcLikoPzpcXChbLUEtWjAtOSsmQCMvJT1+X3wkPyE6LC5dKlxcKXxbLUEtWjAtOSsmQCMvJT1+X3wkPyE6LC5dKSooPzpcXChbLUEtWjAtOSsmQCMvJT1+X3wkPyE6LC5dKlxcKXxbQS1aMC05KyZAIy8lPX5ffCRdKS9naW07XG4gIHByaXZhdGUgZW1vamlSZWdleHAgPSBuZXcgUmVnRXhwKGVtb2ppUmVnZXgoKSwgJ2cnKTtcbiAgQFZpZXdDaGlsZCgnbWVzc2FnZU1lbnVUcmlnZ2VyJylcbiAgbWVzc2FnZU1lbnVUcmlnZ2VyITogTmd4RmxvYXRVaUxvb3NlRGlyZWN0aXZlO1xuICBAVmlld0NoaWxkKCdtZXNzYWdlTWVudUZsb2F0JylcbiAgbWVzc2FnZU1lbnVGbG9hdCE6IE5neEZsb2F0VWlDb250ZW50Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdtZXNzYWdlVGV4dEVsZW1lbnQnKSBtZXNzYWdlVGV4dEVsZW1lbnQ/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnbWVzc2FnZUJ1YmJsZScpIG1lc3NhZ2VCdWJibGU/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSBzaG93TWVzc2FnZU1lbnVUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgc2hvdWxkUHJldmVudE1lc3NhZ2VNZW51Q2xvc2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHB1YmxpYyBjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlOiBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZGF0ZVBhcnNlcjogRGF0ZVBhcnNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlQWN0aW9uc1NlcnZpY2U6IE1lc3NhZ2VBY3Rpb25zU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIHRoaXMuZGlzcGxheUFzID0gdGhpcy5tZXNzYWdlU2VydmljZS5kaXNwbGF5QXM7XG4gIH1cblxuICBnZXQgdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50O1xuICB9XG5cbiAgc2V0IHZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50KGNvdW50OiBudW1iZXIpIHtcbiAgICB0aGlzLl92aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA9IGNvdW50O1xuICAgIGlmICh0aGlzLmFyZU9wdGlvbnNWaXNpYmxlICYmIHRoaXMuX3Zpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLmFyZU9wdGlvbnNWaXNpYmxlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLnVzZXIkLnN1YnNjcmliZSgodSkgPT4ge1xuICAgICAgICBpZiAodT8uaWQgIT09IHRoaXMudXNlcklkKSB7XG4gICAgICAgICAgdGhpcy51c2VySWQgPSB1Py5pZDtcbiAgICAgICAgICB0aGlzLnNldElzU2VudEJ5Q3VycmVudFVzZXIoKTtcbiAgICAgICAgICB0aGlzLnNldExhc3RSZWFkVXNlcigpO1xuICAgICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25zJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlKSB7XG4gICAgICAgICAgY29uc3QgbnVtYmVyT2ZFbmFibGVkQWN0aW9ucyA9XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5nZXRBdXRob3JpemVkTWVzc2FnZUFjdGlvbnNDb3VudChcbiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobnVtYmVyT2ZFbmFibGVkQWN0aW9ucyAhPT0gdGhpcy52aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA9IG51bWJlck9mRW5hYmxlZEFjdGlvbnM7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZSkge1xuICAgICAgdGhpcy5zaG91bGREaXNwbGF5VHJhbnNsYXRpb25Ob3RpY2UgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50ID0gJ29yaWdpbmFsJztcbiAgICAgIHRoaXMuY3JlYXRlTWVzc2FnZVBhcnRzKCk7XG4gICAgICBjb25zdCBvcmlnaW5hbEF0dGFjaG1lbnRzID0gdGhpcy5tZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uYXR0YWNobWVudHM7XG4gICAgICB0aGlzLnF1b3RlZE1lc3NhZ2VBdHRhY2htZW50cyA9XG4gICAgICAgIG9yaWdpbmFsQXR0YWNobWVudHMgJiYgb3JpZ2luYWxBdHRhY2htZW50cy5sZW5ndGhcbiAgICAgICAgICA/IFtvcmlnaW5hbEF0dGFjaG1lbnRzWzBdXVxuICAgICAgICAgIDogW107XG4gICAgICB0aGlzLnNldElzU2VudEJ5Q3VycmVudFVzZXIoKTtcbiAgICAgIHRoaXMuc2V0TGFzdFJlYWRVc2VyKCk7XG4gICAgICB0aGlzLnJlYWRCeVRleHQgPSB0aGlzLm1lc3NhZ2U/LnJlYWRCeVxuICAgICAgICA/IGxpc3RVc2Vycyh0aGlzLm1lc3NhZ2UucmVhZEJ5KVxuICAgICAgICA6ICcnO1xuICAgICAgdGhpcy5pc09ubHlSZWFkQnlNZSA9ICEhKFxuICAgICAgICB0aGlzLm1lc3NhZ2UgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeSAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA9PT0gMFxuICAgICAgKTtcbiAgICAgIHRoaXMuaXNSZWFkQnlNdWx0aXBsZVVzZXJzID0gISEoXG4gICAgICAgIHRoaXMubWVzc2FnZSAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5ICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkubGVuZ3RoID4gMVxuICAgICAgKTtcbiAgICAgIHRoaXMuaXNNZXNzYWdlRGVsaXZlcmVkQW5kUmVhZCA9ICEhKFxuICAgICAgICB0aGlzLm1lc3NhZ2UgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeSAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2Uuc3RhdHVzID09PSAncmVjZWl2ZWQnICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIHRoaXMucGFyc2VkRGF0ZSA9XG4gICAgICAgICh0aGlzLm1lc3NhZ2UgJiZcbiAgICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlZF9hdCAmJlxuICAgICAgICAgIHRoaXMuZGF0ZVBhcnNlci5wYXJzZURhdGVUaW1lKHRoaXMubWVzc2FnZS5jcmVhdGVkX2F0KSkgfHxcbiAgICAgICAgJyc7XG4gICAgICB0aGlzLnBhc2VkRWRpdGVkRGF0ZSA9XG4gICAgICAgICh0aGlzLm1lc3NhZ2UgJiZcbiAgICAgICAgICB0aGlzLm1lc3NhZ2UubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXQgJiZcbiAgICAgICAgICB0aGlzLmRhdGVQYXJzZXIucGFyc2VEYXRlVGltZShcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMubWVzc2FnZS5tZXNzYWdlX3RleHRfdXBkYXRlZF9hdClcbiAgICAgICAgICApKSB8fFxuICAgICAgICAnJztcbiAgICAgIHRoaXMuaGFzQXR0YWNobWVudCA9XG4gICAgICAgICEhdGhpcy5tZXNzYWdlPy5hdHRhY2htZW50cyAmJiAhIXRoaXMubWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGg7XG4gICAgICB0aGlzLmhhc1JlYWN0aW9ucyA9XG4gICAgICAgICEhdGhpcy5tZXNzYWdlPy5yZWFjdGlvbl9jb3VudHMgJiZcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5tZXNzYWdlLnJlYWN0aW9uX2NvdW50cykubGVuZ3RoID4gMDtcbiAgICAgIHRoaXMucmVwbHlDb3VudFBhcmFtID0geyByZXBseUNvdW50OiB0aGlzLm1lc3NhZ2U/LnJlcGx5X2NvdW50IH07XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucykge1xuICAgICAgdGhpcy5jYW5SZWFjdFRvTWVzc2FnZSA9XG4gICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3NlbmQtcmVhY3Rpb24nKSAhPT0gLTE7XG4gICAgICB0aGlzLmNhblJlY2VpdmVSZWFkRXZlbnRzID1cbiAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMuaW5kZXhPZigncmVhZC1ldmVudHMnKSAhPT0gLTE7XG4gICAgICB0aGlzLmNhbkRpc3BsYXlSZWFkU3RhdHVzID1cbiAgICAgICAgdGhpcy5jYW5SZWNlaXZlUmVhZEV2ZW50cyAhPT0gZmFsc2UgJiZcbiAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMuaW5kZXhPZigncmVhZC1ldmVudHMnKSAhPT0gLTE7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UgfHwgY2hhbmdlcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMgfHwgY2hhbmdlcy5tb2RlKSB7XG4gICAgICB0aGlzLnNob3VsZERpc3BsYXlUaHJlYWRMaW5rID1cbiAgICAgICAgISF0aGlzLm1lc3NhZ2U/LnJlcGx5X2NvdW50ICYmIHRoaXMubW9kZSAhPT0gJ3RocmVhZCc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UgfHwgY2hhbmdlcy5tb2RlIHx8IGNoYW5nZXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zKSB7XG4gICAgICB0aGlzLmFyZU9wdGlvbnNWaXNpYmxlID0gdGhpcy5tZXNzYWdlXG4gICAgICAgID8gIShcbiAgICAgICAgICAgICF0aGlzLm1lc3NhZ2UudHlwZSB8fFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnR5cGUgPT09ICdlcnJvcicgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS50eXBlID09PSAnc3lzdGVtJyB8fFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnR5cGUgPT09ICdkZWxldGVkJyB8fFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnR5cGUgPT09ICdlcGhlbWVyYWwnIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc3RhdHVzID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnN0YXR1cyA9PT0gJ3NlbmRpbmcnIHx8XG4gICAgICAgICAgICAodGhpcy5tb2RlID09PSAndGhyZWFkJyAmJiAhdGhpcy5tZXNzYWdlLnBhcmVudF9pZCkgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS5kZWxldGVkX2F0IHx8XG4gICAgICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5sZW5ndGggPT09IDBcbiAgICAgICAgICApXG4gICAgICAgIDogZmFsc2U7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UgfHwgY2hhbmdlcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLm1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy52aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA9XG4gICAgICAgICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuZ2V0QXV0aG9yaXplZE1lc3NhZ2VBY3Rpb25zQ291bnQoXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9uc1xuICAgICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZXdJbml0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLmhhc1RvdWNoU3VwcG9ydCAmJiB0aGlzLm1lc3NhZ2VCdWJibGU/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWdpc3Rlck1lbnVUcmlnZ2VyRXZlbnRIYW5kbGVycygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBtb3VzZVB1c2hlZERvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5oYXNUb3VjaFN1cHBvcnQgfHxcbiAgICAgIGV2ZW50LmJ1dHRvbiAhPT0gMCB8fFxuICAgICAgIXRoaXMuYXJlT3B0aW9uc1Zpc2libGVcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGFydE1lc3NhZ2VNZW51U2hvd1RpbWVyKHsgZnJvbVRvdWNoOiBmYWxzZSB9KTtcbiAgfVxuXG4gIG1vdXNlUmVsZWFzZWQoKSB7XG4gICAgdGhpcy5zdG9wTWVzc2FnZU1lbnVTaG93VGltZXIoKTtcbiAgfVxuXG4gIHRvdWNoU3RhcnRlZCgpIHtcbiAgICBpZiAoIXRoaXMuYXJlT3B0aW9uc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGFydE1lc3NhZ2VNZW51U2hvd1RpbWVyKHsgZnJvbVRvdWNoOiB0cnVlIH0pO1xuICB9XG5cbiAgdG91Y2hFbmRlZCgpIHtcbiAgICB0aGlzLnN0b3BNZXNzYWdlTWVudVNob3dUaW1lcigpO1xuICB9XG5cbiAgbWVzc2FnZUJ1YmJsZUNsaWNrZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmhhc1RvdWNoU3VwcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG91bGRQcmV2ZW50TWVzc2FnZU1lbnVDbG9zZSkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLnNob3VsZFByZXZlbnRNZXNzYWdlTWVudUNsb3NlID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFyZU1lc3NhZ2VPcHRpb25zT3Blbikge1xuICAgICAgdGhpcy5tZXNzYWdlTWVudVRyaWdnZXI/LmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBtZXNzYWdlT3B0aW9uc0J1dHRvbkNsaWNrZWQoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbkNsaWNrSGFuZGxlcikge1xuICAgICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9uQ2xpY2tIYW5kbGVyKHtcbiAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICBlbmFibGVkQWN0aW9uczogdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICAgIGN1c3RvbUFjdGlvbnM6IHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbnMkLmdldFZhbHVlKCksXG4gICAgICAgIGlzTWluZTogdGhpcy5pc1NlbnRCeUN1cnJlbnRVc2VyLFxuICAgICAgICBtZXNzYWdlVGV4dEh0bWxFbGVtZW50OiB0aGlzLm1lc3NhZ2VUZXh0RWxlbWVudD8ubmF0aXZlRWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFyZU1lc3NhZ2VPcHRpb25zT3BlbiA9ICF0aGlzLmFyZU1lc3NhZ2VPcHRpb25zT3BlbjtcbiAgICB9XG4gIH1cblxuICBtZXNzYWdlQWN0aW9uc0JveENsaWNrZWQoZmxvYXRpbmdDb250ZW50OiBOZ3hGbG9hdFVpQ29udGVudENvbXBvbmVudCkge1xuICAgIGZsb2F0aW5nQ29udGVudC5oaWRlKCk7XG4gIH1cblxuICBnZXRBdHRhY2htZW50TGlzdENvbnRleHQoKTogQXR0YWNobWVudExpc3RDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LmlkIHx8ICcnLFxuICAgICAgYXR0YWNobWVudHM6IHRoaXMubWVzc2FnZT8uYXR0YWNobWVudHMgfHwgW10sXG4gICAgICBwYXJlbnRNZXNzYWdlSWQ6IHRoaXMubWVzc2FnZT8ucGFyZW50X2lkLFxuICAgICAgaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcjogKHN0YXRlKSA9PlxuICAgICAgICAodGhpcy5pbWFnZUF0dGFjaG1lbnRNb2RhbFN0YXRlID0gc3RhdGUpLFxuICAgIH07XG4gIH1cblxuICBnZXRNZXNzYWdlQ29udGV4dCgpOiBTeXN0ZW1NZXNzYWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIGVuYWJsZWRNZXNzYWdlQWN0aW9uczogdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICBpc0hpZ2hsaWdodGVkOiB0aGlzLmlzSGlnaGxpZ2h0ZWQsXG4gICAgICBpc0xhc3RTZW50TWVzc2FnZTogdGhpcy5pc0xhc3RTZW50TWVzc2FnZSxcbiAgICAgIG1vZGU6IHRoaXMubW9kZSxcbiAgICAgIGN1c3RvbUFjdGlvbnM6IHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbnMkLmdldFZhbHVlKCksXG4gICAgICBwYXJzZWREYXRlOiB0aGlzLnBhcnNlZERhdGUsXG4gICAgICBzY3JvbGwkOiB0aGlzLnNjcm9sbCQsXG4gICAgfTtcbiAgfVxuXG4gIGdldFF1b3RlZE1lc3NhZ2VBdHRhY2htZW50TGlzdENvbnRleHQoKTogQXR0YWNobWVudExpc3RDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5pZCB8fCAnJyxcbiAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLnF1b3RlZE1lc3NhZ2VBdHRhY2htZW50cyEsXG4gICAgICBwYXJlbnRNZXNzYWdlSWQ6IHRoaXM/Lm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5wYXJlbnRfaWQsXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VSZWFjdGlvbnNDb250ZXh0KCk6IE1lc3NhZ2VSZWFjdGlvbnNDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZVJlYWN0aW9uQ291bnRzOiB0aGlzLm1lc3NhZ2U/LnJlYWN0aW9uX2NvdW50cyB8fCB7fSxcbiAgICAgIGxhdGVzdFJlYWN0aW9uczogdGhpcy5tZXNzYWdlPy5sYXRlc3RfcmVhY3Rpb25zIHx8IFtdLFxuICAgICAgbWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LmlkLFxuICAgICAgb3duUmVhY3Rpb25zOiB0aGlzLm1lc3NhZ2U/Lm93bl9yZWFjdGlvbnMgfHwgW10sXG4gICAgfTtcbiAgfVxuXG4gIG1lc3NhZ2VDbGlja2VkKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMubWVzc2FnZT8uc3RhdHVzID09PSAnZmFpbGVkJyAmJlxuICAgICAgdGhpcy5tZXNzYWdlPy5lcnJvclN0YXR1c0NvZGUgIT09IDQwM1xuICAgICkge1xuICAgICAgdGhpcy5yZXNlbmRNZXNzYWdlKCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMubWVzc2FnZT8udHlwZSA9PT0gJ2Vycm9yJyAmJlxuICAgICAgdGhpcy5tZXNzYWdlPy5tb2RlcmF0aW9uX2RldGFpbHNcbiAgICApIHtcbiAgICAgIHRoaXMub3Blbk1lc3NhZ2VCb3VuY2VQcm9tcHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0VkaXRlZEZsYWdPcGVuZWQgPSAhdGhpcy5pc0VkaXRlZEZsYWdPcGVuZWQ7XG4gICAgfVxuICB9XG5cbiAgcmVzZW5kTWVzc2FnZSgpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UucmVzZW5kTWVzc2FnZSh0aGlzLm1lc3NhZ2UhKTtcbiAgfVxuXG4gIHNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSgpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2Uuc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKHRoaXMubWVzc2FnZSk7XG4gIH1cblxuICBnZXRNZW50aW9uQ29udGV4dChtZXNzYWdlUGFydDogTWVzc2FnZVBhcnQpOiBNZW50aW9uVGVtcGxhdGVDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogbWVzc2FnZVBhcnQuY29udGVudCxcbiAgICAgIHVzZXI6IG1lc3NhZ2VQYXJ0LnVzZXIhLFxuICAgIH07XG4gIH1cblxuICBnZXRNZXNzYWdlQWN0aW9uc0JveENvbnRleHQoKTogTWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNNaW5lOiB0aGlzLmlzU2VudEJ5Q3VycmVudFVzZXIsXG4gICAgICBlbmFibGVkQWN0aW9uczogdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBtZXNzYWdlVGV4dEh0bWxFbGVtZW50OiB0aGlzLm1lc3NhZ2VUZXh0RWxlbWVudD8ubmF0aXZlRWxlbWVudCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVsaXZlcmVkU3RhdHVzQ29udGV4dCgpOiBEZWxpdmVyZWRTdGF0dXNDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICB9O1xuICB9XG5cbiAgZ2V0U2VuZGluZ1N0YXR1c0NvbnRleHQoKTogU2VuZGluZ1N0YXR1c0NvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UhLFxuICAgIH07XG4gIH1cblxuICBnZXRSZWFkU3RhdHVzQ29udGV4dCgpOiBSZWFkU3RhdHVzQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSEsXG4gICAgICByZWFkQnlUZXh0OiB0aGlzLnJlYWRCeVRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VNZXRhZGF0YUNvbnRleHQoKTogQ3VzdG9tTWV0YWRhdGFDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICB9O1xuICB9XG5cbiAganVtcFRvTWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZywgcGFyZW50TWVzc2FnZUlkPzogc3RyaW5nKSB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmp1bXBUb01lc3NhZ2UobWVzc2FnZUlkLCBwYXJlbnRNZXNzYWdlSWQpO1xuICB9XG5cbiAgZGlzcGxheVRyYW5zbGF0ZWRNZXNzYWdlKCkge1xuICAgIHRoaXMuY3JlYXRlTWVzc2FnZVBhcnRzKHRydWUpO1xuICB9XG5cbiAgZGlzcGxheU9yaWdpbmFsTWVzc2FnZSgpIHtcbiAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VQYXJ0cyhmYWxzZSk7XG4gIH1cblxuICBvcGVuTWVzc2FnZUJvdW5jZVByb21wdCgpIHtcbiAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmJvdW5jZWRNZXNzYWdlJC5uZXh0KHRoaXMubWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lc3NhZ2VQYXJ0cyhzaG91bGRUcmFuc2xhdGUgPSB0cnVlKSB7XG4gICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubWVzc2FnZVRleHQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGNvbnRlbnQgPSB0aGlzLmdldE1lc3NhZ2VDb250ZW50KHNob3VsZFRyYW5zbGF0ZSk7XG4gICAgaWYgKFxuICAgICAgKCF0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2VycyB8fFxuICAgICAgICB0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2Vycy5sZW5ndGggPT09IDApICYmXG4gICAgICAhY29udGVudD8ubWF0Y2godGhpcy5lbW9qaVJlZ2V4cCkgJiZcbiAgICAgICFjb250ZW50Py5tYXRjaCh0aGlzLnVybFJlZ2V4cClcbiAgICApIHtcbiAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMubWVzc2FnZVRleHQgPSBjb250ZW50O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzIHx8XG4gICAgICB0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2Vycy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLmZpeEVtb2ppRGlzcGxheShjb250ZW50KTtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLndyYXBMaW5rc1dpdGhBbmNob3JUYWcoY29udGVudCk7XG4gICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMgPSBbeyBjb250ZW50LCB0eXBlOiAndGV4dCcgfV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IFtdO1xuICAgICAgbGV0IHRleHQgPSBjb250ZW50O1xuICAgICAgdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgICBjb25zdCBtZW50aW9uID0gYEAke3VzZXIubmFtZSB8fCB1c2VyLmlkfWA7XG4gICAgICAgIGNvbnN0IHByZWNlZGluZ1RleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0LmluZGV4T2YobWVudGlvbikpO1xuICAgICAgICBsZXQgZm9ybWF0dGVkUHJlY2VkaW5nVGV4dCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KHByZWNlZGluZ1RleHQpO1xuICAgICAgICBmb3JtYXR0ZWRQcmVjZWRpbmdUZXh0ID0gdGhpcy53cmFwTGlua3NXaXRoQW5jaG9yVGFnKFxuICAgICAgICAgIGZvcm1hdHRlZFByZWNlZGluZ1RleHRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzIS5wdXNoKHtcbiAgICAgICAgICBjb250ZW50OiBmb3JtYXR0ZWRQcmVjZWRpbmdUZXh0LFxuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyEucHVzaCh7XG4gICAgICAgICAgY29udGVudDogbWVudGlvbixcbiAgICAgICAgICB0eXBlOiAnbWVudGlvbicsXG4gICAgICAgICAgdXNlcixcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UocHJlY2VkaW5nVGV4dCArIG1lbnRpb24sICcnKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KHRleHQpO1xuICAgICAgICB0ZXh0ID0gdGhpcy53cmFwTGlua3NXaXRoQW5jaG9yVGFnKHRleHQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMucHVzaCh7IGNvbnRlbnQ6IHRleHQsIHR5cGU6ICd0ZXh0JyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE1lc3NhZ2VDb250ZW50KHNob3VsZFRyYW5zbGF0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IHRoaXMubWVzc2FnZT8udGV4dDtcbiAgICBpZiAoc2hvdWxkVHJhbnNsYXRlKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMubWVzc2FnZT8udHJhbnNsYXRpb247XG4gICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgdGhpcy5zaG91bGREaXNwbGF5VHJhbnNsYXRpb25Ob3RpY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICd0cmFuc2xhdGlvbic7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJhbnNsYXRpb24gfHwgb3JpZ2luYWxDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICdvcmlnaW5hbCc7XG4gICAgICByZXR1cm4gb3JpZ2luYWxDb250ZW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZml4RW1vamlEaXNwbGF5KGNvbnRlbnQ6IHN0cmluZykge1xuICAgIC8vIFdyYXAgZW1vamlzIGluIHNwYW4gdG8gZGlzcGxheSBlbW9qaXMgY29ycmVjdGx5IGluIENocm9tZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01OTYyMjNcbiAgICAvLyBCYXNlZCBvbiB0aGlzOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NTY1MTEyL2phdmFzY3JpcHQtaG93LXRvLWZpbmQtb3V0LWlmLXRoZS11c2VyLWJyb3dzZXItaXMtY2hyb21lXG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gICAgY29uc3QgaXNDaHJvbWUgPVxuICAgICAgISEod2luZG93IGFzIGFueSkuY2hyb21lICYmIHR5cGVvZiAod2luZG93IGFzIGFueSkub3ByID09PSAndW5kZWZpbmVkJztcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICB0aGlzLmVtb2ppUmVnZXhwLFxuICAgICAgKG1hdGNoKSA9PlxuICAgICAgICBgPHNwYW4gJHtcbiAgICAgICAgICBpc0Nocm9tZSA/ICdjbGFzcz1cInN0ci1jaGF0X19lbW9qaS1kaXNwbGF5LWZpeFwiJyA6ICcnXG4gICAgICAgIH0+JHttYXRjaH08L3NwYW4+YFxuICAgICk7XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcExpbmtzV2l0aEFuY2hvclRhZyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5QXMgPT09ICdodG1sJykge1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UodGhpcy51cmxSZWdleHAsIChtYXRjaCkgPT5cbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY3VzdG9tTGlua1JlbmRlcmVyXG4gICAgICAgID8gdGhpcy5tZXNzYWdlU2VydmljZS5jdXN0b21MaW5rUmVuZGVyZXIobWF0Y2gpXG4gICAgICAgIDogYDxhIGhyZWY9XCIke21hdGNofVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vZm9sbG93XCI+JHttYXRjaH08L2E+YFxuICAgICk7XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SXNTZW50QnlDdXJyZW50VXNlcigpIHtcbiAgICB0aGlzLmlzU2VudEJ5Q3VycmVudFVzZXIgPSB0aGlzLm1lc3NhZ2U/LnVzZXI/LmlkID09PSB0aGlzLnVzZXJJZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TGFzdFJlYWRVc2VyKCkge1xuICAgIHRoaXMubGFzdFJlYWRVc2VyID0gdGhpcy5tZXNzYWdlPy5yZWFkQnk/LmZpbHRlcihcbiAgICAgICh1KSA9PiB1LmlkICE9PSB0aGlzLnVzZXJJZFxuICAgIClbMF07XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0TWVzc2FnZU1lbnVTaG93VGltZXIob3B0aW9uczogeyBmcm9tVG91Y2g6IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuc3RvcE1lc3NhZ2VNZW51U2hvd1RpbWVyKCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsJCkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIHRoaXMuc2Nyb2xsJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdG9wTWVzc2FnZU1lbnVTaG93VGltZXIoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuc2hvd01lc3NhZ2VNZW51VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbkNsaWNrSGFuZGxlcikge1xuICAgICAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbkNsaWNrSGFuZGxlcih7XG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgICBlbmFibGVkQWN0aW9uczogdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICAgICAgICBjdXN0b21BY3Rpb25zOiB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25zJC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgaXNNaW5lOiB0aGlzLmlzU2VudEJ5Q3VycmVudFVzZXIsXG4gICAgICAgICAgICBtZXNzYWdlVGV4dEh0bWxFbGVtZW50OiB0aGlzLm1lc3NhZ2VUZXh0RWxlbWVudD8ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG91bGRQcmV2ZW50TWVzc2FnZU1lbnVDbG9zZSA9ICFvcHRpb25zLmZyb21Ub3VjaDtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VNZW51VHJpZ2dlcj8uc2hvdygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2VNZW51VGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH0sIDQwMCk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTWVudVRyaWdnZXJFdmVudEhhbmRsZXJzKCkge1xuICAgIHRoaXMubWVzc2FnZUJ1YmJsZSEubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgKCkgPT5cbiAgICAgIHRoaXMudG91Y2hTdGFydGVkKClcbiAgICApO1xuICAgIHRoaXMubWVzc2FnZUJ1YmJsZSEubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsICgpID0+XG4gICAgICB0aGlzLnRvdWNoRW5kZWQoKVxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlQnViYmxlIS5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PlxuICAgICAgdGhpcy5tb3VzZVB1c2hlZERvd24oZSlcbiAgICApO1xuICAgIHRoaXMubWVzc2FnZUJ1YmJsZSEubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPT5cbiAgICAgIHRoaXMubW91c2VSZWxlYXNlZCgpXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VCdWJibGUhLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT5cbiAgICAgIHRoaXMubWVzc2FnZUJ1YmJsZUNsaWNrZWQoZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wTWVzc2FnZU1lbnVTaG93VGltZXIoKSB7XG4gICAgaWYgKHRoaXMuc2hvd01lc3NhZ2VNZW51VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2hvd01lc3NhZ2VNZW51VGltZW91dCk7XG4gICAgICB0aGlzLnNob3dNZXNzYWdlTWVudVRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gICNjb250YWluZXJcbiAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWNvbnRhaW5lclwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlIHN0ci1jaGF0X19tZXNzYWdlIHN0ci1jaGF0X19tZXNzYWdlLS17e1xuICAgIG1lc3NhZ2U/LnR5cGVcbiAgfX0gc3RyLWNoYXRfX21lc3NhZ2UtLXt7IG1lc3NhZ2U/LnN0YXR1cyB9fSB7e1xuICAgIG1lc3NhZ2U/LnRleHQgPyAnc3RyLWNoYXRfX21lc3NhZ2UtLWhhcy10ZXh0JyA6ICdoYXMtbm8tdGV4dCdcbiAgfX0gc3RyLWNoYXRfX21lc3NhZ2UtbWVudS17eyBhcmVNZXNzYWdlT3B0aW9uc09wZW4gPyAnb3BlbmVkJyA6ICdjbG9zZWQnIH19XCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1tZV09XCJpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1vdGhlcl09XCIhaXNTZW50QnlDdXJyZW50VXNlclwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtLW1lXT1cImlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLWhhcy1hdHRhY2htZW50XT1cImhhc0F0dGFjaG1lbnRcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLXdpdGgtcmVhY3Rpb25zXT1cImhhc1JlYWN0aW9uc1wiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0taGlnaGxpZ2h0ZWRdPVwiaXNIaWdobGlnaHRlZFwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS13aXRoLXRocmVhZC1saW5rXT1cInNob3VsZERpc3BsYXlUaHJlYWRMaW5rXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXNlbmQtY2FuLWJlLXJldHJpZWRdPVwiXG4gICAgKG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiYgbWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlICE9PSA0MDMpIHx8XG4gICAgKG1lc3NhZ2U/LnR5cGUgPT09ICdlcnJvcicgJiYgbWVzc2FnZT8ubW9kZXJhdGlvbl9kZXRhaWxzKVxuICBcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utd2l0aC10b3VjaC1zdXBwb3J0XT1cImhhc1RvdWNoU3VwcG9ydFwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS13aXRob3V0LXRvdWNoLXN1cHBvcnRdPVwiIWhhc1RvdWNoU3VwcG9ydFwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbWVzc2FnZT8uZGVsZXRlZF9hdDsgZWxzZSBkZWxldGVkTWVzc2FnZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy50eXBlICE9PSAnc3lzdGVtJzsgZWxzZSBzeXN0ZW1NZXNzYWdlXCI+XG4gICAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgICBkYXRhLXRlc3RpZD1cImF2YXRhclwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fYXZhdGFyLWhvc3Qgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLWF2YXRhclwiXG4gICAgICAgIHR5cGU9XCJ1c2VyXCJcbiAgICAgICAgbG9jYXRpb249XCJtZXNzYWdlLXNlbmRlclwiXG4gICAgICAgIFtpbWFnZVVybF09XCJtZXNzYWdlPy51c2VyPy5pbWFnZVwiXG4gICAgICAgIFtuYW1lXT1cIm1lc3NhZ2U/LnVzZXI/Lm5hbWUgfHwgbWVzc2FnZT8udXNlcj8uaWRcIlxuICAgICAgICBbdXNlcl09XCJtZXNzYWdlPy51c2VyIHx8IHVuZGVmaW5lZFwiXG4gICAgICA+PC9zdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWlubmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIiFoYXNUb3VjaFN1cHBvcnQgJiYgYXJlT3B0aW9uc1Zpc2libGVcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zIHN0ci1jaGF0X19tZXNzYWdlLW9wdGlvbnNcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1vcHRpb25zXCJcbiAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1vcGVuXT1cImFyZU1lc3NhZ2VPcHRpb25zT3BlblwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjbWVzc2FnZUFjdGlvbnNUb2dnbGVcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1hY3Rpb25zLWNvbnRhaW5lclwiXG4gICAgICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1hY3Rpb25zLWNvbnRhaW5lclxuICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGVfX2FjdGlvbnNfX2FjdGlvblxuICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGVfX2FjdGlvbnNfX2FjdGlvbi0tb3B0aW9uc1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtmbG9hdFVpTG9vc2VdPVwibWVzc2FnZU1lbnVGbG9hdFwiXG4gICAgICAgICAgICBsb29zZVRyaWdnZXI9XCJjbGlja1wiXG4gICAgICAgICAgICBbaGlkZU9uU2Nyb2xsXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlT25DbGlja091dHNpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbaGlkZU9uTW91c2VMZWF2ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbZGlzYWJsZUFuaW1hdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICBbcHJldmVudE92ZXJmbG93XT1cInRydWVcIlxuICAgICAgICAgICAgW3Bvc2l0aW9uRml4ZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAob25TSG93bik9XCJhcmVNZXNzYWdlT3B0aW9uc09wZW4gPSB0cnVlXCJcbiAgICAgICAgICAgIChvbkhpZGRlbik9XCJhcmVNZXNzYWdlT3B0aW9uc09wZW4gPSBmYWxzZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cInZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID4gMFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1ib3gtYnV0dG9uXCJcbiAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLW9wdGlvbnMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm1lc3NhZ2VPcHRpb25zQnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIm1lc3NhZ2VPcHRpb25zQnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgaWNvbj1cImFjdGlvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hY3Rpb24taWNvblwiXG4gICAgICAgICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVhY3Rpb25zLWhvc3RcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNkZWZhdWx0TWVzc2FnZVJlYWN0aW9uc1xuICAgICAgICAgICAgbGV0LW1lc3NhZ2VSZWFjdGlvbkNvdW50cz1cIm1lc3NhZ2VSZWFjdGlvbkNvdW50c1wiXG4gICAgICAgICAgICBsZXQtbGF0ZXN0UmVhY3Rpb25zPVwibGF0ZXN0UmVhY3Rpb25zXCJcbiAgICAgICAgICAgIGxldC1tZXNzYWdlSWQ9XCJtZXNzYWdlSWRcIlxuICAgICAgICAgICAgbGV0LW93blJlYWN0aW9ucz1cIm93blJlYWN0aW9uc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN0cmVhbS1tZXNzYWdlLXJlYWN0aW9uc1xuICAgICAgICAgICAgICBbbWVzc2FnZVJlYWN0aW9uQ291bnRzXT1cIm1lc3NhZ2VSZWFjdGlvbkNvdW50c1wiXG4gICAgICAgICAgICAgIFtsYXRlc3RSZWFjdGlvbnNdPVwibGF0ZXN0UmVhY3Rpb25zXCJcbiAgICAgICAgICAgICAgW21lc3NhZ2VJZF09XCJtZXNzYWdlSWRcIlxuICAgICAgICAgICAgICBbb3duUmVhY3Rpb25zXT1cIm93blJlYWN0aW9uc1wiXG4gICAgICAgICAgICA+PC9zdHJlYW0tbWVzc2FnZS1yZWFjdGlvbnM+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlUmVhY3Rpb25zVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2VSZWFjdGlvbnM7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lc3NhZ2VSZWFjdGlvbnNDb250ZXh0KClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGZsb2F0LXVpLWNvbnRlbnQgI21lc3NhZ2VNZW51RmxvYXQ+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjZGVmYXVsdE1lc3NhZ2VBY3Rpb25zQm94XG4gICAgICAgICAgICBsZXQtaXNNaW5lPVwiaXNNaW5lXCJcbiAgICAgICAgICAgIGxldC1tZXNzYWdlSW5wdXQ9XCJtZXNzYWdlXCJcbiAgICAgICAgICAgIGxldC1lbmFibGVkQWN0aW9ucz1cImVuYWJsZWRBY3Rpb25zXCJcbiAgICAgICAgICAgIGxldC1tZXNzYWdlVGV4dEh0bWxFbGVtZW50PVwibWVzc2FnZVRleHRIdG1sRWxlbWVudFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN0cmVhbS1tZXNzYWdlLWFjdGlvbnMtYm94XG4gICAgICAgICAgICAgIFtpc01pbmVdPVwiaXNNaW5lXCJcbiAgICAgICAgICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZUlucHV0XCJcbiAgICAgICAgICAgICAgW2VuYWJsZWRBY3Rpb25zXT1cImVuYWJsZWRBY3Rpb25zXCJcbiAgICAgICAgICAgICAgW21lc3NhZ2VUZXh0SHRtbEVsZW1lbnRdPVwibWVzc2FnZVRleHRIdG1sRWxlbWVudFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJtZXNzYWdlQWN0aW9uc0JveENsaWNrZWQobWVzc2FnZU1lbnVGbG9hdClcIlxuICAgICAgICAgICAgPjwvc3RyZWFtLW1lc3NhZ2UtYWN0aW9ucy1ib3g+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VBY3Rpb25zQm94VGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZUFjdGlvbnNCb3g7XG4gICAgICAgICAgICAgICAgY29udGV4dDogZ2V0TWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0KClcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Zsb2F0LXVpLWNvbnRlbnQ+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWJ1YmJsZSBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgW2NsYXNzLnN0ci1jaGF0LWFuZ3VsYXJfX21lc3NhZ2UtYnViYmxlLS1hdHRhY2htZW50LW1vZGFsLW9wZW5dPVwiXG4gICAgICAgICAgICBpbWFnZUF0dGFjaG1lbnRNb2RhbFN0YXRlID09PSAnb3BlbmVkJ1xuICAgICAgICAgIFwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgW2Zsb2F0VWlMb29zZV09XCJtZXNzYWdlTWVudUZsb2F0XCJcbiAgICAgICAgICAjbWVzc2FnZU1lbnVUcmlnZ2VyPVwiZmxvYXRVaUxvb3NlXCJcbiAgICAgICAgICAjbWVzc2FnZUJ1YmJsZVxuICAgICAgICAgIGxvb3NlVHJpZ2dlcj1cIm5vbmVcIlxuICAgICAgICAgIFtoaWRlT25TY3JvbGxdPVwiZmFsc2VcIlxuICAgICAgICAgIFtoaWRlT25DbGlja091dHNpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgW2hpZGVPbk1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgICAgIFtkaXNhYmxlQW5pbWF0aW9uXT1cInRydWVcIlxuICAgICAgICAgIFtwcmV2ZW50T3ZlcmZsb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgKG9uU2hvd24pPVwiYXJlTWVzc2FnZU9wdGlvbnNPcGVuID0gdHJ1ZVwiXG4gICAgICAgICAgKG9uSGlkZGVuKT1cImFyZU1lc3NhZ2VPcHRpb25zT3BlbiA9IGZhbHNlXCJcbiAgICAgICAgICBbcG9zaXRpb25GaXhlZF09XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNBdHRhY2htZW50ICYmICFtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19hdHRhY2htZW50cy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXR0YWNobWVudHNUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZT8udGV4dCB8fCAobWVzc2FnZT8ucXVvdGVkX21lc3NhZ2UgJiYgaGFzQXR0YWNobWVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtdGV4dC0tcG9pbnRlci1jdXJzb3JdPVwiXG4gICAgICAgICAgICAgIChtZXNzYWdlPy5zdGF0dXMgPT09ICdmYWlsZWQnICYmXG4gICAgICAgICAgICAgICAgbWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlICE9PSA0MDMpIHx8XG4gICAgICAgICAgICAgICh0aGlzLm1lc3NhZ2U/LnR5cGUgPT09ICdlcnJvcicgJiZcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2U/Lm1vZGVyYXRpb25fZGV0YWlscykgfHxcbiAgICAgICAgICAgICAgbWVzc2FnZT8ubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZUNsaWNrZWQoKVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwibWVzc2FnZUNsaWNrZWQoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImlubmVyLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXRleHQtaW5uZXIgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXRleHQtaW5uZXJcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLWxpZ2h0LXRleHQtaW5uZXItLWhhcy1hdHRhY2htZW50XT1cIlxuICAgICAgICAgICAgICAgIGhhc0F0dGFjaG1lbnRcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInF1b3RlZE1lc3NhZ2VcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0F0dGFjaG1lbnQgJiYgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImF0dGFjaG1lbnRzVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2U/LnR5cGUgPT09ICdlcnJvcidcIlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiY2xpZW50LWVycm9yLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgICAgICBzdHItY2hhdF9fc2ltcGxlLW1lc3NhZ2UtLWVycm9yLW1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLS1lcnJvci1tZXNzYWdlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbWVzc2FnZT8ubW9kZXJhdGlvbl9kZXRhaWxzXCI+e3tcbiAgICAgICAgICAgICAgICAgIFwic3RyZWFtQ2hhdC5FcnJvciDCtyBVbnNlbnRcIiB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJtZXNzYWdlPy5zdGF0dXMgPT09ICdmYWlsZWQnXCJcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImVycm9yLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgICAgICBzdHItY2hhdF9fc2ltcGxlLW1lc3NhZ2UtLWVycm9yLW1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLS1lcnJvci1tZXNzYWdlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAobWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlID09PSA0MDNcbiAgICAgICAgICAgICAgICAgICAgPyBcInN0cmVhbUNoYXQuTWVzc2FnZSBGYWlsZWQgwrcgVW5hdXRob3JpemVkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcInN0cmVhbUNoYXQuTWVzc2FnZSBGYWlsZWQgwrcgQ2xpY2sgdG8gdHJ5IGFnYWluXCJcbiAgICAgICAgICAgICAgICAgICkgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAjbWVzc2FnZVRleHRFbGVtZW50IGRhdGEtdGVzdGlkPVwidGV4dFwiPlxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2VUZXh0UGFydHM7IGVsc2UgZGVmYXVsdENvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL3VzZS10cmFjay1ieS1mdW5jdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcGFydCBvZiBtZXNzYWdlVGV4dFBhcnRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicGFydC50eXBlID09PSAndGV4dCc7IGVsc2UgbWVudGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInBhcnQuY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21lbnRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRNZW50aW9uIGxldC1jb250ZW50PVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLW1lbnRpb25cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lbnRpb25UZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZW50aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lbnRpb25Db250ZXh0KHBhcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5QXMgPT09ICd0ZXh0JzsgZWxzZSBhc0hUTUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBtZXNzYWdlVGV4dCB8fCBcIlwiIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FzSFRNTFxuICAgICAgICAgICAgICAgICAgICAgID48c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJodG1sLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJtZXNzYWdlVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1lcnJvci1pY29uXCJcbiAgICAgICAgICAgIGljb249XCJlcnJvclwiXG4gICAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVwbHlDb3VudEJ1dHRvbjsgY29udGV4dDogeyBtZXNzYWdlOiBtZXNzYWdlIH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWVzc2FnZURhdGVBbmRTZW5kZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWxldGVkTWVzc2FnZT5cbiAgPGRpdiBkYXRhLXRlc3RpZD1cIm1lc3NhZ2UtZGVsZXRlZC1jb21wb25lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLWRlbGV0ZWQtaW5uZXJcIiB0cmFuc2xhdGU+XG4gICAgICBzdHJlYW1DaGF0LlRoaXMgbWVzc2FnZSB3YXMgZGVsZXRlZC4uLlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3lzdGVtTWVzc2FnZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5zeXN0ZW1NZXNzYWdlVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgIGRlZmF1bHRTeXN0ZW1NZXNzYWdlO1xuICAgICAgY29udGV4dDogZ2V0TWVzc2FnZUNvbnRleHQoKVxuICAgIFwiXG4gID48L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U3lzdGVtTWVzc2FnZSBsZXQtbWVzc2FnZUlucHV0PVwibWVzc2FnZVwiPlxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJzeXN0ZW0tbWVzc2FnZVwiIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1zeXN0ZW1fX3RleHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1zeXN0ZW1fX2xpbmVcIj48L2Rpdj5cbiAgICAgICAgPHA+e3sgbWVzc2FnZUlucHV0Py50ZXh0IH19PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fbGluZVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fZGF0ZVwiPlxuICAgICAgICB7eyBwYXJzZWREYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcXVvdGVkTWVzc2FnZT5cbiAgPGRpdlxuICAgICpuZ0lmPVwibWVzc2FnZT8ucXVvdGVkX21lc3NhZ2VcIlxuICAgIGNsYXNzPVwicXVvdGVkLW1lc3NhZ2Ugc3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLXByZXZpZXdcIlxuICAgIGRhdGEtdGVzdGlkPVwicXVvdGVkLW1lc3NhZ2UtY29udGFpbmVyXCJcbiAgICBbY2xhc3MubWluZV09XCJpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgICAoY2xpY2spPVwiXG4gICAgICBqdW1wVG9NZXNzYWdlKFxuICAgICAgICAobWVzc2FnZT8ucXVvdGVkX21lc3NhZ2UpIS5pZCxcbiAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnBhcmVudF9pZFxuICAgICAgKVxuICAgIFwiXG4gICAgKGtleXVwLmVudGVyKT1cIlxuICAgICAganVtcFRvTWVzc2FnZShcbiAgICAgICAgKG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlKSEuaWQsXG4gICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5wYXJlbnRfaWRcbiAgICAgIClcbiAgICBcIlxuICA+XG4gICAgPHN0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXJcbiAgICAgIGRhdGEtdGVzdGlkPVwicW91dGVkLW1lc3NhZ2UtYXZhdGFyXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fYXZhdGFyLWhvc3Qgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLWF2YXRhclwiXG4gICAgICB0eXBlPVwidXNlclwiXG4gICAgICBsb2NhdGlvbj1cInF1b3RlZC1tZXNzYWdlLXNlbmRlclwiXG4gICAgICBbaW1hZ2VVcmxdPVwibWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnVzZXI/LmltYWdlXCJcbiAgICAgIFtuYW1lXT1cIlxuICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlcj8ubmFtZSB8fCBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlcj8uaWRcbiAgICAgIFwiXG4gICAgICBbdXNlcl09XCJtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlciB8fCB1bmRlZmluZWRcIlxuICAgID48L3N0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXI+XG4gICAgPGRpdiBjbGFzcz1cInF1b3RlZC1tZXNzYWdlLWlubmVyIHN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1idWJibGVcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uYXR0YWNobWVudHMgJiZcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uYXR0YWNobWVudHM/Lmxlbmd0aFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAjZGVmYXVsdEF0dGFjaG1lbnRzXG4gICAgICAgICAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgbGV0LWF0dGFjaG1lbnRzPVwiYXR0YWNobWVudHNcIlxuICAgICAgICAgIGxldC1wYXJlbnRNZXNzYWdlSWQ9XCJwYXJlbnRNZXNzYWdlSWRcIlxuICAgICAgICAgIGxldC1pbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3RyZWFtLWF0dGFjaG1lbnQtbGlzdFxuICAgICAgICAgICAgW21lc3NhZ2VJZF09XCJtZXNzYWdlSWRcIlxuICAgICAgICAgICAgW2F0dGFjaG1lbnRzXT1cImF0dGFjaG1lbnRzXCJcbiAgICAgICAgICAgIFtwYXJlbnRNZXNzYWdlSWRdPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICAgICAgICAgIChpbWFnZU1vZGFsU3RhdGVDaGFuZ2UpPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zdHJlYW0tYXR0YWNobWVudC1saXN0PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmF0dGFjaG1lbnRMaXN0VGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgIGRlZmF1bHRBdHRhY2htZW50cztcbiAgICAgICAgICAgIGNvbnRleHQ6IGdldFF1b3RlZE1lc3NhZ2VBdHRhY2htZW50TGlzdENvbnRleHQoKVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXRlc3RpZD1cInF1b3RlZC1tZXNzYWdlLXRleHRcIlxuICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy50cmFuc2xhdGlvbiB8fFxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5odG1sIHx8XG4gICAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnRleHRcbiAgICAgICAgXCJcbiAgICAgID48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21lc3NhZ2VEYXRlQW5kU2VuZGVyPlxuICA8bmctY29udGFpbmVyPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwic2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3RyYW5zbGF0aW9uLW5vdGljZVwiXG4gICAgICBkYXRhLXRlc3RpZD1cInRyYW5zbGF0aW9uLW5vdGljZVwiXG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9PT0gJ3RyYW5zbGF0aW9uJ1wiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VlLW9yaWdpbmFsXCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgIChjbGljayk9XCJkaXNwbGF5T3JpZ2luYWxNZXNzYWdlKClcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiZGlzcGxheU9yaWdpbmFsTWVzc2FnZSgpXCJcbiAgICAgID5cbiAgICAgICAgc3RyZWFtQ2hhdC5TZWUgb3JpZ2luYWwgKGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZClcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9PT0gJ29yaWdpbmFsJ1wiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VlLXRyYW5zbGF0aW9uXCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgIChjbGljayk9XCJkaXNwbGF5VHJhbnNsYXRlZE1lc3NhZ2UoKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJkaXNwbGF5VHJhbnNsYXRlZE1lc3NhZ2UoKVwiXG4gICAgICA+XG4gICAgICAgIHN0cmVhbUNoYXQuU2VlIHRyYW5zbGF0aW9uXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cImN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuY3VzdG9tTWVzc2FnZU1ldGFkYXRhVGVtcGxhdGUkIHwgYXN5bmNcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fY3VzdG9tLW1lc3NhZ2UtbWV0YWRhdGFcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5jdXN0b21NZXNzYWdlTWV0YWRhdGFUZW1wbGF0ZSQgfCBhc3luYykhO1xuICAgICAgICAgICAgY29udGV4dDogZ2V0TWVzc2FnZU1ldGFkYXRhQ29udGV4dCgpXG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtZGF0YVxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtZGF0YVxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1tZXRhZGF0YVxuICAgICAgXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWVzc2FnZVN0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICA8c3BhblxuICAgICAgICAqbmdJZj1cIiFpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJzZW5kZXJcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1uYW1lIHN0ci1jaGF0X19tZXNzYWdlLXNlbmRlci1uYW1lXCJcbiAgICAgID5cbiAgICAgICAge3sgbWVzc2FnZT8udXNlcj8ubmFtZSA/IG1lc3NhZ2U/LnVzZXI/Lm5hbWUgOiBtZXNzYWdlPy51c2VyPy5pZCB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJkYXRlXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtdGltZXN0YW1wIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS10aW1lXCJcbiAgICAgID5cbiAgICAgICAge3sgcGFyc2VkRGF0ZSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2U/Lm1lc3NhZ2VfdGV4dF91cGRhdGVkX2F0XCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJlZGl0ZWQtZmxhZ1wiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzYWdlLXNpbXBsZS1lZGl0ZWRcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5zdHJlYW1DaGF0LkVkaXRlZDwvc3BhblxuICAgICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImVkaXRlZC10aW1lc3RhbXBcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtZWRpdGVkLXRpbWVzdGFtcFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ3N0ci1jaGF0X19tZXNzYWdlLWVkaXRlZC10aW1lc3RhbXAtLW9wZW4nOiBpc0VkaXRlZEZsYWdPcGVuZWQsXG4gICAgICAgICAgICAnc3RyLWNoYXRfX21lc3NhZ2UtZWRpdGVkLXRpbWVzdGFtcC0tY29sbGFwc2VkJzogIWlzRWRpdGVkRmxhZ09wZW5lZFxuICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPnN0cmVhbUNoYXQuRWRpdGVkPC9zcGFuPlxuICAgICAgICAgIDx0aW1lXG4gICAgICAgICAgICBkYXRlVGltZT1cInt7IG1lc3NhZ2U/Lm1lc3NhZ2VfdGV4dF91cGRhdGVkX2F0IH19XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgbWVzc2FnZT8ubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXQgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHBhc2VkRWRpdGVkRGF0ZSB9fVxuICAgICAgICAgIDwvdGltZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21lc3NhZ2VTdGF0dXM+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cIlxuICAgICAgaXNTZW50QnlDdXJyZW50VXNlciAmJlxuICAgICAgKChpc0xhc3RTZW50TWVzc2FnZSAmJiBtZXNzYWdlPy5zdGF0dXMgPT09ICdyZWNlaXZlZCcpIHx8XG4gICAgICAgIG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ3NlbmRpbmcnKVxuICAgIFwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZT8uc3RhdHVzID09PSAnc2VuZGluZyc7IGVsc2Ugc2VudFN0YXR1c1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbmRpbmdTdGF0dXNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3NlbnRTdGF0dXM+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgbW9kZSA9PT0gJ21haW4nICYmIGlzTWVzc2FnZURlbGl2ZXJlZEFuZFJlYWQgJiYgY2FuRGlzcGxheVJlYWRTdGF0dXM7XG4gICAgICAgICAgZWxzZSBkZWxpdmVyZWRTdGF0dXNcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlYWRTdGF0dXNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNkZWxpdmVyZWRTdGF0dXM+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuZGVsaXZlcmVkU3RhdHVzVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICBkZWZhdWx0RGVsaXZlcmVkU3RhdHVzO1xuICAgICAgICAgIGNvbnRleHQ6IGdldERlbGl2ZXJlZFN0YXR1c0NvbnRleHQoKVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RGVsaXZlcmVkU3RhdHVzPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCJtb2RlID09PSAnbWFpbidcIlxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXNcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzLWFuZ3VsYXJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zdGF0dXNcbiAgICAgICAgXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJkZWxpdmVyZWQtaW5kaWNhdG9yXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW2Zsb2F0VWlMb29zZV09XCJmbG9hdGluZ0NvbnRlbnRcIlxuICAgICAgICBsb29zZVBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgIGxvb3NlVHJpZ2dlcj1cImhvdmVyXCJcbiAgICAgID5cbiAgICAgICAgPGZsb2F0LXVpLWNvbnRlbnQgI2Zsb2F0aW5nQ29udGVudD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX3Rvb2x0aXAgc3RyLWNoYXRfX3Rvb2x0aXAtYW5ndWxhclwiPlxuICAgICAgICAgICAge3sgXCJzdHJlYW1DaGF0LkRlbGl2ZXJlZFwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmxvYXQtdWktY29udGVudD5cbiAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJkZWxpdmVyZWQtaWNvblwiXG4gICAgICAgICAgaWNvbj1cImRlbGl2ZXJlZFwiXG4gICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNzZW5kaW5nU3RhdHVzPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnNlbmRpbmdTdGF0dXNUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgIGRlZmF1bHRTZW5kaW5nU3RhdHVzO1xuICAgICAgICAgIGNvbnRleHQ6IGdldFNlbmRpbmdTdGF0dXNDb250ZXh0KClcbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlbmRpbmdTdGF0dXM+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXNcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzLWFuZ3VsYXJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zdGF0dXNcbiAgICAgICAgXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJzZW5kaW5nLWluZGljYXRvclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFtmbG9hdFVpTG9vc2VdPVwiZmxvYXRpbmdDb250ZW50XCJcbiAgICAgICAgbG9vc2VQbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICBsb29zZVRyaWdnZXI9XCJob3ZlclwiXG4gICAgICAgIFtkaXNhYmxlQW5pbWF0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgW3ByZXZlbnRPdmVyZmxvd109XCJ0cnVlXCJcbiAgICAgICAgW3Bvc2l0aW9uRml4ZWRdPVwidHJ1ZVwiXG4gICAgICA+XG4gICAgICAgIDxmbG9hdC11aS1jb250ZW50ICNmbG9hdGluZ0NvbnRlbnQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIj5cbiAgICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5TZW5kaW5nLi4uXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mbG9hdC11aS1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjcmVhZFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5yZWFkU3RhdHVzVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICBkZWZhdWx0UmVhZFN0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXRSZWFkU3RhdHVzQ29udGV4dCgpXG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSZWFkU3RhdHVzIGxldC1yZWFkQnlUZXh0PVwicmVhZEJ5VGV4dFwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1cy1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc3RhdHVzXG4gICAgICAgIFwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwicmVhZC1pbmRpY2F0b3JcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBbZmxvYXRVaUxvb3NlXT1cImZsb2F0aW5nQ29udGVudFwiXG4gICAgICAgIGxvb3NlUGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgbG9vc2VUcmlnZ2VyPVwiaG92ZXJcIlxuICAgICAgICBbZGlzYWJsZUFuaW1hdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIFtwcmV2ZW50T3ZlcmZsb3ddPVwidHJ1ZVwiXG4gICAgICAgIFtwb3NpdGlvbkZpeGVkXT1cInRydWVcIlxuICAgICAgPlxuICAgICAgICA8ZmxvYXQtdWktY29udGVudCAjZmxvYXRpbmdDb250ZW50PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3Rvb2x0aXAgc3RyLWNoYXRfX3Rvb2x0aXAtYW5ndWxhclwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInJlYWQtYnktdG9vbHRpcFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgcmVhZEJ5VGV4dCB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zsb2F0LXVpLWNvbnRlbnQ+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwicmVhZFwiPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JlcGx5Q291bnRCdXR0b24+XG4gIDxkaXZcbiAgICBjbGFzcz1cIlxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXJlcGx5LWJ1dHRvblxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtcmVwbGllcy1jb3VudC1idXR0b24td3JhcHBlclxuICAgIFwiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cInNob3VsZERpc3BsYXlUaHJlYWRMaW5rXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVwbGllcy1jb3VudC1idXR0b25cIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJyZXBseS1jb3VudC1idXR0b25cIlxuICAgICAgKGNsaWNrKT1cInNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSgpXCJcbiAgICA+XG4gICAgICB7e21lc3NhZ2U/LnJlcGx5X2NvdW50ID09PSAxID8gKCdzdHJlYW1DaGF0LjEgcmVwbHknIHwgdHJhbnNsYXRlKSA6ICgnc3RyZWFtQ2hhdC57eyByZXBseUNvdW50IH19XG4gICAgICByZXBsaWVzJyB8IHRyYW5zbGF0ZTpyZXBseUNvdW50UGFyYW0pfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2F0dGFjaG1lbnRzVGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZVxuICAgICNkZWZhdWx0QXR0YWNobWVudHNcbiAgICBsZXQtbWVzc2FnZUlkPVwibWVzc2FnZUlkXCJcbiAgICBsZXQtYXR0YWNobWVudHM9XCJhdHRhY2htZW50c1wiXG4gICAgbGV0LXBhcmVudE1lc3NhZ2VJZD1cInBhcmVudE1lc3NhZ2VJZFwiXG4gICAgbGV0LWltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXI9XCJpbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyXCJcbiAgPlxuICAgIDxzdHJlYW0tYXR0YWNobWVudC1saXN0XG4gICAgICBbbWVzc2FnZUlkXT1cIm1lc3NhZ2VJZFwiXG4gICAgICBbYXR0YWNobWVudHNdPVwiYXR0YWNobWVudHNcIlxuICAgICAgW3BhcmVudE1lc3NhZ2VJZF09XCJwYXJlbnRNZXNzYWdlSWRcIlxuICAgICAgKGltYWdlTW9kYWxTdGF0ZUNoYW5nZSk9XCJpbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAgID48L3N0cmVhbS1hdHRhY2htZW50LWxpc3Q+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuYXR0YWNobWVudExpc3RUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgZGVmYXVsdEF0dGFjaG1lbnRzO1xuICAgICAgY29udGV4dDogZ2V0QXR0YWNobWVudExpc3RDb250ZXh0KClcbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|