stream-chat-angular 5.1.10 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/version.d.ts +1 -1
- package/esm2020/assets/version.mjs +2 -2
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +3 -3
- package/esm2020/lib/channel-header/channel-header.component.mjs +3 -3
- package/esm2020/lib/channel-list/channel-list.component.mjs +3 -3
- package/esm2020/lib/channel-preview/channel-preview.component.mjs +3 -3
- package/esm2020/lib/channel.service.mjs +3 -1
- package/esm2020/lib/chat-client.service.mjs +1 -1
- package/esm2020/lib/message/message.component.mjs +12 -5
- package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +3 -3
- package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +3 -3
- package/esm2020/lib/message-input/message-input.component.mjs +3 -3
- package/esm2020/lib/message-input/textarea/textarea.component.mjs +3 -3
- package/esm2020/lib/message-list/message-list.component.mjs +3 -3
- package/esm2020/lib/message-reactions/message-reactions.component.mjs +72 -80
- package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +3 -3
- package/esm2020/lib/message-reactions.service.mjs +30 -4
- package/esm2020/lib/notification-list/notification-list.component.mjs +3 -3
- package/esm2020/lib/paginated-list/paginated-list.component.mjs +94 -0
- package/esm2020/lib/stream-chat.module.mjs +13 -3
- package/esm2020/lib/types.mjs +1 -1
- package/esm2020/lib/user-list/user-list.component.mjs +47 -0
- package/esm2020/lib/voice-recording/voice-recording.component.mjs +3 -3
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/stream-chat-angular.mjs +290 -116
- package/fesm2015/stream-chat-angular.mjs.map +1 -1
- package/fesm2020/stream-chat-angular.mjs +275 -107
- package/fesm2020/stream-chat-angular.mjs.map +1 -1
- package/lib/channel.service.d.ts +7 -2
- package/lib/message-reactions/message-reactions.component.d.ts +19 -11
- package/lib/message-reactions.service.d.ts +14 -2
- package/lib/paginated-list/paginated-list.component.d.ts +42 -0
- package/lib/stream-chat.module.d.ts +7 -5
- package/lib/types.d.ts +11 -2
- package/lib/user-list/user-list.component.d.ts +30 -0
- package/package.json +2 -2
- package/public-api.d.ts +2 -0
- package/src/assets/styles/css/index.css +2 -2
- package/src/assets/styles/css/index.layout.css +1 -1
- package/src/assets/styles/scss/MessageActionsBox/MessageActionsBox-theme.scss +8 -0
- package/src/assets/styles/scss/MessageReactions/MessageReactionsSelector-theme.scss +6 -0
- package/src/assets/styles/scss/_base.scss +31 -0
- package/src/assets/version.ts +1 -1
|
@@ -144,8 +144,8 @@ export class MessageComponent {
|
|
|
144
144
|
this.hasAttachment =
|
|
145
145
|
!!this.message?.attachments && !!this.message.attachments.length;
|
|
146
146
|
this.hasReactions =
|
|
147
|
-
!!this.message?.
|
|
148
|
-
Object.keys(this.message.
|
|
147
|
+
!!this.message?.reaction_groups &&
|
|
148
|
+
Object.keys(this.message.reaction_groups).length > 0;
|
|
149
149
|
this.replyCountParam = { replyCount: this.message?.reply_count };
|
|
150
150
|
}
|
|
151
151
|
if (changes.enabledMessageActions) {
|
|
@@ -281,6 +281,7 @@ export class MessageComponent {
|
|
|
281
281
|
latestReactions: this.message?.latest_reactions || [],
|
|
282
282
|
messageId: this.message?.id,
|
|
283
283
|
ownReactions: this.message?.own_reactions || [],
|
|
284
|
+
messageReactionGroups: this.message?.reaction_groups || {},
|
|
284
285
|
};
|
|
285
286
|
}
|
|
286
287
|
messageClicked() {
|
|
@@ -459,6 +460,12 @@ export class MessageComponent {
|
|
|
459
460
|
}
|
|
460
461
|
else {
|
|
461
462
|
this.shouldPreventMessageMenuClose = !options.fromTouch;
|
|
463
|
+
// Fix for iOS Safari: iOS Safari won't close the input if we open message menu
|
|
464
|
+
// The virtual keyboard can hide parts of the message menu, so we close the input here
|
|
465
|
+
if (document.activeElement &&
|
|
466
|
+
typeof document.activeElement.blur !==
|
|
467
|
+
'undefined')
|
|
468
|
+
document.activeElement.blur();
|
|
462
469
|
this.messageMenuTrigger?.show();
|
|
463
470
|
}
|
|
464
471
|
if (this.isViewInited) {
|
|
@@ -483,10 +490,10 @@ export class MessageComponent {
|
|
|
483
490
|
}
|
|
484
491
|
}
|
|
485
492
|
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]=\"\n messageActionsService.customActionClickHandler ? 'none' : 'click'\n \"\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]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"true\"\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]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"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]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"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 });
|
|
493
|
+
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=\"str-chat__message-actions-container str-chat__message-simple__actions__action str-chat__message-simple__actions__action--options\"\n [floatUiLoose]=\"messageMenuFloat\"\n [looseTrigger]=\"\n messageActionsService.customActionClickHandler ? 'none' : 'click'\n \"\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 let-messageReactionGroups=\"messageReactionGroups\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n [messageReactionGroups]=\"messageReactionGroups\"\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=\"str-chat__message-text-inner str-chat__message-simple-text-inner\"\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=\"str-chat__simple-message--error-message str-chat__message--error-message\"\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=\"str-chat__simple-message--error-message str-chat__message--error-message\"\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=\"str-chat__message-data str-chat__message-simple-data str-chat__message-metadata\"\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=\"str-chat__message-simple-status str-chat__message-simple-status-angular str-chat__message-status\"\n data-testid=\"delivered-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n [looseTrigger]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"true\"\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=\"str-chat__message-simple-status str-chat__message-simple-status-angular str-chat__message-status\"\n data-testid=\"sending-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n [looseTrigger]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"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=\"str-chat__message-simple-status str-chat__message-simple-status-angular str-chat__message-status\"\n data-testid=\"read-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n [looseTrigger]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"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=\"str-chat__message-simple-reply-button str-chat__message-replies-count-button-wrapper\"\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", "messageReactionGroups", "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 });
|
|
487
494
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageComponent, decorators: [{
|
|
488
495
|
type: Component,
|
|
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]=\"\n messageActionsService.customActionClickHandler ? 'none' : 'click'\n \"\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]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"true\"\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]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"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]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"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" }]
|
|
496
|
+
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=\"str-chat__message-actions-container str-chat__message-simple__actions__action str-chat__message-simple__actions__action--options\"\n [floatUiLoose]=\"messageMenuFloat\"\n [looseTrigger]=\"\n messageActionsService.customActionClickHandler ? 'none' : 'click'\n \"\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 let-messageReactionGroups=\"messageReactionGroups\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n [messageReactionGroups]=\"messageReactionGroups\"\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=\"str-chat__message-text-inner str-chat__message-simple-text-inner\"\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=\"str-chat__simple-message--error-message str-chat__message--error-message\"\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=\"str-chat__simple-message--error-message str-chat__message--error-message\"\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=\"str-chat__message-data str-chat__message-simple-data str-chat__message-metadata\"\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=\"str-chat__message-simple-status str-chat__message-simple-status-angular str-chat__message-status\"\n data-testid=\"delivered-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n [looseTrigger]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"true\"\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=\"str-chat__message-simple-status str-chat__message-simple-status-angular str-chat__message-status\"\n data-testid=\"sending-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n [looseTrigger]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"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=\"str-chat__message-simple-status str-chat__message-simple-status-angular str-chat__message-status\"\n data-testid=\"read-indicator\"\n tabindex=\"0\"\n [floatUiLoose]=\"floatingContent\"\n loosePlacement=\"top\"\n [looseTrigger]=\"hasTouchSupport ? 'click' : 'hover'\"\n [disableAnimation]=\"true\"\n [hideOnClickOutside]=\"true\"\n [positionFixed]=\"true\"\n [preventOverflow]=\"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=\"str-chat__message-simple-reply-button str-chat__message-replies-count-button-wrapper\"\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
497
|
}], 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: [{
|
|
491
498
|
type: Input
|
|
492
499
|
}], enabledMessageActions: [{
|
|
@@ -512,4 +519,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
|
|
|
512
519
|
type: ViewChild,
|
|
513
520
|
args: ['messageBubble']
|
|
514
521
|
}] } });
|
|
515
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS9tZXNzYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlL21lc3NhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBTUwsdUJBQXVCLEVBRXZCLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQWlCdkIsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBNEIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZTFDOztHQUVHO0FBT0gsTUFBTSxPQUFPLGdCQUFnQjtJQXVFM0IsWUFDVSxpQkFBb0MsRUFDcEMsY0FBOEIsRUFDL0Isc0JBQThDLEVBQzdDLEtBQXdCLEVBQ3hCLFVBQTZCLEVBQzdCLGNBQThCLEVBQy9CLHFCQUE0QyxFQUMzQyxNQUFjO1FBUGQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM3QyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0IsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUMzQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBeEV4Qjs7V0FFRztRQUNNLDBCQUFxQixHQUFhLEVBQUUsQ0FBQztRQUs5Qzs7V0FFRztRQUNNLFNBQUksR0FB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QkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBRUksa0JBQWtCO3NCQUFsRCxTQUFTO3VCQUFDLG9CQUFvQjtnQkFDSCxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF0dGFjaG1lbnQsIFVzZXJSZXNwb25zZSB9IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IENoYW5uZWxTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhbm5lbC5zZXJ2aWNlJztcbmltcG9ydCB7IENoYXRDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhdC1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQge1xuICBBdHRhY2htZW50TGlzdENvbnRleHQsXG4gIE1lbnRpb25UZW1wbGF0ZUNvbnRleHQsXG4gIE1lc3NhZ2VBY3Rpb25zQm94Q29udGV4dCxcbiAgTWVzc2FnZVJlYWN0aW9uc0NvbnRleHQsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIFN0cmVhbU1lc3NhZ2UsXG4gIERlbGl2ZXJlZFN0YXR1c0NvbnRleHQsXG4gIFNlbmRpbmdTdGF0dXNDb250ZXh0LFxuICBSZWFkU3RhdHVzQ29udGV4dCxcbiAgU3lzdGVtTWVzc2FnZUNvbnRleHQsXG4gIEN1c3RvbU1ldGFkYXRhQ29udGV4dCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGVtb2ppUmVnZXggZnJvbSAnZW1vamktcmVnZXgnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IGxpc3RVc2VycyB9IGZyb20gJy4uL2xpc3QtdXNlcnMnO1xuaW1wb3J0IHsgRGF0ZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuLi9kYXRlLXBhcnNlci5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2VBY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2UtYWN0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIE5neEZsb2F0VWlDb250ZW50Q29tcG9uZW50LFxuICBOZ3hGbG9hdFVpTG9vc2VEaXJlY3RpdmUsXG59IGZyb20gJ25neC1mbG9hdC11aSc7XG5cbnR5cGUgTWVzc2FnZVBhcnQgPSB7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgdHlwZTogJ3RleHQnIHwgJ21lbnRpb24nO1xuICB1c2VyPzogVXNlclJlc3BvbnNlO1xufTtcblxuLyoqXG4gKiBUaGUgYE1lc3NhZ2VgIGNvbXBvbmVudCBkaXNwbGF5cyBhIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgc2VuZGVyIGFuZCBkYXRlLCBhbmQgZW5hYmxlcyBbaW50ZXJhY3Rpb24gd2l0aCB0aGUgbWVzc2FnZSAoaS5lLiBlZGl0IG9yIHJlYWN0KV0oLi4vY29uY2VwdHMvbWVzc2FnZS1pbnRlcmFjdGlvbnMubWR4KS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLW1lc3NhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgW2NoYW5uZWwgY2FwYWJpbGl0aWVzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9jaGFubmVsX2NhcGFiaWxpdGllcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgdGhhdCBhcmUgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgdXNlciwgdGhlIGxpc3Qgb2YgW3N1cHBvcnRlZCBpbnRlcmFjdGlvbnNdKC4uL2NvbmNlcHRzL21lc3NhZ2UtaW50ZXJhY3Rpb25zLm1keCkgY2FuIGJlIGZvdW5kIGluIG91ciBtZXNzYWdlIGludGVyYWN0aW9uIGd1aWRlLiBVbmF0aG9yaXplZCBhY3Rpb25zIHdvbid0IGJlIGRpc3BsYXllZCBvbiB0aGUgVUkuIFRoZSBbYE1lc3NhZ2VMaXN0YF0oLi9NZXNzYWdlTGlzdENvbXBvbmVudC5tZHgpIGNvbXBvbmVudCBhdXRvbWF0aWNhbGx5IHNldHMgdGhpcyBiYXNlZCBvbiBbY2hhbm5lbCBjYXBhYmlsaXRpZXNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2NoYW5uZWxfY2FwYWJpbGl0aWVzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZWRNZXNzYWdlQWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIG1lc3NhZ2Ugc3RhdHVzIChzZW5kaW5nLCBzZW50LCB3aG8gcmVhZCB0aGUgbWVzc2FnZSkgaXMgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgaXNMYXN0U2VudE1lc3NhZ2U6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBtZXNzYWdlIGlzIGJlaW5nIGRpc3BhbHllZCBpbiBhIGNoYW5uZWwgb3IgaW4gYSBbdGhyZWFkXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC90aHJlYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGU6ICd0aHJlYWQnIHwgJ21haW4nID0gJ21haW4nO1xuICAvKipcbiAgICogSGlnaGxpZ2h0aW5nIGlzIHVzZWQgdG8gYWRkIHZpc3VhbCBlbXBoYXNpemUgdG8gYSBtZXNzYWdlIHdoZW4ganVtcGluZyB0byB0aGUgbWVzc2FnZVxuICAgKi9cbiAgQElucHV0KCkgaXNIaWdobGlnaHRlZCA9IGZhbHNlO1xuICAvKipcbiAgICogQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIG1lc3NhZ2UgbGlzdCBpcyBzY3JvbGxlZCwgaXQncyB1c2VkIHRvIHByZXZlbnQgb3BlbmluZyB0aGUgbWVzc2FnZSBtZW51IHdoaWxlIHNjcm9sbCBpcyBpbiBwcm9ncmVzc1xuICAgKi9cbiAgQElucHV0KCkgc2Nyb2xsJD86IE9ic2VydmFibGU8dm9pZD47XG4gIGNhblJlY2VpdmVSZWFkRXZlbnRzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBjYW5SZWFjdFRvTWVzc2FnZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgaXNFZGl0ZWRGbGFnT3BlbmVkID0gZmFsc2U7XG4gIG1lc3NhZ2VUZXh0UGFydHM6IE1lc3NhZ2VQYXJ0W10gfCB1bmRlZmluZWQgPSBbXTtcbiAgbWVzc2FnZVRleHQ/OiBzdHJpbmc7XG4gIHNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZSA9IGZhbHNlO1xuICBkaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQ6ICdvcmlnaW5hbCcgfCAndHJhbnNsYXRpb24nID0gJ29yaWdpbmFsJztcbiAgaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZTogJ29wZW5lZCcgfCAnY2xvc2VkJyA9ICdjbG9zZWQnO1xuICBzaG91bGREaXNwbGF5VGhyZWFkTGluayA9IGZhbHNlO1xuICBpc1NlbnRCeUN1cnJlbnRVc2VyID0gZmFsc2U7XG4gIHJlYWRCeVRleHQgPSAnJztcbiAgZGlzcGxheUFzOiAndGV4dCcgfCAnaHRtbCc7XG4gIGxhc3RSZWFkVXNlcjogVXNlclJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBpc09ubHlSZWFkQnlNZSA9IGZhbHNlO1xuICBpc1JlYWRCeU11bHRpcGxlVXNlcnMgPSBmYWxzZTtcbiAgaXNNZXNzYWdlRGVsaXZlcmVkQW5kUmVhZCA9IGZhbHNlO1xuICBwYXJzZWREYXRlID0gJyc7XG4gIHBhc2VkRWRpdGVkRGF0ZSA9ICcnO1xuICBhcmVPcHRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICBoYXNBdHRhY2htZW50ID0gZmFsc2U7XG4gIGhhc1JlYWN0aW9ucyA9IGZhbHNlO1xuICByZXBseUNvdW50UGFyYW06IHsgcmVwbHlDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkIH0gPSB7XG4gICAgcmVwbHlDb3VudDogdW5kZWZpbmVkLFxuICB9O1xuICBhcmVNZXNzYWdlT3B0aW9uc09wZW4gPSBmYWxzZTtcbiAgY2FuRGlzcGxheVJlYWRTdGF0dXMgPSBmYWxzZTtcbiAgaGFzVG91Y2hTdXBwb3J0ID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDA7XG4gIHByaXZhdGUgcXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRzOiBBdHRhY2htZW50W10gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB1c2VySWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsUmVnZXhwID1cbiAgICAvKD86KD86aHR0cHM/fGZ0cHxmaWxlKTpcXC9cXC98d3d3XFwufGZ0cFxcLikoPzpcXChbLUEtWjAtOSsmQCMvJT1+X3wkPyE6LC5dKlxcKXxbLUEtWjAtOSsmQCMvJT1+X3wkPyE6LC5dKSooPzpcXChbLUEtWjAtOSsmQCMvJT1+X3wkPyE6LC5dKlxcKXxbQS1aMC05KyZAIy8lPX5ffCRdKS9naW07XG4gIHByaXZhdGUgZW1vamlSZWdleHAgPSBuZXcgUmVnRXhwKGVtb2ppUmVnZXgoKSwgJ2cnKTtcbiAgQFZpZXdDaGlsZCgnbWVzc2FnZU1lbnVUcmlnZ2VyJylcbiAgbWVzc2FnZU1lbnVUcmlnZ2VyITogTmd4RmxvYXRVaUxvb3NlRGlyZWN0aXZlO1xuICBAVmlld0NoaWxkKCdtZXNzYWdlTWVudUZsb2F0JylcbiAgbWVzc2FnZU1lbnVGbG9hdCE6IE5neEZsb2F0VWlDb250ZW50Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdtZXNzYWdlVGV4dEVsZW1lbnQnKSBtZXNzYWdlVGV4dEVsZW1lbnQ/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnbWVzc2FnZUJ1YmJsZScpIG1lc3NhZ2VCdWJibGU/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSBzaG93TWVzc2FnZU1lbnVUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgc2hvdWxkUHJldmVudE1lc3NhZ2VNZW51Q2xvc2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHB1YmxpYyBjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlOiBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZGF0ZVBhcnNlcjogRGF0ZVBhcnNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHVibGljIG1lc3NhZ2VBY3Rpb25zU2VydmljZTogTWVzc2FnZUFjdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgdGhpcy5kaXNwbGF5QXMgPSB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmRpc3BsYXlBcztcbiAgfVxuXG4gIGdldCB2aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQ7XG4gIH1cblxuICBzZXQgdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQoY291bnQ6IG51bWJlcikge1xuICAgIHRoaXMuX3Zpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID0gY291bnQ7XG4gICAgaWYgKHRoaXMuYXJlT3B0aW9uc1Zpc2libGUgJiYgdGhpcy5fdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPT09IDApIHtcbiAgICAgIHRoaXMuYXJlT3B0aW9uc1Zpc2libGUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UudXNlciQuc3Vic2NyaWJlKCh1KSA9PiB7XG4gICAgICAgIGlmICh1Py5pZCAhPT0gdGhpcy51c2VySWQpIHtcbiAgICAgICAgICB0aGlzLnVzZXJJZCA9IHU/LmlkO1xuICAgICAgICAgIHRoaXMuc2V0SXNTZW50QnlDdXJyZW50VXNlcigpO1xuICAgICAgICAgIHRoaXMuc2V0TGFzdFJlYWRVc2VyKCk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbnMkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2UpIHtcbiAgICAgICAgICBjb25zdCBudW1iZXJPZkVuYWJsZWRBY3Rpb25zID1cbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmdldEF1dGhvcml6ZWRNZXNzYWdlQWN0aW9uc0NvdW50KFxuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmIChudW1iZXJPZkVuYWJsZWRBY3Rpb25zICE9PSB0aGlzLnZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID0gbnVtYmVyT2ZFbmFibGVkQWN0aW9ucztcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlKSB7XG4gICAgICB0aGlzLnNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPSAnb3JpZ2luYWwnO1xuICAgICAgdGhpcy5jcmVhdGVNZXNzYWdlUGFydHMoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQXR0YWNobWVudHMgPSB0aGlzLm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5hdHRhY2htZW50cztcbiAgICAgIHRoaXMucXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRzID1cbiAgICAgICAgb3JpZ2luYWxBdHRhY2htZW50cyAmJiBvcmlnaW5hbEF0dGFjaG1lbnRzLmxlbmd0aFxuICAgICAgICAgID8gW29yaWdpbmFsQXR0YWNobWVudHNbMF1dXG4gICAgICAgICAgOiBbXTtcbiAgICAgIHRoaXMuc2V0SXNTZW50QnlDdXJyZW50VXNlcigpO1xuICAgICAgdGhpcy5zZXRMYXN0UmVhZFVzZXIoKTtcbiAgICAgIHRoaXMucmVhZEJ5VGV4dCA9IHRoaXMubWVzc2FnZT8ucmVhZEJ5XG4gICAgICAgID8gbGlzdFVzZXJzKHRoaXMubWVzc2FnZS5yZWFkQnkpXG4gICAgICAgIDogJyc7XG4gICAgICB0aGlzLmlzT25seVJlYWRCeU1lID0gISEoXG4gICAgICAgIHRoaXMubWVzc2FnZSAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5ICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkubGVuZ3RoID09PSAwXG4gICAgICApO1xuICAgICAgdGhpcy5pc1JlYWRCeU11bHRpcGxlVXNlcnMgPSAhIShcbiAgICAgICAgdGhpcy5tZXNzYWdlICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeS5sZW5ndGggPiAxXG4gICAgICApO1xuICAgICAgdGhpcy5pc01lc3NhZ2VEZWxpdmVyZWRBbmRSZWFkID0gISEoXG4gICAgICAgIHRoaXMubWVzc2FnZSAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5ICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5zdGF0dXMgPT09ICdyZWNlaXZlZCcgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgdGhpcy5wYXJzZWREYXRlID1cbiAgICAgICAgKHRoaXMubWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGVkX2F0ICYmXG4gICAgICAgICAgdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZVRpbWUodGhpcy5tZXNzYWdlLmNyZWF0ZWRfYXQpKSB8fFxuICAgICAgICAnJztcbiAgICAgIHRoaXMucGFzZWRFZGl0ZWREYXRlID1cbiAgICAgICAgKHRoaXMubWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMubWVzc2FnZS5tZXNzYWdlX3RleHRfdXBkYXRlZF9hdCAmJlxuICAgICAgICAgIHRoaXMuZGF0ZVBhcnNlci5wYXJzZURhdGVUaW1lKFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy5tZXNzYWdlLm1lc3NhZ2VfdGV4dF91cGRhdGVkX2F0KVxuICAgICAgICAgICkpIHx8XG4gICAgICAgICcnO1xuICAgICAgdGhpcy5oYXNBdHRhY2htZW50ID1cbiAgICAgICAgISF0aGlzLm1lc3NhZ2U/LmF0dGFjaG1lbnRzICYmICEhdGhpcy5tZXNzYWdlLmF0dGFjaG1lbnRzLmxlbmd0aDtcbiAgICAgIHRoaXMuaGFzUmVhY3Rpb25zID1cbiAgICAgICAgISF0aGlzLm1lc3NhZ2U/LnJlYWN0aW9uX2NvdW50cyAmJlxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLm1lc3NhZ2UucmVhY3Rpb25fY291bnRzKS5sZW5ndGggPiAwO1xuICAgICAgdGhpcy5yZXBseUNvdW50UGFyYW0gPSB7IHJlcGx5Q291bnQ6IHRoaXMubWVzc2FnZT8ucmVwbHlfY291bnQgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zKSB7XG4gICAgICB0aGlzLmNhblJlYWN0VG9NZXNzYWdlID1cbiAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMuaW5kZXhPZignc2VuZC1yZWFjdGlvbicpICE9PSAtMTtcbiAgICAgIHRoaXMuY2FuUmVjZWl2ZVJlYWRFdmVudHMgPVxuICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdyZWFkLWV2ZW50cycpICE9PSAtMTtcbiAgICAgIHRoaXMuY2FuRGlzcGxheVJlYWRTdGF0dXMgPVxuICAgICAgICB0aGlzLmNhblJlY2VpdmVSZWFkRXZlbnRzICE9PSBmYWxzZSAmJlxuICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdyZWFkLWV2ZW50cycpICE9PSAtMTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZSB8fCBjaGFuZ2VzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyB8fCBjaGFuZ2VzLm1vZGUpIHtcbiAgICAgIHRoaXMuc2hvdWxkRGlzcGxheVRocmVhZExpbmsgPVxuICAgICAgICAhIXRoaXMubWVzc2FnZT8ucmVwbHlfY291bnQgJiYgdGhpcy5tb2RlICE9PSAndGhyZWFkJztcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZSB8fCBjaGFuZ2VzLm1vZGUgfHwgY2hhbmdlcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMpIHtcbiAgICAgIHRoaXMuYXJlT3B0aW9uc1Zpc2libGUgPSB0aGlzLm1lc3NhZ2VcbiAgICAgICAgPyAhKFxuICAgICAgICAgICAgIXRoaXMubWVzc2FnZS50eXBlIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UudHlwZSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnR5cGUgPT09ICdzeXN0ZW0nIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UudHlwZSA9PT0gJ2RlbGV0ZWQnIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UudHlwZSA9PT0gJ2VwaGVtZXJhbCcgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS5zdGF0dXMgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc3RhdHVzID09PSAnc2VuZGluZycgfHxcbiAgICAgICAgICAgICh0aGlzLm1vZGUgPT09ICd0aHJlYWQnICYmICF0aGlzLm1lc3NhZ2UucGFyZW50X2lkKSB8fFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLmRlbGV0ZWRfYXQgfHxcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmxlbmd0aCA9PT0gMFxuICAgICAgICAgIClcbiAgICAgICAgOiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZSB8fCBjaGFuZ2VzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucykge1xuICAgICAgaWYgKHRoaXMubWVzc2FnZSkge1xuICAgICAgICB0aGlzLnZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID1cbiAgICAgICAgICB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5nZXRBdXRob3JpemVkTWVzc2FnZUFjdGlvbnNDb3VudChcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSxcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVmlld0luaXRlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuaGFzVG91Y2hTdXBwb3J0ICYmIHRoaXMubWVzc2FnZUJ1YmJsZT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTWVudVRyaWdnZXJFdmVudEhhbmRsZXJzKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIG1vdXNlUHVzaGVkRG93bihldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmhhc1RvdWNoU3VwcG9ydCB8fFxuICAgICAgZXZlbnQuYnV0dG9uICE9PSAwIHx8XG4gICAgICAhdGhpcy5hcmVPcHRpb25zVmlzaWJsZVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0TWVzc2FnZU1lbnVTaG93VGltZXIoeyBmcm9tVG91Y2g6IGZhbHNlIH0pO1xuICB9XG5cbiAgbW91c2VSZWxlYXNlZCgpIHtcbiAgICB0aGlzLnN0b3BNZXNzYWdlTWVudVNob3dUaW1lcigpO1xuICB9XG5cbiAgdG91Y2hTdGFydGVkKCkge1xuICAgIGlmICghdGhpcy5hcmVPcHRpb25zVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0TWVzc2FnZU1lbnVTaG93VGltZXIoeyBmcm9tVG91Y2g6IHRydWUgfSk7XG4gIH1cblxuICB0b3VjaEVuZGVkKCkge1xuICAgIHRoaXMuc3RvcE1lc3NhZ2VNZW51U2hvd1RpbWVyKCk7XG4gIH1cblxuICBtZXNzYWdlQnViYmxlQ2xpY2tlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaGFzVG91Y2hTdXBwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZFByZXZlbnRNZXNzYWdlTWVudUNsb3NlKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuc2hvdWxkUHJldmVudE1lc3NhZ2VNZW51Q2xvc2UgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXJlTWVzc2FnZU9wdGlvbnNPcGVuKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VNZW51VHJpZ2dlcj8uaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIG1lc3NhZ2VPcHRpb25zQnV0dG9uQ2xpY2tlZCgpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9uQ2xpY2tIYW5kbGVyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25DbGlja0hhbmRsZXIoe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICAgIGVuYWJsZWRBY3Rpb25zOiB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgICAgY3VzdG9tQWN0aW9uczogdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9ucyQuZ2V0VmFsdWUoKSxcbiAgICAgICAgaXNNaW5lOiB0aGlzLmlzU2VudEJ5Q3VycmVudFVzZXIsXG4gICAgICAgIG1lc3NhZ2VUZXh0SHRtbEVsZW1lbnQ6IHRoaXMubWVzc2FnZVRleHRFbGVtZW50Py5uYXRpdmVFbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXJlTWVzc2FnZU9wdGlvbnNPcGVuID0gIXRoaXMuYXJlTWVzc2FnZU9wdGlvbnNPcGVuO1xuICAgIH1cbiAgfVxuXG4gIG1lc3NhZ2VBY3Rpb25zQm94Q2xpY2tlZChmbG9hdGluZ0NvbnRlbnQ6IE5neEZsb2F0VWlDb250ZW50Q29tcG9uZW50KSB7XG4gICAgZmxvYXRpbmdDb250ZW50LmhpZGUoKTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRMaXN0Q29udGV4dCgpOiBBdHRhY2htZW50TGlzdENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlSWQ6IHRoaXMubWVzc2FnZT8uaWQgfHwgJycsXG4gICAgICBhdHRhY2htZW50czogdGhpcy5tZXNzYWdlPy5hdHRhY2htZW50cyB8fCBbXSxcbiAgICAgIHBhcmVudE1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5wYXJlbnRfaWQsXG4gICAgICBpbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyOiAoc3RhdGUpID0+XG4gICAgICAgICh0aGlzLmltYWdlQXR0YWNobWVudE1vZGFsU3RhdGUgPSBzdGF0ZSksXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VDb250ZXh0KCk6IFN5c3RlbU1lc3NhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgIGlzSGlnaGxpZ2h0ZWQ6IHRoaXMuaXNIaWdobGlnaHRlZCxcbiAgICAgIGlzTGFzdFNlbnRNZXNzYWdlOiB0aGlzLmlzTGFzdFNlbnRNZXNzYWdlLFxuICAgICAgbW9kZTogdGhpcy5tb2RlLFxuICAgICAgY3VzdG9tQWN0aW9uczogdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9ucyQuZ2V0VmFsdWUoKSxcbiAgICAgIHBhcnNlZERhdGU6IHRoaXMucGFyc2VkRGF0ZSxcbiAgICAgIHNjcm9sbCQ6IHRoaXMuc2Nyb2xsJCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0UXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRMaXN0Q29udGV4dCgpOiBBdHRhY2htZW50TGlzdENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlSWQ6IHRoaXMubWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LmlkIHx8ICcnLFxuICAgICAgYXR0YWNobWVudHM6IHRoaXMucXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRzISxcbiAgICAgIHBhcmVudE1lc3NhZ2VJZDogdGhpcz8ubWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnBhcmVudF9pZCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TWVzc2FnZVJlYWN0aW9uc0NvbnRleHQoKTogTWVzc2FnZVJlYWN0aW9uc0NvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlUmVhY3Rpb25Db3VudHM6IHRoaXMubWVzc2FnZT8ucmVhY3Rpb25fY291bnRzIHx8IHt9LFxuICAgICAgbGF0ZXN0UmVhY3Rpb25zOiB0aGlzLm1lc3NhZ2U/LmxhdGVzdF9yZWFjdGlvbnMgfHwgW10sXG4gICAgICBtZXNzYWdlSWQ6IHRoaXMubWVzc2FnZT8uaWQsXG4gICAgICBvd25SZWFjdGlvbnM6IHRoaXMubWVzc2FnZT8ub3duX3JlYWN0aW9ucyB8fCBbXSxcbiAgICB9O1xuICB9XG5cbiAgbWVzc2FnZUNsaWNrZWQoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5tZXNzYWdlPy5zdGF0dXMgPT09ICdmYWlsZWQnICYmXG4gICAgICB0aGlzLm1lc3NhZ2U/LmVycm9yU3RhdHVzQ29kZSAhPT0gNDAzXG4gICAgKSB7XG4gICAgICB0aGlzLnJlc2VuZE1lc3NhZ2UoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5tZXNzYWdlPy50eXBlID09PSAnZXJyb3InICYmXG4gICAgICB0aGlzLm1lc3NhZ2U/Lm1vZGVyYXRpb25fZGV0YWlsc1xuICAgICkge1xuICAgICAgdGhpcy5vcGVuTWVzc2FnZUJvdW5jZVByb21wdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRWRpdGVkRmxhZ09wZW5lZCA9ICF0aGlzLmlzRWRpdGVkRmxhZ09wZW5lZDtcbiAgICB9XG4gIH1cblxuICByZXNlbmRNZXNzYWdlKCkge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5yZXNlbmRNZXNzYWdlKHRoaXMubWVzc2FnZSEpO1xuICB9XG5cbiAgc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKCkge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5zZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UodGhpcy5tZXNzYWdlKTtcbiAgfVxuXG4gIGdldE1lbnRpb25Db250ZXh0KG1lc3NhZ2VQYXJ0OiBNZXNzYWdlUGFydCk6IE1lbnRpb25UZW1wbGF0ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBtZXNzYWdlUGFydC5jb250ZW50LFxuICAgICAgdXNlcjogbWVzc2FnZVBhcnQudXNlciEsXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VBY3Rpb25zQm94Q29udGV4dCgpOiBNZXNzYWdlQWN0aW9uc0JveENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBpc01pbmU6IHRoaXMuaXNTZW50QnlDdXJyZW50VXNlcixcbiAgICAgIGVuYWJsZWRBY3Rpb25zOiB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG1lc3NhZ2VUZXh0SHRtbEVsZW1lbnQ6IHRoaXMubWVzc2FnZVRleHRFbGVtZW50Py5uYXRpdmVFbGVtZW50LFxuICAgIH07XG4gIH1cblxuICBnZXREZWxpdmVyZWRTdGF0dXNDb250ZXh0KCk6IERlbGl2ZXJlZFN0YXR1c0NvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UhLFxuICAgIH07XG4gIH1cblxuICBnZXRTZW5kaW5nU3RhdHVzQ29udGV4dCgpOiBTZW5kaW5nU3RhdHVzQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSEsXG4gICAgfTtcbiAgfVxuXG4gIGdldFJlYWRTdGF0dXNDb250ZXh0KCk6IFJlYWRTdGF0dXNDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICAgIHJlYWRCeVRleHQ6IHRoaXMucmVhZEJ5VGV4dCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TWVzc2FnZU1ldGFkYXRhQ29udGV4dCgpOiBDdXN0b21NZXRhZGF0YUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UhLFxuICAgIH07XG4gIH1cblxuICBqdW1wVG9NZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nLCBwYXJlbnRNZXNzYWdlSWQ/OiBzdHJpbmcpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZShtZXNzYWdlSWQsIHBhcmVudE1lc3NhZ2VJZCk7XG4gIH1cblxuICBkaXNwbGF5VHJhbnNsYXRlZE1lc3NhZ2UoKSB7XG4gICAgdGhpcy5jcmVhdGVNZXNzYWdlUGFydHModHJ1ZSk7XG4gIH1cblxuICBkaXNwbGF5T3JpZ2luYWxNZXNzYWdlKCkge1xuICAgIHRoaXMuY3JlYXRlTWVzc2FnZVBhcnRzKGZhbHNlKTtcbiAgfVxuXG4gIG9wZW5NZXNzYWdlQm91bmNlUHJvbXB0KCkge1xuICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYm91bmNlZE1lc3NhZ2UkLm5leHQodGhpcy5tZXNzYWdlKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVzc2FnZVBhcnRzKHNob3VsZFRyYW5zbGF0ZSA9IHRydWUpIHtcbiAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tZXNzYWdlVGV4dCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgY29udGVudCA9IHRoaXMuZ2V0TWVzc2FnZUNvbnRlbnQoc2hvdWxkVHJhbnNsYXRlKTtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzIHx8XG4gICAgICAgIHRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICFjb250ZW50Py5tYXRjaCh0aGlzLmVtb2ppUmVnZXhwKSAmJlxuICAgICAgIWNvbnRlbnQ/Lm1hdGNoKHRoaXMudXJsUmVnZXhwKVxuICAgICkge1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dCA9IGNvbnRlbnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY29udGVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMgfHxcbiAgICAgIHRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgY29udGVudCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KGNvbnRlbnQpO1xuICAgICAgY29udGVudCA9IHRoaXMud3JhcExpbmtzV2l0aEFuY2hvclRhZyhjb250ZW50KTtcbiAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IFt7IGNvbnRlbnQsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gW107XG4gICAgICBsZXQgdGV4dCA9IGNvbnRlbnQ7XG4gICAgICB0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbnRpb24gPSBgQCR7dXNlci5uYW1lIHx8IHVzZXIuaWR9YDtcbiAgICAgICAgY29uc3QgcHJlY2VkaW5nVGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQuaW5kZXhPZihtZW50aW9uKSk7XG4gICAgICAgIGxldCBmb3JtYXR0ZWRQcmVjZWRpbmdUZXh0ID0gdGhpcy5maXhFbW9qaURpc3BsYXkocHJlY2VkaW5nVGV4dCk7XG4gICAgICAgIGZvcm1hdHRlZFByZWNlZGluZ1RleHQgPSB0aGlzLndyYXBMaW5rc1dpdGhBbmNob3JUYWcoXG4gICAgICAgICAgZm9ybWF0dGVkUHJlY2VkaW5nVGV4dFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMhLnB1c2goe1xuICAgICAgICAgIGNvbnRlbnQ6IGZvcm1hdHRlZFByZWNlZGluZ1RleHQsXG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzIS5wdXNoKHtcbiAgICAgICAgICBjb250ZW50OiBtZW50aW9uLFxuICAgICAgICAgIHR5cGU6ICdtZW50aW9uJyxcbiAgICAgICAgICB1c2VyLFxuICAgICAgICB9KTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShwcmVjZWRpbmdUZXh0ICsgbWVudGlvbiwgJycpO1xuICAgICAgfSk7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0ZXh0ID0gdGhpcy5maXhFbW9qaURpc3BsYXkodGV4dCk7XG4gICAgICAgIHRleHQgPSB0aGlzLndyYXBMaW5rc1dpdGhBbmNob3JUYWcodGV4dCk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cy5wdXNoKHsgY29udGVudDogdGV4dCwgdHlwZTogJ3RleHQnIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWVzc2FnZUNvbnRlbnQoc2hvdWxkVHJhbnNsYXRlOiBib29sZWFuKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gdGhpcy5tZXNzYWdlPy50ZXh0O1xuICAgIGlmIChzaG91bGRUcmFuc2xhdGUpIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5tZXNzYWdlPy50cmFuc2xhdGlvbjtcbiAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICB0aGlzLnNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50ID0gJ3RyYW5zbGF0aW9uJztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbiB8fCBvcmlnaW5hbENvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50ID0gJ29yaWdpbmFsJztcbiAgICAgIHJldHVybiBvcmlnaW5hbENvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaXhFbW9qaURpc3BsYXkoY29udGVudDogc3RyaW5nKSB7XG4gICAgLy8gV3JhcCBlbW9qaXMgaW4gc3BhbiB0byBkaXNwbGF5IGVtb2ppcyBjb3JyZWN0bHkgaW4gQ2hyb21lIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU5NjIyM1xuICAgIC8vIEJhc2VkIG9uIHRoaXM6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ1NjUxMTIvamF2YXNjcmlwdC1ob3ctdG8tZmluZC1vdXQtaWYtdGhlLXVzZXItYnJvd3Nlci1pcy1jaHJvbWVcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgICBjb25zdCBpc0Nocm9tZSA9XG4gICAgICAhISh3aW5kb3cgYXMgYW55KS5jaHJvbWUgJiYgdHlwZW9mICh3aW5kb3cgYXMgYW55KS5vcHIgPT09ICd1bmRlZmluZWQnO1xuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgIHRoaXMuZW1vamlSZWdleHAsXG4gICAgICAobWF0Y2gpID0+XG4gICAgICAgIGA8c3BhbiAke1xuICAgICAgICAgIGlzQ2hyb21lID8gJ2NsYXNzPVwic3RyLWNoYXRfX2Vtb2ppLWRpc3BsYXktZml4XCInIDogJydcbiAgICAgICAgfT4ke21hdGNofTwvc3Bhbj5gXG4gICAgKTtcblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwTGlua3NXaXRoQW5jaG9yVGFnKGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRpc3BsYXlBcyA9PT0gJ2h0bWwnKSB7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSh0aGlzLnVybFJlZ2V4cCwgKG1hdGNoKSA9PlxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5jdXN0b21MaW5rUmVuZGVyZXJcbiAgICAgICAgPyB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmN1c3RvbUxpbmtSZW5kZXJlcihtYXRjaClcbiAgICAgICAgOiBgPGEgaHJlZj1cIiR7bWF0Y2h9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9mb2xsb3dcIj4ke21hdGNofTwvYT5gXG4gICAgKTtcblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJc1NlbnRCeUN1cnJlbnRVc2VyKCkge1xuICAgIHRoaXMuaXNTZW50QnlDdXJyZW50VXNlciA9IHRoaXMubWVzc2FnZT8udXNlcj8uaWQgPT09IHRoaXMudXNlcklkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRMYXN0UmVhZFVzZXIoKSB7XG4gICAgdGhpcy5sYXN0UmVhZFVzZXIgPSB0aGlzLm1lc3NhZ2U/LnJlYWRCeT8uZmlsdGVyKFxuICAgICAgKHUpID0+IHUuaWQgIT09IHRoaXMudXNlcklkXG4gICAgKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRNZXNzYWdlTWVudVNob3dUaW1lcihvcHRpb25zOiB7IGZyb21Ub3VjaDogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5zdG9wTWVzc2FnZU1lbnVTaG93VGltZXIoKTtcbiAgICBpZiAodGhpcy5zY3JvbGwkKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5zY3JvbGwkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN0b3BNZXNzYWdlTWVudVNob3dUaW1lcigpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5zaG93TWVzc2FnZU1lbnVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMubWVzc2FnZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9uQ2xpY2tIYW5kbGVyKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9uQ2xpY2tIYW5kbGVyKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICAgIGVuYWJsZWRBY3Rpb25zOiB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgICAgICAgIGN1c3RvbUFjdGlvbnM6IHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbnMkLmdldFZhbHVlKCksXG4gICAgICAgICAgICBpc01pbmU6IHRoaXMuaXNTZW50QnlDdXJyZW50VXNlcixcbiAgICAgICAgICAgIG1lc3NhZ2VUZXh0SHRtbEVsZW1lbnQ6IHRoaXMubWVzc2FnZVRleHRFbGVtZW50Py5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNob3VsZFByZXZlbnRNZXNzYWdlTWVudUNsb3NlID0gIW9wdGlvbnMuZnJvbVRvdWNoO1xuICAgICAgICAgIHRoaXMubWVzc2FnZU1lbnVUcmlnZ2VyPy5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93TWVzc2FnZU1lbnVUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgfSwgNDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNZW51VHJpZ2dlckV2ZW50SGFuZGxlcnMoKSB7XG4gICAgdGhpcy5tZXNzYWdlQnViYmxlIS5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCAoKSA9PlxuICAgICAgdGhpcy50b3VjaFN0YXJ0ZWQoKVxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlQnViYmxlIS5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgKCkgPT5cbiAgICAgIHRoaXMudG91Y2hFbmRlZCgpXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VCdWJibGUhLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0+XG4gICAgICB0aGlzLm1vdXNlUHVzaGVkRG93bihlKVxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlQnViYmxlIS5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoKSA9PlxuICAgICAgdGhpcy5tb3VzZVJlbGVhc2VkKClcbiAgICApO1xuICAgIHRoaXMubWVzc2FnZUJ1YmJsZSEubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PlxuICAgICAgdGhpcy5tZXNzYWdlQnViYmxlQ2xpY2tlZChlKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BNZXNzYWdlTWVudVNob3dUaW1lcigpIHtcbiAgICBpZiAodGhpcy5zaG93TWVzc2FnZU1lbnVUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zaG93TWVzc2FnZU1lbnVUaW1lb3V0KTtcbiAgICAgIHRoaXMuc2hvd01lc3NhZ2VNZW51VGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgI2NvbnRhaW5lclxuICBkYXRhLXRlc3RpZD1cIm1lc3NhZ2UtY29udGFpbmVyXCJcbiAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUgc3RyLWNoYXRfX21lc3NhZ2Ugc3RyLWNoYXRfX21lc3NhZ2UtLXt7XG4gICAgbWVzc2FnZT8udHlwZVxuICB9fSBzdHItY2hhdF9fbWVzc2FnZS0te3sgbWVzc2FnZT8uc3RhdHVzIH19IHt7XG4gICAgbWVzc2FnZT8udGV4dCA/ICdzdHItY2hhdF9fbWVzc2FnZS0taGFzLXRleHQnIDogJ2hhcy1uby10ZXh0J1xuICB9fSBzdHItY2hhdF9fbWVzc2FnZS1tZW51LXt7IGFyZU1lc3NhZ2VPcHRpb25zT3BlbiA/ICdvcGVuZWQnIDogJ2Nsb3NlZCcgfX1cIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLW1lXT1cImlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLW90aGVyXT1cIiFpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS0tbWVdPVwiaXNTZW50QnlDdXJyZW50VXNlclwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0taGFzLWF0dGFjaG1lbnRdPVwiaGFzQXR0YWNobWVudFwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0td2l0aC1yZWFjdGlvbnNdPVwiaGFzUmVhY3Rpb25zXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1oaWdobGlnaHRlZF09XCJpc0hpZ2hsaWdodGVkXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXdpdGgtdGhyZWFkLWxpbmtdPVwic2hvdWxkRGlzcGxheVRocmVhZExpbmtcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utc2VuZC1jYW4tYmUtcmV0cmllZF09XCJcbiAgICAobWVzc2FnZT8uc3RhdHVzID09PSAnZmFpbGVkJyAmJiBtZXNzYWdlPy5lcnJvclN0YXR1c0NvZGUgIT09IDQwMykgfHxcbiAgICAobWVzc2FnZT8udHlwZSA9PT0gJ2Vycm9yJyAmJiBtZXNzYWdlPy5tb2RlcmF0aW9uX2RldGFpbHMpXG4gIFwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS13aXRoLXRvdWNoLXN1cHBvcnRdPVwiaGFzVG91Y2hTdXBwb3J0XCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXdpdGhvdXQtdG91Y2gtc3VwcG9ydF09XCIhaGFzVG91Y2hTdXBwb3J0XCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZXNzYWdlPy5kZWxldGVkX2F0OyBlbHNlIGRlbGV0ZWRNZXNzYWdlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2U/LnR5cGUgIT09ICdzeXN0ZW0nOyBlbHNlIHN5c3RlbU1lc3NhZ2VcIj5cbiAgICAgIDxzdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYXZhdGFyXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdC1hbmd1bGFyX19hdmF0YXItaG9zdCBzdHItY2hhdF9fbWVzc2FnZS1zZW5kZXItYXZhdGFyXCJcbiAgICAgICAgdHlwZT1cInVzZXJcIlxuICAgICAgICBsb2NhdGlvbj1cIm1lc3NhZ2Utc2VuZGVyXCJcbiAgICAgICAgW2ltYWdlVXJsXT1cIm1lc3NhZ2U/LnVzZXI/LmltYWdlXCJcbiAgICAgICAgW25hbWVdPVwibWVzc2FnZT8udXNlcj8ubmFtZSB8fCBtZXNzYWdlPy51c2VyPy5pZFwiXG4gICAgICAgIFt1c2VyXT1cIm1lc3NhZ2U/LnVzZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgID48L3N0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtaW5uZXJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiIWhhc1RvdWNoU3VwcG9ydCAmJiBhcmVPcHRpb25zVmlzaWJsZVwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGVfX2FjdGlvbnMgc3RyLWNoYXRfX21lc3NhZ2Utb3B0aW9uc1wiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLW9wdGlvbnNcIlxuICAgICAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1hY3Rpb25zLW9wZW5dPVwiYXJlTWVzc2FnZU9wdGlvbnNPcGVuXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNtZXNzYWdlQWN0aW9uc1RvZ2dsZVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWFjdGlvbnMtY29udGFpbmVyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbnMtY29udGFpbmVyXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uLS1vcHRpb25zXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2Zsb2F0VWlMb29zZV09XCJtZXNzYWdlTWVudUZsb2F0XCJcbiAgICAgICAgICAgIFtsb29zZVRyaWdnZXJdPVwiXG4gICAgICAgICAgICAgIG1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25DbGlja0hhbmRsZXIgPyAnbm9uZScgOiAnY2xpY2snXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2hpZGVPblNjcm9sbF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZU9uQ2xpY2tPdXRzaWRlXT1cInRydWVcIlxuICAgICAgICAgICAgW2hpZGVPbk1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2Rpc2FibGVBbmltYXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3ByZXZlbnRPdmVyZmxvd109XCJ0cnVlXCJcbiAgICAgICAgICAgIFtwb3NpdGlvbkZpeGVkXT1cInRydWVcIlxuICAgICAgICAgICAgKG9uU0hvd24pPVwiYXJlTWVzc2FnZU9wdGlvbnNPcGVuID0gdHJ1ZVwiXG4gICAgICAgICAgICAob25IaWRkZW4pPVwiYXJlTWVzc2FnZU9wdGlvbnNPcGVuID0gZmFsc2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJ2aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA+IDBcIlxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbnMtYm94LWJ1dHRvblwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1vcHRpb25zLWJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJtZXNzYWdlT3B0aW9uc0J1dHRvbkNsaWNrZWQoKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJtZXNzYWdlT3B0aW9uc0J1dHRvbkNsaWNrZWQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIGljb249XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1ob3N0XCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjZGVmYXVsdE1lc3NhZ2VSZWFjdGlvbnNcbiAgICAgICAgICAgIGxldC1tZXNzYWdlUmVhY3Rpb25Db3VudHM9XCJtZXNzYWdlUmVhY3Rpb25Db3VudHNcIlxuICAgICAgICAgICAgbGV0LWxhdGVzdFJlYWN0aW9ucz1cImxhdGVzdFJlYWN0aW9uc1wiXG4gICAgICAgICAgICBsZXQtbWVzc2FnZUlkPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICAgIGxldC1vd25SZWFjdGlvbnM9XCJvd25SZWFjdGlvbnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0tbWVzc2FnZS1yZWFjdGlvbnNcbiAgICAgICAgICAgICAgW21lc3NhZ2VSZWFjdGlvbkNvdW50c109XCJtZXNzYWdlUmVhY3Rpb25Db3VudHNcIlxuICAgICAgICAgICAgICBbbGF0ZXN0UmVhY3Rpb25zXT1cImxhdGVzdFJlYWN0aW9uc1wiXG4gICAgICAgICAgICAgIFttZXNzYWdlSWRdPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICAgICAgW293blJlYWN0aW9uc109XCJvd25SZWFjdGlvbnNcIlxuICAgICAgICAgICAgPjwvc3RyZWFtLW1lc3NhZ2UtcmVhY3Rpb25zPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubWVzc2FnZVJlYWN0aW9uc1RlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlUmVhY3Rpb25zO1xuICAgICAgICAgICAgICBjb250ZXh0OiBnZXRNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCgpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxmbG9hdC11aS1jb250ZW50ICNtZXNzYWdlTWVudUZsb2F0PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2RlZmF1bHRNZXNzYWdlQWN0aW9uc0JveFxuICAgICAgICAgICAgbGV0LWlzTWluZT1cImlzTWluZVwiXG4gICAgICAgICAgICBsZXQtbWVzc2FnZUlucHV0PVwibWVzc2FnZVwiXG4gICAgICAgICAgICBsZXQtZW5hYmxlZEFjdGlvbnM9XCJlbmFibGVkQWN0aW9uc1wiXG4gICAgICAgICAgICBsZXQtbWVzc2FnZVRleHRIdG1sRWxlbWVudD1cIm1lc3NhZ2VUZXh0SHRtbEVsZW1lbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0tbWVzc2FnZS1hY3Rpb25zLWJveFxuICAgICAgICAgICAgICBbaXNNaW5lXT1cImlzTWluZVwiXG4gICAgICAgICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VJbnB1dFwiXG4gICAgICAgICAgICAgIFtlbmFibGVkQWN0aW9uc109XCJlbmFibGVkQWN0aW9uc1wiXG4gICAgICAgICAgICAgIFttZXNzYWdlVGV4dEh0bWxFbGVtZW50XT1cIm1lc3NhZ2VUZXh0SHRtbEVsZW1lbnRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZUFjdGlvbnNCb3hDbGlja2VkKG1lc3NhZ2VNZW51RmxvYXQpXCJcbiAgICAgICAgICAgID48L3N0cmVhbS1tZXNzYWdlLWFjdGlvbnMtYm94PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlQWN0aW9uc0JveFRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2VBY3Rpb25zQm94O1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lc3NhZ2VBY3Rpb25zQm94Q29udGV4dCgpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mbG9hdC11aS1jb250ZW50PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1idWJibGUgc3RyLWNoYXQtYW5ndWxhcl9fbWVzc2FnZS1idWJibGVcIlxuICAgICAgICAgIFtjbGFzcy5zdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWJ1YmJsZS0tYXR0YWNobWVudC1tb2RhbC1vcGVuXT1cIlxuICAgICAgICAgICAgaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZSA9PT0gJ29wZW5lZCdcbiAgICAgICAgICBcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1idWJibGVcIlxuICAgICAgICAgIFtmbG9hdFVpTG9vc2VdPVwibWVzc2FnZU1lbnVGbG9hdFwiXG4gICAgICAgICAgI21lc3NhZ2VNZW51VHJpZ2dlcj1cImZsb2F0VWlMb29zZVwiXG4gICAgICAgICAgI21lc3NhZ2VCdWJibGVcbiAgICAgICAgICBsb29zZVRyaWdnZXI9XCJub25lXCJcbiAgICAgICAgICBbaGlkZU9uU2Nyb2xsXT1cImZhbHNlXCJcbiAgICAgICAgICBbaGlkZU9uQ2xpY2tPdXRzaWRlXT1cInRydWVcIlxuICAgICAgICAgIFtoaWRlT25Nb3VzZUxlYXZlXT1cImZhbHNlXCJcbiAgICAgICAgICBbZGlzYWJsZUFuaW1hdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICBbcHJldmVudE92ZXJmbG93XT1cInRydWVcIlxuICAgICAgICAgIChvblNob3duKT1cImFyZU1lc3NhZ2VPcHRpb25zT3BlbiA9IHRydWVcIlxuICAgICAgICAgIChvbkhpZGRlbik9XCJhcmVNZXNzYWdlT3B0aW9uc09wZW4gPSBmYWxzZVwiXG4gICAgICAgICAgW3Bvc2l0aW9uRml4ZWRdPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQXR0YWNobWVudCAmJiAhbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2VcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudHMtY29udGFpbmVyXCI+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+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVsaXZlcmVkU3RhdHVzPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmRlbGl2ZXJlZFN0YXR1c1RlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgZGVmYXVsdERlbGl2ZXJlZFN0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXREZWxpdmVyZWRTdGF0dXNDb250ZXh0KClcbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdERlbGl2ZXJlZFN0YXR1cz5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0lmPVwibW9kZSA9PT0gJ21haW4nXCJcbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1cy1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc3RhdHVzXG4gICAgICAgIFwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiZGVsaXZlcmVkLWluZGljYXRvclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFtmbG9hdFVpTG9vc2VdPVwiZmxvYXRpbmdDb250ZW50XCJcbiAgICAgICAgbG9vc2VQbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICBbbG9vc2VUcmlnZ2VyXT1cImhhc1RvdWNoU3VwcG9ydCA/ICdjbGljaycgOiAnaG92ZXInXCJcbiAgICAgICAgW2Rpc2FibGVBbmltYXRpb25dPVwidHJ1ZVwiXG4gICAgICAgIFtoaWRlT25DbGlja091dHNpZGVdPVwidHJ1ZVwiXG4gICAgICAgIFtwb3NpdGlvbkZpeGVkXT1cInRydWVcIlxuICAgICAgICBbcHJldmVudE92ZXJmbG93XT1cInRydWVcIlxuICAgICAgPlxuICAgICAgICA8ZmxvYXQtdWktY29udGVudCAjZmxvYXRpbmdDb250ZW50PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fdG9vbHRpcCBzdHItY2hhdF9fdG9vbHRpcC1hbmd1bGFyXCI+XG4gICAgICAgICAgICB7eyBcInN0cmVhbUNoYXQuRGVsaXZlcmVkXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mbG9hdC11aS1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImRlbGl2ZXJlZC1pY29uXCJcbiAgICAgICAgICBpY29uPVwiZGVsaXZlcmVkXCJcbiAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI3NlbmRpbmdTdGF0dXM+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2Uuc2VuZGluZ1N0YXR1c1RlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgZGVmYXVsdFNlbmRpbmdTdGF0dXM7XG4gICAgICAgICAgY29udGV4dDogZ2V0U2VuZGluZ1N0YXR1c0NvbnRleHQoKVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U2VuZGluZ1N0YXR1cz5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1c1xuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXMtYW5ndWxhclxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXN0YXR1c1xuICAgICAgICBcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlbmRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW2Zsb2F0VWlMb29zZV09XCJmbG9hdGluZ0NvbnRlbnRcIlxuICAgICAgICBsb29zZVBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgIFtsb29zZVRyaWdnZXJdPVwiaGFzVG91Y2hTdXBwb3J0ID8gJ2NsaWNrJyA6ICdob3ZlcidcIlxuICAgICAgICBbZGlzYWJsZUFuaW1hdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgW2hpZGVPbkNsaWNrT3V0c2lkZV09XCJ0cnVlXCJcbiAgICAgICAgW3Bvc2l0aW9uRml4ZWRdPVwidHJ1ZVwiXG4gICAgICAgIFtwcmV2ZW50T3ZlcmZsb3ddPVwidHJ1ZVwiXG4gICAgICA+XG4gICAgICAgIDxmbG9hdC11aS1jb250ZW50ICNmbG9hdGluZ0NvbnRlbnQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIj5cbiAgICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5TZW5kaW5nLi4uXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mbG9hdC11aS1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjcmVhZFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5yZWFkU3RhdHVzVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICBkZWZhdWx0UmVhZFN0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXRSZWFkU3RhdHVzQ29udGV4dCgpXG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSZWFkU3RhdHVzIGxldC1yZWFkQnlUZXh0PVwicmVhZEJ5VGV4dFwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1cy1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc3RhdHVzXG4gICAgICAgIFwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwicmVhZC1pbmRpY2F0b3JcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBbZmxvYXRVaUxvb3NlXT1cImZsb2F0aW5nQ29udGVudFwiXG4gICAgICAgIGxvb3NlUGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgW2xvb3NlVHJpZ2dlcl09XCJoYXNUb3VjaFN1cHBvcnQgPyAnY2xpY2snIDogJ2hvdmVyJ1wiXG4gICAgICAgIFtkaXNhYmxlQW5pbWF0aW9uXT1cInRydWVcIlxuICAgICAgICBbaGlkZU9uQ2xpY2tPdXRzaWRlXT1cInRydWVcIlxuICAgICAgICBbcG9zaXRpb25GaXhlZF09XCJ0cnVlXCJcbiAgICAgICAgW3ByZXZlbnRPdmVyZmxvd109XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgICAgPGZsb2F0LXVpLWNvbnRlbnQgI2Zsb2F0aW5nQ29udGVudD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJyZWFkLWJ5LXRvb2x0aXBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHJlYWRCeVRleHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mbG9hdC11aS1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cInJlYWRcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNyZXBseUNvdW50QnV0dG9uPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJcbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1yZXBseS1idXR0b25cbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXJlcGxpZXMtY291bnQtYnV0dG9uLXdyYXBwZXJcbiAgICBcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJzaG91bGREaXNwbGF5VGhyZWFkTGlua1wiXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlcGxpZXMtY291bnQtYnV0dG9uXCJcbiAgICAgIGRhdGEtdGVzdGlkPVwicmVwbHktY291bnQtYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJzZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UoKVwiXG4gICAgPlxuICAgICAge3ttZXNzYWdlPy5yZXBseV9jb3VudCA9PT0gMSA/ICgnc3RyZWFtQ2hhdC4xIHJlcGx5JyB8IHRyYW5zbGF0ZSkgOiAoJ3N0cmVhbUNoYXQue3sgcmVwbHlDb3VudCB9fVxuICAgICAgcmVwbGllcycgfCB0cmFuc2xhdGU6cmVwbHlDb3VudFBhcmFtKX19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhdHRhY2htZW50c1RlbXBsYXRlPlxuICA8bmctdGVtcGxhdGVcbiAgICAjZGVmYXVsdEF0dGFjaG1lbnRzXG4gICAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gICAgbGV0LWF0dGFjaG1lbnRzPVwiYXR0YWNobWVudHNcIlxuICAgIGxldC1wYXJlbnRNZXNzYWdlSWQ9XCJwYXJlbnRNZXNzYWdlSWRcIlxuICAgIGxldC1pbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlclwiXG4gID5cbiAgICA8c3RyZWFtLWF0dGFjaG1lbnQtbGlzdFxuICAgICAgW21lc3NhZ2VJZF09XCJtZXNzYWdlSWRcIlxuICAgICAgW2F0dGFjaG1lbnRzXT1cImF0dGFjaG1lbnRzXCJcbiAgICAgIFtwYXJlbnRNZXNzYWdlSWRdPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICAgIChpbWFnZU1vZGFsU3RhdGVDaGFuZ2UpPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcigkZXZlbnQpXCJcbiAgICA+PC9zdHJlYW0tYXR0YWNobWVudC1saXN0PlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmF0dGFjaG1lbnRMaXN0VGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgIGRlZmF1bHRBdHRhY2htZW50cztcbiAgICAgIGNvbnRleHQ6IGdldEF0dGFjaG1lbnRMaXN0Q29udGV4dCgpXG4gICAgXCJcbiAgPjwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
522
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS9tZXNzYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlL21lc3NhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBTUwsdUJBQXVCLEVBRXZCLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQWlCdkIsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBNEIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZTFDOztHQUVHO0FBT0gsTUFBTSxPQUFPLGdCQUFnQjtJQXVFM0IsWUFDVSxpQkFBb0MsRUFDcEMsY0FBOEIsRUFDL0Isc0JBQThDLEVBQzdDLEtBQXdCLEVBQ3hCLFVBQTZCLEVBQzdCLGNBQThCLEVBQy9CLHFCQUE0QyxFQUMzQyxNQUFjO1FBUGQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM3QyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0IsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUMzQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBeEV4Qjs7V0FFRztRQUNNLDBCQUFxQixHQUFhLEVBQUUsQ0FBQztRQUs5Qzs7V0FFRztRQUNNLFNBQUksR0FB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dUIsQ0FBQyxNQUFNO2dVQVF0QyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUlHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFJRyxJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsYUFBYTtzQkFBckIsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUs7Z0JBb0NOLGtCQUFrQjtzQkFEakIsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBRy9CLGdCQUFnQjtzQkFEZixTQUFTO3VCQUFDLGtCQUFrQjtnQkFFSSxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQUNILGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBOZ1pvbmUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXR0YWNobWVudCwgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRMaXN0Q29udGV4dCxcbiAgTWVudGlvblRlbXBsYXRlQ29udGV4dCxcbiAgTWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0LFxuICBNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCxcbiAgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbiAgU3RyZWFtTWVzc2FnZSxcbiAgRGVsaXZlcmVkU3RhdHVzQ29udGV4dCxcbiAgU2VuZGluZ1N0YXR1c0NvbnRleHQsXG4gIFJlYWRTdGF0dXNDb250ZXh0LFxuICBTeXN0ZW1NZXNzYWdlQ29udGV4dCxcbiAgQ3VzdG9tTWV0YWRhdGFDb250ZXh0LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZW1vamlSZWdleCBmcm9tICdlbW9qaS1yZWdleCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIHRha2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgbGlzdFVzZXJzIH0gZnJvbSAnLi4vbGlzdC11c2Vycyc7XG5pbXBvcnQgeyBEYXRlUGFyc2VyU2VydmljZSB9IGZyb20gJy4uL2RhdGUtcGFyc2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnZUFjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vbWVzc2FnZS1hY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTmd4RmxvYXRVaUNvbnRlbnRDb21wb25lbnQsXG4gIE5neEZsb2F0VWlMb29zZURpcmVjdGl2ZSxcbn0gZnJvbSAnbmd4LWZsb2F0LXVpJztcblxudHlwZSBNZXNzYWdlUGFydCA9IHtcbiAgY29udGVudDogc3RyaW5nO1xuICB0eXBlOiAndGV4dCcgfCAnbWVudGlvbic7XG4gIHVzZXI/OiBVc2VyUmVzcG9uc2U7XG59O1xuXG4vKipcbiAqIFRoZSBgTWVzc2FnZWAgY29tcG9uZW50IGRpc3BsYXlzIGEgbWVzc2FnZSB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBzZW5kZXIgYW5kIGRhdGUsIGFuZCBlbmFibGVzIFtpbnRlcmFjdGlvbiB3aXRoIHRoZSBtZXNzYWdlIChpLmUuIGVkaXQgb3IgcmVhY3QpXSguLi9jb25jZXB0cy9tZXNzYWdlLWludGVyYWN0aW9ucy5tZHgpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tbWVzc2FnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWRcbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBbY2hhbm5lbCBjYXBhYmlsaXRpZXNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2NoYW5uZWxfY2FwYWJpbGl0aWVzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSB0aGF0IGFyZSBlbmFibGVkIGZvciB0aGUgY3VycmVudCB1c2VyLCB0aGUgbGlzdCBvZiBbc3VwcG9ydGVkIGludGVyYWN0aW9uc10oLi4vY29uY2VwdHMvbWVzc2FnZS1pbnRlcmFjdGlvbnMubWR4KSBjYW4gYmUgZm91bmQgaW4gb3VyIG1lc3NhZ2UgaW50ZXJhY3Rpb24gZ3VpZGUuIFVuYXRob3JpemVkIGFjdGlvbnMgd29uJ3QgYmUgZGlzcGxheWVkIG9uIHRoZSBVSS4gVGhlIFtgTWVzc2FnZUxpc3RgXSguL01lc3NhZ2VMaXN0Q29tcG9uZW50Lm1keCkgY29tcG9uZW50IGF1dG9tYXRpY2FsbHkgc2V0cyB0aGlzIGJhc2VkIG9uIFtjaGFubmVsIGNhcGFiaWxpdGllc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvY2hhbm5lbF9jYXBhYmlsaXRpZXMvP2xhbmd1YWdlPWphdmFzY3JpcHQpLlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgbWVzc2FnZSBzdGF0dXMgKHNlbmRpbmcsIHNlbnQsIHdobyByZWFkIHRoZSBtZXNzYWdlKSBpcyBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBpc0xhc3RTZW50TWVzc2FnZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIG1lc3NhZ2UgaXMgYmVpbmcgZGlzcGFseWVkIGluIGEgY2hhbm5lbCBvciBpbiBhIFt0aHJlYWRdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3RocmVhZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpLlxuICAgKi9cbiAgQElucHV0KCkgbW9kZTogJ3RocmVhZCcgfCAnbWFpbicgPSAnbWFpbic7XG4gIC8qKlxuICAgKiBIaWdobGlnaHRpbmcgaXMgdXNlZCB0byBhZGQgdmlzdWFsIGVtcGhhc2l6ZSB0byBhIG1lc3NhZ2Ugd2hlbiBqdW1waW5nIHRvIHRoZSBtZXNzYWdlXG4gICAqL1xuICBASW5wdXQoKSBpc0hpZ2hsaWdodGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiB0aGUgbWVzc2FnZSBsaXN0IGlzIHNjcm9sbGVkLCBpdCdzIHVzZWQgdG8gcHJldmVudCBvcGVuaW5nIHRoZSBtZXNzYWdlIG1lbnUgd2hpbGUgc2Nyb2xsIGlzIGluIHByb2dyZXNzXG4gICAqL1xuICBASW5wdXQoKSBzY3JvbGwkPzogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgY2FuUmVjZWl2ZVJlYWRFdmVudHM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGNhblJlYWN0VG9NZXNzYWdlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBpc0VkaXRlZEZsYWdPcGVuZWQgPSBmYWxzZTtcbiAgbWVzc2FnZVRleHRQYXJ0czogTWVzc2FnZVBhcnRbXSB8IHVuZGVmaW5lZCA9IFtdO1xuICBtZXNzYWdlVGV4dD86IHN0cmluZztcbiAgc2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlID0gZmFsc2U7XG4gIGRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudDogJ29yaWdpbmFsJyB8ICd0cmFuc2xhdGlvbicgPSAnb3JpZ2luYWwnO1xuICBpbWFnZUF0dGFjaG1lbnRNb2RhbFN0YXRlOiAnb3BlbmVkJyB8ICdjbG9zZWQnID0gJ2Nsb3NlZCc7XG4gIHNob3VsZERpc3BsYXlUaHJlYWRMaW5rID0gZmFsc2U7XG4gIGlzU2VudEJ5Q3VycmVudFVzZXIgPSBmYWxzZTtcbiAgcmVhZEJ5VGV4dCA9ICcnO1xuICBkaXNwbGF5QXM6ICd0ZXh0JyB8ICdodG1sJztcbiAgbGFzdFJlYWRVc2VyOiBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGlzT25seVJlYWRCeU1lID0gZmFsc2U7XG4gIGlzUmVhZEJ5TXVsdGlwbGVVc2VycyA9IGZhbHNlO1xuICBpc01lc3NhZ2VEZWxpdmVyZWRBbmRSZWFkID0gZmFsc2U7XG4gIHBhcnNlZERhdGUgPSAnJztcbiAgcGFzZWRFZGl0ZWREYXRlID0gJyc7XG4gIGFyZU9wdGlvbnNWaXNpYmxlID0gZmFsc2U7XG4gIGhhc0F0dGFjaG1lbnQgPSBmYWxzZTtcbiAgaGFzUmVhY3Rpb25zID0gZmFsc2U7XG4gIHJlcGx5Q291bnRQYXJhbTogeyByZXBseUNvdW50OiBudW1iZXIgfCB1bmRlZmluZWQgfSA9IHtcbiAgICByZXBseUNvdW50OiB1bmRlZmluZWQsXG4gIH07XG4gIGFyZU1lc3NhZ2VPcHRpb25zT3BlbiA9IGZhbHNlO1xuICBjYW5EaXNwbGF5UmVhZFN0YXR1cyA9IGZhbHNlO1xuICBoYXNUb3VjaFN1cHBvcnQgPSAnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cgfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMDtcbiAgcHJpdmF0ZSBxdW90ZWRNZXNzYWdlQXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGlzVmlld0luaXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIHVzZXJJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxSZWdleHAgPVxuICAgIC8oPzooPzpodHRwcz98ZnRwfGZpbGUpOlxcL1xcL3x3d3dcXC58ZnRwXFwuKSg/OlxcKFstQS1aMC05KyZAIy8lPX5ffCQ/ITosLl0qXFwpfFstQS1aMC05KyZAIy8lPX5ffCQ/ITosLl0pKig/OlxcKFstQS1aMC05KyZAIy8lPX5ffCQ/ITosLl0qXFwpfFtBLVowLTkrJkAjLyU9fl98JF0pL2dpbTtcbiAgcHJpdmF0ZSBlbW9qaVJlZ2V4cCA9IG5ldyBSZWdFeHAoZW1vamlSZWdleCgpLCAnZycpO1xuICBAVmlld0NoaWxkKCdtZXNzYWdlTWVudVRyaWdnZXInKVxuICBtZXNzYWdlTWVudVRyaWdnZXIhOiBOZ3hGbG9hdFVpTG9vc2VEaXJlY3RpdmU7XG4gIEBWaWV3Q2hpbGQoJ21lc3NhZ2VNZW51RmxvYXQnKVxuICBtZXNzYWdlTWVudUZsb2F0ITogTmd4RmxvYXRVaUNvbnRlbnRDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ21lc3NhZ2VUZXh0RWxlbWVudCcpIG1lc3NhZ2VUZXh0RWxlbWVudD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdtZXNzYWdlQnViYmxlJykgbWVzc2FnZUJ1YmJsZT86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIHNob3dNZXNzYWdlTWVudVRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBzaG91bGRQcmV2ZW50TWVzc2FnZU1lbnVDbG9zZSA9IGZhbHNlO1xuICBwcml2YXRlIF92aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGF0Q2xpZW50U2VydmljZTogQ2hhdENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UsXG4gICAgcHVibGljIGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBkYXRlUGFyc2VyOiBEYXRlUGFyc2VyU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwdWJsaWMgbWVzc2FnZUFjdGlvbnNTZXJ2aWNlOiBNZXNzYWdlQWN0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHtcbiAgICB0aGlzLmRpc3BsYXlBcyA9IHRoaXMubWVzc2FnZVNlcnZpY2UuZGlzcGxheUFzO1xuICB9XG5cbiAgZ2V0IHZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudDtcbiAgfVxuXG4gIHNldCB2aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudChjb3VudDogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSBjb3VudDtcbiAgICBpZiAodGhpcy5hcmVPcHRpb25zVmlzaWJsZSAmJiB0aGlzLl92aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5hcmVPcHRpb25zVmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS51c2VyJC5zdWJzY3JpYmUoKHUpID0+IHtcbiAgICAgICAgaWYgKHU/LmlkICE9PSB0aGlzLnVzZXJJZCkge1xuICAgICAgICAgIHRoaXMudXNlcklkID0gdT8uaWQ7XG4gICAgICAgICAgdGhpcy5zZXRJc1NlbnRCeUN1cnJlbnRVc2VyKCk7XG4gICAgICAgICAgdGhpcy5zZXRMYXN0UmVhZFVzZXIoKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9ucyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZSkge1xuICAgICAgICAgIGNvbnN0IG51bWJlck9mRW5hYmxlZEFjdGlvbnMgPVxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuZ2V0QXV0aG9yaXplZE1lc3NhZ2VBY3Rpb25zQ291bnQoXG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZSxcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG51bWJlck9mRW5hYmxlZEFjdGlvbnMgIT09IHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSBudW1iZXJPZkVuYWJsZWRBY3Rpb25zO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdGVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuc2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlID0gZmFsc2U7XG4gICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICdvcmlnaW5hbCc7XG4gICAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VQYXJ0cygpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxBdHRhY2htZW50cyA9IHRoaXMubWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LmF0dGFjaG1lbnRzO1xuICAgICAgdGhpcy5xdW90ZWRNZXNzYWdlQXR0YWNobWVudHMgPVxuICAgICAgICBvcmlnaW5hbEF0dGFjaG1lbnRzICYmIG9yaWdpbmFsQXR0YWNobWVudHMubGVuZ3RoXG4gICAgICAgICAgPyBbb3JpZ2luYWxBdHRhY2htZW50c1swXV1cbiAgICAgICAgICA6IFtdO1xuICAgICAgdGhpcy5zZXRJc1NlbnRCeUN1cnJlbnRVc2VyKCk7XG4gICAgICB0aGlzLnNldExhc3RSZWFkVXNlcigpO1xuICAgICAgdGhpcy5yZWFkQnlUZXh0ID0gdGhpcy5tZXNzYWdlPy5yZWFkQnlcbiAgICAgICAgPyBsaXN0VXNlcnModGhpcy5tZXNzYWdlLnJlYWRCeSlcbiAgICAgICAgOiAnJztcbiAgICAgIHRoaXMuaXNPbmx5UmVhZEJ5TWUgPSAhIShcbiAgICAgICAgdGhpcy5tZXNzYWdlICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeS5sZW5ndGggPT09IDBcbiAgICAgICk7XG4gICAgICB0aGlzLmlzUmVhZEJ5TXVsdGlwbGVVc2VycyA9ICEhKFxuICAgICAgICB0aGlzLm1lc3NhZ2UgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnJlYWRCeSAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA+IDFcbiAgICAgICk7XG4gICAgICB0aGlzLmlzTWVzc2FnZURlbGl2ZXJlZEFuZFJlYWQgPSAhIShcbiAgICAgICAgdGhpcy5tZXNzYWdlICYmXG4gICAgICAgIHRoaXMubWVzc2FnZS5yZWFkQnkgJiZcbiAgICAgICAgdGhpcy5tZXNzYWdlLnN0YXR1cyA9PT0gJ3JlY2VpdmVkJyAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICB0aGlzLnBhcnNlZERhdGUgPVxuICAgICAgICAodGhpcy5tZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5tZXNzYWdlLmNyZWF0ZWRfYXQgJiZcbiAgICAgICAgICB0aGlzLmRhdGVQYXJzZXIucGFyc2VEYXRlVGltZSh0aGlzLm1lc3NhZ2UuY3JlYXRlZF9hdCkpIHx8XG4gICAgICAgICcnO1xuICAgICAgdGhpcy5wYXNlZEVkaXRlZERhdGUgPVxuICAgICAgICAodGhpcy5tZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5tZXNzYWdlLm1lc3NhZ2VfdGV4dF91cGRhdGVkX2F0ICYmXG4gICAgICAgICAgdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZVRpbWUoXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLm1lc3NhZ2UubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXQpXG4gICAgICAgICAgKSkgfHxcbiAgICAgICAgJyc7XG4gICAgICB0aGlzLmhhc0F0dGFjaG1lbnQgPVxuICAgICAgICAhIXRoaXMubWVzc2FnZT8uYXR0YWNobWVudHMgJiYgISF0aGlzLm1lc3NhZ2UuYXR0YWNobWVudHMubGVuZ3RoO1xuICAgICAgdGhpcy5oYXNSZWFjdGlvbnMgPVxuICAgICAgICAhIXRoaXMubWVzc2FnZT8ucmVhY3Rpb25fZ3JvdXBzICYmXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMubWVzc2FnZS5yZWFjdGlvbl9ncm91cHMpLmxlbmd0aCA+IDA7XG4gICAgICB0aGlzLnJlcGx5Q291bnRQYXJhbSA9IHsgcmVwbHlDb3VudDogdGhpcy5tZXNzYWdlPy5yZXBseV9jb3VudCB9O1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMpIHtcbiAgICAgIHRoaXMuY2FuUmVhY3RUb01lc3NhZ2UgPVxuICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdzZW5kLXJlYWN0aW9uJykgIT09IC0xO1xuICAgICAgdGhpcy5jYW5SZWNlaXZlUmVhZEV2ZW50cyA9XG4gICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICAgICAgdGhpcy5jYW5EaXNwbGF5UmVhZFN0YXR1cyA9XG4gICAgICAgIHRoaXMuY2FuUmVjZWl2ZVJlYWRFdmVudHMgIT09IGZhbHNlICYmXG4gICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlIHx8IGNoYW5nZXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zIHx8IGNoYW5nZXMubW9kZSkge1xuICAgICAgdGhpcy5zaG91bGREaXNwbGF5VGhyZWFkTGluayA9XG4gICAgICAgICEhdGhpcy5tZXNzYWdlPy5yZXBseV9jb3VudCAmJiB0aGlzLm1vZGUgIT09ICd0aHJlYWQnO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlIHx8IGNoYW5nZXMubW9kZSB8fCBjaGFuZ2VzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucykge1xuICAgICAgdGhpcy5hcmVPcHRpb25zVmlzaWJsZSA9IHRoaXMubWVzc2FnZVxuICAgICAgICA/ICEoXG4gICAgICAgICAgICAhdGhpcy5tZXNzYWdlLnR5cGUgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS50eXBlID09PSAnZXJyb3InIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UudHlwZSA9PT0gJ3N5c3RlbScgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS50eXBlID09PSAnZGVsZXRlZCcgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS50eXBlID09PSAnZXBoZW1lcmFsJyB8fFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS5zdGF0dXMgPT09ICdzZW5kaW5nJyB8fFxuICAgICAgICAgICAgKHRoaXMubW9kZSA9PT0gJ3RocmVhZCcgJiYgIXRoaXMubWVzc2FnZS5wYXJlbnRfaWQpIHx8XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UuZGVsZXRlZF9hdCB8fFxuICAgICAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMubGVuZ3RoID09PSAwXG4gICAgICAgICAgKVxuICAgICAgICA6IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlIHx8IGNoYW5nZXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zKSB7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPVxuICAgICAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmdldEF1dGhvcml6ZWRNZXNzYWdlQWN0aW9uc0NvdW50KFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5oYXNUb3VjaFN1cHBvcnQgJiYgdGhpcy5tZXNzYWdlQnViYmxlPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJNZW51VHJpZ2dlckV2ZW50SGFuZGxlcnMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgbW91c2VQdXNoZWREb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGFzVG91Y2hTdXBwb3J0IHx8XG4gICAgICBldmVudC5idXR0b24gIT09IDAgfHxcbiAgICAgICF0aGlzLmFyZU9wdGlvbnNWaXNpYmxlXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhcnRNZXNzYWdlTWVudVNob3dUaW1lcih7IGZyb21Ub3VjaDogZmFsc2UgfSk7XG4gIH1cblxuICBtb3VzZVJlbGVhc2VkKCkge1xuICAgIHRoaXMuc3RvcE1lc3NhZ2VNZW51U2hvd1RpbWVyKCk7XG4gIH1cblxuICB0b3VjaFN0YXJ0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmFyZU9wdGlvbnNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhcnRNZXNzYWdlTWVudVNob3dUaW1lcih7IGZyb21Ub3VjaDogdHJ1ZSB9KTtcbiAgfVxuXG4gIHRvdWNoRW5kZWQoKSB7XG4gICAgdGhpcy5zdG9wTWVzc2FnZU1lbnVTaG93VGltZXIoKTtcbiAgfVxuXG4gIG1lc3NhZ2VCdWJibGVDbGlja2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5oYXNUb3VjaFN1cHBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvdWxkUHJldmVudE1lc3NhZ2VNZW51Q2xvc2UpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5zaG91bGRQcmV2ZW50TWVzc2FnZU1lbnVDbG9zZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hcmVNZXNzYWdlT3B0aW9uc09wZW4pIHtcbiAgICAgIHRoaXMubWVzc2FnZU1lbnVUcmlnZ2VyPy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgbWVzc2FnZU9wdGlvbnNCdXR0b25DbGlja2VkKCkge1xuICAgIGlmICghdGhpcy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25DbGlja0hhbmRsZXIpIHtcbiAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbkNsaWNrSGFuZGxlcih7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgZW5hYmxlZEFjdGlvbnM6IHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgICBjdXN0b21BY3Rpb25zOiB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25zJC5nZXRWYWx1ZSgpLFxuICAgICAgICBpc01pbmU6IHRoaXMuaXNTZW50QnlDdXJyZW50VXNlcixcbiAgICAgICAgbWVzc2FnZVRleHRIdG1sRWxlbWVudDogdGhpcy5tZXNzYWdlVGV4dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcmVNZXNzYWdlT3B0aW9uc09wZW4gPSAhdGhpcy5hcmVNZXNzYWdlT3B0aW9uc09wZW47XG4gICAgfVxuICB9XG5cbiAgbWVzc2FnZUFjdGlvbnNCb3hDbGlja2VkKGZsb2F0aW5nQ29udGVudDogTmd4RmxvYXRVaUNvbnRlbnRDb21wb25lbnQpIHtcbiAgICBmbG9hdGluZ0NvbnRlbnQuaGlkZSgpO1xuICB9XG5cbiAgZ2V0QXR0YWNobWVudExpc3RDb250ZXh0KCk6IEF0dGFjaG1lbnRMaXN0Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5pZCB8fCAnJyxcbiAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLm1lc3NhZ2U/LmF0dGFjaG1lbnRzIHx8IFtdLFxuICAgICAgcGFyZW50TWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LnBhcmVudF9pZCxcbiAgICAgIGltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXI6IChzdGF0ZSkgPT5cbiAgICAgICAgKHRoaXMuaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZSA9IHN0YXRlKSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TWVzc2FnZUNvbnRleHQoKTogU3lzdGVtTWVzc2FnZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgaXNIaWdobGlnaHRlZDogdGhpcy5pc0hpZ2hsaWdodGVkLFxuICAgICAgaXNMYXN0U2VudE1lc3NhZ2U6IHRoaXMuaXNMYXN0U2VudE1lc3NhZ2UsXG4gICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICBjdXN0b21BY3Rpb25zOiB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5jdXN0b21BY3Rpb25zJC5nZXRWYWx1ZSgpLFxuICAgICAgcGFyc2VkRGF0ZTogdGhpcy5wYXJzZWREYXRlLFxuICAgICAgc2Nyb2xsJDogdGhpcy5zY3JvbGwkLFxuICAgIH07XG4gIH1cblxuICBnZXRRdW90ZWRNZXNzYWdlQXR0YWNobWVudExpc3RDb250ZXh0KCk6IEF0dGFjaG1lbnRMaXN0Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uaWQgfHwgJycsXG4gICAgICBhdHRhY2htZW50czogdGhpcy5xdW90ZWRNZXNzYWdlQXR0YWNobWVudHMhLFxuICAgICAgcGFyZW50TWVzc2FnZUlkOiB0aGlzPy5tZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8ucGFyZW50X2lkLFxuICAgIH07XG4gIH1cblxuICBnZXRNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCgpOiBNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VSZWFjdGlvbkNvdW50czogdGhpcy5tZXNzYWdlPy5yZWFjdGlvbl9jb3VudHMgfHwge30sXG4gICAgICBsYXRlc3RSZWFjdGlvbnM6IHRoaXMubWVzc2FnZT8ubGF0ZXN0X3JlYWN0aW9ucyB8fCBbXSxcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5pZCxcbiAgICAgIG93blJlYWN0aW9uczogdGhpcy5tZXNzYWdlPy5vd25fcmVhY3Rpb25zIHx8IFtdLFxuICAgICAgbWVzc2FnZVJlYWN0aW9uR3JvdXBzOiB0aGlzLm1lc3NhZ2U/LnJlYWN0aW9uX2dyb3VwcyB8fCB7fSxcbiAgICB9O1xuICB9XG5cbiAgbWVzc2FnZUNsaWNrZWQoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5tZXNzYWdlPy5zdGF0dXMgPT09ICdmYWlsZWQnICYmXG4gICAgICB0aGlzLm1lc3NhZ2U/LmVycm9yU3RhdHVzQ29kZSAhPT0gNDAzXG4gICAgKSB7XG4gICAgICB0aGlzLnJlc2VuZE1lc3NhZ2UoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5tZXNzYWdlPy50eXBlID09PSAnZXJyb3InICYmXG4gICAgICB0aGlzLm1lc3NhZ2U/Lm1vZGVyYXRpb25fZGV0YWlsc1xuICAgICkge1xuICAgICAgdGhpcy5vcGVuTWVzc2FnZUJvdW5jZVByb21wdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRWRpdGVkRmxhZ09wZW5lZCA9ICF0aGlzLmlzRWRpdGVkRmxhZ09wZW5lZDtcbiAgICB9XG4gIH1cblxuICByZXNlbmRNZXNzYWdlKCkge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5yZXNlbmRNZXNzYWdlKHRoaXMubWVzc2FnZSEpO1xuICB9XG5cbiAgc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKCkge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5zZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UodGhpcy5tZXNzYWdlKTtcbiAgfVxuXG4gIGdldE1lbnRpb25Db250ZXh0KG1lc3NhZ2VQYXJ0OiBNZXNzYWdlUGFydCk6IE1lbnRpb25UZW1wbGF0ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBtZXNzYWdlUGFydC5jb250ZW50LFxuICAgICAgdXNlcjogbWVzc2FnZVBhcnQudXNlciEsXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VBY3Rpb25zQm94Q29udGV4dCgpOiBNZXNzYWdlQWN0aW9uc0JveENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBpc01pbmU6IHRoaXMuaXNTZW50QnlDdXJyZW50VXNlcixcbiAgICAgIGVuYWJsZWRBY3Rpb25zOiB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG1lc3NhZ2VUZXh0SHRtbEVsZW1lbnQ6IHRoaXMubWVzc2FnZVRleHRFbGVtZW50Py5uYXRpdmVFbGVtZW50LFxuICAgIH07XG4gIH1cblxuICBnZXREZWxpdmVyZWRTdGF0dXNDb250ZXh0KCk6IERlbGl2ZXJlZFN0YXR1c0NvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UhLFxuICAgIH07XG4gIH1cblxuICBnZXRTZW5kaW5nU3RhdHVzQ29udGV4dCgpOiBTZW5kaW5nU3RhdHVzQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSEsXG4gICAgfTtcbiAgfVxuXG4gIGdldFJlYWRTdGF0dXNDb250ZXh0KCk6IFJlYWRTdGF0dXNDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICAgIHJlYWRCeVRleHQ6IHRoaXMucmVhZEJ5VGV4dCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TWVzc2FnZU1ldGFkYXRhQ29udGV4dCgpOiBDdXN0b21NZXRhZGF0YUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UhLFxuICAgIH07XG4gIH1cblxuICBqdW1wVG9NZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nLCBwYXJlbnRNZXNzYWdlSWQ/OiBzdHJpbmcpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZShtZXNzYWdlSWQsIHBhcmVudE1lc3NhZ2VJZCk7XG4gIH1cblxuICBkaXNwbGF5VHJhbnNsYXRlZE1lc3NhZ2UoKSB7XG4gICAgdGhpcy5jcmVhdGVNZXNzYWdlUGFydHModHJ1ZSk7XG4gIH1cblxuICBkaXNwbGF5T3JpZ2luYWxNZXNzYWdlKCkge1xuICAgIHRoaXMuY3JlYXRlTWVzc2FnZVBhcnRzKGZhbHNlKTtcbiAgfVxuXG4gIG9wZW5NZXNzYWdlQm91bmNlUHJvbXB0KCkge1xuICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYm91bmNlZE1lc3NhZ2UkLm5leHQodGhpcy5tZXNzYWdlKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVzc2FnZVBhcnRzKHNob3VsZFRyYW5zbGF0ZSA9IHRydWUpIHtcbiAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tZXNzYWdlVGV4dCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgY29udGVudCA9IHRoaXMuZ2V0TWVzc2FnZUNvbnRlbnQoc2hvdWxkVHJhbnNsYXRlKTtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzIHx8XG4gICAgICAgIHRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICFjb250ZW50Py5tYXRjaCh0aGlzLmVtb2ppUmVnZXhwKSAmJlxuICAgICAgIWNvbnRlbnQ/Lm1hdGNoKHRoaXMudXJsUmVnZXhwKVxuICAgICkge1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dCA9IGNvbnRlbnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY29udGVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMgfHxcbiAgICAgIHRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgY29udGVudCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KGNvbnRlbnQpO1xuICAgICAgY29udGVudCA9IHRoaXMud3JhcExpbmtzV2l0aEFuY2hvclRhZyhjb250ZW50KTtcbiAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IFt7IGNvbnRlbnQsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gW107XG4gICAgICBsZXQgdGV4dCA9IGNvbnRlbnQ7XG4gICAgICB0aGlzLm1lc3NhZ2UhLm1lbnRpb25lZF91c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbnRpb24gPSBgQCR7dXNlci5uYW1lIHx8IHVzZXIuaWR9YDtcbiAgICAgICAgY29uc3QgcHJlY2VkaW5nVGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQuaW5kZXhPZihtZW50aW9uKSk7XG4gICAgICAgIGxldCBmb3JtYXR0ZWRQcmVjZWRpbmdUZXh0ID0gdGhpcy5maXhFbW9qaURpc3BsYXkocHJlY2VkaW5nVGV4dCk7XG4gICAgICAgIGZvcm1hdHRlZFByZWNlZGluZ1RleHQgPSB0aGlzLndyYXBMaW5rc1dpdGhBbmNob3JUYWcoXG4gICAgICAgICAgZm9ybWF0dGVkUHJlY2VkaW5nVGV4dFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMhLnB1c2goe1xuICAgICAgICAgIGNvbnRlbnQ6IGZvcm1hdHRlZFByZWNlZGluZ1RleHQsXG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzIS5wdXNoKHtcbiAgICAgICAgICBjb250ZW50OiBtZW50aW9uLFxuICAgICAgICAgIHR5cGU6ICdtZW50aW9uJyxcbiAgICAgICAgICB1c2VyLFxuICAgICAgICB9KTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShwcmVjZWRpbmdUZXh0ICsgbWVudGlvbiwgJycpO1xuICAgICAgfSk7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0ZXh0ID0gdGhpcy5maXhFbW9qaURpc3BsYXkodGV4dCk7XG4gICAgICAgIHRleHQgPSB0aGlzLndyYXBMaW5rc1dpdGhBbmNob3JUYWcodGV4dCk7XG4gICAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cy5wdXNoKHsgY29udGVudDogdGV4dCwgdHlwZTogJ3RleHQnIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWVzc2FnZUNvbnRlbnQoc2hvdWxkVHJhbnNsYXRlOiBib29sZWFuKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gdGhpcy5tZXNzYWdlPy50ZXh0O1xuICAgIGlmIChzaG91bGRUcmFuc2xhdGUpIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5tZXNzYWdlPy50cmFuc2xhdGlvbjtcbiAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICB0aGlzLnNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50ID0gJ3RyYW5zbGF0aW9uJztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbiB8fCBvcmlnaW5hbENvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50ID0gJ29yaWdpbmFsJztcbiAgICAgIHJldHVybiBvcmlnaW5hbENvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaXhFbW9qaURpc3BsYXkoY29udGVudDogc3RyaW5nKSB7XG4gICAgLy8gV3JhcCBlbW9qaXMgaW4gc3BhbiB0byBkaXNwbGF5IGVtb2ppcyBjb3JyZWN0bHkgaW4gQ2hyb21lIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU5NjIyM1xuICAgIC8vIEJhc2VkIG9uIHRoaXM6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ1NjUxMTIvamF2YXNjcmlwdC1ob3ctdG8tZmluZC1vdXQtaWYtdGhlLXVzZXItYnJvd3Nlci1pcy1jaHJvbWVcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgICBjb25zdCBpc0Nocm9tZSA9XG4gICAgICAhISh3aW5kb3cgYXMgYW55KS5jaHJvbWUgJiYgdHlwZW9mICh3aW5kb3cgYXMgYW55KS5vcHIgPT09ICd1bmRlZmluZWQnO1xuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgIHRoaXMuZW1vamlSZWdleHAsXG4gICAgICAobWF0Y2gpID0+XG4gICAgICAgIGA8c3BhbiAke1xuICAgICAgICAgIGlzQ2hyb21lID8gJ2NsYXNzPVwic3RyLWNoYXRfX2Vtb2ppLWRpc3BsYXktZml4XCInIDogJydcbiAgICAgICAgfT4ke21hdGNofTwvc3Bhbj5gXG4gICAgKTtcblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwTGlua3NXaXRoQW5jaG9yVGFnKGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRpc3BsYXlBcyA9PT0gJ2h0bWwnKSB7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSh0aGlzLnVybFJlZ2V4cCwgKG1hdGNoKSA9PlxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5jdXN0b21MaW5rUmVuZGVyZXJcbiAgICAgICAgPyB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmN1c3RvbUxpbmtSZW5kZXJlcihtYXRjaClcbiAgICAgICAgOiBgPGEgaHJlZj1cIiR7bWF0Y2h9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9mb2xsb3dcIj4ke21hdGNofTwvYT5gXG4gICAgKTtcblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJc1NlbnRCeUN1cnJlbnRVc2VyKCkge1xuICAgIHRoaXMuaXNTZW50QnlDdXJyZW50VXNlciA9IHRoaXMubWVzc2FnZT8udXNlcj8uaWQgPT09IHRoaXMudXNlcklkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRMYXN0UmVhZFVzZXIoKSB7XG4gICAgdGhpcy5sYXN0UmVhZFVzZXIgPSB0aGlzLm1lc3NhZ2U/LnJlYWRCeT8uZmlsdGVyKFxuICAgICAgKHUpID0+IHUuaWQgIT09IHRoaXMudXNlcklkXG4gICAgKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRNZXNzYWdlTWVudVNob3dUaW1lcihvcHRpb25zOiB7IGZyb21Ub3VjaDogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5zdG9wTWVzc2FnZU1lbnVTaG93VGltZXIoKTtcbiAgICBpZiAodGhpcy5zY3JvbGwkKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5zY3JvbGwkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN0b3BNZXNzYWdlTWVudVNob3dUaW1lcigpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5zaG93TWVzc2FnZU1lbnVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMubWVzc2FnZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9uQ2xpY2tIYW5kbGVyKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9uQ2xpY2tIYW5kbGVyKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICAgIGVuYWJsZWRBY3Rpb25zOiB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgICAgICAgIGN1c3RvbUFjdGlvbnM6IHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLmN1c3RvbUFjdGlvbnMkLmdldFZhbHVlKCksXG4gICAgICAgICAgICBpc01pbmU6IHRoaXMuaXNTZW50QnlDdXJyZW50VXNlcixcbiAgICAgICAgICAgIG1lc3NhZ2VUZXh0SHRtbEVsZW1lbnQ6IHRoaXMubWVzc2FnZVRleHRFbGVtZW50Py5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNob3VsZFByZXZlbnRNZXNzYWdlTWVudUNsb3NlID0gIW9wdGlvbnMuZnJvbVRvdWNoO1xuICAgICAgICAgIC8vIEZpeCBmb3IgaU9TIFNhZmFyaTogaU9TIFNhZmFyaSB3b24ndCBjbG9zZSB0aGUgaW5wdXQgaWYgd2Ugb3BlbiBtZXNzYWdlIG1lbnVcbiAgICAgICAgICAvLyBUaGUgdmlydHVhbCBrZXlib2FyZCBjYW4gaGlkZSBwYXJ0cyBvZiB0aGUgbWVzc2FnZSBtZW51LCBzbyB3ZSBjbG9zZSB0aGUgaW5wdXQgaGVyZVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiZcbiAgICAgICAgICAgIHR5cGVvZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5ibHVyICE9PVxuICAgICAgICAgICAgICAndW5kZWZpbmVkJ1xuICAgICAgICAgIClcbiAgICAgICAgICAgIChkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmJsdXIoKTtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VNZW51VHJpZ2dlcj8uc2hvdygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2VNZW51VGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH0sIDQwMCk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTWVudVRyaWdnZXJFdmVudEhhbmRsZXJzKCkge1xuICAgIHRoaXMubWVzc2FnZUJ1YmJsZSEubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgKCkgPT5cbiAgICAgIHRoaXMudG91Y2hTdGFydGVkKClcbiAgICApO1xuICAgIHRoaXMubWVzc2FnZUJ1YmJsZSEubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsICgpID0+XG4gICAgICB0aGlzLnRvdWNoRW5kZWQoKVxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlQnViYmxlIS5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PlxuICAgICAgdGhpcy5tb3VzZVB1c2hlZERvd24oZSlcbiAgICApO1xuICAgIHRoaXMubWVzc2FnZUJ1YmJsZSEubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPT5cbiAgICAgIHRoaXMubW91c2VSZWxlYXNlZCgpXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VCdWJibGUhLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT5cbiAgICAgIHRoaXMubWVzc2FnZUJ1YmJsZUNsaWNrZWQoZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wTWVzc2FnZU1lbnVTaG93VGltZXIoKSB7XG4gICAgaWYgKHRoaXMuc2hvd01lc3NhZ2VNZW51VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2hvd01lc3NhZ2VNZW51VGltZW91dCk7XG4gICAgICB0aGlzLnNob3dNZXNzYWdlTWVudVRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gICNjb250YWluZXJcbiAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWNvbnRhaW5lclwiXG4gIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlIHN0ci1jaGF0X19tZXNzYWdlIHN0ci1jaGF0X19tZXNzYWdlLS17e1xuICAgIG1lc3NhZ2U/LnR5cGVcbiAgfX0gc3RyLWNoYXRfX21lc3NhZ2UtLXt7IG1lc3NhZ2U/LnN0YXR1cyB9fSB7e1xuICAgIG1lc3NhZ2U/LnRleHQgPyAnc3RyLWNoYXRfX21lc3NhZ2UtLWhhcy10ZXh0JyA6ICdoYXMtbm8tdGV4dCdcbiAgfX0gc3RyLWNoYXRfX21lc3NhZ2UtbWVudS17eyBhcmVNZXNzYWdlT3B0aW9uc09wZW4gPyAnb3BlbmVkJyA6ICdjbG9zZWQnIH19XCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1tZV09XCJpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1vdGhlcl09XCIhaXNTZW50QnlDdXJyZW50VXNlclwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtLW1lXT1cImlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLWhhcy1hdHRhY2htZW50XT1cImhhc0F0dGFjaG1lbnRcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLXdpdGgtcmVhY3Rpb25zXT1cImhhc1JlYWN0aW9uc1wiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0taGlnaGxpZ2h0ZWRdPVwiaXNIaWdobGlnaHRlZFwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS13aXRoLXRocmVhZC1saW5rXT1cInNob3VsZERpc3BsYXlUaHJlYWRMaW5rXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXNlbmQtY2FuLWJlLXJldHJpZWRdPVwiXG4gICAgKG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiYgbWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlICE9PSA0MDMpIHx8XG4gICAgKG1lc3NhZ2U/LnR5cGUgPT09ICdlcnJvcicgJiYgbWVzc2FnZT8ubW9kZXJhdGlvbl9kZXRhaWxzKVxuICBcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utd2l0aC10b3VjaC1zdXBwb3J0XT1cImhhc1RvdWNoU3VwcG9ydFwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS13aXRob3V0LXRvdWNoLXN1cHBvcnRdPVwiIWhhc1RvdWNoU3VwcG9ydFwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbWVzc2FnZT8uZGVsZXRlZF9hdDsgZWxzZSBkZWxldGVkTWVzc2FnZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy50eXBlICE9PSAnc3lzdGVtJzsgZWxzZSBzeXN0ZW1NZXNzYWdlXCI+XG4gICAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgICBkYXRhLXRlc3RpZD1cImF2YXRhclwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fYXZhdGFyLWhvc3Qgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLWF2YXRhclwiXG4gICAgICAgIHR5cGU9XCJ1c2VyXCJcbiAgICAgICAgbG9jYXRpb249XCJtZXNzYWdlLXNlbmRlclwiXG4gICAgICAgIFtpbWFnZVVybF09XCJtZXNzYWdlPy51c2VyPy5pbWFnZVwiXG4gICAgICAgIFtuYW1lXT1cIm1lc3NhZ2U/LnVzZXI/Lm5hbWUgfHwgbWVzc2FnZT8udXNlcj8uaWRcIlxuICAgICAgICBbdXNlcl09XCJtZXNzYWdlPy51c2VyIHx8IHVuZGVmaW5lZFwiXG4gICAgICA+PC9zdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWlubmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIiFoYXNUb3VjaFN1cHBvcnQgJiYgYXJlT3B0aW9uc1Zpc2libGVcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zIHN0ci1jaGF0X19tZXNzYWdlLW9wdGlvbnNcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1vcHRpb25zXCJcbiAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1vcGVuXT1cImFyZU1lc3NhZ2VPcHRpb25zT3BlblwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjbWVzc2FnZUFjdGlvbnNUb2dnbGVcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1hY3Rpb25zLWNvbnRhaW5lclwiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbnMtY29udGFpbmVyIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uLS1vcHRpb25zXCJcbiAgICAgICAgICAgIFtmbG9hdFVpTG9vc2VdPVwibWVzc2FnZU1lbnVGbG9hdFwiXG4gICAgICAgICAgICBbbG9vc2VUcmlnZ2VyXT1cIlxuICAgICAgICAgICAgICBtZXNzYWdlQWN0aW9uc1NlcnZpY2UuY3VzdG9tQWN0aW9uQ2xpY2tIYW5kbGVyID8gJ25vbmUnIDogJ2NsaWNrJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtoaWRlT25TY3JvbGxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVPbkNsaWNrT3V0c2lkZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtoaWRlT25Nb3VzZUxlYXZlXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlQW5pbWF0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtwcmV2ZW50T3ZlcmZsb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcG9zaXRpb25GaXhlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgIChvblNIb3duKT1cImFyZU1lc3NhZ2VPcHRpb25zT3BlbiA9IHRydWVcIlxuICAgICAgICAgICAgKG9uSGlkZGVuKT1cImFyZU1lc3NhZ2VPcHRpb25zT3BlbiA9IGZhbHNlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwidmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPiAwXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hY3Rpb25zLWJveC1idXR0b25cIlxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1lc3NhZ2Utb3B0aW9ucy1idXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZU9wdGlvbnNCdXR0b25DbGlja2VkKClcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwibWVzc2FnZU9wdGlvbnNCdXR0b25DbGlja2VkKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBpY29uPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtaG9zdFwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2RlZmF1bHRNZXNzYWdlUmVhY3Rpb25zXG4gICAgICAgICAgICBsZXQtbWVzc2FnZVJlYWN0aW9uQ291bnRzPVwibWVzc2FnZVJlYWN0aW9uQ291bnRzXCJcbiAgICAgICAgICAgIGxldC1sYXRlc3RSZWFjdGlvbnM9XCJsYXRlc3RSZWFjdGlvbnNcIlxuICAgICAgICAgICAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICBsZXQtb3duUmVhY3Rpb25zPVwib3duUmVhY3Rpb25zXCJcbiAgICAgICAgICAgIGxldC1tZXNzYWdlUmVhY3Rpb25Hcm91cHM9XCJtZXNzYWdlUmVhY3Rpb25Hcm91cHNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0tbWVzc2FnZS1yZWFjdGlvbnNcbiAgICAgICAgICAgICAgW21lc3NhZ2VSZWFjdGlvbkNvdW50c109XCJtZXNzYWdlUmVhY3Rpb25Db3VudHNcIlxuICAgICAgICAgICAgICBbbGF0ZXN0UmVhY3Rpb25zXT1cImxhdGVzdFJlYWN0aW9uc1wiXG4gICAgICAgICAgICAgIFttZXNzYWdlSWRdPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICAgICAgW293blJlYWN0aW9uc109XCJvd25SZWFjdGlvbnNcIlxuICAgICAgICAgICAgICBbbWVzc2FnZVJlYWN0aW9uR3JvdXBzXT1cIm1lc3NhZ2VSZWFjdGlvbkdyb3Vwc1wiXG4gICAgICAgICAgICA+PC9zdHJlYW0tbWVzc2FnZS1yZWFjdGlvbnM+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlUmVhY3Rpb25zVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2VSZWFjdGlvbnM7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lc3NhZ2VSZWFjdGlvbnNDb250ZXh0KClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGZsb2F0LXVpLWNvbnRlbnQgI21lc3NhZ2VNZW51RmxvYXQ+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjZGVmYXVsdE1lc3NhZ2VBY3Rpb25zQm94XG4gICAgICAgICAgICBsZXQtaXNNaW5lPVwiaXNNaW5lXCJcbiAgICAgICAgICAgIGxldC1tZXNzYWdlSW5wdXQ9XCJtZXNzYWdlXCJcbiAgICAgICAgICAgIGxldC1lbmFibGVkQWN0aW9ucz1cImVuYWJsZWRBY3Rpb25zXCJcbiAgICAgICAgICAgIGxldC1tZXNzYWdlVGV4dEh0bWxFbGVtZW50PVwibWVzc2FnZVRleHRIdG1sRWxlbWVudFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN0cmVhbS1tZXNzYWdlLWFjdGlvbnMtYm94XG4gICAgICAgICAgICAgIFtpc01pbmVdPVwiaXNNaW5lXCJcbiAgICAgICAgICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZUlucHV0XCJcbiAgICAgICAgICAgICAgW2VuYWJsZWRBY3Rpb25zXT1cImVuYWJsZWRBY3Rpb25zXCJcbiAgICAgICAgICAgICAgW21lc3NhZ2VUZXh0SHRtbEVsZW1lbnRdPVwibWVzc2FnZVRleHRIdG1sRWxlbWVudFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJtZXNzYWdlQWN0aW9uc0JveENsaWNrZWQobWVzc2FnZU1lbnVGbG9hdClcIlxuICAgICAgICAgICAgPjwvc3RyZWFtLW1lc3NhZ2UtYWN0aW9ucy1ib3g+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VBY3Rpb25zQm94VGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZUFjdGlvbnNCb3g7XG4gICAgICAgICAgICAgICAgY29udGV4dDogZ2V0TWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0KClcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Zsb2F0LXVpLWNvbnRlbnQ+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWJ1YmJsZSBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgW2NsYXNzLnN0ci1jaGF0LWFuZ3VsYXJfX21lc3NhZ2UtYnViYmxlLS1hdHRhY2htZW50LW1vZGFsLW9wZW5dPVwiXG4gICAgICAgICAgICBpbWFnZUF0dGFjaG1lbnRNb2RhbFN0YXRlID09PSAnb3BlbmVkJ1xuICAgICAgICAgIFwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgW2Zsb2F0VWlMb29zZV09XCJtZXNzYWdlTWVudUZsb2F0XCJcbiAgICAgICAgICAjbWVzc2FnZU1lbnVUcmlnZ2VyPVwiZmxvYXRVaUxvb3NlXCJcbiAgICAgICAgICAjbWVzc2FnZUJ1YmJsZVxuICAgICAgICAgIGxvb3NlVHJpZ2dlcj1cIm5vbmVcIlxuICAgICAgICAgIFtoaWRlT25TY3JvbGxdPVwiZmFsc2VcIlxuICAgICAgICAgIFtoaWRlT25DbGlja091dHNpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgW2hpZGVPbk1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgICAgIFtkaXNhYmxlQW5pbWF0aW9uXT1cInRydWVcIlxuICAgICAgICAgIFtwcmV2ZW50T3ZlcmZsb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgKG9uU2hvd24pPVwiYXJlTWVzc2FnZU9wdGlvbnNPcGVuID0gdHJ1ZVwiXG4gICAgICAgICAgKG9uSGlkZGVuKT1cImFyZU1lc3NhZ2VPcHRpb25zT3BlbiA9IGZhbHNlXCJcbiAgICAgICAgICBbcG9zaXRpb25GaXhlZF09XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNBdHRhY2htZW50ICYmICFtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19hdHRhY2htZW50cy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXR0YWNobWVudHNUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZT8udGV4dCB8fCAobWVzc2FnZT8ucXVvdGVkX21lc3NhZ2UgJiYgaGFzQXR0YWNobWVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtdGV4dC0tcG9pbnRlci1jdXJzb3JdPVwiXG4gICAgICAgICAgICAgIChtZXNzYWdlPy5zdGF0dXMgPT09ICdmYWlsZWQnICYmXG4gICAgICAgICAgICAgICAgbWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlICE9PSA0MDMpIHx8XG4gICAgICAgICAgICAgICh0aGlzLm1lc3NhZ2U/LnR5cGUgPT09ICdlcnJvcicgJiZcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2U/Lm1vZGVyYXRpb25fZGV0YWlscykgfHxcbiAgICAgICAgICAgICAgbWVzc2FnZT8ubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZUNsaWNrZWQoKVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwibWVzc2FnZUNsaWNrZWQoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImlubmVyLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXRleHQtaW5uZXIgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXRleHQtaW5uZXJcIlxuICAgICAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtbGlnaHQtdGV4dC1pbm5lci0taGFzLWF0dGFjaG1lbnRdPVwiXG4gICAgICAgICAgICAgICAgaGFzQXR0YWNobWVudFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicXVvdGVkTWVzc2FnZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQXR0YWNobWVudCAmJiBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXR0YWNobWVudHNUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZT8udHlwZSA9PT0gJ2Vycm9yJ1wiXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJjbGllbnQtZXJyb3ItbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fc2ltcGxlLW1lc3NhZ2UtLWVycm9yLW1lc3NhZ2Ugc3RyLWNoYXRfX21lc3NhZ2UtLWVycm9yLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZXNzYWdlPy5tb2RlcmF0aW9uX2RldGFpbHNcIj57e1xuICAgICAgICAgICAgICAgICAgXCJzdHJlYW1DaGF0LkVycm9yIMK3IFVuc2VudFwiIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2U/LnN0YXR1cyA9PT0gJ2ZhaWxlZCdcIlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZXJyb3ItbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fc2ltcGxlLW1lc3NhZ2UtLWVycm9yLW1lc3NhZ2Ugc3RyLWNoYXRfX21lc3NhZ2UtLWVycm9yLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgIChtZXNzYWdlPy5lcnJvclN0YXR1c0NvZGUgPT09IDQwM1xuICAgICAgICAgICAgICAgICAgICA/IFwic3RyZWFtQ2hhdC5NZXNzYWdlIEZhaWxlZCDCtyBVbmF1dGhvcml6ZWRcIlxuICAgICAgICAgICAgICAgICAgICA6IFwic3RyZWFtQ2hhdC5NZXNzYWdlIEZhaWxlZCDCtyBDbGljayB0byB0cnkgYWdhaW5cIlxuICAgICAgICAgICAgICAgICAgKSB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICNtZXNzYWdlVGV4dEVsZW1lbnQgZGF0YS10ZXN0aWQ9XCJ0ZXh0XCI+XG4gICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZVRleHRQYXJ0czsgZWxzZSBkZWZhdWx0Q29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvdXNlLXRyYWNrLWJ5LWZ1bmN0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYXJ0IG9mIG1lc3NhZ2VUZXh0UGFydHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwYXJ0LnR5cGUgPT09ICd0ZXh0JzsgZWxzZSBtZW50aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwicGFydC5jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWVudGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE1lbnRpb24gbGV0LWNvbnRlbnQ9XCJjb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtbWVudGlvblwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubWVudGlvblRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lbnRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogZ2V0TWVudGlvbkNvbnRleHQocGFydClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlBcyA9PT0gJ3RleHQnOyBlbHNlIGFzSFRNTFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IG1lc3NhZ2VUZXh0IHx8IFwiXCIgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYXNIVE1MXG4gICAgICAgICAgICAgICAgICAgICAgPjxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImh0bWwtY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm1lc3NhZ2VUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWVycm9yLWljb25cIlxuICAgICAgICAgICAgaWNvbj1cImVycm9yXCJcbiAgICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZXBseUNvdW50QnV0dG9uOyBjb250ZXh0OiB7IG1lc3NhZ2U6IG1lc3NhZ2UgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXNzYWdlRGF0ZUFuZFNlbmRlclwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZWRNZXNzYWdlPlxuICA8ZGl2IGRhdGEtdGVzdGlkPVwibWVzc2FnZS1kZWxldGVkLWNvbXBvbmVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS0tZGVsZXRlZC1pbm5lclwiIHRyYW5zbGF0ZT5cbiAgICAgIHN0cmVhbUNoYXQuVGhpcyBtZXNzYWdlIHdhcyBkZWxldGVkLi4uXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzeXN0ZW1NZXNzYWdlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnN5c3RlbU1lc3NhZ2VUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgZGVmYXVsdFN5c3RlbU1lc3NhZ2U7XG4gICAgICBjb250ZXh0OiBnZXRNZXNzYWdlQ29udGV4dCgpXG4gICAgXCJcbiAgPjwvbmctY29udGFpbmVyPlxuICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTeXN0ZW1NZXNzYWdlIGxldC1tZXNzYWdlSW5wdXQ9XCJtZXNzYWdlXCI+XG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cInN5c3RlbS1tZXNzYWdlXCIgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS0tc3lzdGVtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fdGV4dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fbGluZVwiPjwvZGl2PlxuICAgICAgICA8cD57eyBtZXNzYWdlSW5wdXQ/LnRleHQgfX08L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS0tc3lzdGVtX19saW5lXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS0tc3lzdGVtX19kYXRlXCI+XG4gICAgICAgIHt7IHBhcnNlZERhdGUgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNxdW90ZWRNZXNzYWdlPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZVwiXG4gICAgY2xhc3M9XCJxdW90ZWQtbWVzc2FnZSBzdHItY2hhdF9fcXVvdGVkLW1lc3NhZ2UtcHJldmlld1wiXG4gICAgZGF0YS10ZXN0aWQ9XCJxdW90ZWQtbWVzc2FnZS1jb250YWluZXJcIlxuICAgIFtjbGFzcy5taW5lXT1cImlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICAgIChjbGljayk9XCJcbiAgICAgIGp1bXBUb01lc3NhZ2UoXG4gICAgICAgIChtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZSkhLmlkLFxuICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8ucGFyZW50X2lkXG4gICAgICApXG4gICAgXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwiXG4gICAgICBqdW1wVG9NZXNzYWdlKFxuICAgICAgICAobWVzc2FnZT8ucXVvdGVkX21lc3NhZ2UpIS5pZCxcbiAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnBhcmVudF9pZFxuICAgICAgKVxuICAgIFwiXG4gID5cbiAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgZGF0YS10ZXN0aWQ9XCJxb3V0ZWQtbWVzc2FnZS1hdmF0YXJcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdC1hbmd1bGFyX19hdmF0YXItaG9zdCBzdHItY2hhdF9fbWVzc2FnZS1zZW5kZXItYXZhdGFyXCJcbiAgICAgIHR5cGU9XCJ1c2VyXCJcbiAgICAgIGxvY2F0aW9uPVwicXVvdGVkLW1lc3NhZ2Utc2VuZGVyXCJcbiAgICAgIFtpbWFnZVVybF09XCJtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlcj8uaW1hZ2VcIlxuICAgICAgW25hbWVdPVwiXG4gICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy51c2VyPy5uYW1lIHx8IG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy51c2VyPy5pZFxuICAgICAgXCJcbiAgICAgIFt1c2VyXT1cIm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy51c2VyIHx8IHVuZGVmaW5lZFwiXG4gICAgPjwvc3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlcj5cbiAgICA8ZGl2IGNsYXNzPVwicXVvdGVkLW1lc3NhZ2UtaW5uZXIgc3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLWJ1YmJsZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5hdHRhY2htZW50cyAmJlxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5hdHRhY2htZW50cz8ubGVuZ3RoXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICNkZWZhdWx0QXR0YWNobWVudHNcbiAgICAgICAgICBsZXQtbWVzc2FnZUlkPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICBsZXQtYXR0YWNobWVudHM9XCJhdHRhY2htZW50c1wiXG4gICAgICAgICAgbGV0LXBhcmVudE1lc3NhZ2VJZD1cInBhcmVudE1lc3NhZ2VJZFwiXG4gICAgICAgICAgbGV0LWltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXI9XCJpbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdHJlYW0tYXR0YWNobWVudC1saXN0XG4gICAgICAgICAgICBbbWVzc2FnZUlkXT1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICBbYXR0YWNobWVudHNdPVwiYXR0YWNobWVudHNcIlxuICAgICAgICAgICAgW3BhcmVudE1lc3NhZ2VJZF09XCJwYXJlbnRNZXNzYWdlSWRcIlxuICAgICAgICAgICAgKGltYWdlTW9kYWxTdGF0ZUNoYW5nZSk9XCJpbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgID48L3N0cmVhbS1hdHRhY2htZW50LWxpc3Q+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuYXR0YWNobWVudExpc3RUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdEF0dGFjaG1lbnRzO1xuICAgICAgICAgICAgY29udGV4dDogZ2V0UXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRMaXN0Q29udGV4dCgpXG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2XG4gICAgICAgIGRhdGEtdGVzdGlkPVwicXVvdGVkLW1lc3NhZ2UtdGV4dFwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnRyYW5zbGF0aW9uIHx8XG4gICAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/Lmh0bWwgfHxcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udGV4dFxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZURhdGVBbmRTZW5kZXI+XG4gIDxuZy1jb250YWluZXI+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJzaG91bGREaXNwbGF5VHJhbnNsYXRpb25Ob3RpY2VcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdHJhbnNsYXRpb24tbm90aWNlXCJcbiAgICAgIGRhdGEtdGVzdGlkPVwidHJhbnNsYXRpb24tbm90aWNlXCJcbiAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50ID09PSAndHJhbnNsYXRpb24nXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJzZWUtb3JpZ2luYWxcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlPcmlnaW5hbE1lc3NhZ2UoKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJkaXNwbGF5T3JpZ2luYWxNZXNzYWdlKClcIlxuICAgICAgPlxuICAgICAgICBzdHJlYW1DaGF0LlNlZSBvcmlnaW5hbCAoYXV0b21hdGljYWxseSB0cmFuc2xhdGVkKVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50ID09PSAnb3JpZ2luYWwnXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJzZWUtdHJhbnNsYXRpb25cIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlUcmFuc2xhdGVkTWVzc2FnZSgpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cImRpc3BsYXlUcmFuc2xhdGVkTWVzc2FnZSgpXCJcbiAgICAgID5cbiAgICAgICAgc3RyZWFtQ2hhdC5TZWUgdHJhbnNsYXRpb25cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiY3VzdG9tVGVtcGxhdGVzU2VydmljZS5jdXN0b21NZXNzYWdlTWV0YWRhdGFUZW1wbGF0ZSQgfCBhc3luY1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19jdXN0b20tbWVzc2FnZS1tZXRhZGF0YVwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmN1c3RvbU1lc3NhZ2VNZXRhZGF0YVRlbXBsYXRlJCB8IGFzeW5jKSE7XG4gICAgICAgICAgICBjb250ZXh0OiBnZXRNZXNzYWdlTWV0YWRhdGFDb250ZXh0KClcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWRhdGEgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLWRhdGEgc3RyLWNoYXRfX21lc3NhZ2UtbWV0YWRhdGFcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXNzYWdlU3RhdHVzXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0lmPVwiIWlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlbmRlclwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLW5hbWUgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLW5hbWVcIlxuICAgICAgPlxuICAgICAgICB7eyBtZXNzYWdlPy51c2VyPy5uYW1lID8gbWVzc2FnZT8udXNlcj8ubmFtZSA6IG1lc3NhZ2U/LnVzZXI/LmlkIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICBkYXRhLXRlc3RpZD1cImRhdGVcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS10aW1lc3RhbXAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXRpbWVcIlxuICAgICAgPlxuICAgICAgICB7eyBwYXJzZWREYXRlIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZT8ubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXRcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImVkaXRlZC1mbGFnXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNhZ2Utc2ltcGxlLWVkaXRlZFwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPnN0cmVhbUNoYXQuRWRpdGVkPC9zcGFuXG4gICAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZWRpdGVkLXRpbWVzdGFtcFwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1lZGl0ZWQtdGltZXN0YW1wXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnc3RyLWNoYXRfX21lc3NhZ2UtZWRpdGVkLXRpbWVzdGFtcC0tb3Blbic6IGlzRWRpdGVkRmxhZ09wZW5lZCxcbiAgICAgICAgICAgICdzdHItY2hhdF9fbWVzc2FnZS1lZGl0ZWQtdGltZXN0YW1wLS1jb2xsYXBzZWQnOiAhaXNFZGl0ZWRGbGFnT3BlbmVkXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+c3RyZWFtQ2hhdC5FZGl0ZWQ8L3NwYW4+XG4gICAgICAgICAgPHRpbWVcbiAgICAgICAgICAgIGRhdGVUaW1lPVwie3sgbWVzc2FnZT8ubWVzc2FnZV90ZXh0X3VwZGF0ZWRfYXQgfX1cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyBtZXNzYWdlPy5tZXNzYWdlX3RleHRfdXBkYXRlZF9hdCB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgcGFzZWRFZGl0ZWREYXRlIH19XG4gICAgICAgICAgPC90aW1lPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZVN0YXR1cz5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiXG4gICAgICBpc1NlbnRCeUN1cnJlbnRVc2VyICYmXG4gICAgICAoKGlzTGFzdFNlbnRNZXNzYWdlICYmIG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ3JlY2VpdmVkJykgfHxcbiAgICAgICAgbWVzc2FnZT8uc3RhdHVzID09PSAnc2VuZGluZycpXG4gICAgXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy5zdGF0dXMgPT09ICdzZW5kaW5nJzsgZWxzZSBzZW50U3RhdHVzXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VuZGluZ1N0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjc2VudFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBtb2RlID09PSAnbWFpbicgJiYgaXNNZXNzYWdlRGVsaXZlcmVkQW5kUmVhZCAmJiBjYW5EaXNwbGF5UmVhZFN0YXR1cztcbiAgICAgICAgICBlbHNlIGRlbGl2ZXJlZFN0YXR1c1xuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVhZFN0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlbGl2ZXJlZFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5kZWxpdmVyZWRTdGF0dXNUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgIGRlZmF1bHREZWxpdmVyZWRTdGF0dXM7XG4gICAgICAgICAgY29udGV4dDogZ2V0RGVsaXZlcmVkU3RhdHVzQ29udGV4dCgpXG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHREZWxpdmVyZWRTdGF0dXM+XG4gICAgICA8c3BhblxuICAgICAgICAqbmdJZj1cIm1vZGUgPT09ICdtYWluJ1wiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1cyBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzLWFuZ3VsYXIgc3RyLWNoYXRfX21lc3NhZ2Utc3RhdHVzXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJkZWxpdmVyZWQtaW5kaWNhdG9yXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW2Zsb2F0VWlMb29zZV09XCJmbG9hdGluZ0NvbnRlbnRcIlxuICAgICAgICBsb29zZVBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgIFtsb29zZVRyaWdnZXJdPVwiaGFzVG91Y2hTdXBwb3J0ID8gJ2NsaWNrJyA6ICdob3ZlcidcIlxuICAgICAgICBbZGlzYWJsZUFuaW1hdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgW2hpZGVPbkNsaWNrT3V0c2lkZV09XCJ0cnVlXCJcbiAgICAgICAgW3Bvc2l0aW9uRml4ZWRdPVwidHJ1ZVwiXG4gICAgICAgIFtwcmV2ZW50T3ZlcmZsb3ddPVwidHJ1ZVwiXG4gICAgICA+XG4gICAgICAgIDxmbG9hdC11aS1jb250ZW50ICNmbG9hdGluZ0NvbnRlbnQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIj5cbiAgICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5EZWxpdmVyZWRcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zsb2F0LXVpLWNvbnRlbnQ+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGVsaXZlcmVkLWljb25cIlxuICAgICAgICAgIGljb249XCJkZWxpdmVyZWRcIlxuICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjc2VuZGluZ1N0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5zZW5kaW5nU3RhdHVzVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICBkZWZhdWx0U2VuZGluZ1N0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXRTZW5kaW5nU3RhdHVzQ29udGV4dCgpXG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTZW5kaW5nU3RhdHVzPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXMtYW5ndWxhciBzdHItY2hhdF9fbWVzc2FnZS1zdGF0dXNcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlbmRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW2Zsb2F0VWlMb29zZV09XCJmbG9hdGluZ0NvbnRlbnRcIlxuICAgICAgICBsb29zZVBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgIFtsb29zZVRyaWdnZXJdPVwiaGFzVG91Y2hTdXBwb3J0ID8gJ2NsaWNrJyA6ICdob3ZlcidcIlxuICAgICAgICBbZGlzYWJsZUFuaW1hdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgW2hpZGVPbkNsaWNrT3V0c2lkZV09XCJ0cnVlXCJcbiAgICAgICAgW3Bvc2l0aW9uRml4ZWRdPVwidHJ1ZVwiXG4gICAgICAgIFtwcmV2ZW50T3ZlcmZsb3ddPVwidHJ1ZVwiXG4gICAgICA+XG4gICAgICAgIDxmbG9hdC11aS1jb250ZW50ICNmbG9hdGluZ0NvbnRlbnQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIj5cbiAgICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5TZW5kaW5nLi4uXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mbG9hdC11aS1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjcmVhZFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5yZWFkU3RhdHVzVGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICBkZWZhdWx0UmVhZFN0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXRSZWFkU3RhdHVzQ29udGV4dCgpXG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSZWFkU3RhdHVzIGxldC1yZWFkQnlUZXh0PVwicmVhZEJ5VGV4dFwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXMtYW5ndWxhciBzdHItY2hhdF9fbWVzc2FnZS1zdGF0dXNcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInJlYWQtaW5kaWNhdG9yXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW2Zsb2F0VWlMb29zZV09XCJmbG9hdGluZ0NvbnRlbnRcIlxuICAgICAgICBsb29zZVBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgIFtsb29zZVRyaWdnZXJdPVwiaGFzVG91Y2hTdXBwb3J0ID8gJ2NsaWNrJyA6ICdob3ZlcidcIlxuICAgICAgICBbZGlzYWJsZUFuaW1hdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgW2hpZGVPbkNsaWNrT3V0c2lkZV09XCJ0cnVlXCJcbiAgICAgICAgW3Bvc2l0aW9uRml4ZWRdPVwidHJ1ZVwiXG4gICAgICAgIFtwcmV2ZW50T3ZlcmZsb3ddPVwidHJ1ZVwiXG4gICAgICA+XG4gICAgICAgIDxmbG9hdC11aS1jb250ZW50ICNmbG9hdGluZ0NvbnRlbnQ+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdG9vbHRpcCBzdHItY2hhdF9fdG9vbHRpcC1hbmd1bGFyXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwicmVhZC1ieS10b29sdGlwXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyByZWFkQnlUZXh0IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmxvYXQtdWktY29udGVudD5cbiAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyIGljb249XCJyZWFkXCI+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmVwbHlDb3VudEJ1dHRvbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXJlcGx5LWJ1dHRvbiBzdHItY2hhdF9fbWVzc2FnZS1yZXBsaWVzLWNvdW50LWJ1dHRvbi13cmFwcGVyXCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwic2hvdWxkRGlzcGxheVRocmVhZExpbmtcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZXBsaWVzLWNvdW50LWJ1dHRvblwiXG4gICAgICBkYXRhLXRlc3RpZD1cInJlcGx5LWNvdW50LWJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwic2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKClcIlxuICAgID5cbiAgICAgIHt7bWVzc2FnZT8ucmVwbHlfY291bnQgPT09IDEgPyAoJ3N0cmVhbUNoYXQuMSByZXBseScgfCB0cmFuc2xhdGUpIDogKCdzdHJlYW1DaGF0Lnt7IHJlcGx5Q291bnQgfX1cbiAgICAgIHJlcGxpZXMnIHwgdHJhbnNsYXRlOnJlcGx5Q291bnRQYXJhbSl9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXR0YWNobWVudHNUZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHRBdHRhY2htZW50c1xuICAgIGxldC1tZXNzYWdlSWQ9XCJtZXNzYWdlSWRcIlxuICAgIGxldC1hdHRhY2htZW50cz1cImF0dGFjaG1lbnRzXCJcbiAgICBsZXQtcGFyZW50TWVzc2FnZUlkPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICBsZXQtaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcj1cImltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXJcIlxuICA+XG4gICAgPHN0cmVhbS1hdHRhY2htZW50LWxpc3RcbiAgICAgIFttZXNzYWdlSWRdPVwibWVzc2FnZUlkXCJcbiAgICAgIFthdHRhY2htZW50c109XCJhdHRhY2htZW50c1wiXG4gICAgICBbcGFyZW50TWVzc2FnZUlkXT1cInBhcmVudE1lc3NhZ2VJZFwiXG4gICAgICAoaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlKT1cImltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgPjwvc3RyZWFtLWF0dGFjaG1lbnQtbGlzdD5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5hdHRhY2htZW50TGlzdFRlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICBkZWZhdWx0QXR0YWNobWVudHM7XG4gICAgICBjb250ZXh0OiBnZXRBdHRhY2htZW50TGlzdENvbnRleHQoKVxuICAgIFwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|